ir_remote/ir_signal/
encode.rs1use std::time::Duration;
2
3use bitvec::bitarr;
4use bitvec::prelude::*;
5
6use super::IrPacket;
7use super::{Event, IrSignal, FIRST_LOW_DURATION, HIGH_DURATION, LOW_0_DURATION, LOW_1_DURATION};
8
9impl IrPacket {
10 pub fn encode(&self) -> Vec<Event> {
11 let first_high_duration = self.remote_type.get_first_high_duration();
12 let first_low_duration = Duration::from_secs_f64(FIRST_LOW_DURATION);
13
14 let high_duration = Duration::from_secs_f64(HIGH_DURATION);
15 let low_0_duration = Duration::from_secs_f64(LOW_0_DURATION);
16 let low_1_duration = Duration::from_secs_f64(LOW_1_DURATION);
17
18 let mut events = vec![
19 Event {
20 is_on: true,
21 duration: first_high_duration,
22 },
23 Event {
24 is_on: false,
25 duration: first_low_duration,
26 },
27 ];
28
29 let mut bits = bitarr!(u32, Msb0; 0; 32);
30 bits[..16].store(self.receiver_id);
31 bits[16..24].store(self.button);
32 bits[24..].store(!self.button);
33 for bit in bits {
34 events.push(Event {
35 is_on: true,
36 duration: high_duration,
37 });
38 events.push(Event {
39 is_on: false,
40 duration: match bit {
41 true => low_1_duration,
42 false => low_0_duration,
43 },
44 })
45 }
46 events.push(Event {
47 is_on: true,
48 duration: high_duration,
49 });
50 events
51 }
52}
53
54impl IrSignal {
55 pub fn encode(&self) -> Vec<Event> {
56 let mut events = self.packet.encode();
57 if let Some(repeat) = self.repeat {
58 let packet_size = events.len();
59 let times_left = repeat.times - 1;
60 for _ in 0..times_left {
61 events.push(Event {
62 is_on: false,
63 duration: repeat.duration_between,
64 });
65 events.extend_from_within(..packet_size);
66 }
67 }
68 events
69 }
70}