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..ca128b75 100644 --- a/deployment/mw/i2c/BUILD +++ b/deployment/mw/i2c/BUILD @@ -4,6 +4,8 @@ filegroup( name = "instance", 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 15233388..761346e3 100644 --- a/deployment/mw/i2c/app_config.json +++ b/deployment/mw/i2c/app_config.json @@ -1,5 +1,7 @@ { "include": [ + "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": { @@ -41,6 +43,14 @@ } }, "provide": [ + { + "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 8d595ab5..293f42a0 160000 --- a/deployment/system_definition +++ b/deployment/system_definition @@ -1 +1 @@ -Subproject commit 8d595ab576ab2498f271e57f63c324ba0431f315 +Subproject commit 293f42a013beb38ef509d39295edf35d3e6f38c9 diff --git a/mw/i2c_service/service/BUILD b/mw/i2c_service/service/BUILD index 225613ba..ca858635 100644 --- a/mw/i2c_service/service/BUILD +++ b/mw/i2c_service/service/BUILD @@ -5,13 +5,20 @@ i2c_drivers_deps = select({ cc_library( name = "i2c_lib", - srcs = ["i2c_service.cpp"], - hdrs = ["i2c_service.h"], + 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 = [ "//communication-core/sockets:socket_ipc", "//mw/i2c_service/data:i2c_factory", "@srp_platform//ara/exec:adaptive_application_lib", "//core/common:condition_lib", - ] + i2c_drivers_deps, + "@srp_platform//ara/diag:uds_lib", + ] + 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 new file mode 100644 index 00000000..cadf422d --- /dev/null +++ b/mw/i2c_service/service/i2c_mw_write.h @@ -0,0 +1,74 @@ +/** + * @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 { + 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: + 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..5dd8bc9d 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"), read_instance("/srp/mw/i2cMWService/i2c_Read_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,8 @@ 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(); + read_did_->StopOffer(); return core::ErrorCode::kOk; } int I2CService::Initialize( @@ -136,6 +137,11 @@ 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_); + 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 e6ca540b..7748b0bd 100644 --- a/mw/i2c_service/service/i2c_service.h +++ b/mw/i2c_service/service/i2c_service.h @@ -19,6 +19,10 @@ #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/service/i2c_mw_read.h" #include "mw/i2c_service/data/header.h" namespace srp { namespace mw { @@ -30,6 +34,14 @@ class I2CService final : public ara::exec::AdaptiveApplication { std::unique_ptr sock_; protected: + std::unique_ptr pin_did_; + std::unique_ptr read_did_; + const ara::core::InstanceSpecifier did_instance; + + const ara::core::InstanceSpecifier read_instance; + + + core::ErrorCode Init( std::shared_ptr i2c, std::unique_ptr socket); @@ -45,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