From 769c797a5084a9a4ecd9d4bd1ec1dbd30b5f196c Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Fri, 19 Oct 2018 13:43:36 -0400 Subject: [PATCH] Detection for ValueCAN 4 models, as well as settings for each --- device/devicefinder.cpp | 16 +++- device/valuecan4/include/valuecan4-1.h | 34 ++++++++ device/valuecan4/include/valuecan4-2.h | 34 ++++++++ device/valuecan4/include/valuecan4-2el.h | 34 ++++++++ device/valuecan4/include/valuecan4-4.h | 34 ++++++++ device/valuecan4/include/valuecan4.h | 22 ++--- .../settings/include/valuecan4-1-2settings.h | 21 +++++ .../settings/include/valuecan4-1settings.h | 29 +++++++ .../settings/include/valuecan4-2elsettings.h | 36 ++++++++ .../settings/include/valuecan4-2settings.h | 31 +++++++ .../include/valuecan4-4-2elsettings.h | 21 +++++ .../settings/include/valuecan4-4settings.h | 36 ++++++++ .../settings/include/valuecan4settings.h | 86 +++++++++++++++++++ platform/posix/include/devices.h | 5 +- platform/windows/include/devices.h | 5 +- 15 files changed, 425 insertions(+), 19 deletions(-) create mode 100644 device/valuecan4/include/valuecan4-1.h create mode 100644 device/valuecan4/include/valuecan4-2.h create mode 100644 device/valuecan4/include/valuecan4-2el.h create mode 100644 device/valuecan4/include/valuecan4-4.h create mode 100644 device/valuecan4/settings/include/valuecan4-1-2settings.h create mode 100644 device/valuecan4/settings/include/valuecan4-1settings.h create mode 100644 device/valuecan4/settings/include/valuecan4-2elsettings.h create mode 100644 device/valuecan4/settings/include/valuecan4-2settings.h create mode 100644 device/valuecan4/settings/include/valuecan4-4-2elsettings.h create mode 100644 device/valuecan4/settings/include/valuecan4-4settings.h create mode 100644 device/valuecan4/settings/include/valuecan4settings.h diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index e6815dc..08bd969 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -55,8 +55,20 @@ std::vector> DeviceFinder::FindAll() { findResults.push_back(ValueCAN3::Find()); #endif - #ifdef __VALUECAN4_H_ - findResults.push_back(ValueCAN4::Find()); + #ifdef __VALUECAN4_1_H_ + findResults.push_back(ValueCAN4_1::Find()); + #endif + + #ifdef __VALUECAN4_2_H_ + findResults.push_back(ValueCAN4_2::Find()); + #endif + + #ifdef __VALUECAN4_2EL_H_ + findResults.push_back(ValueCAN4_2EL::Find()); + #endif + + #ifdef __VALUECAN4_4_H_ + findResults.push_back(ValueCAN4_4::Find()); #endif #ifdef __VIVIDCAN_H_ diff --git a/device/valuecan4/include/valuecan4-1.h b/device/valuecan4/include/valuecan4-1.h new file mode 100644 index 0000000..a4e2aa1 --- /dev/null +++ b/device/valuecan4/include/valuecan4-1.h @@ -0,0 +1,34 @@ +#ifndef __VALUECAN4_1_H_ +#define __VALUECAN4_1_H_ + +#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/settings/include/valuecan4-1settings.h" +#include + +namespace icsneo { + +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()); + 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)); + } + + return found; + } +}; + +} + +#endif \ No newline at end of file diff --git a/device/valuecan4/include/valuecan4-2.h b/device/valuecan4/include/valuecan4-2.h new file mode 100644 index 0000000..5eaaefd --- /dev/null +++ b/device/valuecan4/include/valuecan4-2.h @@ -0,0 +1,34 @@ +#ifndef __VALUECAN4_2_H_ +#define __VALUECAN4_2_H_ + +#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/settings/include/valuecan4-2settings.h" +#include + +namespace icsneo { + +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)); + } + + return found; + } +}; + +} + +#endif \ No newline at end of file diff --git a/device/valuecan4/include/valuecan4-2el.h b/device/valuecan4/include/valuecan4-2el.h new file mode 100644 index 0000000..11152f4 --- /dev/null +++ b/device/valuecan4/include/valuecan4-2el.h @@ -0,0 +1,34 @@ +#ifndef __VALUECAN4_2EL_H_ +#define __VALUECAN4_2EL_H_ + +#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/settings/include/valuecan4-2elsettings.h" +#include + +namespace icsneo { + +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)); + } + + return found; + } +}; + +} + +#endif \ No newline at end of file diff --git a/device/valuecan4/include/valuecan4-4.h b/device/valuecan4/include/valuecan4-4.h new file mode 100644 index 0000000..9bf0142 --- /dev/null +++ b/device/valuecan4/include/valuecan4-4.h @@ -0,0 +1,34 @@ +#ifndef __VALUECAN4_4_H_ +#define __VALUECAN4_4_H_ + +#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/settings/include/valuecan4-4settings.h" +#include + +namespace icsneo { + +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)); + } + + return found; + } +}; + +} + +#endif \ No newline at end of file diff --git a/device/valuecan4/include/valuecan4.h b/device/valuecan4/include/valuecan4.h index ec7fcba..9051c0d 100644 --- a/device/valuecan4/include/valuecan4.h +++ b/device/valuecan4/include/valuecan4.h @@ -9,26 +9,18 @@ namespace icsneo { class ValueCAN4 : public Device { public: - // Serial numbers are V0 for 4-4, VE for 4-2EL, V2 for 4-2, and V1 for 4-1 - static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::VCAN4_2; // TODO Split headers and determine the correct type static constexpr const uint16_t PRODUCT_ID = 0x1101; ValueCAN4(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)); - - return found; +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)); + 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/valuecan4/settings/include/valuecan4-1-2settings.h b/device/valuecan4/settings/include/valuecan4-1-2settings.h new file mode 100644 index 0000000..2fec2ca --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-1-2settings.h @@ -0,0 +1,21 @@ +#ifndef __VALUECAN4_1_2_SETTINGS_H_ +#define __VALUECAN4_1_2_SETTINGS_H_ + +#include "device/include/idevicesettings.h" +#include "device/valuecan4/settings/include/valuecan4settings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_1_2Settings : public IDeviceSettings { +public: + ValueCAN4_1_2Settings(std::shared_ptr com) : IDeviceSettings(com, sizeof(valuecan4_1_2_settings_t)) {} + // We do not override getCANSettingsFor or getCANFDSettingsFor here because they will be device specific +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4-1settings.h b/device/valuecan4/settings/include/valuecan4-1settings.h new file mode 100644 index 0000000..053811e --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-1settings.h @@ -0,0 +1,29 @@ +#ifndef __VALUECAN4_1_SETTINGS_H_ +#define __VALUECAN4_1_SETTINGS_H_ + +#include "device/valuecan4/settings/include/valuecan4-1-2settings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_1Settings : public ValueCAN4_1_2Settings { +public: + ValueCAN4_1Settings(std::shared_ptr com) : ValueCAN4_1_2Settings(com) {} + CAN_SETTINGS* getCANSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + default: + return nullptr; + } + } + // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4-2elsettings.h b/device/valuecan4/settings/include/valuecan4-2elsettings.h new file mode 100644 index 0000000..e6bc68f --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-2elsettings.h @@ -0,0 +1,36 @@ +#ifndef __VALUECAN4_2EL_SETTINGS_H_ +#define __VALUECAN4_2EL_SETTINGS_H_ + +#include "device/include/idevicesettings.h" +#include "device/valuecan4/settings/include/valuecan4-4-2elsettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_2ELSettings : public ValueCAN4_4_2ELSettings { +public: + ValueCAN4_2ELSettings(std::shared_ptr com) : ValueCAN4_4_2ELSettings(com) {} + CAN_SETTINGS* getCANSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::HSCAN2: + return &(cfg->can2); + case Network::NetID::HSCAN3: + return &(cfg->can3); + case Network::NetID::HSCAN4: + return &(cfg->can4); + default: + return nullptr; + } + } + // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4-2settings.h b/device/valuecan4/settings/include/valuecan4-2settings.h new file mode 100644 index 0000000..c046692 --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-2settings.h @@ -0,0 +1,31 @@ +#ifndef __VALUECAN4_2_SETTINGS_H_ +#define __VALUECAN4_2_SETTINGS_H_ + +#include "device/valuecan4/settings/include/valuecan4-1-2settings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_2Settings : public ValueCAN4_1_2Settings { +public: + ValueCAN4_2Settings(std::shared_ptr com) : ValueCAN4_1_2Settings(com) {} + CAN_SETTINGS* getCANSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::HSCAN2: + return &(cfg->can2); + default: + return nullptr; + } + } + // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4-4-2elsettings.h b/device/valuecan4/settings/include/valuecan4-4-2elsettings.h new file mode 100644 index 0000000..cec826d --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-4-2elsettings.h @@ -0,0 +1,21 @@ +#ifndef __VALUECAN4_4_2EL_SETTINGS_H_ +#define __VALUECAN4_4_2EL_SETTINGS_H_ + +#include "device/include/idevicesettings.h" +#include "device/valuecan4/settings/include/valuecan4settings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_4_2ELSettings : public IDeviceSettings { +public: + ValueCAN4_4_2ELSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(valuecan4_4_2el_settings_t)) {} + // We do not override getCANSettingsFor, getCANFDSettingsFor, or getEthernetSettingsFor here because they will be device specific +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4-4settings.h b/device/valuecan4/settings/include/valuecan4-4settings.h new file mode 100644 index 0000000..1e8c168 --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4-4settings.h @@ -0,0 +1,36 @@ +#ifndef __VALUECAN4_4_SETTINGS_H_ +#define __VALUECAN4_4_SETTINGS_H_ + +#include "device/include/idevicesettings.h" +#include "device/valuecan4/settings/include/valuecan4-4-2elsettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +class ValueCAN4_4Settings : public ValueCAN4_4_2ELSettings { +public: + ValueCAN4_4Settings(std::shared_ptr com) : ValueCAN4_4_2ELSettings(com) {} + CAN_SETTINGS* getCANSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::HSCAN2: + return &(cfg->can2); + case Network::NetID::HSCAN3: + return &(cfg->can3); + case Network::NetID::HSCAN4: + return &(cfg->can4); + default: + return nullptr; + } + } + // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/device/valuecan4/settings/include/valuecan4settings.h b/device/valuecan4/settings/include/valuecan4settings.h new file mode 100644 index 0000000..1dd271e --- /dev/null +++ b/device/valuecan4/settings/include/valuecan4settings.h @@ -0,0 +1,86 @@ +#ifndef __VALUECAN4_SETTINGS_H_ +#define __VALUECAN4_SETTINGS_H_ + +#include +#include "device/include/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif + +// This is where the actual settings structures for all the ValueCAN 4 line live +// ValueCAN 4-1 and 4-2 share a structure, and 4-4 shares with 4-2EL + +#pragma pack(push, 2) +typedef struct { + /* Performance Test */ + uint16_t perf_en; + + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + + uint64_t network_enables; + uint64_t termination_enables; + + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + + uint16_t network_enabled_on_boot; + + /* ISO15765-2 Transport Layer */ + int16_t iso15765_separation_time_offset; + + STextAPISettings text_api; + struct + { + uint32_t disableUsbCheckOnBoot : 1; + uint32_t enableLatencyTest : 1; + uint32_t reserved : 30; + } flags; +} valuecan4_1_2_settings_t, valuecan4_1_settings_t, valuecan4_2_settings_t; + +typedef struct { + uint16_t perf_en; + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + CAN_SETTINGS can3; + CANFD_SETTINGS canfd3; + CAN_SETTINGS can4; + CANFD_SETTINGS canfd4; + uint16_t network_enables; + uint16_t network_enables_2; + LIN_SETTINGS lin1; + uint16_t network_enabled_on_boot; + int16_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 network_enables_3; + STextAPISettings text_api; + uint64_t termination_enables; + ETHERNET_SETTINGS ethernet; + struct + { + uint32_t enableLatencyTest : 1; + uint32_t enablePcEthernetComm : 1; + uint32_t reserved : 30; + } flags; + uint16_t pwr_man_enable; + uint16_t pwr_man_timeout; +} valuecan4_4_2el_settings_t, valuecan4_4_settings_t, valuecan4_2el_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +} // End of namespace + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/platform/posix/include/devices.h b/platform/posix/include/devices.h index 223593c..dded6d0 100644 --- a/platform/posix/include/devices.h +++ b/platform/posix/include/devices.h @@ -13,7 +13,10 @@ #include "device/radstar2/include/radstar2usb.h" #include "device/radsupermoon/include/radsupermoon.h" #include "device/valuecan3/include/valuecan3.h" -#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/include/valuecan4-1.h" +#include "device/valuecan4/include/valuecan4-2.h" +#include "device/valuecan4/include/valuecan4-2el.h" +#include "device/valuecan4/include/valuecan4-4.h" #include "device/vividcan/include/vividcan.h" #endif \ No newline at end of file diff --git a/platform/windows/include/devices.h b/platform/windows/include/devices.h index 3feeb61..d70fff9 100644 --- a/platform/windows/include/devices.h +++ b/platform/windows/include/devices.h @@ -13,7 +13,10 @@ #include "device/radstar2/include/radstar2usb.h" #include "device/radsupermoon/include/radsupermoon.h" #include "device/valuecan3/include/valuecan3.h" -#include "device/valuecan4/include/valuecan4.h" +#include "device/valuecan4/include/valuecan4-1.h" +#include "device/valuecan4/include/valuecan4-2.h" +#include "device/valuecan4/include/valuecan4-2el.h" +#include "device/valuecan4/include/valuecan4-4.h" #include "device/vividcan/include/vividcan.h" #endif \ No newline at end of file