[hamradio-commits] [dump1090] 315/389: Version 1.09.1007.14
Matthew Ernisse
mernisse-guest at moszumanska.debian.org
Wed Nov 5 00:20:09 UTC 2014
This is an automated email from the git hooks/post-receive script.
mernisse-guest pushed a commit to branch master
in repository dump1090.
commit 8b05286a247159c734252a0526986feaca9f6396
Author: Malcolm Robb <Support at ATTAvionics.com>
Date: Thu Jul 10 18:11:13 2014 +0100
Version 1.09.1007.14
Updates to support COAA Planeplotter Ground Station on an RPi
---
Release/dump1090.bat | 1 -
Release/dump1090.exe | Bin 110592 -> 0 bytes
Release/view1090.exe | Bin 90112 -> 0 bytes
anet.c | 1 +
coaa1090.obj | Bin 18360 -> 30696 bytes
...08.2705.14.zip => dump1090-win.1.09.1007.14.zip | Bin 570511 -> 614282 bytes
dump1090.bat | 1 -
dump1090.c | 2 +
dump1090.exe | Bin 110592 -> 0 bytes
dump1090.h | 37 ++++--
interactive.c | 104 ++++++++++++++--
mode_s.c | 131 +++++++++++----------
net_io.c | 16 ++-
ppup1090.c | 11 +-
ppup1090.h | 19 +--
view1090.c | 16 +++
16 files changed, 245 insertions(+), 94 deletions(-)
diff --git a/Release/dump1090.bat b/Release/dump1090.bat
deleted file mode 100644
index dab0b46..0000000
--- a/Release/dump1090.bat
+++ /dev/null
@@ -1 +0,0 @@
-dump1090.exe --interactive --net --net-ro-size 500 --net-ro-rate 5
\ No newline at end of file
diff --git a/Release/dump1090.exe b/Release/dump1090.exe
deleted file mode 100644
index 3e0f87f..0000000
Binary files a/Release/dump1090.exe and /dev/null differ
diff --git a/Release/view1090.exe b/Release/view1090.exe
deleted file mode 100644
index 9d001f8..0000000
Binary files a/Release/view1090.exe and /dev/null differ
diff --git a/anet.c b/anet.c
index af7c810..859c98c 100644
--- a/anet.c
+++ b/anet.c
@@ -165,6 +165,7 @@ static int anetTcpGenericConnect(char *err, char *addr, int port, int flags)
if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR)
return ANET_ERR;
+ memset(&sa,0,sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons((uint16_t)port);
if (inet_aton(addr, (void*)&sa.sin_addr) == 0) {
diff --git a/coaa1090.obj b/coaa1090.obj
index 4c67a3d..67074ac 100644
Binary files a/coaa1090.obj and b/coaa1090.obj differ
diff --git a/dump1090-win.1.08.2705.14.zip b/dump1090-win.1.09.1007.14.zip
similarity index 84%
rename from dump1090-win.1.08.2705.14.zip
rename to dump1090-win.1.09.1007.14.zip
index b40d5c6..5867e8a 100644
Binary files a/dump1090-win.1.08.2705.14.zip and b/dump1090-win.1.09.1007.14.zip differ
diff --git a/dump1090.bat b/dump1090.bat
deleted file mode 100644
index 777769b..0000000
--- a/dump1090.bat
+++ /dev/null
@@ -1 +0,0 @@
-dump1090.exe --interactive --net --net-ro-port 30002 --net-beast --mlat
diff --git a/dump1090.c b/dump1090.c
index bbe408e..b3bef28 100644
--- a/dump1090.c
+++ b/dump1090.c
@@ -68,6 +68,7 @@ void modesInitConfig(void) {
// Now initialise things that should not be 0/NULL to their defaults
Modes.gain = MODES_MAX_GAIN;
Modes.freq = MODES_DEFAULT_FREQ;
+ Modes.ppm_error = MODES_DEFAULT_PPM;
Modes.check_crc = 1;
Modes.net_heartbeat_rate = MODES_NET_HEARTBEAT_RATE;
Modes.net_output_sbs_port = MODES_NET_OUTPUT_SBS_PORT;
@@ -88,6 +89,7 @@ void modesInitConfig(void) {
void modesInit(void) {
int i, q;
+ pthread_mutex_init(&Modes.pDF_mutex,NULL);
pthread_mutex_init(&Modes.data_mutex,NULL);
pthread_cond_init(&Modes.data_cond,NULL);
diff --git a/dump1090.exe b/dump1090.exe
deleted file mode 100644
index 3e0f87f..0000000
Binary files a/dump1090.exe and /dev/null differ
diff --git a/dump1090.h b/dump1090.h
index ad74c26..db95262 100644
--- a/dump1090.h
+++ b/dump1090.h
@@ -30,14 +30,14 @@
#ifndef __DUMP1090_H
#define __DUMP1090_H
-// File Version number
+// File Version number
// ====================
// Format is : MajorVer.MinorVer.DayMonth.Year"
// MajorVer changes only with significant changes
// MinorVer changes when additional features are added, but not for bug fixes (range 00-99)
// DayDate & Year changes for all changes, including for bug fixes. It represent the release date of the update
//
-#define MODES_DUMP1090_VERSION "1.08.2705.14"
+#define MODES_DUMP1090_VERSION "1.09.1007.14"
// ============================= Include files ==========================
@@ -67,7 +67,7 @@
// ============================= #defines ===============================
//
-// If you have a valid coaa.h, these values will come from it. If not,
+// If you have a valid coaa.h, these values will come from it. If not,
// then you can enter your own values in the #else section here
//
#ifdef USER_LATITUDE
@@ -76,8 +76,9 @@
#else
#define MODES_USER_LATITUDE_DFLT (0.0)
#define MODES_USER_LONGITUDE_DFLT (0.0)
-#endif
+#endif
+#define MODES_DEFAULT_PPM 52
#define MODES_DEFAULT_RATE 2000000
#define MODES_DEFAULT_FREQ 1090000000
#define MODES_DEFAULT_WIDTH 1000
@@ -115,7 +116,7 @@
#define MODES_LONG_MSG_SIZE (MODES_LONG_MSG_SAMPLES * sizeof(uint16_t))
#define MODES_SHORT_MSG_SIZE (MODES_SHORT_MSG_SAMPLES * sizeof(uint16_t))
-#define MODES_RAWOUT_BUF_SIZE (1500)
+#define MODES_RAWOUT_BUF_SIZE (1500)
#define MODES_RAWOUT_BUF_FLUSH (MODES_RAWOUT_BUF_SIZE - 200)
#define MODES_RAWOUT_BUF_RATE (1000) // 1000 * 64mS = 1 Min approx
@@ -138,12 +139,12 @@
#define MODES_ACFLAGS_AOG (1<<9) // Aircraft is On the Ground
#define MODES_ACFLAGS_LLEVEN_VALID (1<<10) // Aircraft Even Lot/Lon is known
#define MODES_ACFLAGS_LLODD_VALID (1<<11) // Aircraft Odd Lot/Lon is known
-#define MODES_ACFLAGS_AOG_VALID (1<<12) // MODES_ACFLAGS_AOG is valid
-#define MODES_ACFLAGS_FS_VALID (1<<13) // Aircraft Flight Status is known
+#define MODES_ACFLAGS_AOG_VALID (1<<12) // MODES_ACFLAGS_AOG is valid
+#define MODES_ACFLAGS_FS_VALID (1<<13) // Aircraft Flight Status is known
#define MODES_ACFLAGS_NSEWSPD_VALID (1<<14) // Aircraft EW and NS Speed is known
#define MODES_ACFLAGS_LATLON_REL_OK (1<<15) // Indicates it's OK to do a relative CPR
-#define MODES_ACFLAGS_LLEITHER_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID)
+#define MODES_ACFLAGS_LLEITHER_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID)
#define MODES_ACFLAGS_LLBOTH_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID)
#define MODES_ACFLAGS_AOG_GROUND (MODES_ACFLAGS_AOG_VALID | MODES_ACFLAGS_AOG)
@@ -175,7 +176,7 @@
#define MODES_NET_HTTP_PORT 8080
#define MODES_CLIENT_BUF_SIZE 1024
#define MODES_NET_SNDBUF_SIZE (1024*64)
-#define MODES_NET_SNDBUF_MAX (7)
+#define MODES_NET_SNDBUF_MAX (7)
#ifndef HTMLPATH
#define HTMLPATH "./public_html" // default path for gmap.html etc
@@ -226,6 +227,15 @@ struct aircraft {
struct aircraft *next; // Next aircraft in our linked list
};
+struct stDF {
+ struct stDF *pNext; // Pointer to next item in the linked list
+ struct aircraft *pAircraft; // Pointer to the Aircraft structure for this DF
+ time_t seen; // Dos/UNIX Time at which the this packet was received
+ uint64_t llTimestamp; // Timestamp at which the this packet was received
+ uint32_t addr; // Timestamp at which the this packet was received
+ unsigned char msg[MODES_LONG_MSG_BYTES]; // the binary
+} tDF;
+
// Program global state
struct { // Internal state
pthread_t reader_thread;
@@ -236,7 +246,7 @@ struct { // Internal state
struct timeb stSystemTimeRTL[MODES_ASYNC_BUF_NUMBER]; // System time when RTL passed us this block
int iDataIn; // Fifo input pointer
int iDataOut; // Fifo output pointer
- int iDataReady; // Fifo content count
+ int iDataReady; // Fifo content count
int iDataLost; // Count of missed buffers
uint16_t *pFileData; // Raw IQ samples buffer (from a File)
@@ -316,6 +326,11 @@ struct { // Internal state
struct aircraft *aircrafts;
uint64_t interactive_last_update; // Last screen update in milliseconds
+ // DF List mode
+ int bEnableDFLogging; // Set to enable DF Logging
+ pthread_mutex_t pDF_mutex; // Mutex to synchronize pDF access
+ struct stDF *pDF; // Pointer to DF list
+
// Statistics
unsigned int stat_valid_preamble;
unsigned int stat_demodulated0;
@@ -426,6 +441,8 @@ struct aircraft* interactiveReceiveData(struct modesMessage *mm);
void interactiveShowData(void);
void interactiveRemoveStaleAircrafts(void);
int decodeBinMessage (struct client *c, char *p);
+struct aircraft *interactiveFindAircraft(uint32_t addr);
+struct stDF *interactiveFindDF (uint32_t addr);
//
// Functions exported from net_io.c
diff --git a/interactive.c b/interactive.c
index b2ce05a..0c775f9 100644
--- a/interactive.c
+++ b/interactive.c
@@ -42,6 +42,86 @@ static uint64_t mstime(void) {
return mst;
}
//
+//=========================================================================
+//
+// Add a new DF structure to the interactive mode linked list
+//
+void interactiveCreateDF(struct aircraft *a, struct modesMessage *mm) {
+ struct stDF *pDF = (struct stDF *) malloc(sizeof(*pDF));
+
+ if (pDF) {
+ // Default everything to zero/NULL
+ memset(pDF, 0, sizeof(*pDF));
+
+ // Now initialise things
+ pDF->seen = a->seen;
+ pDF->llTimestamp = mm->timestampMsg;
+ pDF->addr = mm->addr;
+ pDF->pAircraft = a;
+ memcpy(pDF->msg, mm->msg, MODES_LONG_MSG_BYTES);
+
+ if (!pthread_mutex_lock(&Modes.pDF_mutex)) {
+ pDF->pNext = Modes.pDF;
+ Modes.pDF = pDF;
+ pthread_mutex_unlock(&Modes.pDF_mutex);
+ } else {
+ free(pDF);
+ }
+ }
+}
+//
+// Remove stale DF's from the interactive mode linked list
+//
+void interactiveRemoveStaleDF(time_t now) {
+ struct stDF *pDF = NULL;
+ struct stDF *prev = NULL;
+
+ // Only fiddle with the DF list if we gain possession of the mutex
+ // If we fail to get the mutex we'll get another chance to tidy the
+ // DF list in a second or so.
+ if (!pthread_mutex_trylock(&Modes.pDF_mutex)) {
+ pDF = Modes.pDF;
+ while(pDF) {
+ if ((now - pDF->seen) > Modes.interactive_delete_ttl) {
+ if (!prev) {
+ Modes.pDF = NULL;
+ } else {
+ prev->pNext = NULL;
+ }
+
+ // All DF's in the list from here onwards will be time
+ // expired, so delete them all
+ while ((prev = pDF)) {
+ pDF = pDF->pNext;
+ free(prev);
+ }
+
+ } else {
+ prev = pDF;
+ pDF = pDF->pNext;
+ }
+ }
+ pthread_mutex_unlock (&Modes.pDF_mutex);
+ }
+}
+
+struct stDF *interactiveFindDF(uint32_t addr) {
+ struct stDF *pDF = NULL;
+
+ if (!pthread_mutex_lock(&Modes.pDF_mutex)) {
+ pDF = Modes.pDF;
+ while(pDF) {
+ if (pDF->addr == addr) {
+ pthread_mutex_unlock (&Modes.pDF_mutex);
+ return (pDF);
+ }
+ pDF = pDF->pNext;
+ }
+ pthread_mutex_unlock (&Modes.pDF_mutex);
+ }
+ return (NULL);
+}
+//
//========================= Interactive mode ===============================
//
// Return a new aircraft structure for the interactive mode linked list
@@ -179,7 +259,7 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
struct aircraft *a, *aux;
// Return if (checking crc) AND (not crcok) AND (not fixed)
- if (Modes.check_crc && (mm->crcok == 0) && (mm->correctedbits == 0))
+ if (Modes.check_crc && (mm->crcok == 0) && (mm->correctedbits == 0))
return NULL;
// Lookup our aircraft or create a new one
@@ -298,20 +378,25 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
if (mm->msgtype == 32) {
int flags = a->modeACflags;
- if ((flags & (MODEAC_MSG_MODEC_HIT | MODEAC_MSG_MODEC_OLD)) == MODEAC_MSG_MODEC_OLD) {
+ if ((flags & (MODEAC_MSG_MODEC_HIT | MODEAC_MSG_MODEC_OLD)) == MODEAC_MSG_MODEC_OLD) {
//
// This Mode-C doesn't currently hit any known Mode-S, but it used to because MODEAC_MSG_MODEC_OLD is
// set So the aircraft it used to match has either changed altitude, or gone out of our receiver range
//
// We've now received this Mode-A/C again, so it must be a new aircraft. It could be another aircraft
- // at the same Mode-C altitude, or it could be a new airctraft with a new Mods-A squawk.
+ // at the same Mode-C altitude, or it could be a new airctraft with a new Mods-A squawk.
//
// To avoid masking this aircraft from the interactive display, clear the MODEAC_MSG_MODES_OLD flag
// and set messages to 1;
//
a->modeACflags = flags & ~MODEAC_MSG_MODEC_OLD;
a->messages = 1;
- }
+ }
+ }
+
+ // If we are Logging DF's, and it's not a Mode A/C
+ if ((Modes.bEnableDFLogging) && (mm->msgtype < 32)) {
+ interactiveCreateDF(a,mm);
}
return (a);
@@ -427,7 +512,7 @@ void interactiveShowData(void) {
snprintf(strFl, 6, "%5d", altitude);
}
- printf("%06x %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n",
+ printf("%06X %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n",
a->addr, strMode, strSquawk, a->flight, strFl, strGs, strTt,
strLat, strLon, signalAverage, msgs, (int)(now - a->seen));
}
@@ -448,17 +533,20 @@ void interactiveRemoveStaleAircrafts(void) {
struct aircraft *prev = NULL;
time_t now = time(NULL);
+ interactiveRemoveStaleDF(now);
+
while(a) {
if ((now - a->seen) > Modes.interactive_delete_ttl) {
struct aircraft *next = a->next;
// Remove the element from the linked list, with care
// if we are removing the first element
- if (!prev)
+ if (!prev) {
Modes.aircrafts = next;
- else
+ } else {
prev->next = next;
-
+ }
+
free(a);
a = next;
} else {
diff --git a/mode_s.c b/mode_s.c
index 61ecda4..d168094 100644
--- a/mode_s.c
+++ b/mode_s.c
@@ -907,6 +907,10 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
mm->crcok = ICAOAddressWasRecentlySeen(mm->addr = mm->crc);
}
+ // If we're checking CRC and the CRC is invalid, then we can't trust any
+ // of the data contents, so save time and give up now.
+ if ((Modes.check_crc) && (!mm->crcok)) { return;}
+
// Fields for DF0, DF16
if (mm->msgtype == 0 || mm->msgtype == 16) {
if (msg[0] & 0x04) { // VS Bit
@@ -982,32 +986,6 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
mm->flight[8] = '\0';
- } else if (metype >= 5 && metype <= 18) { // Position Message
- mm->raw_latitude = ((msg[6] & 3) << 15) | (msg[7] << 7) | (msg[8] >> 1);
- mm->raw_longitude = ((msg[8] & 1) << 16) | (msg[9] << 8) | (msg[10]);
- mm->bFlags |= (mm->msg[6] & 0x04) ? MODES_ACFLAGS_LLODD_VALID
- : MODES_ACFLAGS_LLEVEN_VALID;
- if (metype >= 9) { // Airborne
- int AC12Field = ((msg[5] << 4) | (msg[6] >> 4)) & 0x0FFF;
- mm->bFlags |= MODES_ACFLAGS_AOG_VALID;
- if (AC12Field) {// Only attempt to decode if a valid (non zero) altitude is present
- mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
- mm->altitude = decodeAC12Field(AC12Field, &mm->unit);
- }
- } else { // Ground
- int movement = ((msg[4] << 4) | (msg[5] >> 4)) & 0x007F;
- mm->bFlags |= MODES_ACFLAGS_AOG_VALID | MODES_ACFLAGS_AOG;
- if ((movement) && (movement < 125)) {
- mm->bFlags |= MODES_ACFLAGS_SPEED_VALID;
- mm->velocity = decodeMovementField(movement);
- }
-
- if (msg[5] & 0x08) {
- mm->bFlags |= MODES_ACFLAGS_HEADING_VALID;
- mm->heading = ((((msg[5] << 4) | (msg[6] >> 4)) & 0x007F) * 45) >> 4;
- }
- }
-
} else if (metype == 19) { // Airborne Velocity Message
// Presumably airborne if we get an Airborne Velocity Message
@@ -1076,23 +1054,62 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
mm->heading = ((((msg[5] & 0x03) << 8) | msg[6]) * 45) >> 7;
}
}
- } else if (mm->metype == 23) { // Test metype squawk field
- if (mm->mesub == 7) { // (see 1090-WP-15-20)
+
+ } else if (metype >= 5 && metype <= 22) { // Position Message
+ mm->raw_latitude = ((msg[6] & 3) << 15) | (msg[7] << 7) | (msg[8] >> 1);
+ mm->raw_longitude = ((msg[8] & 1) << 16) | (msg[9] << 8) | (msg[10]);
+ mm->bFlags |= (mm->msg[6] & 0x04) ? MODES_ACFLAGS_LLODD_VALID
+ : MODES_ACFLAGS_LLEVEN_VALID;
+ if (metype >= 9) { // Airborne
+ int AC12Field = ((msg[5] << 4) | (msg[6] >> 4)) & 0x0FFF;
+ mm->bFlags |= MODES_ACFLAGS_AOG_VALID;
+ if (AC12Field) {// Only attempt to decode if a valid (non zero) altitude is present
+ mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
+ mm->altitude = decodeAC12Field(AC12Field, &mm->unit);
+ }
+ } else { // Ground
+ int movement = ((msg[4] << 4) | (msg[5] >> 4)) & 0x007F;
+ mm->bFlags |= MODES_ACFLAGS_AOG_VALID | MODES_ACFLAGS_AOG;
+ if ((movement) && (movement < 125)) {
+ mm->bFlags |= MODES_ACFLAGS_SPEED_VALID;
+ mm->velocity = decodeMovementField(movement);
+ }
+
+ if (msg[5] & 0x08) {
+ mm->bFlags |= MODES_ACFLAGS_HEADING_VALID;
+ mm->heading = ((((msg[5] << 4) | (msg[6] >> 4)) & 0x007F) * 45) >> 4;
+ }
+ }
+
+ } else if (metype == 23) { // Test metype squawk field
+ if (mesub == 7) { // (see 1090-WP-15-20)
int ID13Field = (((msg[5] << 8) | msg[6]) & 0xFFF1)>>3;
if (ID13Field) {
mm->bFlags |= MODES_ACFLAGS_SQUAWK_VALID;
mm->modeA = decodeID13Field(ID13Field);
}
}
- } else if (mm->metype == 28) { // Emergency status squawk field
- if (mm->mesub == 1) {
+
+ } else if (metype == 24) { // Reserved for Surface System Status
+
+ } else if (metype == 28) { // Extended Squitter Aircraft Status
+ if (mesub == 1) { // Emergency status squawk field
int ID13Field = (((msg[5] << 8) | msg[6]) & 0x1FFF);
if (ID13Field) {
mm->bFlags |= MODES_ACFLAGS_SQUAWK_VALID;
mm->modeA = decodeID13Field(ID13Field);
}
}
- }
+
+ } else if (metype == 29) { // Aircraft Trajectory Intent
+
+ } else if (metype == 30) { // Aircraft Operational Coordination
+
+ } else if (metype == 31) { // Aircraft Operational Status
+
+ } else { // Other metypes
+
+ }
}
// Fields for DF20, DF21 Comm-B
@@ -1268,20 +1285,6 @@ void displayModesMessage(struct modesMessage *mm) {
printf(" Aircraft Type : %c%d\n", ('A' + 4 - mm->metype), mm->mesub);
printf(" Identification : %s\n", mm->flight);
- //} else if (mm->metype >= 5 && mm->metype <= 8) { // Surface position
-
- } else if (mm->metype >= 9 && mm->metype <= 18) { // Airborne position Baro
- printf(" F flag : %s\n", (mm->msg[6] & 0x04) ? "odd" : "even");
- printf(" T flag : %s\n", (mm->msg[6] & 0x08) ? "UTC" : "non-UTC");
- printf(" Altitude : %d feet\n", mm->altitude);
- if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) {
- printf(" Latitude : %f\n", mm->fLat);
- printf(" Longitude: %f\n", mm->fLon);
- } else {
- printf(" Latitude : %d (not decoded)\n", mm->raw_latitude);
- printf(" Longitude: %d (not decoded)\n", mm->raw_longitude);
- }
-
} else if (mm->metype == 19) { // Airborne Velocity
if (mm->mesub == 1 || mm->mesub == 2) {
printf(" EW status : %s\n", (mm->bFlags & MODES_ACFLAGS_EWSPEED_VALID) ? "Valid" : "Unavailable");
@@ -1305,7 +1308,17 @@ void displayModesMessage(struct modesMessage *mm) {
printf(" Unrecognized ME subtype: %d subtype: %d\n", mm->metype, mm->mesub);
}
- //} else if (mm->metype >= 20 && mm->metype <= 22) { // Airborne position GNSS
+ } else if (mm->metype >= 5 && mm->metype <= 22) { // Airborne position Baro
+ printf(" F flag : %s\n", (mm->msg[6] & 0x04) ? "odd" : "even");
+ printf(" T flag : %s\n", (mm->msg[6] & 0x08) ? "UTC" : "non-UTC");
+ printf(" Altitude : %d feet\n", mm->altitude);
+ if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) {
+ printf(" Latitude : %f\n", mm->fLat);
+ printf(" Longitude: %f\n", mm->fLon);
+ } else {
+ printf(" Latitude : %d (not decoded)\n", mm->raw_latitude);
+ printf(" Longitude: %d (not decoded)\n", mm->raw_longitude);
+ }
} else if (mm->metype == 28) { // Extended Squitter Aircraft Status
if (mm->mesub == 1) {
@@ -1343,20 +1356,6 @@ void displayModesMessage(struct modesMessage *mm) {
printf(" Aircraft Type : %c%d\n", ('A' + 4 - mm->metype), mm->mesub);
printf(" Identification : %s\n", mm->flight);
- //} else if (mm->metype >= 5 && mm->metype <= 8) { // Surface position
-
- } else if (mm->metype >= 9 && mm->metype <= 18) { // Airborne position Baro
- printf(" F flag : %s\n", (mm->msg[6] & 0x04) ? "odd" : "even");
- printf(" T flag : %s\n", (mm->msg[6] & 0x08) ? "UTC" : "non-UTC");
- printf(" Altitude : %d feet\n", mm->altitude);
- if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) {
- printf(" Latitude : %f\n", mm->fLat);
- printf(" Longitude: %f\n", mm->fLon);
- } else {
- printf(" Latitude : %d (not decoded)\n", mm->raw_latitude);
- printf(" Longitude: %d (not decoded)\n", mm->raw_longitude);
- }
-
} else if (mm->metype == 19) { // Airborne Velocity
if (mm->mesub == 1 || mm->mesub == 2) {
printf(" EW status : %s\n", (mm->bFlags & MODES_ACFLAGS_EWSPEED_VALID) ? "Valid" : "Unavailable");
@@ -1380,7 +1379,17 @@ void displayModesMessage(struct modesMessage *mm) {
printf(" Unrecognized ME subtype: %d subtype: %d\n", mm->metype, mm->mesub);
}
- //} else if (mm->metype >= 20 && mm->metype <= 22) { // Airborne position GNSS
+ } else if (mm->metype >= 5 && mm->metype <= 22) { // Ground or Airborne position, Baro or GNSS
+ printf(" F flag : %s\n", (mm->msg[6] & 0x04) ? "odd" : "even");
+ printf(" T flag : %s\n", (mm->msg[6] & 0x08) ? "UTC" : "non-UTC");
+ printf(" Altitude : %d feet\n", mm->altitude);
+ if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) {
+ printf(" Latitude : %f\n", mm->fLat);
+ printf(" Longitude: %f\n", mm->fLon);
+ } else {
+ printf(" Latitude : %d (not decoded)\n", mm->raw_latitude);
+ printf(" Longitude: %d (not decoded)\n", mm->raw_longitude);
+ }
} else {
printf(" Unrecognized ME type: %d subtype: %d\n", mm->metype, mm->mesub);
diff --git a/net_io.c b/net_io.c
index 2f4c950..df6c842 100644
--- a/net_io.c
+++ b/net_io.c
@@ -458,16 +458,20 @@ int decodeBinMessage(struct client *c, char *p) {
int msgLen = 0;
int j;
char ch;
+ char * ptr;
unsigned char msg[MODES_LONG_MSG_BYTES];
struct modesMessage mm;
MODES_NOTUSED(c);
memset(&mm, 0, sizeof(mm));
- if ((*p == '1') && (Modes.mode_ac)) { // skip ModeA/C unless user enables --modes-ac
+ ch = *p++; /// Get the message type
+ if (0x1A == ch) {p++;}
+
+ if ((ch == '1') && (Modes.mode_ac)) { // skip ModeA/C unless user enables --modes-ac
msgLen = MODEAC_MSG_BYTES;
- } else if (*p == '2') {
+ } else if (ch == '2') {
msgLen = MODES_SHORT_MSG_BYTES;
- } else if (*p == '3') {
+ } else if (ch == '3') {
msgLen = MODES_LONG_MSG_BYTES;
}
@@ -475,8 +479,10 @@ int decodeBinMessage(struct client *c, char *p) {
// Mark messages received over the internet as remote so that we don't try to
// pass them off as being received by this instance when forwarding them
mm.remote = 1;
- for (j = 0; j < 7; j++) { // Skip the message type and timestamp
- ch = *p++;
+
+ ptr = (char*) &mm.timestampMsg;
+ for (j = 0; j < 6; j++) { // Grab the timestamp (big endian format)
+ ptr[5-j] = ch = *p++;
if (0x1A == ch) {p++;}
}
diff --git a/ppup1090.c b/ppup1090.c
index 3a69bbf..c90e679 100644
--- a/ppup1090.c
+++ b/ppup1090.c
@@ -51,7 +51,8 @@ void ppup1090InitConfig(void) {
// Now initialise things that should not be 0/NULL to their defaults
Modes.check_crc = 1;
Modes.quiet = 1;
- strcpy(ppup1090.net_input_beast_ipaddr,PPUP1090_NET_OUTPUT_IP_ADDRESS);
+ Modes.bEnableDFLogging = 1;
+ strcpy(ppup1090.net_input_beast_ipaddr,PPUP1090_NET_OUTPUT_IP_ADDRESS);
Modes.net_input_beast_port = MODES_NET_OUTPUT_BEAST_PORT;
Modes.interactive_delete_ttl = MODES_INTERACTIVE_DELETE_TTL;
Modes.interactive_display_ttl = MODES_INTERACTIVE_DISPLAY_TTL;
@@ -71,6 +72,10 @@ void ppup1090Init(void) {
int iErr;
+ pthread_mutex_init(&Modes.pDF_mutex,NULL);
+ pthread_mutex_init(&Modes.data_mutex,NULL);
+ pthread_cond_init(&Modes.data_cond,NULL);
+
// Allocate the various buffers used by Modes
if ( NULL == (Modes.icao_cache = (uint32_t *) malloc(sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2)))
{
@@ -104,6 +109,7 @@ void ppup1090Init(void) {
modesInitErrorInfo();
// Setup the uploader - read the user paramaters from the coaa.h header file
+ coaa1090.ppIPAddr = ppup1090.net_pp_ipaddr;
coaa1090.fUserLat = MODES_USER_LATITUDE_DFLT;
coaa1090.fUserLon = MODES_USER_LONGITUDE_DFLT;
strcpy(coaa1090.strAuthCode,STR(USER_AUTHCODE));
@@ -126,6 +132,7 @@ void showHelp(void) {
"-----------------------------------------------------------------------------\n"
"--net-bo-ipaddr <IPv4> TCP Beast output listen IPv4 (default: 127.0.0.1)\n"
"--net-bo-port <port> TCP Beast output listen port (default: 30005)\n"
+ "--net-pp-ipaddr <IPv4> Plane Plotter LAN IPv4 Address (default: 0.0.0.0)\n"
"--quiet Disable output to stdout. Use for daemon applications\n"
"--help Show this help\n"
);
@@ -185,6 +192,8 @@ int main(int argc, char **argv) {
Modes.net_input_beast_port = atoi(argv[++j]);
} else if (!strcmp(argv[j],"--net-bo-ipaddr") && more) {
strcpy(ppup1090.net_input_beast_ipaddr, argv[++j]);
+ } else if (!strcmp(argv[j],"--net-pp-ipaddr") && more) {
+ inet_aton(argv[++j], (void *)&ppup1090.net_pp_ipaddr);
} else if (!strcmp(argv[j],"--quiet")) {
ppup1090.quiet = 1;
} else if (!strcmp(argv[j],"--help")) {
diff --git a/ppup1090.h b/ppup1090.h
index 8a6806d..6d0756d 100644
--- a/ppup1090.h
+++ b/ppup1090.h
@@ -45,6 +45,9 @@
#include <math.h>
#include <sys/time.h>
#include <sys/timeb.h>
+ #include <netinet/in.h>
+ #include <netinet/tcp.h>
+ #include <arpa/inet.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
@@ -69,19 +72,21 @@
// Program global state
struct { // Internal state
- int quiet;
+ int quiet;
// Networking
- char net_input_beast_ipaddr[32]; // IPv4 address or network name of server/RPi
+ uint32_t net_pp_ipaddr; // IPv4 address of PP instance
+ char net_input_beast_ipaddr[32]; // IPv4 address or network name of server/RPi
} ppup1090;
// COAA Initialisation structure
struct _coaa1090 {
- double fUserLat;
- double fUserLon;
- char strAuthCode[16];
- char strRegNo[16];
- char strVersion[16];
+ uint32_t ppIPAddr;
+ double fUserLat;
+ double fUserLon;
+ char strAuthCode[16];
+ char strRegNo[16];
+ char strVersion[16];
} coaa1090;
// ======================== function declarations =========================
diff --git a/view1090.c b/view1090.c
index 644245d..0b9b8b9 100644
--- a/view1090.c
+++ b/view1090.c
@@ -83,6 +83,21 @@ void view1090InitConfig(void) {
//
void view1090Init(void) {
+ pthread_mutex_init(&Modes.pDF_mutex,NULL);
+ pthread_mutex_init(&Modes.data_mutex,NULL);
+ pthread_cond_init(&Modes.data_cond,NULL);
+
+#ifdef _WIN32
+ if ( (!Modes.wsaData.wVersion)
+ && (!Modes.wsaData.wHighVersion) ) {
+ // Try to start the windows socket support
+ if (WSAStartup(MAKEWORD(2,1),&Modes.wsaData) != 0)
+ {
+ fprintf(stderr, "WSAStartup returned Error\n");
+ }
+ }
+#endif
+
// Allocate the various buffers used by Modes
if ( NULL == (Modes.icao_cache = (uint32_t *) malloc(sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2)))
{
@@ -262,6 +277,7 @@ int main(int argc, char **argv) {
#ifdef _WIN32
// Try to comply with the Copyright license conditions for binary distribution
if (!Modes.quiet) {showCopyright();}
+#define MSG_DONTWAIT 0
#endif
#ifndef _WIN32
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/dump1090.git
More information about the pkg-hamradio-commits
mailing list