-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathir_recv.cpp
73 lines (59 loc) · 1.41 KB
/
ir_recv.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "ir_recv.h"
size_t IrData::printTo(Print& p) const
{
size_t n = 0;
char buffer[32];
String s;
switch (type)
{
case IrDataType::Space:
s = String("space ") + String(duration);
break;
case IrDataType::Pulse:
s = String("pulse ") + String(duration);
break;
default:
return 0;
}
s.toCharArray(buffer, 32);
n = p.print(buffer);
return n;
}
IrReceiver::IrReceiver(pin_t recv_pin,
uint16_t buffer_size)
:
recv_pin_(recv_pin),
buffer_size_(buffer_size),
// buffer_(new RingBuffer<IrData>[buffer_size]),
last_time_(micros())
{
pinMode(recv_pin, INPUT);
}
volatile bool IrReceiver::HasData(void) {
return !buffer_.Empty();
}
void IrReceiver::Put(IrData data) {
buffer_.Put(data);
}
IrData IrReceiver::Get(void) {
return buffer_.Get();
}
void IrReceiver::Update(void) {
IrData data;
uint32_t now = micros();
IrDataType current_state = (IrDataType)digitalRead(recv_pin_);
if (current_state != last_state_) {
data.duration = now - last_time_;
data.type = (IrDataType)last_state_;
buffer_.Put(data);
last_state_ = current_state;
last_time_ = now;
}
}
void IrReceiver::AttachInterrupt(void) {
auto irInterruptHandler = std::bind(&IrReceiver::Update, this);
attachInterrupt(recv_pin_, irInterruptHandler, CHANGE);
}
void IrReceiver::DetachInterrupt(void) {
detachInterrupt(recv_pin_);
}