From 936566170f605e78d315c5399b1ed2f8cdd4bbd3 Mon Sep 17 00:00:00 2001 From: Max Brombach Date: Mon, 17 Aug 2026 14:30:35 +0000 Subject: [PATCH] Communication: Add GenericAPIDataMessage and GenericAPIStatusMessage types --- CMakeLists.txt | 2 + communication/decoder.cpp | 8 ++++ .../message/genericapidatamessage.cpp | 28 ++++++++++++ .../message/genericapistatusmessage.cpp | 29 ++++++++++++ include/icsneo/communication/command.h | 3 ++ .../message/genericapidatamessage.h | 44 +++++++++++++++++++ .../message/genericapistatusmessage.h | 40 +++++++++++++++++ .../icsneo/communication/message/message.h | 2 + include/icsneo/device/device.h | 2 + 9 files changed, 158 insertions(+) create mode 100644 communication/message/genericapidatamessage.cpp create mode 100644 communication/message/genericapistatusmessage.cpp create mode 100644 include/icsneo/communication/message/genericapidatamessage.h create mode 100644 include/icsneo/communication/message/genericapistatusmessage.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 30ec2f9..c8d9f3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,6 +236,8 @@ set(SRC_FILES communication/message/clientidmessage.cpp communication/message/transmitmessage.cpp communication/message/spiportkeymessage.cpp + communication/message/genericapidatamessage.cpp + communication/message/genericapistatusmessage.cpp communication/packet/flexraypacket.cpp communication/packet/canpacket.cpp communication/packet/a2bpacket.cpp diff --git a/communication/decoder.cpp b/communication/decoder.cpp index ab30c7f..907dcc8 100644 --- a/communication/decoder.cpp +++ b/communication/decoder.cpp @@ -27,6 +27,8 @@ #include "icsneo/communication/message/networkmutexmessage.h" #include "icsneo/communication/message/clientidmessage.h" #include "icsneo/communication/message/spiportkeymessage.h" +#include "icsneo/communication/message/genericapidatamessage.h" +#include "icsneo/communication/message/genericapistatusmessage.h" #include "icsneo/communication/command.h" #include "icsneo/device/device.h" #include "icsneo/communication/packet/canpacket.h" @@ -345,6 +347,12 @@ bool Decoder::decode(std::shared_ptr& result, const std::shared_ptrdata); return true; + case ExtendedCommand::ReadGenericAPIData: + result = GenericAPIDataMessage::DecodeToMessage(packet->data); + return true; + case ExtendedCommand::ReadGenericAPIStatus: + result = GenericAPIStatusMessage::DecodeToMessage(packet->data); + return true; case ExtendedCommand::GetTC10Status: result = TC10StatusMessage::DecodeToMessage(packet->data); return true; diff --git a/communication/message/genericapidatamessage.cpp b/communication/message/genericapidatamessage.cpp new file mode 100644 index 0000000..619750a --- /dev/null +++ b/communication/message/genericapidatamessage.cpp @@ -0,0 +1,28 @@ +#include "icsneo/communication/message/genericapidatamessage.h" +#include "icsneo/communication/message/extendedresponsemessage.h" +#include "icsneo/communication/command.h" + +using namespace icsneo; + +std::shared_ptr GenericAPIDataMessage::DecodeToMessage(const std::vector& bytestream) { + if(bytestream.size() < sizeof(ExtendedResponseMessage::ResponseHeader)) + return nullptr; + + const auto* hdr = reinterpret_cast(bytestream.data()); + + if(hdr->command != ExtendedCommand::ReadGenericAPIData) + return nullptr; + + const size_t required = sizeof(ExtendedResponseMessage::ResponseHeader) + sizeof(GenericAPIDataHeader); + if(bytestream.size() < required) + return nullptr; + + auto msg = std::make_shared(); + + const auto* packet = reinterpret_cast(bytestream.data() + sizeof(ExtendedResponseMessage::ResponseHeader)); + + msg->functionId = packet->header.functionId; + msg->buffer.resize(packet->header.bufferLength); + std::copy(packet->buffer, packet->buffer + packet->header.bufferLength, msg->buffer.data()); + return msg; +} diff --git a/communication/message/genericapistatusmessage.cpp b/communication/message/genericapistatusmessage.cpp new file mode 100644 index 0000000..9c35d85 --- /dev/null +++ b/communication/message/genericapistatusmessage.cpp @@ -0,0 +1,29 @@ +#include "icsneo/communication/message/genericapistatusmessage.h" +#include "icsneo/communication/message/extendedresponsemessage.h" +#include "icsneo/communication/command.h" + +using namespace icsneo; + +std::shared_ptr GenericAPIStatusMessage::DecodeToMessage(const std::vector& bytestream) { + if(bytestream.size() < sizeof(ExtendedResponseMessage::ResponseHeader)) + return nullptr; + + const auto* hdr = reinterpret_cast(bytestream.data()); + + if(hdr->command != ExtendedCommand::ReadGenericAPIStatus) + return nullptr; + + const size_t required = sizeof(ExtendedResponseMessage::ResponseHeader) + sizeof(GenericAPIStatusResponsePacket); + if(bytestream.size() < required) + return nullptr; + + auto msg = std::make_shared(); + + const auto* packet = reinterpret_cast(bytestream.data() + sizeof(ExtendedResponseMessage::ResponseHeader)); + + msg->functionId = packet->functionId; + msg->finishedProcessing = static_cast(packet->finishedProcessing); + msg->functionError = packet->functionError; + msg->callbackError = packet->callbackError; + return msg; +} diff --git a/include/icsneo/communication/command.h b/include/icsneo/communication/command.h index a3e3fa5..f3b7818 100644 --- a/include/icsneo/communication/command.h +++ b/include/icsneo/communication/command.h @@ -73,8 +73,11 @@ enum class ExtendedCommand : uint16_t { GetComponentVersions = 0x001A, SoftwareUpdate = 0x001B, Reboot = 0x001C, + ReadGenericAPIStatus = 0x001D, SetRootFSEntryFlags = 0x0027, TransmitCoreminiMessage = 0x0028, + ReadGenericAPIData = 0x002E, + WriteGenericAPICommand = 0x002F, GenericBinaryInfo = 0x0030, LiveData = 0x0035, ExecuteSPIPortKeyOperation = 0x003C, diff --git a/include/icsneo/communication/message/genericapidatamessage.h b/include/icsneo/communication/message/genericapidatamessage.h new file mode 100644 index 0000000..d108d68 --- /dev/null +++ b/include/icsneo/communication/message/genericapidatamessage.h @@ -0,0 +1,44 @@ +#ifndef __GENERICAPIDATAMESSAGE_H_ +#define __GENERICAPIDATAMESSAGE_H_ + +#ifdef __cplusplus + +#include "icsneo/communication/message/message.h" + +#include +#include + +namespace icsneo { + +class GenericAPIDataMessage : public Message { +public: + static constexpr size_t GENERIC_API_BUFFER_SIZE = 513; + +#pragma pack(push, 1) + struct GenericAPIDataHeader { + uint16_t bufferLength; + uint8_t apiIndex; + uint8_t instance; + uint8_t functionId; + }; + + struct GenericAPIDataPacket + { + GenericAPIDataHeader header; + uint8_t buffer[GENERIC_API_BUFFER_SIZE]; + }; +#pragma pack(pop) + + static std::shared_ptr DecodeToMessage(const std::vector& bytestream); + + GenericAPIDataMessage() : Message(Type::GenericAPIData) {} + + uint8_t functionId; + std::vector buffer; +}; + +} // namespace icsneo + +#endif // __cplusplus + +#endif // __GENERICAPIDATAMESSAGE_H_ diff --git a/include/icsneo/communication/message/genericapistatusmessage.h b/include/icsneo/communication/message/genericapistatusmessage.h new file mode 100644 index 0000000..8c7c512 --- /dev/null +++ b/include/icsneo/communication/message/genericapistatusmessage.h @@ -0,0 +1,40 @@ +#ifndef __GENERICAPISTATUSMESSAGE_H_ +#define __GENERICAPISTATUSMESSAGE_H_ + +#ifdef __cplusplus + +#include "icsneo/communication/message/message.h" + +#include + +namespace icsneo { + +class GenericAPIStatusMessage : public Message { +public: +#pragma pack(push, 2) + struct GenericAPIStatusResponsePacket + { + uint8_t apiIndex; + uint8_t instance; + uint8_t functionId; + uint8_t functionError; + uint8_t callbackError; + uint8_t finishedProcessing; + }; +#pragma pack(pop) + + static std::shared_ptr DecodeToMessage(const std::vector& bytestream); + + GenericAPIStatusMessage() : Message(Type::GenericAPIStatus) {} + + uint8_t functionId; + bool finishedProcessing; + uint8_t functionError; + uint8_t callbackError; +}; + +} // namespace icsneo + +#endif // __cplusplus + +#endif // __GENERICAPISTATUSMESSAGE_H_ diff --git a/include/icsneo/communication/message/message.h b/include/icsneo/communication/message/message.h index 08e6d07..f323548 100644 --- a/include/icsneo/communication/message/message.h +++ b/include/icsneo/communication/message/message.h @@ -49,6 +49,8 @@ public: ClientId = 0x8017, AllMACAddresses = 0x8018, SPIPortKeyOperation = 0x8019, + GenericAPIData = 0x8020, + GenericAPIStatus = 0x8021, }; Message(Type t) : type(t) {} diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 41e365e..457d557 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -47,6 +47,8 @@ #include "icsneo/communication/message/livedatamessage.h" #include "icsneo/communication/message/tc10statusmessage.h" #include "icsneo/communication/message/spiportkeymessage.h" +#include "icsneo/communication/message/genericapidatamessage.h" +#include "icsneo/communication/message/genericapistatusmessage.h" #include "icsneo/core/macseccfg.h" #include "icsneo/communication/packet/genericbinarystatuspacket.h" #include "icsneo/communication/packet/livedatapacket.h"