From e26c4fd441580eec76453dee50c444b1d212a5a1 Mon Sep 17 00:00:00 2001 From: Dave Akerman Date: Tue, 10 Apr 2018 23:18:23 +0000 Subject: [PATCH] V1.8.18 - Reprogram LoRa module when relevant settings are changed via JSON port --- README.md | 10 +++++ config.c | 18 +++++--- config.h | 3 +- gateway.c | 41 ++++++++++++------ gateway.txt.old | 110 ------------------------------------------------ global.h | 7 ++- server.c | 60 ++++++++++++++++++-------- 7 files changed, 101 insertions(+), 148 deletions(-) delete mode 100644 gateway.txt.old diff --git a/README.md b/README.md index 7ea2379..4f5f8c1 100644 --- a/README.md +++ b/README.md @@ -228,10 +228,20 @@ Change History ============== +11/04/2018 - V1.8.18 +-------------------- + + JSON port now sends packet SNR, RSSI and frequency error + Implemented callbacks for when settings are changed + Reprogram LoRa module when frequency, bandwidth etc are changed via JSON port + Update display when frequency, bandwidth, AFC etc are changed via JSON port + + 10/04/2018 - V1.8.17 -------------------- JSON port only sends telemetry as it is received, instead of repeatedly + JSON port now sends current RSSI Append \r\n to sentences sent to data port JSON port now accepts commands split over multiple packets (e.g. typed commands) When saving to gateway.txt, permissions are set to RW/RW/RW, and owner/group are maintained diff --git a/config.c b/config.c index 4b64dd8..a214f19 100644 --- a/config.c +++ b/config.c @@ -91,7 +91,7 @@ int RegisterConfigDouble(int SectionIndex, int Index, char *Name, double *Double strcpy(Settings[SettingIndex].ValueName, Name); Settings[SettingIndex].SettingType = stDouble; Settings[SettingIndex].DoubleValuePtr = DoubleValuePtr; - // Settings[SettingIndex].Callback = Callback; + Settings[SettingIndex].Callback = Callback; ReadConfigValue(SettingIndex); } @@ -113,7 +113,7 @@ int RegisterConfigInteger(int SectionIndex, int Index, char *Name, int *IntValue strcpy(Settings[SettingIndex].ValueName, Name); Settings[SettingIndex].SettingType = stInteger; Settings[SettingIndex].IntValuePtr = IntValuePtr; - // Settings[SettingIndex].Callback = Callback; + Settings[SettingIndex].Callback = Callback; return ReadConfigValue(SettingIndex); } @@ -135,7 +135,7 @@ int RegisterConfigBoolean(int SectionIndex, int Index, char *Name, int *BoolValu strcpy(Settings[SettingIndex].ValueName, Name); Settings[SettingIndex].SettingType = stBoolean; Settings[SettingIndex].IntValuePtr = BoolValuePtr; - // Settings[SettingIndex].Callback = Callback; + Settings[SettingIndex].Callback = Callback; return ReadConfigValue(SettingIndex); } @@ -144,7 +144,7 @@ int RegisterConfigBoolean(int SectionIndex, int Index, char *Name, int *BoolValu return 0; } -int RegisterConfigString(int SectionIndex, int Index, char *Name, char *StringValuePtr, int MaxValueLength, void (Callback)(int)) +int RegisterConfigString(int SectionIndex, int Index, char *Name, char *StringValuePtr, int MaxValueLength, void (*Callback)(int)) { if ((SectionIndex >= 0) && (SectionIndex < SectionCount)) { @@ -158,7 +158,7 @@ int RegisterConfigString(int SectionIndex, int Index, char *Name, char *StringVa Settings[SettingIndex].SettingType = stString; Settings[SettingIndex].StringValuePtr = StringValuePtr; Settings[SettingIndex].MaxValueLength = MaxValueLength; - // Settings[SettingIndex].Callback = Callback; + Settings[SettingIndex].Callback = Callback; return ReadConfigValue(SettingIndex); } @@ -362,6 +362,11 @@ void SetConfigValue(char *Setting, char *Value) case stNone: break; } + + if (Settings[SettingIndex].Callback != NULL) + { + Settings[SettingIndex].Callback(Settings[SettingIndex].Index); + } } } @@ -401,4 +406,5 @@ int SettingAsString(int SettingIndex, char *SettingName, int SettingNameSize, ch } return 0; -} \ No newline at end of file +} + diff --git a/config.h b/config.h index 30721f7..92de61d 100644 --- a/config.h +++ b/config.h @@ -10,7 +10,7 @@ struct TSetting int *IntValuePtr; double *DoubleValuePtr; int MaxValueLength; - // void (Callback)(int); + void (*Callback)(int); }; void RegisterConfigFile(char *Filename); @@ -20,6 +20,7 @@ int RegisterConfigInteger(int SectionIndex, int Index, char *Name, int *IntValue int RegisterConfigDouble(int SectionIndex, int Index, char *Name, double *DoubleValuePtr, void (Callback)(int)); int RegisterConfigBoolean(int SectionIndex, int Index, char *Name, int *BoolValuePtr, void (Callback)(int)); int ReadConfigValue(int SettingIndex); +int ConfigSettingChannel(int SettingIndex); void SetConfigValue(char *Setting, char *Value); int SettingAsString(int SettingIndex, char *SettingName, int SettingNameSize, char *SettingValue, int SettingValueSize); void SaveConfigFile(void); diff --git a/gateway.c b/gateway.c index 5000307..e854ad6 100644 --- a/gateway.c +++ b/gateway.c @@ -38,7 +38,7 @@ #include "listener.h" #include "udpclient.h" -#define VERSION "V1.8.17" +#define VERSION "V1.8.18" bool run = TRUE; // RFM98 @@ -490,13 +490,11 @@ void displayFrequency ( int Channel, double Frequency ) void setLoRaMode( int Channel ) { - // LogMessage("Setting LoRa Mode\n"); setMode( Channel, RF98_MODE_SLEEP ); writeRegister( Channel, REG_OPMODE, 0x80 ); setMode( Channel, RF98_MODE_SLEEP ); - // LogMessage("Set Default Frequency\n"); setFrequency( Channel, Config.LoRaDevices[Channel].Frequency); } @@ -1438,6 +1436,10 @@ receiveMessage( int Channel, char *message, rx_metadata_t *Metadata ) FreqError = FrequencyError( Channel ) / 1000; ChannelPrintf( Channel, 11, 1, "Freq. Error = %5.1lfkHz ", FreqError); + + Config.LoRaDevices[Channel].PacketSNR = Metadata->SNR; + Config.LoRaDevices[Channel].PacketRSSI = Metadata->RSSI; + Config.LoRaDevices[Channel].FrequencyError = FreqError; writeRegister( Channel, REG_FIFO_ADDR_PTR, currentAddr ); @@ -1498,6 +1500,20 @@ void RemoveTrailingSlash(char *Value) } } +void LoRaCallback(int Index) +{ + setLoRaMode(Index); + + SetDefaultLoRaParameters(Index); + + startReceiving(Index); +} + +void MiscCallback(int Index) +{ + displayChannel(Index); +} + void LoadConfigFile(void) { FILE *fp; @@ -1621,7 +1637,7 @@ void LoadConfigFile(void) for (Channel = 0; Channel <= 1; Channel++) { - RegisterConfigDouble(MainSection, Channel, "frequency", &Config.LoRaDevices[Channel].Frequency, NULL); + RegisterConfigDouble(MainSection, Channel, "frequency", &Config.LoRaDevices[Channel].Frequency, LoRaCallback); if (Config.LoRaDevices[Channel].Frequency > 100) { // Defaults @@ -1697,26 +1713,26 @@ void LoadConfigFile(void) Config.LoRaDevices[Channel].LowDataRateOptimize = LowOptToInt(LoRaModes[Config.LoRaDevices[Channel].SpeedMode].LowDataRateOptimize); // Overrides - if (RegisterConfigInteger(MainSection, Channel, "sf", &Config.LoRaDevices[Channel].SpreadingFactor, NULL)) + if (RegisterConfigInteger(MainSection, Channel, "sf", &Config.LoRaDevices[Channel].SpreadingFactor, LoRaCallback)) { LogMessage( "Setting SF=%d\n", Config.LoRaDevices[Channel].SpreadingFactor); } - if (RegisterConfigDouble(MainSection, Channel, "bandwidth", &Config.LoRaDevices[Channel].Bandwidth, NULL)) + if (RegisterConfigDouble(MainSection, Channel, "bandwidth", &Config.LoRaDevices[Channel].Bandwidth, LoRaCallback)) { LogMessage( "Setting Bandwidth=%.2lfkHz\n", Config.LoRaDevices[Channel].Bandwidth); } - RegisterConfigBoolean(MainSection, Channel, "implicit", &Config.LoRaDevices[Channel].ImplicitOrExplicit, NULL); + RegisterConfigBoolean(MainSection, Channel, "implicit", &Config.LoRaDevices[Channel].ImplicitOrExplicit, LoRaCallback); - if (RegisterConfigInteger(MainSection, Channel, "coding", &Config.LoRaDevices[Channel].ErrorCoding, NULL)) + if (RegisterConfigInteger(MainSection, Channel, "coding", &Config.LoRaDevices[Channel].ErrorCoding, LoRaCallback)) { LogMessage( "Setting Error Coding=%d\n", Config.LoRaDevices[Channel].ErrorCoding); } - RegisterConfigBoolean(MainSection, Channel, "lowopt", &Config.LoRaDevices[Channel].LowDataRateOptimize, NULL); + RegisterConfigBoolean(MainSection, Channel, "lowopt", &Config.LoRaDevices[Channel].LowDataRateOptimize, LoRaCallback); - RegisterConfigBoolean(MainSection, Channel, "AFC", &Config.LoRaDevices[Channel].AFC, NULL); + RegisterConfigBoolean(MainSection, Channel, "AFC", &Config.LoRaDevices[Channel].AFC, MiscCallback); if (Config.LoRaDevices[Channel].AFC) { ChannelPrintf( Channel, 11, 24, "AFC" ); @@ -2357,11 +2373,12 @@ int main( int argc, char **argv ) for (Channel=0; Channel<=1; Channel++) { - if ( Config.LoRaDevices[Channel].InUse ) + if (Config.LoRaDevices[Channel].InUse) { ShowPacketCounts( Channel ); - ChannelPrintf( Channel, 12, 1, "Current RSSI = %4d ", CurrentRSSI(Channel)); + Config.LoRaDevices[Channel].CurrentRSSI = CurrentRSSI(Channel); + ChannelPrintf( Channel, 12, 1, "Current RSSI = %4d ", Config.LoRaDevices[Channel].CurrentRSSI); // Calling mode timeout? if ( Config.LoRaDevices[Channel].InCallingMode diff --git a/gateway.txt.old b/gateway.txt.old deleted file mode 100644 index c9c7c1b..0000000 --- a/gateway.txt.old +++ /dev/null @@ -1,110 +0,0 @@ -tracker=M0RPI -EnableHabitat=N -EnableSSDV=N -JPGFolder=ssdv -LogTelemetry=Y -CallingTimeout=60 -ServerPort=6004 -DataPort=6006 -UDPPort=55671 -OziPort=55672 - -# Telnet settings -# HABPort=6005 -# HABChannel=1 - -Latitude=51.950230 -Longitude=-2.544500 -Antenna=Sigma X-30 -#SMSFolder=./ -# UplinkCode=DAVE - -#NetworkLED=21 -#InternetLED=22 -#ActivityLED_0=23 -#ActivityLED_1=24 - -#----------------- HARDWARE -DIO0_0=31 -DIO5_0=26 - -DIO0_1=6 -DIO5_1=5 - -#----------------- CHANNEL 0 - -# Standard Fast SSDV -# frequency_0=869.850 -mode_0=3 -AFC_0=N - -# UplinkTime_0=1 -# UplinkCycle_0=60 -# UplinkFrequency_0=869.5 -# UplinkMode_0=2 -# Power_0=143 -# SSDVUplink_0=Y - -# ----------------- CHANNEL 1 - -# BUZZ -# frequency_1=434.450 -# mode_1=2 -# AFC_1=N - -# RTLS1 -frequency_1=434.450000 -mode_1=2 -SF_1=7 -AFC_1=N - -# RTLS2 / 3 -# frequency_1=434.225 -# mode_1=2 -# AFC_1=N - -# BRUCE -# frequency_1=434.231 -# mode_1=1 -# AFC_1=Y - -# X0 -# frequency_1=434.410 -# mode_1=0 - -# WB-L -# frequency_1=434.454 -# mode_1=1 -# AFC_1=Y - -# Testing -# frequency_1=434.455 -# mode_1=1 - -# TDM settings -# frequency_1=433.705 -# mode_1=2 -# UplinkTime_1=0 -# UplinkCycle_1=10 -# IdleUplink_1=Y - -# SSDV Repeating settings -# frequency_1=434.231 -# mode_1=8 - -# Telnet settings -# frequency_1=434.228 -# mode_1=7 - -# RTLS settings -# frequency_1=434.228 -# mode_1=2 - -# BOUY settings -# frequency_1=434.4543 -# mode_1=1 - -#AFC_1=N -#UplinkTime_1=0 -#UplinkCycle_1=10 -#SSDVUplink=Y diff --git a/global.h b/global.h index 913dfaa..ef7cf1b 100644 --- a/global.h +++ b/global.h @@ -24,7 +24,7 @@ struct TPayload double Longitude, Latitude; unsigned int Altitude, PreviousAltitude; float AscentRate; - unsigned long LastPositionAt; + unsigned long LastPositionAt; }; struct TLoRaDevice { double Frequency; double Bandwidth; @@ -81,6 +81,11 @@ struct TPayload // Local data packets int LocalDataCount; char LocalDataBuffer[255]; + + // Status + int CurrentRSSI; + int PacketSNR, PacketRSSI; + double FrequencyError; }; struct TConfig { char Tracker[16]; // Callsign or name of receiver double latitude, longitude; // Receiver's location diff --git a/server.c b/server.c index cef9b93..63007e7 100644 --- a/server.c +++ b/server.c @@ -21,6 +21,7 @@ #include "server.h" #include "config.h" #include "global.h" +#include "gateway.h" extern bool run; @@ -121,40 +122,63 @@ void ProcessJSONClientLine(int connfd, char *line) int SendJSON(int connfd) { - int PayloadIndex, port_closed; - char sendBuff[1025]; + int Channel, PayloadIndex, port_closed; + char sendBuff[4000], line[400]; port_closed = 0; - memset( sendBuff, '0', sizeof( sendBuff ) ); + sendBuff[0] = '\0'; + // Send any packets that we've not sent yet for (PayloadIndex=0; PayloadIndex