From ebcd1394123e70a3196ebdbbb4c1443960e8eb64 Mon Sep 17 00:00:00 2001 From: Lefucjusz Date: Mon, 24 Apr 2023 19:37:38 +0200 Subject: [PATCH] [CP-1962] Add Harmony color detection * Added serial number based Harmony color detection. * Unified serial number handling for both products. --- .../crashdump_serial_number.cpp | 16 ++- .../crashdump_serial_number.hpp | 5 +- .../crashdump_serial_number.cpp | 17 +-- .../crashdump_serial_number.hpp | 5 +- harmony_changelog.md | 1 + image/system_a/data/lang/Deutsch.json | 1 + image/system_a/data/lang/English.json | 1 + image/system_a/data/lang/Espanol.json | 1 + image/system_a/data/lang/Francais.json | 1 + image/system_a/data/lang/Polski.json | 1 + module-services/service-db/CMakeLists.txt | 1 - .../agents/settings/FactorySettings.hpp | 25 ++-- .../agents/settings/SettingsAgent.cpp | 22 ++-- .../agents/settings/SettingsAgent.hpp | 11 +- .../service-db/test/CMakeLists.txt | 3 + .../service-db/test/test-factory-settings.cpp | 15 +-- .../service-desktop/DeviceColour.cpp | 11 +- .../service-desktop/ServiceDesktop.cpp | 15 ++- .../service-desktop/WorkerDesktop.cpp | 4 - .../include/service-desktop/DeviceColour.hpp | 3 +- .../src/purefs/fs/filesystem_syscalls.cpp | 4 +- products/BellHybrid/CMakeLists.txt | 2 +- .../ApplicationBellSettings.cpp | 2 +- .../application-bell-settings/CMakeLists.txt | 1 - .../models/AboutYourBellModel.cpp | 30 +++-- .../models/AboutYourBellModel.hpp | 6 +- .../serial-number-parser/CMakeLists.txt | 17 +++ .../SerialNumberParser.cpp | 118 ++++++++++++++++++ .../SerialNumberParser.hpp} | 6 +- .../serial-number-reader/CMakeLists.txt | 17 --- .../SerialNumberReader.cpp | 33 ----- .../services/db/BellFactorySettings.cpp | 47 +++++++ .../BellHybrid/services/db/CMakeLists.txt | 4 +- products/BellHybrid/services/db/ServiceDB.cpp | 17 ++- .../db/include/db/BellFactorySettings.hpp | 20 +++ .../services/desktop/endpoints/CMakeLists.txt | 2 +- .../deviceInfo/DeviceInfoEndpoint.cpp | 18 +-- .../deviceInfo/DeviceInfoEndpoint.hpp | 3 +- products/PurePhone/services/db/CMakeLists.txt | 2 + .../services/db/PureFactorySettings.cpp | 41 +++--- products/PurePhone/services/db/ServiceDB.cpp | 18 +-- .../db/include/db/PureFactorySettings.hpp | 25 ++++ .../services/db/include/db/ServiceDB.hpp | 3 +- .../deviceInfo/DeviceInfoEndpoint.cpp | 2 +- 44 files changed, 399 insertions(+), 198 deletions(-) create mode 100644 products/BellHybrid/serial-number-parser/CMakeLists.txt create mode 100644 products/BellHybrid/serial-number-parser/SerialNumberParser.cpp rename products/BellHybrid/{serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp => serial-number-parser/include/serial-number-parser/SerialNumberParser.hpp} (57%) delete mode 100644 products/BellHybrid/serial-number-reader/CMakeLists.txt delete mode 100644 products/BellHybrid/serial-number-reader/SerialNumberReader.cpp create mode 100644 products/BellHybrid/services/db/BellFactorySettings.cpp create mode 100644 products/BellHybrid/services/db/include/db/BellFactorySettings.hpp rename module-services/service-db/agents/settings/FactorySettings.cpp => products/PurePhone/services/db/PureFactorySettings.cpp (77%) create mode 100644 products/PurePhone/services/db/include/db/PureFactorySettings.hpp diff --git a/board/linux/crashdump-serial-number/crashdump_serial_number.cpp b/board/linux/crashdump-serial-number/crashdump_serial_number.cpp index bb30a4e6e6708ef26ced5f48a1ff21ef64e56867..11e0c9d3b7320765713123c29ef63cc1fbe665ad 100644 --- a/board/linux/crashdump-serial-number/crashdump_serial_number.cpp +++ b/board/linux/crashdump-serial-number/crashdump_serial_number.cpp @@ -5,11 +5,19 @@ namespace crashdump { - void setSerialNumber(const std::string &) - {} - std::string getSerialNumber() + namespace { - return ""; + std::string serialNumber{}; + } + + void setSerialNumber(const std::string &sn) + { + serialNumber = sn; + } + + const std::string &getSerialNumber() + { + return serialNumber; } } // namespace crashdump diff --git a/board/linux/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp b/board/linux/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp index d76cfbe750d8b1aa204fc0207e9d0dc6b33af057..c18ec8d6a84373535d80b5d723ff2f73a593b3dc 100644 --- a/board/linux/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp +++ b/board/linux/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp @@ -4,10 +4,11 @@ // Dummy file to keep linux variant compiling. #pragma once + #include + namespace crashdump { void setSerialNumber(const std::string &sn); - std::string getSerialNumber(); - + const std::string &getSerialNumber(); } // namespace crashdump diff --git a/board/rt1051/crashdump-serial-number/crashdump_serial_number.cpp b/board/rt1051/crashdump-serial-number/crashdump_serial_number.cpp index 1d6af9a7d0cc924fd6c78943654acfd827ac2dd3..792e62a89d4257f89472249ced0b065006a5ae10 100644 --- a/board/rt1051/crashdump-serial-number/crashdump_serial_number.cpp +++ b/board/rt1051/crashdump-serial-number/crashdump_serial_number.cpp @@ -3,19 +3,20 @@ #include -namespace -{ - std::string serial_number = "0000000000000"; -} namespace crashdump { - void setSerialNumber(const std::string &sn) + namespace { - serial_number = sn; + std::string serialNumber{}; } - std::string getSerialNumber() + + void setSerialNumber(const std::string &sn) { - return serial_number; + serialNumber = sn; } + const std::string &getSerialNumber() + { + return serialNumber; + } } // namespace crashdump diff --git a/board/rt1051/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp b/board/rt1051/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp index 34f8deeb6d5a36150d42523545440abfc68acff1..2d8d67cfe278805b22f0a0f36e940b3267ea4bf6 100644 --- a/board/rt1051/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp +++ b/board/rt1051/crashdump-serial-number/include/crashdump-serial-number/crashdump_serial_number.hpp @@ -8,10 +8,11 @@ // getSerialNumber() is called by the crash dump writer during file creation. #pragma once + #include + namespace crashdump { void setSerialNumber(const std::string &sn); - std::string getSerialNumber(); - + const std::string &getSerialNumber(); } // namespace crashdump diff --git a/harmony_changelog.md b/harmony_changelog.md index c09df3f0205aea7e45d414f9e1615bd197bbf5ed..7a3928ebdf1433badab1ae14a43fc6bdc1fa1bfc 100644 --- a/harmony_changelog.md +++ b/harmony_changelog.md @@ -26,6 +26,7 @@ * Added error message when files limit is exceeded in Relaxation app * Added label informing about PC connection. * Added serial number to About section +* Added possibility to detect device's case colour ### Changed / Improved diff --git a/image/system_a/data/lang/Deutsch.json b/image/system_a/data/lang/Deutsch.json index 1173f206c89183167ac8576f9f1e82970e759d14..d5fab3a57c71a90d3c03cb086def67ef745c6967 100644 --- a/image/system_a/data/lang/Deutsch.json +++ b/image/system_a/data/lang/Deutsch.json @@ -61,6 +61,7 @@ "app_bell_relaxation_timer_title": "Timer", "app_bell_settings_about": "Information", "app_bell_settings_about_info_text": "www.mudita.com", + "app_bell_settings_about_serial_number": "Seriennummer", "app_bell_settings_about_info_title": "Handbuch & Zertifikat-Info", "app_bell_settings_about_product": "Mudita Harmony", "app_bell_settings_about_storage_text": "Verbraucht $USED_MEMORYMB von $TOTAL_MEMORYMB", diff --git a/image/system_a/data/lang/English.json b/image/system_a/data/lang/English.json index 7a3d8f525967fb5ee33069e564a326a334c11b7e..326520bef552b02f057a966ed10f37e945f6d90a 100644 --- a/image/system_a/data/lang/English.json +++ b/image/system_a/data/lang/English.json @@ -95,6 +95,7 @@ "app_bell_reset_message": "Resetting Mudita
Harmony
", "app_bell_settings_about": "About", "app_bell_settings_about_info_text": "www.mudita.com", + "app_bell_settings_about_serial_number": "Serial number", "app_bell_settings_about_info_title": "Manual & certification info", "app_bell_settings_about_product": "Mudita Harmony", "app_bell_settings_about_storage_text": "$USED_MEMORYMB of $TOTAL_MEMORYMB used", diff --git a/image/system_a/data/lang/Espanol.json b/image/system_a/data/lang/Espanol.json index 3706f82ede6e0a64da75d8f36038e89b016cf068..c6e3dcc2c5c240fdce7ba1506099c9a86bf547ed 100644 --- a/image/system_a/data/lang/Espanol.json +++ b/image/system_a/data/lang/Espanol.json @@ -60,6 +60,7 @@ "app_bell_relaxation_timer_title": "Temporizador", "app_bell_settings_about": "Informaci\u00f3n", "app_bell_settings_about_info_text": "www.mudita.com", + "app_bell_settings_about_serial_number": "Número de serie", "app_bell_settings_about_info_title": "Manual y certificaci\u00f3n", "app_bell_settings_about_product": "Mudita Harmony", "app_bell_settings_about_storage_text": "Usados $USED_MEMORYMB de $TOTAL_MEMORYMB", diff --git a/image/system_a/data/lang/Francais.json b/image/system_a/data/lang/Francais.json index 2d07a84b2426de33f9bc8ffc4767d6a553fb564f..140a4500e8d855426576c7c1c113a68a4ce6d931 100644 --- a/image/system_a/data/lang/Francais.json +++ b/image/system_a/data/lang/Francais.json @@ -62,6 +62,7 @@ "app_bell_relaxation_timer_title": "Minuterie", "app_bell_settings_about": "\u00c0 propos", "app_bell_settings_about_info_text": "www.mudita.com", + "app_bell_settings_about_serial_number": "Numéro de série", "app_bell_settings_about_info_title": "Manuel et certification", "app_bell_settings_about_product": "Mudita Harmony", "app_bell_settings_about_storage_text": "$USED_MEMORY Mo sur $TOTAL_MEMORY Mo utilis\u00e9s", diff --git a/image/system_a/data/lang/Polski.json b/image/system_a/data/lang/Polski.json index a5251df339e766d327f5a7ac32fe4bb361071e12..4b50d0c366df2786a72e4d6d3e1586c79eaa7138 100644 --- a/image/system_a/data/lang/Polski.json +++ b/image/system_a/data/lang/Polski.json @@ -61,6 +61,7 @@ "app_bell_relaxation_timer_title": "Wy\u0142\u0105cznik czasowy", "app_bell_settings_about": "O produkcie", "app_bell_settings_about_info_text": "www.mudita.com", + "app_bell_settings_about_serial_number": "Numer seryjny", "app_bell_settings_about_info_title": "Instrukcja i informacje dot. certyfikacji", "app_bell_settings_about_product": "Mudita Harmony", "app_bell_settings_about_storage_text": "Zu\u017cyto $USED_MEMORYMB z $TOTAL_MEMORYMB", diff --git a/module-services/service-db/CMakeLists.txt b/module-services/service-db/CMakeLists.txt index b13c5ea7d97a4852cbfb504160f0a7bcb4a3bc89..2e030310e32c293f6120b923a788c0cb43891a03 100644 --- a/module-services/service-db/CMakeLists.txt +++ b/module-services/service-db/CMakeLists.txt @@ -17,7 +17,6 @@ set(SOURCES agents/settings/Settings.cpp agents/settings/SettingsProxy.cpp agents/settings/SettingsCache.cpp - agents/settings/FactorySettings.cpp agents/quotes/QuotesAgent.cpp agents/quotes/RandomizedQuoteModel.cpp agents/quotes/QuotesSettingsSerializer.cpp diff --git a/module-services/service-db/agents/settings/FactorySettings.hpp b/module-services/service-db/agents/settings/FactorySettings.hpp index d839b29caa4b493e1ebfffd9751697aa36b51c9e..1a0b7eb6da81cb4b036d3579cee2a90ca80b83b1 100644 --- a/module-services/service-db/agents/settings/FactorySettings.hpp +++ b/module-services/service-db/agents/settings/FactorySettings.hpp @@ -1,35 +1,24 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include -#include -#include -#include -#include "Settings_queries.hpp" namespace settings { namespace factory { - constexpr auto entry_key = "factory_data"; + static constexpr auto entry_key = "factory_data"; + static constexpr auto serial_number_key = "serial"; + static constexpr auto case_colour_key = "case_colour"; } class FactorySettings { public: - FactorySettings(std::string path) : filePath(path) - {} - - [[nodiscard]] std::unique_ptr getMfgEntries(); - void initDb(Database *database); - - private: - json11::Json readMfgSettings(const std::string &path); - std::string readFileContent(const std::string &filename) const noexcept; - - std::string filePath; + virtual ~FactorySettings() = default; + [[nodiscard]] virtual auto getMfgEntries() const -> std::unique_ptr = 0; + virtual auto initDb(Database *database) const -> void = 0; }; - } // namespace settings diff --git a/module-services/service-db/agents/settings/SettingsAgent.cpp b/module-services/service-db/agents/settings/SettingsAgent.cpp index e88579ac4ab145b5054a97f75ae807bc4caf909b..40c12e0b9bbbe174fd9d55c3f0138b4edf24cbdc 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.cpp +++ b/module-services/service-db/agents/settings/SettingsAgent.cpp @@ -1,8 +1,9 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SettingsAgent.hpp" #include "Settings_queries.hpp" +#include "FactorySettings.hpp" #include #include @@ -10,18 +11,11 @@ #include #include -namespace settings -{ - namespace factory - { - constexpr auto data_file = "personalization.json"; - const std::filesystem::path path = purefs::dir::getMfgConfPath() / data_file; - } // namespace factory - -} // namespace settings - -SettingsAgent::SettingsAgent(sys::Service *parentService, const std::string dbName, settings::SettingsCache *cache) - : DatabaseAgent(parentService), cache(cache), factorySettings(settings::factory::path), dbName{dbName} +SettingsAgent::SettingsAgent(sys::Service *parentService, + const std::string &dbName, + settings::FactorySettings *factorySettings, + settings::SettingsCache *cache) + : DatabaseAgent(parentService), cache(cache), dbName{dbName} { if (nullptr == cache) { this->cache = settings::SettingsCache::getInstance(); @@ -29,7 +23,7 @@ SettingsAgent::SettingsAgent(sys::Service *parentService, const std::string dbNa database = std::make_unique((purefs::dir::getDatabasesPath() / dbName).c_str()); - factorySettings.initDb(database.get()); + factorySettings->initDb(database.get()); // first approach -> take care about big amount of variables auto allVars = database->query(settings::Statements::getAllValues); diff --git a/module-services/service-db/agents/settings/SettingsAgent.hpp b/module-services/service-db/agents/settings/SettingsAgent.hpp index d3b4166b0ad64928107b10becf835f492a1992b1..8487fdae59c0650bf4b1e7d0ef427c55319a9e86 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.hpp +++ b/module-services/service-db/agents/settings/SettingsAgent.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -18,6 +18,7 @@ namespace settings struct EntryPath; class SettingsCache; } // namespace settings + namespace sys { class Service; @@ -26,7 +27,10 @@ namespace sys class SettingsAgent : public DatabaseAgent { public: - SettingsAgent(sys::Service *parentService, std::string dbName, settings::SettingsCache *cache = nullptr); + SettingsAgent(sys::Service *parentService, + const std::string &dbName, + settings::FactorySettings *factorySettings, + settings::SettingsCache *cache = nullptr); ~SettingsAgent() = default; void registerMessages() override; @@ -34,8 +38,7 @@ class SettingsAgent : public DatabaseAgent auto getAgentName() -> const std::string override; private: - settings::SettingsCache *cache; - settings::FactorySettings factorySettings; + settings::SettingsCache *cache = nullptr; using MapOfRecipentsToBeNotified = std::map>; MapOfRecipentsToBeNotified variableChangeRecipients; diff --git a/module-services/service-db/test/CMakeLists.txt b/module-services/service-db/test/CMakeLists.txt index 52f926cb60160e7e6735c059bcc386a71ecdda49..fb80ea2ea327f72a1f8b39e53234a13bac950966 100644 --- a/module-services/service-db/test/CMakeLists.txt +++ b/module-services/service-db/test/CMakeLists.txt @@ -7,6 +7,7 @@ add_catch2_executable( test-service-db-settings-messages.cpp test-service-db-quotes.cpp test-factory-settings.cpp + ${CMAKE_SOURCE_DIR}/products/PurePhone/services/db/PureFactorySettings.cpp LIBS module-db::test::helpers module-audio @@ -16,6 +17,8 @@ add_catch2_executable( module-vfs service-audio service-cellular + INCLUDE + ${CMAKE_SOURCE_DIR}/products/PurePhone/services/db/include/ ) add_catch2_executable( diff --git a/module-services/service-db/test/test-factory-settings.cpp b/module-services/service-db/test/test-factory-settings.cpp index fcb9731e988be83498ad578fa620e8c6fff85fa3..357ee58a9552fa223b1bdf9cf6e2dcdd91a39df8 100644 --- a/module-services/service-db/test/test-factory-settings.cpp +++ b/module-services/service-db/test/test-factory-settings.cpp @@ -1,18 +1,19 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include -#include #include +#include +#include const std::string valid_json = "{\"serial\" : \"00000000000000\", \"case_colour\" : \"nocase\"}"; const std::string invalid_json = "{\"serial\" : \"00000000000000\", \"case_colour\" : \"nocase\"}}"; constexpr auto schema = "CREATE TABLE IF NOT EXISTS settings_tab ( path TEXT NOT NULL UNIQUE PRIMARY KEY,value TEXT);"; -const auto valid_path = "valid.json"; -const auto invalid_path = "invalid.json"; +constexpr auto valid_path = "valid.json"; +constexpr auto invalid_path = "invalid.json"; namespace { @@ -35,7 +36,7 @@ TEST_CASE("Factory Settings") { spawnAndFillFile(valid_path, valid_json); - settings::FactorySettings factory{valid_path}; + settings::PureFactorySettings factory{valid_path}; auto entries = factory.getMfgEntries(); REQUIRE(entries->getRowCount() == 2); REQUIRE(entries->getFieldCount() == 2); @@ -47,7 +48,7 @@ TEST_CASE("Factory Settings") { spawnAndFillFile(invalid_path, invalid_json); - settings::FactorySettings factory{invalid_path}; + settings::PureFactorySettings factory{invalid_path}; auto entries = factory.getMfgEntries(); REQUIRE(entries->getRowCount() == 0); } @@ -62,7 +63,7 @@ TEST_CASE("Factory Settings Init") { spawnAndFillFile(valid_path, valid_json); - settings::FactorySettings factory{valid_path}; + settings::PureFactorySettings factory{valid_path}; factory.initDb(&db.get()); settings::EntryPath variablePath{ diff --git a/module-services/service-desktop/DeviceColour.cpp b/module-services/service-desktop/DeviceColour.cpp index 906411226e35ca4077085498debe70326e66d1ef..60c388994654e7721d497ceccd085ef785225314 100644 --- a/module-services/service-desktop/DeviceColour.cpp +++ b/module-services/service-desktop/DeviceColour.cpp @@ -1,15 +1,14 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include -#include + namespace { - constexpr auto NONE = "none"; + constexpr auto UNKNOWN = "unknown"; const std::map colour_to_version_map{ - {NONE, 0x0111}, {"black", 0x0112}, {"gray", 0x0113}}; - + {UNKNOWN, 0x0111}, {"black", 0x0112}, {"gray", 0x0113}}; } // namespace namespace device_colour @@ -18,7 +17,7 @@ namespace device_colour { auto it = colour_to_version_map.find(colour); if (it == colour_to_version_map.end()) { - return colour_to_version_map.at(NONE); + return colour_to_version_map.at(UNKNOWN); } return colour_to_version_map.at(colour); } diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 312bc50bc2ee0bfa0392b5d0b3afada5c4ba5467..eabec9fc0471e55de3ed8bad76b8d1727450ad70 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -109,7 +109,7 @@ auto ServiceDesktop::requestLogsFlush() -> void if ((responseMsg != nullptr) && responseMsg->retCode) { response = responseMsg->data; - LOG_DEBUG("Respone data: %d", response); + LOG_DEBUG("Response data: %d", response); } } if (ret.first == sys::ReturnCodes::Failure || response < 0) { @@ -172,10 +172,10 @@ auto ServiceDesktop::usbWorkerInit() -> sys::ReturnCodes if (initialized) { return sys::ReturnCodes::Success; } - auto serialNumber = getSerialNumber(); auto caseColour = getCaseColour(); - LOG_DEBUG("usbWorkerInit Serial Number: %s, Case Colour: %s", serialNumber.c_str(), caseColour.c_str()); + + LOG_DEBUG("Initializing USB worker, serial number: %s, case colour: %s", serialNumber.c_str(), caseColour.c_str()); desktopWorker = std::make_unique(this, std::bind(&ServiceDesktop::restartConnectionActiveTimer, this), @@ -191,13 +191,12 @@ auto ServiceDesktop::usbWorkerInit() -> sys::ReturnCodes {sdesktop::SIGNALLING_QUEUE_BUFFER_NAME, sizeof(WorkerDesktop::Signal), sdesktop::signallingQueueLength}}); if (!initialized) { - LOG_ERROR("!!! service-desktop usbWorkerInit failed to initialize worker, service-desktop won't work"); + LOG_FATAL("Failed to initialize USB worker, ServiceDesktop won't work!"); return sys::ReturnCodes::Failure; } - else { - desktopWorker->run(); - return sys::ReturnCodes::Success; - } + + desktopWorker->run(); + return sys::ReturnCodes::Success; } auto ServiceDesktop::usbWorkerDeinit() -> sys::ReturnCodes diff --git a/module-services/service-desktop/WorkerDesktop.cpp b/module-services/service-desktop/WorkerDesktop.cpp index ad66f06178f9aa03702d309d12306a9863c1e32a..dfeefd46b42477e74b84504e79b77e6d19258d7c 100644 --- a/module-services/service-desktop/WorkerDesktop.cpp +++ b/module-services/service-desktop/WorkerDesktop.cpp @@ -8,7 +8,6 @@ #include #include #include -#include "Timers/TimerFactory.hpp" #include #include @@ -16,11 +15,8 @@ #include #include -#include #include "system/messages/SentinelRegistrationMessage.hpp" -inline constexpr auto uploadFailedMessage = "file upload terminated before all data transferred"; - WorkerDesktop::WorkerDesktop(sys::Service *ownerServicePtr, std::function messageProcessedCallback, const sdesktop::USBSecurityModel &securityModel, diff --git a/module-services/service-desktop/include/service-desktop/DeviceColour.hpp b/module-services/service-desktop/include/service-desktop/DeviceColour.hpp index eb4787c9d1b737e312cb3838a8cd818b201f9605..542d23815d3cbb413b08025e5c01d8d81c3560b8 100644 --- a/module-services/service-desktop/include/service-desktop/DeviceColour.hpp +++ b/module-services/service-desktop/include/service-desktop/DeviceColour.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -8,5 +8,4 @@ namespace device_colour { std::uint16_t getColourVersion(const std::string &colour); - } // namespace device_colour diff --git a/module-vfs/src/purefs/fs/filesystem_syscalls.cpp b/module-vfs/src/purefs/fs/filesystem_syscalls.cpp index 653aa3666589ee5f34b0db580185f336c6550d15..9e499302c6850edcb92dedf11ff5794a7b50111c 100644 --- a/module-vfs/src/purefs/fs/filesystem_syscalls.cpp +++ b/module-vfs/src/purefs/fs/filesystem_syscalls.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include @@ -153,7 +153,7 @@ namespace purefs::fs const auto abspath = absolute_path(path); auto [mountp, pathpos] = find_mount_point(abspath); if (!mountp) { - LOG_ERROR("VFS: Unable to find specified mount point"); + LOG_ERROR("VFS: Unable to find specified mount point '%s'", abspath.c_str()); return -ENOENT; } auto fsops = mountp->fs_ops(); diff --git a/products/BellHybrid/CMakeLists.txt b/products/BellHybrid/CMakeLists.txt index deed7c056ee16374c69d387b6b945ad005b7e44c..50b84cd9b2e54d48f64199a3dbaa1179007d066e 100644 --- a/products/BellHybrid/CMakeLists.txt +++ b/products/BellHybrid/CMakeLists.txt @@ -170,7 +170,7 @@ add_subdirectory(apps) add_subdirectory(keymap) add_subdirectory(services) add_subdirectory(sys) -add_subdirectory(serial-number-reader) +add_subdirectory(serial-number-parser) add_subdirectory(paths) option(CONFIG_ENABLE_TEMP "Enable displaying temperature" OFF) diff --git a/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp b/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp index 6e5259b322a37f12c99f7b7ec4af11fc294628be..e186ed4522b3ae00af603126282e235750396240 100644 --- a/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp +++ b/products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ApplicationBellSettings.hpp" diff --git a/products/BellHybrid/apps/application-bell-settings/CMakeLists.txt b/products/BellHybrid/apps/application-bell-settings/CMakeLists.txt index fddeb092cdbcd46d23ac91d41b3b2ca482e38983..3f11441f5d3e2aa086d84792777b73d6844aedba 100644 --- a/products/BellHybrid/apps/application-bell-settings/CMakeLists.txt +++ b/products/BellHybrid/apps/application-bell-settings/CMakeLists.txt @@ -127,7 +127,6 @@ target_link_libraries(application-bell-settings bell::appmgr service-appmgr apps-common - serial-number-reader PUBLIC module-gui bell::app-common diff --git a/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.cpp b/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.cpp index df035555974f84c02f43df91a6cd020799664827..04df5af6c67af8b5f154bcc483e5234547b8f965 100644 --- a/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.cpp +++ b/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.cpp @@ -7,16 +7,21 @@ #include #include -#include #include #include #include #include +namespace +{ + constexpr auto factoryDataSerialPath = "factory_data/serial"; +} + namespace app::bell_settings { - AboutYourBellModel::AboutYourBellModel(app::ApplicationCommon *app) : application(app) + AboutYourBellModel::AboutYourBellModel(app::ApplicationCommon *app) { + settings.init(service::ServiceProxy{app->weak_from_this()}); createData(); } @@ -30,7 +35,7 @@ namespace app::bell_settings return gui::bell_settings_style::about_your_bell_window::height; } - void AboutYourBellModel::requestRecords(const uint32_t offset, const uint32_t limit) + void AboutYourBellModel::requestRecords(std::uint32_t offset, std::uint32_t limit) { setupModel(offset, limit); list->onProviderDataUpdate(); @@ -48,24 +53,27 @@ namespace app::bell_settings utils::translate("app_bell_settings_about_version"), gui::AboutYourBellListItem::TokenMap({{"$VERSION", std::string(VERSION)}}))); - internalData.push_back(new gui::AboutYourBellListItem(utils::translate("app_settings_tech_info_serial_number"), - serial_number_reader::readSerialNumber())); + internalData.push_back( + new gui::AboutYourBellListItem(utils::translate("app_bell_settings_about_serial_number"), + settings.getValue(factoryDataSerialPath, settings::SettingsScope::Global))); #if CONFIG_SHOW_MEMORY_INFO == 1 - struct statvfs stat; - const auto result = statvfs(purefs::dir::getRootDiskPath().c_str(), &stat); + struct statvfs stat + {}; + const auto result = statvfs(purefs::dir::getUserDiskPath().c_str(), &stat); if (result < 0) { - LOG_ERROR("Getting memory info failed! result = %d", result); + LOG_ERROR("Getting memory info failed, error: %d!", result); return; } - const auto totalMB = (stat.f_frsize * stat.f_blocks) / 1024LLU / 1024LLU; - const auto usedMB = totalMB - (stat.f_bfree * stat.f_bsize) / 1024LLU / 1024LLU; + constexpr auto bytesInMebibyte = 1024LLU * 1024LLU; + const auto totalMiB = (stat.f_frsize * stat.f_blocks) / bytesInMebibyte; + const auto usedMiB = totalMiB - (stat.f_bfree * stat.f_bsize) / bytesInMebibyte; internalData.push_back(new gui::AboutYourBellListItem( utils::translate("app_bell_settings_about_storage_title"), utils::translate("app_bell_settings_about_storage_text"), gui::AboutYourBellListItem::TokenMap( - {{"$USED_MEMORY", std::to_string(usedMB)}, {"$TOTAL_MEMORY", std::to_string(totalMB)}}))); + {{"$USED_MEMORY", std::to_string(usedMiB)}, {"$TOTAL_MEMORY", std::to_string(totalMiB)}}))); #endif internalData.push_back(new gui::AboutYourBellListItem(utils::translate("app_bell_settings_about_info_title"), diff --git a/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.hpp b/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.hpp index 7e39fa6a9d0f10bc7a18d610cbad09a530b8a653..54bb9897f8be2dbe74101799c82e5bcaae931a29 100644 --- a/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.hpp +++ b/products/BellHybrid/apps/application-bell-settings/models/AboutYourBellModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -20,9 +20,9 @@ namespace app::bell_settings [[nodiscard]] auto requestRecordsCount() -> unsigned int override; [[nodiscard]] auto getMinimalItemSpaceRequired() const -> unsigned int override; auto getItem(gui::Order order) -> gui::ListItem * override; - void requestRecords(const uint32_t offset, const uint32_t limit) override; + void requestRecords(std::uint32_t offset, std::uint32_t limit) override; private: - app::ApplicationCommon *application{}; + settings::Settings settings; }; } // namespace app::bell_settings diff --git a/products/BellHybrid/serial-number-parser/CMakeLists.txt b/products/BellHybrid/serial-number-parser/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e68c7c01ca40ac09abb84a9983c855889e9f60c5 --- /dev/null +++ b/products/BellHybrid/serial-number-parser/CMakeLists.txt @@ -0,0 +1,17 @@ +add_library(serial-number-parser STATIC) + + +target_sources(serial-number-parser + PUBLIC + SerialNumberParser.cpp +) + +target_include_directories(serial-number-parser + PUBLIC + $ +) + +target_link_libraries(serial-number-parser + PRIVATE + module-vfs +) diff --git a/products/BellHybrid/serial-number-parser/SerialNumberParser.cpp b/products/BellHybrid/serial-number-parser/SerialNumberParser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..36aaa28903333dc80a26ff5bdf4862d31d924308 --- /dev/null +++ b/products/BellHybrid/serial-number-parser/SerialNumberParser.cpp @@ -0,0 +1,118 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#include +#include +#include + +/* + * Old SN is in MMYYWWNNNNNNN form, where: + * MM - model code, 04 for Harmony; + * YY - production year; + * WW - production week; + * NNNNNNN - unique device number, defined per batch. + * + * ID string is a substring consisting of first 6 SN digits. + * + * + * New SN is in MMRRCYYWWNNNN form, where: + * MM - model code, 04 for Harmony; + * RR - hardware revision, P1, P2, P3...; + * C - case colour; G = gray, B = black; + * YY - production year; + * WW - production week; + * NNNN - unique device number, defined per batch. + * + */ + +namespace serial_number_parser +{ + namespace + { + /* Block device constants */ + constexpr auto blkdevName = "emmc0sys1"; + constexpr auto blockSize = 512; + constexpr auto blockToRead = 2; + constexpr auto blocksCount = 1; + + /* Common constants */ + constexpr auto serialNumberOffset = 0; + constexpr auto serialNumberLength = 13; + constexpr auto unknownSerialNumber = "0000000000000"; + constexpr auto unknownColour = "unknown"; + + /* Old serial number constants */ + constexpr auto idStringOffset = 0; + constexpr auto idStringLength = 6; + + /* ID string to colour map for already released batches */ + const std::map idStringToColourMap{ + {"042148", "gray"}, {"042213", "gray"}, {"042242", "black"}}; + + /* New serial number constants */ + constexpr auto colourCodeOffset = 4; + const std::map colourCodeToColourMap{{'G', "gray"}, {'B', "black"}}; + + bool isOldSerialNumberFormat(const std::string &serialNumber) + { + return (serialNumber.find_first_not_of("0123456789") == std::string::npos); + } + + std::string readSerialNumber() + { + char block[blockSize]; + + const auto diskManager = purefs::subsystem::disk_mgr(); + if (diskManager == nullptr) { + return ""; + } + + const auto status = diskManager->read(blkdevName, block, blockToRead, blocksCount); + if (status != 0) { + return ""; + } + + return std::string(&block[serialNumberOffset], serialNumberLength); + } + + std::string getDeviceColour(const std::string &serialNumber) + { + if (isOldSerialNumberFormat(serialNumber)) { + LOG_INFO("Device has old serial number format"); + const auto idString = serialNumber.substr(idStringOffset, idStringLength); + const auto item = idStringToColourMap.find(idString); + if (item == idStringToColourMap.end()) { + return ""; + } + return item->second; + } + else { + LOG_INFO("Device has new serial number format"); + const auto colourCode = serialNumber[colourCodeOffset]; + const auto item = colourCodeToColourMap.find(colourCode); + if (item == colourCodeToColourMap.end()) { + return ""; + } + return item->second; + } + } + } // namespace + + std::pair getDeviceMetadata() + { + const auto serialNumber = readSerialNumber(); + if (serialNumber.empty()) { + LOG_ERROR("Error reading serial number from eMMC!"); + return {unknownSerialNumber, unknownColour}; + } + + const auto deviceColour = getDeviceColour(serialNumber); + if (deviceColour.empty()) { + LOG_ERROR("Failed to read colour for device with serial number '%s'!", serialNumber.c_str()); + return {serialNumber, unknownColour}; + } + + return {serialNumber, deviceColour}; + } +} // namespace serial_number_parser diff --git a/products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp b/products/BellHybrid/serial-number-parser/include/serial-number-parser/SerialNumberParser.hpp similarity index 57% rename from products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp rename to products/BellHybrid/serial-number-parser/include/serial-number-parser/SerialNumberParser.hpp index 8b78711eeee8d644df021cc3ea7f17b685810e71..a4c4dace8013b47508d574f775f0a3c69d33f840 100644 --- a/products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp +++ b/products/BellHybrid/serial-number-parser/include/serial-number-parser/SerialNumberParser.hpp @@ -4,7 +4,7 @@ #pragma once #include -namespace serial_number_reader +namespace serial_number_parser { - const std::string &readSerialNumber(); -} // namespace serial_number_reader + std::pair getDeviceMetadata(); +} // namespace serial_number_parser diff --git a/products/BellHybrid/serial-number-reader/CMakeLists.txt b/products/BellHybrid/serial-number-reader/CMakeLists.txt deleted file mode 100644 index 3e247bf2fda224f9b0f96cd04b876d364c1e4239..0000000000000000000000000000000000000000 --- a/products/BellHybrid/serial-number-reader/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -add_library(serial-number-reader STATIC) - - -target_sources(serial-number-reader - PUBLIC - SerialNumberReader.cpp -) - -target_include_directories(serial-number-reader - PUBLIC - $ -) - -target_link_libraries(serial-number-reader - PRIVATE - module-vfs -) diff --git a/products/BellHybrid/serial-number-reader/SerialNumberReader.cpp b/products/BellHybrid/serial-number-reader/SerialNumberReader.cpp deleted file mode 100644 index 03b03960157e5994efc1f6b0ddf7801f9f4beb46..0000000000000000000000000000000000000000 --- a/products/BellHybrid/serial-number-reader/SerialNumberReader.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#include - -#include -#include - -namespace -{ - constexpr auto DEVICE_NAME = "emmc0sys1"; - constexpr auto EMMC_SN_LENGTH = 13; - constexpr auto EMMC_BUFFER_SIZE = 512; - constexpr auto SECTOR_TO_READ = 2; - constexpr auto SECTOR_COUNT = 1U; - - std::string readSerialNumberFromEmmc() - { - char buffer[EMMC_BUFFER_SIZE]; - purefs::subsystem::disk_mgr()->read(DEVICE_NAME, buffer, SECTOR_TO_READ, SECTOR_COUNT); - buffer[EMMC_SN_LENGTH] = '\0'; - return std::string(buffer); - } - -} // namespace -namespace serial_number_reader -{ - const std::string &readSerialNumber() - { - const static std::string serialNumber = readSerialNumberFromEmmc(); - return serialNumber; - } -} // namespace serial_number_reader diff --git a/products/BellHybrid/services/db/BellFactorySettings.cpp b/products/BellHybrid/services/db/BellFactorySettings.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1fc68fb933fc92bf9a4a09c138338d1533c71a57 --- /dev/null +++ b/products/BellHybrid/services/db/BellFactorySettings.cpp @@ -0,0 +1,47 @@ +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#include +#include +#include +#include + +namespace settings +{ + auto BellFactorySettings::getMfgEntries() const -> std::unique_ptr + { + const auto [serialNumber, colour] = serial_number_parser::getDeviceMetadata(); + auto factoryData = std::make_unique(); + + factoryData->addRow({Field(factory::serial_number_key), Field(serialNumber.c_str())}); + factoryData->addRow({Field(factory::case_colour_key), Field(colour.c_str())}); + + return factoryData; + } + + auto BellFactorySettings::initDb(Database *database) const -> void + { + const auto factoryData = getMfgEntries(); + + if (factoryData->getRowCount() <= 0) { + LOG_FATAL("No eMMC factory data available!"); + return; + } + + do { + const auto key = (*factoryData)[0].getString(); + const auto value = (*factoryData)[1].getCString(); + const auto path = settings::factory::entry_key + std::string("/") + key; + const auto pathString = settings::EntryPath{"", "", "", path, settings::SettingsScope::Global}.to_string(); + + if (!database->execute(settings::Statements::insertValue, pathString.c_str(), value)) { + LOG_ERROR("Failed to set entry '%s' = '%s'!", pathString.c_str(), value); + } + else { + LOG_INFO("Set entry '%s' = '%s'", pathString.c_str(), value); + } + + } while (factoryData->nextRow()); + } +} // namespace settings diff --git a/products/BellHybrid/services/db/CMakeLists.txt b/products/BellHybrid/services/db/CMakeLists.txt index 6207c713c36c0dcc481cb21632b2e882924e9c63..f5e34a67937f21d9826c69caebe323fb26fbc097 100644 --- a/products/BellHybrid/services/db/CMakeLists.txt +++ b/products/BellHybrid/services/db/CMakeLists.txt @@ -6,10 +6,12 @@ add_subdirectory(databases) target_sources(databases PRIVATE ServiceDB.cpp + BellFactorySettings.cpp agents/MeditationStatsAgent.cpp PUBLIC include/db/ServiceDB.hpp include/db/SystemSettings.hpp + include/db/BellFactorySettings.hpp ) target_include_directories(databases @@ -21,7 +23,7 @@ target_link_libraries(databases PRIVATE bell::db::meditation_stats service-db - serial-number-reader + serial-number-parser crashdump-serial-number ) diff --git a/products/BellHybrid/services/db/ServiceDB.cpp b/products/BellHybrid/services/db/ServiceDB.cpp index 93d87ec0d2a07330086e45480c4d932c77ee0aa1..73bae3fa9ad23363f011b6c433f8a7d388213bde 100644 --- a/products/BellHybrid/services/db/ServiceDB.cpp +++ b/products/BellHybrid/services/db/ServiceDB.cpp @@ -2,6 +2,7 @@ // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include +#include #include "agents/MeditationStatsAgent.hpp" @@ -13,11 +14,11 @@ #include #include +#include #include