From 5656777bdaa73e0c7a6b00e1e9c718d57c57d7be Mon Sep 17 00:00:00 2001 From: Rodrigo Osorio Date: Mon, 9 Nov 2015 07:54:02 +0100 Subject: [PATCH 1/2] Add ICAO registration country --- country_list.h | 207 +++++++++++++++++++++++++++++++++++++++++++++++++ dump1090.c | 30 +++++-- gmap.html | 1 + 3 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 country_list.h diff --git a/country_list.h b/country_list.h new file mode 100644 index 000000000..cd500ac68 --- /dev/null +++ b/country_list.h @@ -0,0 +1,207 @@ +enum blockSize { + BLK_1024 = 1024, + BLK_4096 = 4096, + BLK_32768 = 32768, + BLK_262144 = 262144, + BLK_1048576= 1048576 +}; + + +struct countryCodes { + char *code; + uint32_t len; + uint32_t icao_addr; + uint32_t icao_mask; +} countryList[] = { +{"ZW",BLK_1024,0x4000,0xfffc00}, +{"BW",BLK_1024,0x30000,0xfffc00}, +{"KM",BLK_1024,0x35000,0xfffc00}, +{"GW",BLK_1024,0x48000,0xfffc00}, +{"LS",BLK_1024,0x4a000,0xfffc00}, +{"MV",BLK_1024,0x5a000,0xfffc00}, +{"MR",BLK_1024,0x5e000,0xfffc00}, +{"MU",BLK_1024,0x60000,0xfffc00}, +{"QA",BLK_1024,0x6a000,0xfffc00}, +{"SC",BLK_1024,0x74000,0xfffc00}, +{"SL",BLK_1024,0x76000,0xfffc00}, +{"SZ",BLK_1024,0x7a000,0xfffc00}, +{"BJ",BLK_1024,0x94000,0xfffc00}, +{"CV",BLK_1024,0x96000,0xfffc00}, +{"DJ",BLK_1024,0x98000,0xfffc00}, +{"ST",BLK_1024,0x9e000,0xfffc00}, +{"BB",BLK_1024,0xaa000,0xfffc00}, +{"BZ",BLK_1024,0xab000,0xfffc00}, +{"VC",BLK_1024,0xbc000,0xfffc00}, +{"AG",BLK_1024,0xca000,0xfffc00}, +{"GD",BLK_1024,0xcc000,0xfffc00}, +{"NA",BLK_1024,0x201000,0xfffc00}, +{"ER",BLK_1024,0x202000,0xfffc00}, +{"CY",BLK_1024,0x4c8000,0xfffc00}, +{"LU",BLK_1024,0x4d0000,0xfffc00}, +{"MT",BLK_1024,0x4d2000,0xfffc00}, +{"MC",BLK_1024,0x4d4000,0xfffc00}, +{"SM",BLK_1024,0x500000,0xfffc00}, +{"AL",BLK_1024,0x501000,0xfffc00}, +{"HR",BLK_1024,0x501c00,0xfffc00}, +{"LV",BLK_1024,0x502c00,0xfffc00}, +{"LT",BLK_1024,0x503c00,0xfffc00}, +{"MD",BLK_1024,0x504c00,0xfffc00}, +{"SK",BLK_1024,0x505c00,0xfffc00}, +{"SI",BLK_1024,0x506c00,0xfffc00}, +{"UZ",BLK_1024,0x507c00,0xfffc00}, +{"BY",BLK_1024,0x510000,0xfffc00}, +{"EE",BLK_1024,0x511000,0xfffc00}, +{"MK",BLK_1024,0x512000,0xfffc00}, +{"BA",BLK_1024,0x513000,0xfffc00}, +{"GE",BLK_1024,0x514000,0xfffc00}, +{"TJ",BLK_1024,0x515000,0xfffc00}, +{"AM",BLK_1024,0x600000,0xfffc00}, +{"AZ",BLK_1024,0x600800,0xfffc00}, +{"KG",BLK_1024,0x601000,0xfffc00}, +{"TM",BLK_1024,0x601800,0xfffc00}, +{"BT",BLK_1024,0x680000,0xfffc00}, +{"FM",BLK_1024,0x681000,0xfffc00}, +{"MN",BLK_1024,0x682000,0xfffc00}, +{"KZ",BLK_1024,0x683000,0xfffc00}, +{"PW",BLK_1024,0x684000,0xfffc00}, +{"OM",BLK_1024,0x70c000,0xfffc00}, +{"BN",BLK_1024,0x895000,0xfffc00}, +{"SB",BLK_1024,0x897000,0xfffc00}, +{"00",BLK_1024,0x899000,0xfffc00}, +{"MH",BLK_1024,0x900000,0xfffc00}, +{"CK",BLK_1024,0x901000,0xfffc00}, +{"WS",BLK_1024,0x902000,0xfffc00}, +{"NR",BLK_1024,0xc8a000,0xfffc00}, +{"LC",BLK_1024,0xc8c000,0xfffc00}, +{"TO",BLK_1024,0xc8d000,0xfffc00}, +{"KI",BLK_1024,0xc8e000,0xfffc00}, +{"VU",BLK_1024,0xc90000,0xfffc00}, +{"00",BLK_1024,0xf09000,0xfffc00}, +{"MZ",BLK_4096,0x6000,0xfff000}, +{"BI",BLK_4096,0x32000,0xfff000}, +{"CM",BLK_4096,0x34000,0xfff000}, +{"CG",BLK_4096,0x36000,0xfff000}, +{"CI",BLK_4096,0x38000,0xfff000}, +{"GA",BLK_4096,0x3e000,0xfff000}, +{"ET",BLK_4096,0x40000,0xfff000}, +{"GQ",BLK_4096,0x42000,0xfff000}, +{"GH",BLK_4096,0x44000,0xfff000}, +{"GN",BLK_4096,0x46000,0xfff000}, +{"KE",BLK_4096,0x4c000,0xfff000}, +{"LR",BLK_4096,0x50000,0xfff000}, +{"MG",BLK_4096,0x54000,0xfff000}, +{"MW",BLK_4096,0x58000,0xfff000}, +{"ML",BLK_4096,0x5c000,0xfff000}, +{"NE",BLK_4096,0x62000,0xfff000}, +{"NG",BLK_4096,0x64000,0xfff000}, +{"UG",BLK_4096,0x68000,0xfff000}, +{"CF",BLK_4096,0x6c000,0xfff000}, +{"RW",BLK_4096,0x6e000,0xfff000}, +{"SN",BLK_4096,0x70000,0xfff000}, +{"SO",BLK_4096,0x78000,0xfff000}, +{"SD",BLK_4096,0x7c000,0xfff000}, +{"TZ",BLK_4096,0x80000,0xfff000}, +{"TD",BLK_4096,0x84000,0xfff000}, +{"TG",BLK_4096,0x88000,0xfff000}, +{"ZM",BLK_4096,0x8a000,0xfff000}, +{"CD",BLK_4096,0x8c000,0xfff000}, +{"AO",BLK_4096,0x90000,0xfff000}, +{"GM",BLK_4096,0x9a000,0xfff000}, +{"BF",BLK_4096,0x9c000,0xfff000}, +{"BS",BLK_4096,0xa8000,0xfff000}, +{"CO",BLK_4096,0xac000,0xfff000}, +{"CR",BLK_4096,0xae000,0xfff000}, +{"CU",BLK_4096,0xb0000,0xfff000}, +{"SV",BLK_4096,0xb2000,0xfff000}, +{"GT",BLK_4096,0xb4000,0xfff000}, +{"GY",BLK_4096,0xb6000,0xfff000}, +{"HT",BLK_4096,0xb8000,0xfff000}, +{"HN",BLK_4096,0xba000,0xfff000}, +{"JM",BLK_4096,0xbe000,0xfff000}, +{"NI",BLK_4096,0xc0000,0xfff000}, +{"PA",BLK_4096,0xc2000,0xfff000}, +{"DO",BLK_4096,0xc4000,0xfff000}, +{"TT",BLK_4096,0xc6000,0xfff000}, +{"SR",BLK_4096,0xc8000,0xfff000}, +{"IE",BLK_4096,0x4ca000,0xfff000}, +{"IS",BLK_4096,0x4cc000,0xfff000}, +{"AF",BLK_4096,0x700000,0xfff000}, +{"BD",BLK_4096,0x702000,0xfff000}, +{"MM",BLK_4096,0x704000,0xfff000}, +{"KW",BLK_4096,0x706000,0xfff000}, +{"LA",BLK_4096,0x708000,0xfff000}, +{"NP",BLK_4096,0x70a000,0xfff000}, +{"KH",BLK_4096,0x70e000,0xfff000}, +{"YE",BLK_4096,0x890000,0xfff000}, +{"BH",BLK_4096,0x894000,0xfff000}, +{"AE",BLK_4096,0x896000,0xfff000}, +{"PG",BLK_4096,0x898000,0xfff000}, +{"FJ",BLK_4096,0xc88000,0xfff000}, +{"CL",BLK_4096,0xe80000,0xfff000}, +{"EC",BLK_4096,0xe84000,0xfff000}, +{"PY",BLK_4096,0xe88000,0xfff000}, +{"PE",BLK_4096,0xe8c000,0xfff000}, +{"UY",BLK_4096,0xe90000,0xfff000}, +{"BO",BLK_4096,0xe94000,0xfff000}, +{"ZA",BLK_32768,0x8000,0xff8000}, +{"EG",BLK_32768,0x10000,0xff8000}, +{"LY",BLK_32768,0x18000,0xff8000}, +{"MA",BLK_32768,0x20000,0xff8000}, +{"TN",BLK_32768,0x28000,0xff8000}, +{"DZ",BLK_32768,0xa0000,0xff8000}, +{"MX",BLK_32768,0xd0000,0xff8000}, +{"VE",BLK_32768,0xd8000,0xff8000}, +{"AT",BLK_32768,0x440000,0xff8000}, +{"BE",BLK_32768,0x448000,0xff8000}, +{"BG",BLK_32768,0x450000,0xff8000}, +{"DK",BLK_32768,0x458000,0xff8000}, +{"FI",BLK_32768,0x460000,0xff8000}, +{"GR",BLK_32768,0x468000,0xff8000}, +{"HU",BLK_32768,0x470000,0xff8000}, +{"NO",BLK_32768,0x478000,0xff8000}, +{"NL",BLK_32768,0x480000,0xff8000}, +{"PL",BLK_32768,0x488000,0xff8000}, +{"PT",BLK_32768,0x490000,0xff8000}, +{"CZ",BLK_32768,0x498000,0xff8000}, +{"RO",BLK_32768,0x4a0000,0xff8000}, +{"SE",BLK_32768,0x4a8000,0xff8000}, +{"CH",BLK_32768,0x4b0000,0xff8000}, +{"TR",BLK_32768,0x4b8000,0xff8000}, +{"YU",BLK_32768,0x4c0000,0xff8000}, +{"UA",BLK_32768,0x508000,0xff8000}, +{"SA",BLK_32768,0x710000,0xff8000}, +{"KR",BLK_32768,0x718000,0xff8000}, +{"KP",BLK_32768,0x720000,0xff8000}, +{"IQ",BLK_32768,0x728000,0xff8000}, +{"IR",BLK_32768,0x730000,0xff8000}, +{"IL",BLK_32768,0x738000,0xff8000}, +{"JO",BLK_32768,0x740000,0xff8000}, +{"LB",BLK_32768,0x748000,0xff8000}, +{"MY",BLK_32768,0x750000,0xff8000}, +{"PH",BLK_32768,0x758000,0xff8000}, +{"PK",BLK_32768,0x760000,0xff8000}, +{"SG",BLK_32768,0x768000,0xff8000}, +{"LK",BLK_32768,0x770000,0xff8000}, +{"SY",BLK_32768,0x778000,0xff8000}, +{"TH",BLK_32768,0x880000,0xff8000}, +{"VN",BLK_32768,0x888000,0xff8000}, +{"ID",BLK_32768,0x8a0000,0xff8000}, +{"NZ",BLK_32768,0xc80000,0xff8000}, +{"00",BLK_32768,0xf00000,0xff8000}, +{"IT",BLK_262144,0x300000,0xfc0000}, +{"ES",BLK_262144,0x340000,0xfc0000}, +{"FR",BLK_262144,0x380000,0xfc0000}, +{"DE",BLK_262144,0x3c0000,0xfc0000}, +{"GB",BLK_262144,0x400000,0xfc0000}, +{"CN",BLK_262144,0x780000,0xfc0000}, +{"AU",BLK_262144,0x7c0000,0xfc0000}, +{"IN",BLK_262144,0x800000,0xfc0000}, +{"JP",BLK_262144,0x840000,0xfc0000}, +{"CA",BLK_262144,0xc00000,0xfc0000}, +{"AR",BLK_262144,0xe00000,0xfc0000}, +{"BR",BLK_262144,0xe40000,0xfc0000}, +{"RU",BLK_1048576,0x100000,0xf00000}, +{"US",BLK_1048576,0xa00000,0xf00000}, +}; + +#define CTALEN() (sizeof(countryList) / sizeof(struct countryCodes)) diff --git a/dump1090.c b/dump1090.c index 7fa5327a3..643ae895c 100644 --- a/dump1090.c +++ b/dump1090.c @@ -45,6 +45,7 @@ #include #include "rtl-sdr.h" #include "anet.h" +#include "country_list.h" #define MODES_DEFAULT_RATE 2000000 #define MODES_DEFAULT_FREQ 1090000000 @@ -120,6 +121,7 @@ struct aircraft { double lat, lon; /* Coordinated obtained from CPR encoded data. */ long long odd_cprtime, even_cprtime; struct aircraft *next; /* Next aircraft in our linked list. */ + struct countryCodes * reg; /* aircraft registretion country */ }; /* Program global state. */ @@ -1107,6 +1109,17 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) { mm->phase_corrected = 0; /* Set to 1 by the caller if needed. */ } +/* Extract the country code from the ICAO adress. */ +struct countryCodes * icaoToCountyCode(uint32_t addr) +{ + unsigned int i; + for (i=0; i < CTALEN(); i++) { + if((addr & countryList[i].icao_mask) == countryList[i].icao_addr) + return &countryList[i]; + } + return NULL; +} + /* This function gets a decoded Mode S Message and prints it on the screen * in a human readable format. */ void displayModesMessage(struct modesMessage *mm) { @@ -1582,6 +1595,7 @@ struct aircraft *interactiveCreateAircraft(uint32_t addr) { a->lon = 0; a->seen = time(NULL); a->messages = 0; + a->reg = icaoToCountyCode(addr); a->next = NULL; return a; } @@ -1807,8 +1821,8 @@ void interactiveShowData(void) { printf("\x1b[H\x1b[2J"); /* Clear the screen */ printf( -"Hex Flight Altitude Speed Lat Lon Track Messages Seen %s\n" -"--------------------------------------------------------------------------------\n", +"Hex Reg Flight Altitude Speed Lat Lon Track Messages Seen %s\n" +"-----------------------------------------------------------------------------------\n", progress); while(a && count < Modes.interactive_rows) { @@ -1820,8 +1834,10 @@ void interactiveShowData(void) { speed *= 1.852; } - printf("%-6s %-8s %-9d %-7d %-7.03f %-7.03f %-3d %-9ld %d sec\n", - a->hexaddr, a->flight, altitude, speed, + printf("%-6s %-3s %-8s %-9d %-7d %-7.03f %-7.03f %-3d %-9ld %d sec\n", + a->hexaddr, + a->reg?a->reg->code:" ", + a->flight, altitude, speed, a->lat, a->lon, a->track, a->messages, (int)(now - a->seen)); a = a->next; @@ -2152,10 +2168,12 @@ char *aircraftsToJson(int *len) { if (a->lat != 0 && a->lon != 0) { l = snprintf(p,buflen, - "{\"hex\":\"%s\", \"flight\":\"%s\", \"lat\":%f, " + "{\"hex\":\"%s\", \"reg\":\"%s\",\"flight\":\"%s\", \"lat\":%f, " "\"lon\":%f, \"altitude\":%d, \"track\":%d, " "\"speed\":%d},\n", - a->hexaddr, a->flight, a->lat, a->lon, a->altitude, a->track, + a->hexaddr, + a->reg?a->reg->code:"", + a->flight, a->lat, a->lon, a->altitude, a->track, a->speed); p += l; buflen -= l; /* Resize if needed. */ diff --git a/gmap.html b/gmap.html index b39a30a22..2434a03d9 100644 --- a/gmap.html +++ b/gmap.html @@ -93,6 +93,7 @@ html += 'Altitude: '+p.altitude+' feet
'; html += 'Speed: '+p.speed+' knots
'; html += 'Coordinates: '+p.lat+', '+p.lon+'
'; + html += 'Registration: '+p.reg+'
'; i.innerHTML = html; } From b6ecedbe2f92df7a019dce00ceacfc320b5422a7 Mon Sep 17 00:00:00 2001 From: Rodrigo Osorio Date: Fri, 27 Nov 2015 22:54:29 +0100 Subject: [PATCH 2/2] Fix json buffer reallocation issue Instead of try to guess if we will need more space for future inserions, wait for exhaustion and allocate twice the required space. This is far from perfect but works better. Now Json output works all the time. --- dump1090.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dump1090.c b/dump1090.c index 643ae895c..508804038 100644 --- a/dump1090.c +++ b/dump1090.c @@ -2175,13 +2175,18 @@ char *aircraftsToJson(int *len) { a->reg?a->reg->code:"", a->flight, a->lat, a->lon, a->altitude, a->track, a->speed); - p += l; buflen -= l; + /* Resize if needed. */ - if (buflen < 256) { - int used = p-buf; - buflen += 1024; /* Our increment. */ - buf = realloc(buf,used+buflen); - p = buf+used; + if (l >= buflen) { + int used = p-buf; + buflen += (2*l); /* Our increment. */ + buf = realloc(buf,used+buflen); + if (buf == NULL) exit(1); + p = buf+used; + /* try to add the current airplane again */ + continue; + } else { + p += l; buflen -= l; } } a = a->next;