From 50ce046275e60c76142a7b8e4c2a756c82f400a8 Mon Sep 17 00:00:00 2001 From: Mateusz Krajewski Date: Sat, 23 May 2026 19:39:02 +0000 Subject: [PATCH 1/2] feat: add primer continuity tester --- apps/ec/primer_service/app.cpp | 2 +- .../controller/primer_controller.cpp | 31 ++++++++----------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/apps/ec/primer_service/app.cpp b/apps/ec/primer_service/app.cpp index b765b76a..24b68607 100644 --- a/apps/ec/primer_service/app.cpp +++ b/apps/ec/primer_service/app.cpp @@ -33,7 +33,7 @@ int PrimerService::Run(const std::stop_token& token) { if (gpio_.SetPinValue(kHeartBeatPinID, 1, 500) != core::ErrorCode::kOk) { ara::log::LogWarn() << "PrimerService::Run: failed to toggle heartbeat pin"; } - // controller->VerifyPrimerConection(); + controller->VerifyPrimerConection(); const auto current_state = controller->GetPrimerState(); if (current_state != last_state) { ara::log::LogInfo() << "PrimerService::Run: primer state changed from " diff --git a/apps/ec/primer_service/controller/primer_controller.cpp b/apps/ec/primer_service/controller/primer_controller.cpp index 6ac00953..5b630aba 100644 --- a/apps/ec/primer_service/controller/primer_controller.cpp +++ b/apps/ec/primer_service/controller/primer_controller.cpp @@ -16,6 +16,7 @@ #include #include "mw/gpio_server/controller/gpio_controller.hpp" +#include "core/common/error_code.h" #include "ara/log/log.h" #include "core/common/condition.h" #include "core/json/json_parser.h" @@ -29,8 +30,8 @@ namespace { static constexpr uint16_t kIgniter_active_time = 2500; static constexpr uint8_t kPrimer_on = 1; static constexpr uint8_t kPrimer_off = 0; - static constexpr bool kRequire_primer_veryfication = false; - static constexpr auto kIgniter_measureme_adc_channel = 4; + static constexpr bool kRequire_primer_veryfication = true; + static constexpr auto kIgniter_measureme_adc_channel = 3; static constexpr auto kIgniter_measurement_adc_samples = 5; static constexpr auto kIgniter_connected_treshold_mV = 1500; @@ -60,6 +61,9 @@ PrimerController::PrimerController(): } void PrimerController::VerifyPrimerConection() { + if (!kRequire_primer_veryfication) { + return; + } auto verify_required = [this]() { auto primer_state = primerState.load(); return (primer_state == PrimerState_t::kUNKNOWN || primer_state == PrimerState_t::kNOT_CONNECTED || @@ -68,24 +72,13 @@ void PrimerController::VerifyPrimerConection() { if (!verify_required()) { return; } - float sum = 0; - auto sample_num = 0; - for (int i = 0; i < kIgniter_measurement_adc_samples; i++) { - auto voltage = adc_.GetAdcVoltage(kIgniter_measureme_adc_channel); - if (!voltage.has_value()) { - continue; - } - sum += voltage.value(); - sample_num += 1; - } - if (sample_num == 0) { - prim_logger.LogWarn() << "Primer verification skipped: ADC returned no valid samples"; + auto voltage = adc_.GetAdcVoltage(kIgniter_measureme_adc_channel); + if (!voltage.has_value()) { return; } - auto mean = sum / static_cast(sample_num); const auto previous_state = primerState.load(); auto next_state = previous_state; - if (mean >= kIgniter_connected_treshold_mV) { + if (voltage.value() >= kIgniter_connected_treshold_mV / 1000.0f) { next_state = PrimerState_t::kCONNECTED; } else { next_state = PrimerState_t::kNOT_CONNECTED; @@ -95,14 +88,16 @@ void PrimerController::VerifyPrimerConection() { if (previous_state != next_state) { prim_logger.LogInfo() << "Primer state changed from " << PrimerStateToString(previous_state) << " to " << PrimerStateToString(next_state) - << " (ADC mean: " << mean << " mV)"; + << " (ADC voltage: " << voltage.value() << " mV)"; } } void PrimerController::Initialize() { prim_logger.LogInfo() << "Initializing PrimerController"; this->primerState = PrimerState_t::kUNKNOWN; - this->adc_.Init(); + auto i2c = std::make_unique(); + i2c->Init(std::make_unique()); + this->adc_.Init(std::move(i2c)); prim_logger.LogInfo() << "PrimerController initialization complete"; } From 48574b24d80c1ab2b7e1b222bcb1d41f97dee3ca Mon Sep 17 00:00:00 2001 From: Mateusz Krajewski Date: Sat, 23 May 2026 19:39:30 +0000 Subject: [PATCH 2/2] refactor: move sensors to eeprom etc --- .devcontainer/devcontainer.json | 38 +++++-------- apps/ec/env_service/env_service.cpp | 39 +++++++------ apps/fc/env_service/BUILD | 1 + apps/fc/env_service/env_service.cpp | 56 +++++++++++++++++-- apps/fc/env_service/env_service.hpp | 3 +- apps/fc/radio_service/radio_controller.cpp | 2 +- deployment/apps/fc/env_service/config.json | 12 ---- deployment/apps/fc/radio_app/app_config.json | 6 +- deployment/cpu/fc/BUILD | 2 +- deployment/tools/ecu/BUILD | 10 ++-- .../controller/adcsensor/controller.cpp | 4 +- 11 files changed, 102 insertions(+), 71 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a32736db..76d83888 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,7 +3,7 @@ { "name": "C++ Bazel Podman (Native)", "image": "ghcr.io/simba-avionic/simba_avionics_dockers/devcontainer", - "customizations": { + "customizations": { "vscode": { "extensions": [ "ms-vscode.cpptools-extension-pack", @@ -15,7 +15,7 @@ "ms-python.vscode-pylance", "ms-python.vscode-python-envs" ], - "settings": { + "settings": { "cpplint.path": "/usr/local/bin/cpplint", "C_Cpp.default.cppStandard": "c++23", "C_Cpp.default.cStandard": "c23", @@ -24,38 +24,30 @@ "bsv.buildozer.executable": "/usr/local/bin/buildozer", "doxdocgen.generic.authorName": "${localEnv:DEV_AUTHOR_NAME}", "doxdocgen.generic.authorEmail": "${localEnv:DEV_AUTHOR_EMAIL}", - "editor.formatOnSave": true, - "[bazel]": { - "editor.defaultFormatter": "bazelbuild.vscode-bazel" - } } } }, "runArgs": [ "--userns=keep-id", - "--security-opt", "label=disable" + "--security-opt", + "label=disable" ], "mounts": [ "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind,consistency=cached", "source=bazel-cache-${localWorkspaceFolderBasename},target=/home/vscode/.cache,type=volume" ], - - // Features to add to the dev container. More info: https://containers.dev/features. - // "features": {}, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Use 'postCreateCommand' to run commands after the container is created. - // "postCreateCommand": "", - - // Configure tool-specific properties. - // "customizations": {}, - - // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. - "remoteUser": "vscode", + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "", + // Configure tool-specific properties. + // "customizations": {}, + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + "remoteUser": "vscode", "remoteEnv": { "DEV_AUTHOR_NAME": "${localEnv:DEV_AUTHOR_NAME}", "DEV_AUTHOR_EMAIL": "${localEnv:DEV_AUTHOR_EMAIL}" } -} +} \ No newline at end of file diff --git a/apps/ec/env_service/env_service.cpp b/apps/ec/env_service/env_service.cpp index 251e5db0..79eb85c7 100644 --- a/apps/ec/env_service/env_service.cpp +++ b/apps/ec/env_service/env_service.cpp @@ -97,11 +97,31 @@ int EnvService::Initialize(const std::map eeprom_cfg = config.GetConfig(); if (!eeprom_cfg.has_value()) { ara::log::LogError() << "Failed to load EEPROM temperature configuration"; return core::ErrorCode::kInitializeError; } + + auto register_sensor = [&](const std::string& raw_id, const std::string& label) -> core::ErrorCode { std::string physical_id = "28-" + raw_id; auto sensor_id = this->temp_->Register(physical_id); @@ -121,23 +141,6 @@ int EnvService::Initialize(const std::map(val * kPressure_sensor_multiplicator); eventIpc.Update(encodedVal); diff --git a/apps/fc/env_service/BUILD b/apps/fc/env_service/BUILD index 939c568e..450fce31 100644 --- a/apps/fc/env_service/BUILD +++ b/apps/fc/env_service/BUILD @@ -30,5 +30,6 @@ cc_binary( "//deployment/apps/fc/env_service:someip_lib", "//mw/i2c_service/controller/bme280:bme280_controller", "//core/json:simba_json", + "//mw/i2c_service/controller/24lc32at/eeprom_config:eeprom_config", ], ) \ No newline at end of file diff --git a/apps/fc/env_service/env_service.cpp b/apps/fc/env_service/env_service.cpp index 1a88a1cc..f7280a22 100644 --- a/apps/fc/env_service/env_service.cpp +++ b/apps/fc/env_service/env_service.cpp @@ -54,7 +54,7 @@ int EnvServiceFc::Initialize(const std::map(); auto i2c = std::make_unique(); @@ -80,7 +80,9 @@ int EnvServiceFc::Initialize(const std::maptemp_->Initialize(kSomeIPServiceID, std::bind(&EnvServiceFc::TempRxCallback, this, std::placeholders::_1), std::make_unique()); - ara::log::LogInfo() << "Cant connect to temp by id:" << kSomeIPServiceID << ", try num: " << i; + if (res != core::ErrorCode::kOk) { + ara::log::LogInfo() << "Cant connect to temp by id:" << kSomeIPServiceID << ", try num: " << i; + } i++; } while (res != core::ErrorCode::kOk && i < 6); if (res != core::ErrorCode::kOk) { @@ -91,6 +93,49 @@ int EnvServiceFc::Initialize(const std::map eeprom_cfg = config.GetConfig(); + if (!eeprom_cfg.has_value()) { + ara::log::LogError() << "Failed to load EEPROM temperature configuration"; + return core::ErrorCode::kInitializeError; + } + + auto register_sensor = [&](const std::string& raw_id, const std::string& label) -> core::ErrorCode { + std::string physical_id = "28-" + raw_id; + auto sensor_id = this->temp_->Register(physical_id); + + if (!sensor_id.has_value()) { + ara::log::LogError() << "Sensor_id is empty for " << label; + return core::ErrorCode::kInitializeError; + } + + sensorIdsToPaths[sensor_id.value()] = std::make_pair(label, physical_id); + return core::ErrorCode::kOk; + }; + if (register_sensor(eeprom_cfg.value().board_temp1_id, "board_1") != + core::ErrorCode::kOk) return core::ErrorCode::kInitializeError; + if (register_sensor(eeprom_cfg.value().board_temp2_id, "board_2") != + core::ErrorCode::kOk) return core::ErrorCode::kInitializeError; + if (register_sensor(eeprom_cfg.value().board_temp3_id, "board_3") != + core::ErrorCode::kOk) return core::ErrorCode::kInitializeError; + service_ipc.StartOffer(); service_udp.StartOffer(); return core::ErrorCode::kOk; @@ -139,6 +184,7 @@ int EnvServiceFc::LoadTempConfig(const std::mapStartRxThread(); while (!token.stop_requested()) { const auto start = std::chrono::high_resolution_clock::now(); @@ -179,11 +225,11 @@ void EnvServiceFc::TempRxCallback(const std::vector& << ", name: " << sensorName << ", temp: " << (static_cast(value) / 10.0f); - if (sensorName == "board_temp_1") { + if (sensorName == "board_1") { updateEvents(this->service_ipc.newBoardTempEvent_1, this->service_udp.newBoardTempEvent_1, value); - } else if (sensorName == "board_temp_2") { + } else if (sensorName == "board_2") { updateEvents(this->service_ipc.newBoardTempEvent_2, this->service_udp.newBoardTempEvent_2, value); - } else if (sensorName == "board_temp_3") { + } else if (sensorName == "board_3") { updateEvents(this->service_ipc.newBoardTempEvent_3, this->service_udp.newBoardTempEvent_3, value); } else { ara::log::LogWarn() << "ID spoza zakresu: " << hdr.actuator_id; diff --git a/apps/fc/env_service/env_service.hpp b/apps/fc/env_service/env_service.hpp index d06dc978..38b03af6 100644 --- a/apps/fc/env_service/env_service.hpp +++ b/apps/fc/env_service/env_service.hpp @@ -23,7 +23,7 @@ #include "ara/exec/adaptive_application.h" #include "mw/i2c_service/controller/bme280/controller.hpp" #include "srp/env/EnvAppFcSkeleton.h" - +#include "mw/i2c_service/controller/24lc32at/eeprom_config/cfg_manager.hpp" namespace srp { namespace envServiceFc { @@ -32,6 +32,7 @@ class EnvServiceFc final : public ara::exec::AdaptiveApplication { private: std::unique_ptr temp_{}; std::shared_ptr bme{}; + eeprom::ConfigManager config; std::unordered_map> sensorIdsToPaths{}; // [sensor_id] = {name, physical_id} diff --git a/apps/fc/radio_service/radio_controller.cpp b/apps/fc/radio_service/radio_controller.cpp index 422800e8..3804466b 100644 --- a/apps/fc/radio_service/radio_controller.cpp +++ b/apps/fc/radio_service/radio_controller.cpp @@ -49,7 +49,7 @@ void MavRadioController::TxThreadLoop(const std::stop_token& t) { if (!package_opt.has_value()) { continue; } - ara::log::LogWarn() << "Send: " << package_opt.value(); + ara::log::LogDebug() << "Send: " << package_opt.value(); uart_.Write(package_opt.value()); } } diff --git a/deployment/apps/fc/env_service/config.json b/deployment/apps/fc/env_service/config.json index 33816c7c..e2ca2705 100644 --- a/deployment/apps/fc/env_service/config.json +++ b/deployment/apps/fc/env_service/config.json @@ -1,16 +1,4 @@ { "sensors-temp": [ - { - "physical_id" : "28-00001111d147", - "name" : "board_temp_1" - }, - { - "physical_id" : "28-00001110f487", - "name" : "board_temp_2" - }, - { - "physical_id" : "28-00001110ce32", - "name" : "board_temp_3" - } ] } diff --git a/deployment/apps/fc/radio_app/app_config.json b/deployment/apps/fc/radio_app/app_config.json index 2268c020..7fddeede 100644 --- a/deployment/apps/fc/radio_app/app_config.json +++ b/deployment/apps/fc/radio_app/app_config.json @@ -16,7 +16,7 @@ "adaptive_application": { "RadioApp": { "app": { - "functional_groups":[ + "functional_groups": [ "Running", "SafetyMode" ], @@ -24,7 +24,7 @@ "logger": { "app_id": "RAD-", "app_des": "czytanie i wysyƂanie po radiu", - "log_level": "kDebug", + "log_level": "kInfo", "log_mode": "kRemote", "ctx": [ { @@ -132,4 +132,4 @@ ] } } -} +} \ No newline at end of file diff --git a/deployment/cpu/fc/BUILD b/deployment/cpu/fc/BUILD index ba830d4d..ce741298 100644 --- a/deployment/cpu/fc/BUILD +++ b/deployment/cpu/fc/BUILD @@ -21,7 +21,7 @@ cpu_def( srp_components = SIMBA_COMPUTER_BASE_APPS + [ # "//deployment/example_adaptive/ExampleApp", - # "//deployment/apps/fc/env_service:EnvAppFc", + "//deployment/apps/fc/env_service:EnvAppFc", "//deployment/apps/fc/gps_app:GPSApp", "//deployment/apps/fc/recovery_service:RecoveryService", "//deployment/apps/fc/radio_app:RadioApp", diff --git a/deployment/tools/ecu/BUILD b/deployment/tools/ecu/BUILD index b606797d..23002375 100644 --- a/deployment/tools/ecu/BUILD +++ b/deployment/tools/ecu/BUILD @@ -3,21 +3,21 @@ load("@srp_platform//tools/common:flash_ecu.bzl", "flash_ecu") flash_ecu( name = "flash_ec", file = ["//deployment/cpu/ec:pkg"], - ip = "192.168.10.51", - user_name = "root", + ip = "192.168.10.101", tool = select({ "//:sim": "//deployment/bazel:docker_flash_sh", "//conditions:default": "//deployment/bazel:flash_sh", }), + user_name = "root", ) flash_ecu( name = "flash_fc", file = ["//deployment/cpu/fc:pkg"], - ip = "192.168.10.52", - user_name = "root", + ip = "192.168.10.101", tool = select({ "//:sim": "//deployment/bazel:docker_flash_sh", "//conditions:default": "//deployment/bazel:flash_sh", }), -) \ No newline at end of file + user_name = "root", +) diff --git a/mw/i2c_service/controller/adcsensor/controller.cpp b/mw/i2c_service/controller/adcsensor/controller.cpp index 84bc79a1..2c13bc2b 100644 --- a/mw/i2c_service/controller/adcsensor/controller.cpp +++ b/mw/i2c_service/controller/adcsensor/controller.cpp @@ -45,8 +45,8 @@ core::ErrorCode ADCSensorController::Init(const std::string path, this->db_ = this->ReadConfig(obj_r.value()); for (const auto sensor : this->db_) { std::ostringstream ss; - ss << "register sensor id: " << sensor.first << " on ADC channel: " << - sensor.second.channel << " with y = " + ss << "register sensor id: " << static_cast(sensor.first) << " on ADC channel: " << + static_cast(sensor.second.channel) << " with y = " << std::fixed << std::setprecision(2) << sensor.second.a << " * V " << (sensor.second.b >= 0 ? "+ " : "- ") << abs(sensor.second.b); ara::log::LogInfo() << ss.str();