kopia lustrzana https://github.com/PiInTheSky/lora-gateway
Added packet logging
rodzic
7ed3f20b38
commit
1d875728dd
|
@ -8,4 +8,5 @@ desktop.ini
|
||||||
*.ack
|
*.ack
|
||||||
gateway
|
gateway
|
||||||
telemetry.txt
|
telemetry.txt
|
||||||
|
packets.txt
|
||||||
ssdv
|
ssdv
|
||||||
|
|
105
gateway.c
105
gateway.c
|
@ -167,6 +167,27 @@ uint8_t readRegister(int Channel, uint8_t reg)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LogPacket(int Channel, int8_t SNR, int RSSI, double FreqError, int Bytes, unsigned char MessageType)
|
||||||
|
{
|
||||||
|
if (Config.EnablePacketLogging)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if ((fp = fopen("packets.txt", "at")) != NULL)
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
now = time(0);
|
||||||
|
tm = localtime(&now);
|
||||||
|
|
||||||
|
fprintf(fp, "%02d:%02d:%02d - Ch %d, SNR %d, RSSI %d, FreqErr %.1lf, Bytes %d, Type %02Xh\n", tm->tm_hour, tm->tm_min, tm->tm_sec, Channel, SNR, RSSI, FreqError, Bytes, MessageType);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LogTelemetryPacket(char *Telemetry)
|
void LogTelemetryPacket(char *Telemetry)
|
||||||
{
|
{
|
||||||
if (Config.EnableTelemetryLogging)
|
if (Config.EnableTelemetryLogging)
|
||||||
|
@ -182,6 +203,7 @@ void LogTelemetryPacket(char *Telemetry)
|
||||||
tm = localtime(&now);
|
tm = localtime(&now);
|
||||||
|
|
||||||
fprintf(fp, "%02d:%02d:%02d - %s\n", tm->tm_hour, tm->tm_min, tm->tm_sec, Telemetry);
|
fprintf(fp, "%02d:%02d:%02d - %s\n", tm->tm_hour, tm->tm_min, tm->tm_sec, Telemetry);
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -630,16 +652,49 @@ void DoPositionCalcs(Channel)
|
||||||
void ProcessLine(int Channel, char *Line)
|
void ProcessLine(int Channel, char *Line)
|
||||||
{
|
{
|
||||||
int FieldCount;
|
int FieldCount;
|
||||||
|
int Speed, Heading, Satellites;
|
||||||
|
float TempInt, TempExt;
|
||||||
|
|
||||||
FieldCount = sscanf(Line+2, "%15[^,],%u,%8[^,],%lf,%lf,%u",
|
Config.LoRaDevices[Channel].FlightMode = -1;
|
||||||
&(Config.LoRaDevices[Channel].Payload),
|
|
||||||
&(Config.LoRaDevices[Channel].Counter),
|
if (Config.EnableDev)
|
||||||
&(Config.LoRaDevices[Channel].Time),
|
{
|
||||||
&(Config.LoRaDevices[Channel].Latitude),
|
FieldCount = sscanf(Line+2, "%15[^,],%u,%8[^,],%lf,%lf,%u,%d,%d,%d,%f,%f,%lf,%lf,%lf,%lf,%d,%d,%d,%lf,%d,%d,%d,%d,%lf,%d",
|
||||||
&(Config.LoRaDevices[Channel].Longitude),
|
&(Config.LoRaDevices[Channel].Payload),
|
||||||
&(Config.LoRaDevices[Channel].Altitude));
|
&(Config.LoRaDevices[Channel].Counter),
|
||||||
|
&(Config.LoRaDevices[Channel].Time),
|
||||||
// HAB->HAB_status = FieldCount == 6;
|
&(Config.LoRaDevices[Channel].Latitude),
|
||||||
|
&(Config.LoRaDevices[Channel].Longitude),
|
||||||
|
&(Config.LoRaDevices[Channel].Altitude),
|
||||||
|
&(Config.LoRaDevices[Channel].Speed),
|
||||||
|
&(Config.LoRaDevices[Channel].Heading),
|
||||||
|
&Satellites,
|
||||||
|
&TempInt, &TempExt,
|
||||||
|
&(Config.LoRaDevices[Channel].cda),
|
||||||
|
&(Config.LoRaDevices[Channel].PredictedLatitude),
|
||||||
|
&(Config.LoRaDevices[Channel].PredictedLongitude),
|
||||||
|
&(Config.LoRaDevices[Channel].PredictedLandingSpeed),
|
||||||
|
&(Config.LoRaDevices[Channel].PredictedTime),
|
||||||
|
&(Config.LoRaDevices[Channel].CompassActual),
|
||||||
|
&(Config.LoRaDevices[Channel].CompassTarget),
|
||||||
|
&(Config.LoRaDevices[Channel].AirSpeed),
|
||||||
|
&(Config.LoRaDevices[Channel].AirDirection),
|
||||||
|
&(Config.LoRaDevices[Channel].ServoLeft),
|
||||||
|
&(Config.LoRaDevices[Channel].ServoRight),
|
||||||
|
&(Config.LoRaDevices[Channel].ServoTime),
|
||||||
|
&(Config.LoRaDevices[Channel].GlideRatio),
|
||||||
|
&(Config.LoRaDevices[Channel].FlightMode));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FieldCount = sscanf(Line+2, "%15[^,],%u,%8[^,],%lf,%lf,%u",
|
||||||
|
&(Config.LoRaDevices[Channel].Payload),
|
||||||
|
&(Config.LoRaDevices[Channel].Counter),
|
||||||
|
&(Config.LoRaDevices[Channel].Time),
|
||||||
|
&(Config.LoRaDevices[Channel].Latitude),
|
||||||
|
&(Config.LoRaDevices[Channel].Longitude),
|
||||||
|
&(Config.LoRaDevices[Channel].Altitude));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1039,9 +1094,7 @@ void DIO0_Interrupt(int Channel)
|
||||||
digitalWrite(Config.LoRaDevices[Channel].ActivityLED, 1);
|
digitalWrite(Config.LoRaDevices[Channel].ActivityLED, 1);
|
||||||
LEDCounts[Channel] = 5;
|
LEDCounts[Channel] = 5;
|
||||||
}
|
}
|
||||||
// LogMessage("Channel %d data available - %d bytes\n", Channel, Bytes);
|
|
||||||
// LogMessage("Line = '%s'\n", Message);
|
|
||||||
|
|
||||||
if (Message[1] == '!')
|
if (Message[1] == '!')
|
||||||
{
|
{
|
||||||
ProcessUploadMessage(Channel, Message+1);
|
ProcessUploadMessage(Channel, Message+1);
|
||||||
|
@ -1055,6 +1108,14 @@ void DIO0_Interrupt(int Channel)
|
||||||
ProcessTelemetryMessage(Channel, Message+1);
|
ProcessTelemetryMessage(Channel, Message+1);
|
||||||
TestMessageForSMSAcknowledgement(Channel, Message+1);
|
TestMessageForSMSAcknowledgement(Channel, Message+1);
|
||||||
}
|
}
|
||||||
|
else if (Message[1] == '>')
|
||||||
|
{
|
||||||
|
LogMessage("Flight Controller message %d bytes = %s", Bytes, Message+1);
|
||||||
|
}
|
||||||
|
else if (Message[1] == '*')
|
||||||
|
{
|
||||||
|
LogMessage("Uplink Command message %d bytes = %s", Bytes, Message+1);
|
||||||
|
}
|
||||||
else if (Message[1] == 0x66)
|
else if (Message[1] == 0x66)
|
||||||
{
|
{
|
||||||
ProcessSSDVMessage(Channel, Message);
|
ProcessSSDVMessage(Channel, Message);
|
||||||
|
@ -1173,17 +1234,12 @@ int receiveMessage(int Channel, unsigned char *message)
|
||||||
ShowPacketCounts(Channel);
|
ShowPacketCounts(Channel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int8_t SNR;
|
int8_t SNR;
|
||||||
int RSSI;
|
int RSSI;
|
||||||
|
|
||||||
currentAddr = readRegister(Channel, REG_FIFO_RX_CURRENT_ADDR);
|
currentAddr = readRegister(Channel, REG_FIFO_RX_CURRENT_ADDR);
|
||||||
// LogMessage("currentAddr = %d\n", currentAddr);
|
|
||||||
Bytes = readRegister(Channel, REG_RX_NB_BYTES);
|
Bytes = readRegister(Channel, REG_RX_NB_BYTES);
|
||||||
// LogMessage("%d bytes in packet\n", Bytes);
|
|
||||||
|
|
||||||
// LogMessage("RSSI = %d\n", readRegister(Channel, REG_PACKET_RSSI) - 137);
|
|
||||||
|
|
||||||
|
|
||||||
SNR = readRegister(Channel, REG_PACKET_SNR);
|
SNR = readRegister(Channel, REG_PACKET_SNR);
|
||||||
SNR /= 4;
|
SNR /= 4;
|
||||||
|
@ -1192,6 +1248,7 @@ int receiveMessage(int Channel, unsigned char *message)
|
||||||
{
|
{
|
||||||
RSSI += SNR;
|
RSSI += SNR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelPrintf(Channel, 10, 1, "Packet SNR = %d, RSSI = %d ", (int)SNR, RSSI);
|
ChannelPrintf(Channel, 10, 1, "Packet SNR = %d, RSSI = %d ", (int)SNR, RSSI);
|
||||||
|
|
||||||
FreqError = FrequencyError(Channel) / 1000;
|
FreqError = FrequencyError(Channel) / 1000;
|
||||||
|
@ -1209,6 +1266,8 @@ int receiveMessage(int Channel, unsigned char *message)
|
||||||
|
|
||||||
message[Bytes] = '\0';
|
message[Bytes] = '\0';
|
||||||
|
|
||||||
|
LogPacket(Channel, SNR, RSSI, FreqError, Bytes, message[1]);
|
||||||
|
|
||||||
if(Config.LoRaDevices[Channel].AFC && (fabs(FreqError)>0.5))
|
if(Config.LoRaDevices[Channel].AFC && (fabs(FreqError)>0.5))
|
||||||
{
|
{
|
||||||
ReTune(Channel, FreqError/1000);
|
ReTune(Channel, FreqError/1000);
|
||||||
|
@ -1299,6 +1358,7 @@ void LoadConfigFile()
|
||||||
Config.EnableHabitat = 1;
|
Config.EnableHabitat = 1;
|
||||||
Config.EnableSSDV = 1;
|
Config.EnableSSDV = 1;
|
||||||
Config.EnableTelemetryLogging = 0;
|
Config.EnableTelemetryLogging = 0;
|
||||||
|
Config.EnablePacketLogging = 0;
|
||||||
Config.SSDVJpegFolder[0] = '\0';
|
Config.SSDVJpegFolder[0] = '\0';
|
||||||
Config.ftpServer[0] = '\0';
|
Config.ftpServer[0] = '\0';
|
||||||
Config.ftpUser[0] = '\0';
|
Config.ftpUser[0] = '\0';
|
||||||
|
@ -1307,6 +1367,7 @@ void LoadConfigFile()
|
||||||
Config.latitude = -999;
|
Config.latitude = -999;
|
||||||
Config.longitude = -999;
|
Config.longitude = -999;
|
||||||
Config.antenna[0] = '\0';
|
Config.antenna[0] = '\0';
|
||||||
|
Config.EnableDev = 0;
|
||||||
|
|
||||||
if ((fp = fopen(filename, "r")) == NULL)
|
if ((fp = fopen(filename, "r")) == NULL)
|
||||||
{
|
{
|
||||||
|
@ -1322,8 +1383,11 @@ void LoadConfigFile()
|
||||||
ReadBoolean(fp, "EnableHabitat", 0, &Config.EnableHabitat);
|
ReadBoolean(fp, "EnableHabitat", 0, &Config.EnableHabitat);
|
||||||
ReadBoolean(fp, "EnableSSDV", 0, &Config.EnableSSDV);
|
ReadBoolean(fp, "EnableSSDV", 0, &Config.EnableSSDV);
|
||||||
|
|
||||||
// Enable logging
|
// Enable telemetry logging
|
||||||
ReadBoolean(fp, "LogTelemetry", 0, &Config.EnableTelemetryLogging);
|
ReadBoolean(fp, "LogTelemetry", 0, &Config.EnableTelemetryLogging);
|
||||||
|
|
||||||
|
// Enable packet logging
|
||||||
|
ReadBoolean(fp, "LogPackets", 0, &Config.EnablePacketLogging);
|
||||||
|
|
||||||
// Calling mode
|
// Calling mode
|
||||||
Config.CallingTimeout = ReadInteger(fp, "CallingTimeout", 0, 300);
|
Config.CallingTimeout = ReadInteger(fp, "CallingTimeout", 0, 300);
|
||||||
|
@ -1361,6 +1425,9 @@ void LoadConfigFile()
|
||||||
Config.longitude = ReadFloat(fp, "Longitude");
|
Config.longitude = ReadFloat(fp, "Longitude");
|
||||||
ReadString(fp, "antenna", Config.antenna, sizeof(Config.antenna), 0);
|
ReadString(fp, "antenna", Config.antenna, sizeof(Config.antenna), 0);
|
||||||
|
|
||||||
|
// Dev mode
|
||||||
|
ReadBoolean(fp, "EnableDev", 0, &Config.EnableDev);
|
||||||
|
|
||||||
// SMS upload to tracker
|
// SMS upload to tracker
|
||||||
Config.SMSFolder[0] = '\0';
|
Config.SMSFolder[0] = '\0';
|
||||||
ReadString(fp, "SMSFolder", Config.SMSFolder, sizeof(Config.SMSFolder), 0);
|
ReadString(fp, "SMSFolder", Config.SMSFolder, sizeof(Config.SMSFolder), 0);
|
||||||
|
|
46
gateway.txt
46
gateway.txt
|
@ -1,27 +1,43 @@
|
||||||
tracker=M0RPI/B
|
tracker=M0RPI/5
|
||||||
EnableHabitat=Y
|
EnableHabitat=Y
|
||||||
EnableSSDV=N
|
EnableSSDV=Y
|
||||||
JPGFolder=ssdv
|
JPGFolder=ssdv
|
||||||
LogTelemetry=Y
|
LogTelemetry=Y
|
||||||
|
LogPackets=Y
|
||||||
CallingTimeout=60
|
CallingTimeout=60
|
||||||
ServerPort=6004
|
ServerPort=6004
|
||||||
Latitude=51.95023
|
Latitude=51.95023
|
||||||
Longitude=-2.5445
|
Longitude=-2.5445
|
||||||
SMSFolder=tweets/
|
Antenna=868MHz Yagi
|
||||||
|
#SMSFolder=./
|
||||||
|
EnableDev=Y
|
||||||
|
|
||||||
#NetworkLED=22
|
#NetworkLED=21
|
||||||
#InternetLED=23
|
#InternetLED=22
|
||||||
#ActivityLED_0=21
|
#ActivityLED_0=23
|
||||||
#ActivityLED_1=29
|
#ActivityLED_1=24
|
||||||
|
|
||||||
#frequency_0=434.450
|
frequency_0=869.850
|
||||||
#mode_1=1
|
mode_0=3
|
||||||
#DIO0_1=6
|
|
||||||
#DIO5_1=5
|
#frequency_0=869.500
|
||||||
AFC_1=N
|
#mode_0=
|
||||||
|
#bandwidth_0=125K
|
||||||
|
#implicit_0=0
|
||||||
|
#coding_0=5
|
||||||
|
#sf_0=8
|
||||||
|
#lowopt_0=0
|
||||||
|
#power_0=255
|
||||||
|
DIO0_0=31
|
||||||
|
DIO5_0=26
|
||||||
|
AFC_0=N
|
||||||
|
#UplinkTime_0=2
|
||||||
|
#UplinkCycle_0=60
|
||||||
|
|
||||||
frequency_1=434.500
|
frequency_1=434.500
|
||||||
mode_1=1
|
mode_1=1
|
||||||
#DIO0_1=27
|
DIO0_1=6
|
||||||
#DIO5_1=26
|
DIO5_1=5
|
||||||
AFC_1=Y
|
#AFC_1=Y
|
||||||
|
#UplinkTime_1=5
|
||||||
|
#UplinkCycle_1=60
|
||||||
|
|
6
global.h
6
global.h
|
@ -59,6 +59,7 @@ struct TLoRaDevice
|
||||||
char Payload[16], Time[12];
|
char Payload[16], Time[12];
|
||||||
unsigned int Counter, LastCounter;
|
unsigned int Counter, LastCounter;
|
||||||
unsigned long Seconds;
|
unsigned long Seconds;
|
||||||
|
double PredictedLongitude, PredictedLatitude;
|
||||||
double Longitude, Latitude;
|
double Longitude, Latitude;
|
||||||
unsigned int Altitude, PreviousAltitude;
|
unsigned int Altitude, PreviousAltitude;
|
||||||
unsigned int Satellites;
|
unsigned int Satellites;
|
||||||
|
@ -68,6 +69,9 @@ struct TLoRaDevice
|
||||||
time_t ReturnToCallingModeAt;
|
time_t ReturnToCallingModeAt;
|
||||||
int InCallingMode;
|
int InCallingMode;
|
||||||
int ActivityLED;
|
int ActivityLED;
|
||||||
|
|
||||||
|
int Speed, Heading, PredictedTime, CompassActual, CompassTarget, AirDirection, ServoLeft, ServoRight, ServoTime, FlightMode;
|
||||||
|
double cda, PredictedLandingSpeed, AirSpeed, GlideRatio;
|
||||||
|
|
||||||
// Normal (non TDM) uplink
|
// Normal (non TDM) uplink
|
||||||
int UplinkTime;
|
int UplinkTime;
|
||||||
|
@ -83,6 +87,7 @@ struct TConfig
|
||||||
int EnableHabitat;
|
int EnableHabitat;
|
||||||
int EnableSSDV;
|
int EnableSSDV;
|
||||||
int EnableTelemetryLogging;
|
int EnableTelemetryLogging;
|
||||||
|
int EnablePacketLogging;
|
||||||
int CallingTimeout;
|
int CallingTimeout;
|
||||||
char SSDVJpegFolder[100];
|
char SSDVJpegFolder[100];
|
||||||
char ftpServer[100];
|
char ftpServer[100];
|
||||||
|
@ -96,6 +101,7 @@ struct TConfig
|
||||||
float latitude, longitude;
|
float latitude, longitude;
|
||||||
char SMSFolder[64];
|
char SMSFolder[64];
|
||||||
char antenna[64];
|
char antenna[64];
|
||||||
|
int EnableDev;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct TConfig Config;
|
extern struct TConfig Config;
|
||||||
|
|
46
server.c
46
server.c
|
@ -69,15 +69,45 @@ void *ServerLoop(void *some_void_ptr)
|
||||||
// sprintf(sendBuff, "{\"class\":\"POSN\",\"time\":\"12:34:56\",\"lat\":54.12345,\"lon\":-2.12345,\"alt\":169}\r\n");
|
// sprintf(sendBuff, "{\"class\":\"POSN\",\"time\":\"12:34:56\",\"lat\":54.12345,\"lon\":-2.12345,\"alt\":169}\r\n");
|
||||||
|
|
||||||
Channel = 1;
|
Channel = 1;
|
||||||
sprintf(sendBuff, "{\"class\":\"POSN\",\"payload\":\"%s\",\"time\":\"%s\",\"lat\":%.5lf,\"lon\":%.5lf,\"alt\":%d,\"rate\":%.1lf}\r\n",
|
if (Config.EnableDev)
|
||||||
Config.LoRaDevices[Channel].Payload,
|
{
|
||||||
Config.LoRaDevices[Channel].Time,
|
sprintf(sendBuff, "{\"class\":\"POSN\",\"payload\":\"%s\",\"time\":\"%s\",\"lat\":%.5lf,\"lon\":%.5lf,\"alt\":%d,\"predlat\":%.5lf,\"predlon\":%.5lf,\"speed\":%d,"
|
||||||
Config.LoRaDevices[Channel].Latitude,
|
"\"head\":%d,\"cda\":%.2lf,\"pls\":%.1lf,\"pt\":%d,\"ca\":%d,\"ct\":%d,\"as\":%.1lf,\"ad\":%d,\"sl\":%d,\"sr\":%d,\"st\":%d,\"gr\":%.2lf,\"fm\":%d}\r\n",
|
||||||
Config.LoRaDevices[Channel].Longitude,
|
Config.LoRaDevices[Channel].Payload,
|
||||||
Config.LoRaDevices[Channel].Altitude,
|
Config.LoRaDevices[Channel].Time,
|
||||||
Config.LoRaDevices[Channel].AscentRate);
|
Config.LoRaDevices[Channel].Latitude,
|
||||||
|
Config.LoRaDevices[Channel].Longitude,
|
||||||
|
Config.LoRaDevices[Channel].Altitude,
|
||||||
|
Config.LoRaDevices[Channel].PredictedLatitude,
|
||||||
|
Config.LoRaDevices[Channel].PredictedLongitude,
|
||||||
|
Config.LoRaDevices[Channel].Speed,
|
||||||
|
|
||||||
|
Config.LoRaDevices[Channel].Heading,
|
||||||
|
Config.LoRaDevices[Channel].cda,
|
||||||
|
Config.LoRaDevices[Channel].PredictedLandingSpeed,
|
||||||
|
Config.LoRaDevices[Channel].PredictedTime,
|
||||||
|
Config.LoRaDevices[Channel].CompassActual,
|
||||||
|
Config.LoRaDevices[Channel].CompassTarget,
|
||||||
|
Config.LoRaDevices[Channel].AirSpeed,
|
||||||
|
Config.LoRaDevices[Channel].AirDirection,
|
||||||
|
Config.LoRaDevices[Channel].ServoLeft,
|
||||||
|
Config.LoRaDevices[Channel].ServoRight,
|
||||||
|
Config.LoRaDevices[Channel].ServoTime,
|
||||||
|
Config.LoRaDevices[Channel].GlideRatio,
|
||||||
|
Config.LoRaDevices[Channel].FlightMode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(sendBuff, "{\"class\":\"POSN\",\"payload\":\"%s\",\"time\":\"%s\",\"lat\":%.5lf,\"lon\":%.5lf,\"alt\":%d,\"rate\":%.1lf}\r\n",
|
||||||
|
|
||||||
|
Config.LoRaDevices[Channel].Payload,
|
||||||
|
Config.LoRaDevices[Channel].Time,
|
||||||
|
Config.LoRaDevices[Channel].Latitude,
|
||||||
|
Config.LoRaDevices[Channel].Longitude,
|
||||||
|
Config.LoRaDevices[Channel].Altitude,
|
||||||
|
Config.LoRaDevices[Channel].AscentRate);
|
||||||
|
}
|
||||||
|
|
||||||
if (!run)
|
if (!run)
|
||||||
{
|
{
|
||||||
port_closed = 1;
|
port_closed = 1;
|
||||||
|
|
Ładowanie…
Reference in New Issue