diff --git a/device/device.cpp b/device/device.cpp index d9e5631..45d9fc0 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -213,6 +213,22 @@ bool Device::transmit(std::vector> messages) { return true; } +template +void Device::initialize() { + auto transport = makeTransport(); + setupTransport(transport.get()); + auto packetizer = makePacketizer(); + setupPacketizer(packetizer.get()); + auto encoder = makeEncoder(packetizer); + setupEncoder(encoder.get()); + auto decoder = makeDecoder(); + setupDecoder(decoder.get()); + com = makeCommunication(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); + setupCommunication(com.get()); + settings = makeSettings(com); + setupSettings(settings.get()); +} + void Device::handleInternalMessage(std::shared_ptr message) { switch(message->network.getNetID()) { case Network::NetID::Reset_Status: diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index aab882f..c0fb5e5 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -6,6 +6,7 @@ #include #include "icsneo/device/neodevice.h" #include "icsneo/device/idevicesettings.h" +#include "icsneo/device/nullsettings.h" #include "icsneo/device/devicetype.h" #include "icsneo/communication/communication.h" #include "icsneo/communication/packetizer.h" @@ -18,11 +19,6 @@ namespace icsneo { class Device { public: - Device(neodevice_t neodevice = { 0 }) { - data = neodevice; - data.device = this; - settings = std::unique_ptr(new IDeviceSettings(nullptr)); - } virtual ~Device() { disableMessagePolling(); close(); @@ -67,8 +63,6 @@ public: bool transmit(std::shared_ptr message); bool transmit(std::vector> messages); - void handleInternalMessage(std::shared_ptr message); - std::unique_ptr settings; protected: @@ -78,6 +72,44 @@ protected: int internalHandlerCallbackID = 0; std::shared_ptr com; + // START Initialization Functions + Device(neodevice_t neodevice = { 0 }) { + data = neodevice; + data.device = this; + } + + template + void initialize(); + + template + std::unique_ptr makeTransport() { return std::unique_ptr(new Transport(getWritableNeoDevice())); } + virtual void setupTransport(ICommunication* transport) {} + + virtual std::shared_ptr makePacketizer() { return std::make_shared(); } + virtual void setupPacketizer(Packetizer* packetizer) {} + + virtual std::unique_ptr makeEncoder(std::shared_ptr p) { return std::unique_ptr(new Encoder(p)); } + virtual void setupEncoder(Encoder* encoder) {} + + virtual std::unique_ptr makeDecoder() { return std::unique_ptr(new Decoder()); } + virtual void setupDecoder(Decoder* decoder) {} + + virtual std::shared_ptr makeCommunication( + std::unique_ptr t, + std::shared_ptr p, + std::unique_ptr e, + std::unique_ptr d) { return std::make_shared(std::move(t), p, std::move(e), std::move(d)); } + virtual void setupCommunication(Communication* com) {} + + template + std::unique_ptr makeSettings(std::shared_ptr com) { + return std::unique_ptr(new Settings(com)); + } + virtual void setupSettings(IDeviceSettings* settings) {} + // END Initialization Functions + + void handleInternalMessage(std::shared_ptr message); + neodevice_t& getWritableNeoDevice() { return data; } private: diff --git a/include/icsneo/device/neoobd2pro/neoobd2pro.h b/include/icsneo/device/neoobd2pro/neoobd2pro.h index ea04f1c..c8768f2 100644 --- a/include/icsneo/device/neoobd2pro/neoobd2pro.h +++ b/include/icsneo/device/neoobd2pro/neoobd2pro.h @@ -12,24 +12,21 @@ public: // Serial numbers are NP**** static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::OBD2_PRO; static constexpr const uint16_t PRODUCT_ID = 0x1103; - NeoOBD2PRO(neodevice_t neodevice) : Device(neodevice) { - auto transport = std::unique_ptr(new STM32(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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new NeoOBD2PRO(neodevice)); return found; } + +private: + NeoOBD2PRO(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/neoobd2sim/neoobd2sim.h b/include/icsneo/device/neoobd2sim/neoobd2sim.h index 5af0553..99fd9ae 100644 --- a/include/icsneo/device/neoobd2sim/neoobd2sim.h +++ b/include/icsneo/device/neoobd2sim/neoobd2sim.h @@ -12,24 +12,21 @@ public: // Serial numbers are OS**** static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::OBD2_SIM; static constexpr const uint16_t PRODUCT_ID = 0x1100; - NeoOBD2SIM(neodevice_t neodevice) : Device(neodevice) { - auto transport = std::unique_ptr(new STM32(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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new NeoOBD2SIM(neodevice)); return found; } + +private: + NeoOBD2SIM(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/neovifire/neovifire.h b/include/icsneo/device/neovifire/neovifire.h index cd8b881..6f4f10e 100644 --- a/include/icsneo/device/neovifire/neovifire.h +++ b/include/icsneo/device/neovifire/neovifire.h @@ -12,15 +12,13 @@ class NeoVIFIRE : public Device { public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::FIRE; static constexpr const uint16_t PRODUCT_ID = 0x0701; - NeoVIFIRE(neodevice_t neodevice) : Device(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)); - settings = std::unique_ptr(new NeoVIFIRESettings(com)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; + static std::vector> Find() { + std::vector> found; + + for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) + found.emplace_back(new NeoVIFIRE(neodevice)); // Creation of the shared_ptr + + return found; } enum class Mode : char { @@ -28,7 +26,7 @@ public: Bootloader = 'B' }; - bool open() { + bool open() override { if(!com) return false; @@ -53,13 +51,11 @@ public: return true; } - static std::vector> Find() { - std::vector> found; - - for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); - - return found; +private: + NeoVIFIRE(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; } }; diff --git a/include/icsneo/device/neovifire2/neovifire2.h b/include/icsneo/device/neovifire2/neovifire2.h index e2d08df..5b7f0bd 100644 --- a/include/icsneo/device/neovifire2/neovifire2.h +++ b/include/icsneo/device/neovifire2/neovifire2.h @@ -11,17 +11,15 @@ class NeoVIFIRE2 : public Device { public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::FIRE2; static constexpr const char* SERIAL_START = "CY"; + +protected: 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)); + virtual void setupEncoder(Encoder* encoder) override { + Device::setupEncoder(encoder); 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/include/icsneo/device/neovifire2/neovifire2eth.h b/include/icsneo/device/neovifire2/neovifire2eth.h index c760a46..3cabb84 100644 --- a/include/icsneo/device/neovifire2/neovifire2eth.h +++ b/include/icsneo/device/neovifire2/neovifire2eth.h @@ -11,13 +11,6 @@ namespace icsneo { class NeoVIFIRE2ETH : public NeoVIFIRE2 { public: static constexpr const uint16_t PRODUCT_ID = 0x0004; - NeoVIFIRE2ETH(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { - com = MakeCommunication(std::unique_ptr(new PCAP(getWritableNeoDevice()))); - settings = std::unique_ptr(new NeoVIFIRE2Settings(com)); - settings->readonly = true; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; @@ -50,6 +43,18 @@ public: return found; } + +protected: + virtual void setupSettings(IDeviceSettings* settings) { + // TODO Check firmware version, old firmwares will reset Ethernet settings on settings send + settings->readonly = true; + } + +private: + NeoVIFIRE2ETH(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { + initialize(); + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/neovifire2/neovifire2usb.h b/include/icsneo/device/neovifire2/neovifire2usb.h index 65dc6f4..1240c1d 100644 --- a/include/icsneo/device/neovifire2/neovifire2usb.h +++ b/include/icsneo/device/neovifire2/neovifire2usb.h @@ -10,20 +10,20 @@ namespace icsneo { class NeoVIFIRE2USB : public NeoVIFIRE2 { public: static constexpr const uint16_t PRODUCT_ID = 0x1000; - NeoVIFIRE2USB(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { - com = MakeCommunication(std::unique_ptr(new FTDI(getWritableNeoDevice()))); - settings = std::unique_ptr(new NeoVIFIRE2Settings(com)); - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new NeoVIFIRE2USB(neodevice)); // Creation of the shared_ptr return found; } + +private: + NeoVIFIRE2USB(neodevice_t neodevice) : NeoVIFIRE2(neodevice) { + initialize(); + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/nullsettings.h b/include/icsneo/device/nullsettings.h new file mode 100644 index 0000000..d3050a4 --- /dev/null +++ b/include/icsneo/device/nullsettings.h @@ -0,0 +1,18 @@ +#ifndef __NULL_SETTINGS_H_ +#define __NULL_SETTINGS_H_ + +#include "icsneo/device/idevicesettings.h" +#include "icsneo/communication/communication.h" +#include + +namespace icsneo { + +class NullSettings : public IDeviceSettings { +public: + // Calls the base constructor with "createInoperableSettings" + NullSettings(std::shared_ptr com = std::shared_ptr()) : IDeviceSettings(nullptr) { (void)com; } +}; + +} + +#endif \ No newline at end of file diff --git a/include/icsneo/device/plasion/neoviion.h b/include/icsneo/device/plasion/neoviion.h index fc03482..fd6b695 100644 --- a/include/icsneo/device/plasion/neoviion.h +++ b/include/icsneo/device/plasion/neoviion.h @@ -11,19 +11,21 @@ class NeoVIION : public Plasion { public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::ION; static constexpr const uint16_t PRODUCT_ID = 0x0901; - NeoVIION(neodevice_t neodevice) : Plasion(neodevice) { - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new NeoVIION(neodevice)); return found; } + +private: + NeoVIION(neodevice_t neodevice) : Plasion(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/plasion/neoviplasma.h b/include/icsneo/device/plasion/neoviplasma.h index 3eae324..9ee857a 100644 --- a/include/icsneo/device/plasion/neoviplasma.h +++ b/include/icsneo/device/plasion/neoviplasma.h @@ -11,19 +11,21 @@ class NeoVIPLASMA : public Plasion { public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::PLASMA; static constexpr const uint16_t PRODUCT_ID = 0x0801; - NeoVIPLASMA(neodevice_t neodevice) : Plasion(neodevice) { - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new NeoVIPLASMA(neodevice)); return found; } + +private: + NeoVIPLASMA(neodevice_t neodevice) : Plasion(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/plasion/plasion.h b/include/icsneo/device/plasion/plasion.h index 0f15516..c1a0259 100644 --- a/include/icsneo/device/plasion/plasion.h +++ b/include/icsneo/device/plasion/plasion.h @@ -8,14 +8,16 @@ namespace icsneo { class Plasion : public Device { +protected: + virtual std::shared_ptr makeCommunication( + std::unique_ptr transport, + std::shared_ptr packetizer, + std::unique_ptr encoder, + std::unique_ptr decoder + ) override { return std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); } + public: - Plasion(neodevice_t neodevice) : Device(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)); - } + Plasion(neodevice_t neodevice) : Device(neodevice) {} }; } diff --git a/include/icsneo/device/radgalaxy/radgalaxy.h b/include/icsneo/device/radgalaxy/radgalaxy.h index ee34588..f8b5b97 100644 --- a/include/icsneo/device/radgalaxy/radgalaxy.h +++ b/include/icsneo/device/radgalaxy/radgalaxy.h @@ -15,35 +15,16 @@ public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADGalaxy; static constexpr const uint16_t PRODUCT_ID = 0x0003; static constexpr const char* SERIAL_START = "RG"; - - static std::shared_ptr MakePacketizer() { - auto packetizer = std::make_shared(); - packetizer->disableChecksum = true; - packetizer->align16bit = false; - return packetizer; - } - - RADGalaxy(neodevice_t neodevice) : Device(neodevice) { - auto transport = std::unique_ptr(new PCAP(getWritableNeoDevice())); - auto packetizer = MakePacketizer(); - 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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto& foundDev : PCAP::FindAll()) { - auto packetizer = MakePacketizer(); - auto decoder = std::unique_ptr(new Decoder()); + auto fakedev = std::shared_ptr(new RADGalaxy({})); for(auto& payload : foundDev.discoveryPackets) - packetizer->input(payload); - for(auto& packet : packetizer->output()) { + fakedev->com->packetizer->input(payload); + for(auto& packet : fakedev->com->packetizer->output()) { std::shared_ptr msg; - if(!decoder->decode(msg, packet)) + if(!fakedev->com->decoder->decode(msg, packet)) continue; // We failed to decode this packet if(!msg || msg->network.getNetID() != Network::NetID::Main51) @@ -58,13 +39,26 @@ public: continue; // Not a RADGalaxy foundDev.device.serial[sn->deviceSerial.copy(foundDev.device.serial, sizeof(foundDev.device.serial))] = '\0'; - found.push_back(std::make_shared(foundDev.device)); + found.emplace_back(new RADGalaxy(foundDev.device)); break; } } return found; } + +protected: + void setupPacketizer(Packetizer* packetizer) override { + packetizer->disableChecksum = true; + packetizer->align16bit = false; + } + +private: + RADGalaxy(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/radstar2/radstar2.h b/include/icsneo/device/radstar2/radstar2.h index 6ded110..afdeda3 100644 --- a/include/icsneo/device/radstar2/radstar2.h +++ b/include/icsneo/device/radstar2/radstar2.h @@ -12,6 +12,13 @@ public: 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; diff --git a/include/icsneo/device/radstar2/radstar2eth.h b/include/icsneo/device/radstar2/radstar2eth.h index 33845f7..62a17c6 100644 --- a/include/icsneo/device/radstar2/radstar2eth.h +++ b/include/icsneo/device/radstar2/radstar2eth.h @@ -10,33 +10,17 @@ namespace icsneo { class RADStar2ETH : public RADStar2 { public: - static std::shared_ptr MakePacketizer() { - auto packetizer = std::make_shared(); - packetizer->disableChecksum = true; - packetizer->align16bit = false; - return packetizer; - } - // Serial numbers start with RS - RADStar2ETH(neodevice_t neodevice) : RADStar2(neodevice) { - auto transport = std::unique_ptr(new PCAP(getWritableNeoDevice())); - auto packetizer = MakePacketizer(); - 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)); - } - static std::vector> Find() { std::vector> found; for(auto& foundDev : PCAP::FindAll()) { - auto packetizer = MakePacketizer(); - auto decoder = std::unique_ptr(new Decoder()); + auto fakedev = std::shared_ptr(new RADStar2ETH({})); for(auto& payload : foundDev.discoveryPackets) - packetizer->input(payload); - for(auto& packet : packetizer->output()) { + fakedev->com->packetizer->input(payload); + for(auto& packet : fakedev->com->packetizer->output()) { std::shared_ptr msg; - if(!decoder->decode(msg, packet)) + if(!fakedev->com->decoder->decode(msg, packet)) continue; // We failed to decode this packet if(!msg || msg->network.getNetID() != Network::NetID::Main51) @@ -58,6 +42,11 @@ public: return found; } + +private: + RADStar2ETH(neodevice_t neodevice) : RADStar2(neodevice) { + initialize(); + } }; } diff --git a/include/icsneo/device/radstar2/radstar2usb.h b/include/icsneo/device/radstar2/radstar2usb.h index 1519f30..5c67acd 100644 --- a/include/icsneo/device/radstar2/radstar2usb.h +++ b/include/icsneo/device/radstar2/radstar2usb.h @@ -9,22 +9,19 @@ namespace icsneo { class RADStar2USB : public RADStar2 { public: // Serial numbers start with RS - RADStar2USB(neodevice_t neodevice) : RADStar2(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)); - } - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new RADStar2USB(neodevice)); return found; } + +private: + RADStar2USB(neodevice_t neodevice) : RADStar2(neodevice) { + initialize(); + } }; } diff --git a/include/icsneo/device/radsupermoon/radsupermoon.h b/include/icsneo/device/radsupermoon/radsupermoon.h index 547e6d0..ac16f02 100644 --- a/include/icsneo/device/radsupermoon/radsupermoon.h +++ b/include/icsneo/device/radsupermoon/radsupermoon.h @@ -9,28 +9,24 @@ namespace icsneo { class RADSupermoon : public Device { public: - // Serial numbers start with VV + // RSM does not connect at all yet (needs FTDI D3xx driver, not the 2xx compatible one) static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADSupermoon; static constexpr const uint16_t PRODUCT_ID = 0x1201; - RADSupermoon(neodevice_t neodevice) : Device(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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - // RSM does not connect at all yet (needs FTDI D3xx driver, not the 2xx compatible one) - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new RADSupermoon(neodevice)); return found; } + +private: + RADSupermoon(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/valuecan3/valuecan3.h b/include/icsneo/device/valuecan3/valuecan3.h index dfa136c..dc56665 100644 --- a/include/icsneo/device/valuecan3/valuecan3.h +++ b/include/icsneo/device/valuecan3/valuecan3.h @@ -11,24 +11,21 @@ class ValueCAN3 : public Device { public: static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN3; static constexpr const uint16_t PRODUCT_ID = 0x0601; - ValueCAN3(neodevice_t neodevice) : Device(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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new ValueCAN3(neodevice)); return found; } + +private: + ValueCAN3(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4-1.h b/include/icsneo/device/valuecan4/valuecan4-1.h index 5df8569..68738c1 100644 --- a/include/icsneo/device/valuecan4/valuecan4-1.h +++ b/include/icsneo/device/valuecan4/valuecan4-1.h @@ -11,23 +11,27 @@ class ValueCAN4_1 : public ValueCAN4 { public: // Serial numbers start with V1 for 4-1 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; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) { if(std::string(neodevice.serial).substr(0, 2) == "V1") - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new ValueCAN4_1(neodevice)); } return found; } + +protected: + void setupEncoder(Encoder* encoder) override { + encoder->supportCANFD = false; // VCAN 4-1 does not support CAN FD + } + +private: + ValueCAN4_1(neodevice_t neodevice) : ValueCAN4(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4-2.h b/include/icsneo/device/valuecan4/valuecan4-2.h index 96b718d..60b4cfa 100644 --- a/include/icsneo/device/valuecan4/valuecan4-2.h +++ b/include/icsneo/device/valuecan4/valuecan4-2.h @@ -11,22 +11,22 @@ class ValueCAN4_2 : public ValueCAN4 { public: // Serial numbers start with V2 for 4-2 static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN4_2; - ValueCAN4_2(neodevice_t neodevice) : ValueCAN4(neodevice) { - com = MakeCommunication(getWritableNeoDevice()); - settings = std::unique_ptr(new ValueCAN4_2Settings(com)); - getWritableNeoDevice().type = DEVICE_TYPE; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) { if(std::string(neodevice.serial).substr(0, 2) == "V2") - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new ValueCAN4_2(neodevice)); } return found; } + +private: + ValueCAN4_2(neodevice_t neodevice) : ValueCAN4(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4-2el.h b/include/icsneo/device/valuecan4/valuecan4-2el.h index 5179f89..96f2a49 100644 --- a/include/icsneo/device/valuecan4/valuecan4-2el.h +++ b/include/icsneo/device/valuecan4/valuecan4-2el.h @@ -11,22 +11,22 @@ class ValueCAN4_2EL : public ValueCAN4 { public: // Serial numbers start with VE for 4-2EL static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN4_2EL; - ValueCAN4_2EL(neodevice_t neodevice) : ValueCAN4(neodevice) { - com = MakeCommunication(getWritableNeoDevice()); - settings = std::unique_ptr(new ValueCAN4_2ELSettings(com)); - getWritableNeoDevice().type = DEVICE_TYPE; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) { if(std::string(neodevice.serial).substr(0, 2) == "VE") - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new ValueCAN4_2EL(neodevice)); } return found; } + +private: + ValueCAN4_2EL(neodevice_t neodevice) : ValueCAN4(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4-4.h b/include/icsneo/device/valuecan4/valuecan4-4.h index be517ed..40e0d47 100644 --- a/include/icsneo/device/valuecan4/valuecan4-4.h +++ b/include/icsneo/device/valuecan4/valuecan4-4.h @@ -11,22 +11,22 @@ class ValueCAN4_4 : public ValueCAN4 { public: // Serial numbers start with V4 for 4-4 static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN4_4; - ValueCAN4_4(neodevice_t neodevice) : ValueCAN4(neodevice) { - com = MakeCommunication(getWritableNeoDevice()); - settings = std::unique_ptr(new ValueCAN4_4Settings(com)); - getWritableNeoDevice().type = DEVICE_TYPE; - } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) { if(std::string(neodevice.serial).substr(0, 2) == "V4") - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new ValueCAN4_4(neodevice)); } return found; } + +private: + ValueCAN4_4(neodevice_t neodevice) : ValueCAN4(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + } }; } diff --git a/include/icsneo/device/valuecan4/valuecan4.h b/include/icsneo/device/valuecan4/valuecan4.h index ddc5e96..606f45c 100644 --- a/include/icsneo/device/valuecan4/valuecan4.h +++ b/include/icsneo/device/valuecan4/valuecan4.h @@ -10,18 +10,14 @@ namespace icsneo { class ValueCAN4 : public Device { public: static constexpr const uint16_t PRODUCT_ID = 0x1101; - ValueCAN4(neodevice_t neodevice) : Device(neodevice) { - productId = PRODUCT_ID; - } protected: - static std::shared_ptr MakeCommunication(neodevice_t& nd) { - auto transport = std::unique_ptr(new STM32(nd)); - auto packetizer = std::make_shared(); - auto encoder = std::unique_ptr(new Encoder(packetizer)); + virtual void setupEncoder(Encoder* encoder) override { encoder->supportCANFD = true; - auto decoder = std::unique_ptr(new Decoder()); - return std::make_shared(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); + } + + ValueCAN4(neodevice_t neodevice) : Device(neodevice) { + productId = PRODUCT_ID; } }; diff --git a/include/icsneo/device/vividcan/vividcan.h b/include/icsneo/device/vividcan/vividcan.h index cff2dfc..c6022ce 100644 --- a/include/icsneo/device/vividcan/vividcan.h +++ b/include/icsneo/device/vividcan/vividcan.h @@ -12,26 +12,23 @@ public: // Serial numbers start with VV static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VividCAN; static constexpr const uint16_t PRODUCT_ID = 0x1102; - VividCAN(neodevice_t neodevice) : Device(neodevice) { - auto transport = std::unique_ptr(new STM32(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)); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; - } - - bool goOnline() { return false; } - static std::vector> Find() { std::vector> found; for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) - found.push_back(std::make_shared(neodevice)); + found.emplace_back(new VividCAN(neodevice)); return found; } + + bool goOnline() override { return false; } + +private: + VividCAN(neodevice_t neodevice) : Device(neodevice) { + initialize(); + getWritableNeoDevice().type = DEVICE_TYPE; + productId = PRODUCT_ID; + } }; }