Implemented a clone of the Tellstick Duo firmware that will wotrk on a Arduino.
So far only supports the Archtech Self Learning protocol. Former-commit-id: 705f787fc30459a9d55dc571632dc4d01e7198f0
This commit is contained in:
parent
3c5da7baaf
commit
e269faec13
11 changed files with 441 additions and 0 deletions
106
arduino/ArduinoTellstickDuo/usart.cpp
Normal file
106
arduino/ArduinoTellstickDuo/usart.cpp
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
#include "usart.h"
|
||||
#include "rf.h"
|
||||
|
||||
uint8_t Serial_rxBuffer[79];
|
||||
|
||||
void parseSerialForCommand() {
|
||||
if (Serial.available() > 0) {
|
||||
uint8_t rxDataSize = Serial.readBytesUntil('+', &Serial_rxBuffer[0], 79);
|
||||
if (rxDataSize > 0) {
|
||||
parseRxBuffer(&Serial_rxBuffer[0], 0, rxDataSize, false, 3, 0);
|
||||
}
|
||||
}
|
||||
}; //end serialTask
|
||||
|
||||
bool parseRxBuffer(byte* buffer, uint8_t startIndex, uint8_t endIndex, bool debug, uint8_t repeat, uint8_t pause) {
|
||||
if (startIndex > endIndex) {
|
||||
return false;
|
||||
}
|
||||
char c = buffer[startIndex];
|
||||
//Serial.print("DEBUG: char:"); Serial.println(c, DEC);
|
||||
switch (c) {
|
||||
case 'S':
|
||||
return handleSCommand(buffer, startIndex + 1, endIndex, debug, repeat, pause);
|
||||
case 'T':
|
||||
return handleTCommand(buffer, startIndex + 1, endIndex, debug, repeat, pause);
|
||||
case 'V':
|
||||
Serial.println(F("+V2"));
|
||||
return parseRxBuffer(buffer, startIndex + 1, endIndex, debug, repeat, pause);
|
||||
case 'D':
|
||||
return parseRxBuffer(buffer, startIndex + 1, endIndex, !debug, repeat, pause);
|
||||
case 'P':
|
||||
if (endIndex - startIndex + 1 < 3) {
|
||||
return false;
|
||||
} //at least {'P',[p-value],'+'} must be left in the buffer
|
||||
return parseRxBuffer(buffer, startIndex + 2, endIndex, debug, repeat, buffer[startIndex + 1]);
|
||||
case 'R':
|
||||
if (endIndex - startIndex + 1 < 3) {
|
||||
return false;
|
||||
} //at least {'R',[r-value],'+'} must be left in the buffer
|
||||
return parseRxBuffer(buffer, startIndex + 2, endIndex, debug, buffer[startIndex + 1], pause);
|
||||
case '+':
|
||||
return true;
|
||||
default:
|
||||
//Serial.print("DEBUG: unknown char: '"); Serial.print(c, BIN); Serial.println("'");
|
||||
return false;
|
||||
}
|
||||
}; //end parseRxBuffer
|
||||
|
||||
bool handleSCommand(byte* buffer, uint8_t startIndex, uint8_t endIndex, bool debug, uint8_t repeat, uint8_t pause) {
|
||||
//Parse message received from serial
|
||||
uint8_t S_data[78]; //78 pulses
|
||||
uint8_t pulseCount = 0;
|
||||
for (uint8_t i = startIndex; i <= endIndex; ++i) {
|
||||
if (buffer[i] == '+') {
|
||||
break;
|
||||
} else if (i == endIndex) {
|
||||
return false;
|
||||
} else {
|
||||
S_data[pulseCount++] = buffer[i];
|
||||
}
|
||||
}
|
||||
//Send message
|
||||
sendSCodedData(&S_data[0], pulseCount, repeat, pause);
|
||||
|
||||
//send confirmation over serial
|
||||
Serial.println(F("+S"));
|
||||
return true;
|
||||
}; //end handleS
|
||||
|
||||
bool handleTCommand(byte* buffer, uint8_t startIndex, uint8_t endIndex, bool debug, uint8_t repeat, uint8_t pause) {
|
||||
//Parse message received from serial
|
||||
uint8_t T_data[72]; //0-188 pulses
|
||||
if (endIndex - startIndex < 5) {
|
||||
//Serial.println("DEBUG: wrong size!");
|
||||
return false;
|
||||
}
|
||||
uint8_t buff_p = startIndex;
|
||||
uint8_t T_times[4] = {buffer[buff_p++], buffer[buff_p++], buffer[buff_p++], buffer[buff_p++]};
|
||||
uint8_t T_long = buffer[buff_p++];
|
||||
uint8_t T_bytes = 0;
|
||||
if ( (T_long / 4.0) > (float)(T_long / 4) ) {
|
||||
T_bytes = T_long / 4 + 1;
|
||||
} else {
|
||||
T_bytes = T_long / 4;
|
||||
}
|
||||
uint8_t j = 0;
|
||||
while (j < T_bytes) {
|
||||
if (buffer[buff_p] == '+') {
|
||||
break;
|
||||
} else if (buff_p >= endIndex) {
|
||||
return false;
|
||||
} else {
|
||||
T_data[j++] = buffer[buff_p++];
|
||||
}
|
||||
}
|
||||
if ( j != T_bytes ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//Send message
|
||||
sendTCodedData(&T_data[0], T_long, &T_times[0], repeat, pause);
|
||||
|
||||
//send confirmation over serial
|
||||
Serial.println(F("+T"));
|
||||
return parseRxBuffer(buffer, buff_p, endIndex, debug, repeat, pause);
|
||||
}; //end handleT
|
||||
Loading…
Add table
Add a link
Reference in a new issue