diff --git a/src/peripherals/bsp.c b/src/peripherals/bsp.c index c609547d2..34849629c 100644 --- a/src/peripherals/bsp.c +++ b/src/peripherals/bsp.c @@ -352,7 +352,7 @@ void BSP_sensor_Init(void) IWDG_reset(); // Initialise the geofence permissions mask - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; read_geofence_settings_in_eeprom(values); playback_hw_init(); diff --git a/src/peripherals/eeprom_settings_manager.c b/src/peripherals/eeprom_settings_manager.c index 0758f0288..c9f87fdcd 100644 --- a/src/peripherals/eeprom_settings_manager.c +++ b/src/peripherals/eeprom_settings_manager.c @@ -19,6 +19,33 @@ #include "bsp.h" #include "eeprom_settings_manager.h" +static const tx_permission_t default_geofence_settings[n_polygons] = { + [AS920923_PHILIPPINES_polygon] = TX_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_OK, + [EU863870_NORTH_KOREA_polygon] = TX_NOT_OK, + [OUTSIDE_polygon] = TX_NOT_OK, +}; + /** * @brief Get the eeprom stored lorwan region * @@ -60,33 +87,24 @@ bool update_geofence_settings_in_eeprom(uint8_t *settings_bytes, uint16_t size) /** * @brief Reads and initialised the geofence module with the tx enable/disable settings * from EEPROM. Fills passed buffer with the settings. Ensure buffer passed is - * of size N_POLYGONS * sizeof(bool) + * of size n_polygons * sizeof(tx_permission_t) * - * @param values Pointer to buffer that will be filled with the bool enable/disable setting + * @param values Pointer to buffer that will be filled with the tx_permission_t setting */ -void read_geofence_settings_in_eeprom(bool *values) +void read_geofence_settings_in_eeprom(tx_permission_t *values) { + // todo: check non-null // read settings stored in EEPROM geofence_settings_t geofence_settings; NvmmRead((uint8_t *)&geofence_settings, TX_PERMISSIONS_LEN, TX_PERMISSIONS_ADDR); + uint16_t sizeof_values = sizeof(geofence_settings.values); // Use eeprom stored values only if CRC is correct. Else assume the default settings if (is_crc_correct(sizeof(geofence_settings_t), (void *)&geofence_settings)) { - memcpy(values, geofence_settings.values, N_POLYGONS * sizeof(bool)); - } - else - { - - bool default_geofence_settings[N_POLYGONS] = {true, true, true, true, true, true, - true, true, true, true, true, true, - true, true, true, true, true, true, - true, true, true, true, false}; - - memcpy(values, default_geofence_settings, N_POLYGONS * sizeof(bool)); + memcpy(values, geofence_settings.values, sizeof_values); + geofence_init_with_settings(values); } - - geofence_init_with_settings(values); } /** @@ -220,7 +238,7 @@ uint8_t get_settings_crc() } // CRC of tx enable/disable settings for different regions. - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; read_geofence_settings_in_eeprom(values); crc = Crc8Update(crc, (uint8_t *)values, sizeof(values)); diff --git a/src/peripherals/eeprom_settings_manager.h b/src/peripherals/eeprom_settings_manager.h index 4e77bd925..5abfe77eb 100644 --- a/src/peripherals/eeprom_settings_manager.h +++ b/src/peripherals/eeprom_settings_manager.h @@ -19,6 +19,7 @@ extern "C" #include "stdint.h" #include "stdbool.h" #include "LoRaWAN_config_switcher.h" +#include "geofence.h" typedef struct { @@ -26,18 +27,16 @@ extern "C" uint32_t Crc32; } tx_interval_eeprom_t; -#define N_POLYGONS 23 - typedef struct { - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; uint32_t Crc32; } geofence_settings_t; bool update_device_tx_interval_in_eeprom(uint32_t address, uint32_t interval_ms); uint32_t read_tx_interval_in_eeprom(uint32_t address, uint32_t default_value); bool update_geofence_settings_in_eeprom(uint8_t *settings, uint16_t size); - void read_geofence_settings_in_eeprom(bool *values); + void read_geofence_settings_in_eeprom(tx_permission_t *values); void retrieve_eeprom_stored_lorawan_region(void); void set_eeprom_stored_lorwan_region(void); bool update_device_credentials_to_eeprom(network_keys_t keys, registered_devices_t registered_device); diff --git a/src/peripherals/geofence.c b/src/peripherals/geofence.c index 72fb8b827..f32aa20b1 100644 --- a/src/peripherals/geofence.c +++ b/src/peripherals/geofence.c @@ -34,52 +34,38 @@ /* Global variables definitions go here */ -// GEOFENCE variables -/* The world is split into polygons e.g. EU863870_EUROPE_polygon. - * Multiple polygons can have the same LoRa region settings. E.g. LORAMAC_REGION_EU868. - * Keeps track of which polygon the tracker is in, and if it changes to another polygon, - * all LoRa settings are reinitialised when the balloon enters another polygon. - * - */ - -/*! - * Polygon region enumeration - */ -typedef enum polygon_t -{ - AS920923_PHILIPPINES_polygon, - US902928_NAMERICA_polygon, - AS923925_BRUNEI_polygon, - AS923925_TAIWAN_polygon, - AS923925_INDONESIA_polygon, - AS923925_THAILAND_polygon, - US902928_ARGENTINA_polygon, - AU915928_BRAZIL_polygon, - AU915928_CHILE_polygon, - CN779787_CHINA_polygon, - IN865867_INDIA_polygon, - AS920923_JAPAN_polygon, - KR920923_SKOREA_polygon, - AS920923_MALAYSIASG_polygon, - AU915928_AUSTRALIA_polygon, - RU864870_RUSSIA_polygon, - EU863870_EUROPE_polygon, - US902928_GUAM_polygon, - US902928_ANTARTICA_polygon, - AS920923_ISRAEL_polygon, - US902928_MALDIVES_polygon, - EU863870_UKRAINE_polygon, - OUTSIDE_polygon, - n_polygons, -} Polygon_t; - /** * @brief Transmission enable/disable mask for each region. Each * boolean value corresponds to each enum value in Polygon_t. * By default, transmissions are disabled over regions * outside of the geofence regions. */ -bool tx_permissions_for_regions[n_polygons]; +static tx_permission_t tx_permissions_for_regions[n_polygons] = { + [AS920923_PHILIPPINES_polygon] = TX_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_OK, + [EU863870_NORTH_KOREA_polygon] = TX_NOT_OK, + [OUTSIDE_polygon] = TX_NOT_OK, +}; geofence_status_t current_geofence_status = { @@ -425,7 +411,7 @@ static const float AS920923_JAPAN_F[32] = { }; -static const float KR920923_SKOREA_F[18] = { +static const float KR920923_SKOREA_F[22] = { 122.94545, 36.60046, 122.59912, @@ -436,8 +422,12 @@ static const float KR920923_SKOREA_F[18] = { 35.18414, 131.42570, 38.21762, - 131.67979, - 41.62004, + 131.84483, + 41.61509, + 130.90107, + 42.36039, + 129.65493, + 40.70374, 127.96554, 39.81694, 128.33108, @@ -807,6 +797,34 @@ static const float EU863870_UKRAINE_F[46] = { }; +static const float EU863870_NORTH_KOREA_F[24] = { + 124.16708, + 39.74409, + 124.86613, + 39.40398, + 124.56884, + 38.03067, + 125.59527, + 37.58797, + 128.25518, + 38.53998, + 127.77692, + 39.27210, + 127.66038, + 39.73660, + 129.59331, + 40.73516, + 129.92897, + 41.36654, + 130.75795, + 42.26509, + 130.24571, + 43.24406, + 124.16708, + 39.74409, + +}; + /* ==================================================================== */ /* ========================== private data ============================ */ /* ==================================================================== */ @@ -1025,6 +1043,11 @@ Polygon_t get_polygon(float latitude, float longitude) current_poly = US902928_MALDIVES_polygon; } + else if (pointInPolygonF(12, EU863870_NORTH_KOREA_F, latitude, longitude) == 1) + { + current_poly = EU863870_NORTH_KOREA_polygon; + } + return current_poly; } @@ -1037,11 +1060,12 @@ Polygon_t get_polygon(float latitude, float longitude) */ tx_permission_t get_permissions(Polygon_t currentpoly) { - // then lookup value. Danger, there is no bounds validation for current poly. Can cause corruption. - bool can_transmit = tx_permissions_for_regions[currentpoly]; - - // then return permission - return can_transmit ? TX_OK : TX_NOT_OK; + tx_permission_t result = TX_OK; // failsafe by allowing TX + if (currentpoly < n_polygons) + { + result = tx_permissions_for_regions[currentpoly]; + } + return result; } static void set_current_loramac_region_from_polygon(Polygon_t current_poly) @@ -1127,7 +1151,9 @@ static void set_current_loramac_region_from_polygon(Polygon_t current_poly) case EU863870_UKRAINE_polygon: current_geofence_status.current_loramac_region = LORAMAC_REGION_EU868; break; - + case EU863870_NORTH_KOREA_polygon: + current_geofence_status.current_loramac_region = LORAMAC_REGION_EU868; + break; case OUTSIDE_polygon: current_geofence_status.current_loramac_region = LORAMAC_REGION_EU868; break; @@ -1153,7 +1179,7 @@ tx_permission_t get_current_tx_permission() return current_geofence_status.tx_permission; } -void geofence_init_with_settings(bool *settings) +void geofence_init_with_settings(tx_permission_t *settings) { - memcpy(tx_permissions_for_regions, settings, n_polygons * sizeof(bool)); + memcpy(tx_permissions_for_regions, settings, sizeof(tx_permissions_for_regions)); } diff --git a/src/peripherals/geofence.h b/src/peripherals/geofence.h index 95d24fad0..025b0a1a9 100644 --- a/src/peripherals/geofence.h +++ b/src/peripherals/geofence.h @@ -44,7 +44,7 @@ extern "C" typedef enum { - TX_OK = 0, + TX_OK = 0, // Default value is TX_OK. If this value is uninitialised, it will failsafe to TX_OK. TX_NOT_OK } tx_permission_t; @@ -56,6 +56,43 @@ extern "C" } geofence_status_t; + /* The world is split into polygons e.g. EU863870_EUROPE_polygon. + * Multiple polygons can have the same LoRa region settings. E.g. LORAMAC_REGION_EU868. + * Keeps track of which polygon the tracker is in, and if it changes to another polygon, + * all LoRa settings are reinitialised when the balloon enters another polygon. + */ + /*! + * Polygon region enumeration + */ + typedef enum polygon_t + { + AS920923_PHILIPPINES_polygon, + US902928_NAMERICA_polygon, + AS923925_BRUNEI_polygon, + AS923925_TAIWAN_polygon, + AS923925_INDONESIA_polygon, + AS923925_THAILAND_polygon, + US902928_ARGENTINA_polygon, + AU915928_BRAZIL_polygon, + AU915928_CHILE_polygon, + CN779787_CHINA_polygon, + IN865867_INDIA_polygon, + AS920923_JAPAN_polygon, + KR920923_SKOREA_polygon, + AS920923_MALAYSIASG_polygon, + AU915928_AUSTRALIA_polygon, + RU864870_RUSSIA_polygon, + EU863870_EUROPE_polygon, + US902928_GUAM_polygon, + US902928_ANTARTICA_polygon, + AS920923_ISRAEL_polygon, + US902928_MALDIVES_polygon, + EU863870_UKRAINE_polygon, + EU863870_NORTH_KOREA_polygon, + OUTSIDE_polygon, + n_polygons, + } Polygon_t; + /* ==================================================================== */ /* ======================= public functions =========================== */ /* ==================================================================== */ @@ -63,7 +100,7 @@ extern "C" /* Function prototypes for public (external) functions go here */ void update_geofence_position(float latitude, float longitude); - void geofence_init_with_settings(bool *settings); + void geofence_init_with_settings(tx_permission_t *settings); LoRaMacRegion_t get_current_loramac_region(void); as923_subbands_t get_as923_subband(void); void set_current_loramac_region(LoRaMacRegion_t region); diff --git a/tests/geofence_ut.cpp b/tests/geofence_ut.cpp index 689ecd14d..ea71f4bb9 100644 --- a/tests/geofence_ut.cpp +++ b/tests/geofence_ut.cpp @@ -12,7 +12,7 @@ extern "C" TEST_GROUP(test_get_current_lorawan_region){ void setup(){ - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; read_geofence_settings_in_eeprom(values); } @@ -511,7 +511,7 @@ TEST(test_get_current_lorawan_region, Ukraine) TEST_GROUP(test_update_geofence_settings){ void setup(){ - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; read_geofence_settings_in_eeprom(values); } @@ -522,14 +522,6 @@ void teardown() } ; -/** - * @brief Ensure the #define N_POLYGONS is the same as the enum n_polygons - * - */ -TEST(test_update_geofence_settings, MUST_PASS_ensure_n_polygons_is_correct) -{ - CHECK_EQUAL(N_POLYGONS, get_n_polygons()); -} /** * @brief Test by default if it disables tx over North Korea. @@ -558,14 +550,32 @@ TEST(test_update_geofence_settings, check_defaults_mask_tx_enabled_location) TEST(test_update_geofence_settings, check_enable_later_north_korea) { geofence_settings_t enabled_north_korea = { - .values = {true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true}, // North Korea falls outside of any polygons. + .values = { + [AS920923_PHILIPPINES_polygon] = TX_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_OK, + [EU863870_NORTH_KOREA_polygon] = TX_OK, + [OUTSIDE_polygon] = TX_NOT_OK, + }, .Crc32 = 100, // dummy CRC }; geofence_init_with_settings(enabled_north_korea.values); @@ -581,14 +591,32 @@ TEST(test_update_geofence_settings, check_enable_later_north_korea) TEST(test_update_geofence_settings, check_disable_later_Philipines) { geofence_settings_t disabled_phillipines = { - .values = {false, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - true, true, true, - false, false}, + .values = { + [AS920923_PHILIPPINES_polygon] = TX_NOT_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_OK, + [EU863870_NORTH_KOREA_polygon] = TX_NOT_OK, + [OUTSIDE_polygon] = TX_NOT_OK, + }, .Crc32 = 100, // dummy CRC }; geofence_init_with_settings(disabled_phillipines.values); diff --git a/tests/test_eeprom_settings_manager.cpp b/tests/test_eeprom_settings_manager.cpp index 16c263e5d..16d0d4062 100644 --- a/tests/test_eeprom_settings_manager.cpp +++ b/tests/test_eeprom_settings_manager.cpp @@ -54,12 +54,32 @@ TEST(test_eeprom_settings_manager, test_eeprom_unchanged_crc) uint8_t before_crc = get_settings_crc(); // Geofence settings are still default values - bool geofence_settings[N_POLYGONS] = {true, true, true, true, true, - true, true, true, true, true, - true, true, true, true, true, - true, true, true, true, true, - true, true, false}; - + static const tx_permission_t geofence_settings[n_polygons] = { + [AS920923_PHILIPPINES_polygon] = TX_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_OK, + [EU863870_NORTH_KOREA_polygon] = TX_NOT_OK, + [OUTSIDE_polygon] = TX_NOT_OK, + }; update_geofence_settings_in_eeprom((uint8_t *)geofence_settings, sizeof(geofence_settings)); /* Get the crc8 and confirm that it has the same CRC */ diff --git a/tests/uplink_commands_ut.cpp b/tests/uplink_commands_ut.cpp index adea925c0..5e6f597dd 100644 --- a/tests/uplink_commands_ut.cpp +++ b/tests/uplink_commands_ut.cpp @@ -288,14 +288,35 @@ TEST(uplink_commands, verify_geofence_mask_is_changed_correctly) * transmissions over North Korea * */ - uint8_t length_of_uplink = N_POLYGONS * sizeof(bool); + uint8_t length_of_uplink = n_polygons * sizeof(bool); uint8_t simulated_downlink_from_ground[length_of_uplink]; - bool instructions[N_POLYGONS] = { - true, true, true, true, true, true, - true, true, true, true, true, true, - true, true, true, true, true, true, - true, true, true, true, true}; + static const tx_permission_t instructions[n_polygons] = { + [AS920923_PHILIPPINES_polygon] = TX_OK, + [US902928_NAMERICA_polygon] = TX_OK, + [AS923925_BRUNEI_polygon] = TX_OK, + [AS923925_TAIWAN_polygon] = TX_OK, + [AS923925_INDONESIA_polygon] = TX_OK, + [AS923925_THAILAND_polygon] = TX_OK, + [US902928_ARGENTINA_polygon] = TX_OK, + [AU915928_BRAZIL_polygon] = TX_OK, + [AU915928_CHILE_polygon] = TX_OK, + [CN779787_CHINA_polygon] = TX_OK, + [IN865867_INDIA_polygon] = TX_OK, + [AS920923_JAPAN_polygon] = TX_OK, + [KR920923_SKOREA_polygon] = TX_OK, + [AS920923_MALAYSIASG_polygon] = TX_OK, + [AU915928_AUSTRALIA_polygon] = TX_OK, + [RU864870_RUSSIA_polygon] = TX_OK, + [EU863870_EUROPE_polygon] = TX_OK, + [US902928_GUAM_polygon] = TX_OK, + [US902928_ANTARTICA_polygon] = TX_OK, + [AS920923_ISRAEL_polygon] = TX_OK, + [US902928_MALDIVES_polygon] = TX_OK, + [EU863870_UKRAINE_polygon] = TX_NOT_OK, + [EU863870_NORTH_KOREA_polygon] = TX_OK, + [OUTSIDE_polygon] = TX_NOT_OK, + }; /** * @brief Set the simulated downlink @@ -317,7 +338,7 @@ TEST(uplink_commands, verify_geofence_mask_is_changed_correctly) */ OnRxData(&appData, &LmHandlerRxParams); - bool values[N_POLYGONS]; + tx_permission_t values[n_polygons]; read_geofence_settings_in_eeprom(values); update_geofence_position(39.0392, 125.7625); // Pyongyang diff --git a/util_scripts/geofence.kml b/util_scripts/geofence.kml index c06bcb14d..eaca404b1 100644 --- a/util_scripts/geofence.kml +++ b/util_scripts/geofence.kml @@ -2,10 +2,9 @@ geofence - + - + normal - #__managed_style_0BA4C42C3C206C5C2FAB + #__managed_style_1122557EAC26FB17ACA0 highlight - #__managed_style_12CE4D92CE206C5C2FAB + #__managed_style_26643AE47026FB17ACA0 - - - + + + normal + #poly-000000-1200-77-nodesc-normal + + + highlight + #poly-000000-1200-77-nodesc-highlight + + + - + + - + normal - #poly-FFEA00-2000-77-nodesc-normal + #poly-1A237E-2000-77-nodesc-normal highlight - #poly-FFEA00-2000-77-nodesc-highlight + #poly-1A237E-2000-77-nodesc-highlight - + + + + + + + + + normal - #poly-000000-1200-77-nodesc-normal + #__managed_style_1D68A668DB26FB17AC9F highlight - #poly-000000-1200-77-nodesc-highlight + #__managed_style_20260B40BC26FB17AC9F - - + - - - - normal - #poly-CE93D8-2000-77-nodesc-normal - - - highlight - #poly-CE93D8-2000-77-nodesc-highlight - - - - - - - normal - #poly-7CB342-2000-77-nodesc-normal - - - highlight - #poly-7CB342-2000-77-nodesc-highlight - - - - - normal - #poly-87CEAC-2000-77-nodesc-normal - - - highlight - #poly-87CEAC-2000-77-nodesc-highlight - - - - - - - - - - - - - normal - #poly-9C27B0-1200-77-nodesc-normal - - - highlight - #poly-9C27B0-1200-77-nodesc-highlight - - - + normal - #poly-880E4F-2000-77-nodesc-normal + #poly-CE93D8-2000-77-nodesc-normal highlight - #poly-880E4F-2000-77-nodesc-highlight + #poly-CE93D8-2000-77-nodesc-highlight - + normal - #__managed_style_1F2CE66292206C5C2FA9 + #poly-B2EBF2-2000-77-nodesc-normal highlight - #__managed_style_261BA41B02206C5C2FA9 + #poly-B2EBF2-2000-77-nodesc-highlight - - - + normal - #poly-1A237E-2000-77-nodesc-normal + #poly-880E4F-2000-77-nodesc-normal highlight - #poly-1A237E-2000-77-nodesc-highlight + #poly-880E4F-2000-77-nodesc-highlight - - + normal - #poly-3949AB-2000-77-nodesc-normal + #poly-7CB342-2000-77-nodesc-normal highlight - #poly-3949AB-2000-77-nodesc-highlight + #poly-7CB342-2000-77-nodesc-highlight - + + + normal + #__managed_style_43AA067DBE26FB17AC9F + + + highlight + #__managed_style_5C4C69B8E126FB17AC9F + + - - - - - - + normal - #poly-B2EBF2-2000-77-nodesc-normal + #poly-87CEAC-2000-77-nodesc-normal highlight - #poly-B2EBF2-2000-77-nodesc-highlight + #poly-87CEAC-2000-77-nodesc-highlight - + + + normal + #poly-FFEA00-2000-77-nodesc-normal + + + highlight + #poly-FFEA00-2000-77-nodesc-highlight + + - + + + normal + #poly-9C27B0-1200-77-nodesc-normal + + + highlight + #poly-9C27B0-1200-77-nodesc-highlight + + - - - normal - #poly-FF5252-2000-77-nodesc-normal - - - highlight - #poly-FF5252-2000-77-nodesc-highlight - - - - - - - normal - #__managed_style_104CDAFF68206C5C2FAA - - - highlight - #__managed_style_2DAF3C1CA4206C5C2FAA - - - - + normal - #poly-000000-2000-77-nodesc-normal + #poly-FF5252-2000-77-nodesc-normal highlight - #poly-000000-2000-77-nodesc-highlight + #poly-FF5252-2000-77-nodesc-highlight @@ -725,7 +725,7 @@ AS920-923_JAPAN - #__managed_style_0BE504CF3C206C5C2FA9 + #__managed_style_016DFEA8EA26FB17AC9F @@ -742,9 +742,8 @@ - 1 - 122.945455,36.600459,0 122.599124,32.473613,0 126.133817,32.605336,0 129.468404,35.184136,0 131.425696,38.217623,0 131.679794,41.620036,0 127.965536,39.816944,0 128.331082,38.53374,0 122.945455,36.600459,0 + 122.945455,36.600459,0 122.599124,32.473613,0 126.133817,32.605336,0 129.468404,35.184136,0 131.425696,38.217623,0 131.8448330756216,41.61508613768319,0 130.9010739199294,42.36039447527702,0 129.6549296368114,40.70373855307114,0 127.965536,39.816944,0 128.331082,38.53374,0 122.945455,36.600459,0 @@ -806,7 +805,7 @@ US902-928_GUAM - #__managed_style_07BECFF910206C5C2FAA + #__managed_style_3B3F9B1A3C26FB17AC9F @@ -842,7 +841,7 @@ 668317.9679750651 absolute - #__managed_style_3776E77E93206C5C2FAA + #__managed_style_0F7485DD8C26FB17ACA0 @@ -865,7 +864,7 @@ 6082097.131372691 absolute - #__managed_style_3776E77E93206C5C2FAA + #__managed_style_0F7485DD8C26FB17ACA0 @@ -888,12 +887,35 @@ 2890758.348155916 absolute - #__managed_style_3776E77E93206C5C2FAA + #__managed_style_0F7485DD8C26FB17ACA0 + + + + + 23.56070334750491,51.52339542849054,-26.54839187682323 23.97834365726641,50.47995531671017,64.76627663048656 22.64804609176132,49.41854974465313,-290.8014189601843 22.08500474074314,48.38806679169764,-555.0203591369122 23.64356970669406,47.8822618021443,181.3243180825767 25.86950314806064,47.65782137554923,1089.438848225812 27.02386202601588,48.3420070542892,-142.7254448976629 28.96877775956812,47.91685077269667,-201.6900173032766 29.96648846831203,46.55167636313,939.4124651912442 28.42077496017039,45.83573220544856,-416.8170037922622 28.16426284029453,45.1234460709101,687.2959801093706 29.87945287690174,44.8200468163233,98.24747623518675 33.17472369395597,44.28230731213979,-1752.893637234473 35.65835802518375,44.40044058872738,-554.4020614174158 38.3572054407473,47.12221088589286,646.1818811160567 40.08039306635287,48.01017315383601,-48.77843790988916 40.53633668095822,49.33750553170302,-30.71691055029555 37.51445855058526,50.40559624661842,126.5269892832724 33.90838849096268,52.44803171543372,427.1710340832335 30.86254270532443,52.20353672504333,919.4949614620284 30.04236666854612,51.63257725263867,475.8350702372484 25.01649289652931,52.03999418857604,224.6433391802126 23.56070334750491,51.52339542849054,-26.54839187682323 + + + + + + + EU863-870_NORTH_KOREA + + 125.6408140213697 + 38.96659963959431 + 203.1580948815654 + 0 + 0 + 35 + 2382946.933434606 + absolute + + #__managed_style_0F7485DD8C26FB17ACA0 - 23.56070334750491,51.52339542849054,-26.54839187682323 23.97834365726641,50.47995531671017,64.76627663048656 22.64804609176132,49.41854974465313,-290.8014189601843 22.08500474074314,48.38806679169764,-555.0203591369122 23.64356970669406,47.8822618021443,181.3243180825767 25.86950314806064,47.65782137554923,1089.438848225812 27.02386202601588,48.3420070542892,-142.7254448976629 28.96877775956812,47.91685077269667,-201.6900173032766 29.96648846831203,46.55167636313001,939.4124651912442 28.42077496017039,45.83573220544856,-416.8170037922622 28.16426284029453,45.1234460709101,687.2959801093706 29.87945287690174,44.8200468163233,98.24747623518675 33.17472369395597,44.28230731213979,-1752.893637234473 35.65835802518375,44.40044058872738,-554.4020614174158 38.3572054407473,47.12221088589286,646.1818811160567 40.08039306635287,48.01017315383601,-48.77843790988916 40.53633668095822,49.33750553170302,-30.71691055029555 37.51445855058526,50.40559624661842,126.5269892832724 33.90838849096268,52.44803171543372,427.1710340832335 30.86254270532443,52.20353672504333,919.4949614620284 30.04236666854612,51.63257725263867,475.8350702372484 25.01649289652931,52.03999418857604,224.6433391802126 23.56070334750491,51.52339542849054,-26.54839187682323 + 124.1670823115053,39.74409177734425,158.1356675107385 124.8661267107351,39.40397557366102,422.2049066238911 124.5688374204719,38.03066677413586,12.20821200580563 125.5952743887899,37.58796806855445,57.78944787374744 128.255182108082,38.53998243512707,328.3884239785185 127.7769152324087,39.27209801788673,161.0219386833381 127.6603827169223,39.736599211547,-270.2362573723619 129.593310882984,40.7351614784365,518.5683842441658 129.9289702910408,41.3665440600562,576.0098750491494 130.757954111428,42.2650936787109,291.7477879241508 130.2457079819154,43.2440622130685,153.7225797622949 124.1670823115053,39.74409177734425,158.1356675107385