int main(int argc, char **argv){ initialiseLoRa(); printLoRaSettings(); ShowPacketCounts(0); ShowPacketCounts(1); constantReceiving(); }
int receiveMessage(int Channel, unsigned char *message) { int i, Bytes, currentAddr, x; unsigned char data[257]; double FreqError; Bytes = 0; x = readRegister(Channel, REG_IRQ_FLAGS); // LogMessage("Message status = %02Xh\n", x); // clear the rxDone flag writeRegister(Channel, REG_IRQ_FLAGS, 0x40); // check for payload crc issues (0x20 is the bit we are looking for if((x & 0x20) == 0x20) { LogMessage("CRC Failure, RSSI %d\n", readRegister(Channel, REG_PACKET_RSSI) - 157); // reset the crc flags writeRegister(Channel, REG_IRQ_FLAGS, 0x20); ChannelPrintf(Channel, 4, 1, "CRC Failure %02Xh!!\n", x); Config.LoRaDevices[Channel].BadCRCCount++; ShowPacketCounts(Channel); } else { currentAddr = readRegister(Channel, REG_FIFO_RX_CURRENT_ADDR); // LogMessage("currentAddr = %d\n", currentAddr); Bytes = readRegister(Channel, REG_RX_NB_BYTES); // LogMessage("%d bytes in packet\n", Bytes); // LogMessage("RSSI = %d\n", readRegister(Channel, REG_PACKET_RSSI) - 137); ChannelPrintf(Channel, 10, 1, "Packet SNR = %d, RSSI = %d ", (char)(readRegister(Channel, REG_PACKET_SNR)) / 4, readRegister(Channel, REG_PACKET_RSSI) - 157); FreqError = FrequencyError(Channel) / 1000; ChannelPrintf(Channel, 11, 1, "Freq. Error = %5.1lfkHz ", FreqError); writeRegister(Channel, REG_FIFO_ADDR_PTR, currentAddr); data[0] = REG_FIFO; wiringPiSPIDataRW(Channel, data, Bytes+1); for (i=0; i<=Bytes; i++) { message[i] = data[i+1]; } message[Bytes] = '\0'; if(Config.LoRaDevices[Channel].AFC && (fabs(FreqError)>0.5)) { ReTune(Channel, FreqError/1000); } } // Clear all flags writeRegister(Channel, REG_IRQ_FLAGS, 0xFF); return Bytes; }
int main(int argc, char **argv) { unsigned char Message[257]; int Bytes, ch; uint32_t LoopCount[2]; pthread_t SSDVThread, FTPThread, NetworkThread, HabitatThread, ServerThread; WINDOW * mainwin; int LEDCounts[2]; if (prog_count("gateway") > 1) { printf("\nThe gateway program is already running!\n\n"); exit(1); } mainwin = InitDisplay(); // Settings for character input noecho(); cbreak(); nodelay(stdscr, TRUE); keypad(stdscr, TRUE); Config.LoRaDevices[0].InUse = 0; Config.LoRaDevices[1].InUse = 0; LEDCounts[0] = 0; LEDCounts[1] = 0; // Remove any old SSDV files // system("rm -f /tmp/*.bin"); // Default pin allocations Config.LoRaDevices[0].DIO0 = 6; Config.LoRaDevices[0].DIO5 = 5; Config.LoRaDevices[1].DIO0 = 27; Config.LoRaDevices[1].DIO5 = 26; LoadConfigFile(); LoadPayloadFiles(); if (wiringPiSetup() < 0) { fprintf(stderr, "Failed to open wiringPi\n"); exit(1); } if (Config.LoRaDevices[0].ActivityLED >= 0) pinMode(Config.LoRaDevices[0].ActivityLED, OUTPUT); if (Config.LoRaDevices[1].ActivityLED >= 0) pinMode(Config.LoRaDevices[1].ActivityLED, OUTPUT); if (Config.InternetLED >= 0) pinMode(Config.InternetLED, OUTPUT); if (Config.NetworkLED >= 0) pinMode(Config.NetworkLED, OUTPUT); setupRFM98(0); setupRFM98(1); ShowPacketCounts(0); ShowPacketCounts(1); LoopCount[0] = 0; LoopCount[1] = 0; if (pthread_create(&SSDVThread, NULL, SSDVLoop, NULL)) { fprintf(stderr, "Error creating SSDV thread\n"); return 1; } if (pthread_create(&FTPThread, NULL, FTPLoop, NULL)) { fprintf(stderr, "Error creating FTP thread\n"); return 1; } if (pthread_create(&HabitatThread, NULL, HabitatLoop, NULL)) { fprintf(stderr, "Error creating Habitat thread\n"); return 1; } if (Config.ServerPort > 0) { if (pthread_create(&ServerThread, NULL, ServerLoop, NULL)) { fprintf(stderr, "Error creating server thread\n"); return 1; } } if ((Config.NetworkLED >= 0) && (Config.InternetLED >= 0)) { if (pthread_create(&NetworkThread, NULL, NetworkLoop, NULL)) { fprintf(stderr, "Error creating Network thread\n"); return 1; } } while (run) { int Channel; for (Channel=0; Channel<=1; Channel++) { if (Config.LoRaDevices[Channel].InUse) { if (digitalRead(Config.LoRaDevices[Channel].DIO0)) { Bytes = receiveMessage(Channel, Message+1); if (Bytes > 0) { if (Config.LoRaDevices[Channel].ActivityLED >= 0) { digitalWrite(Config.LoRaDevices[Channel].ActivityLED, 1); LEDCounts[Channel] = 5; } // LogMessage("Channel %d data available - %d bytes\n", Channel, Bytes); // LogMessage("Line = '%s'\n", Message); if (Message[1] == '!') { ProcessUploadMessage(Channel, (char *) Message+1); } else if (Message[1] == '^') { ProcessCallingMessage(Channel, (char *) Message+1); } else if (Message[1] == '$') { ProcessTelemetryMessage(Channel, (char *) Message+1); } else if (Message[1] == 0x66) { ProcessSSDVMessage(Channel, Message); } else { LogMessage("Unknown packet type is %02Xh, RSSI %d\n", Message[1], readRegister(Channel, REG_PACKET_RSSI) - 157); ChannelPrintf(Channel, 4, 1, "Unknown Packet %d, %d bytes", Message[0], Bytes); Config.LoRaDevices[Channel].UnknownCount++; } Config.LoRaDevices[Channel].LastPacketAt = time(NULL); if (Config.LoRaDevices[Channel].InCallingMode && (Config.CallingTimeout > 0)) { Config.LoRaDevices[Channel].ReturnToCallingModeAt = time(NULL) + Config.CallingTimeout; } ShowPacketCounts(Channel); } } if (++LoopCount[Channel] > 1000000) { LoopCount[Channel] = 0; ShowPacketCounts(Channel); ChannelPrintf(Channel, 12, 1, "Current RSSI = %4d ", readRegister(Channel, REG_CURRENT_RSSI) - 157); if (Config.LoRaDevices[Channel].LastPacketAt > 0) { ChannelPrintf(Channel, 6, 1, "%us since last packet ", (unsigned int)(time(NULL) - Config.LoRaDevices[Channel].LastPacketAt)); } if (Config.LoRaDevices[Channel].InCallingMode && (Config.CallingTimeout > 0) && (Config.LoRaDevices[Channel].ReturnToCallingModeAt > 0) && (time(NULL) > Config.LoRaDevices[Channel].ReturnToCallingModeAt)) { Config.LoRaDevices[Channel].InCallingMode = 0; Config.LoRaDevices[Channel].ReturnToCallingModeAt = 0; LogMessage("Return to calling mode\n"); // setMode(Channel, RF96_MODE_SLEEP); // setFrequency(Channel, Frequency); // SetLoRaParameters(Channel, ImplicitOrExplicit, ErrorCoding, Bandwidth, SpreadingFactor, LowDataRateOptimize); // setMode(Channel, RF96_MODE_RX_CONTINUOUS); setLoRaMode(Channel); SetDefaultLoRaParameters(Channel); setMode(Channel, RF96_MODE_RX_CONTINUOUS); ChannelPrintf(Channel, 1, 1, "Channel %d %sMHz %s mode", Channel, Config.LoRaDevices[Channel].Frequency, Modes[Config.LoRaDevices[Channel].SpeedMode]); } if ((ch = getch()) != ERR) { ProcessKeyPress(ch); } if (LEDCounts[Channel] && (Config.LoRaDevices[Channel].ActivityLED >= 0)) { if (--LEDCounts[Channel] == 0) { digitalWrite(Config.LoRaDevices[Channel].ActivityLED, 0); } } } } } // delay(5); } CloseDisplay(mainwin); if (Config.NetworkLED >= 0) digitalWrite(Config.NetworkLED, 0); if (Config.InternetLED >= 0) digitalWrite(Config.InternetLED, 0); if (Config.LoRaDevices[0].ActivityLED >= 0) digitalWrite(Config.LoRaDevices[0].ActivityLED, 0); if (Config.LoRaDevices[1].ActivityLED >= 0) digitalWrite(Config.LoRaDevices[1].ActivityLED, 0); return 0; }