From 7e9fbc4959e7a116116fe3a3cfff7e730a13a39c Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Thu, 3 Jan 2019 17:00:15 -0500 Subject: [PATCH] Basic introspection for device supported networks --- device/device.cpp | 24 +++++++++ include/icsneo/communication/network.h | 17 ++++-- include/icsneo/device/device.h | 48 ++++++++++++----- include/icsneo/device/neoobd2pro/neoobd2pro.h | 13 +++++ include/icsneo/device/neoobd2sim/neoobd2sim.h | 13 +++++ include/icsneo/device/neovifire/neovifire.h | 28 ++++++++++ include/icsneo/device/neovifire2/neovifire2.h | 36 ++++++++++++- include/icsneo/device/plasion/plasion.h | 4 ++ include/icsneo/device/radgalaxy/radgalaxy.h | 54 +++++++++++++++++-- include/icsneo/device/radstar2/radstar2.h | 33 +++++++++--- .../icsneo/device/radsupermoon/radsupermoon.h | 4 +- include/icsneo/device/valuecan3/valuecan3.h | 13 +++++ include/icsneo/device/valuecan4/valuecan4-1.h | 17 +++++- include/icsneo/device/valuecan4/valuecan4-2.h | 14 +++++ .../icsneo/device/valuecan4/valuecan4-2el.h | 16 ++++++ include/icsneo/device/valuecan4/valuecan4-4.h | 16 ++++++ include/icsneo/device/valuecan4/valuecan4.h | 5 +- 17 files changed, 317 insertions(+), 38 deletions(-) diff --git a/device/device.cpp b/device/device.cpp index f2bbea7..04ec6e8 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -203,6 +203,9 @@ bool Device::goOffline() { } bool Device::transmit(std::shared_ptr message) { + if(!isSupportedTXNetwork(message->network)) + return false; + std::vector packet; if(!com->encoder->encode(packet, message)) return false; @@ -218,6 +221,27 @@ bool Device::transmit(std::vector> messages) { return true; } +size_t Device::getNetworkCountByType(Network::Type type) const { + size_t count = 0; + for(const auto& net : getSupportedRXNetworks()) + if(net.getType() == type) + count++; + return count; +} + +// Indexed starting at one +Network Device::getNetworkByNumber(Network::Type type, size_t index) const { + size_t count = 0; + for(const auto& net : getSupportedRXNetworks()) { + if(net.getType() == type) { + count++; + if(count == index) + return net; + } + } + return Network::NetID::Invalid; +} + void Device::handleInternalMessage(std::shared_ptr message) { switch(message->network.getNetID()) { case Network::NetID::Reset_Status: diff --git a/include/icsneo/communication/network.h b/include/icsneo/communication/network.h index e183b30..086b353 100644 --- a/include/icsneo/communication/network.h +++ b/include/icsneo/communication/network.h @@ -125,6 +125,8 @@ public: FlexRay = 4, MOST = 5, Ethernet = 6, + LSFTCAN = 7, + SWCAN = 8, Any = 0xFE, // Never actually set as type, but used as flag for filtering Other = 0xFF }; @@ -144,6 +146,10 @@ public: return "Internal"; case Type::Ethernet: return "Ethernet"; + case Type::LSFTCAN: + return "Low Speed Fault Tolerant CAN"; + case Type::SWCAN: + return "Single Wire CAN"; case Type::Invalid: default: return "Invalid Type"; @@ -153,16 +159,12 @@ public: switch(netid) { case NetID::HSCAN: case NetID::MSCAN: - case NetID::SWCAN: - case NetID::LSFTCAN: case NetID::HSCAN2: case NetID::HSCAN3: case NetID::HSCAN4: case NetID::HSCAN5: - case NetID::SWCAN2: case NetID::HSCAN6: case NetID::HSCAN7: - case NetID::LSFTCAN2: return Type::CAN; case NetID::LIN: case NetID::LIN2: @@ -204,6 +206,12 @@ public: case NetID::OP_Ethernet11: case NetID::OP_Ethernet12: return Type::Ethernet; + case NetID::LSFTCAN: + case NetID::LSFTCAN2: + return Type::LSFTCAN; + case NetID::SWCAN: + case NetID::SWCAN2: + return Type::SWCAN; default: return Type::Other; } @@ -419,6 +427,7 @@ public: os << GetNetIDString(network.getNetID()); return os; } + friend bool operator==(const Network& net1, const Network& net2) { return net1.getNetID() == net2.getNetID(); } private: NetID value; // Always use setValue so that value and type stay in sync diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 5681748..5a1a252 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -64,6 +64,19 @@ public: bool transmit(std::shared_ptr message); bool transmit(std::vector> messages); + const std::vector& getSupportedRXNetworks() const { return supportedRXNetworks; } + const std::vector& getSupportedTXNetworks() const { return supportedTXNetworks; } + virtual bool isSupportedRXNetwork(const Network& net) const { + return std::find(supportedRXNetworks.begin(), supportedRXNetworks.end(), net) != supportedRXNetworks.end(); + } + virtual bool isSupportedTXNetwork(const Network& net) const { + return std::find(supportedTXNetworks.begin(), supportedTXNetworks.end(), net) != supportedTXNetworks.end(); + } + + virtual size_t getNetworkCountByType(Network::Type) const; + virtual Network getNetworkByNumber(Network::Type, size_t) const; + + std::shared_ptr com; std::unique_ptr settings; protected: @@ -71,7 +84,6 @@ protected: bool online = false; int messagePollingCallbackID = 0; int internalHandlerCallbackID = 0; - std::shared_ptr com; device_errorhandler_t err; // START Initialization Functions @@ -84,17 +96,19 @@ protected: void initialize() { err = makeErrorHandler(); auto transport = makeTransport(); - setupTransport(transport.get()); + setupTransport(*transport); auto packetizer = makePacketizer(); - setupPacketizer(packetizer.get()); + setupPacketizer(*packetizer); auto encoder = makeEncoder(packetizer); - setupEncoder(encoder.get()); + setupEncoder(*encoder); auto decoder = makeDecoder(); - setupDecoder(decoder.get()); + setupDecoder(*decoder); com = makeCommunication(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); - setupCommunication(com.get()); + setupCommunication(*com); settings = makeSettings(com); - setupSettings(settings.get()); + setupSettings(*settings); + setupSupportedRXNetworks(supportedRXNetworks); + setupSupportedTXNetworks(supportedTXNetworks); } virtual device_errorhandler_t makeErrorHandler() { @@ -103,29 +117,32 @@ protected: template std::unique_ptr makeTransport() { return std::unique_ptr(new Transport(err, getWritableNeoDevice())); } - virtual void setupTransport(ICommunication* stransport) { (void)stransport; } + virtual void setupTransport(ICommunication&) {} virtual std::shared_ptr makePacketizer() { return std::make_shared(err); } - virtual void setupPacketizer(Packetizer* spacketizer) { (void)spacketizer; } + virtual void setupPacketizer(Packetizer&) {} virtual std::unique_ptr makeEncoder(std::shared_ptr p) { return std::unique_ptr(new Encoder(err, p)); } - virtual void setupEncoder(Encoder* sencoder) { (void)sencoder; } + virtual void setupEncoder(Encoder&) {} virtual std::unique_ptr makeDecoder() { return std::unique_ptr(new Decoder(err)); } - virtual void setupDecoder(Decoder* sdecoder) { (void)sdecoder; } + virtual void setupDecoder(Decoder&) {} virtual std::shared_ptr makeCommunication( std::unique_ptr t, - std::shared_ptr p, + std::shared_ptr p, std::unique_ptr e, std::unique_ptr d) { return std::make_shared(err, std::move(t), p, std::move(e), std::move(d)); } - virtual void setupCommunication(Communication* scom) { (void)scom; } + virtual void setupCommunication(Communication&) {} template std::unique_ptr makeSettings(std::shared_ptr com) { return std::unique_ptr(new Settings(com)); } - virtual void setupSettings(IDeviceSettings* ssettings) { (void)ssettings; } + virtual void setupSettings(IDeviceSettings&) {} + + virtual void setupSupportedRXNetworks(std::vector&) {} + virtual void setupSupportedTXNetworks(std::vector&) {} // END Initialization Functions void handleInternalMessage(std::shared_ptr message); @@ -135,6 +152,9 @@ protected: private: neodevice_t data; std::shared_ptr latestResetStatus; + + std::vector supportedTXNetworks; + std::vector supportedRXNetworks; enum class LEDState : uint8_t { Offline = 0x04, diff --git a/include/icsneo/device/neoobd2pro/neoobd2pro.h b/include/icsneo/device/neoobd2pro/neoobd2pro.h index c8768f2..6ea87bd 100644 --- a/include/icsneo/device/neoobd2pro/neoobd2pro.h +++ b/include/icsneo/device/neoobd2pro/neoobd2pro.h @@ -21,12 +21,25 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2 + }; + private: NeoOBD2PRO(neodevice_t neodevice) : Device(neodevice) { initialize(); getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/neoobd2sim/neoobd2sim.h b/include/icsneo/device/neoobd2sim/neoobd2sim.h index 99fd9ae..fd9a9da 100644 --- a/include/icsneo/device/neoobd2sim/neoobd2sim.h +++ b/include/icsneo/device/neoobd2sim/neoobd2sim.h @@ -21,12 +21,25 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2 + }; + private: NeoOBD2SIM(neodevice_t neodevice) : Device(neodevice) { initialize(); getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/neovifire/neovifire.h b/include/icsneo/device/neovifire/neovifire.h index 6f4f10e..5ee73cf 100644 --- a/include/icsneo/device/neovifire/neovifire.h +++ b/include/icsneo/device/neovifire/neovifire.h @@ -21,6 +21,26 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::MSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4, + Network::NetID::HSCAN5, + + Network::NetID::LSFTCAN, + Network::NetID::LSFTCAN2, + + Network::NetID::SWCAN, + Network::NetID::SWCAN2, + + Network::NetID::LIN, + Network::NetID::LIN2, + Network::NetID::LIN3, + Network::NetID::LIN4 + }; + enum class Mode : char { Application = 'A', Bootloader = 'B' @@ -57,6 +77,14 @@ private: getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/neovifire2/neovifire2.h b/include/icsneo/device/neovifire2/neovifire2.h index 5b7f0bd..61ae8aa 100644 --- a/include/icsneo/device/neovifire2/neovifire2.h +++ b/include/icsneo/device/neovifire2/neovifire2.h @@ -12,15 +12,47 @@ public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::FIRE2; static constexpr const char* SERIAL_START = "CY"; + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + 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::LSFTCAN, + Network::NetID::LSFTCAN2, + + Network::NetID::SWCAN, + Network::NetID::SWCAN2, + + Network::NetID::Ethernet, + + Network::NetID::LIN, + Network::NetID::LIN2, + Network::NetID::LIN3, + Network::NetID::LIN4 + }; + protected: NeoVIFIRE2(neodevice_t neodevice) : Device(neodevice) { getWritableNeoDevice().type = DEVICE_TYPE; } - virtual void setupEncoder(Encoder* encoder) override { + virtual void setupEncoder(Encoder& encoder) override { Device::setupEncoder(encoder); - encoder->supportCANFD = true; + encoder.supportCANFD = true; } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/plasion/plasion.h b/include/icsneo/device/plasion/plasion.h index ce695d8..7968ae8 100644 --- a/include/icsneo/device/plasion/plasion.h +++ b/include/icsneo/device/plasion/plasion.h @@ -16,6 +16,10 @@ protected: std::unique_ptr decoder ) override { return std::make_shared(err, std::move(transport), packetizer, std::move(encoder), std::move(decoder)); } + // TODO: This is done so that Plasion can still transmit it's basic networks, awaiting VLAN support + virtual bool isSupportedRXNetwork(const Network&) const override { return true; } + virtual bool isSupportedTXNetwork(const Network&) const override { return true; } + public: Plasion(neodevice_t neodevice) : Device(neodevice) {} }; diff --git a/include/icsneo/device/radgalaxy/radgalaxy.h b/include/icsneo/device/radgalaxy/radgalaxy.h index 0e02a06..eda91f4 100644 --- a/include/icsneo/device/radgalaxy/radgalaxy.h +++ b/include/icsneo/device/radgalaxy/radgalaxy.h @@ -47,6 +47,35 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + 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::SWCAN, + Network::NetID::SWCAN2, + + Network::NetID::LIN, + + 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 + }; + RADGalaxy(neodevice_t neodevice) : Device(neodevice) { initialize(); getWritableNeoDevice().type = DEVICE_TYPE; @@ -54,14 +83,29 @@ public: } protected: - void setupPacketizer(Packetizer* packetizer) override { - packetizer->disableChecksum = true; - packetizer->align16bit = false; + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; } - virtual void setupDecoder(Decoder* decoder) override { - decoder->timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + virtual void setupEncoder(Encoder& encoder) override { + Device::setupEncoder(encoder); + encoder.supportCANFD = true; } + + virtual void setupDecoder(Decoder& decoder) override { + Device::setupDecoder(decoder); + decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/radstar2/radstar2.h b/include/icsneo/device/radstar2/radstar2.h index 81484af..febdfa5 100644 --- a/include/icsneo/device/radstar2/radstar2.h +++ b/include/icsneo/device/radstar2/radstar2.h @@ -14,22 +14,41 @@ public: static constexpr const uint16_t PRODUCT_ID = 0x0005; static constexpr const char* SERIAL_START = "RS"; + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::MSCAN, + + Network::NetID::LIN, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2 + }; + protected: - virtual void setupPacketizer(Packetizer* packetizer) override { - packetizer->disableChecksum = true; - packetizer->align16bit = false; + virtual void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; } - virtual void setupEncoder(Encoder* encoder) override { + virtual void setupEncoder(Encoder& encoder) override { Device::setupEncoder(encoder); - encoder->supportCANFD = true; + encoder.supportCANFD = true; } - virtual void setupDecoder(Decoder* decoder) override { + virtual void setupDecoder(Decoder& decoder) override { Device::setupDecoder(decoder); - decoder->timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns } + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + RADStar2(neodevice_t neodevice) : Device(neodevice) { getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; diff --git a/include/icsneo/device/radsupermoon/radsupermoon.h b/include/icsneo/device/radsupermoon/radsupermoon.h index e5e4174..22cdfd5 100644 --- a/include/icsneo/device/radsupermoon/radsupermoon.h +++ b/include/icsneo/device/radsupermoon/radsupermoon.h @@ -22,8 +22,8 @@ public: } protected: - virtual void setupDecoder(Decoder* decoder) override { - decoder->timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + virtual void setupDecoder(Decoder& decoder) override { + decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns } private: diff --git a/include/icsneo/device/valuecan3/valuecan3.h b/include/icsneo/device/valuecan3/valuecan3.h index 099ee41..959c065 100644 --- a/include/icsneo/device/valuecan3/valuecan3.h +++ b/include/icsneo/device/valuecan3/valuecan3.h @@ -21,12 +21,25 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::MSCAN + }; + private: ValueCAN3(neodevice_t neodevice) : Device(neodevice) { initialize(); getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4-1.h b/include/icsneo/device/valuecan4/valuecan4-1.h index 68738c1..72b9ca6 100644 --- a/include/icsneo/device/valuecan4/valuecan4-1.h +++ b/include/icsneo/device/valuecan4/valuecan4-1.h @@ -22,11 +22,24 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN + }; + protected: - void setupEncoder(Encoder* encoder) override { - encoder->supportCANFD = false; // VCAN 4-1 does not support CAN FD + void setupEncoder(Encoder& encoder) override { + ValueCAN4::setupEncoder(encoder); + encoder.supportCANFD = false; // VCAN 4-1 does not support CAN FD } + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + private: ValueCAN4_1(neodevice_t neodevice) : ValueCAN4(neodevice) { initialize(); diff --git a/include/icsneo/device/valuecan4/valuecan4-2.h b/include/icsneo/device/valuecan4/valuecan4-2.h index 60b4cfa..b84c362 100644 --- a/include/icsneo/device/valuecan4/valuecan4-2.h +++ b/include/icsneo/device/valuecan4/valuecan4-2.h @@ -22,6 +22,20 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2 + }; + +protected: + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + private: ValueCAN4_2(neodevice_t neodevice) : ValueCAN4(neodevice) { initialize(); diff --git a/include/icsneo/device/valuecan4/valuecan4-2el.h b/include/icsneo/device/valuecan4/valuecan4-2el.h index 96f2a49..80c1e32 100644 --- a/include/icsneo/device/valuecan4/valuecan4-2el.h +++ b/include/icsneo/device/valuecan4/valuecan4-2el.h @@ -22,6 +22,22 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2, + + Network::NetID::Ethernet + }; + +protected: + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + private: ValueCAN4_2EL(neodevice_t neodevice) : ValueCAN4(neodevice) { initialize(); diff --git a/include/icsneo/device/valuecan4/valuecan4-4.h b/include/icsneo/device/valuecan4/valuecan4-4.h index 40e0d47..6ea51aa 100644 --- a/include/icsneo/device/valuecan4/valuecan4-4.h +++ b/include/icsneo/device/valuecan4/valuecan4-4.h @@ -22,6 +22,22 @@ public: return found; } + static constexpr Network::NetID SUPPORTED_NETWORKS[] = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4 + }; + +protected: + virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : SUPPORTED_NETWORKS) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + virtual void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } + private: ValueCAN4_4(neodevice_t neodevice) : ValueCAN4(neodevice) { initialize(); diff --git a/include/icsneo/device/valuecan4/valuecan4.h b/include/icsneo/device/valuecan4/valuecan4.h index 606f45c..a2dd795 100644 --- a/include/icsneo/device/valuecan4/valuecan4.h +++ b/include/icsneo/device/valuecan4/valuecan4.h @@ -12,8 +12,9 @@ public: static constexpr const uint16_t PRODUCT_ID = 0x1101; protected: - virtual void setupEncoder(Encoder* encoder) override { - encoder->supportCANFD = true; + virtual void setupEncoder(Encoder& encoder) override { + Device::setupEncoder(encoder); + encoder.supportCANFD = true; } ValueCAN4(neodevice_t neodevice) : Device(neodevice) {