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'; }