From 9df4aed19ffbb0497074d3ab25179c218fcead38 Mon Sep 17 00:00:00 2001 From: Bryant Jones Date: Thu, 4 Jan 2024 14:48:13 +0000 Subject: [PATCH] Device: Add RAD-Comet2 support --- device/devicefinder.cpp | 20 ++++- include/icsneo/device/device.h | 7 ++ .../icsneo/device/tree/radcomet/radcomet.h | 56 +++----------- .../icsneo/device/tree/radcomet/radcomet2.h | 41 +++++++++++ .../device/tree/radcomet/radcometbase.h | 73 +++++++++++++++++++ .../device/tree/radcomet/radcometsettings.h | 6 +- include/icsneo/platform/posix/devices.h | 1 + include/icsneo/platform/windows/devices.h | 1 + 8 files changed, 154 insertions(+), 51 deletions(-) create mode 100644 include/icsneo/device/tree/radcomet/radcomet2.h create mode 100644 include/icsneo/device/tree/radcomet/radcometbase.h diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index a94b2b7..c42f32c 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -47,6 +47,18 @@ static void makeIfPIDMatches(const FoundDevice& dev, std::vector(dev)); } +template +static void makeIfSerialRangeMatches(const FoundDevice& dev, std::vector>& into) { + // Relies on the subclass to have + // `static constexpr uint32_t SERIAL_RANGE_LOW = 0x12345678` + // `static constexpr uint32_t SERIAL_RANGE_HIGH = 0x12345678` + // and also a public constructor `T(const FoundDevice& dev)` + // Use macro ICSNEO_FINDABLE_DEVICE_BY_SERIAL_RANGE() to create these + uint32_t serialNum = Device::SerialStringToNum(dev.serial); + if(serialNum >= Device::SerialStringToNum(T::SERIAL_RANGE_LOW) && serialNum <= Device::SerialStringToNum(T::SERIAL_RANGE_HIGH)) + into.push_back(std::make_shared(dev)); +} + std::vector> DeviceFinder::FindAll() { static std::vector newDriverFoundDevices; newDriverFoundDevices.clear(); @@ -158,7 +170,11 @@ std::vector> DeviceFinder::FindAll() { #endif #ifdef __RADCOMET_H_ - makeIfSerialMatches(dev, newFoundDevices); + makeIfSerialRangeMatches(dev, newFoundDevices); + #endif + + #ifdef __RADCOMET2_H_ + makeIfSerialRangeMatches(dev, newFoundDevices); #endif #ifdef __RADEPSILON_H_ @@ -297,7 +313,7 @@ const std::vector& DeviceFinder::GetSupportedDevices() { #endif #ifdef __RADCOMET_H_ - RADCOMET::DEVICE_TYPE, + RADComet::DEVICE_TYPE, #endif #ifdef __RADEPSILON_H_ diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 8cf5dc6..64cff6c 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -59,6 +59,13 @@ #define ICSNEO_FINDABLE_DEVICE_BY_PID(className, type, pid) \ static constexpr const uint16_t PRODUCT_ID = pid; \ ICSNEO_FINDABLE_DEVICE_BASE(className, type) + +// Devices which are discernable by a serial range +#define ICSNEO_FINDABLE_DEVICE_BY_SERIAL_RANGE(className, type, serialLow, serialHigh) \ + static constexpr const char* SERIAL_RANGE_LOW = serialLow; \ + static constexpr const char* SERIAL_RANGE_HIGH = serialHigh; \ + ICSNEO_FINDABLE_DEVICE_BASE(className, type) + namespace icsneo { class DeviceExtension; diff --git a/include/icsneo/device/tree/radcomet/radcomet.h b/include/icsneo/device/tree/radcomet/radcomet.h index 247b3e3..4a15086 100644 --- a/include/icsneo/device/tree/radcomet/radcomet.h +++ b/include/icsneo/device/tree/radcomet/radcomet.h @@ -3,70 +3,32 @@ #ifdef __cplusplus -#include "icsneo/device/device.h" -#include "icsneo/device/devicetype.h" -#include "icsneo/communication/packetizer.h" -#include "icsneo/communication/decoder.h" +#include "icsneo/device/tree/radcomet/radcometbase.h" #include "icsneo/device/tree/radcomet/radcometsettings.h" namespace icsneo { -class RADCOMET : public Device { +class RADComet : public RADCometBase { public: + // Serial numbers start with RC // USB PID is 0x1207, standard driver is FTDI3 // Ethernet MAC allocation is 0x1D, standard driver is Raw - ICSNEO_FINDABLE_DEVICE(RADCOMET, DeviceType::RADComet, "RC"); + ICSNEO_FINDABLE_DEVICE_BY_SERIAL_RANGE(RADComet, DeviceType::RADComet, "RC0000", "RC0299"); - static const std::vector& GetSupportedNetworks() { - static std::vector supportedNetworks = { - Network::NetID::HSCAN, - Network::NetID::HSCAN2, - - Network::NetID::Ethernet, - - Network::NetID::OP_Ethernet1, - Network::NetID::OP_Ethernet2, - - }; - return supportedNetworks; + std::string getProductName() const override { + return "RAD-Comet"; } - bool getEthPhyRegControlSupported() const override { return true; } - protected: - RADCOMET(neodevice_t neodevice, const driver_factory_t& makeDriver) : Device(neodevice) { - initialize(makeDriver); + RADComet(neodevice_t neodevice, const driver_factory_t& makeDriver) : RADCometBase(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); } }; } #endif // __cplusplus -#endif \ No newline at end of file +#endif diff --git a/include/icsneo/device/tree/radcomet/radcomet2.h b/include/icsneo/device/tree/radcomet/radcomet2.h new file mode 100644 index 0000000..da96bee --- /dev/null +++ b/include/icsneo/device/tree/radcomet/radcomet2.h @@ -0,0 +1,41 @@ +#ifndef __RADCOMET2_H_ +#define __RADCOMET2_H_ + +#ifdef __cplusplus + +#include "icsneo/device/tree/radcomet/radcometbase.h" +#include "icsneo/device/tree/radcomet/radcometsettings.h" + +namespace icsneo { + +class RADComet2 : public RADCometBase { +public: + + // Serial numbers start with RC, Comet2 starts at RC0300 + // USB PID is 0x1207, standard driver is FTDI3 + // Ethernet MAC allocation is 0x1D, standard driver is Raw + ICSNEO_FINDABLE_DEVICE_BY_SERIAL_RANGE(RADComet2, DeviceType::RADComet, "RC0300", "RCZZZZ"); + + std::string getProductName() const override { + return "RAD-Comet 2"; + } + + virtual const std::vector& GetSupportedNetworks() { + static std::vector supportedNetworks = RADCometBase::GetSupportedNetworks(); + supportedNetworks.push_back(Network::NetID::OP_Ethernet3); + supportedNetworks.push_back(Network::NetID::MDIO4); + return supportedNetworks; + } + +protected: + RADComet2(neodevice_t neodevice, const driver_factory_t& makeDriver) : RADCometBase(neodevice) { + initialize(makeDriver); + } + +}; + +} + +#endif // __cplusplus + +#endif diff --git a/include/icsneo/device/tree/radcomet/radcometbase.h b/include/icsneo/device/tree/radcomet/radcometbase.h new file mode 100644 index 0000000..4c2c8b6 --- /dev/null +++ b/include/icsneo/device/tree/radcomet/radcometbase.h @@ -0,0 +1,73 @@ +#ifndef __RADCOMETBASE_H_ +#define __RADCOMETBASE_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" + +namespace icsneo { + +class RADCometBase : public Device { +public: + virtual const std::vector& GetSupportedNetworks() { + static std::vector supportedNetworks = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2, + + Network::NetID::Ethernet, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2, + + Network::NetID::LIN, + Network::NetID::ISO9141, + + Network::NetID::MDIO1, + Network::NetID::MDIO2, + Network::NetID::MDIO3, + }; + return supportedNetworks; + } + + bool getEthPhyRegControlSupported() const override { return true; } + +protected: + using Device::Device; + + 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); } + + std::optional getCoreminiStartAddressFlash() const override { + return 32*1024*1024; + } + +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radcomet/radcometsettings.h b/include/icsneo/device/tree/radcomet/radcometsettings.h index 24fe584..9a7e5c0 100644 --- a/include/icsneo/device/tree/radcomet/radcometsettings.h +++ b/include/icsneo/device/tree/radcomet/radcometsettings.h @@ -54,6 +54,8 @@ typedef struct { // 10T1S ETHERNET_SETTINGS2 ethT1s2; ETHERNET10T1S_SETTINGS t1s2; + uint64_t network_enables_5; + LIN_SETTINGS lin1; } radcomet_settings_t; #pragma pack(pop) @@ -61,9 +63,9 @@ typedef struct { #include -class RADCOMETSettings : public IDeviceSettings { +class RADCometSettings : public IDeviceSettings { public: - RADCOMETSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radcomet_settings_t)) {} + RADCometSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radcomet_settings_t)) {} const CAN_SETTINGS* getCANSettingsFor(Network net) const override { auto cfg = getStructurePointer(); if(cfg == nullptr) diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index 21af8dd..a79f1db 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -13,6 +13,7 @@ #include "icsneo/device/tree/plasion/neoviplasma.h" #include "icsneo/device/tree/rada2b/rada2b.h" #include "icsneo/device/tree/radcomet/radcomet.h" +#include "icsneo/device/tree/radcomet/radcomet2.h" #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radgigastar/radgigastar.h" diff --git a/include/icsneo/platform/windows/devices.h b/include/icsneo/platform/windows/devices.h index ae88f0c..c50f4f3 100644 --- a/include/icsneo/platform/windows/devices.h +++ b/include/icsneo/platform/windows/devices.h @@ -13,6 +13,7 @@ #include "icsneo/device/tree/plasion/neoviplasma.h" #include "icsneo/device/tree/rada2b/rada2b.h" #include "icsneo/device/tree/radcomet/radcomet.h" +#include "icsneo/device/tree/radcomet/radcomet2.h" #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radgigastar/radgigastar.h"