From 603d532d2d81f51a1c48fcc5708743bd2d96b4dd Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Fri, 21 Dec 2018 20:28:25 -0500 Subject: [PATCH] Add support for RADStar2 settings --- device/idevicesettings.cpp | 3 + include/icsneo/device/idevicesettings.h | 50 ++++++++ include/icsneo/device/radstar2/radstar2.h | 59 +++++----- include/icsneo/device/radstar2/radstar2eth.h | 2 +- .../icsneo/device/radstar2/radstar2settings.h | 107 ++++++++++++++++++ include/icsneo/device/radstar2/radstar2usb.h | 2 +- 6 files changed, 192 insertions(+), 31 deletions(-) create mode 100644 include/icsneo/device/radstar2/radstar2settings.h diff --git a/device/idevicesettings.cpp b/device/idevicesettings.cpp index 661431f..781dccc 100644 --- a/device/idevicesettings.cpp +++ b/device/idevicesettings.cpp @@ -134,6 +134,9 @@ bool IDeviceSettings::refresh(bool ignoreChecksum) { return false; } + if(disableGSChecksumming) + ignoreChecksum = true; + std::vector rxSettings; bool ret = com->getSettingsSync(rxSettings); if(!ret) { diff --git a/include/icsneo/device/idevicesettings.h b/include/icsneo/device/idevicesettings.h index 1ff413b..9febdae 100644 --- a/include/icsneo/device/idevicesettings.h +++ b/include/icsneo/device/idevicesettings.h @@ -96,6 +96,55 @@ typedef struct ETHERNET_SETTINGS_t } ETHERNET_SETTINGS; #define ETHERNET_SETTINGS_SIZE 8 +typedef struct OP_ETH_GENERAL_SETTINGS_t +{ + uint8_t ucInterfaceType; + uint8_t reserved0[3]; + uint16_t tapPair0; + uint16_t tapPair1; + uint16_t tapPair2; + uint16_t tapPair3; + uint16_t tapPair4; + uint16_t tapPair5; + union { + struct + { + unsigned bTapEnSwitch : 1; + unsigned bTapEnPtp : 1; + unsigned bEnReportLinkQuality : 1; + } flags; + unsigned uFlags; + }; +} OP_ETH_GENERAL_SETTINGS; +#define OP_ETH_GENERAL_SETTINGS_SIZE 20 +static_assert(sizeof(OP_ETH_GENERAL_SETTINGS) == OP_ETH_GENERAL_SETTINGS_SIZE, "OP_ETH_GENERAL_SETTINGS is the wrong size!"); + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4201) // nameless struct/union +#endif +typedef struct OP_ETH_SETTINGS_t +{ + uint8_t ucConfigMode; + unsigned char preemption_en; + union { + struct { + // Reuse the mac_addr for switch mode if required! + unsigned char mac_addr1[6];// Original Addr for spoofing + unsigned char mac_addr2[6];// Target Addr for spoofing + unsigned short mac_spoofing_en : 1; + unsigned short mac_spoofing_isDstOrSrc : 1; + unsigned short reserved : 14; + }; + unsigned char reserved0[14]; + }; +} OP_ETH_SETTINGS; +#define OP_ETH_SETTINGS_SIZE 16 +static_assert(sizeof(OP_ETH_SETTINGS) == OP_ETH_SETTINGS_SIZE, "OP_ETH_SETTINGS is the wrong size!"); +#ifdef _MSC_VER +#pragma warning(pop) +#endif + typedef struct { uint8_t MasterEnable; @@ -332,6 +381,7 @@ public: bool disabled = false; bool readonly = false; + bool disableGSChecksumming = false; protected: std::shared_ptr com; device_errorhandler_t err; diff --git a/include/icsneo/device/radstar2/radstar2.h b/include/icsneo/device/radstar2/radstar2.h index afdeda3..fa5e7b3 100644 --- a/include/icsneo/device/radstar2/radstar2.h +++ b/include/icsneo/device/radstar2/radstar2.h @@ -1,30 +1,31 @@ -#ifndef __RADSTAR2_H_ -#define __RADSTAR2_H_ - -#include "icsneo/device/device.h" -#include "icsneo/device/devicetype.h" - -namespace icsneo { - -class RADStar2 : public Device { -public: - // Serial numbers start with RS - static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADStar2; - static constexpr const uint16_t PRODUCT_ID = 0x0005; - static constexpr const char* SERIAL_START = "RS"; - -protected: - virtual void setupPacketizer(Packetizer* packetizer) override { - packetizer->disableChecksum = true; - packetizer->align16bit = false; - } - - RADStar2(neodevice_t neodevice) : Device(neodevice) { - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } -}; - -} - +#ifndef __RADSTAR2_H_ +#define __RADSTAR2_H_ + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/device/radstar2/radstar2settings.h" + +namespace icsneo { + +class RADStar2 : public Device { +public: + // Serial numbers start with RS + static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADStar2; + static constexpr const uint16_t PRODUCT_ID = 0x0005; + static constexpr const char* SERIAL_START = "RS"; + +protected: + virtual void setupPacketizer(Packetizer* packetizer) override { + packetizer->disableChecksum = true; + packetizer->align16bit = false; + } + + RADStar2(neodevice_t neodevice) : Device(neodevice) { + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } +}; + +} + #endif \ No newline at end of file diff --git a/include/icsneo/device/radstar2/radstar2eth.h b/include/icsneo/device/radstar2/radstar2eth.h index 8821aed..1a7abee 100644 --- a/include/icsneo/device/radstar2/radstar2eth.h +++ b/include/icsneo/device/radstar2/radstar2eth.h @@ -44,7 +44,7 @@ public: } RADStar2ETH(neodevice_t neodevice) : RADStar2(neodevice) { - initialize(); + initialize(); } }; diff --git a/include/icsneo/device/radstar2/radstar2settings.h b/include/icsneo/device/radstar2/radstar2settings.h new file mode 100644 index 0000000..3412a6b --- /dev/null +++ b/include/icsneo/device/radstar2/radstar2settings.h @@ -0,0 +1,107 @@ +#ifndef __RADSTAR2SETTINGS_H_ +#define __RADSTAR2SETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif + +#pragma pack(push, 2) +typedef struct { + uint16_t perf_en; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + OP_ETH_SETTINGS opEth2; + + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + + uint16_t network_enables; + uint16_t network_enables_2; + + LIN_SETTINGS lin1; + uint16_t misc_io_initial_ddr; + uint16_t misc_io_initial_latch; + uint16_t misc_io_report_period; + uint16_t misc_io_on_report_events; + uint16_t misc_io_analog_enable; + uint16_t ain_sample_period; + uint16_t ain_threshold; + + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + + uint16_t network_enabled_on_boot; + + uint16_t iso15765_separation_time_offset; + + 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; + + uint16_t network_enables_3; + uint16_t idle_wakeup_network_enables_3; + + uint16_t can_switch_mode; + STextAPISettings text_api; + uint16_t pc_com_mode; + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + uint16_t hwComLatencyTestEn; +} radstar2_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +#include + +class RADStar2Settings : public IDeviceSettings { +public: + RADStar2Settings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radstar2_settings_t)) { + disableGSChecksumming = true; + } + + 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); + 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); + default: + return nullptr; + } + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/radstar2/radstar2usb.h b/include/icsneo/device/radstar2/radstar2usb.h index 5c67acd..2cf30a3 100644 --- a/include/icsneo/device/radstar2/radstar2usb.h +++ b/include/icsneo/device/radstar2/radstar2usb.h @@ -20,7 +20,7 @@ public: private: RADStar2USB(neodevice_t neodevice) : RADStar2(neodevice) { - initialize(); + initialize(); } };