From d0f3e593df3a2c36d2897833a62c3542673fbcae Mon Sep 17 00:00:00 2001 From: Kyle Schwarz Date: Mon, 2 Dec 2024 20:02:06 -0500 Subject: [PATCH] Device: Add RAD-Galaxy 2 --- README.md | 1 + .../python/icsneopy/device/devicetype.cpp | 1 + device/devicefinder.cpp | 8 + include/icsneo/device/devicetype.h | 4 + .../device/tree/radgalaxy2/radgalaxy2.h | 120 +++++++++++ .../tree/radgalaxy2/radgalaxy2settings.h | 192 ++++++++++++++++++ include/icsneo/icsnVC40.h | 97 ++++++++- include/icsneo/platform/posix/devices.h | 1 + include/icsneo/platform/windows/devices.h | 1 + 9 files changed, 424 insertions(+), 1 deletion(-) create mode 100644 include/icsneo/device/tree/radgalaxy2/radgalaxy2.h create mode 100644 include/icsneo/device/tree/radgalaxy2/radgalaxy2settings.h diff --git a/README.md b/README.md index f0275ed..2724676 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ each of the respective APIs. - RAD-Comet 2 - RAD-Comet 3 - RAD-Galaxy +- RAD-Galaxy 2 - RAD-Gigastar - RAD-Gigastar 2 - RAD-Moon 2 diff --git a/bindings/python/icsneopy/device/devicetype.cpp b/bindings/python/icsneopy/device/devicetype.cpp index 931aa7f..57a9bb7 100644 --- a/bindings/python/icsneopy/device/devicetype.cpp +++ b/bindings/python/icsneopy/device/devicetype.cpp @@ -33,6 +33,7 @@ void init_devicetype(pybind11::module_& m) { .value("EtherBADGE", DeviceType::Enum::EtherBADGE) .value("RAD_A2B", DeviceType::Enum::RAD_A2B) .value("RADEpsilon", DeviceType::Enum::RADEpsilon) + .value("RADGalaxy2", DeviceType::Enum::RADGalaxy2) .value("RADMoon3", DeviceType::Enum::RADMoon3) .value("RADComet", DeviceType::Enum::RADComet) .value("FIRE3_FlexRay", DeviceType::Enum::FIRE3_FlexRay) diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index 17770ab..f5ba93b 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -197,6 +197,10 @@ std::vector> DeviceFinder::FindAll() { makeIfSerialMatches(dev, newFoundDevices); #endif + #ifdef __RADGALAXY2_H_ + makeIfSerialMatches(dev, newFoundDevices); + #endif + #ifdef __RADMARS_H_ makeIfSerialMatches(dev, newFoundDevices); #endif @@ -352,6 +356,10 @@ const std::vector& DeviceFinder::GetSupportedDevices() { RADGalaxy::DEVICE_TYPE, #endif + #ifdef __RADGALAXY2_H_ + RADGalaxy2::DEVICE_TYPE, + #endif + #ifdef __RADMARS_H_ RADMars::DEVICE_TYPE, #endif diff --git a/include/icsneo/device/devicetype.h b/include/icsneo/device/devicetype.h index c6d377e..64b5ee8 100644 --- a/include/icsneo/device/devicetype.h +++ b/include/icsneo/device/devicetype.h @@ -47,6 +47,7 @@ public: EtherBADGE = (0x00000016), RAD_A2B = (0x00000017), RADEpsilon = (0x00000018), + RADGalaxy2 = (0x00000021), RADMoon3 = (0x00000023), RADComet = (0x00000024), FIRE3_FlexRay = (0x00000025), @@ -182,6 +183,8 @@ public: return "neoVI Flex"; case RADGalaxy: return "RAD-Galaxy"; + case RADGalaxy2: + return "RAD-Galaxy 2"; case RADStar2: return "RAD-Star 2"; case VividCAN: @@ -248,6 +251,7 @@ private: #define ICSNEO_DEVICETYPE_ETHERBADGE ((devicetype_t)0x00000016) #define ICSNEO_DEVICETYPE_RAD_A2B ((devicetype_t)0x00000017) #define ICSNEO_DEVICETYPE_RADEPSILON ((devicetype_t)0x00000018) +#define ICSNEO_DEVICETYPE_RADGALAXY2 ((devicetype_t)0x00000021) #define ICSNEO_DEVICETYPE_RADMoon3 ((devicetype_t)0x00000023) #define ICSNEO_DEVICETYPE_RADCOMET ((devicetype_t)0x00000024) #define ICSNEO_DEVICETYPE_FIRE3FLEXRAY ((devicetype_t)0x00000025) diff --git a/include/icsneo/device/tree/radgalaxy2/radgalaxy2.h b/include/icsneo/device/tree/radgalaxy2/radgalaxy2.h new file mode 100644 index 0000000..1946438 --- /dev/null +++ b/include/icsneo/device/tree/radgalaxy2/radgalaxy2.h @@ -0,0 +1,120 @@ +#ifndef __RADGALAXY2_H_ +#define __RADGALAXY2_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/communication/packetizer.h" +#include "icsneo/communication/decoder.h" +#include "icsneo/disk/extextractordiskreaddriver.h" +#include "icsneo/disk/neomemorydiskdriver.h" +#include "icsneo/device/tree/radgalaxy2/radgalaxy2settings.h" + +namespace icsneo { + +class RADGalaxy2 : public Device { +public: + // Serial numbers start with G2 + // Ethernet MAC allocation is 0x17, standard driver is Raw + ICSNEO_FINDABLE_DEVICE(RADGalaxy2, DeviceType::RADGalaxy2, "G2"); + + static const std::vector& GetSupportedNetworks() { + static std::vector supportedNetworks = { + Network::NetID::HSCAN, + Network::NetID::MSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4, + Network::NetID::HSCAN5, + Network::NetID::HSCAN6, + Network::NetID::HSCAN7, + + Network::NetID::LIN, + Network::NetID::LIN2, + + Network::NetID::Ethernet, + Network::NetID::Ethernet2, + Network::NetID::Ethernet3, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2, + Network::NetID::OP_Ethernet3, + Network::NetID::OP_Ethernet4, + Network::NetID::OP_Ethernet5, + Network::NetID::OP_Ethernet6, + Network::NetID::OP_Ethernet7, + Network::NetID::OP_Ethernet8, + Network::NetID::OP_Ethernet9, + Network::NetID::OP_Ethernet10, + Network::NetID::OP_Ethernet11, + Network::NetID::OP_Ethernet12, + + Network::NetID::ISO9141, + Network::NetID::ISO9141_2, + + Network::NetID::MDIO1, + Network::NetID::MDIO2, + Network::NetID::MDIO3, + Network::NetID::MDIO4, + Network::NetID::MDIO5, + }; + return supportedNetworks; + } + + size_t getEthernetActivationLineCount() const override { return 1; } + + bool supportsTC10() const override { return true; } + +protected: + RADGalaxy2(neodevice_t neodevice, const driver_factory_t& makeDriver) : Device(neodevice) { + initialize(makeDriver); + } + + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; + } + + void setupEncoder(Encoder& encoder) override { + Device::setupEncoder(encoder); + encoder.supportCANFD = true; + encoder.supportEthPhy = true; + } + + void setupDecoder(Decoder& decoder) override { + Device::setupDecoder(decoder); + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns + } + + void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : GetSupportedNetworks()) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + + void handleDeviceStatus(const std::shared_ptr& message) override { + if(message->data.size() < sizeof(radgalaxy2_status_t)) + return; + std::lock_guard lk(ioMutex); + const radgalaxy2_status_t* status = reinterpret_cast(message->data.data()); + ethActivationStatus = status->ethernetActivationLineEnabled; + } + + std::optional getCoreminiStartAddressFlash() const override { + return 512*4; + } + + std::optional getCoreminiStartAddressSD() const override { + return 0; + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgalaxy2/radgalaxy2settings.h b/include/icsneo/device/tree/radgalaxy2/radgalaxy2settings.h new file mode 100644 index 0000000..7639a41 --- /dev/null +++ b/include/icsneo/device/tree/radgalaxy2/radgalaxy2settings.h @@ -0,0 +1,192 @@ +#ifndef __RADGALAXY2SETTINGS_H_ +#define __RADGALAXY2SETTINGS_H_ + +#include "icsneo/device/idevicesettings.h" +#include + +#ifdef __cplusplus + +namespace icsneo { + +#endif + +#pragma pack(push, 2) + +typedef struct { + uint32_t ecu_id; + uint16_t perf_en; + + /* CAN */ + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + CAN_SETTINGS can3; + CANFD_SETTINGS canfd3; + CAN_SETTINGS can4; + CANFD_SETTINGS canfd4; + CAN_SETTINGS can5; + CANFD_SETTINGS canfd5; + CAN_SETTINGS can6; + CANFD_SETTINGS canfd6; + CAN_SETTINGS can7; + CANFD_SETTINGS canfd7; + CAN_SETTINGS can8; + CANFD_SETTINGS canfd8; + + // SWCAN_SETTINGS swcan1; G2 does not have SWCAN. + uint16_t network_enables; + // SWCAN_SETTINGS swcan2; G2 does not have SWCAN. + uint16_t network_enables_2; + + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + + uint16_t network_enabled_on_boot; + + /* ISO15765-2 Transport Layer */ + uint16_t iso15765_separation_time_offset; + + /* ISO9141 - Keyword */ + uint16_t iso_9141_kwp_enable_reserved; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_1; + uint16_t iso_parity_1; + + uint16_t iso_msg_termination_1; + + uint16_t idle_wakeup_network_enables_1; + uint16_t idle_wakeup_network_enables_2; + + /* reserved for T1 networks such as BR1, BR2, etc.. */ + uint16_t network_enables_3; + uint16_t idle_wakeup_network_enables_3; + + STextAPISettings text_api; + + uint64_t termination_enables; // New feature unlike Galaxy. + + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + struct + { + uint16_t hwComLatencyTestEn : 1; + uint16_t reserved : 15; + } flags; + + LIN_SETTINGS lin1; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + OP_ETH_SETTINGS opEth2; + OP_ETH_SETTINGS opEth3; + OP_ETH_SETTINGS opEth4; + OP_ETH_SETTINGS opEth5; + OP_ETH_SETTINGS opEth6; + OP_ETH_SETTINGS opEth7; + OP_ETH_SETTINGS opEth8; + OP_ETH_SETTINGS opEth9; + OP_ETH_SETTINGS opEth10; + OP_ETH_SETTINGS opEth11; + OP_ETH_SETTINGS opEth12; + OP_ETH_SETTINGS opEth13; + OP_ETH_SETTINGS opEth14; + OP_ETH_SETTINGS opEth15; + OP_ETH_SETTINGS opEth16; + + ETHERNET10G_SETTINGS ethernet10g; + ETHERNET10G_SETTINGS ethernet10g_2; + ETHERNET10G_SETTINGS ethernet10g_3; + + uint16_t network_enables_4; + RAD_REPORTING_SETTINGS reporting; + RAD_GPTP_SETTINGS gPTP; + + uint64_t network_enables_5; + + LIN_SETTINGS lin2; +} radgalaxy2_settings_t; + +typedef struct { + uint8_t unused[3]; + uint8_t ethernetActivationLineEnabled; +} radgalaxy2_status_t; + +#pragma pack(pop) + +#ifdef __cplusplus + +#include + +class RADGalaxy2Settings : public IDeviceSettings { +public: + RADGalaxy2Settings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radgalaxy2_settings_t)) {} + const CAN_SETTINGS* getCANSettingsFor(Network net) const override { + auto cfg = getStructurePointer(); + if(cfg == nullptr) + return nullptr; + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::MSCAN: + return &(cfg->can2); + case Network::NetID::HSCAN2: + return &(cfg->can3); + case Network::NetID::HSCAN3: + return &(cfg->can4); + case Network::NetID::HSCAN4: + return &(cfg->can5); + case Network::NetID::HSCAN5: + return &(cfg->can6); + case Network::NetID::HSCAN6: + return &(cfg->can7); + case Network::NetID::HSCAN7: + return &(cfg->can8); + default: + return nullptr; + } + } + const CANFD_SETTINGS* getCANFDSettingsFor(Network net) const override { + auto cfg = getStructurePointer(); + if(cfg == nullptr) + return nullptr; + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::MSCAN: + return &(cfg->canfd2); + case Network::NetID::HSCAN2: + return &(cfg->canfd3); + case Network::NetID::HSCAN3: + return &(cfg->canfd4); + case Network::NetID::HSCAN4: + return &(cfg->canfd5); + case Network::NetID::HSCAN5: + return &(cfg->canfd6); + case Network::NetID::HSCAN6: + return &(cfg->canfd7); + case Network::NetID::HSCAN7: + return &(cfg->canfd8); + default: + return nullptr; + } + } + + const LIN_SETTINGS* getLINSettingsFor(Network net) const override { + auto cfg = getStructurePointer(); + if(cfg == nullptr) + return nullptr; + switch(net.getNetID()) { + case Network::NetID::LIN: + return &(cfg->lin1); + case Network::NetID::LIN2: + return &(cfg->lin2); + default: + return nullptr; + } + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/icsnVC40.h b/include/icsneo/icsnVC40.h index 5b86efb..7c30769 100644 --- a/include/icsneo/icsnVC40.h +++ b/include/icsneo/icsnVC40.h @@ -220,7 +220,7 @@ typedef unsigned __int64 uint64_t; #define NEODEVICE_RADEPSILON_EXPRESS (0x0000001d) #define NEODEVICE_RADPROXIMA (0x0000001e) #define NEODEVICE_NEW_DEVICE_58 (0x0000001f) -#define NEODEVICE_NEW_DEVICE_59 (0x00000021) +#define NEODEVICE_RAD_GALAXY_2 (0x00000021) #define NEODEVICE_RAD_BMS (0x00000022) #define NEODEVICE_RADMOON3 (0x00000023) #define NEODEVICE_RADCOMET (0x00000024) @@ -2999,6 +2999,100 @@ typedef struct _SRADGigastarSettings #define SRADGigastarSettings_SIZE 710 +typedef struct _SRADGalaxy2Settings +{ + uint32_t ecu_id; + uint16_t perf_en; + + /* CAN */ + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + CAN_SETTINGS can3; + CANFD_SETTINGS canfd3; + CAN_SETTINGS can4; + CANFD_SETTINGS canfd4; + CAN_SETTINGS can5; + CANFD_SETTINGS canfd5; + CAN_SETTINGS can6; + CANFD_SETTINGS canfd6; + CAN_SETTINGS can7; + CANFD_SETTINGS canfd7; + CAN_SETTINGS can8; + CANFD_SETTINGS canfd8; + + // SWCAN_SETTINGS swcan1; G2 does not have SWCAN. + uint16_t network_enables; + // SWCAN_SETTINGS swcan2; G2 does not have SWCAN. + uint16_t network_enables_2; + + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + + uint16_t network_enabled_on_boot; + + /* ISO15765-2 Transport Layer */ + uint16_t iso15765_separation_time_offset; + + /* ISO9141 - Keyword */ + uint16_t iso_9141_kwp_enable_reserved; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_1; + uint16_t iso_parity_1; + + uint16_t iso_msg_termination_1; + + uint16_t idle_wakeup_network_enables_1; + uint16_t idle_wakeup_network_enables_2; + + /* reserved for T1 networks such as BR1, BR2, etc.. */ + uint16_t network_enables_3; + uint16_t idle_wakeup_network_enables_3; + + STextAPISettings text_api; + + uint64_t termination_enables; // New feature unlike Galaxy. + + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + struct + { + uint16_t hwComLatencyTestEn : 1; + uint16_t reserved : 15; + } flags; + + LIN_SETTINGS lin1; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + OP_ETH_SETTINGS opEth2; + OP_ETH_SETTINGS opEth3; + OP_ETH_SETTINGS opEth4; + OP_ETH_SETTINGS opEth5; + OP_ETH_SETTINGS opEth6; + OP_ETH_SETTINGS opEth7; + OP_ETH_SETTINGS opEth8; + OP_ETH_SETTINGS opEth9; + OP_ETH_SETTINGS opEth10; + OP_ETH_SETTINGS opEth11; + OP_ETH_SETTINGS opEth12; + OP_ETH_SETTINGS opEth13; + OP_ETH_SETTINGS opEth14; + OP_ETH_SETTINGS opEth15; + OP_ETH_SETTINGS opEth16; + + ETHERNET10G_SETTINGS ethernet10g; + ETHERNET10G_SETTINGS ethernet10g_2; + ETHERNET10G_SETTINGS ethernet10g_3; + + uint16_t network_enables_4; + RAD_REPORTING_SETTINGS reporting; + RAD_GPTP_SETTINGS gPTP; + + uint64_t network_enables_5; + LIN_SETTINGS lin2; +} SRADGalaxy2Settings; +#define SRADGalaxy2Settings_SIZE 840 + typedef struct _SVividCANSettings { uint32_t ecu_id; @@ -5425,6 +5519,7 @@ CHECK_STRUCT_SIZE(SPendantSettings); CHECK_STRUCT_SIZE(SIEVBSettings); CHECK_STRUCT_SIZE(SEEVBSettings); CHECK_STRUCT_SIZE(SRADGalaxySettings); +CHECK_STRUCT_SIZE(SRADGalaxy2Settings); CHECK_STRUCT_SIZE(SRADStar2Settings); CHECK_STRUCT_SIZE(SOBD2SimSettings) CHECK_STRUCT_SIZE(CmProbeSettings); diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index a637600..0f35d5a 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -19,6 +19,7 @@ #include "icsneo/device/tree/radmoont1s/radmoont1s.h" #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" +#include "icsneo/device/tree/radgalaxy2/radgalaxy2.h" #include "icsneo/device/tree/radgigastar/radgigastar.h" #include "icsneo/device/tree/radgigastar2/radgigastar2.h" #include "icsneo/device/tree/radjupiter/radjupiter.h" diff --git a/include/icsneo/platform/windows/devices.h b/include/icsneo/platform/windows/devices.h index 6c41fb3..43a80a0 100644 --- a/include/icsneo/platform/windows/devices.h +++ b/include/icsneo/platform/windows/devices.h @@ -19,6 +19,7 @@ #include "icsneo/device/tree/radmoont1s/radmoont1s.h" #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" +#include "icsneo/device/tree/radgalaxy2/radgalaxy2.h" #include "icsneo/device/tree/radgigastar/radgigastar.h" #include "icsneo/device/tree/radgigastar2/radgigastar2.h" #include "icsneo/device/tree/radjupiter/radjupiter.h"