forked from christianlykke9/Beomote
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Beomote.cpp
121 lines (98 loc) · 2.01 KB
/
Beomote.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "Beomote.h"
Beomote Beo;
void Beomote::initialize(int pin) {
irPin = pin;
// Setting the pinmode of the IR pin and resetting the listener
pinMode(irPin, INPUT);
reset();
// Clearing Control Register A
TCCR1A = 0;
// Setting the phase and frequency correct pwm, and stopping the timer
TCCR1B = _BV(WGM13);
long cycles = (F_CPU / 2000000) * TICK;
ICR1 = cycles;
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
// Setting the timer overflow interrupt enable bit
TIMSK1 = _BV(TOIE1);
// Resetting clock select register, and starts the clock with no prescale
TCCR1B |= _BV(CS10);
}
void Beomote::reset() {
index = -1;
irReceived = 0;
link = 0x00;
address = 0x00;
command = 0x00;
}
int Beomote::receive(BeoCommand &cmd) {
if (irReceived) {
cmd.link = link;
cmd.address = address;
cmd.command = command;
reset();
return 1;
}
return 0;
}
void Beomote::timerISR() {
if (irReceived)
return;
timer++;
int irData = digitalRead(irPin);
if (irData == LOW && lastState == HIGH) {
int beoCode = 0;
int beoBit;
if (abs(timer - BEO_ZERO) < 2) {
beoCode = BEO_ZERO;
beoBit = lastBeoBit = 0;
}
else if (abs(timer - BEO_SAME) < 2) {
beoCode = BEO_SAME;
beoBit = lastBeoBit;
}
else if (abs(timer - BEO_ONE) < 2) {
beoCode = BEO_ONE;
beoBit = lastBeoBit = 1;
}
else if (abs(timer - BEO_STOP) < 2) {
beoCode = BEO_STOP;
}
else if (abs(timer - BEO_START) < 2) {
beoCode = BEO_START;
}
else
index = -1;
if (index == -1) {
if (beoCode == BEO_START)
index = 0;
}
else if (index == 0) {
link = beoBit;
index++;
}
else if (index < 9) {
address = address << 1;
address |= beoBit;
index++;
}
else if (index < 17) {
command = command << 1;
command |= beoBit;
index++;
}
else if (index == 17) {
if (beoCode == BEO_STOP)
irReceived = 1;
else
index = -1;
}
timer = 0;
lastState = LOW;
}
else if (irData == HIGH && lastState == LOW) {
lastState = HIGH;
}
}
ISR(TIMER1_OVF_vect) {
Beo.timerISR();
}