From 1a9c907feac6d7174f86f407cefe889f651eb3ee Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Tue, 30 Oct 2018 15:38:15 -0400 Subject: [PATCH] CAN FD baudrate settings --- api/icsneoc/icsneoc.cpp | 9 +++++++ device/idevicesettings.cpp | 24 +++++++++++++++++++ include/icsneo/device/idevicesettings.h | 1 + .../device/neovifire2/neovifire2settings.h | 24 ++++++++++++++++++- .../valuecan4/settings/valuecan4-1settings.h | 1 - .../settings/valuecan4-2elsettings.h | 16 +++++++++---- .../valuecan4/settings/valuecan4-2settings.h | 12 +++++++++- .../valuecan4/settings/valuecan4-4settings.h | 16 ++++++++++++- include/icsneo/icsneoc.h | 6 +++++ 9 files changed, 100 insertions(+), 9 deletions(-) diff --git a/api/icsneoc/icsneoc.cpp b/api/icsneoc/icsneoc.cpp index cc8f50e..12baf19 100644 --- a/api/icsneoc/icsneoc.cpp +++ b/api/icsneoc/icsneoc.cpp @@ -323,6 +323,15 @@ bool icsneo_setBaudrate(const neodevice_t* device, uint16_t netid, uint32_t newB return device->device->settings->setBaudrateFor(netid, newBaudrate); } +bool icsneo_setFDBaudrate(const neodevice_t* device, uint16_t netid, uint32_t newBaudrate) { + if(!icsneo_isValidNeoDevice(device)) { + ErrorManager::GetInstance().add(APIError::InvalidNeoDevice); + return false; + } + + return device->device->settings->setFDBaudrateFor(netid, newBaudrate); +} + bool icsneo_transmit(const neodevice_t* device, const neomessage_t* message) { if(!icsneo_isValidNeoDevice(device)) { ErrorManager::GetInstance().add(APIError::InvalidNeoDevice); diff --git a/device/idevicesettings.cpp b/device/idevicesettings.cpp index 6b170e3..fe2415d 100644 --- a/device/idevicesettings.cpp +++ b/device/idevicesettings.cpp @@ -192,6 +192,9 @@ bool IDeviceSettings::setBaudrateFor(Network net, uint32_t baudrate) { switch(net.getType()) { case Network::Type::CAN: { + if(baudrate > 1000000) // This is an FD baudrate. Use setFDBaudrateFor instead. + return false; + CAN_SETTINGS* cfg = getCANSettingsFor(net); if(cfg == nullptr) return false; @@ -209,6 +212,27 @@ bool IDeviceSettings::setBaudrateFor(Network net, uint32_t baudrate) { } } +bool IDeviceSettings::setFDBaudrateFor(Network net, uint32_t baudrate) { + if(disabled || readonly) + return false; + + switch(net.getType()) { + case Network::Type::CAN: { + CANFD_SETTINGS* cfg = getCANFDSettingsFor(net); + if(cfg == nullptr) + return false; + + uint8_t newBaud = getEnumValueForBaudrate(baudrate); + if(newBaud == 0xFF) + return false; + cfg->FDBaudrate = newBaud; + return true; + } + default: + return false; + } +} + template bool IDeviceSettings::setStructure(const T& newStructure) { if(disabled || readonly) return false; diff --git a/include/icsneo/device/idevicesettings.h b/include/icsneo/device/idevicesettings.h index 6d272fb..81a00c6 100644 --- a/include/icsneo/device/idevicesettings.h +++ b/include/icsneo/device/idevicesettings.h @@ -294,6 +294,7 @@ public: bool applyDefaults(bool temporary = false); virtual bool setBaudrateFor(Network net, uint32_t baudrate); + virtual bool setFDBaudrateFor(Network net, uint32_t baudrate); virtual CAN_SETTINGS* getCANSettingsFor(Network net) { (void)net; return nullptr; } virtual CANFD_SETTINGS* getCANFDSettingsFor(Network net) { (void)net; return nullptr; } diff --git a/include/icsneo/device/neovifire2/neovifire2settings.h b/include/icsneo/device/neovifire2/neovifire2settings.h index 63e05e6..90fffc6 100644 --- a/include/icsneo/device/neovifire2/neovifire2settings.h +++ b/include/icsneo/device/neovifire2/neovifire2settings.h @@ -137,7 +137,29 @@ public: return nullptr; } } - // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } + CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::MSCAN: + return &(cfg->canfd2); + case Network::NetID::HSCAN2: + return &(cfg->canfd3); + case Network::NetID::HSCAN3: + return &(cfg->canfd4); + case Network::NetID::HSCAN4: + return &(cfg->canfd5); + case Network::NetID::HSCAN5: + return &(cfg->canfd6); + case Network::NetID::HSCAN6: + return &(cfg->canfd7); + case Network::NetID::HSCAN7: + return &(cfg->canfd8); + default: + return nullptr; + } + } }; } diff --git a/include/icsneo/device/valuecan4/settings/valuecan4-1settings.h b/include/icsneo/device/valuecan4/settings/valuecan4-1settings.h index 46125b4..bed3d79 100644 --- a/include/icsneo/device/valuecan4/settings/valuecan4-1settings.h +++ b/include/icsneo/device/valuecan4/settings/valuecan4-1settings.h @@ -19,7 +19,6 @@ public: return nullptr; } } - // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } }; } diff --git a/include/icsneo/device/valuecan4/settings/valuecan4-2elsettings.h b/include/icsneo/device/valuecan4/settings/valuecan4-2elsettings.h index adf127e..71f476e 100644 --- a/include/icsneo/device/valuecan4/settings/valuecan4-2elsettings.h +++ b/include/icsneo/device/valuecan4/settings/valuecan4-2elsettings.h @@ -18,15 +18,21 @@ public: 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; } + CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::HSCAN2: + return &(cfg->canfd2); + default: + return nullptr; + } + } }; } diff --git a/include/icsneo/device/valuecan4/settings/valuecan4-2settings.h b/include/icsneo/device/valuecan4/settings/valuecan4-2settings.h index 4310ef5..0830b9c 100644 --- a/include/icsneo/device/valuecan4/settings/valuecan4-2settings.h +++ b/include/icsneo/device/valuecan4/settings/valuecan4-2settings.h @@ -21,7 +21,17 @@ public: return nullptr; } } - // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } + CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::HSCAN2: + return &(cfg->canfd2); + default: + return nullptr; + } + } }; } diff --git a/include/icsneo/device/valuecan4/settings/valuecan4-4settings.h b/include/icsneo/device/valuecan4/settings/valuecan4-4settings.h index 9917a9c..dc55f3b 100644 --- a/include/icsneo/device/valuecan4/settings/valuecan4-4settings.h +++ b/include/icsneo/device/valuecan4/settings/valuecan4-4settings.h @@ -26,7 +26,21 @@ public: return nullptr; } } - // CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { return nullptr; } + CANFD_SETTINGS* getCANFDSettingsFor(Network net) override { + auto cfg = getStructurePointer(); + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::HSCAN2: + return &(cfg->canfd2); + case Network::NetID::HSCAN3: + return &(cfg->canfd3); + case Network::NetID::HSCAN4: + return &(cfg->canfd4); + default: + return nullptr; + } + } }; } diff --git a/include/icsneo/icsneoc.h b/include/icsneo/icsneoc.h index bb164b8..ea629b4 100644 --- a/include/icsneo/icsneoc.h +++ b/include/icsneo/icsneoc.h @@ -58,6 +58,8 @@ extern bool DLLExport icsneo_settingsApplyDefaultsTemporary(const neodevice_t* d extern bool DLLExport icsneo_setBaudrate(const neodevice_t* device, uint16_t netid, uint32_t newBaudrate); +extern bool DLLExport icsneo_setFDBaudrate(const neodevice_t* device, uint16_t netid, uint32_t newBaudrate); + extern bool DLLExport icsneo_transmit(const neodevice_t* device, const neomessage_t* message); extern bool DLLExport icsneo_transmitMessages(const neodevice_t* device, const neomessage_t* messages, size_t count); @@ -138,6 +140,9 @@ fn_icsneo_settingsApplyDefaultsTemporary icsneo_settingsApplyDefaultsTemporary; typedef bool(*fn_icsneo_setBaudrate)(const neodevice_t* device, uint16_t netid, uint32_t newBaudrate); fn_icsneo_setBaudrate icsneo_setBaudrate; +typedef bool(*fn_icsneo_setFDBaudrate)(const neodevice_t* device, uint16_t netid, uint32_t newBaudrate); +fn_icsneo_setFDBaudrate icsneo_setFDBaudrate; + typedef bool(*fn_icsneo_transmit)(const neodevice_t* device, const neomessage_t* message); fn_icsneo_transmit icsneo_transmit; @@ -186,6 +191,7 @@ int icsneo_init() { ICSNEO_IMPORTASSERT(icsneo_settingsApplyDefaults); ICSNEO_IMPORTASSERT(icsneo_settingsApplyDefaultsTemporary); ICSNEO_IMPORTASSERT(icsneo_setBaudrate); + ICSNEO_IMPORTASSERT(icsneo_setFDBaudrate); ICSNEO_IMPORTASSERT(icsneo_transmit); ICSNEO_IMPORTASSERT(icsneo_transmitMessages); ICSNEO_IMPORTASSERT(icsneo_describeDevice);