EVOG2-Spiffs-Avery/slave.ino

162 lines
3.8 KiB
C++

/** @package
g2_slave.c
Copyright(c) ADI 2000
Author: Dan Smith
Created: DS 9/21/2007 7:56:59 AM
change: DS 9/21/2007 7:59:34 AM
*/
int highestScannedBed = 0;
uint16_t lastchar;
#include "slave.h"
int S232 = 0;
void runSlave(void) /*this runs in the slave unit*/
{
static uint8_t c, i;
static int16_t j, cc;
while (Serial2.available()) // JRB 022823
{
cc = Serial2.read(); // get the char
c = cc & 0xff;
if ((c == 0xff) && (lastchar == 0xff)) // 2 ffs in a row
{
indx = 0;
}
else
{
instr[++indx] = c;
}
lastchar = c;
if (indx >= 16)
indx = 0; // oops overrun
if (indx >= 6)
break; // should have a command.. outta here *
};
/*
do {
if (!Serial2.available()) break;
cc = Serial2.read(); // get the char
c = cc & 0xff;
if ((c == 0xff) && (instr[indx] == 0xff)) // 2 ffs in a row
{
indx = 0;
} else
{
instr[++indx] = c;
}
if (indx >= 16) indx = 0; // oops overrun
if (indx >= 6) break; // should have a command.. outta here *
} while (1);
*/
// instr[1] = command
// instr[2] = address
if (indx == 6) /* we got 6 int8s after 2 ffs so it's a command */
{
indx = 0; /*so we dont do this twice on same receive*/
if (S232)
{
Serial.printf("RX data: %3d, %3d, %3d, %3d,%3d, %3d ", instr[0], instr[1], instr[2], instr[3], instr[4], instr[5], instr[6]);
Serial.printf("SLV CSUM calc: %d sent: %d\n", slav_csum(), instr[6]);
}
// request for data
if (instr[1] == 10)
{
if (S232)
Serial.printf("Slave Command Received\n");
if (instr[2] == (100)) /* is it us? */
if (slav_csum() == instr[6]) /*got a good cs*/
{
wiFiOK = instr[5];
if (S232)
Serial.printf("Slave CSUM OK\n");
delay(80); /*a little settling time for rs485*/
if (instr[3] != 0)
Serial.printf("\n RX Command %d\n", instr[3]);
// bug screen commands
if (instr[3] == 1)
rfSendKey(RF_KEY_DN, myCHAN);
if (instr[3] == 2)
rfSendKey(RF_KEY_STOP, myCHAN);
if (instr[3] == 3)
rfSendKey(RF_KEY_UP, myCHAN);
// door commands
cDOORCLOSE = 0;
cDOOROPEN = 0;
cDOORSTOP = 0;
if (instr[3] == 4)
cDOORCLOSE = 1;
if (instr[3] == 5)
cDOOROPEN = 1;
if (instr[3] == 6)
cDOORSTOP = 1;
instr[3] = 0;
if (getMotorError())
{
faultNum = 4;
faultAB = 0;
faultData = getMotorError();
clearMotorError();
}
if (motorFault)
{
faultNum = 2;
faultAB = 0;
faultData = motorFault;
motorFault = 0;
}
c_send((15 << 2), 0, faultData & 0xff, faultNum, faultData >> 8); /*nothing to report*/
faultNum = faultData = 0;
}
} /*end of cs ok*/
#define VERSION 1
// ping to us
if (instr[1] == 0) // ping
if (instr[2] == (100)) /* is it to us?? */
if (slav_csum() == instr[6]) /*checksum ok?*/
{
if (S232)
Serial.printf("RX Ping Slave# %d\n", instr[2]);
if (S232)
Serial.printf("It's us! CSUM ok! respond!\n");
delay(50); /*a little settling time for rs485*/
c_send(0, 0, 5, VERSION, 0); /*report version*/
}
}
} // run_slave
uint16_t slav_csum(void)
{
uint16_t sum = 0;
uint16_t i;
for (i = 1; i < 6; sum += instr[i++])
;
if ((sum & 255) == 255)
sum = 0;
return (sum & 255);
}