MQ7-esp/esp8266-RM370-interrupt/communication.ino
2020-11-19 10:13:55 +01:00

87 lines
2.6 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());
return true;
}
ICACHE_RAM_ATTR void processRx(const uint8_t mac[6], const uint8_t* buf, size_t count, void* cbarg) {
if (count != sizeof(receiveBuffer[rxCounter])) {
return;
}
else
{
receiveBuffer[rxCounter] = *(rm370*)buf;
//shift ring buffer input pointer
if (rxCounter < MAX_PEERS) {
rxCounter++;
}
else {
rxCounter = 0;
}
}
LOG("Message from %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
void checkMessage() {
if (receiveBuffer[rxHandlePointer].PREAMBLE1 == 'R' && receiveBuffer[rxHandlePointer].PREAMBLE2 == 'M') {
//skip if the messageID is the same as the ownstate
int ret = memcmp(ownState.messageID, receiveBuffer[rxHandlePointer].messageID, sizeof(ownState.messageID));
if (ret == 0) {
DEBUGLOG("backloop message");
return;
}
else {
//copy latest messageID
memcpy(transmitBuffer.messageID, &receiveBuffer[rxHandlePointer].messageID, sizeof(transmitBuffer.messageID));
}
switch (receiveBuffer[rxHandlePointer].code) {
case 'r':
alarmTrigger = true;
warningTrigger = false;
transmitBuffer.code = 'r';
LOG("ALARM received");
break;
case 'y':
if (!alarmTrigger) {
warningTrigger = true;
LOG("WARNING received");
}
transmitBuffer.code = 'y';
break;
case 'g':
transmitBuffer.code = 'g';
break;
default:
break;
}
}
else {
DEBUGLOG("Payload does not contain known preamble.");
}
}
void sendMessage() {
uint8_t transmitBuf[sizeof(transmitBuffer)];
//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]);
}
globalStart = millis();
//clean state
transmitBuffer.code = 'g';
}