mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-09-22 17:08:38 +02:00
Compare commits
3
Commits
4ed29b4a5e
...
0dd8dbfb64
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0dd8dbfb64 | ||
|
|
d708f8081a | ||
|
|
743246e813 |
@@ -48,6 +48,11 @@ typedef struct icsneoc2_chip_versions_t {
|
|||||||
icsneoc2_chip_versions_t* next;
|
icsneoc2_chip_versions_t* next;
|
||||||
} icsneoc2_chip_versions_t;
|
} icsneoc2_chip_versions_t;
|
||||||
|
|
||||||
|
typedef struct icsneoc2_termination_group_t {
|
||||||
|
std::vector<icsneoc2_netid_t> netids;
|
||||||
|
icsneoc2_termination_group_t* next;
|
||||||
|
} icsneoc2_termination_group_t;
|
||||||
|
|
||||||
typedef struct icsneoc2_mac_addr_entry_t {
|
typedef struct icsneoc2_mac_addr_entry_t {
|
||||||
uint16_t network_id;
|
uint16_t network_id;
|
||||||
uint8_t address[ICSNEO_MAC_ADDRESS_LEN];
|
uint8_t address[ICSNEO_MAC_ADDRESS_LEN];
|
||||||
|
|||||||
@@ -179,6 +179,82 @@ icsneoc2_error_t icsneoc2_settings_termination_set(icsneoc2_device_t* device, ic
|
|||||||
return icsneoc2_error_success;
|
return icsneoc2_error_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
icsneoc2_error_t icsneoc2_settings_termination_groups_enumerate(icsneoc2_device_t* device, icsneoc2_termination_group_t** groups, size_t* count) {
|
||||||
|
// Make sure the device is valid
|
||||||
|
auto res = icsneoc2_device_is_valid(device);
|
||||||
|
if(res != icsneoc2_error_success) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
if(!groups) {
|
||||||
|
return icsneoc2_error_invalid_parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto termination_groups = device->device->settings->getTerminationGroups();
|
||||||
|
|
||||||
|
icsneoc2_termination_group_t* head = nullptr;
|
||||||
|
icsneoc2_termination_group_t* tail = nullptr;
|
||||||
|
for(const auto& group : termination_groups) {
|
||||||
|
auto* node = new (std::nothrow) icsneoc2_termination_group_t;
|
||||||
|
if(!node) {
|
||||||
|
icsneoc2_settings_termination_groups_free(head);
|
||||||
|
return icsneoc2_error_out_of_memory;
|
||||||
|
}
|
||||||
|
node->netids.reserve(group.size());
|
||||||
|
for(const auto& network : group) {
|
||||||
|
node->netids.push_back(static_cast<icsneoc2_netid_t>(network.getNetID()));
|
||||||
|
}
|
||||||
|
node->next = nullptr;
|
||||||
|
if(!head) {
|
||||||
|
head = node;
|
||||||
|
} else {
|
||||||
|
tail->next = node;
|
||||||
|
}
|
||||||
|
tail = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
*groups = head;
|
||||||
|
if(count) {
|
||||||
|
*count = termination_groups.size();
|
||||||
|
}
|
||||||
|
return icsneoc2_error_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
icsneoc2_termination_group_t* icsneoc2_termination_group_next(const icsneoc2_termination_group_t* group) {
|
||||||
|
if(!group) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return group->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
icsneoc2_error_t icsneoc2_termination_group_networks_get(const icsneoc2_termination_group_t* group, icsneoc2_netid_t* networks, size_t* count) {
|
||||||
|
if(!group || !count) {
|
||||||
|
return icsneoc2_error_invalid_parameters;
|
||||||
|
}
|
||||||
|
if(!networks) {
|
||||||
|
*count = group->netids.size();
|
||||||
|
return icsneoc2_error_success;
|
||||||
|
}
|
||||||
|
size_t to_copy = std::min<size_t>(*count, group->netids.size());
|
||||||
|
for(size_t i = 0; i < to_copy; i++) {
|
||||||
|
networks[i] = group->netids[i];
|
||||||
|
}
|
||||||
|
*count = to_copy;
|
||||||
|
return icsneoc2_error_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
icsneoc2_error_t icsneoc2_settings_termination_groups_free(icsneoc2_termination_group_t* groups) {
|
||||||
|
if(!groups) {
|
||||||
|
return icsneoc2_error_invalid_parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(groups) {
|
||||||
|
auto* next = groups->next;
|
||||||
|
delete groups;
|
||||||
|
groups = next;
|
||||||
|
}
|
||||||
|
return icsneoc2_error_success;
|
||||||
|
}
|
||||||
|
|
||||||
icsneoc2_error_t icsneoc2_settings_commander_resistor_enabled(icsneoc2_device_t* device, icsneoc2_netid_t netid, bool* enabled) {
|
icsneoc2_error_t icsneoc2_settings_commander_resistor_enabled(icsneoc2_device_t* device, icsneoc2_netid_t netid, bool* enabled) {
|
||||||
// Make sure the device is valid
|
// Make sure the device is valid
|
||||||
auto res = icsneoc2_device_is_valid(device);
|
auto res = icsneoc2_device_is_valid(device);
|
||||||
|
|||||||
@@ -5,6 +5,13 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "icsneo/icsnVC40.h"
|
#include "icsneo/icsnVC40.h"
|
||||||
|
|
||||||
|
// Vehicle Spy 3.26.3.9 removed these legacy settings structure definitions from
|
||||||
|
// icsnVC40.h. The corresponding functions only ever treat them as opaque
|
||||||
|
// buffers, so forward declarations keep the existing API/ABI intact.
|
||||||
|
typedef struct _SFireSettings SFireSettings;
|
||||||
|
typedef struct _SVCAN3Settings SVCAN3Settings;
|
||||||
|
typedef struct _SVCANRFSettings SVCANRFSettings;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool LoadDLLAPI(HINSTANCE &hAPIDLL);
|
bool LoadDLLAPI(HINSTANCE &hAPIDLL);
|
||||||
|
|||||||
@@ -1035,10 +1035,10 @@ int LegacyDLLExport icsneoGetDeviceSettingsType(void* hObject, EPlasmaIonVnetCha
|
|||||||
case NEODEVICE_ION:
|
case NEODEVICE_ION:
|
||||||
*pDeviceSettingsType = DeviceFire2SettingsType; //defaults to FIRE2 vnets with libicsneo - no firevnets!
|
*pDeviceSettingsType = DeviceFire2SettingsType; //defaults to FIRE2 vnets with libicsneo - no firevnets!
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_VCAN3:
|
case NEODEVICE_VCAN3_DEPRECATED:
|
||||||
*pDeviceSettingsType = DeviceVCAN3SettingsType;
|
*pDeviceSettingsType = DeviceVCAN3SettingsTypeDeprecated;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_FIRE:
|
case NEODEVICE_FIRE_DEPRECATED:
|
||||||
*pDeviceSettingsType = DeviceFireSettingsType;
|
*pDeviceSettingsType = DeviceFireSettingsType;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_FIRE2:
|
case NEODEVICE_FIRE2:
|
||||||
@@ -1061,17 +1061,17 @@ int LegacyDLLExport icsneoGetDeviceSettingsType(void* hObject, EPlasmaIonVnetCha
|
|||||||
case NEODEVICE_VIVIDCAN:
|
case NEODEVICE_VIVIDCAN:
|
||||||
*pDeviceSettingsType = DeviceVividCANSettingsType;
|
*pDeviceSettingsType = DeviceVividCANSettingsType;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_ECU_AVB:
|
case NEODEVICE_ECU_AVB_DEPRECATED:
|
||||||
*pDeviceSettingsType = DeviceECU_AVBSettingsType;
|
*pDeviceSettingsType = DeviceECU_AVBSettingsTypeDeprecated;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_RADSUPERMOON:
|
case NEODEVICE_RADSUPERMOON_DEPRECATED:
|
||||||
*pDeviceSettingsType = DeviceRADSuperMoonSettingsType;
|
*pDeviceSettingsType = DeviceRADSuperMoonSettingsTypeDeprecated;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_RADMOON2:
|
case NEODEVICE_RADMOON2:
|
||||||
*pDeviceSettingsType = DeviceRADMoon2SettingsType;
|
*pDeviceSettingsType = DeviceRADMoon2SettingsType;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_RADGIGALOG:
|
case NEODEVICE_RADGIGALOG_DEPRECATED:
|
||||||
*pDeviceSettingsType = DeviceRADGigalogSettingsType;
|
*pDeviceSettingsType = DeviceRADGigalogSettingsTypeDeprecated;
|
||||||
break;
|
break;
|
||||||
case NEODEVICE_RADMOON3:
|
case NEODEVICE_RADMOON3:
|
||||||
*pDeviceSettingsType = DeviceRADMoon3SettingsType;
|
*pDeviceSettingsType = DeviceRADMoon3SettingsType;
|
||||||
|
|||||||
@@ -114,3 +114,11 @@ PerfTest
|
|||||||
.. literalinclude:: ../../examples/c2/perf_test/src/main.c
|
.. literalinclude:: ../../examples/c2/perf_test/src/main.c
|
||||||
:language: c
|
:language: c
|
||||||
|
|
||||||
|
Termination Groups
|
||||||
|
==================
|
||||||
|
|
||||||
|
:download:`Download example <../../examples/c2/termination/src/main.c>`
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/c2/termination/src/main.c
|
||||||
|
:language: c
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ option(LIBICSNEO_BUILD_C2_DISKFORMAT_EXAMPLE "Build the C2 disk format example."
|
|||||||
option(LIBICSNEO_BUILD_C2_RECONNECT_EXAMPLE "Build the C2 reconnect example." ON)
|
option(LIBICSNEO_BUILD_C2_RECONNECT_EXAMPLE "Build the C2 reconnect example." ON)
|
||||||
option(LIBICSNEO_BUILD_C2_DEVICE_INFO_EXAMPLE "Build the C2 device info example." ON)
|
option(LIBICSNEO_BUILD_C2_DEVICE_INFO_EXAMPLE "Build the C2 device info example." ON)
|
||||||
option(LIBICSNEO_BUILD_C2_CHIP_VERSIONS_EXAMPLE "Build the C2 chip versions example." ON)
|
option(LIBICSNEO_BUILD_C2_CHIP_VERSIONS_EXAMPLE "Build the C2 chip versions example." ON)
|
||||||
|
option(LIBICSNEO_BUILD_C2_TERMINATION_EXAMPLE "Build the C2 termination groups example." ON)
|
||||||
option(LIBICSNEO_BUILD_C2_LIN_EXAMPLE "Build the C2 LIN example." ON)
|
option(LIBICSNEO_BUILD_C2_LIN_EXAMPLE "Build the C2 LIN example." ON)
|
||||||
option(LIBICSNEO_BUILD_C2_LIN_TRANSMIT_EXAMPLE "Build the C2 LIN transmit example." ON)
|
option(LIBICSNEO_BUILD_C2_LIN_TRANSMIT_EXAMPLE "Build the C2 LIN transmit example." ON)
|
||||||
option(LIBICSNEO_BUILD_C2_ETHERNET_TRANSMIT_EXAMPLE "Build the C2 ethernet transmit example." ON)
|
option(LIBICSNEO_BUILD_C2_ETHERNET_TRANSMIT_EXAMPLE "Build the C2 ethernet transmit example." ON)
|
||||||
@@ -78,6 +79,10 @@ if(LIBICSNEO_BUILD_C2_CHIP_VERSIONS_EXAMPLE)
|
|||||||
add_subdirectory(c2/chip_versions)
|
add_subdirectory(c2/chip_versions)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(LIBICSNEO_BUILD_C2_TERMINATION_EXAMPLE)
|
||||||
|
add_subdirectory(c2/termination)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(LIBICSNEO_BUILD_C2_LIN_EXAMPLE)
|
if(LIBICSNEO_BUILD_C2_LIN_EXAMPLE)
|
||||||
add_subdirectory(c2/lin)
|
add_subdirectory(c2/lin)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ int main() {
|
|||||||
msg1.Protocol = SPY_PROTOCOL_LIN;
|
msg1.Protocol = SPY_PROTOCOL_LIN;
|
||||||
msg1.StatusBitField = 0;
|
msg1.StatusBitField = 0;
|
||||||
msg1.StatusBitField2 = 0;
|
msg1.StatusBitField2 = 0;
|
||||||
lNetworkID = NETID_LIN_02;
|
lNetworkID = NETID_LIN2;
|
||||||
msg1.Header[0] = 0x11; //protected ID
|
msg1.Header[0] = 0x11; //protected ID
|
||||||
msg1.Header[1] = 0xaa;
|
msg1.Header[1] = 0xaa;
|
||||||
msg1.Header[2] = 0xbb;
|
msg1.Header[2] = 0xbb;
|
||||||
@@ -80,7 +80,7 @@ int main() {
|
|||||||
icsSpyMessageJ1850 msg2 = {0};
|
icsSpyMessageJ1850 msg2 = {0};
|
||||||
msg2.Protocol = SPY_PROTOCOL_LIN;
|
msg2.Protocol = SPY_PROTOCOL_LIN;
|
||||||
msg2.StatusBitField = SPY_STATUS_INIT_MESSAGE;
|
msg2.StatusBitField = SPY_STATUS_INIT_MESSAGE;
|
||||||
lNetworkID = NETID_LIN_01;
|
lNetworkID = NETID_LIN;
|
||||||
msg2.Header[0] = 0x11; //protected ID
|
msg2.Header[0] = 0x11; //protected ID
|
||||||
msg2.NumberBytesData = 0;
|
msg2.NumberBytesData = 0;
|
||||||
msg2.NumberBytesHeader = 1;
|
msg2.NumberBytesHeader = 1;
|
||||||
@@ -96,7 +96,7 @@ int main() {
|
|||||||
msg3.Protocol = SPY_PROTOCOL_LIN;
|
msg3.Protocol = SPY_PROTOCOL_LIN;
|
||||||
msg3.StatusBitField = SPY_STATUS_INIT_MESSAGE;
|
msg3.StatusBitField = SPY_STATUS_INIT_MESSAGE;
|
||||||
msg3.StatusBitField2 = 0;
|
msg3.StatusBitField2 = 0;
|
||||||
lNetworkID = NETID_LIN_01;
|
lNetworkID = NETID_LIN;
|
||||||
msg3.Header[0] = 0xe2; //protected ID
|
msg3.Header[0] = 0xe2; //protected ID
|
||||||
msg3.Header[1] = 0x44;
|
msg3.Header[1] = 0x44;
|
||||||
msg3.Header[2] = 0x33;
|
msg3.Header[2] = 0x33;
|
||||||
@@ -131,10 +131,10 @@ int main() {
|
|||||||
const icsSpyMessageJ1850* linMsg = (icsSpyMessageJ1850*)&rxMsg[idx];
|
const icsSpyMessageJ1850* linMsg = (icsSpyMessageJ1850*)&rxMsg[idx];
|
||||||
size_t frameLen = (linMsg->NumberBytesHeader + linMsg->NumberBytesData);
|
size_t frameLen = (linMsg->NumberBytesHeader + linMsg->NumberBytesData);
|
||||||
size_t dataLen = (frameLen > 2) ? (frameLen - 2) : 0;
|
size_t dataLen = (frameLen > 2) ? (frameLen - 2) : 0;
|
||||||
if(linMsg->NetworkID == NETID_LIN_01) {
|
if(linMsg->NetworkID == NETID_LIN) {
|
||||||
printf("LIN 1 | ID: 0x%02x [%zu] ", linMsg->Header[0], dataLen);
|
printf("LIN 1 | ID: 0x%02x [%zu] ", linMsg->Header[0], dataLen);
|
||||||
}
|
}
|
||||||
else if (linMsg->NetworkID == NETID_LIN_02) {
|
else if (linMsg->NetworkID == NETID_LIN2) {
|
||||||
printf("LIN 2 | ID: 0x%02x [%zu] ", linMsg->Header[0], dataLen);
|
printf("LIN 2 | ID: 0x%02x [%zu] ", linMsg->Header[0], dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
add_executable(libicsneoc2-termination-example src/main.c)
|
||||||
|
target_link_libraries(libicsneoc2-termination-example icsneoc2-static)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
target_compile_definitions(libicsneoc2-termination-example PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
|
endif()
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
#include <icsneo/icsneoc2.h>
|
||||||
|
#include <icsneo/icsneoc2messages.h>
|
||||||
|
#include <icsneo/icsneoc2settings.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int print_error_code(const char* message, icsneoc2_error_t error) {
|
||||||
|
char error_str[64];
|
||||||
|
size_t error_str_len = sizeof(error_str);
|
||||||
|
icsneoc2_error_t res = icsneoc2_error_code_get(error, error_str, &error_str_len);
|
||||||
|
if(res != icsneoc2_error_success) {
|
||||||
|
printf("%s: Failed to get string for error code %u with error code %u\n", message, error, res);
|
||||||
|
return (int)res;
|
||||||
|
}
|
||||||
|
printf("%s: \"%s\" (%u)\n", message, error_str, error);
|
||||||
|
return (int)error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
icsneoc2_error_t res;
|
||||||
|
|
||||||
|
icsneoc2_device_t* device = NULL;
|
||||||
|
res = icsneoc2_device_open_first(0, icsneoc2_open_options_default, &device);
|
||||||
|
if(res != icsneoc2_error_success) {
|
||||||
|
return print_error_code("Failed to open first device", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
char description[128] = {0};
|
||||||
|
size_t description_length = sizeof(description);
|
||||||
|
icsneoc2_device_description_get(device, description, &description_length);
|
||||||
|
printf("Opened device: %s\n\n", description);
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
icsneoc2_termination_group_t* groups = NULL;
|
||||||
|
res = icsneoc2_settings_termination_groups_enumerate(device, &groups, &count);
|
||||||
|
if(res != icsneoc2_error_success) {
|
||||||
|
print_error_code("Failed to enumerate termination groups", res);
|
||||||
|
icsneoc2_device_close(device);
|
||||||
|
icsneoc2_device_free(device);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(count == 0) {
|
||||||
|
printf("This device does not support software switchable termination.\n");
|
||||||
|
} else {
|
||||||
|
printf("Found %zu termination group(s) (only one network per group may be terminated at a time):\n", count);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t group_index = 0;
|
||||||
|
for(icsneoc2_termination_group_t* group = groups; group; group = icsneoc2_termination_group_next(group), group_index++) {
|
||||||
|
// First call with a NULL buffer to learn how many networks are in this group.
|
||||||
|
size_t network_count = 0;
|
||||||
|
icsneoc2_termination_group_networks_get(group, NULL, &network_count);
|
||||||
|
|
||||||
|
icsneoc2_netid_t* netids = (icsneoc2_netid_t*)malloc(network_count * sizeof(icsneoc2_netid_t));
|
||||||
|
if(!netids) {
|
||||||
|
print_error_code("Out of memory", icsneoc2_error_out_of_memory);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second call to fill the buffer.
|
||||||
|
res = icsneoc2_termination_group_networks_get(group, netids, &network_count);
|
||||||
|
if(res != icsneoc2_error_success) {
|
||||||
|
print_error_code("Failed to get termination group networks", res);
|
||||||
|
free(netids);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" Group %zu:", group_index);
|
||||||
|
for(size_t i = 0; i < network_count; i++) {
|
||||||
|
char name[64] = {0};
|
||||||
|
size_t name_length = sizeof(name);
|
||||||
|
if(icsneoc2_netid_name_get(netids[i], name, &name_length) == icsneoc2_error_success) {
|
||||||
|
printf(" %s", name);
|
||||||
|
} else {
|
||||||
|
printf(" %u", netids[i]);
|
||||||
|
}
|
||||||
|
if(i + 1 < network_count) {
|
||||||
|
printf(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
free(netids);
|
||||||
|
}
|
||||||
|
|
||||||
|
icsneoc2_settings_termination_groups_free(groups);
|
||||||
|
icsneoc2_device_close(device);
|
||||||
|
icsneoc2_device_free(device);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// COPYRIGHT INTREPID CONTROL SYSTEMS, INC. (c) 1994-20xx
|
||||||
|
// Confidential and proprietary. This document and its contents are the
|
||||||
|
// property of Intrepid Control Systems, Inc. It is not to be copied,
|
||||||
|
// distributed, or otherwise disclosed or used without the prior written
|
||||||
|
// consent of Intrepid Control Systems Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// SPY Status Bit Definitions
|
||||||
|
// Generated automatically - DO NOT MODIFY
|
||||||
|
// Modify cicsSpyStatusBits_config.yml and run cicsSpyStatusBits_gen.py
|
||||||
|
// Generated on: 2025-07-14 14:31:40
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CICSSPYSTATUSBITS_H_
|
||||||
|
#define CICSSPYSTATUSBITS_H_ 1
|
||||||
|
|
||||||
|
// WARNING: The following bit conflicts were detected:
|
||||||
|
// spystatus value 0x10000000: // VSI value 'SPY_STATUS_VSI_IFR_CRC_BIT' conflicts with common value 'SPY_STATUS_PDU'
|
||||||
|
// spystatus value 0x10000000: // A2B value 'SPY_STATUS_A2B_CONTROL' conflicts with common value 'SPY_STATUS_PDU'
|
||||||
|
// spystatus value 0x08: // A2B value 'SPY_STATUS_A2B_SCF_VALID_WAITING' conflicts with common value 'SPY_STATUS_REMOTE_FRAME'
|
||||||
|
// spystatus value 0x40000000: // A2B value 'SPY_STATUS_A2B_UPSTREAM' conflicts with common value 'SPY_STATUS_HIGH_SPEED'
|
||||||
|
// spystatus value 0x10000000: // FLEXRAY value 'SPY_STATUS_FLEXRAY_PDU' conflicts with common value 'SPY_STATUS_PDU'
|
||||||
|
// spystatus value 0x40000000: // FLEXRAY value 'SPY_STATUS_FLEXRAY_PDU_UPDATE_BIT_SET' conflicts with common value 'SPY_STATUS_HIGH_SPEED'
|
||||||
|
// spystatus value 0x08: // FLEXRAY value 'SPY_STATUS_FLEXRAY_PDU_NO_UPDATE_BIT' conflicts with common value 'SPY_STATUS_REMOTE_FRAME'
|
||||||
|
|
||||||
|
|
||||||
|
// Glyph definitions
|
||||||
|
// '|' - byte divider
|
||||||
|
// '.' - nibble divider
|
||||||
|
// '-' - unused bit
|
||||||
|
// 'o' - common bit
|
||||||
|
// 'x' - protocol specific bit
|
||||||
|
// '!' - conflict bit
|
||||||
|
|
||||||
|
// SPYSTATUS bit definitions
|
||||||
|
// SPYSTATUS - Common bits
|
||||||
|
// |oo-o.oooo|oooo.oooo|oooo.oo-o|oo-o.oooo|
|
||||||
|
#define SPY_STATUS_GLOBAL_ERR 0x01 // Global error flag
|
||||||
|
#define SPY_STATUS_TX_MSG 0x02 // Transmitted message
|
||||||
|
#define SPY_STATUS_XTD_FRAME 0x04 // Extended frame
|
||||||
|
#define SPY_STATUS_REMOTE_FRAME 0x08 // Remote frame
|
||||||
|
#define SPY_STATUS_CRC_ERROR 0x10 // CRC error
|
||||||
|
#define SPY_STATUS_INCOMPLETE_FRAME 0x40 // Incomplete frame
|
||||||
|
#define SPY_STATUS_LOST_ARBITRATION 0x80 // Lost arbitration
|
||||||
|
#define SPY_STATUS_UNDEFINED_ERROR 0x0100 // Undefined error
|
||||||
|
#define SPY_STATUS_BUS_RECOVERED 0x0400 // Bus recovered
|
||||||
|
#define SPY_STATUS_BUS_SHORTED_PLUS 0x0800 // Bus shorted to plus
|
||||||
|
#define SPY_STATUS_BUS_SHORTED_GND 0x1000 // Bus shorted to ground
|
||||||
|
#define SPY_STATUS_CHECKSUM_ERROR 0x2000 // Checksum error
|
||||||
|
#define SPY_STATUS_BAD_MESSAGE_BIT_TIME_ERROR 0x4000 // Bad message bit time error
|
||||||
|
#define SPY_STATUS_TX_NOMATCH 0x8000 // TX no match
|
||||||
|
#define SPY_STATUS_COMM_IN_OVERFLOW 0x010000 // Communication input overflow
|
||||||
|
#define SPY_STATUS_EXPECTED_LEN_MISMATCH 0x020000 // Expected length mismatch
|
||||||
|
#define SPY_STATUS_MSG_NO_MATCH 0x040000 // Message no match
|
||||||
|
#define SPY_STATUS_BREAK 0x080000 // Break detected
|
||||||
|
#define SPY_STATUS_AVSI_REC_OVERFLOW 0x100000 // AVSI record overflow
|
||||||
|
#define SPY_STATUS_TEST_TRIGGER 0x200000 // Test trigger
|
||||||
|
#define SPY_STATUS_AUDIO_COMMENT 0x400000 // Audio comment
|
||||||
|
#define SPY_STATUS_GPS_DATA 0x800000 // GPS data
|
||||||
|
#define SPY_STATUS_ANALOG_DIGITAL_INPUT 0x01000000 // Analog digital input
|
||||||
|
#define SPY_STATUS_TEXT_COMMENT 0x02000000 // Text comment
|
||||||
|
#define SPY_STATUS_NETWORK_MESSAGE_TYPE 0x04000000 // Network message type
|
||||||
|
#define SPY_STATUS_VSI_TX_UNDERRUN 0x08000000 // VSI TX underrun
|
||||||
|
#define SPY_STATUS_PDU 0x10000000 // PDU message
|
||||||
|
#define SPY_STATUS_HIGH_SPEED 0x40000000 // High speed
|
||||||
|
#define SPY_STATUS_EXTENDED 0x80000000 // Extended - if this bit is set than decode StatusBitField3 in AckBytes
|
||||||
|
|
||||||
|
// SPYSTATUS - A2B protocol bits
|
||||||
|
// |o!x!.oooo|oooo.oooo|oooo.oo-o|oo-o.!ooo|
|
||||||
|
#define SPY_STATUS_A2B_SCF_VALID_WAITING 0x08 // A2B SCF valid waiting
|
||||||
|
#define SPY_STATUS_A2B_CONTROL 0x10000000 // A2B control message
|
||||||
|
#define SPY_STATUS_A2B_MONITOR 0x20000000 // A2B monitor message
|
||||||
|
#define SPY_STATUS_A2B_UPSTREAM 0x40000000 // A2B upstream message
|
||||||
|
|
||||||
|
// SPYSTATUS - CAN protocol bits
|
||||||
|
// |ooxo.oooo|oooo.oooo|oooo.ooxo|ooxo.oooo|
|
||||||
|
#define SPY_STATUS_CAN_ERROR_PASSIVE 0x20 // CAN error passive state
|
||||||
|
#define SPY_STATUS_CAN_BUS_OFF 0x0200 // CAN bus off state
|
||||||
|
#define SPY_STATUS_CANFD 0x20000000 // CAN FD frame
|
||||||
|
|
||||||
|
// SPYSTATUS - ETHERNET protocol bits
|
||||||
|
// |oo-o.oooo|oooo.oooo|oooo.oo-o|ooxo.oooo|
|
||||||
|
#define SPY_STATUS_HEADERCRC_ERROR 0x20 // Header CRC error
|
||||||
|
|
||||||
|
// SPYSTATUS - FLEXRAY protocol bits
|
||||||
|
// |o!-!.oooo|oooo.oooo|oooo.oo-o|oo-o.!ooo|
|
||||||
|
#define SPY_STATUS_FLEXRAY_PDU_NO_UPDATE_BIT 0x08 // FlexRay PDU no update bit
|
||||||
|
#define SPY_STATUS_FLEXRAY_PDU 0x10000000 // FlexRay PDU (alias for SPY_STATUS_PDU)
|
||||||
|
#define SPY_STATUS_FLEXRAY_PDU_UPDATE_BIT_SET 0x40000000 // FlexRay PDU update bit set
|
||||||
|
|
||||||
|
// SPYSTATUS - LIN protocol bits
|
||||||
|
// |ooxo.oooo|oooo.oooo|oooo.oo-o|oo-o.oooo|
|
||||||
|
#define SPY_STATUS_LIN_MASTER 0x20000000 // LIN master message
|
||||||
|
|
||||||
|
// SPYSTATUS - VSI protocol bits
|
||||||
|
// |oox!.oooo|oooo.oooo|oooo.oo-o|oo-o.oooo|
|
||||||
|
#define SPY_STATUS_VSI_IFR_CRC_BIT 0x10000000 // VSI IFR CRC bit
|
||||||
|
#define SPY_STATUS_INIT_MESSAGE 0x20000000 // Initialization message
|
||||||
|
|
||||||
|
|
||||||
|
// SPYSTATUS2 bit definitions
|
||||||
|
// SPYSTATUS2 - Common bits
|
||||||
|
// |----.----|---o.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_HAS_VALUE 0x01
|
||||||
|
#define SPY_STATUS2_VALUE_IS_BOOLEAN 0x02
|
||||||
|
#define SPY_STATUS2_HIGH_VOLTAGE 0x04
|
||||||
|
#define SPY_STATUS2_LONG_MESSAGE 0x08
|
||||||
|
#define SPY_STATUS2_GLOBAL_CHANGE 0x010000
|
||||||
|
#define SPY_STATUS2_ERROR_FRAME 0x020000
|
||||||
|
#define SPY_STATUS2_END_OF_LONG_MESSAGE 0x100000
|
||||||
|
|
||||||
|
// SPYSTATUS2 - CAN protocol bits
|
||||||
|
// |----.----|-xxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_CAN_ISO15765_LOGICAL_FRAME 0x200000
|
||||||
|
#define SPY_STATUS2_CAN_HAVE_LINK_DATA 0x400000
|
||||||
|
|
||||||
|
// SPYSTATUS2 - ETHERNET protocol bits
|
||||||
|
// |xxxx.xxxx|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_ETHERNET_CRC_ERROR 0x200000
|
||||||
|
#define SPY_STATUS2_ETHERNET_FRAME_TOO_SHORT 0x400000
|
||||||
|
#define SPY_STATUS2_ETHERNET_FCS_AVAILABLE 0x800000 // This frame contains FCS (4 bytes) obtained from ICS Ethernet hardware (ex. RAD-STAR)
|
||||||
|
#define SPY_STATUS2_ETHERNET_NO_PADDING 0x01000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_PREEMPTION_ENABLED 0x02000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_UPDATE_CHECKSUMS 0x04000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_MANUALFCS_ENABLED 0x08000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_FCS_VERIFIED 0x10000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_T1S_SYMBOL 0x20000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_T1S_BURST 0x40000000
|
||||||
|
#define SPY_STATUS2_ETHERNET_T1S_ETHERNET 0x80000000
|
||||||
|
|
||||||
|
// SPYSTATUS2 - FLEXRAY protocol bits
|
||||||
|
// |----.-xxx|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_FLEXRAY_TX_AB 0x200000
|
||||||
|
#define SPY_STATUS2_FLEXRAY_TX_AB_NO_A 0x400000
|
||||||
|
#define SPY_STATUS2_FLEXRAY_TX_AB_NO_B 0x800000
|
||||||
|
#define SPY_STATUS2_FLEXRAY_TX_AB_NO_MATCH 0x01000000
|
||||||
|
#define SPY_STATUS2_FLEXRAY_NO_CRC 0x02000000
|
||||||
|
#define SPY_STATUS2_FLEXRAY_NO_HEADERCRC 0x04000000 //
|
||||||
|
|
||||||
|
// SPYSTATUS2 - I2C protocol bits
|
||||||
|
// |----.----|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_I2C_ERR_TIMEOUT 0x200000
|
||||||
|
#define SPY_STATUS2_I2C_ERR_NACK 0x400000
|
||||||
|
#define SPY_STATUS2_I2C_DIR_READ 0x800000
|
||||||
|
|
||||||
|
// SPYSTATUS2 - ISO protocol bits
|
||||||
|
// |-xxx.x---|---o.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_ISO_FRAME_ERROR 0x08000000 // ISO frame error
|
||||||
|
#define SPY_STATUS2_ISO_OVERFLOW_ERROR 0x10000000 // ISO overflow error
|
||||||
|
#define SPY_STATUS2_ISO_PARITY_ERROR 0x20000000 // ISO parity error
|
||||||
|
#define SPY_STATUS2_ISO_RX_TIMEOUT_ERROR 0x40000000 // ISO specific timeout error
|
||||||
|
|
||||||
|
// SPYSTATUS2 - LIN protocol bits
|
||||||
|
// |xxxx.xxxx|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_LIN_ERR_RX_BREAK_NOT_0 0x200000 // LIN RX break not 0 error
|
||||||
|
#define SPY_STATUS2_LIN_ERR_RX_BREAK_TOO_SHORT 0x400000 // LIN RX break too short error
|
||||||
|
#define SPY_STATUS2_LIN_ERR_RX_SYNC_NOT_55 0x800000 // LIN RX sync not 0x55 error
|
||||||
|
#define SPY_STATUS2_LIN_ERR_RX_DATA_GREATER_8 0x01000000 // LIN RX data greater than 8 bytes error
|
||||||
|
#define SPY_STATUS2_LIN_ERR_TX_RX_MISMATCH 0x02000000 // LIN TX/RX mismatch error
|
||||||
|
#define SPY_STATUS2_LIN_ERR_MSG_ID_PARITY 0x04000000 // LIN message ID parity error
|
||||||
|
#define SPY_STATUS2_LIN_SYNC_FRAME_ERROR 0x08000000 // LIN sync frame error
|
||||||
|
#define SPY_STATUS2_LIN_ID_FRAME_ERROR 0x10000000 // LIN ID frame error
|
||||||
|
#define SPY_STATUS2_LIN_SLAVE_BYTE_ERROR 0x20000000 // LIN slave byte error
|
||||||
|
#define SPY_STATUS2_LIN_RX_TIMEOUT_ERROR 0x40000000 // RX timeout error
|
||||||
|
#define SPY_STATUS2_LIN_NO_SLAVE_DATA 0x80000000 // LIN no slave data
|
||||||
|
|
||||||
|
// SPYSTATUS2 - MDIO protocol bits
|
||||||
|
// |-xxx.xxxx|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_MDIO_ERR_TIMEOUT 0x200000
|
||||||
|
#define SPY_STATUS2_MDIO_JOB_CANCELLED 0x400000
|
||||||
|
#define SPY_STATUS2_MDIO_INVALID_BUS 0x800000
|
||||||
|
#define SPY_STATUS2_MDIO_INVALID_PHYADDR 0x01000000
|
||||||
|
#define SPY_STATUS2_MDIO_INVALID_REGADDR 0x02000000
|
||||||
|
#define SPY_STATUS2_MDIO_UNSUPPORTED_CLAUSE 0x04000000
|
||||||
|
#define SPY_STATUS2_MDIO_UNSUPPORTED_OPCODE 0x08000000
|
||||||
|
#define SPY_STATUS2_MDIO_OVERFLOW 0x10000000
|
||||||
|
#define SPY_STATUS2_MDIO_CLAUSE45 0x20000000
|
||||||
|
#define SPY_STATUS2_MDIO_READ 0x40000000
|
||||||
|
|
||||||
|
// SPYSTATUS2 - MOST protocol bits
|
||||||
|
// |xxxx.xxxx|xxxo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_MOST_PACKET_DATA 0x200000
|
||||||
|
#define SPY_STATUS2_MOST_STATUS 0x400000 // reflects changes in light/lock/MPR/SBC/etc...
|
||||||
|
#define SPY_STATUS2_MOST_LOW_LEVEL 0x800000 // MOST low level message, allocs, deallocs, remote requests...*/
|
||||||
|
#define SPY_STATUS2_MOST_CONTROL_DATA 0x01000000
|
||||||
|
#define SPY_STATUS2_MOST_MHP_USER_DATA 0x02000000 // MOST HIGH User Data Frame
|
||||||
|
#define SPY_STATUS2_MOST_MHP_CONTROL_DATA 0x04000000 // MOST HIGH Control Data
|
||||||
|
#define SPY_STATUS2_MOST_I2S_DUMP 0x08000000
|
||||||
|
#define SPY_STATUS2_MOST_TOO_SHORT 0x10000000
|
||||||
|
#define SPY_STATUS2_MOST_MOST50 0x20000000 // absence of MOST50 and MOST150 implies it's MOST25
|
||||||
|
#define SPY_STATUS2_MOST_MOST150 0x40000000
|
||||||
|
#define SPY_STATUS2_MOST_CHANGED_PAR 0x80000000 // first byte in ack reflects what changed.
|
||||||
|
|
||||||
|
// SPYSTATUS2 - WBMS protocol bits
|
||||||
|
// |----.----|--xo.--oo|----.----|----.oooo|
|
||||||
|
#define SPY_STATUS2_WBMS_API_IS_CALLBACK 0x200000
|
||||||
|
|
||||||
|
|
||||||
|
// SPYSTATUS3 bit definitions
|
||||||
|
// SPYSTATUS3 - CAN protocol bits
|
||||||
|
// |----.----|-xxx.xxxx|-xxx.xxxx|----.-xxx|
|
||||||
|
#define SPY_STATUS3_CAN_ERR_PASSIVE 0x01 // CAN error passive state: typically when error counter is > 127
|
||||||
|
#define SPY_STATUS3_CAN_BUS_OFF 0x02 // CAN bus off state
|
||||||
|
#define SPY_STATUS3_CAN_ERR_WARNING 0x04 // CAN error warning: typically when error counter is > 96
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_STUFF_ERROR 0x0100 // CAN stuff error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_FORM_ERROR 0x0200 // CAN form error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_ACK_ERROR 0x0400 // CAN ack error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_BIT1_ERROR 0x0800 // CAN bit1 error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_BIT0_ERROR 0x1000 // CAN bit0 error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_CRC_ERROR 0x2000 // CAN CRC error during the data payload phase
|
||||||
|
#define SPY_STATUS3_CAN_DATAERR_NOCHANGE 0x4000 // CAN data error occurred before and no change yet
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_STUFF_ERROR 0x010000 // CAN stuff error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_FORM_ERROR 0x020000 // CAN form error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_ACK_ERROR 0x040000 // CAN ack error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_BIT1_ERROR 0x080000 // CAN bit1 error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_BIT0_ERROR 0x100000 // CAN bit0 error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_CRC_ERROR 0x200000 // CAN CRC error at the general frame level
|
||||||
|
#define SPY_STATUS3_CAN_GENERR_NOCHANGE 0x400000 // CAN frame Error occurred before and no change yet
|
||||||
|
|
||||||
|
// SPYSTATUS3 - CANFD protocol bits
|
||||||
|
// |----.----|----.----|----.----|---x.xxxx|
|
||||||
|
#define SPY_STATUS3_CANFD_ESI 0x01 // CAN FD Error State Indicator (ESI) reflects the error state of the transmitting node
|
||||||
|
#define SPY_STATUS3_CANFD_IDE 0x02 // CAN FD Identifier Extension (IDE) indicates if standard or extended IDs are in use
|
||||||
|
#define SPY_STATUS3_CANFD_RTR 0x04
|
||||||
|
#define SPY_STATUS3_CANFD_FDF 0x08 // CAN FD Format (FDF) flag -- distinguishes classic CAN from CANFD
|
||||||
|
#define SPY_STATUS3_CANFD_BRS 0x10 // CANFD Baud Rate Select (BRS) flag, indicates if the data portion transmits at a higher bitrate
|
||||||
|
|
||||||
|
// SPYSTATUS3 - ETHERNET protocol bits
|
||||||
|
// |----.----|----.----|----.----|----.--xx|
|
||||||
|
#define SPY_STATUS3_ETHERNET_TX_COLLISION 0x01
|
||||||
|
#define SPY_STATUS3_ETHERNET_T1S_WAKE 0x02
|
||||||
|
|
||||||
|
// SPYSTATUS3 - LIN protocol bits
|
||||||
|
// |----.----|----.----|----.----|----.-xxx|
|
||||||
|
#define SPY_STATUS3_LIN_JUST_BREAK_SYNC 0x01
|
||||||
|
#define SPY_STATUS3_LIN_SLAVE_DATA_TOO_SHORT 0x02
|
||||||
|
#define SPY_STATUS3_LIN_ONLY_UPDATE_SLAVE_TABLE_ONCE 0x04
|
||||||
|
|
||||||
|
|
||||||
|
// SPYSTATUS4 bit definitions
|
||||||
|
// SPYSTATUS4 - ETHERNET protocol bits
|
||||||
|
// |----.----|----.----|----.----|----.--xx|
|
||||||
|
#define SPY_STATUS4_ETH_CRC_ERROR 0x01 // Ethernet CRC error
|
||||||
|
#define SPY_STATUS4_ETH_FRAME_TOO_LONG 0x02 // Ethernet frame too long
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CICSSPYSTATUSBITS_H_
|
||||||
@@ -6,6 +6,22 @@
|
|||||||
namespace icsneo {
|
namespace icsneo {
|
||||||
|
|
||||||
enum class Command : uint8_t {
|
enum class Command : uint8_t {
|
||||||
|
// Device-originated Main51 event/error notifications (device -> host)
|
||||||
|
Main51RxBufferOverflow = 0x01,
|
||||||
|
Main51StartCmd = 0x02,
|
||||||
|
Main51TxFifoOverflow = 0x03,
|
||||||
|
Main51BulkInNoData = 0x04,
|
||||||
|
Main51SetModeComplete = 0x05,
|
||||||
|
Main51ReadEeprom = 0x06,
|
||||||
|
// 0x07, 0x08, 0x09 reserved for host->device commands below
|
||||||
|
Main51CmdDone = 0x0A,
|
||||||
|
Main51ErrStatus = 0x0B,
|
||||||
|
Main51ReadSectorBuff = 0x0C,
|
||||||
|
Main51WriteSectorBuff = 0x0D,
|
||||||
|
Main51MmcProcessDone = 0x0E,
|
||||||
|
Main51ReInitDone = 0x0F,
|
||||||
|
|
||||||
|
// Host-originated commands (host -> device)
|
||||||
EnableNetworkCommunication = 0x07,
|
EnableNetworkCommunication = 0x07,
|
||||||
EnableNetworkCommunicationEx = 0x08,
|
EnableNetworkCommunicationEx = 0x08,
|
||||||
KeepAlive = 0x09,
|
KeepAlive = 0x09,
|
||||||
|
|||||||
+1511
-1677
File diff suppressed because it is too large
Load Diff
@@ -140,7 +140,61 @@ icsneoc2_error_t icsneoc2_settings_termination_is_enabled(icsneoc2_device_t* dev
|
|||||||
*/
|
*/
|
||||||
icsneoc2_error_t icsneoc2_settings_termination_set(icsneoc2_device_t* device, icsneoc2_netid_t netid, bool enable);
|
icsneoc2_error_t icsneoc2_settings_termination_set(icsneoc2_device_t* device, icsneoc2_netid_t netid, bool enable);
|
||||||
|
|
||||||
// TODO: getTerminationGroups
|
/**
|
||||||
|
* Enumerate the termination groups for a device.
|
||||||
|
*
|
||||||
|
* Some devices have groupings of networks where software switchable termination
|
||||||
|
* can only be applied to one network in the group at a time. This enumerates
|
||||||
|
* those groups. Use icsneoc2_termination_group_next() to walk the list and
|
||||||
|
* icsneoc2_termination_group_networks_get() to read each group's networks.
|
||||||
|
*
|
||||||
|
* These groups apply to the CAN termination controlled by the
|
||||||
|
* icsneoc2_settings_termination_* functions. 10BASE-T1S termination
|
||||||
|
* (icsneoc2_settings_t1s_*) is per-network and is never grouped.
|
||||||
|
*
|
||||||
|
* If the device does not support software switchable termination, the list is
|
||||||
|
* empty (*groups is set to NULL and *count, if provided, is set to 0).
|
||||||
|
*
|
||||||
|
* @param[in] device The device to query.
|
||||||
|
* @param[out] groups Receives a newly allocated termination group handle, or NULL if there are no groups. The caller owns this handle and must free it with icsneoc2_settings_termination_groups_free() when done.
|
||||||
|
* @param[out] count Receives the number of termination groups. May be NULL if not needed.
|
||||||
|
*
|
||||||
|
* @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters or icsneoc2_error_out_of_memory otherwise.
|
||||||
|
*/
|
||||||
|
icsneoc2_error_t icsneoc2_settings_termination_groups_enumerate(icsneoc2_device_t* device, icsneoc2_termination_group_t** groups, size_t* count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advance to the next termination group in an enumeration list.
|
||||||
|
*
|
||||||
|
* @param[in] group The current termination group handle.
|
||||||
|
*
|
||||||
|
* @return The next termination group handle, or NULL at the end of the list.
|
||||||
|
*/
|
||||||
|
icsneoc2_termination_group_t* icsneoc2_termination_group_next(const icsneoc2_termination_group_t* group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the networks belonging to a termination group.
|
||||||
|
*
|
||||||
|
* Call with networks set to NULL to query the number of networks in the group;
|
||||||
|
* *count will be set to the required size. Then call again with a buffer of at
|
||||||
|
* least that size. On success *count is updated with the number of netids written.
|
||||||
|
*
|
||||||
|
* @param[in] group The termination group handle to query.
|
||||||
|
* @param[out] networks Pointer to a buffer to copy the group's netids into. May be NULL to query the required size.
|
||||||
|
* @param[in,out] count On input, the capacity of the networks buffer. On output, the number of netids written (or required, if networks is NULL).
|
||||||
|
*
|
||||||
|
* @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters otherwise.
|
||||||
|
*/
|
||||||
|
icsneoc2_error_t icsneoc2_termination_group_networks_get(const icsneoc2_termination_group_t* group, icsneoc2_netid_t* networks, size_t* count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a termination group list returned by icsneoc2_settings_termination_groups_enumerate().
|
||||||
|
*
|
||||||
|
* @param[in] groups The termination group handle to free. Passing NULL returns icsneoc2_error_invalid_parameters.
|
||||||
|
*
|
||||||
|
* @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters otherwise.
|
||||||
|
*/
|
||||||
|
icsneoc2_error_t icsneoc2_settings_termination_groups_free(icsneoc2_termination_group_t* groups);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the commander resistor is currently enabled for a network.
|
* Check if the commander resistor is currently enabled for a network.
|
||||||
|
|||||||
@@ -546,6 +546,8 @@ typedef uint8_t icsneoc2_tc10_sleep_status_t;
|
|||||||
|
|
||||||
typedef struct icsneoc2_chip_versions_t icsneoc2_chip_versions_t;
|
typedef struct icsneoc2_chip_versions_t icsneoc2_chip_versions_t;
|
||||||
|
|
||||||
|
typedef struct icsneoc2_termination_group_t icsneoc2_termination_group_t;
|
||||||
|
|
||||||
typedef enum _icsneoc2_chip_id_t {
|
typedef enum _icsneoc2_chip_id_t {
|
||||||
icsneoc2_chip_id_neovifire_mchip = 0,
|
icsneoc2_chip_id_neovifire_mchip = 0,
|
||||||
icsneoc2_chip_id_neovifire_lchip = 1,
|
icsneoc2_chip_id_neovifire_lchip = 1,
|
||||||
|
|||||||
@@ -9,6 +9,27 @@
|
|||||||
typedef uint8_t byte; // Typedef helper for the following include
|
typedef uint8_t byte; // Typedef helper for the following include
|
||||||
#include "icsneo/icsnVC40.h" // Definitions for structs
|
#include "icsneo/icsnVC40.h" // Definitions for structs
|
||||||
|
|
||||||
|
// Vehicle Spy 3.26.3.9 removed these legacy settings structure definitions from
|
||||||
|
// icsnVC40.h. The corresponding functions only ever treat them as opaque
|
||||||
|
// buffers, so forward declarations keep the existing API/ABI intact.
|
||||||
|
typedef struct _SFireSettings SFireSettings;
|
||||||
|
typedef struct _SVCAN3Settings SVCAN3Settings;
|
||||||
|
typedef struct _SVCANRFSettings SVCANRFSettings;
|
||||||
|
|
||||||
|
// Vehicle Spy 3.26.3.9 moved icsSpyTime out of icsnVC40.h; icsneoGetRTC and
|
||||||
|
// icsneoSetRTC access its members, so the definition (identical layout, 6
|
||||||
|
// bytes) is carried here.
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t sec; // --- Seconds (00-59)
|
||||||
|
uint8_t min; // --- (00-59)
|
||||||
|
uint8_t hour; // --- (00-23)
|
||||||
|
uint8_t day; // --- (01-31)
|
||||||
|
uint8_t month; // --- (01-12)
|
||||||
|
uint8_t year; // --- (00-99)
|
||||||
|
} icsSpyTime;
|
||||||
|
#define icsSpyTime_SIZE 6
|
||||||
|
|
||||||
// From coremini.h
|
// From coremini.h
|
||||||
#define MAX_BIT_SMASH_ARBIDS (4)
|
#define MAX_BIT_SMASH_ARBIDS (4)
|
||||||
#define BIT_SMASH_OPTION_EXTENDED (1)
|
#define BIT_SMASH_OPTION_EXTENDED (1)
|
||||||
|
|||||||
@@ -261,6 +261,13 @@ TEST(icsneoc2, test_icsneoc2_error_invalid_parameters_and_invalid_device)
|
|||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_can_enable(NULL, 0, &placeholderBool));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_can_enable(NULL, 0, &placeholderBool));
|
||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_is_enabled(NULL, 0, &placeholderBool));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_is_enabled(NULL, 0, &placeholderBool));
|
||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_set(NULL, 0, false));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_set(NULL, 0, false));
|
||||||
|
{
|
||||||
|
icsneoc2_termination_group_t* placeholderGroups = nullptr;
|
||||||
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_groups_enumerate(NULL, &placeholderGroups, &placeholderSizeT));
|
||||||
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_termination_group_networks_get(NULL, NULL, &placeholderSizeT));
|
||||||
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_groups_free(NULL));
|
||||||
|
ASSERT_EQ(nullptr, icsneoc2_termination_group_next(NULL));
|
||||||
|
}
|
||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_commander_resistor_enabled(NULL, 0, &placeholderBool));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_commander_resistor_enabled(NULL, 0, &placeholderBool));
|
||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_commander_resistor_set(NULL, 0, false));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_commander_resistor_set(NULL, 0, false));
|
||||||
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_lin_mode_get(NULL, 0, &placeholderLinMode));
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_lin_mode_get(NULL, 0, &placeholderLinMode));
|
||||||
@@ -1143,6 +1150,64 @@ TEST(icsneoc2, test_icsneoc2_chip_versions_free_list)
|
|||||||
ASSERT_EQ(icsneoc2_error_success, icsneoc2_chip_versions_free(head));
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_chip_versions_free(head));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(icsneoc2, test_icsneoc2_termination_group_walk_and_networks)
|
||||||
|
{
|
||||||
|
// Build an in-memory list of two termination groups:
|
||||||
|
// group A: { DWCAN_01, DWCAN_02 }
|
||||||
|
// group B: { DWCAN_03 }
|
||||||
|
icsneoc2_termination_group_t second{};
|
||||||
|
second.netids = { icsneoc2_netid_dwcan_03 };
|
||||||
|
second.next = nullptr;
|
||||||
|
|
||||||
|
icsneoc2_termination_group_t first{};
|
||||||
|
first.netids = { icsneoc2_netid_dwcan_01, icsneoc2_netid_dwcan_02 };
|
||||||
|
first.next = &second;
|
||||||
|
|
||||||
|
// next() walks the list
|
||||||
|
ASSERT_EQ(&second, icsneoc2_termination_group_next(&first));
|
||||||
|
ASSERT_EQ(nullptr, icsneoc2_termination_group_next(&second));
|
||||||
|
|
||||||
|
// networks_get with NULL buffer reports the required count
|
||||||
|
size_t count = 0;
|
||||||
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_termination_group_networks_get(&first, NULL, &count));
|
||||||
|
ASSERT_EQ(count, 2u);
|
||||||
|
|
||||||
|
// networks_get fills the buffer and updates count
|
||||||
|
icsneoc2_netid_t netids[2] = {0, 0};
|
||||||
|
count = 2;
|
||||||
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_termination_group_networks_get(&first, netids, &count));
|
||||||
|
ASSERT_EQ(count, 2u);
|
||||||
|
ASSERT_EQ(netids[0], icsneoc2_netid_dwcan_01);
|
||||||
|
ASSERT_EQ(netids[1], icsneoc2_netid_dwcan_02);
|
||||||
|
|
||||||
|
// second group has a single network
|
||||||
|
count = 0;
|
||||||
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_termination_group_networks_get(&second, NULL, &count));
|
||||||
|
ASSERT_EQ(count, 1u);
|
||||||
|
|
||||||
|
// a buffer smaller than the group truncates to capacity
|
||||||
|
icsneoc2_netid_t one[1] = {0};
|
||||||
|
count = 1;
|
||||||
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_termination_group_networks_get(&first, one, &count));
|
||||||
|
ASSERT_EQ(count, 1u);
|
||||||
|
ASSERT_EQ(one[0], icsneoc2_netid_dwcan_01);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(icsneoc2, test_icsneoc2_termination_groups_free_list)
|
||||||
|
{
|
||||||
|
// Allocate a two-node list the same way the API does, so free() walks and deletes it.
|
||||||
|
auto* head = new icsneoc2_termination_group_t{};
|
||||||
|
head->netids = { icsneoc2_netid_dwcan_01 };
|
||||||
|
head->next = new icsneoc2_termination_group_t{};
|
||||||
|
head->next->netids = { icsneoc2_netid_dwcan_02 };
|
||||||
|
head->next->next = nullptr;
|
||||||
|
|
||||||
|
ASSERT_EQ(icsneoc2_error_success, icsneoc2_settings_termination_groups_free(head));
|
||||||
|
|
||||||
|
// Freeing an empty (NULL) list returns invalid_parameters, matching chip_versions_free.
|
||||||
|
ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_settings_termination_groups_free(nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(icsneoc2, test_icsneoc2_open_options_default)
|
TEST(icsneoc2, test_icsneoc2_open_options_default)
|
||||||
{
|
{
|
||||||
icsneoc2_open_options_t expected = ICSNEOC2_OPEN_OPTIONS_GO_ONLINE | ICSNEOC2_OPEN_OPTIONS_SYNC_RTC | ICSNEOC2_OPEN_OPTIONS_ENABLE_AUTO_UPDATE;
|
icsneoc2_open_options_t expected = ICSNEOC2_OPEN_OPTIONS_GO_ONLINE | ICSNEOC2_OPEN_OPTIONS_SYNC_RTC | ICSNEOC2_OPEN_OPTIONS_ENABLE_AUTO_UPDATE;
|
||||||
|
|||||||
Reference in New Issue
Block a user