diff --git a/irp/src/lib.rs b/irp/src/lib.rs index 92e4d1f..3e05018 100644 --- a/irp/src/lib.rs +++ b/irp/src/lib.rs @@ -24,7 +24,7 @@ pub use protocols::Protocol; use num_rational::Rational64; use std::{collections::HashMap, fmt, rc::Rc}; -#[derive(Debug, PartialEq, Default, Eq)] +#[derive(Debug, PartialEq, Default, Clone, Eq)] /// An encoded raw infrared message pub struct Message { /// The carrier for the message. None means unknown, Some(0) means unmodulated diff --git a/src/bin/commands/config.rs b/src/bin/commands/config.rs index 604ecda..d7e2ea7 100644 --- a/src/bin/commands/config.rs +++ b/src/bin/commands/config.rs @@ -183,14 +183,6 @@ fn load_keymap(inputdev: &Device, keymap_filename: &Path) { } }; - let scancode = match u64::from_str_radix(scancode.trim_start_matches("0x"), 16) { - Ok(scancode) => scancode, - Err(_) => { - eprintln!("error: ‘{scancode}’ is not a valid scancode"); - continue; - } - }; - // Kernels from before v5.7 want the scancode in 4 bytes; try this if possible let scancode = if let Ok(scancode) = u32::try_from(scancode) { scancode.to_ne_bytes().to_vec() diff --git a/src/keymap/encode.rs b/src/keymap/encode.rs index 21b4fe3..4c7f178 100644 --- a/src/keymap/encode.rs +++ b/src/keymap/encode.rs @@ -2,6 +2,16 @@ use super::{Keymap, LinuxProtocol}; use irp::{Irp, Message, Vartable}; impl Keymap { + pub fn encode(&self, code: &str, repeats: u64) -> Result { + if let Some(scancodes) = &self.scancodes { + if let Some((scancode, _)) = scancodes.iter().find(|(_, v)| *v == code) { + return self.encode_scancode(*scancode, repeats); + } + } + + self.encode_raw(code, repeats) + } + pub fn encode_scancode(&self, scancode: u64, repeats: u64) -> Result { let irp = if let Some(i) = &self.irp { i.as_str() @@ -42,6 +52,36 @@ impl Keymap { irp.encode_raw(vars, repeats) } + + pub fn encode_raw(&self, code: &str, repeats: u64) -> Result { + if let Some(raw) = &self.raw { + if let Some(raw) = raw.iter().find(|e| e.keycode == code) { + if let Some(pronto) = &raw.pronto { + return Ok(pronto.encode(repeats as usize)); + } + + let e = raw.raw.as_ref().unwrap(); + + let mut m = e.clone(); + + if repeats > 0 && m.has_trailing_gap() { + let rep = raw.repeat.as_ref().unwrap_or(e); + + for _ in 0..repeats { + m.extend(rep); + + if rep.has_trailing_gap() { + break; + } + } + } + + return Ok(m); + } + } + + Err(format!("{code} not found")) + } } fn gen_mask(v: u32) -> u64 { diff --git a/src/keymap/mod.rs b/src/keymap/mod.rs index e6f891f..605738e 100644 --- a/src/keymap/mod.rs +++ b/src/keymap/mod.rs @@ -1,3 +1,4 @@ +use irp::{Message, Pronto}; use std::collections::HashMap; mod encode; @@ -5,7 +6,7 @@ mod parse; mod protocol; /// A Linux keymap, either toml or text format used by ir-keytable -#[derive(PartialEq, Eq, Debug, Default)] +#[derive(PartialEq, Debug, Default)] pub struct Keymap { pub name: String, pub protocol: String, @@ -13,15 +14,15 @@ pub struct Keymap { pub irp: Option, pub rc_protocol: Option, pub raw: Option>, - pub scancodes: Option>, + pub scancodes: Option>, } -#[derive(PartialEq, Eq, Debug)] +#[derive(PartialEq, Debug)] pub struct Raw { pub keycode: String, - pub raw: Option, - pub repeat: Option, - pub pronto: Option, + pub raw: Option, + pub repeat: Option, + pub pronto: Option, } pub struct LinuxProtocol { diff --git a/src/keymap/parse.rs b/src/keymap/parse.rs index bb90403..d7ba5c9 100644 --- a/src/keymap/parse.rs +++ b/src/keymap/parse.rs @@ -1,6 +1,7 @@ //! Parse linux rc keymaps use super::{Keymap, Raw}; +use irp::{Message, Pronto}; use std::{collections::HashMap, ffi::OsStr, fmt::Write, path::Path}; use toml::{Table, Value}; @@ -12,7 +13,8 @@ peg::parser! { let mut scancodes = HashMap::new(); for (code, name) in lines.into_iter().flatten() { - scancodes.insert(code.to_owned(), name.to_owned()); + let code = string_to_scancode(code).unwrap(); + scancodes.insert(code, name.to_owned()); } let mut protocol = vec![Keymap { @@ -60,6 +62,13 @@ peg::parser! { } } +fn string_to_scancode(s: &str) -> Result { + if let Some(hex) = s.strip_prefix("0x") { + u64::from_str_radix(hex, 16) + } else { + str::parse(s) + } +} impl Keymap { /// Parse a rc keymap file, either toml or old text format. No validation is done of key codes or protocol names pub fn parse(contents: &str, filename: &Path) -> Result, String> { @@ -127,19 +136,22 @@ fn parse_toml(contents: &str, filename: &Path) -> Result, String> { }; let raw = if let Some(Value::String(raw)) = e.get("raw") { - Some(raw.to_owned()) + let raw = Message::parse(raw)?; + Some(raw) } else { None }; let repeat = if let Some(Value::String(repeat)) = e.get("repeat") { - Some(repeat.to_owned()) + let repeat = Message::parse(repeat)?; + Some(repeat) } else { None }; let pronto = if let Some(Value::String(pronto)) = e.get("pronto") { - Some(pronto.to_owned()) + let pronto = Pronto::parse(pronto)?; + Some(pronto) } else { None }; @@ -182,12 +194,14 @@ fn parse_toml(contents: &str, filename: &Path) -> Result, String> { if let Some(Value::Table(codes)) = entry.get("scancodes") { let mut res = HashMap::new(); - for (key, value) in codes { - let Value::String(value) = value else { - return Err(format!("{}: scancode should be string", filename.display())); + for (scancode, keycode) in codes { + let scancode = string_to_scancode(scancode) + .map_err(|_| format!("{scancode} is a not valid scancode"))?; + let Value::String(keycode) = keycode else { + return Err(format!("{}: keycode should be string", filename.display())); }; - res.insert(key.to_owned(), value.to_owned()); + res.insert(scancode, keycode.to_owned()); } scancodes = Some(res); @@ -407,8 +421,8 @@ fn parse_toml_test() { assert_eq!(k[0].variant, Some(String::from("rc5"))); if let Some(scancodes) = &k[0].scancodes { for s in scancodes { - match (s.0.as_str(), s.1.as_str()) { - ("0x1e3b", "KEY_SELECT") | ("0x1e3d", "KEY_POWER2") | ("0x1e1c", "KEY_TV") => {} + match (s.0, s.1.as_str()) { + (0x1e3b, "KEY_SELECT") | (0x1e3d, "KEY_POWER2") | (0x1e1c, "KEY_TV") => {} _ => panic!("{s:?} not expected"), } } @@ -473,8 +487,8 @@ fn parse_text_test() { assert_eq!(k[0].variant, None); if let Some(scancodes) = &k[0].scancodes { for s in scancodes { - match (s.0.as_str(), s.1.as_str()) { - ("0x1e3b", "KEY_SELECT") | ("0x1e3d", "KEY_POWER2") | ("0x1e1c", "KEY_TV") => {} + match (s.0, s.1.as_str()) { + (0x1e3b, "KEY_SELECT") | (0x1e3d, "KEY_POWER2") | (0x1e1c, "KEY_TV") => {} _ => panic!("{s:?} not expected"), } } @@ -498,11 +512,11 @@ fn parse_text_test() { assert_eq!(k[0].variant, None); if let Some(scancodes) = &k[0].scancodes { for s in scancodes { - match (s.0.as_str(), s.1.as_str()) { - ("0x800f0400", "KEY_NUMERIC_0") - | ("0x800f0401", "KEY_NUMERIC_1") - | ("0x800f0402", "KEY_NUMERIC_2") - | ("0x800f0403", "KEY_NUMERIC_3") => {} + match (s.0, s.1.as_str()) { + (0x800f0400, "KEY_NUMERIC_0") + | (0x800f0401, "KEY_NUMERIC_1") + | (0x800f0402, "KEY_NUMERIC_2") + | (0x800f0403, "KEY_NUMERIC_3") => {} _ => panic!("{s:?} not expected"), } } @@ -522,10 +536,10 @@ fn parse_text_test() { assert_eq!(k[0].variant, None); if let Some(scancodes) = &k[0].scancodes { for s in scancodes { - match (s.0.as_str(), s.1.as_str()) { - ("0x28c0", "KEY_NUMERIC_0") - | ("0x28c1", "KEY_NUMERIC_1") - | ("0x28c2", "KEY_NUMERIC_2") => {} + match (s.0, s.1.as_str()) { + (0x28c0, "KEY_NUMERIC_0") + | (0x28c1, "KEY_NUMERIC_1") + | (0x28c2, "KEY_NUMERIC_2") => {} _ => panic!("{s:?} not expected"), } } diff --git a/testdata/rc_keymaps/RM-786.toml b/testdata/rc_keymaps/RM-786.toml new file mode 100644 index 0000000..05e34c9 --- /dev/null +++ b/testdata/rc_keymaps/RM-786.toml @@ -0,0 +1,438 @@ +[[protocols]] +name = 'HSVP' +protocol = 'raw' +[[protocols.raw]] +keycode = 'KEY_TV1POWER' +raw = '+2445 -564 +1232 -579 +617 -581 +1240 -578 +618 -583 +1240 -572 +617 -586 +616 -612 +1236 -580 +1240 -580 +618 -579 +615 -580 +618' +[[protocols.raw]] +keycode = 'KEY_TV1ONE' +raw = '+2443 -558 +617 -580 +616 -581 +616 -582 +1241 -581 +1241 -568 +1240 -580 +616 -605 +618 -585 +1240 -575 +615 -577 +619 -581 +619' +[[protocols.raw]] +keycode = 'KEY_TV1TWO' +raw = '+2443 -560 +1242 -575 +616 -575 +618 -583 +1237 -574 +1241 -581 +1238 -579 +617 -605 +619 -581 +1240 -575 +618 -582 +618 -578 +619' +[[protocols.raw]] +keycode = 'KEY_TV1THREE' +raw = '+2440 -561 +616 -582 +1238 -571 +619 -579 +1235 -579 +1239 -569 +1242 -574 +618 -603 +615 -582 +1243 -574 +620 -571 +617 -582 +618' +[[protocols.raw]] +keycode = 'KEY_TV1FOUR' +raw = '+2446 -553 +1243 -582 +1223 -576 +620 -569 +1242 -578 +1241 -584 +1225 -578 +621 -599 +620 -583 +1240 -579 +619 -579 +620 -585 +620' +[[protocols.raw]] +keycode = 'KEY_TV1FIVE' +raw = '+2443 -553 +621 -577 +616 -584 +1241 -577 +1233 -579 +1241 -580 +1235 -574 +618 -607 +610 -586 +1235 -579 +615 -580 +620 -581 +619' +[[protocols.raw]] +keycode = 'KEY_TV1SIX' +raw = '+2440 -548 +1241 -573 +619 -574 +1242 -569 +1244 -560 +1241 -585 +1222 -568 +619 -587 +618 -579 +1240 -573 +620 -566 +620 -573 +622' +[[protocols.raw]] +keycode = 'KEY_TV1SEVEN' +raw = '+2444 -556 +618 -579 +1243 -579 +1230 -575 +1241 -571 +1243 -566 +1244 -567 +619 -600 +619 -567 +1241 -578 +612 -568 +620 -575 +619' +[[protocols.raw]] +keycode = 'KEY_TV1EIGHT' +raw = '+2442 -560 +1240 -564 +617 -575 +1242 -569 +618 -577 +1240 -567 +1241 -574 +620 -600 +617 -577 +1239 -568 +617 -575 +617 -575 +616' +[[protocols.raw]] +keycode = 'KEY_TV1NINE' +raw = '+2436 -558 +1239 -573 +615 -581 +1241 -572 +1239 -574 +1242 -576 +617 -574 +617 -600 +618 -581 +1240 -565 +616 -572 +621 -569 +617' +[[protocols.raw]] +keycode = 'KEY_TV1ZERO' +raw = '+2444 -556 +615 -581 +1238 -581 +1236 -577 +1238 -579 +1240 -573 +618 -579 +617 -602 +618 -583 +1237 -577 +618 -575 +618 -583 +618' +[[protocols.raw]] +keycode = 'KEY_TV1LIGHT' +raw = '+2443 -558 +617 -579 +1243 -573 +1238 -575 +1239 -566 +616 -580 +1243 -565 +618 -605 +616 -578 +1241 -565 +619 -572 +618 -575 +620' +[[protocols.raw]] +keycode = 'KEY_TV1SPEAKER' +raw = '+2437 -552 +1241 -568 +1243 -576 +1233 -577 +1241 -571 +616 -588 +1231 -575 +621 -588 +619 -580 +1238 -565 +621 -563 +618 -566 +619' +[[protocols.raw]] +keycode = 'KEY_TV1REC' +raw = '+2436 -563 +1242 -572 +616 -586 +1236 -579 +1238 -573 +1241 -577 +617 -582 +618 -604 +615 -581 +1243 -573 +619 -581 +614 -585 +618' +[[protocols.raw]] +keycode = 'KEY_TV1STILL' +raw = '+2444 -551 +615 -570 +620 -563 +615 -572 +1242 -566 +1241 -572 +619 -579 +617 -594 +618 -567 +1244 -564 +618 -573 +617 -577 +617' +[[protocols.raw]] +keycode = 'KEY_TV1VOLUP' +raw = '+2439 -561 +615 -584 +1231 -569 +619 -576 +614 -580 +1235 -569 +619 -573 +621 -594 +1242 -579 +1238 -576 +616 -580 +614 -582 +614' +[[protocols.raw]] +keycode = 'KEY_TV1VOLDOWN' +raw = '+2440 -564 +1242 -579 +1243 -574 +616 -575 +619 -583 +1240 -578 +616 -583 +618 -604 +1240 -580 +1236 -575 +621 -580 +619 -584 +617' +[[protocols.raw]] +keycode = 'KEY_TV1TV' +raw = '+2444 -553 +620 -576 +618 -578 +619 -583 +1231 -578 +615 -585 +1237 -574 +617 -609 +1241 -573 +1244 -569 +618 -579 +619 -570 +621' +[[protocols.raw]] +keycode = 'KEY_TV1CHUP' +raw = '+2442 -565 +618 -577 +619 -584 +606 -581 +616 -582 +1243 -577 +619 -578 +621 -609 +600 -581 +1238 -579 +619 -582 +615 -584 +619' +[[protocols.raw]] +keycode = 'KEY_TV1CHDOWN' +raw = '+2443 -561 +1238 -577 +619 -576 +618 -570 +621 -576 +1235 -573 +615 -577 +616 -593 +617 -585 +1239 -570 +619 -568 +617 -571 +620' +[[protocols.raw]] +keycode = 'KEY_VCR1POWER' +raw = '+2444 -565 +1232 -572 +1241 -572 +1241 -576 +1243 -565 +1239 -573 +615 -583 +1239 -589 +1244 -565 +619 -568 +619 -564 +619 -570 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR1ONE' +raw = '+2444 -560 +617 -574 +620 -581 +615 -576 +617 -581 +619 -581 +619 -575 +618 -603 +1244 -572 +618 -581 +621 -574 +619 -576 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR1TWO' +raw = '+2438 -557 +1242 -568 +619 -571 +620 -571 +618 -577 +618 -568 +618 -573 +618 -600 +1239 -571 +616 -566 +617 -574 +620 -572 +1238' +[[protocols.raw]] +keycode = 'KEY_VCR1THREE' +raw = '+2447 -556 +619 -566 +1241 -562 +619 -569 +619 -579 +618 -567 +619 -564 +619 -601 +1239 -567 +618 -566 +620 -576 +618 -580 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1FOUR' +raw = '+2444 -564 +1238 -579 +1243 -570 +617 -580 +613 -578 +615 -577 +619 -584 +616 -608 +1238 -575 +618 -578 +619 -582 +611 -586 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR1FIVE' +raw = '+2441 -559 +620 -575 +618 -582 +1240 -574 +615 -582 +613 -579 +616 -584 +614 -605 +1241 -575 +615 -579 +617 -579 +617 -581 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR1SIX' +raw = '+2446 -557 +1239 -569 +618 -581 +1241 -569 +621 -568 +619 -569 +617 -579 +617 -604 +1239 -566 +620 -573 +620 -578 +619 -579 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR1SEVEN' +raw = '+2444 -557 +617 -586 +1237 -575 +1241 -571 +618 -572 +618 -568 +618 -579 +617 -597 +1239 -570 +619 -571 +622 -571 +618 -577 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1EIGHT' +raw = '+2444 -557 +1243 -575 +1242 -576 +1240 -572 +617 -581 +617 -575 +618 -577 +617 -596 +1242 -570 +619 -577 +617 -577 +622 -582 +1237' +[[protocols.raw]] +keycode = 'KEY_VCR1NINE' +raw = '+2443 -555 +617 -580 +614 -574 +616 -575 +1243 -561 +616 -575 +618 -572 +618 -607 +1239 -565 +616 -569 +620 -566 +619 -574 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1ZERO' +raw = '+2446 -560 +1240 -570 +616 -581 +619 -577 +1239 -576 +619 -577 +619 -582 +616 -609 +1237 -569 +619 -579 +619 -576 +619 -579 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR1ELEVEN' +raw = '+2443 -565 +1232 -580 +1235 -582 +1241 -579 +617 -582 +617 -583 +1243 -572 +620 -609 +1234 -576 +618 -574 +619 -581 +614 -584 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1TWELVE' +raw = '+2440 -559 +618 -580 +612 -574 +618 -575 +1243 -563 +617 -577 +1238 -571 +618 -600 +1242 -570 +618 -568 +618 -573 +621 -567 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR1LIGHT' +raw = '+2442 -562 +1240 -578 +1242 -575 +614 -580 +618 -582 +616 -580 +1234 -581 +617 -610 +1241 -571 +618 -583 +613 -583 +617 -587 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1SPEAKER' +raw = '+2445 -557 +613 -585 +1239 -575 +616 -579 +617 -578 +616 -581 +1241 -572 +620 -605 +1238 -572 +617 -570 +619 -572 +616 -574 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR1PLAY' +raw = '+2442 -560 +619 -574 +1242 -570 +619 -570 +617 -567 +1242 -571 +1240 -569 +614 -608 +1241 -567 +621 -568 +617 -582 +615 -586 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1RWD' +raw = '+2446 -568 +1226 -574 +1242 -567 +619 -576 +617 -582 +1241 -579 +1242 -573 +613 -606 +1242 -576 +618 -570 +617 -581 +621 -572 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1FWD' +raw = '+2441 -555 +618 -577 +619 -572 +1240 -570 +621 -580 +1238 -578 +1240 -576 +616 -603 +1239 -573 +618 -574 +617 -577 +619 -570 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1STOP' +raw = '+2433 -559 +618 -567 +620 -563 +618 -573 +1238 -566 +1242 -574 +1242 -576 +617 -598 +1242 -574 +617 -568 +617 -564 +618 -573 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1REC' +raw = '+2440 -558 +619 -585 +1237 -581 +1242 -572 +618 -586 +1234 -582 +1242 -583 +618 -611 +1236 -578 +615 -577 +616 -581 +605 -586 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR1STILL' +raw = '+2443 -555 +1238 -571 +612 -570 +619 -572 +1239 -571 +1239 -571 +1240 -571 +619 -602 +1237 -575 +616 -568 +620 -573 +617 -572 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR1VOLUP' +raw = '+2440 -563 +616 -584 +1236 -577 +618 -578 +619 -582 +1239 -576 +616 -582 +616 -611 +1238 -574 +617 -583 +618 -577 +617 -587 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR1VOLDOWN' +raw = '+2442 -566 +1239 -578 +1244 -574 +620 -580 +614 -587 +1238 -575 +616 -588 +614 -609 +1236 -572 +616 -581 +615 -578 +619 -588 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1CHUP' +raw = '+2433 -561 +1242 -568 +614 -575 +618 -570 +616 -582 +1237 -571 +1241 -577 +619 -592 +1242 -569 +612 -569 +620 -567 +616 -572 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR1CHDOWN' +raw = '+2443 -560 +618 -583 +619 -579 +619 -581 +618 -583 +1237 -583 +1235 -579 +617 -602 +1239 -574 +615 -575 +615 -579 +618 -590 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1TV' +raw = '+2442 -554 +619 -580 +620 -580 +1242 -579 +1243 -579 +1236 -576 +617 -586 +615 -610 +1238 -576 +615 -578 +621 -576 +619 -581 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR1MUTE' +raw = '+2444 -568 +1232 -575 +619 -581 +1244 -579 +1238 -580 +608 -581 +1244 -570 +620 -605 +1241 -573 +620 -575 +614 -582 +620 -580 +1240' +[[protocols.raw]] +keycode = 'KEY_CABLEPOWER' +raw = '+2442 -553 +1237 -570 +619 -568 +1239 -571 +617 -571 +1241 -568 +617 -573 +615 -590 +618 -574 +618 -563 +617 -578 +616 -584 +1239' +[[protocols.raw]] +keycode = 'KEY_CABLEONE' +raw = '+2440 -559 +620 -580 +616 -581 +616 -579 +620 -580 +616 -581 +617 -580 +619 -609 +616 -581 +615 -579 +619 -575 +618 -588 +1238' +[[protocols.raw]] +keycode = 'KEY_CABLETWO' +raw = '+2445 -565 +1226 -569 +618 -586 +609 -581 +613 -582 +622 -573 +615 -582 +614 -607 +623 -567 +618 -577 +620 -583 +614 -584 +1238' +[[protocols.raw]] +keycode = 'KEY_CABLETHREE' +raw = '+2448 -543 +619 -578 +1243 -580 +596 -567 +618 -570 +620 -577 +619 -578 +617 -597 +615 -562 +616 -568 +621 -576 +616 -582 +1240' +[[protocols.raw]] +keycode = 'KEY_CABLEFOUR' +raw = '+2445 -556 +1239 -567 +1243 -564 +619 -576 +614 -572 +617 -577 +617 -575 +619 -598 +617 -577 +618 -572 +617 -575 +615 -582 +1240' +[[protocols.raw]] +keycode = 'KEY_CABLEFIVE' +raw = '+2446 -555 +619 -580 +621 -574 +1242 -571 +622 -578 +602 -578 +618 -576 +621 -591 +618 -572 +621 -581 +616 -574 +617 -578 +1245' +[[protocols.raw]] +keycode = 'KEY_CABLESIX' +raw = '+2444 -556 +1240 -572 +620 -572 +1238 -574 +618 -574 +619 -569 +618 -583 +617 -606 +615 -576 +616 -577 +620 -573 +615 -585 +1240' +[[protocols.raw]] +keycode = 'KEY_CABLESEVEN' +raw = '+2444 -556 +617 -583 +1239 -580 +1239 -578 +611 -581 +619 -577 +620 -584 +613 -604 +619 -583 +621 -573 +618 -573 +620 -583 +1240' +[[protocols.raw]] +keycode = 'KEY_CABLEEIGHT' +raw = '+2442 -565 +1237 -580 +1239 -581 +1239 -574 +616 -581 +619 -579 +616 -581 +615 -604 +617 -582 +618 -580 +618 -582 +613 -582 +1242' +[[protocols.raw]] +keycode = 'KEY_CABLENINE' +raw = '+2442 -555 +618 -581 +616 -563 +617 -573 +1242 -580 +615 -565 +620 -570 +617 -591 +616 -566 +621 -567 +619 -571 +620 -573 +1244' +[[protocols.raw]] +keycode = 'KEY_CABLEZERO' +raw = '+2444 -558 +1242 -575 +618 -577 +618 -575 +1242 -572 +618 -575 +617 -583 +618 -600 +618 -576 +617 -579 +615 -581 +618 -579 +1238' +[[protocols.raw]] +keycode = 'KEY_CABLESPEAKER' +raw = '+2443 -556 +619 -572 +616 -572 +620 -583 +1235 -576 +1241 -572 +1243 -565 +1244 -591 +1242 -570 +614 -580 +618 -579 +619 -565 +1243' +[[protocols.raw]] +keycode = 'KEY_CABLEPLAY' +raw = '+2442 -551 +619 -576 +1239 -564 +620 -570 +617 -576 +1242 -571 +1240 -565 +620 -599 +619 -576 +619 -565 +621 -563 +616 -581 +1239' +[[protocols.raw]] +keycode = 'KEY_CABLERWD' +raw = '+2443 -554 +1242 -568 +1243 -563 +617 -567 +615 -580 +1241 -566 +1243 -567 +618 -595 +618 -568 +618 -578 +615 -577 +618 -569 +1242' +[[protocols.raw]] +keycode = 'KEY_CABLEFWD' +raw = '+2437 -553 +618 -569 +619 -576 +1239 -573 +618 -572 +1239 -578 +1238 -580 +616 -597 +619 -570 +618 -564 +618 -577 +618 -573 +1242' +[[protocols.raw]] +keycode = 'KEY_CABLESTOP' +raw = '+2443 -548 +619 -569 +618 -569 +619 -574 +1241 -574 +1241 -563 +1242 -577 +615 -598 +617 -570 +617 -569 +619 -574 +618 -565 +1243' +[[protocols.raw]] +keycode = 'KEY_CABLEREC' +raw = '+2444 -560 +615 -585 +1239 -580 +1241 -571 +617 -571 +1240 -576 +1243 -572 +620 -599 +619 -579 +617 -583 +612 -583 +610 -584 +1241' +[[protocols.raw]] +keycode = 'KEY_CABLESTILL' +raw = '+2444 -555 +1243 -565 +619 -567 +618 -585 +1237 -566 +1242 -566 +1243 -567 +619 -598 +620 -564 +617 -571 +620 -577 +614 -581 +1239' +[[protocols.raw]] +keycode = 'KEY_CABLEVOLUP' +raw = '+2441 -557 +616 -580 +1236 -571 +619 -580 +617 -584 +1239 -571 +616 -581 +617 -601 +616 -582 +613 -577 +616 -582 +613 -591 +1236' +[[protocols.raw]] +keycode = 'KEY_CABLEVOLDOWN' +raw = '+2440 -564 +1242 -571 +1241 -574 +617 -581 +615 -581 +1243 -572 +617 -585 +616 -604 +618 -581 +619 -580 +617 -578 +619 -587 +1241' +[[protocols.raw]] +keycode = 'KEY_CABLECHUP' +raw = '+2441 -561 +615 -586 +1234 -579 +1237 -581 +1239 -579 +616 -585 +1241 -579 +1238 -600 +1240 -571 +618 -582 +617 -579 +618 -586 +1234' +[[protocols.raw]] +keycode = 'KEY_CABLECHDOWN' +raw = '+2440 -565 +1234 -580 +1241 -575 +1240 -582 +1237 -574 +619 -583 +1239 -581 +1239 -603 +1242 -569 +618 -579 +616 -579 +620 -586 +1242' +[[protocols.raw]] +keycode = 'KEY_CABLETV' +raw = '+2444 -562 +1238 -580 +1238 -579 +1239 -576 +1239 -582 +1235 -576 +611 -583 +1242 -601 +1244 -574 +612 -581 +618 -581 +619 -586 +1242' +[[protocols.raw]] +keycode = 'KEY_CABLEMUTE' +raw = '+2440 -560 +618 -573 +619 -581 +1240 -573 +621 -576 +1240 -575 +619 -584 +612 -606 +616 -581 +619 -578 +621 -573 +616 -586 +1242' +[[protocols.raw]] +keycode = 'KEY_TV2POWER' +raw = '+2446 -557 +621 -579 +618 -580 +621 -583 +1238 -571 +621 -582 +1236 -579 +617 -607 +618 -584 +1237 -579 +1239 -575 +620 -577 +618' +[[protocols.raw]] +keycode = 'KEY_TV2ONE' +raw = '+2430 -561 +617 -565 +618 -576 +620 -586 +614 -578 +616 -578 +622 -583 +612 -602 +617 -580 +1244 -577 +1240 -583 +613 -573 +617' +[[protocols.raw]] +keycode = 'KEY_TV2TWO' +raw = '+2443 -564 +1235 -567 +618 -569 +621 -564 +619 -572 +616 -574 +618 -578 +619 -599 +614 -576 +1241 -572 +1242 -571 +617 -571 +620' +[[protocols.raw]] +keycode = 'KEY_TV2THREE' +raw = '+2438 -551 +617 -572 +1242 -565 +618 -565 +618 -576 +620 -563 +617 -580 +615 -597 +619 -567 +1240 -571 +1241 -563 +618 -571 +619' +[[protocols.raw]] +keycode = 'KEY_TV2FOUR' +raw = '+2444 -549 +1242 -579 +1235 -563 +619 -576 +616 -566 +618 -576 +617 -572 +619 -599 +615 -571 +1243 -569 +1241 -571 +617 -567 +621' +[[protocols.raw]] +keycode = 'KEY_TV2FIVE' +raw = '+2443 -554 +615 -580 +614 -582 +1238 -569 +620 -569 +615 -576 +618 -576 +621 -600 +618 -574 +1238 -573 +1238 -571 +620 -575 +616' +[[protocols.raw]] +keycode = 'KEY_TV2SIX' +raw = '+2442 -552 +1242 -565 +616 -580 +1243 -561 +619 -569 +617 -568 +620 -566 +617 -598 +617 -578 +1239 -574 +1238 -569 +617 -567 +618' +[[protocols.raw]] +keycode = 'KEY_TV2SEVEN' +raw = '+2431 -560 +615 -568 +1240 -569 +1239 -570 +620 -566 +619 -573 +619 -574 +620 -592 +615 -574 +1242 -569 +1240 -569 +617 -573 +619' +[[protocols.raw]] +keycode = 'KEY_TV2EIGHT' +raw = '+2447 -554 +1242 -569 +1244 -572 +1236 -572 +613 -574 +616 -571 +619 -578 +621 -586 +620 -570 +1241 -560 +1242 -568 +621 -566 +620' +[[protocols.raw]] +keycode = 'KEY_TV2NINE' +raw = '+2435 -559 +619 -564 +618 -574 +616 -570 +1241 -564 +616 -579 +620 -573 +618 -602 +613 -579 +1239 -567 +1238 -567 +619 -579 +617' +[[protocols.raw]] +keycode = 'KEY_TV2ZERO' +raw = '+2440 -560 +1238 -564 +619 -570 +614 -575 +1242 -565 +620 -576 +614 -579 +618 -595 +619 -580 +1243 -564 +1242 -572 +616 -570 +621' +[[protocols.raw]] +keycode = 'KEY_TV2ELEVEN' +raw = '+2444 -562 +1244 -577 +618 -580 +616 -583 +1242 -575 +1238 -580 +1235 -581 +608 -606 +619 -585 +1240 -579 +1241 -576 +619 -584 +618' +[[protocols.raw]] +keycode = 'KEY_TV2TWELVE' +raw = '+2440 -554 +1241 -564 +616 -571 +1241 -565 +619 -576 +618 -572 +618 -569 +1240 -588 +618 -577 +1242 -566 +1241 -573 +620 -565 +619' +[[protocols.raw]] +keycode = 'KEY_TV2LIGHT' +raw = '+2432 -554 +1240 -576 +1240 -572 +616 -574 +616 -572 +617 -576 +1240 -569 +616 -598 +618 -578 +1240 -569 +1242 -569 +619 -569 +620' +[[protocols.raw]] +keycode = 'KEY_TV2SPEAKER' +raw = '+2447 -549 +620 -573 +617 -572 +1243 -565 +617 -572 +619 -577 +1240 -565 +620 -600 +614 -575 +1241 -570 +1239 -568 +619 -572 +619' +[[protocols.raw]] +keycode = 'KEY_TV2PLAY' +raw = '+2441 -553 +620 -571 +1242 -563 +620 -566 +1240 -569 +1241 -569 +618 -570 +617 -591 +619 -570 +1243 -566 +1241 -565 +620 -563 +619' +[[protocols.raw]] +keycode = 'KEY_TV2RWD' +raw = '+2439 -552 +1242 -567 +619 -569 +615 -571 +617 -578 +1239 -565 +619 -569 +616 -603 +614 -575 +1239 -577 +1239 -560 +618 -570 +617' +[[protocols.raw]] +keycode = 'KEY_TV2FWD' +raw = '+2406 -567 +605 -585 +600 -587 +598 -580 +599 -589 +1219 -586 +609 -583 +594 -610 +598 -589 +1226 -586 +1215 -584 +594 -590 +601' +[[protocols.raw]] +keycode = 'KEY_TV2STOP' +raw = '+2443 -559 +619 -576 +619 -571 +619 -575 +1239 -572 +1240 -574 +619 -570 +618 -597 +614 -572 +1242 -570 +1239 -569 +620 -575 +618' +[[protocols.raw]] +keycode = 'KEY_TV2REC' +raw = '+2440 -560 +615 -580 +615 -582 +620 -576 +1242 -574 +618 -586 +1242 -579 +1241 -604 +617 -585 +1236 -584 +1235 -577 +616 -586 +617' +[[protocols.raw]] +keycode = 'KEY_TV2STILL' +raw = '+2426 -557 +1240 -573 +617 -567 +620 -578 +1239 -570 +1241 -576 +611 -579 +619 -593 +618 -565 +1242 -566 +1242 -568 +618 -575 +619' +[[protocols.raw]] +keycode = 'KEY_TV2VOLUP' +raw = '+2457 -563 +1245 -586 +1234 -574 +622 -584 +1239 -582 +1239 -579 +615 -586 +620 -605 +615 -586 +1245 -572 +1242 -580 +612 -584 +622' +[[protocols.raw]] +keycode = 'KEY_TV2VOLDOWN' +raw = '+2467 -566 +619 -586 +1241 -584 +1240 -579 +1243 -581 +1243 -578 +619 -588 +622 -609 +620 -585 +1243 -583 +1242 -580 +620 -582 +620' +[[protocols.raw]] +keycode = 'KEY_TV2CHUP' +raw = '+2452 -556 +619 -570 +618 -576 +1242 -568 +619 -574 +1245 -564 +1243 -569 +619 -601 +619 -568 +1243 -569 +1242 -570 +619 -572 +620' +[[protocols.raw]] +keycode = 'KEY_TV2CHDOWN' +raw = '+2463 -569 +1243 -583 +621 -585 +1240 -578 +621 -585 +1244 -582 +1241 -582 +621 -610 +617 -581 +1244 -587 +1244 -580 +621 -581 +622' +[[protocols.raw]] +keycode = 'KEY_TV2TV' +raw = '+2464 -565 +619 -587 +1241 -577 +619 -585 +1240 -586 +1243 -580 +1244 -585 +617 -608 +621 -587 +1243 -580 +1243 -577 +622 -586 +620' +[[protocols.raw]] +keycode = 'KEY_TV2MUTE' +raw = '+2464 -567 +618 -580 +620 -581 +1243 -583 +621 -583 +621 -582 +621 -586 +1239 -605 +621 -586 +1242 -581 +1243 -583 +620 -583 +621' +[[protocols.raw]] +keycode = 'KEY_VCR2POWER' +raw = '+2453 -563 +1242 -575 +619 -576 +1243 -572 +618 -576 +1242 -567 +620 -577 +619 -603 +1243 -577 +619 -563 +619 -582 +617 -578 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR2ONE' +raw = '+2464 -558 +618 -573 +622 -571 +621 -573 +619 -574 +620 -572 +622 -575 +616 -605 +1244 -576 +620 -570 +618 -572 +620 -580 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR2TWO' +raw = '+2464 -562 +1242 -576 +621 -574 +620 -569 +620 -576 +621 -575 +617 -567 +620 -595 +1243 -562 +619 -566 +621 -577 +621 -575 +1240' +[[protocols.raw]] +keycode = 'KEY_VCR2THREE' +raw = '+2452 -561 +617 -575 +1242 -569 +619 -573 +618 -573 +619 -581 +619 -582 +618 -608 +1240 -571 +620 -566 +618 -568 +620 -580 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR2FOUR' +raw = '+2467 -561 +1244 -570 +1243 -574 +618 -581 +621 -572 +621 -573 +619 -574 +619 -600 +1243 -572 +620 -571 +620 -566 +621 -586 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR2FIVE' +raw = '+2466 -561 +621 -571 +621 -582 +1242 -578 +619 -578 +621 -571 +621 -576 +620 -602 +1244 -573 +621 -582 +619 -577 +620 -577 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2SIX' +raw = '+2459 -561 +1241 -570 +619 -572 +1243 -575 +619 -571 +620 -564 +619 -579 +618 -599 +1243 -574 +620 -568 +620 -572 +621 -582 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2SEVEN' +raw = '+2469 -562 +621 -578 +1242 -580 +1243 -577 +621 -573 +621 -573 +621 -582 +617 -604 +1242 -569 +620 -573 +620 -577 +620 -578 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2EIGHT' +raw = '+2465 -567 +1243 -582 +1244 -581 +1243 -565 +620 -577 +620 -570 +620 -581 +621 -601 +1242 -569 +621 -576 +621 -571 +619 -583 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR2NINE' +raw = '+2451 -562 +619 -573 +620 -572 +620 -573 +1242 -573 +620 -564 +620 -577 +618 -598 +1242 -577 +620 -569 +621 -572 +617 -580 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2ZERO' +raw = '+2466 -569 +618 -583 +622 -582 +621 -581 +617 -582 +621 -581 +1244 -584 +619 -611 +1244 -582 +617 -580 +620 -583 +616 -589 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2ELEVEN' +raw = '+2464 -561 +1243 -577 +620 -573 +620 -572 +620 -568 +621 -575 +1242 -571 +619 -598 +1242 -571 +621 -573 +620 -569 +621 -573 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR2TWELVE' +raw = '+2468 -551 +618 -567 +1241 -575 +621 -570 +617 -569 +620 -578 +1243 -567 +621 -596 +1244 -567 +618 -565 +619 -572 +617 -570 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR2PLAY' +raw = '+2465 -562 +621 -568 +1242 -565 +621 -569 +620 -571 +1243 -571 +1242 -580 +621 -597 +1242 -569 +621 -569 +619 -576 +619 -586 +1243' +[[protocols.raw]] +keycode = 'KEY_VCR2RWD' +raw = '+2463 -567 +619 -583 +620 -581 +619 -584 +619 -585 +1243 -583 +1244 -586 +621 -609 +1244 -582 +617 -583 +621 -584 +620 -588 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR2FWD' +raw = '+2464 -565 +1242 -567 +619 -564 +620 -570 +620 -568 +1244 -578 +1242 -567 +620 -608 +1243 -572 +620 -572 +621 -564 +621 -569 +1241' +[[protocols.raw]] +keycode = 'KEY_VCR2STOP' +raw = '+2468 -568 +617 -583 +617 -582 +616 -586 +1244 -585 +1239 -584 +1243 -582 +621 -613 +1239 -584 +621 -581 +622 -583 +619 -584 +1244' +[[protocols.raw]] +keycode = 'KEY_VCR2STILL' +raw = '+2463 -562 +1242 -569 +618 -578 +618 -573 +1242 -566 +1242 -576 +1242 -576 +620 -602 +1244 -569 +619 -574 +620 -568 +618 -572 +1242' +[[protocols.raw]] +keycode = 'KEY_VCR2VOLUP' +raw = '+2463 -573 +1241 -581 +1245 -582 +621 -579 +1243 -577 +1245 -578 +619 -583 +618 -609 +621 -587 +1243 -582 +1244 -582 +620 -585 +621' +[[protocols.raw]] +keycode = 'KEY_VCR2VOLDOWN' +raw = '+2464 -567 +621 -581 +1243 -583 +1245 -585 +1245 -586 +1240 -583 +620 -580 +619 -610 +619 -582 +1244 -582 +1243 -581 +622 -584 +618' +[[protocols.raw]] +keycode = 'KEY_VCR2MUTE' +raw = '+2465 -567 +619 -576 +619 -586 +1241 -575 +620 -579 +620 -579 +619 -587 +1242 -603 +616 -581 +1243 -575 +1242 -577 +620 -583 +621' +[[protocols.raw]] +keycode = 'KEY_AUXPOWER' +raw = '+2465 -568 +1242 -579 +621 -584 +1241 -580 +619 -585 +1240 -574 +621 -586 +621 -604 +621 -583 +1242 -578 +1243 -579 +620 -584 +619' +[[protocols.raw]] +keycode = 'KEY_AUXONE' +raw = '+2462 -571 +614 -581 +621 -585 +620 -580 +619 -582 +621 -584 +622 -583 +617 -611 +621 -585 +1241 -578 +1244 -585 +619 -583 +618' +[[protocols.raw]] +keycode = 'KEY_AUXTWO' +raw = '+2465 -569 +1243 -579 +618 -584 +621 -580 +621 -577 +619 -581 +621 -585 +621 -606 +619 -582 +1243 -586 +1242 -579 +621 -588 +617' +[[protocols.raw]] +keycode = 'KEY_AUXTHREE' +raw = '+2466 -566 +621 -578 +1243 -580 +619 -582 +621 -584 +622 -582 +620 -582 +621 -602 +622 -586 +1243 -584 +1242 -584 +621 -585 +618' +[[protocols.raw]] +keycode = 'KEY_AUXFOUR' +raw = '+2464 -564 +1242 -582 +1243 -576 +621 -580 +619 -580 +620 -582 +620 -588 +621 -606 +619 -586 +1244 -584 +1244 -579 +619 -587 +619' +[[protocols.raw]] +keycode = 'KEY_AUXFIVE' +raw = '+2464 -566 +621 -583 +619 -585 +1242 -573 +619 -578 +619 -582 +620 -584 +619 -606 +621 -580 +1241 -579 +1242 -576 +622 -577 +621' +[[protocols.raw]] +keycode = 'KEY_AUXSIX' +raw = '+2466 -567 +1242 -575 +619 -578 +1243 -578 +620 -582 +618 -581 +621 -585 +619 -604 +620 -586 +1242 -584 +1241 -577 +621 -585 +621' +[[protocols.raw]] +keycode = 'KEY_AUXSEVEN' +raw = '+2467 -564 +620 -584 +1243 -584 +1240 -573 +621 -583 +621 -582 +620 -574 +621 -609 +618 -581 +1242 -579 +1243 -578 +621 -574 +621' +[[protocols.raw]] +keycode = 'KEY_AUXEIGHT' +raw = '+2467 -565 +1243 -579 +1243 -575 +1242 -571 +620 -578 +620 -577 +616 -582 +621 -600 +619 -579 +1243 -580 +1243 -575 +621 -578 +621' +[[protocols.raw]] +keycode = 'KEY_AUXNINE' +raw = '+2461 -569 +619 -582 +620 -585 +621 -586 +1244 -585 +617 -583 +619 -586 +621 -607 +620 -579 +1243 -582 +1241 -582 +621 -583 +622' +[[protocols.raw]] +keycode = 'KEY_AUXZERO' +raw = '+2462 -566 +1244 -578 +620 -583 +620 -585 +1242 -576 +619 -584 +621 -572 +620 -608 +619 -582 +1240 -581 +1240 -582 +621 -585 +619' +[[protocols.raw]] +keycode = 'KEY_AUXELEVEN' +raw = '+2465 -571 +1241 -584 +612 -581 +622 -579 +1244 -587 +1242 -576 +1243 -586 +619 -608 +620 -587 +1241 -587 +1242 -582 +620 -588 +621' +[[protocols.raw]] +keycode = 'KEY_AUXTWELVE' +raw = '+2464 -572 +620 -585 +1242 -584 +621 -585 +1244 -579 +1244 -578 +1242 -581 +620 -606 +621 -577 +1243 -584 +1243 -584 +621 -586 +620' +[[protocols.raw]] +keycode = 'KEY_AUXLIGHT' +raw = '+2467 -571 +1243 -579 +1244 -580 +621 -582 +617 -581 +620 -586 +1242 -585 +620 -608 +617 -577 +1244 -581 +1241 -578 +619 -587 +619' +[[protocols.raw]] +keycode = 'KEY_AUXSPEAKER' +raw = '+2463 -568 +621 -580 +621 -581 +1242 -579 +620 -583 +621 -577 +1242 -584 +620 -609 +620 -586 +1240 -586 +1245 -579 +621 -585 +621' +[[protocols.raw]] +keycode = 'KEY_AUXPLAY' +raw = '+2464 -570 +621 -583 +1238 -582 +621 -587 +1242 -579 +1243 -578 +620 -587 +621 -610 +613 -581 +1243 -586 +1241 -578 +621 -583 +619' +[[protocols.raw]] +keycode = 'KEY_AUXRWD' +raw = '+2467 -563 +1242 -571 +1244 -568 +619 -578 +1242 -579 +1242 -573 +620 -576 +620 -601 +620 -574 +1243 -576 +1244 -572 +621 -570 +620' +[[protocols.raw]] +keycode = 'KEY_AUXFWD' +raw = '+2462 -559 +620 -569 +619 -574 +1244 -576 +1243 -576 +1243 -568 +620 -572 +620 -594 +621 -577 +1243 -576 +1244 -573 +620 -577 +620' +[[protocols.raw]] +keycode = 'KEY_AUXSTOP' +raw = '+2467 -558 +620 -575 +620 -578 +621 -581 +1242 -572 +1243 -579 +620 -571 +618 -604 +620 -580 +1243 -580 +1243 -576 +621 -578 +616' +[[protocols.raw]] +keycode = 'KEY_AUXSTILL' +raw = '+2463 -567 +1242 -571 +621 -583 +616 -578 +1243 -583 +1243 -577 +621 -577 +620 -608 +620 -582 +1244 -574 +1242 -579 +619 -585 +618' +[[protocols.raw]] +keycode = 'KEY_AUXVOLUP' +raw = '+2466 -568 +1240 -583 +1241 -581 +620 -581 +1244 -574 +620 -579 +620 -584 +618 -607 +619 -582 +1244 -581 +1243 -583 +618 -580 +620' +[[protocols.raw]] +keycode = 'KEY_AUXVOLDOWN' +raw = '+2465 -569 +620 -582 +618 -584 +1242 -581 +618 -585 +620 -583 +620 -585 +1242 -607 +622 -575 +1243 -584 +1243 -578 +621 -579 +619' +[[protocols.raw]] +keycode = 'KEY_AUXCHUP' +raw = '+2467 -564 +620 -583 +620 -582 +1242 -585 +615 -583 +1244 -579 +1244 -579 +618 -610 +620 -583 +1244 -583 +1243 -577 +619 -580 +621' +[[protocols.raw]] +keycode = 'KEY_AUXCHDOWN' +raw = '+2465 -566 +1242 -565 +619 -574 +1242 -571 +619 -575 +1243 -571 +1242 -575 +620 -592 +621 -572 +1244 -568 +1243 -569 +621 -578 +619' +[[protocols.raw]] +keycode = 'KEY_AUXTV' +raw = '+2466 -564 +620 -582 +621 -579 +618 -585 +1241 -577 +621 -586 +1243 -577 +619 -606 +619 -584 +1242 -584 +1243 -577 +621 -582 +617' +[[protocols.raw]] +keycode = 'KEY_AUXMUTE' +raw = '+2463 -567 +621 -583 +622 -585 +1244 -574 +621 -584 +621 -580 +621 -587 +1242 -607 +619 -586 +1242 -583 +1244 -580 +620 -584 +617'