//DECODE VARIABLES:
volatile uint8_t pulseIndex = 0;
uint32_t storedSignals = 0; //STORED INFO
uint64_t storedData = 0;
volatile uint8_t binaryData;
//TIMER VARIABLES:
volatile int16_t delaTimeInerrupt;
volatile int16_t previousDeltaTime;
volatile int16_t storedTime;
//PROTOCOL DETECTION VARIABLES:
uint8_t protocolType;
short protocolStartBurstLength[4] = {2220, 1110, 840, 590};
//0: NEC, 1:SAMSUNG, 2:JAPAN, 3:SIRCS
bool midwayFlag = false;
void setup(){
Serial.begin(9600);
outputSetUp();
timerSetUp();
}
void loop(){
}
void outputSetUp(){
DDRD &= ~(1 << DDD2); // Imposta il Pin 2 come input (DDRD bit 2 a 0)
PORTD |= (1 << PORTD2); // Abilita la resistenza di pull-up interna sul Pin 2 (PORTD bit 2 a 1)
PCICR |= (1 << PCIE2); // Abilita l'interrupt Pin Change 2 (PCICR bit 2 a 1)
PCMSK2 |= (1 << PCINT18); // Abilita l'interrupt per il Pin 2 (PCMSK2 bit 2 a 1)
}
void timerSetUp(){
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR1B |= (1 << CS11) | (1 << CS10); //PRESCALLAR 64:
OCR1A = 16875; // (67,500 / 4) (16875) old
TIMSK1 |= (1 << OCIE1A); // Enable timerinterrupt
TCCR1B |= (1 << WGM12);
}
ISR(TIMER1_COMPA_vect) { //Every 67,500 ms
PCMSK2 |= (1 << PCINT18); // Enable interrupt for Pin 2
pulseIndex = 0;
midwayFlag = false;
binaryData = 0;
}
ISR(PCINT2_vect) { //PIN2 interrupt
if (pulseIndex == 0){timerSetUp();}
getTime();
if (pulseIndex - 2 <= 0){
StartOfFrameCheck(delaTimeInerrupt); pulseIndex++; return;
}
if ((pulseIndex > 34 && pulseIndex < 51)){
if (pulseIndex % 2 == 1){previousDeltaTime = delaTimeInerrupt;}
else {
if((previousDeltaTime - delaTimeInerrupt > -2)){decode(0);}
else {decode(1);}
}
}
if(pulseIndex == 67){
storedSignals = 0;
volatile uint8_t inverse = binaryData;
inverse = ~inverse;
storeData(inverse);
Serial.print("0x");
Serial.println(storedSignals, HEX);
}
pulseIndex++;
}
void getTime(){
delaTimeInerrupt = TCNT1 - storedTime;
storedTime = TCNT1;
}
void decode(byte data) {
binaryData >>= 1; // Shift everything to the left
binaryData |= (data << 7); // Add the new bit
}
void storeData(uint8_t inverse){
storedSignals <<= 8;
storedSignals |= 0xFF;
storedSignals <<= 8;
storedSignals |= binaryData;
storedSignals <<= 8;
storedSignals |= inverse;
storedData <<= 32;
storedData |= storedSignals;
}
void StartOfFrameCheck(uint16_t time){
if (pulseIndex == 0){return;}
if (pulseIndex == 1){
for (byte i = 0; i < 5; i++){
if(time - protocolStartBurstLength[i] >= 0){
midwayFlag = true; protocolType = i;
return;
}
}
}
if (pulseIndex == 2 && midwayFlag == true){
switch (protocolType){
case 0: if(time - protocolStartBurstLength[1] >= 0){return;}
case 1: if(time - protocolStartBurstLength[1] >= 0){return;}
case 2: if(time - protocolStartBurstLength[2] / 2 >= 0){return;}
case 3: if(time - protocolStartBurstLength[3] / 4 >= 0){return;}
}
}
PCMSK2 &= ~(1 << PCINT18);// Disable interrupt for Pin 2
}