125 lines
4.2 KiB
C++
125 lines
4.2 KiB
C++
bool initCommunication() {
|
|
WiFi.persistent(false);
|
|
bool ok = WifiEspNowBroadcast.begin("CO-WARN", 3);
|
|
if (!ok) {
|
|
LOG("WifiEspNowBroadcast.begin() failed");
|
|
return false;
|
|
}
|
|
WifiEspNowBroadcast.onReceive(processRx, nullptr);
|
|
LOG("MAC address of this node is %s", WiFi.softAPmacAddress().c_str());
|
|
WiFi.softAPmacAddress(ownState.originMAC);
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
process wifi stack Rx interrupt
|
|
*/
|
|
ICACHE_RAM_ATTR void processRx(const uint8_t mac[6], const uint8_t* buf, size_t count, void* cbarg) {
|
|
//simple frame size check
|
|
if (count != sizeof(receiveBuffer[rxCounter])) {
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
receiveBuffer[rxCounter] = *(rm370*)buf; //ToDo check if it breaks anything
|
|
//shift ring buffer input pointer
|
|
if (rxCounter + 1 < MAX_PEERS) {
|
|
rxCounter++;
|
|
}
|
|
else {
|
|
rxCounter = 0;
|
|
}
|
|
}
|
|
LOG("[%02d] Message from %02X:%02X:%02X:%02X:%02X:%02X", rxCounter, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
|
}
|
|
|
|
void checkMessage() {
|
|
if (receiveBuffer[rxHandlePointer].PREAMBLE1 == 'R' && receiveBuffer[rxHandlePointer].PREAMBLE2 == 'M') {
|
|
//check against any yet received message
|
|
byte loopPointer = (rxCounter + 1 < MAX_PEERS) ? (rxCounter + 1) : 0;
|
|
while (loopPointer != rxHandlePointer)
|
|
{
|
|
//shift ring buffer working pointer
|
|
if (loopPointer + 1 < MAX_PEERS) {
|
|
loopPointer++;
|
|
}
|
|
else {
|
|
loopPointer = 0;
|
|
}
|
|
}//Todo wrong bracket placement?
|
|
//check against our own state - could or should also be done by MAC
|
|
int ret = memcmp(&ownState.originMAC[0], &receiveBuffer[rxHandlePointer].originMAC[0], sizeof(receiveBuffer[rxHandlePointer].originMAC));
|
|
//int ret = memcmp(ownState.messageID, receiveBuffer[rxHandlePointer].messageID, sizeof(ownState.messageID));
|
|
if (ret == 0) {
|
|
DEBUGLOG("backloop message");
|
|
return;
|
|
}
|
|
else {
|
|
transmitBuffer = receiveBuffer[rxHandlePointer];
|
|
//copy latest messageID and origins MAC
|
|
//memcpy(transmitBuffer.messageID, &receiveBuffer[rxHandlePointer].messageID, sizeof(transmitBuffer.messageID));
|
|
//memcpy(transmitBuffer.batteryWarning, &receiveBuffer[rxHandlePointer].batteryWarning, sizeof(transmitBuffer.batteryWarning));
|
|
//memcpy(&transmitBuffer.originMAC[0], &receiveBuffer[rxHandlePointer].originMAC[0], sizeof(transmitBuffer.originMAC));
|
|
|
|
LOG("Origin MAC %02X:%02X:%02X:%02X:%02X:%02X",
|
|
transmitBuffer.originMAC[0],
|
|
transmitBuffer.originMAC[1],
|
|
transmitBuffer.originMAC[2],
|
|
transmitBuffer.originMAC[3],
|
|
transmitBuffer.originMAC[4],
|
|
transmitBuffer.originMAC[5]);
|
|
|
|
switch (receiveBuffer[rxHandlePointer].code) {
|
|
case 'r':
|
|
alarmTrigger = true;
|
|
warningTrigger = false;
|
|
transmitBuffer.code = 'r';
|
|
LOG("\tALARM received");
|
|
break;
|
|
case 'y':
|
|
if (!alarmTrigger) {
|
|
warningTrigger = true;
|
|
LOG("\tWARNING received");
|
|
}
|
|
else {
|
|
LOG("\tWARNING received - NOP");
|
|
}
|
|
transmitBuffer.code = 'y';
|
|
break;
|
|
case 'g':
|
|
transmitBuffer.code = 'g';
|
|
#if defined(GLOBAL_VERBOSE)
|
|
LOG("\tGREEN received - relay");
|
|
#endif
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
DEBUGLOG("Payload does not contain known preamble.");
|
|
}
|
|
}
|
|
|
|
void sendMessage() {
|
|
uint8_t transmitBuf[sizeof(transmitBuffer) / sizeof(uint8_t)]; //ToDo
|
|
//copy buffer
|
|
memcpy(transmitBuf, &transmitBuffer, sizeof(transmitBuffer));
|
|
WifiEspNowBroadcast.send(transmitBuf, sizeof(transmitBuf));
|
|
//DEBUGLOG("Sending message: %s", transmitBuf);
|
|
DEBUGLOG("Sending message: %c", transmitBuffer.code);
|
|
//EXPLAINATION WifiEspNow Broadcast
|
|
DEBUGLOG("Recipients:");
|
|
WifiEspNowPeerInfo peers[MAX_PEERS];
|
|
int nPeers = std::min(WifiEspNow.listPeers(peers, MAX_PEERS), MAX_PEERS);
|
|
for (int i = 0; i < nPeers; ++i) {
|
|
DEBUGLOG(" %02X:%02X:%02X:%02X:%02X:%02X", peers[i].mac[0], peers[i].mac[1], peers[i].mac[2], peers[i].mac[3], peers[i].mac[4], peers[i].mac[5]);
|
|
}
|
|
if (transmitBuffer.code == 'r' || transmitBuffer.code == 'y') {
|
|
globalStart = millis();
|
|
}
|
|
//clean state
|
|
transmitBuffer.code = 'X';
|
|
}
|