From 0f582ecc3add02132f80bbaa4582a0287aca500f Mon Sep 17 00:00:00 2001 From: Rodrigo Osorio Date: Mon, 9 Nov 2015 07:54:02 +0100 Subject: [PATCH] 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; }