#include "math.h"
#define txPin 8
#define rxPin 7
#define signalPin 6
int lastRxValue = 0;
int tempRxValue = 0;
unsigned long lastRxTime = 0;
unsigned long tempTime = 0;
unsigned long difTime = 0;
boolean bValidPacket = false;
int decodeMethod = 1; //0 real - as in manual, 1 inver as Oleg do
//Global vars end
void send_meander(int time){
digitalWrite(txPin, HIGH);
delayMicroseconds(time);
digitalWrite(txPin, LOW);
delayMicroseconds(time);
}
//keelog start
int keelog_state = 0;
int keelogCounter = 0;
byte keelog_code[9];
void keelog_vardump(){
if(decodeMethod == 0){
Serial.println("- keelog origin -");
}else{
Serial.println("- keelog invert -");
Serial.print(keelog_code[0], HEX);
Serial.print(keelog_code[1], HEX);
Serial.print(keelog_code[2], HEX);
Serial.print(keelog_code[3], HEX);
Serial.println("-hop");
Serial.print(keelog_code[4], HEX);
Serial.print(keelog_code[5], HEX);
Serial.print(keelog_code[6], HEX);
Serial.println("-fix");
Serial.print(keelog_code[7], HEX);
Serial.println("-btn");
Serial.print(keelog_code[8], HEX);
Serial.println("-dop");
/*for(int i = 0; i<9; i++){
Serial.print(keelog_code[i], HEX);
Serial.print(" - ");
}*/
keelog_send(keelog_code);
digitalWrite(signalPin, HIGH);
delay(100);
digitalWrite(signalPin, LOW);
keelog_state = 0;
for(int i = 0; i<9; i++){
keelog_code[i]=0;
}
}
}
void keelog_send(byte* keelog_code){
Serial.println("- sending keelog -");
for(int i = 0; i<9; i++){
Serial.print(keelog_code[i], HEX);
Serial.print(" - ");
for(int i = 0; i<11; i++){//посылаем преамблу
send_meander(400);
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(4000);//посылаем хедер
for( int i = 0; i<9; i++){
if(decodeMethod==1){
for(int i2 = 7;i2>=0;i2--){
if(bitRead(keelog_code[i], i2)){
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(2*400);
}else{
digitalWrite(txPin, HIGH);
delayMicroseconds(2*400);
digitalWrite(txPin, LOW);
delayMicroseconds(400);
for(int i2 = 0;i2<8;i2++){
if(!bitRead(keelog_code[i], i2)){
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(2*400);
}else{
digitalWrite(txPin, HIGH);
delayMicroseconds(2*400);
digitalWrite(txPin, LOW);
delayMicroseconds(400);
}
}
}}}}}}
}
void keelog_get(){
bValidPacket = false;
if(keelog_state==0){//ждем преамбулу и хедер
if(difTime > 280 && difTime < 620 && lastRxValue != tempRxValue){
keelogCounter ++;
}else{
if(keelogCounter==23){
if(difTime>2800 && difTime<6200 && lastRxValue == 0){
keelog_state=1;
keelogCounter = 0;
}else{
if(keelog_state==1){// получаем биты
if(difTime > 560 && difTime < 1240 && lastRxValue == 1){// получили 1
if(decodeMethod==0){
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B10000000;
}else{
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000000;
bValidPacket = true;
if(difTime > 280 && difTime < 620 && lastRxValue == 1){
if(decodeMethod==0){
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B00000000;
}else{
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000001;
bValidPacket = true;
if(lastRxValue == 0){
}else{
keelog_state=1;
keelogCounter = 0;
if(bValidPacket){
keelogCounter++;
if(keelogCounter==66){
keelog_vardump();
keelogCounter = 0;
keelog_state = 0;
}
}}}}}}}}}}}
}
//keelog end
void setup() {
pinMode(txPin, OUTPUT);
pinMode(rxPin, INPUT);
pinMode(signalPin, OUTPUT);
//
Serial.begin(9600);
Serial.println("start");
lastRxValue = digitalRead(rxPin);
lastRxTime = micros();
//attachInterrupt(0, grab, CHANGE);
}
void loop() {
tempRxValue = digitalRead(rxPin);
if(tempRxValue != lastRxValue){
tempTime = micros();
difTime = tempTime - lastRxTime;
keelog_get();
lastRxTime = tempTime;
lastRxValue = tempRxValue;
}
}