diff --git a/communication/decoder.cpp b/communication/decoder.cpp index eb9474f..060d2bd 100644 --- a/communication/decoder.cpp +++ b/communication/decoder.cpp @@ -5,6 +5,7 @@ #include "icsneo/communication/message/readsettingsmessage.h" #include "icsneo/communication/message/canerrorcountmessage.h" #include "icsneo/communication/message/neoreadmemorysdmessage.h" +#include "icsneo/communication/message/extendedresponsemessage.h" #include "icsneo/communication/message/flexray/control/flexraycontrolmessage.h" #include "icsneo/communication/command.h" #include "icsneo/device/device.h" @@ -193,6 +194,18 @@ bool Decoder::decode(std::shared_ptr& result, const std::shared_ptrdata.insert(msg->data.end(), packet->data.begin() + 4, packet->data.end()); return true; } + case Network::NetID::ExtendedCommand: { + if(packet->data.size() < sizeof(ExtendedResponseMessage::PackedGenericResponse)) + break; // Handle as a raw message, might not be a generic response + + const auto& resp = *reinterpret_cast(packet->data.data()); + if(resp.header.command != ExtendedCommand::GenericReturn) + break; // Handle as a raw message + + const auto msg = std::make_shared(resp.command, resp.returnCode); + result = msg; + return true; + } case Network::NetID::FlexRayControl: { auto frResult = std::make_shared(*packet); if(!frResult->decoded) { diff --git a/include/icsneo/communication/command.h b/include/icsneo/communication/command.h index eafdaf2..975f67e 100644 --- a/include/icsneo/communication/command.h +++ b/include/icsneo/communication/command.h @@ -31,6 +31,7 @@ enum class Command : uint8_t { }; enum class ExtendedCommand : uint16_t { + GenericReturn = 0x0000, GetDiskDetails = 0x0010, DiskFormatStart = 0x0011, DiskFormatCancel = 0x0012, @@ -39,6 +40,16 @@ enum class ExtendedCommand : uint16_t { Extract = 0x0015, StartDHCPServer = 0x0016, StopDHCPServer = 0x0017, + Reboot = 0x001C, +}; + +enum class ExtendedResponse : int32_t { + OK = 0, + InvalidCommand = -1, + InvalidState = -2, + OperationFailed = -3, + OperationPending = -4, + InvalidParameter = -5, }; } diff --git a/include/icsneo/communication/message/extendedresponsemessage.h b/include/icsneo/communication/message/extendedresponsemessage.h new file mode 100644 index 0000000..0ebaf3c --- /dev/null +++ b/include/icsneo/communication/message/extendedresponsemessage.h @@ -0,0 +1,37 @@ +#ifndef __EXTENDEDRESPONSEMESSAGE_H_ +#define __EXTENDEDRESPONSEMESSAGE_H_ + +#ifdef __cplusplus + +#include "icsneo/communication/message/message.h" +#include "icsneo/communication/command.h" + +namespace icsneo { + +class ExtendedResponseMessage : public Message { +public: + ExtendedResponseMessage(ExtendedCommand cmd, ExtendedResponse resp) + : Message(Message::Type::ExtendedResponse), command(cmd), response(resp) {} + + const ExtendedCommand command; + const ExtendedResponse response; + +#pragma pack(push, 1) + struct ResponseHeader { + ExtendedCommand command; + uint16_t length; + }; + + struct PackedGenericResponse { + ResponseHeader header; + ExtendedCommand command; // `header.command` is ExtendedCommand::GenericReturn, this is the real command + ExtendedResponse returnCode; + }; +#pragma pack(pop) +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/communication/message/message.h b/include/icsneo/communication/message/message.h index e26a4dd..3710b44 100644 --- a/include/icsneo/communication/message/message.h +++ b/include/icsneo/communication/message/message.h @@ -28,6 +28,7 @@ public: FlexRayControl = 0x8006, EthernetPhyRegister = 0x8007, LogicalDiskInfo = 0x8008, + ExtendedResponse = 0x8009, }; Message(Type t) : type(t) {} @@ -71,6 +72,9 @@ public: #define ICSNEO_MESSAGE_TYPE_DEVICE_VERSION (0x8004) #define ICSNEO_MESSAGE_TYPE_MAIN51 (0x8005) #define ICSNEO_MESSAGE_TYPE_FLEXRAY_CONTROL (0x8006) +#define ICSNEO_MESSAGE_TYPE_ETHERNET_PHY_REGISTER (0x8007) +#define ICSNEO_MESSAGE_TYPE_LOGICAL_DISK_INFO (0x8008) +#define ICSNEO_MESSAGE_TYPE_EXTENDED_RESPONSE (0x8009) #endif // __ICSNEOC_H_ diff --git a/include/icsneo/communication/network.h b/include/icsneo/communication/network.h index 6c96b6a..57f999d 100644 --- a/include/icsneo/communication/network.h +++ b/include/icsneo/communication/network.h @@ -119,6 +119,7 @@ public: LSFTCAN2 = 99, LogicalDiskInfo = 187, EthPHYControl = 239, + ExtendedCommand = 240, FlexRayControl = 243, HW_COM_Latency_Test = 512, DeviceStatus = 513, @@ -274,6 +275,7 @@ public: case NetID::ReadSettings: case NetID::LogicalDiskInfo: case NetID::EthPHYControl: + case NetID::ExtendedCommand: case NetID::NeoMemorySDRead: case NetID::NeoMemoryWriteDone: return Type::Internal; @@ -514,6 +516,8 @@ public: return "Logical Disk Information"; case NetID::EthPHYControl: return "Ethernet PHY Register Control"; + case NetID::ExtendedCommand: + return "Extended Command"; case NetID::FlexRayControl: return "FlexRay Control"; case NetID::HW_COM_Latency_Test: @@ -914,6 +918,7 @@ private: #define ICSNEO_NETID_LSFTCAN2 99 #define ICSNEO_NETID_LOGICAL_DISK_INFO 187 #define ICSNEO_NETID_ETH_PHY_CONTROL 239 +#define ICSNEO_NETID_EXTENDED_COMMAND 240 #define ICSNEO_NETID_FLEXRAY_CONTROL 243 #define ICSNEO_NETID_HW_COM_LATENCY_TEST 512 #define ICSNEO_NETID_DEVICE_STATUS 513