Skip to content

Commit

Permalink
Implement decoding with toggle_bit_mask with many bits set
Browse files Browse the repository at this point in the history
Signed-off-by: Sean Young <[email protected]>
  • Loading branch information
seanyoung committed Mar 26, 2024
1 parent e0d9ef6 commit 196bfe4
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 5 deletions.
53 changes: 53 additions & 0 deletions liblircd/tests/transmit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,57 @@ fn encode() {
);
}
}

// now test decode of a remote with toggle_bit_mask set (more than one bit)

let conf = read_to_string("../testdata/lircd_conf/d-link/DSM-10.lircd.conf").unwrap();

//unsafe { lirc_log_set_stdout() };

let conf = LircdConf::parse(&conf).unwrap();

let lircd_conf: Vec<_> = conf.iter().collect();

assert_eq!(lircd_conf.len(), 1);

let remote = &lircd_conf[0];

assert_eq!(remote.name(), "DLink_DSM-10");

// encode
let code = remote
.codes_iter()
.find(|code| code.name() == "KEY_1")
.unwrap();

let data = code.encode().unwrap();

let result = remote.decode(&data);

assert_eq!(result, vec![0x42BD]);

// cargo run transmit irp '{msb}<664,-460|664,-1592>(9132,-4396,0x1067:16,(CODE^0x6a6a):16,671,^108247,(9128,-2143,671,^108247)*) [CODE:0..65535]' -fCODE=0x42BD
let data = [
9132, 4396, 664, 460, 664, 460, 664, 460, 664, 1592, 664, 460, 664, 460, 664, 460, 664,
460, 664, 460, 664, 1592, 664, 1592, 664, 460, 664, 460, 664, 1592, 664, 1592, 664, 1592,
664, 460, 664, 460, 664, 1592, 664, 460, 664, 1592, 664, 460, 664, 460, 664, 460, 664,
1592, 664, 1592, 664, 460, 664, 1592, 664, 460, 664, 1592, 664, 1592, 664, 1592, 671,
42232, 9128, 2143, 671, 96305,
];

let result = remote.decode(&data);

assert_eq!(result, vec![0x42BD, 0x42BD]);

// cargo run transmit lircd testdata/lircd_conf/d-link/DSM-10.lircd.conf KEY_1
let data = [
9132, 4396, 664, 460, 664, 460, 664, 460, 664, 1592, 664, 460, 664, 460, 664, 460, 664,
460, 664, 460, 664, 1592, 664, 1592, 664, 460, 664, 460, 664, 1592, 664, 1592, 664, 1592,
664, 460, 664, 1592, 664, 460, 664, 460, 664, 460, 664, 460, 664, 1592, 664, 460, 664,
1592, 664, 460, 664, 1592, 664, 1592, 664, 1592, 664, 1592, 664, 460, 664, 1592, 671,
42232,
];
let result = remote.decode(&data);

assert_eq!(result, vec![0x42BD]);
}
12 changes: 7 additions & 5 deletions src/lircd_conf/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,21 @@ impl<'a> LircDecoder<'a> {
self.decoder.nfa_input(ir, &self.nfa, |_, vars| {
if let Some(decoded) = vars.get("CODE") {
if self.remote.raw_codes.is_empty() {
// TODO: ignore mask, toggle_bit_mask with many bits set
let mask = if self.remote.toggle_bit_mask.count_ones() == 1 {
!self.remote.toggle_bit_mask
// TODO: ignore mask
let (mask, toggle_bit_mask) = if self.remote.toggle_bit_mask.count_ones() == 1 {
(!self.remote.toggle_bit_mask, 0)
} else {
!0
(!0, self.remote.toggle_bit_mask)
};

let decoded = *decoded as u64;
if let Some(key_code) = self.remote.codes.iter().find(|code| {
let code = code.code[0] & mask;
let decoded_masked = decoded & mask;

code == decoded_masked || code == (decoded_masked ^ self.remote.repeat_mask)
code == decoded_masked
|| code == (decoded_masked ^ self.remote.repeat_mask)
|| (code == (decoded_masked ^ toggle_bit_mask))
}) {
callback(&key_code.name, decoded);
}
Expand Down
27 changes: 27 additions & 0 deletions tests/decode_tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use assert_cmd::Command;

#[test]
fn toggle_bit_mask() {
let mut cmd = Command::cargo_bin("cir").unwrap();

let assert = cmd
.args([
"decode", "lircd", "testdata/lircd_conf/d-link/DSM-10.lircd.conf", "-q", "-r",
"+9132 -4396 +664 -460 +664 -460 +664 -460 +664 -1592 +664 -460 +664 -460 +664 -460 +664 -460 +664 -460 +664 -1592 +664 -1592 +664 -460 +664 -460 +664 -1592 +664 -1592 +664 -1592 +664 -460 +664 -460 +664 -1592 +664 -460 +664 -1592 +664 -460 +664 -460 +664 -460 +664 -1592 +664 -1592 +664 -460 +664 -1592 +664 -460 +664 -1592 +664 -1592 +664 -1592 +671 -42232 +9128 -2143 +671 -96305"
])
.assert();

let output = assert.get_output();

let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);

assert_eq!(stderr, "");

assert_eq!(
stdout,
r#"decoded: remote:DLink_DSM-10 code:KEY_1
decoded: remote:DLink_DSM-10 code:KEY_1
"#
);
}

0 comments on commit 196bfe4

Please sign in to comment.