From 21cbf3954cdeaddafafa17698458d3825963338c Mon Sep 17 00:00:00 2001 From: Wiktor-Laska Date: Mon, 15 Dec 2025 21:47:03 +0100 Subject: [PATCH 1/5] did-Write dla i2c --- deployment/cpu/ec/BUILD | 1 + deployment/mw/i2c/BUILD | 1 + deployment/mw/i2c/app_config.json | 5 ++ mw/i2c_service/service/BUILD | 6 ++- mw/i2c_service/service/i2c_mw_write.h | 68 ++++++++++++++++++++++++++ mw/i2c_service/service/i2c_service.cpp | 9 ++-- mw/i2c_service/service/i2c_service.h | 7 +++ 7 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 mw/i2c_service/service/i2c_mw_write.h diff --git a/deployment/cpu/ec/BUILD b/deployment/cpu/ec/BUILD index 19e85ca2..8cc61578 100644 --- a/deployment/cpu/ec/BUILD +++ b/deployment/cpu/ec/BUILD @@ -33,6 +33,7 @@ cpu_def( "//deployment/apps/logger_service:FileLoggerApp", "//deployment/apps/prim_service:PrimerService", "//deployment/mw/timestamp_mw:timestamp_service", + ], ) diff --git a/deployment/mw/i2c/BUILD b/deployment/mw/i2c/BUILD index b04473af..d4d9eecd 100644 --- a/deployment/mw/i2c/BUILD +++ b/deployment/mw/i2c/BUILD @@ -4,6 +4,7 @@ filegroup( name = "instance", srcs = [ "app_config.json", + "//deployment/system_definition/diag/jobs/i2c_service/i2c_write:i2c_Write_job", ], visibility = ["//mw/i2c_service:__subpackages__"], ) diff --git a/deployment/mw/i2c/app_config.json b/deployment/mw/i2c/app_config.json index 15233388..3d6fe867 100644 --- a/deployment/mw/i2c/app_config.json +++ b/deployment/mw/i2c/app_config.json @@ -1,5 +1,6 @@ { "include": [ + "deployment/system_definition/diag/jobs/i2c_service/i2c_write/i2c_Write_did.json" ], "package": "srp.mw", "adaptive_application": { @@ -41,6 +42,10 @@ } }, "provide": [ + { + "name": "i2c_Write_did as i2c_Write_did", + "on": "diag" + } ] } } diff --git a/mw/i2c_service/service/BUILD b/mw/i2c_service/service/BUILD index 225613ba..74826924 100644 --- a/mw/i2c_service/service/BUILD +++ b/mw/i2c_service/service/BUILD @@ -6,12 +6,16 @@ i2c_drivers_deps = select({ cc_library( name = "i2c_lib", srcs = ["i2c_service.cpp"], - hdrs = ["i2c_service.h"], + hdrs = [ + "i2c_service.h", + "i2c_mw_write.h", + ], visibility = ["//mw/i2c_service:__subpackages__"], deps = [ "//communication-core/sockets:socket_ipc", "//mw/i2c_service/data:i2c_factory", "@srp_platform//ara/exec:adaptive_application_lib", "//core/common:condition_lib", + "@srp_platform//ara/diag:uds_lib", ] + i2c_drivers_deps, ) \ No newline at end of file diff --git a/mw/i2c_service/service/i2c_mw_write.h b/mw/i2c_service/service/i2c_mw_write.h new file mode 100644 index 00000000..484e7660 --- /dev/null +++ b/mw/i2c_service/service/i2c_mw_write.h @@ -0,0 +1,68 @@ +/** + * @file i2c_mw_write.h + * @author Wiktor Laska + * @brief + * @version 0.1 + * @date 2025-12-10 + * + * @copyright Copyright (c) 2024 + * + */ +#ifndef MW_I2C_READ_READ_I2C_READ_H_ +#define MW_I2C_READ_READ_I2C_READ_H_ +#include +#include +#include +#include +#include +#include +#include "ara/log/log.h" +#include "core/i2c/i2c_driver.hpp" +#include "ara/diag/generic_data_identifier.h" +#include "ara/diag/uds_error_domain.h" +#include "mw/i2c_service/service/i2c_service.h" +namespace srp { +namespace mw { + + +class I2CMWWRITE : public ara::diag::GenericDiD { + private: + std::shared_ptr i2c_; + /** + * @brief Callback for 0x22 UDS job (Read data by id) *optional + * + * @return DiagResponse + */ + ara::core::Result Read() noexcept override { + return ara::diag::MakeErrorCode( + ara::diag::UdsDiagErrc::kRequestOutOfRange); + } + + + ara::core::Result Write( + const std::vector &payload) noexcept override { + ara::log::LogInfo() << "Receive diag write req with payload size: " + << (uint16_t)payload.size() << ",p[0] = " << payload[0] << ",p[1] = " << payload[1]; + if (payload.size()%2 != 1) { + ara::log::LogWarn() << "Invalid payload size "; + return ara::diag::MakeErrorCode( + ara::diag::UdsDiagErrc::kInvalidMessageLengthFormat); + } + for(size_t i=1;ii2c_->Write(payload[i]); + } + ara::log::LogInfo() << "OK"; + return {}; +} + + public: + I2CMWWRITE(const ara::core::InstanceSpecifier &specifier, std::shared_ptr< + core::i2c::II2CDriver> i2c_d) + : ara::diag::GenericDiD{specifier}, i2c_(i2c_d) { + } +}; + +} // namespace mw +} // namespace srp + +#endif diff --git a/mw/i2c_service/service/i2c_service.cpp b/mw/i2c_service/service/i2c_service.cpp index f43a87ec..ffc74a9c 100644 --- a/mw/i2c_service/service/i2c_service.cpp +++ b/mw/i2c_service/service/i2c_service.cpp @@ -22,8 +22,7 @@ namespace { const constexpr char* I2C_IPC_ADDR = "SRP.I2C"; } I2CService::I2CService(): - i2c_logger_(ara::log::LoggingMenager::GetInstance()->CreateLogger("i2c", "", ara::log::LogLevel::kInfo)) {} - + i2c_logger_(ara::log::LoggingMenager::GetInstance()->CreateLogger("i2c", "", ara::log::LogLevel::kInfo)),did_instance("/srp/mw/i2cMWService/i2c_Write_did") {} core::ErrorCode I2CService::Init(std::shared_ptr i2c, std::unique_ptr socket) { @@ -42,7 +41,7 @@ std::optional> I2CService::ReadWrite( i2c_logger_.LogWarn() << ("Invalid payload size"); return std::nullopt; } - return i2c_->ReadWrite(payload[0], payload[1]); + return i2c_->ReadWrite(payload[0]); } std::optional> I2CService::WriteRead(const std::vector &payload, std::shared_ptr headerPtr) { @@ -119,6 +118,7 @@ std::vector I2CService::RxCallback(const std::string& ip, const std::ui int I2CService::Run(const std::stop_token& token) { core::condition::wait(token); this->sock_->StopRXThread(); + pin_did_->StopOffer(); return core::ErrorCode::kOk; } int I2CService::Initialize( @@ -136,6 +136,9 @@ int I2CService::Initialize( this->sock_->SetRXCallback(std::bind(&I2CService::RxCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); this->sock_->StartRXThread(); + + pin_did_ = std::make_unique(this->did_instance, this->i2c_); + pin_did_->Offer(); return core::ErrorCode::kOk; } diff --git a/mw/i2c_service/service/i2c_service.h b/mw/i2c_service/service/i2c_service.h index e6ca540b..8ef2106b 100644 --- a/mw/i2c_service/service/i2c_service.h +++ b/mw/i2c_service/service/i2c_service.h @@ -19,6 +19,8 @@ #include "ara/exec/adaptive_application.h" #include "communication-core/sockets/stream_ipc_socket.h" #include "core/i2c/i2c_driver.hpp" + +#include "mw/i2c_service/service/i2c_mw_write.h" #include "mw/i2c_service/data/header.h" namespace srp { namespace mw { @@ -30,6 +32,11 @@ class I2CService final : public ara::exec::AdaptiveApplication { std::unique_ptr sock_; protected: + std::unique_ptr pin_did_; + const ara::core::InstanceSpecifier did_instance; + int InitPins(); + + core::ErrorCode Init( std::shared_ptr i2c, std::unique_ptr socket); From 2f3d297a138d73f26df912212101d3e526f9f3fe Mon Sep 17 00:00:00 2001 From: Wiktor-Laska Date: Mon, 15 Dec 2025 21:57:27 +0100 Subject: [PATCH 2/5] dop --- deployment/system_definition | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/system_definition b/deployment/system_definition index 8d595ab5..5ac9d902 160000 --- a/deployment/system_definition +++ b/deployment/system_definition @@ -1 +1 @@ -Subproject commit 8d595ab576ab2498f271e57f63c324ba0431f315 +Subproject commit 5ac9d902063b9f33394236e294979cc3620ce573 From 83d0004388c9e2bab10401a5c4a40304911a1051 Mon Sep 17 00:00:00 2001 From: Wiktor-Laska Date: Tue, 13 Jan 2026 19:09:40 +0100 Subject: [PATCH 3/5] Dodanie funkcji did i2c_mw_read.cpp i i2c_mw_read.h do serwisu I2C --- deployment/mw/i2c/BUILD | 1 + deployment/mw/i2c/app_config.json | 9 +++++-- deployment/system_definition | 2 +- mw/i2c_service/service/BUILD | 7 ++++-- mw/i2c_service/service/i2c_mw_read.cpp | 34 +++++++++++++++++++++++++ mw/i2c_service/service/i2c_mw_read.h | 35 ++++++++++++++++++++++++++ mw/i2c_service/service/i2c_mw_write.h | 34 ++++++++++++++----------- mw/i2c_service/service/i2c_service.cpp | 5 +++- mw/i2c_service/service/i2c_service.h | 9 +++++-- 9 files changed, 114 insertions(+), 22 deletions(-) create mode 100644 mw/i2c_service/service/i2c_mw_read.cpp create mode 100644 mw/i2c_service/service/i2c_mw_read.h diff --git a/deployment/mw/i2c/BUILD b/deployment/mw/i2c/BUILD index d4d9eecd..ca128b75 100644 --- a/deployment/mw/i2c/BUILD +++ b/deployment/mw/i2c/BUILD @@ -5,6 +5,7 @@ filegroup( srcs = [ "app_config.json", "//deployment/system_definition/diag/jobs/i2c_service/i2c_write:i2c_Write_job", + "//deployment/system_definition/diag/jobs/i2c_service/i2c_read:i2c_Read_job", ], visibility = ["//mw/i2c_service:__subpackages__"], ) diff --git a/deployment/mw/i2c/app_config.json b/deployment/mw/i2c/app_config.json index 3d6fe867..761346e3 100644 --- a/deployment/mw/i2c/app_config.json +++ b/deployment/mw/i2c/app_config.json @@ -1,6 +1,7 @@ { "include": [ - "deployment/system_definition/diag/jobs/i2c_service/i2c_write/i2c_Write_did.json" + "deployment/system_definition/diag/jobs/i2c_service/i2c_write/i2c_Write_did.json", + "deployment/system_definition/diag/jobs/i2c_service/i2c_read/i2c_Read_did.json" ], "package": "srp.mw", "adaptive_application": { @@ -45,7 +46,11 @@ { "name": "i2c_Write_did as i2c_Write_did", "on": "diag" - } + }, + { + "name": "i2c_Read_did as i2c_Read_did", + "on": "diag" + } ] } } diff --git a/deployment/system_definition b/deployment/system_definition index 5ac9d902..8978dd28 160000 --- a/deployment/system_definition +++ b/deployment/system_definition @@ -1 +1 @@ -Subproject commit 5ac9d902063b9f33394236e294979cc3620ce573 +Subproject commit 8978dd28e4d6d8b7b684792c35bcd66696d5e238 diff --git a/mw/i2c_service/service/BUILD b/mw/i2c_service/service/BUILD index 74826924..ca858635 100644 --- a/mw/i2c_service/service/BUILD +++ b/mw/i2c_service/service/BUILD @@ -5,10 +5,13 @@ i2c_drivers_deps = select({ cc_library( name = "i2c_lib", - srcs = ["i2c_service.cpp"], + srcs = ["i2c_service.cpp", + "i2c_mw_read.cpp" + ], hdrs = [ "i2c_service.h", "i2c_mw_write.h", + "i2c_mw_read.h", ], visibility = ["//mw/i2c_service:__subpackages__"], deps = [ @@ -17,5 +20,5 @@ cc_library( "@srp_platform//ara/exec:adaptive_application_lib", "//core/common:condition_lib", "@srp_platform//ara/diag:uds_lib", - ] + i2c_drivers_deps, + ] + i2c_drivers_deps, ) \ No newline at end of file diff --git a/mw/i2c_service/service/i2c_mw_read.cpp b/mw/i2c_service/service/i2c_mw_read.cpp new file mode 100644 index 00000000..bc906f6b --- /dev/null +++ b/mw/i2c_service/service/i2c_mw_read.cpp @@ -0,0 +1,34 @@ +#include "mw/i2c_service/service/i2c_mw_read.h" +#include "mw/i2c_service/service/i2c_service.h" + +namespace srp { +namespace mw { + +I2CMWREAD::I2CMWREAD(const ara::core::InstanceSpecifier &specifier, I2CService* service, std::shared_ptr< + core::i2c::II2CDriver> i2c_) + : ara::diag::GenericDiD{specifier}, i2c_service_(service), i2c_(i2c_) {} + +ara::core::Result I2CMWREAD::Write(const std::vector &payload) noexcept { + if (payload.size() < 3 || !payload.size()%2) { + ara::log::LogInfo() << "Wrong payload size: " << payload.size(); + return ara::diag::MakeErrorCode(ara::diag::UdsDiagErrc::kSubFunctionNotSupported); + } + if (this->i2c_->Ioctl(payload[0]) != core::ErrorCode::kOk) { + ara::log::LogInfo() << "Wrong Input for payload i2c read"; + return {}; + } + + ara::log::LogInfo() << "Receive diag write req, calling I2CService::WriteRead"; + std::vector vec(payload.begin() + 1, payload.end()); + auto result = i2c_service_->WriteRead(vec, nullptr); + + if (result == std::nullopt) { + ara::log::LogInfo() << "Wrong Input for i2c WriteRead"; + return ara::diag::MakeErrorCode(ara::diag::UdsDiagErrc::kConditionsNotCorrect); + } + + return {}; +} + +} // namespace mw +} // namespace srp \ No newline at end of file diff --git a/mw/i2c_service/service/i2c_mw_read.h b/mw/i2c_service/service/i2c_mw_read.h new file mode 100644 index 00000000..0c0f57ee --- /dev/null +++ b/mw/i2c_service/service/i2c_mw_read.h @@ -0,0 +1,35 @@ +#ifndef MW_I2C_READ_I2C_READ_H_ +#define MW_I2C_READ_I2C_READ_H_ + +#include +#include +#include "ara/log/log.h" +#include "core/i2c/i2c_driver.hpp" +#include "ara/diag/generic_data_identifier.h" +#include "ara/diag/uds_error_domain.h" + +namespace srp { +namespace mw { + +class I2CService; + +class I2CMWREAD : public ara::diag::GenericDiD { + private: + srp::mw::I2CService* i2c_service_; + std::shared_ptr i2c_; + ara::core::Result Read() noexcept override { + return ara::diag::MakeErrorCode(ara::diag::UdsDiagErrc::kRequestOutOfRange); + } + + + ara::core::Result Write(const std::vector &payload) noexcept override; + + public: + I2CMWREAD(const ara::core::InstanceSpecifier &specifier, I2CService* service,std::shared_ptr< + core::i2c::II2CDriver> i2c_); +}; + +} // namespace mw +} // namespace srp + +#endif \ No newline at end of file diff --git a/mw/i2c_service/service/i2c_mw_write.h b/mw/i2c_service/service/i2c_mw_write.h index 484e7660..cadf422d 100644 --- a/mw/i2c_service/service/i2c_mw_write.h +++ b/mw/i2c_service/service/i2c_mw_write.h @@ -39,20 +39,26 @@ class I2CMWWRITE : public ara::diag::GenericDiD { } - ara::core::Result Write( - const std::vector &payload) noexcept override { - ara::log::LogInfo() << "Receive diag write req with payload size: " - << (uint16_t)payload.size() << ",p[0] = " << payload[0] << ",p[1] = " << payload[1]; - if (payload.size()%2 != 1) { - ara::log::LogWarn() << "Invalid payload size "; - return ara::diag::MakeErrorCode( - ara::diag::UdsDiagErrc::kInvalidMessageLengthFormat); - } - for(size_t i=1;ii2c_->Write(payload[i]); - } - ara::log::LogInfo() << "OK"; - return {}; + ara::core::Result Write( + const std::vector &payload) noexcept override { + if (payload.size()%2 != 1 || payload.size() < 3) { + ara::log::LogWarn() << "Invalid payload size: " << payload.size(); + return ara::diag::MakeErrorCode( + ara::diag::UdsDiagErrc::kSubFunctionNotSupported); + } + ara::log::LogInfo() << "Receive diag write req for address:" << payload[0] << ", with size: " + << (uint16_t)payload.size(); + if (this->i2c_->Ioctl(payload[0]) != core::ErrorCode::kOk) { + ara::log::LogInfo() << "Wrong Input for payload i2c write"; + return {}; + } + std::vector vec(payload.begin() + 1, payload.end()); + if (this->i2c_->Write(vec) == core::ErrorCode::kOk) { + ara::log::LogInfo() << "Wrong Input for i2c Write"; + return ara::diag::MakeErrorCode( + ara::diag::UdsDiagErrc::kSubFunctionNotSupported); + } + return {}; } public: diff --git a/mw/i2c_service/service/i2c_service.cpp b/mw/i2c_service/service/i2c_service.cpp index ffc74a9c..5dd8bc9d 100644 --- a/mw/i2c_service/service/i2c_service.cpp +++ b/mw/i2c_service/service/i2c_service.cpp @@ -22,7 +22,7 @@ namespace { const constexpr char* I2C_IPC_ADDR = "SRP.I2C"; } I2CService::I2CService(): - i2c_logger_(ara::log::LoggingMenager::GetInstance()->CreateLogger("i2c", "", ara::log::LogLevel::kInfo)),did_instance("/srp/mw/i2cMWService/i2c_Write_did") {} + i2c_logger_(ara::log::LoggingMenager::GetInstance()->CreateLogger("i2c", "", ara::log::LogLevel::kInfo)),did_instance("/srp/mw/i2cMWService/i2c_Write_did"), read_instance("/srp/mw/i2cMWService/i2c_Read_did") {} core::ErrorCode I2CService::Init(std::shared_ptr i2c, std::unique_ptr socket) { @@ -119,6 +119,7 @@ int I2CService::Run(const std::stop_token& token) { core::condition::wait(token); this->sock_->StopRXThread(); pin_did_->StopOffer(); + read_did_->StopOffer(); return core::ErrorCode::kOk; } int I2CService::Initialize( @@ -138,7 +139,9 @@ int I2CService::Initialize( this->sock_->StartRXThread(); pin_did_ = std::make_unique(this->did_instance, this->i2c_); + read_did_ = std::make_unique(this->read_instance, this, this->i2c_); pin_did_->Offer(); + read_did_->Offer(); return core::ErrorCode::kOk; } diff --git a/mw/i2c_service/service/i2c_service.h b/mw/i2c_service/service/i2c_service.h index 8ef2106b..7748b0bd 100644 --- a/mw/i2c_service/service/i2c_service.h +++ b/mw/i2c_service/service/i2c_service.h @@ -21,6 +21,8 @@ #include "core/i2c/i2c_driver.hpp" #include "mw/i2c_service/service/i2c_mw_write.h" + +#include "mw/i2c_service/service/i2c_mw_read.h" #include "mw/i2c_service/data/header.h" namespace srp { namespace mw { @@ -33,8 +35,11 @@ class I2CService final : public ara::exec::AdaptiveApplication { protected: std::unique_ptr pin_did_; + std::unique_ptr read_did_; const ara::core::InstanceSpecifier did_instance; - int InitPins(); + + const ara::core::InstanceSpecifier read_instance; + core::ErrorCode Init( @@ -52,7 +57,7 @@ class I2CService final : public ara::exec::AdaptiveApplication { std::vector ActionLogic( const std::shared_ptr headerPtr, std::optional> payload); - +friend class I2CMWREAD; public: int Run(const std::stop_token& token) override; int Initialize(const std::map From 289281b3d3209687d6a42beab3cb6384e8d89dfc Mon Sep 17 00:00:00 2001 From: Wiktor-Laska Date: Tue, 13 Jan 2026 19:18:45 +0100 Subject: [PATCH 4/5] system_definition --- deployment/system_definition | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/system_definition b/deployment/system_definition index 8978dd28..03a475b0 160000 --- a/deployment/system_definition +++ b/deployment/system_definition @@ -1 +1 @@ -Subproject commit 8978dd28e4d6d8b7b684792c35bcd66696d5e238 +Subproject commit 03a475b003e92ae398d3ad86a214206bcd3625d9 From 8bc556210c62afec8c90c3471defd1032180cb5c Mon Sep 17 00:00:00 2001 From: Mateusz Krajewski Date: Thu, 15 Jan 2026 13:26:04 +0100 Subject: [PATCH 5/5] . --- deployment/system_definition | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/system_definition b/deployment/system_definition index 03a475b0..293f42a0 160000 --- a/deployment/system_definition +++ b/deployment/system_definition @@ -1 +1 @@ -Subproject commit 03a475b003e92ae398d3ad86a214206bcd3625d9 +Subproject commit 293f42a013beb38ef509d39295edf35d3e6f38c9