Add support for RADStar2 settings

pull/4/head
Paul Hollinsky 2018-12-21 20:28:25 -05:00
parent e124ad28f4
commit 603d532d2d
6 changed files with 192 additions and 31 deletions

View File

@ -134,6 +134,9 @@ bool IDeviceSettings::refresh(bool ignoreChecksum) {
return false;
}
if(disableGSChecksumming)
ignoreChecksum = true;
std::vector<uint8_t> rxSettings;
bool ret = com->getSettingsSync(rxSettings);
if(!ret) {

View File

@ -96,6 +96,55 @@ typedef struct ETHERNET_SETTINGS_t
} ETHERNET_SETTINGS;
#define ETHERNET_SETTINGS_SIZE 8
typedef struct OP_ETH_GENERAL_SETTINGS_t
{
uint8_t ucInterfaceType;
uint8_t reserved0[3];
uint16_t tapPair0;
uint16_t tapPair1;
uint16_t tapPair2;
uint16_t tapPair3;
uint16_t tapPair4;
uint16_t tapPair5;
union {
struct
{
unsigned bTapEnSwitch : 1;
unsigned bTapEnPtp : 1;
unsigned bEnReportLinkQuality : 1;
} flags;
unsigned uFlags;
};
} OP_ETH_GENERAL_SETTINGS;
#define OP_ETH_GENERAL_SETTINGS_SIZE 20
static_assert(sizeof(OP_ETH_GENERAL_SETTINGS) == OP_ETH_GENERAL_SETTINGS_SIZE, "OP_ETH_GENERAL_SETTINGS is the wrong size!");
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4201) // nameless struct/union
#endif
typedef struct OP_ETH_SETTINGS_t
{
uint8_t ucConfigMode;
unsigned char preemption_en;
union {
struct {
// Reuse the mac_addr for switch mode if required!
unsigned char mac_addr1[6];// Original Addr for spoofing
unsigned char mac_addr2[6];// Target Addr for spoofing
unsigned short mac_spoofing_en : 1;
unsigned short mac_spoofing_isDstOrSrc : 1;
unsigned short reserved : 14;
};
unsigned char reserved0[14];
};
} OP_ETH_SETTINGS;
#define OP_ETH_SETTINGS_SIZE 16
static_assert(sizeof(OP_ETH_SETTINGS) == OP_ETH_SETTINGS_SIZE, "OP_ETH_SETTINGS is the wrong size!");
#ifdef _MSC_VER
#pragma warning(pop)
#endif
typedef struct
{
uint8_t MasterEnable;
@ -332,6 +381,7 @@ public:
bool disabled = false;
bool readonly = false;
bool disableGSChecksumming = false;
protected:
std::shared_ptr<Communication> com;
device_errorhandler_t err;

View File

@ -1,30 +1,31 @@
#ifndef __RADSTAR2_H_
#define __RADSTAR2_H_
#include "icsneo/device/device.h"
#include "icsneo/device/devicetype.h"
namespace icsneo {
class RADStar2 : public Device {
public:
// Serial numbers start with RS
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;
}
};
}
#ifndef __RADSTAR2_H_
#define __RADSTAR2_H_
#include "icsneo/device/device.h"
#include "icsneo/device/devicetype.h"
#include "icsneo/device/radstar2/radstar2settings.h"
namespace icsneo {
class RADStar2 : public Device {
public:
// Serial numbers start with RS
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;
}
};
}
#endif

View File

@ -44,7 +44,7 @@ public:
}
RADStar2ETH(neodevice_t neodevice) : RADStar2(neodevice) {
initialize<PCAP>();
initialize<PCAP, RADStar2Settings>();
}
};

View File

@ -0,0 +1,107 @@
#ifndef __RADSTAR2SETTINGS_H_
#define __RADSTAR2SETTINGS_H_
#include <stdint.h>
#include "icsneo/device/idevicesettings.h"
#ifdef __cplusplus
namespace icsneo {
#endif
#pragma pack(push, 2)
typedef struct {
uint16_t perf_en;
OP_ETH_GENERAL_SETTINGS opEthGen;
OP_ETH_SETTINGS opEth1;
OP_ETH_SETTINGS opEth2;
CAN_SETTINGS can1;
CANFD_SETTINGS canfd1;
CAN_SETTINGS can2;
CANFD_SETTINGS canfd2;
uint16_t network_enables;
uint16_t network_enables_2;
LIN_SETTINGS lin1;
uint16_t misc_io_initial_ddr;
uint16_t misc_io_initial_latch;
uint16_t misc_io_report_period;
uint16_t misc_io_on_report_events;
uint16_t misc_io_analog_enable;
uint16_t ain_sample_period;
uint16_t ain_threshold;
uint32_t pwr_man_timeout;
uint16_t pwr_man_enable;
uint16_t network_enabled_on_boot;
uint16_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 idle_wakeup_network_enables_1;
uint16_t idle_wakeup_network_enables_2;
uint16_t network_enables_3;
uint16_t idle_wakeup_network_enables_3;
uint16_t can_switch_mode;
STextAPISettings text_api;
uint16_t pc_com_mode;
TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings;
uint16_t hwComLatencyTestEn;
} radstar2_settings_t;
#pragma pack(pop)
#ifdef __cplusplus
#include <iostream>
class RADStar2Settings : public IDeviceSettings {
public:
RADStar2Settings(std::shared_ptr<Communication> com) : IDeviceSettings(com, sizeof(radstar2_settings_t)) {
disableGSChecksumming = true;
}
const CAN_SETTINGS* getCANSettingsFor(Network net) const override {
auto cfg = getStructurePointer<radstar2_settings_t>();
if(cfg == nullptr)
return nullptr;
switch(net.getNetID()) {
case Network::NetID::HSCAN:
return &(cfg->can1);
case Network::NetID::MSCAN:
return &(cfg->can2);
default:
return nullptr;
}
}
const CANFD_SETTINGS* getCANFDSettingsFor(Network net) const override {
auto cfg = getStructurePointer<radstar2_settings_t>();
if(cfg == nullptr)
return nullptr;
switch(net.getNetID()) {
case Network::NetID::HSCAN:
return &(cfg->canfd1);
case Network::NetID::MSCAN:
return &(cfg->canfd2);
default:
return nullptr;
}
}
};
}
#endif // __cplusplus
#endif

View File

@ -20,7 +20,7 @@ public:
private:
RADStar2USB(neodevice_t neodevice) : RADStar2(neodevice) {
initialize<FTDI>();
initialize<FTDI, RADStar2Settings>();
}
};