From 0f703f494f801bfa5c94b27bc8636f8d3bce5097 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Fri, 19 Oct 2018 17:00:40 -0400 Subject: [PATCH] CAN FD transmission on non CAN FD hardware now fails as would be expected --- communication/encoder.cpp | 3 +++ communication/include/encoder.h | 3 ++- device/neovifire2/include/neovifire2.h | 9 +++++++++ device/neovifire2/include/neovifire2eth.h | 6 +----- device/neovifire2/include/neovifire2usb.h | 6 +----- device/valuecan4/include/valuecan4-1.h | 1 + device/valuecan4/include/valuecan4.h | 1 + 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/communication/encoder.cpp b/communication/encoder.cpp index 02b4812..3f8293d 100644 --- a/communication/encoder.cpp +++ b/communication/encoder.cpp @@ -15,6 +15,9 @@ bool Encoder::encode(std::vector& result, const std::shared_ptrisCANFD) + return false; // This device does not support CAN FD + if(canmsg->isCANFD && canmsg->isRemote) return false; // RTR frames can not be used with CAN FD diff --git a/communication/include/encoder.h b/communication/include/encoder.h index 0217a5e..078e48e 100644 --- a/communication/include/encoder.h +++ b/communication/include/encoder.h @@ -21,7 +21,8 @@ public: bool encode(std::vector& result, const std::shared_ptr& message); bool encode(std::vector& result, Command cmd, bool boolean) { return encode(result, cmd, std::vector({ (uint8_t)boolean })); } bool encode(std::vector& result, Command cmd, std::vector arguments = {}); - + + bool supportCANFD = false; private: std::shared_ptr packetizer; }; diff --git a/device/neovifire2/include/neovifire2.h b/device/neovifire2/include/neovifire2.h index 26ee04a..fe57eec 100644 --- a/device/neovifire2/include/neovifire2.h +++ b/device/neovifire2/include/neovifire2.h @@ -14,6 +14,15 @@ public: NeoVIFIRE2(neodevice_t neodevice) : Device(neodevice) { getWritableNeoDevice().type = DEVICE_TYPE; } + +protected: + static std::shared_ptr MakeCommunication(std::unique_ptr transport) { + auto packetizer = std::make_shared(); + auto encoder = std::unique_ptr(new Encoder(packetizer)); + encoder->supportCANFD = true; + auto decoder = std::unique_ptr(new Decoder()); + return std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); + } }; } diff --git a/device/neovifire2/include/neovifire2eth.h b/device/neovifire2/include/neovifire2eth.h index 7c3301b..b2253c3 100644 --- a/device/neovifire2/include/neovifire2eth.h +++ b/device/neovifire2/include/neovifire2eth.h @@ -12,11 +12,7 @@ class NeoVIFIRE2ETH : public NeoVIFIRE2 { public: static constexpr const uint16_t PRODUCT_ID = 0x0004; NeoVIFIRE2ETH(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { - auto transport = std::unique_ptr(new PCAP(getWritableNeoDevice())); - auto packetizer = std::make_shared(); - auto encoder = std::unique_ptr(new Encoder(packetizer)); - auto decoder = std::unique_ptr(new Decoder()); - com = std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); + com = MakeCommunicaiton(std::unique_ptr(new PCAP(getWritableNeoDevice()))); settings = std::unique_ptr(new NeoVIFIRE2Settings(com)); settings->readonly = true; productId = PRODUCT_ID; diff --git a/device/neovifire2/include/neovifire2usb.h b/device/neovifire2/include/neovifire2usb.h index 4c968a0..fea7e49 100644 --- a/device/neovifire2/include/neovifire2usb.h +++ b/device/neovifire2/include/neovifire2usb.h @@ -11,11 +11,7 @@ class NeoVIFIRE2USB : public NeoVIFIRE2 { public: static constexpr const uint16_t PRODUCT_ID = 0x1000; NeoVIFIRE2USB(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { - auto transport = std::unique_ptr(new FTDI(getWritableNeoDevice())); - auto packetizer = std::make_shared(); - auto encoder = std::unique_ptr(new Encoder(packetizer)); - auto decoder = std::unique_ptr(new Decoder()); - com = std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); + com = MakeCommunication(std::unique_ptr(new FTDI(getWritableNeoDevice()))); settings = std::unique_ptr(new NeoVIFIRE2Settings(com)); productId = PRODUCT_ID; } diff --git a/device/valuecan4/include/valuecan4-1.h b/device/valuecan4/include/valuecan4-1.h index a4e2aa1..87e70e0 100644 --- a/device/valuecan4/include/valuecan4-1.h +++ b/device/valuecan4/include/valuecan4-1.h @@ -13,6 +13,7 @@ public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN4_1; ValueCAN4_1(neodevice_t neodevice) : ValueCAN4(neodevice) { com = MakeCommunication(getWritableNeoDevice()); + com->encoder->supportCANFD = false; // VCAN 4-1 does not support CAN FD settings = std::unique_ptr(new ValueCAN4_1Settings(com)); getWritableNeoDevice().type = DEVICE_TYPE; } diff --git a/device/valuecan4/include/valuecan4.h b/device/valuecan4/include/valuecan4.h index 9051c0d..06eeb84 100644 --- a/device/valuecan4/include/valuecan4.h +++ b/device/valuecan4/include/valuecan4.h @@ -19,6 +19,7 @@ protected: auto transport = std::unique_ptr(new STM32(nd)); auto packetizer = std::make_shared(); auto encoder = std::unique_ptr(new Encoder(packetizer)); + encoder->supportCANFD = true; auto decoder = std::unique_ptr(new Decoder()); return std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); }