-
-
Save netmaniac/3e0aaac20fb6e8bebf47 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Storage.h" | |
TinyDebugSerial mySerial = TinyDebugSerial(); | |
bool power = false; | |
#define IRpin_PIN PINB | |
#define IRpin 1 | |
#define STATUS_LED 2 | |
#define SETUP_BUTTON 8 | |
#define POWER_INFO 9 | |
#define POWER_PIN 10 | |
#define POWER_OFF_DELAY 45*1000 | |
#define RESOLUTION 45 | |
#define MAXPULSE 95000/RESOLUTION | |
#define ARR_SIZE 80 | |
uint16_t pulses[ARR_SIZE][2]; // pair is high and low pulse | |
uint8_t savedSize = 0; | |
uint8_t currentpulse = 0; // index for pulses we're storing | |
boolean saveArray = false; | |
uint8_t readFromEEPROM(void) { | |
uint16_t ret = 0; | |
mySerial.print(F("In EEPROM ")); | |
storageRead(0, savedSize); | |
mySerial.println(savedSize, DEC); | |
} | |
void cellFromEEPROM(uint8_t row, uint8_t col, uint16_t &ret) { | |
if (row >= savedSize) { | |
ret = -1; | |
return; | |
} | |
storageRead(1 + (2 * row + col)*sizeof(uint16_t), ret); | |
} | |
void setup(void) { | |
mySerial.begin(9600); | |
readFromEEPROM(); | |
printpulses(); | |
mySerial.println(F("Boot!")); | |
// DDRB = B11111101; | |
cli(); | |
pinMode(SETUP_BUTTON, INPUT_PULLUP); | |
pinMode(STATUS_LED, OUTPUT); | |
pinMode(POWER_PIN, OUTPUT); | |
digitalWrite(POWER_PIN, LOW); | |
power = false; | |
pinMode(POWER_INFO,OUTPUT); | |
digitalWrite(POWER_INFO,HIGH); | |
if (digitalRead(SETUP_BUTTON) == LOW) { | |
mySerial.println(F("Store new signal")); | |
storeNewSignal(); | |
} | |
mySerial.println(F("LISTENING...")); | |
} | |
void storeNewSignal() { | |
saveArray = true; | |
digitalWrite(STATUS_LED, HIGH); | |
while (1) { | |
readPulses(); | |
} | |
} | |
void save2EEPROM(uint8_t &tabSize) { | |
if (!saveArray) return ; | |
storageWrite(0, tabSize); | |
for (int i = 0; i < tabSize; i++) { | |
storageWrite(1 + 2 * i * sizeof(uint16_t), pulses[i][0]); | |
storageWrite(1 + (2 * i + 1)*sizeof(uint16_t), pulses[i][1]); | |
} | |
} | |
uint8_t isEqual(uint8_t arrSize) { | |
if (arrSize < savedSize) return ARR_SIZE + 1; | |
for (int i = 0; i < arrSize - 1; i++) { | |
uint16_t saved; | |
cellFromEEPROM(i, 1, saved); | |
int d1 = pulses[i][1] - saved; | |
int err1 = pulses[i][1] * 20 / 100; | |
cellFromEEPROM(i + 1, 0, saved); | |
int d2 = pulses[i + 1][0] - saved; | |
int err2 = pulses[i + 1][0] * 20 / 100; | |
if (abs(d1) > err1 || abs(d2) > err2) | |
return i + 1; | |
} | |
return 0; | |
} | |
void pulseLed(uint16_t tme) { | |
digitalWrite(STATUS_LED, HIGH); | |
delay(tme); | |
digitalWrite(STATUS_LED, LOW); | |
} | |
void loop(void) { | |
readPulses(); | |
} | |
void readPulses(void) { | |
uint16_t highpulse, lowpulse; // temporary storage timing | |
highpulse = lowpulse = 0; // start out with no pulse length | |
while (IRpin_PIN & (1 << IRpin)) { | |
// pin is still HIGH | |
// count off another few microseconds | |
highpulse++; | |
delayMicroseconds(RESOLUTION); | |
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) { | |
printpulses(); | |
mySerial.print("Pulses# "); | |
mySerial.println(currentpulse + 1); | |
save2EEPROM(currentpulse); | |
currentpulse = 0; | |
return; | |
} | |
} | |
// we didn't time out so lets stash the reading | |
pulses[currentpulse][0] = highpulse; | |
while (! (IRpin_PIN & _BV(IRpin))) { | |
// pin is still LOW | |
lowpulse++; | |
delayMicroseconds(RESOLUTION); | |
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) { | |
printpulses(); | |
mySerial.print("Pulses# "); | |
mySerial.println(currentpulse + 1); | |
save2EEPROM(currentpulse); | |
currentpulse = 0; | |
return; | |
} | |
} | |
pulses[currentpulse][1] = lowpulse; | |
// we read one high-low pulse successfully, continue! | |
currentpulse++; | |
if (currentpulse >= ARR_SIZE) { | |
printpulses(); | |
currentpulse = 0; | |
} | |
} | |
void flipPower() { | |
mySerial.println("KLIK!!!"); | |
if (power) { | |
power = false; | |
digitalWrite(POWER_INFO, LOW); | |
mySerial.println(F("DELAY...")); | |
delay(POWER_OFF_DELAY); | |
mySerial.println(F("After DELAY...")); | |
digitalWrite(POWER_INFO, HIGH); | |
digitalWrite(POWER_PIN,LOW); | |
} else { | |
power = true; | |
digitalWrite(POWER_PIN,HIGH); | |
} | |
} | |
void printpulses(void) { | |
/*mySerial.println("\n\r\n\rReceived: \n\rOFF \tON"); | |
for (uint8_t i = 0; i < currentpulse; i++) { | |
mySerial.print(pulses[i][0] * RESOLUTION, DEC); | |
mySerial.print(" usec, "); | |
mySerial.print(pulses[i][1] * RESOLUTION, DEC); | |
mySerial.println(" usec"); | |
} | |
*/ | |
// print it in a 'array' format | |
/* | |
mySerial.println(F("int IRsignal[] = {)")); | |
//mySerial.println("// ON, OFF (in 10's of microseconds)"); | |
uint16_t saved; | |
for (uint8_t i = 0; i < currentpulse - 1; i++) { | |
mySerial.print(i + 1, DEC); | |
mySerial.print(F("\t")); // tab | |
mySerial.print(pulses[i][1], DEC); | |
mySerial.print(F(", ")); | |
mySerial.print(pulses[i + 1][0] , DEC); | |
mySerial.print(F(",")); | |
mySerial.print(F("\t")); // tab | |
cellFromEEPROM(i, 1, saved); | |
mySerial.print(saved , DEC); | |
mySerial.print(F(", ")); | |
cellFromEEPROM(i+1, 0, saved); | |
mySerial.print(saved , DEC); | |
mySerial.println(F(",")); | |
} | |
mySerial.print(F("\t")); // tab | |
mySerial.print(pulses[currentpulse - 1][1] , DEC); | |
mySerial.print(F(", 0};")); | |
*/ | |
mySerial.print(F("DIFF: ")); | |
uint8_t diff = isEqual(currentpulse); | |
if (diff) { | |
mySerial.print(F("Diff at pos:")); | |
mySerial.println(diff, DEC); | |
} else { | |
flipPower(); | |
} | |
// delay(400); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment