From 18c9c7e36e19940eca5bda85b54c3ad86e53e76e Mon Sep 17 00:00:00 2001 From: Vladyslav Heneraliuk Date: Thu, 30 Jan 2025 01:03:36 +0200 Subject: [PATCH 1/4] migrate to API regionId from indexes --- firmware/src/Constants.h | 181 ++++++++------ firmware/src/JaamFirmware.cpp | 70 +++--- firmware/src/JaamSettings.cpp | 11 +- firmware/src/JaamUtils.h | 447 ++++++++++++++++++---------------- 4 files changed, 385 insertions(+), 324 deletions(-) diff --git a/firmware/src/Constants.h b/firmware/src/Constants.h index c061888d..b5fe42db 100644 --- a/firmware/src/Constants.h +++ b/firmware/src/Constants.h @@ -12,8 +12,8 @@ TelnetSpy SerialAndTelnet; #define MAIN_LEDS_COUNT 26 #define DISTRICTS_COUNT 26 -#define KYIV_REGION_ID 26 -#define KYIV_OBL_REGION_ID 8 +#define KYIV_REGION_ID 31 +#define KYIV_OBL_REGION_ID 14 struct SettingListItem { int id; @@ -113,97 +113,118 @@ static const int ALERT = 1; #define BR_LEVELS_COUNT 20 #define MAX_BINS_LIST_SIZE 10 -static const std::map FLAG_COLORS = { - {1, 60}, - {2, 60}, - {3, 60}, - {4, 180}, - {5, 180}, - {6, 180}, - {7, 180}, +static const std::map FLAG_COLORS = { + {11, 60}, + {13, 60}, + {21, 60}, + {27, 180}, {8, 180}, - {9, 180}, + {5, 180}, {10, 180}, - {11, 180}, - {12, 180}, - {13, 60}, - {14, 60}, - {15, 60}, - {16, 60}, - {17, 60}, - {18, 60}, - {19, 60}, + {14, 180}, + {25, 180}, {20, 180}, - {21, 180}, - {22, 60}, + {22, 180}, + {16, 180}, + {28, 60}, + {12, 60}, {23, 60}, - {24, 60}, - {25, 60}, - {26, 180}, + {9999, 60}, + {18, 60}, + {17, 60}, + {9, 60}, + {19, 180}, + {24, 180}, + {15, 60}, + {4, 60}, + {3, 60}, + {26, 60}, + {31, 180}, }; -static const uint8_t D0[] PROGMEM = { 0, 1, 3 }; -static const uint8_t D1[] PROGMEM = { 1, 0, 2, 3, 24 }; -static const uint8_t D2[] PROGMEM = { 2, 1, 3, 4, 5, 23, 24 }; -static const uint8_t D3[] PROGMEM = { 3, 0, 1, 2, 4 }; -static const uint8_t D4[] PROGMEM = { 4, 2, 3, 5 }; -static const uint8_t D5[] PROGMEM = { 5, 2, 3, 4, 6, 23 }; -static const uint8_t D6[] PROGMEM = { 6, 5, 7, 22, 23, 25 }; -static const uint8_t D7[] PROGMEM = { 7, 6, 8, 19, 20, 22, 25 }; -static const uint8_t D8[] PROGMEM = { 8, 7, 9, 19, 20 }; -static const uint8_t D9[] PROGMEM = { 9, 8, 10, 19 }; -static const uint8_t D10[] PROGMEM = { 10, 9, 12, 18, 19 }; -static const uint8_t D11[] PROGMEM = { 11, 10, 12 }; -static const uint8_t D12[] PROGMEM = { 12, 10, 13, 18 }; -static const uint8_t D13[] PROGMEM = { 13, 12, 14, 18 }; -static const uint8_t D14[] PROGMEM = { 14, 13, 17, 18 }; -static const uint8_t D15[] PROGMEM = { 15, 14 }; -static const uint8_t D16[] PROGMEM = { 16, 17, 20, 21, 22 }; -static const uint8_t D17[] PROGMEM = { 17, 14, 16, 18, 21 }; -static const uint8_t D18[] PROGMEM = { 18, 10, 12, 13, 14, 17, 19, 21 }; -static const uint8_t D19[] PROGMEM = { 19, 7, 8, 9, 10, 18, 20, 21, 25 }; -static const uint8_t D20[] PROGMEM = { 20, 7, 8, 19, 21, 22, 25 }; -static const uint8_t D21[] PROGMEM = { 21, 16, 17, 18, 19, 20, 22 }; -static const uint8_t D22[] PROGMEM = { 22, 6, 7, 16, 20, 21, 23, 24, 25 }; -static const uint8_t D23[] PROGMEM = { 23, 2, 5, 6, 22, 24 }; -static const uint8_t D24[] PROGMEM = { 24, 1, 2, 22, 23 }; -static const uint8_t D25[] PROGMEM = { 25, 7 }; - -static const uint8_t COUNTERS[] PROGMEM = { 3, 5, 7, 5, 4, 6, 6, 6, 5, 4, 5, 3, 4, 4, 4, 2, 5, 5, 8, 8, 7, 7, 9, 6, 5, 2 }; +static const int D11[] PROGMEM = {13, 27}; // Закарпатська обл. +static const int D13[] PROGMEM = {11, 21, 27, 26 }; // Івано-Франківська обл. +static const int D21[] PROGMEM = {13, 27, 5, 3, 26}; // Тернопільська обл. +static const int D27[] PROGMEM = {11, 13, 21, 8}; // Львівська обл. +static const int D8[] PROGMEM = {27, 5}; // Волинська обл. +static const int D5[] PROGMEM = {21, 27, 8, 10, 3 }; // Рівненська обл. +static const int D10[] PROGMEM = {5, 14, 4, 3}; // Житомирська обл. +static const int D14[] PROGMEM = {10, 25, 19, 24, 4, 31 }; // Київська обл. +static const int D25[] PROGMEM = {14, 20, 19}; // Чернігівська обл. +static const int D20[] PROGMEM = {8, 22, 19}; // Сумська обл. +static const int D22[] PROGMEM = {20, 28, 9, 19}; // Харківська обл. +static const int D16[] PROGMEM = {22, 28}; // Луганська обл. +static const int D28[] PROGMEM = {22, 12, 9}; // Донецька обл. +static const int D12[] PROGMEM = {28, 23, 9}; // Запорізька обл. +static const int D23[] PROGMEM = {12, 17, 9}; // Херсонська обл. +static const int D9999[] PROGMEM = {23}; // Автономна Республіка Крим +static const int D18[] PROGMEM = {17, 15, 4}; // Одеська обл. +static const int D17[] PROGMEM = {23, 18, 9, 15}; // Миколаївська обл. +static const int D9[] PROGMEM = {22, 28, 12, 23, 17, 19, 15}; // Дніпропетровська обл. +static const int D19[] PROGMEM = {14, 25, 20, 22, 9, 24, 15}; // Полтавська обл. +static const int D24[] PROGMEM = {14, 19, 15, 4}; // Черкаська обл. +static const int D15[] PROGMEM = {9, 17, 18, 19, 24, 4}; // Кіровоградська обл. +static const int D4[] PROGMEM = {10, 14, 18, 24, 15, 3, 26}; // Вінницька обл. +static const int D3[] PROGMEM = {21, 5, 10, 4, 26}; // Хмельницька обл. +static const int D26[] PROGMEM = {13, 21, 4, 3}; // Чернівецька обл. +static const int D31[] PROGMEM = {14}; // Київ static SettingListItem DISTRICTS[DISTRICTS_COUNT] = { - {15, "АР Крим", false}, - {22, "Вінницька обл.", false}, - {4, "Волинська обл.", false}, - {18, "Дніпропетровська обл.", false}, - {12, "Донецька обл.", false}, - {6, "Житомирська обл.", false}, - {0, "Закарпатська обл.", false}, - {13, "Запорізька обл.", false}, - {1, "Ів.-Франківська обл.", false}, - {7, "Київська обл.", false}, - {25, "Київ", false}, - {21, "Кіровоградська обл.", false}, - {11, "Луганська обл.", false}, - {3, "Львівська обл.", false}, + {9999, "АР Крим", false}, + {4, "Вінницька обл.", false}, + {8, "Волинська обл.", false}, + {9, "Дніпропетровська обл.", false}, + {28, "Донецька обл.", false}, + {10, "Житомирська обл.", false}, + {11, "Закарпатська обл.", false}, + {12, "Запорізька обл.", false}, + {13, "Ів.-Франківська обл.", false}, + {14, "Київська обл.", false}, + {31, "Київ", false}, + {15, "Кіровоградська обл.", false}, + {16, "Луганська обл.", false}, + {27, "Львівська обл.", false}, {17, "Миколаївська обл.", false}, - {16, "Одеська обл.", false}, + {18, "Одеська обл.", false}, {19, "Полтавська обл.", false}, {5, "Рівненська обл.", false}, - {9, "Сумська обл.", false}, - {2, "Тернопільська обл.", false}, - {10, "Харківська обл.", false}, - {14, "Херсонська обл.", false}, - {23, "Хмельницька обл.", false}, - {20, "Черкаська обл.", false}, - {24, "Чернівецька обл.", false}, - {8, "Чернігівська обл.", false}, + {20, "Сумська обл.", false}, + {21, "Тернопільська обл.", false}, + {22, "Харківська обл.", false}, + {23, "Херсонська обл.", false}, + {3, "Хмельницька обл.", false}, + {24, "Черкаська обл.", false}, + {26, "Чернівецька обл.", false}, + {25, "Чернігівська обл.", false}, }; -static const uint8_t* NEIGHBORING_DISTRICS[DISTRICTS_COUNT] PROGMEM = { - D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, - D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, - D20, D21, D22, D23, D24, D25 +static std::map> NEIGHBORING_DISTRICS = { + {11, std::make_pair(2, (int*)D11)}, + {13, std::make_pair(4, (int*)D13)}, + {21, std::make_pair(5, (int*)D21)}, + {27, std::make_pair(4, (int*)D27)}, + {8, std::make_pair(2, (int*)D8)}, + {5, std::make_pair(5, (int*)D5)}, + {10, std::make_pair(4, (int*)D10)}, + {14, std::make_pair(6, (int*)D14)}, + {25, std::make_pair(1, (int*)D25)}, + {20, std::make_pair(3, (int*)D20)}, + {22, std::make_pair(4, (int*)D22)}, + {16, std::make_pair(2, (int*)D16)}, + {28, std::make_pair(3, (int*)D28)}, + {12, std::make_pair(3, (int*)D12)}, + {23, std::make_pair(3, (int*)D23)}, + {9999, std::make_pair(1, (int*)D9999)}, + {18, std::make_pair(3, (int*)D18)}, + {17, std::make_pair(4, (int*)D17)}, + {9, std::make_pair(7, (int*)D9)}, + {19, std::make_pair(7, (int*)D19)}, + {24, std::make_pair(4, (int*)D24)}, + {15, std::make_pair(6, (int*)D15)}, + {4, std::make_pair(7, (int*)D4)}, + {3, std::make_pair(5, (int*)D3)}, + {26, std::make_pair(4, (int*)D26)}, + {31, std::make_pair(1, (int*)D31)}, }; #define MAP_MODES_COUNT 6 diff --git a/firmware/src/JaamFirmware.cpp b/firmware/src/JaamFirmware.cpp index df2ce9c6..f68fbe4b 100644 --- a/firmware/src/JaamFirmware.cpp +++ b/firmware/src/JaamFirmware.cpp @@ -90,8 +90,8 @@ CRGB bg_strip[100]; CRGB service_strip[5]; int service_strip_update_index = 0; -std::map> id_to_alerts; //regionId to alert state and time -std::map> led_to_alerts; // ledPosition to alert state and time +std::map> id_to_alerts; //regionId to alert state and time +std::map> led_to_alerts; // ledPosition to alert state and time std::map id_to_weather; //regionId to temperature std::map led_to_weather; // ledPosition to temperature std::map id_to_explosions; //regionId to explosion time @@ -100,7 +100,7 @@ std::map id_to_missiles; //regionId to missiles std::map led_to_missiles; // ledPosition to missils time std::map id_to_drones; //regionId to missiles time std::map led_to_drones; // ledPosition to missils time -std::map led_to_flag_color; // ledPosition to flag color +std::map led_to_flag_color; // ledPosition to flag color std::pair homeDistrictMapping; // id to ledPosition home district mapping @@ -656,24 +656,24 @@ void initBroadcast() { int getCurrentMapMode() { if (minuteOfSilence || uaAnthemPlaying) return 3; // ua flag - int currentMapMode = isMapOff ? 0 : settings.getInt(MAP_MODE); - int position = settings.getInt(HOME_DISTRICT); - switch (settings.getInt(ALARMS_AUTO_SWITCH)) { - case 1: - for (int j = 0; j < COUNTERS[position]; j++) { - int alarm_led_id = NEIGHBORING_DISTRICS[position][j] + 1; - if (id_to_alerts[alarm_led_id].first != 0) { - currentMapMode = 1; - break; - } - } - break; - case 2: - if (id_to_alerts[position + 1].first != 0) { - currentMapMode = 1; + int homeRegionId = settings.getInt(HOME_DISTRICT); + int alarmMode = settings.getInt(ALARMS_AUTO_SWITCH); + if (alarmMode == 1) { + auto neighborsPair = NEIGHBORING_DISTRICS[homeRegionId]; + int count = neighborsPair.first; + int* neighbors = neighborsPair.second; + for (int i = 0; i < count; i++) { + if (id_to_alerts[neighbors[i]].first != 0) { + return 1; // alerts mode } + } + } + if (alarmMode >= 1) { + if (id_to_alerts[homeRegionId].first != 0) { + return 1; // alerts mode + } } - return currentMapMode; + return isMapOff ? 0 : settings.getInt(MAP_MODE); } void onMqttStateChanged(bool haStatus) { @@ -1166,7 +1166,7 @@ void remapFlag() { led_to_flag_color = mapLeds(ledMapping, FLAG_COLORS); } -std::pair alertsCombiModeHandler(std::pair kyiv, std::pair kyivObl) { +std::pair alertsCombiModeHandler(std::pair kyiv, std::pair kyivObl) { // if state of Kyiv and Kyiv Oblast are 'alert', return oldest by time if (kyiv.first == 1 && kyivObl.first == 1) return kyiv.second <= kyivObl.second ? kyiv : kyivObl; // if states of Kyiv and Kyiv Oblast are 'clear', return nearest by time @@ -1181,7 +1181,7 @@ void remapAlerts() { } float weatherCombiModeHandler(float kyiv, float kyivObl) { - // return avaerage value of Kyiv and Kyiv Oblast + // return average value of Kyiv and Kyiv Oblast return (kyiv + kyivObl) / 2.0f; } @@ -1211,7 +1211,7 @@ void remapDrones() { } void remapHomeDistrict() { - homeDistrictMapping = ledMapping(settings.getInt(HOME_DISTRICT) + 1); + homeDistrictMapping = ledMapping(settings.getInt(HOME_DISTRICT)); } bool saveBrightness(int newBrightness) { @@ -1340,7 +1340,7 @@ void showHomeAlertInfo() { strcpy(title, "Тривога триває:"); } char message[15]; - int regionId = settings.getInt(HOME_DISTRICT) + 1; + int regionId = settings.getInt(HOME_DISTRICT); fillFromTimer(message, timeClient.unixGMT() - id_to_alerts[regionId].second); displayMessage(message, title); @@ -1359,7 +1359,7 @@ void showClock() { } void showTemp() { - int regionId = settings.getInt(HOME_DISTRICT) + 1; + int regionId = settings.getInt(HOME_DISTRICT); char message[10]; sprintf(message, "%.1f%cC", id_to_weather[regionId], (char)128); displayMessage(message, getNameById(DISTRICTS, settings.getInt(HOME_DISTRICT), DISTRICTS_COUNT)); @@ -2297,7 +2297,7 @@ void handleTelemetry(AsyncWebServerRequest* request) { addCard(response, "Вільна памʼять", freeHeapSize, "кБ"); addCard(response, "Використана памʼять", usedHeapSize, "кБ"); addCard(response, "WiFi сигнал", wifiSignal, "dBm"); - addCard(response, getNameById(DISTRICTS, settings.getInt(HOME_DISTRICT), DISTRICTS_COUNT), id_to_weather[settings.getInt(HOME_DISTRICT) + 1], "°C"); + addCard(response, getNameById(DISTRICTS, settings.getInt(HOME_DISTRICT), DISTRICTS_COUNT), id_to_weather[settings.getInt(HOME_DISTRICT) ], "°C"); if (ha.isHaEnabled()) { addCard(response, "Home Assistant", haConnected ? "Підключено" : "Відключено", "", 2); } @@ -2911,8 +2911,8 @@ void alertPinCycle() { } void checkHomeDistrictAlerts() { - int ledStatus = id_to_alerts[settings.getInt(HOME_DISTRICT) + 1].first; - long localHomeExplosions = id_to_explosions[settings.getInt(HOME_DISTRICT) + 1]; + int ledStatus = id_to_alerts[settings.getInt(HOME_DISTRICT)].first; + long localHomeExplosions = id_to_explosions[settings.getInt(HOME_DISTRICT)]; bool localAlarmNow = ledStatus == 1; const char* districtName = getNameById(DISTRICTS, settings.getInt(HOME_DISTRICT), DISTRICTS_COUNT); if (localAlarmNow != alarmNow) { @@ -2951,32 +2951,32 @@ void onMessageCallback(WebsocketsMessage message) { websocketLastPingTime = millis(); } else if (payload == "alerts") { for (int i = 0; i < MAIN_LEDS_COUNT; ++i) { - id_to_alerts[i + 1] = std::make_pair((uint8_t) data["alerts"][i][0], (long) data["alerts"][i][1]); + id_to_alerts[mapIndexToRegionId(i)] = std::make_pair((uint8_t) data["alerts"][i][0], (long) data["alerts"][i][1]); } LOG.println("Successfully parsed alerts data"); remapAlerts(); } else if (payload == "weather") { for (int i = 0; i < MAIN_LEDS_COUNT; ++i) { - id_to_weather[i + 1] = data["weather"][i]; + id_to_weather[mapIndexToRegionId(i)] = data["weather"][i]; } LOG.println("Successfully parsed weather data"); remapWeather(); - ha.setHomeTemperature(id_to_weather[settings.getInt(HOME_DISTRICT) + 1]); + ha.setHomeTemperature(id_to_weather[settings.getInt(HOME_DISTRICT) ]); } else if (payload == "explosions") { for (int i = 0; i < MAIN_LEDS_COUNT; ++i) { - id_to_explosions[i + 1] = data["explosions"][i]; + id_to_explosions[mapIndexToRegionId(i)] = data["explosions"][i]; } LOG.println("Successfully parsed explosions data"); remapExplosions(); } else if (payload == "missiles") { for (int i = 0; i < MAIN_LEDS_COUNT; ++i) { - id_to_missiles[i + 1] = data["missiles"][i]; + id_to_missiles[mapIndexToRegionId(i)] = data["missiles"][i]; } LOG.println("Successfully parsed missiles data"); remapMissiles(); } else if (payload == "drones") { for (int i = 0; i < MAIN_LEDS_COUNT; ++i) { - id_to_drones[i + 1] = data["drones"][i]; + id_to_drones[mapIndexToRegionId(i)] = data["drones"][i]; } LOG.println("Successfully parsed drones data"); remapDrones(); @@ -3254,7 +3254,7 @@ void mapAlarms() { if (isBgStripEnabled()) { // same as for local district int localDistrictLedCount = homeDistrictMapping.first; // get count of leds in local district - int localDistrictId = settings.getInt(HOME_DISTRICT) + 1; + int localDistrictId = settings.getInt(HOME_DISTRICT); fill_solid( bg_strip, settings.getInt(BG_LED_COUNT), @@ -3281,7 +3281,7 @@ void mapWeather() { if (isBgStripEnabled()) { // same as for local district float brightness_factror = settings.getInt(BRIGHTNESS_BG) / 100.0f; - fill_solid(bg_strip, settings.getInt(BG_LED_COUNT), fromHue(processWeather(id_to_weather[settings.getInt(HOME_DISTRICT) + 1]), settings.getInt(CURRENT_BRIGHTNESS) * brightness_factror)); + fill_solid(bg_strip, settings.getInt(BG_LED_COUNT), fromHue(processWeather(id_to_weather[settings.getInt(HOME_DISTRICT) ]), settings.getInt(CURRENT_BRIGHTNESS) * brightness_factror)); } FastLED.show(); } diff --git a/firmware/src/JaamSettings.cpp b/firmware/src/JaamSettings.cpp index e936bdde..3859ecdc 100644 --- a/firmware/src/JaamSettings.cpp +++ b/firmware/src/JaamSettings.cpp @@ -1,7 +1,7 @@ #include "JaamSettings.h" -#include "Constants.h" #include #include +#include #include #include @@ -76,7 +76,7 @@ std::map intSettings = { {WEATHER_MIN_TEMP, {"mintemp", -10}}, {WEATHER_MAX_TEMP, {"maxtemp", 30}}, {ALARMS_AUTO_SWITCH, {"aas", 1}}, - {HOME_DISTRICT, {"hd", 7}}, + {HOME_DISTRICT, {"hmd", 31}}, {KYIV_DISTRICT_MODE, {"kdm", 1}}, {SERVICE_DIODES_MODE, {"sdm", 0}}, {NEW_FW_NOTIFICATION, {"nfwn", 1}}, @@ -155,6 +155,13 @@ const char* PREFS_NAME = "storage"; void JaamSettings::init() { preferences.begin(PREFS_NAME, true); + // home district migration to regionID + if (preferences.isKey("hd")) { + int homeDistrict = preferences.getInt("hd", KYIV_REGION_ID); + preferences.remove("hd"); + preferences.putInt("hmd", mapIndexToRegionId(homeDistrict)); + } + for (auto it = stringSettings.begin(); it != stringSettings.end(); ++it) { SettingItemString setting = it->second; setting.value = preferences.getString(setting.key, setting.value); diff --git a/firmware/src/JaamUtils.h b/firmware/src/JaamUtils.h index 0f789d1c..0dfad9d0 100644 --- a/firmware/src/JaamUtils.h +++ b/firmware/src/JaamUtils.h @@ -188,7 +188,8 @@ static std::map mapLeds(std::pair (*ledsSequence)(int key), s return {}; } std::map remaped = {}; - for (int regId = 1; regId <= DISTRICTS_COUNT; regId++) { + for (int i = 0; i < DISTRICTS_COUNT; i++) { + int regId = DISTRICTS[i].id; auto sequence = ledsSequence(regId); int ledCount = sequence.first; int *ledList = sequence.second; @@ -253,254 +254,254 @@ static void getHaOptions(char* result, const char* options[], int optionsSize) { static std::pair mapTranscarpatiaStart1(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{0}); - case 2: return std::make_pair(1, new int[1]{1}); - case 3: return std::make_pair(1, new int[1]{2}); - case 4: return std::make_pair(1, new int[1]{3}); - case 5: return std::make_pair(1, new int[1]{4}); - case 6: return std::make_pair(1, new int[1]{5}); - case 7: return std::make_pair(1, new int[1]{6}); - case 8: return std::make_pair(1, new int[1]{7}); - case 9: return std::make_pair(1, new int[1]{8}); - case 10: return std::make_pair(1, new int[1]{9}); - case 11: return std::make_pair(1, new int[1]{10}); - case 12: return std::make_pair(1, new int[1]{11}); - case 13: return std::make_pair(1, new int[1]{12}); - case 14: return std::make_pair(1, new int[1]{13}); - case 15: return std::make_pair(1, new int[1]{14}); - case 16: return std::make_pair(1, new int[1]{15}); - case 17: return std::make_pair(1, new int[1]{16}); - case 18: return std::make_pair(1, new int[1]{17}); - case 19: return std::make_pair(1, new int[1]{18}); - case 20: return std::make_pair(1, new int[1]{19}); - case 21: return std::make_pair(1, new int[1]{20}); - case 22: return std::make_pair(1, new int[1]{21}); - case 23: return std::make_pair(1, new int[1]{22}); - case 24: return std::make_pair(1, new int[1]{23}); - case 25: return std::make_pair(1, new int[1]{24}); + case 11: return std::make_pair(1, new int[1]{0}); + case 13: return std::make_pair(1, new int[1]{1}); + case 21: return std::make_pair(1, new int[1]{2}); + case 27: return std::make_pair(1, new int[1]{3}); + case 8: return std::make_pair(1, new int[1]{4}); + case 5: return std::make_pair(1, new int[1]{5}); + case 10: return std::make_pair(1, new int[1]{6}); + case 14: return std::make_pair(1, new int[1]{7}); + case 25: return std::make_pair(1, new int[1]{8}); + case 20: return std::make_pair(1, new int[1]{9}); + case 22: return std::make_pair(1, new int[1]{10}); + case 16: return std::make_pair(1, new int[1]{11}); + case 28: return std::make_pair(1, new int[1]{12}); + case 12: return std::make_pair(1, new int[1]{13}); + case 23: return std::make_pair(1, new int[1]{14}); + case 9999: return std::make_pair(1, new int[1]{15}); + case 18: return std::make_pair(1, new int[1]{16}); + case 17: return std::make_pair(1, new int[1]{17}); + case 9: return std::make_pair(1, new int[1]{18}); + case 19: return std::make_pair(1, new int[1]{19}); + case 24: return std::make_pair(1, new int[1]{20}); + case 15: return std::make_pair(1, new int[1]{21}); + case 4: return std::make_pair(1, new int[1]{22}); + case 3: return std::make_pair(1, new int[1]{23}); + case 26: return std::make_pair(1, new int[1]{24}); default: return std::make_pair(0, nullptr); } } static std::pair mapOdessaStart1(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{9}); - case 2: return std::make_pair(1, new int[1]{10}); - case 3: return std::make_pair(1, new int[1]{11}); - case 4: return std::make_pair(1, new int[1]{12}); - case 5: return std::make_pair(1, new int[1]{13}); - case 6: return std::make_pair(1, new int[1]{14}); - case 7: return std::make_pair(1, new int[1]{15}); - case 8: return std::make_pair(1, new int[1]{16}); - case 9: return std::make_pair(1, new int[1]{17}); - case 10: return std::make_pair(1, new int[1]{18}); - case 11: return std::make_pair(1, new int[1]{19}); - case 12: return std::make_pair(1, new int[1]{20}); - case 13: return std::make_pair(1, new int[1]{21}); - case 14: return std::make_pair(1, new int[1]{22}); - case 15: return std::make_pair(1, new int[1]{23}); - case 16: return std::make_pair(1, new int[1]{24}); - case 17: return std::make_pair(1, new int[1]{0}); - case 18: return std::make_pair(1, new int[1]{1}); - case 19: return std::make_pair(1, new int[1]{2}); - case 20: return std::make_pair(1, new int[1]{3}); - case 21: return std::make_pair(1, new int[1]{4}); - case 22: return std::make_pair(1, new int[1]{5}); - case 23: return std::make_pair(1, new int[1]{6}); - case 24: return std::make_pair(1, new int[1]{7}); - case 25: return std::make_pair(1, new int[1]{8}); + case 11: return std::make_pair(1, new int[1]{9}); + case 13: return std::make_pair(1, new int[1]{10}); + case 21: return std::make_pair(1, new int[1]{11}); + case 27: return std::make_pair(1, new int[1]{12}); + case 8: return std::make_pair(1, new int[1]{13}); + case 5: return std::make_pair(1, new int[1]{14}); + case 10: return std::make_pair(1, new int[1]{15}); + case 14: return std::make_pair(1, new int[1]{16}); + case 25: return std::make_pair(1, new int[1]{17}); + case 20: return std::make_pair(1, new int[1]{18}); + case 22: return std::make_pair(1, new int[1]{19}); + case 16: return std::make_pair(1, new int[1]{20}); + case 28: return std::make_pair(1, new int[1]{21}); + case 12: return std::make_pair(1, new int[1]{22}); + case 23: return std::make_pair(1, new int[1]{23}); + case 9999: return std::make_pair(1, new int[1]{24}); + case 18: return std::make_pair(1, new int[1]{0}); + case 17: return std::make_pair(1, new int[1]{1}); + case 9: return std::make_pair(1, new int[1]{2}); + case 19: return std::make_pair(1, new int[1]{3}); + case 24: return std::make_pair(1, new int[1]{4}); + case 15: return std::make_pair(1, new int[1]{5}); + case 4: return std::make_pair(1, new int[1]{6}); + case 3: return std::make_pair(1, new int[1]{7}); + case 26: return std::make_pair(1, new int[1]{8}); default: return std::make_pair(0, nullptr); } } static std::pair mapTranscarpatiaStart2(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{0}); - case 2: return std::make_pair(1, new int[1]{1}); - case 3: return std::make_pair(1, new int[1]{2}); - case 4: return std::make_pair(1, new int[1]{3}); - case 5: return std::make_pair(1, new int[1]{4}); - case 6: return std::make_pair(1, new int[1]{5}); - case 7: return std::make_pair(1, new int[1]{6}); - case 8: return std::make_pair(0, nullptr); - case 9: return std::make_pair(1, new int[1]{8}); - case 10: return std::make_pair(1, new int[1]{9}); - case 11: return std::make_pair(1, new int[1]{10}); - case 12: return std::make_pair(1, new int[1]{11}); - case 13: return std::make_pair(1, new int[1]{12}); - case 14: return std::make_pair(1, new int[1]{13}); - case 15: return std::make_pair(1, new int[1]{14}); - case 16: return std::make_pair(1, new int[1]{15}); - case 17: return std::make_pair(1, new int[1]{16}); - case 18: return std::make_pair(1, new int[1]{17}); - case 19: return std::make_pair(1, new int[1]{18}); - case 20: return std::make_pair(1, new int[1]{19}); - case 21: return std::make_pair(1, new int[1]{20}); - case 22: return std::make_pair(1, new int[1]{21}); - case 23: return std::make_pair(1, new int[1]{22}); - case 24: return std::make_pair(1, new int[1]{23}); - case 25: return std::make_pair(1, new int[1]{24}); - case 26: return std::make_pair(1, new int[1]{7}); + case 11: return std::make_pair(1, new int[1]{0}); + case 13: return std::make_pair(1, new int[1]{1}); + case 21: return std::make_pair(1, new int[1]{2}); + case 27: return std::make_pair(1, new int[1]{3}); + case 8: return std::make_pair(1, new int[1]{4}); + case 5: return std::make_pair(1, new int[1]{5}); + case 10: return std::make_pair(1, new int[1]{6}); + case 14: return std::make_pair(0, nullptr); + case 25: return std::make_pair(1, new int[1]{8}); + case 20: return std::make_pair(1, new int[1]{9}); + case 22: return std::make_pair(1, new int[1]{10}); + case 16: return std::make_pair(1, new int[1]{11}); + case 28: return std::make_pair(1, new int[1]{12}); + case 12: return std::make_pair(1, new int[1]{13}); + case 23: return std::make_pair(1, new int[1]{14}); + case 9999: return std::make_pair(1, new int[1]{15}); + case 18: return std::make_pair(1, new int[1]{16}); + case 17: return std::make_pair(1, new int[1]{17}); + case 9: return std::make_pair(1, new int[1]{18}); + case 19: return std::make_pair(1, new int[1]{19}); + case 24: return std::make_pair(1, new int[1]{20}); + case 15: return std::make_pair(1, new int[1]{21}); + case 4: return std::make_pair(1, new int[1]{22}); + case 3: return std::make_pair(1, new int[1]{23}); + case 26: return std::make_pair(1, new int[1]{24}); + case 31: return std::make_pair(1, new int[1]{7}); default: return std::make_pair(0, nullptr); } } static std::pair mapOdessaStart2(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{9}); - case 2: return std::make_pair(1, new int[1]{10}); - case 3: return std::make_pair(1, new int[1]{11}); - case 4: return std::make_pair(1, new int[1]{12}); - case 5: return std::make_pair(1, new int[1]{13}); - case 6: return std::make_pair(1, new int[1]{14}); - case 7: return std::make_pair(1, new int[1]{15}); - case 8: return std::make_pair(0, nullptr); - case 9: return std::make_pair(1, new int[1]{17}); - case 10: return std::make_pair(1, new int[1]{18}); - case 11: return std::make_pair(1, new int[1]{19}); - case 12: return std::make_pair(1, new int[1]{20}); - case 13: return std::make_pair(1, new int[1]{21}); - case 14: return std::make_pair(1, new int[1]{22}); - case 15: return std::make_pair(1, new int[1]{23}); - case 16: return std::make_pair(1, new int[1]{24}); - case 17: return std::make_pair(1, new int[1]{0}); - case 18: return std::make_pair(1, new int[1]{1}); - case 19: return std::make_pair(1, new int[1]{2}); - case 20: return std::make_pair(1, new int[1]{3}); - case 21: return std::make_pair(1, new int[1]{4}); - case 22: return std::make_pair(1, new int[1]{5}); - case 23: return std::make_pair(1, new int[1]{6}); - case 24: return std::make_pair(1, new int[1]{7}); - case 25: return std::make_pair(1, new int[1]{8}); - case 26: return std::make_pair(1, new int[1]{16}); + case 11: return std::make_pair(1, new int[1]{9}); + case 13: return std::make_pair(1, new int[1]{10}); + case 21: return std::make_pair(1, new int[1]{11}); + case 27: return std::make_pair(1, new int[1]{12}); + case 8: return std::make_pair(1, new int[1]{13}); + case 5: return std::make_pair(1, new int[1]{14}); + case 10: return std::make_pair(1, new int[1]{15}); + case 14: return std::make_pair(0, nullptr); + case 25: return std::make_pair(1, new int[1]{17}); + case 20: return std::make_pair(1, new int[1]{18}); + case 22: return std::make_pair(1, new int[1]{19}); + case 16: return std::make_pair(1, new int[1]{20}); + case 28: return std::make_pair(1, new int[1]{21}); + case 12: return std::make_pair(1, new int[1]{22}); + case 23: return std::make_pair(1, new int[1]{23}); + case 9999: return std::make_pair(1, new int[1]{24}); + case 18: return std::make_pair(1, new int[1]{0}); + case 17: return std::make_pair(1, new int[1]{1}); + case 9: return std::make_pair(1, new int[1]{2}); + case 19: return std::make_pair(1, new int[1]{3}); + case 24: return std::make_pair(1, new int[1]{4}); + case 15: return std::make_pair(1, new int[1]{5}); + case 4: return std::make_pair(1, new int[1]{6}); + case 3: return std::make_pair(1, new int[1]{7}); + case 26: return std::make_pair(1, new int[1]{8}); + case 31: return std::make_pair(1, new int[1]{16}); default: return std::make_pair(0, nullptr); } } static std::pair mapTranscarpatiaStart3(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{0}); - case 2: return std::make_pair(1, new int[1]{1}); - case 3: return std::make_pair(1, new int[1]{2}); - case 4: return std::make_pair(1, new int[1]{3}); - case 5: return std::make_pair(1, new int[1]{4}); - case 6: return std::make_pair(1, new int[1]{5}); - case 7: return std::make_pair(1, new int[1]{6}); - case 8: return std::make_pair(1, new int[1]{7}); - case 9: return std::make_pair(1, new int[1]{9}); - case 10: return std::make_pair(1, new int[1]{10}); - case 11: return std::make_pair(1, new int[1]{11}); - case 12: return std::make_pair(1, new int[1]{12}); - case 13: return std::make_pair(1, new int[1]{13}); - case 14: return std::make_pair(1, new int[1]{14}); - case 15: return std::make_pair(1, new int[1]{15}); - case 16: return std::make_pair(1, new int[1]{16}); - case 17: return std::make_pair(1, new int[1]{17}); - case 18: return std::make_pair(1, new int[1]{18}); - case 19: return std::make_pair(1, new int[1]{19}); - case 20: return std::make_pair(1, new int[1]{20}); - case 21: return std::make_pair(1, new int[1]{21}); - case 22: return std::make_pair(1, new int[1]{22}); - case 23: return std::make_pair(1, new int[1]{23}); - case 24: return std::make_pair(1, new int[1]{24}); - case 25: return std::make_pair(1, new int[1]{25}); - case 26: return std::make_pair(1, new int[1]{8}); + case 11: return std::make_pair(1, new int[1]{0}); + case 13: return std::make_pair(1, new int[1]{1}); + case 21: return std::make_pair(1, new int[1]{2}); + case 27: return std::make_pair(1, new int[1]{3}); + case 8: return std::make_pair(1, new int[1]{4}); + case 5: return std::make_pair(1, new int[1]{5}); + case 10: return std::make_pair(1, new int[1]{6}); + case 14: return std::make_pair(1, new int[1]{7}); + case 25: return std::make_pair(1, new int[1]{9}); + case 20: return std::make_pair(1, new int[1]{10}); + case 22: return std::make_pair(1, new int[1]{11}); + case 16: return std::make_pair(1, new int[1]{12}); + case 28: return std::make_pair(1, new int[1]{13}); + case 12: return std::make_pair(1, new int[1]{14}); + case 23: return std::make_pair(1, new int[1]{15}); + case 9999: return std::make_pair(1, new int[1]{16}); + case 18: return std::make_pair(1, new int[1]{17}); + case 17: return std::make_pair(1, new int[1]{18}); + case 9: return std::make_pair(1, new int[1]{19}); + case 19: return std::make_pair(1, new int[1]{20}); + case 24: return std::make_pair(1, new int[1]{21}); + case 15: return std::make_pair(1, new int[1]{22}); + case 4: return std::make_pair(1, new int[1]{23}); + case 3: return std::make_pair(1, new int[1]{24}); + case 26: return std::make_pair(1, new int[1]{25}); + case 31: return std::make_pair(1, new int[1]{8}); default: return std::make_pair(0, nullptr); } } static std::pair mapOdessaStart3(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{9}); - case 2: return std::make_pair(1, new int[1]{10}); - case 3: return std::make_pair(1, new int[1]{11}); - case 4: return std::make_pair(1, new int[1]{12}); - case 5: return std::make_pair(1, new int[1]{13}); - case 6: return std::make_pair(1, new int[1]{14}); - case 7: return std::make_pair(1, new int[1]{15}); - case 8: return std::make_pair(1, new int[1]{16}); - case 9: return std::make_pair(1, new int[1]{18}); - case 10: return std::make_pair(1, new int[1]{19}); - case 11: return std::make_pair(1, new int[1]{20}); - case 12: return std::make_pair(1, new int[1]{21}); - case 13: return std::make_pair(1, new int[1]{22}); - case 14: return std::make_pair(1, new int[1]{23}); - case 15: return std::make_pair(1, new int[1]{24}); - case 16: return std::make_pair(1, new int[1]{25}); - case 17: return std::make_pair(1, new int[1]{0}); - case 18: return std::make_pair(1, new int[1]{1}); - case 19: return std::make_pair(1, new int[1]{2}); - case 20: return std::make_pair(1, new int[1]{3}); - case 21: return std::make_pair(1, new int[1]{4}); - case 22: return std::make_pair(1, new int[1]{5}); - case 23: return std::make_pair(1, new int[1]{6}); - case 24: return std::make_pair(1, new int[1]{7}); - case 25: return std::make_pair(1, new int[1]{8}); - case 26: return std::make_pair(1, new int[1]{17}); + case 11: return std::make_pair(1, new int[1]{9}); + case 13: return std::make_pair(1, new int[1]{10}); + case 21: return std::make_pair(1, new int[1]{11}); + case 27: return std::make_pair(1, new int[1]{12}); + case 8: return std::make_pair(1, new int[1]{13}); + case 5: return std::make_pair(1, new int[1]{14}); + case 10: return std::make_pair(1, new int[1]{15}); + case 14: return std::make_pair(1, new int[1]{16}); + case 25: return std::make_pair(1, new int[1]{18}); + case 20: return std::make_pair(1, new int[1]{19}); + case 22: return std::make_pair(1, new int[1]{20}); + case 16: return std::make_pair(1, new int[1]{21}); + case 28: return std::make_pair(1, new int[1]{22}); + case 12: return std::make_pair(1, new int[1]{23}); + case 23: return std::make_pair(1, new int[1]{24}); + case 9999: return std::make_pair(1, new int[1]{25}); + case 18: return std::make_pair(1, new int[1]{0}); + case 17: return std::make_pair(1, new int[1]{1}); + case 9: return std::make_pair(1, new int[1]{2}); + case 19: return std::make_pair(1, new int[1]{3}); + case 24: return std::make_pair(1, new int[1]{4}); + case 15: return std::make_pair(1, new int[1]{5}); + case 4: return std::make_pair(1, new int[1]{6}); + case 3: return std::make_pair(1, new int[1]{7}); + case 26: return std::make_pair(1, new int[1]{8}); + case 31: return std::make_pair(1, new int[1]{17}); default: return std::make_pair(0, nullptr); } } static std::pair mapTranscarpatiaStart4(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{0}); - case 2: return std::make_pair(1, new int[1]{1}); - case 3: return std::make_pair(1, new int[1]{2}); - case 4: return std::make_pair(1, new int[1]{3}); - case 5: return std::make_pair(1, new int[1]{4}); - case 6: return std::make_pair(1, new int[1]{5}); - case 7: return std::make_pair(1, new int[1]{6}); - case 8: return std::make_pair(1, new int[1]{7}); - case 9: return std::make_pair(1, new int[1]{8}); - case 10: return std::make_pair(1, new int[1]{9}); - case 11: return std::make_pair(1, new int[1]{10}); - case 12: return std::make_pair(1, new int[1]{11}); - case 13: return std::make_pair(1, new int[1]{12}); - case 14: return std::make_pair(1, new int[1]{13}); - case 15: return std::make_pair(1, new int[1]{14}); - case 16: return std::make_pair(1, new int[1]{15}); - case 17: return std::make_pair(1, new int[1]{16}); - case 18: return std::make_pair(1, new int[1]{17}); - case 19: return std::make_pair(1, new int[1]{18}); - case 20: return std::make_pair(1, new int[1]{19}); - case 21: return std::make_pair(1, new int[1]{20}); - case 22: return std::make_pair(1, new int[1]{21}); - case 23: return std::make_pair(1, new int[1]{22}); - case 24: return std::make_pair(1, new int[1]{23}); - case 25: return std::make_pair(1, new int[1]{24}); - case 26: return std::make_pair(1, new int[1]{7}); + case 11: return std::make_pair(1, new int[1]{0}); + case 13: return std::make_pair(1, new int[1]{1}); + case 21: return std::make_pair(1, new int[1]{2}); + case 27: return std::make_pair(1, new int[1]{3}); + case 8: return std::make_pair(1, new int[1]{4}); + case 5: return std::make_pair(1, new int[1]{5}); + case 10: return std::make_pair(1, new int[1]{6}); + case 14: return std::make_pair(1, new int[1]{7}); + case 25: return std::make_pair(1, new int[1]{8}); + case 20: return std::make_pair(1, new int[1]{9}); + case 22: return std::make_pair(1, new int[1]{10}); + case 16: return std::make_pair(1, new int[1]{11}); + case 28: return std::make_pair(1, new int[1]{12}); + case 12: return std::make_pair(1, new int[1]{13}); + case 23: return std::make_pair(1, new int[1]{14}); + case 9999: return std::make_pair(1, new int[1]{15}); + case 18: return std::make_pair(1, new int[1]{16}); + case 17: return std::make_pair(1, new int[1]{17}); + case 9: return std::make_pair(1, new int[1]{18}); + case 19: return std::make_pair(1, new int[1]{19}); + case 24: return std::make_pair(1, new int[1]{20}); + case 15: return std::make_pair(1, new int[1]{21}); + case 4: return std::make_pair(1, new int[1]{22}); + case 3: return std::make_pair(1, new int[1]{23}); + case 26: return std::make_pair(1, new int[1]{24}); + case 31: return std::make_pair(1, new int[1]{7}); default: return std::make_pair(0, nullptr); } } static std::pair mapOdessaStart4(int key) { switch (key) { - case 1: return std::make_pair(1, new int[1]{9}); - case 2: return std::make_pair(1, new int[1]{10}); - case 3: return std::make_pair(1, new int[1]{11}); - case 4: return std::make_pair(1, new int[1]{12}); - case 5: return std::make_pair(1, new int[1]{13}); - case 6: return std::make_pair(1, new int[1]{14}); - case 7: return std::make_pair(1, new int[1]{15}); - case 8: return std::make_pair(1, new int[1]{16}); - case 9: return std::make_pair(1, new int[1]{17}); - case 10: return std::make_pair(1, new int[1]{18}); - case 11: return std::make_pair(1, new int[1]{19}); - case 12: return std::make_pair(1, new int[1]{20}); - case 13: return std::make_pair(1, new int[1]{21}); - case 14: return std::make_pair(1, new int[1]{22}); - case 15: return std::make_pair(1, new int[1]{23}); - case 16: return std::make_pair(1, new int[1]{24}); - case 17: return std::make_pair(1, new int[1]{0}); - case 18: return std::make_pair(1, new int[1]{1}); - case 19: return std::make_pair(1, new int[1]{2}); - case 20: return std::make_pair(1, new int[1]{3}); - case 21: return std::make_pair(1, new int[1]{4}); - case 22: return std::make_pair(1, new int[1]{5}); - case 23: return std::make_pair(1, new int[1]{6}); - case 24: return std::make_pair(1, new int[1]{7}); - case 25: return std::make_pair(1, new int[1]{8}); - case 26: return std::make_pair(1, new int[1]{16}); + case 11: return std::make_pair(1, new int[1]{9}); + case 13: return std::make_pair(1, new int[1]{10}); + case 21: return std::make_pair(1, new int[1]{11}); + case 27: return std::make_pair(1, new int[1]{12}); + case 8: return std::make_pair(1, new int[1]{13}); + case 5: return std::make_pair(1, new int[1]{14}); + case 10: return std::make_pair(1, new int[1]{15}); + case 14: return std::make_pair(1, new int[1]{16}); + case 25: return std::make_pair(1, new int[1]{17}); + case 20: return std::make_pair(1, new int[1]{18}); + case 22: return std::make_pair(1, new int[1]{19}); + case 16: return std::make_pair(1, new int[1]{20}); + case 28: return std::make_pair(1, new int[1]{21}); + case 12: return std::make_pair(1, new int[1]{22}); + case 23: return std::make_pair(1, new int[1]{23}); + case 9999: return std::make_pair(1, new int[1]{24}); + case 18: return std::make_pair(1, new int[1]{0}); + case 17: return std::make_pair(1, new int[1]{1}); + case 9: return std::make_pair(1, new int[1]{2}); + case 19: return std::make_pair(1, new int[1]{3}); + case 24: return std::make_pair(1, new int[1]{4}); + case 15: return std::make_pair(1, new int[1]{5}); + case 4: return std::make_pair(1, new int[1]{6}); + case 3: return std::make_pair(1, new int[1]{7}); + case 26: return std::make_pair(1, new int[1]{8}); + case 31: return std::make_pair(1, new int[1]{16}); default: return std::make_pair(0, nullptr); } } @@ -514,3 +515,35 @@ static bool isInArray(int value, int* array, int arraySize) { } return false; } + +static int mapIndexToRegionId(int index) { + switch (index) { + case 0: return 11; // Закарпатська обл. + case 1: return 13; // Івано-Франківська обл. + case 2: return 21; // Тернопільська обл. + case 3: return 27; // Львівська обл. + case 4: return 8; // Волинська обл. + case 5: return 5; // Рівненська обл. + case 6: return 10; // Житомирська обл. + case 7: return 14; // Київська обл. + case 8: return 25; // Чернігівська обл. + case 9: return 20; // Сумська обл. + case 10: return 22; // Харківська обл. + case 11: return 16; // Луганська обл. + case 12: return 28; // Донецька обл. + case 13: return 12; // Запорізька обл. + case 14: return 23; // Херсонська обл. + case 15: return 9999; // Автономна Республіка Крим + case 16: return 18; // Одеська обл. + case 17: return 17; // Миколаївська обл. + case 18: return 9; // Дніпропетровська обл. + case 19: return 19; // Полтавська обл. + case 20: return 24; // Черкаська обл. + case 21: return 15; // Кіровоградська обл. + case 22: return 4; // Вінницька обл. + case 23: return 3; // Хмельницька обл. + case 24: return 26; // Чернівецька обл. + case 25: return 31; // м. Київ + default: return -1; + } +} From 1a0a0b9c95843e1a3aa99148a1ebf33e64364f58 Mon Sep 17 00:00:00 2001 From: Vladyslav Heneraliuk Date: Thu, 30 Jan 2025 01:21:56 +0200 Subject: [PATCH 2/4] additional checks in migration Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- firmware/src/JaamSettings.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/firmware/src/JaamSettings.cpp b/firmware/src/JaamSettings.cpp index 3859ecdc..8c4190f6 100644 --- a/firmware/src/JaamSettings.cpp +++ b/firmware/src/JaamSettings.cpp @@ -158,8 +158,13 @@ void JaamSettings::init() { // home district migration to regionID if (preferences.isKey("hd")) { int homeDistrict = preferences.getInt("hd", KYIV_REGION_ID); + int newRegionId = mapIndexToRegionId(homeDistrict); + if (newRegionId == -1) { + LOG.printf("Failed to map old home district %d to new region ID\n", homeDistrict); + newRegionId = KYIV_REGION_ID; + } preferences.remove("hd"); - preferences.putInt("hmd", mapIndexToRegionId(homeDistrict)); + preferences.putInt("hmd", newRegionId); } for (auto it = stringSettings.begin(); it != stringSettings.end(); ++it) { From 276713d744db6a44e51e42d82f1bcc4da9987b3a Mon Sep 17 00:00:00 2001 From: Vladyslav Heneraliuk Date: Thu, 30 Jan 2025 16:16:25 +0200 Subject: [PATCH 3/4] small fixes --- firmware/src/JaamFirmware.cpp | 64 +++++++++++++++++++---------------- firmware/src/JaamUtils.h | 20 +++++------ 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/firmware/src/JaamFirmware.cpp b/firmware/src/JaamFirmware.cpp index f68fbe4b..1db3b66f 100644 --- a/firmware/src/JaamFirmware.cpp +++ b/firmware/src/JaamFirmware.cpp @@ -90,19 +90,18 @@ CRGB bg_strip[100]; CRGB service_strip[5]; int service_strip_update_index = 0; -std::map> id_to_alerts; //regionId to alert state and time -std::map> led_to_alerts; // ledPosition to alert state and time -std::map id_to_weather; //regionId to temperature -std::map led_to_weather; // ledPosition to temperature -std::map id_to_explosions; //regionId to explosion time -std::map led_to_explosions; // ledPosition to explosion time -std::map id_to_missiles; //regionId to missiles time -std::map led_to_missiles; // ledPosition to missils time -std::map id_to_drones; //regionId to missiles time -std::map led_to_drones; // ledPosition to missils time -std::map led_to_flag_color; // ledPosition to flag color - -std::pair homeDistrictMapping; // id to ledPosition home district mapping +std::map> id_to_alerts; //regionId to alert state and time +std::map> led_to_alerts; // ledPosition to alert state and time +std::map id_to_weather; //regionId to temperature +std::map led_to_weather; // ledPosition to temperature +std::map id_to_explosions; //regionId to explosion time +std::map led_to_explosions; // ledPosition to explosion time +std::map id_to_missiles; //regionId to missiles time +std::map led_to_missiles; // ledPosition to missils time +std::map id_to_drones; //regionId to missiles time +std::map led_to_drones; // ledPosition to missils time +std::map led_to_flag_color; // ledPosition to flag color +std::pair homeDistrictMapping; // id to ledPosition home district mapping std::pair (*ledMapping)(int key); @@ -1296,7 +1295,7 @@ bool saveHomeDistrict(int newHomeDistrict) { settings.saveInt(HOME_DISTRICT, newHomeDistrict); const char* homeDistrictName = getNameById(DISTRICTS, newHomeDistrict, DISTRICTS_COUNT); reportSettingsChange("home_district", getNameById(DISTRICTS, newHomeDistrict, DISTRICTS_COUNT)); - LOG.printf("home_district commited to preferences: $s\n", homeDistrictName); + LOG.printf("home_district commited to preferences: %s\n", homeDistrictName); ha.setHomeDistrict(homeDistrictName); ha.setMapModeCurrent(getNameById(MAP_MODES, getCurrentMapMode(), MAP_MODES_COUNT)); showServiceMessage(homeDistrictName, "Домашній регіон:", 2000); @@ -3254,22 +3253,27 @@ void mapAlarms() { if (isBgStripEnabled()) { // same as for local district int localDistrictLedCount = homeDistrictMapping.first; // get count of leds in local district - int localDistrictId = settings.getInt(HOME_DISTRICT); - fill_solid( - bg_strip, - settings.getInt(BG_LED_COUNT), - processAlarms( - id_to_alerts[localDistrictId].first, - id_to_alerts[localDistrictId].second, - id_to_explosions[localDistrictId], - id_to_missiles[localDistrictId], - id_to_drones[localDistrictId], - localDistrictLedCount > 0 ? homeDistrictMapping.second[0] : -1, - blinkBrightness, - notificationBrightness, - true - ) - ); + if (localDistrictLedCount <= 0) { + // if local district led is missing, fill bg strip with black color + fill_solid(bg_strip, settings.getInt(BG_LED_COUNT), CRGB::Black); + } else { + int localDistrictLed = homeDistrictMapping.second[0]; // get first led in local district + fill_solid( + bg_strip, + settings.getInt(BG_LED_COUNT), + processAlarms( + led_to_alerts[localDistrictLed].first, + led_to_alerts[localDistrictLed].second, + led_to_explosions[localDistrictLed], + led_to_missiles[localDistrictLed], + led_to_drones[localDistrictLed], + localDistrictLed, + blinkBrightness, + notificationBrightness, + true + ) + ); + } } FastLED.show(); } diff --git a/firmware/src/JaamUtils.h b/firmware/src/JaamUtils.h index 0dfad9d0..6d9002d0 100644 --- a/firmware/src/JaamUtils.h +++ b/firmware/src/JaamUtils.h @@ -279,7 +279,7 @@ static std::pair mapTranscarpatiaStart1(int key) { case 4: return std::make_pair(1, new int[1]{22}); case 3: return std::make_pair(1, new int[1]{23}); case 26: return std::make_pair(1, new int[1]{24}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -310,7 +310,7 @@ static std::pair mapOdessaStart1(int key) { case 4: return std::make_pair(1, new int[1]{6}); case 3: return std::make_pair(1, new int[1]{7}); case 26: return std::make_pair(1, new int[1]{8}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -323,7 +323,7 @@ static std::pair mapTranscarpatiaStart2(int key) { case 8: return std::make_pair(1, new int[1]{4}); case 5: return std::make_pair(1, new int[1]{5}); case 10: return std::make_pair(1, new int[1]{6}); - case 14: return std::make_pair(0, nullptr); + case 14: return std::make_pair(0, new int[0]{}); case 25: return std::make_pair(1, new int[1]{8}); case 20: return std::make_pair(1, new int[1]{9}); case 22: return std::make_pair(1, new int[1]{10}); @@ -342,7 +342,7 @@ static std::pair mapTranscarpatiaStart2(int key) { case 3: return std::make_pair(1, new int[1]{23}); case 26: return std::make_pair(1, new int[1]{24}); case 31: return std::make_pair(1, new int[1]{7}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -355,7 +355,7 @@ static std::pair mapOdessaStart2(int key) { case 8: return std::make_pair(1, new int[1]{13}); case 5: return std::make_pair(1, new int[1]{14}); case 10: return std::make_pair(1, new int[1]{15}); - case 14: return std::make_pair(0, nullptr); + case 14: return std::make_pair(0, new int[0]{}); case 25: return std::make_pair(1, new int[1]{17}); case 20: return std::make_pair(1, new int[1]{18}); case 22: return std::make_pair(1, new int[1]{19}); @@ -374,7 +374,7 @@ static std::pair mapOdessaStart2(int key) { case 3: return std::make_pair(1, new int[1]{7}); case 26: return std::make_pair(1, new int[1]{8}); case 31: return std::make_pair(1, new int[1]{16}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -406,7 +406,7 @@ static std::pair mapTranscarpatiaStart3(int key) { case 3: return std::make_pair(1, new int[1]{24}); case 26: return std::make_pair(1, new int[1]{25}); case 31: return std::make_pair(1, new int[1]{8}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -438,7 +438,7 @@ static std::pair mapOdessaStart3(int key) { case 3: return std::make_pair(1, new int[1]{7}); case 26: return std::make_pair(1, new int[1]{8}); case 31: return std::make_pair(1, new int[1]{17}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -470,7 +470,7 @@ static std::pair mapTranscarpatiaStart4(int key) { case 3: return std::make_pair(1, new int[1]{23}); case 26: return std::make_pair(1, new int[1]{24}); case 31: return std::make_pair(1, new int[1]{7}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } @@ -502,7 +502,7 @@ static std::pair mapOdessaStart4(int key) { case 3: return std::make_pair(1, new int[1]{7}); case 26: return std::make_pair(1, new int[1]{8}); case 31: return std::make_pair(1, new int[1]{16}); - default: return std::make_pair(0, nullptr); + default: return std::make_pair(0, new int[0]{}); } } From 69e18071642572238faaa4bedb8eff4c9c9eb54a Mon Sep 17 00:00:00 2001 From: Vladyslav Heneraliuk Date: Fri, 31 Jan 2025 00:53:27 +0200 Subject: [PATCH 4/4] update region IDs in updater --- updater/src/updater.cpp | 60 ++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/updater/src/updater.cpp b/updater/src/updater.cpp index a211fe2f..cb45adc2 100644 --- a/updater/src/updater.cpp +++ b/updater/src/updater.cpp @@ -14,38 +14,40 @@ const char* userSsid = ""; // WIFI-мережа замовника const char* userPassword = ""; // Пароль до WIFI мережі замовника -const char* firmwareUrl = "http://jaam.net.ua:2095/jaam.bin"; +const char* firmwareUrl = "http://ws.jaam.net.ua/jaam.bin"; // production +// const char* firmwareUrl = "http://ws.jaam.net.ua/beta/jaam_beta.bin"; // beta String identifier = "github"; // Домашні регіони -// "Закарпатська обл." = 0 -// "Ів.-Франківська обл." = 1 -// "Тернопільська обл." = 2 -// "Львівська обл." = 3 -// "Волинська обл." = 4 +// "Закарпатська обл." = 11 +// "Івано-Франківська обл." = 13 +// "Тернопільська обл." = 21 +// "Львівська обл." = 27 +// "Волинська обл." = 8 // "Рівненська обл." = 5 -// "Житомирська обл." = 6 -// "Київська обл." = 7 -// "Чернігівська обл." = 8 -// "Сумська обл." = 9 -// "Харківська обл." = 10 -// "Луганська обл." = 11 -// "Донецька обл." = 12 -// "Запорізька обл." = 13 -// "Херсонська обл." = 14 -// "АР Крим" = 15 -// "Одеська обл." = 16 +// "Житомирська обл." = 10 +// "Київська обл." = 14 +// "Чернігівська обл." = 25 +// "Сумська обл." = 20 +// "Харківська обл." = 22 +// "Луганська обл." = 16 +// "Донецька обл." = 28 +// "Запорізька обл." = 12 +// "Херсонська обл." = 23 +// "Автономна Республіка Крим" = 9999 +// "Одеська обл." = 18 // "Миколаївська обл." = 17 -// "Дніпропетровська обл." = 18 +// "Дніпропетровська обл." = 9 // "Полтавська обл." = 19 -// "Черкаська обл." = 20 -// "Кіровоградська обл." = 21 -// "Вінницька обл." = 22 -// "Хмельницька обл." = 23 -// "Чернівецька обл." = 24 -// "Київ" = 25 -const int home_district = 25; // Київ (за замовчуванням) +// "Черкаська обл." = 24 +// "Кіровоградська обл." = 15 +// "Вінницька обл." = 4 +// "Хмельницька обл." = 3 +// "Чернівецька обл." = 26 +// "м. Київ" = 31 + +const int home_district = 31; // Київ (за замовчуванням) void updateUserWifiCreds() { Serial.println("Disconnecting from WiFi..."); @@ -67,7 +69,7 @@ void updateFirmware() { // Default value for JAAM 1 preferences.putString("id", "JAAM"); preferences.putInt("legacy", 0); // JAAM 1 - preferences.putInt("hd", home_district); // home district + preferences.putInt("hmd", home_district); // home district Serial.println("Default JAAM 1 settings applied..."); @@ -76,7 +78,7 @@ void updateFirmware() { // Default value for JAAM 2 preferences.putString("id", "JAAM2"); preferences.putInt("legacy", 3); // JAAM 2 - preferences.putInt("hd", home_district); // home district + preferences.putInt("hmd", home_district); // home district preferences.putInt("brightness", 50); // global brightness in % preferences.putInt("brd", 50); // day brightness in % preferences.putInt("brn", 7); // night brightness in % @@ -112,6 +114,10 @@ void updateFirmware() { preferences.remove("dd"); // clear device description preferences.remove("bn"); // clear broadcaat name preferences.remove("ntph"); // clear ntp server host + preferences.remove("ha_brokeraddr"); // clear home assistant broker address + preferences.remove("ha_mqttport"); // clear home assistant mqtt port + preferences.remove("ha_mqttuser"); // clear home assistant mqtt user + preferences.remove("ha_mqttpass"); // clear home assistant mqtt password preferences.end();