C API

Functions

void DLLExport icsneo_findAllDevices (neodevice_t *devices, size_t *count)

Find Intrepid hardware connected via USB and Ethernet.

For each found device, a neodevice_t structure will be written into the memory you provide.

The neodevice_t can later be passed by reference into the API to perform actions relating to the device. The neodevice_t contains a handle to the internal memory for the icsneo::Device object. The memory for the internal icsneo::Device object is managed by the API.

Any neodevice_t objects which have not been opened will become invalid when icsneo_findAllDevices() is called again. To invoke this behavior without finding devices again, call icsneo_freeUnconnectedDevices().

If the size provided is not large enough, the output will be truncated. An icsneo::APIEvent::OutputTruncatedError will be available in icsneo_getLastError() in this case.

Parameters:
  • devices[out] Pointer to memory where devices should be written. If NULL, the current number of detected devices is written to count.

  • count[inout] Pointer to a size_t, which should initially contain the number of devices the buffer can hold, and will afterwards contain the number of devices found.

void DLLExport icsneo_freeUnconnectedDevices (void)

Invalidate neodevice_t objects which have not been opened.

See icsneo_findAllDevices() for information regarding the neodevice_t validity contract.

bool DLLExport icsneo_serialNumToString (uint32_t num, char *str, size_t *count)

Convert a serial number in numerical format to its string representation.

On older devices, the serial number is one like 138635, the numerical representation is the same as the string representation.

On newer devices, the serial number is one like RS2259, and this function can convert the numerical value back into the string seen on the back of the device.

A query for length (str == NULL) will return false. icsneo_getLastError() should be checked to verify that the neodevice_t provided was valid.

The client application should provide a buffer of size 7, as serial numbers are always 6 characters or fewer.

If the size provided is not large enough, the output will be NOT be truncated. Nothing will be written to the output. Instead, an icsneo::APIEvent::BufferInsufficient will be available in icsneo_getLastError(). False will be returned, and count will now contain the number of bytes necessary to store the full string.

Parameters:
  • num[in] A numerical serial number.

  • str[out] A pointer to a buffer where the string representation will be written. NULL can be passed, which will write a character count to count.

  • count[inout] A pointer to a size_t which, prior to the call, holds the maximum number of characters to be written (so str must be of size count + 1 to account for the NULL terminator), and after the call holds the number of characters written.

Returns:

True if str contains the string representation of the given serial number.

uint32_t DLLExport icsneo_serialStringToNum (const char *str)

Convert a serial number in string format to its numerical representation.

On older devices, the serial number is one like 138635, and this string will simply be returned as a number.

On newer devices, the serial number is one like RS2259, and this function can convert that string to a number.

Parameters:

str[in] A NULL terminated string containing the string representation of an Intrepid serial number.

Returns:

The numerical representation of the serial number, or 0 if the conversion was unsuccessful.

bool DLLExport icsneo_isValidNeoDevice (const neodevice_t *device)

Verify that a neodevice_t is valid.

This check is automatically performed at the beginning of any API function that operates on a device. If there is a failure, an icsneo::APIEvent::InvalidNeoDevice will be available in icsneo_getLastError().

See icsneo_findAllDevices() for information regarding the neodevice_t validity contract.

Parameters:

device[in] A pointer to the neodevice_t structure to operate on.

Returns:

True if the neodevice_t is valid.

bool DLLExport icsneo_openDevice (const neodevice_t *device)

Connect to the specified hardware.

The device MUST be opened before any other functions which operate on the device will be valid.

See icsneo_goOnline() for information about enabling network communication once the device is open.

If the open did not succeed, icsneo_getLastError() should provide more information about why.

If the device was already open, an icsneo::APIEvent::DeviceCurrentlyOpen will be available in icsneo_getLastError().

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to open.

Returns:

True if the connection could be opened.

bool DLLExport icsneo_closeDevice (const neodevice_t *device)

Close an open connection to the specified hardware.

After this function succeeds, the neodevice_t will be invalid. To connect again, you must call icsneo_findAllDevices() or similar to re-find the device.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to close.

Returns:

True if the connection could be closed.

bool DLLExport icsneo_isOpen (const neodevice_t *device)

Verify network connection for the specified hardware.

This function does not modify the working state of the device at all.

See icsneo_openDevice() for an explanation about the concept of being “open”.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the device is connected.

bool DLLExport icsneo_goOnline (const neodevice_t *device)

Enable network communication for the specified hardware.

The device is not “online” when it is first opened. It is not possible to receive or transmit while the device is “offline”. Network controllers are disabled. (i.e. In the case of CAN, the hardware will not send ACKs on the client application’s behalf)

This allows filtering or handlers to be set up before allowing traffic to flow.

This also allows device settings to be set (i.e. baudrates) before enabling the controllers, which prevents momentarily causing loss of communication if the baud rates are not correct.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if communication could be enabled.

bool DLLExport icsneo_goOffline (const neodevice_t *device)

Disable network communication for the specified hardware.

See icsneo_goOnline() for an explanation about the concept of being “online”.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if communication could be disabled.

bool DLLExport icsneo_isOnline (const neodevice_t *device)

Verify network communication for the specified hardware.

This function does not modify the working state of the device at all.

See icsneo_goOnline() for an explanation about the concept of being “online”.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if communication is enabled.

bool DLLExport icsneo_enableMessagePolling (const neodevice_t *device)

Enable buffering of messages for the specified hardware.

By default, traffic the device receives will not reach the client application. The client application must register traffic handlers, enable message polling, or both. This function addresses message polling.

With polling enabled, all traffic that the device receives will be stored in a buffer managed by the API. The client application should then call icsneo_getMessages() periodically to take ownership of the messages in that buffer.

The API managed buffer will only grow to a specified size, 20k messages by default. See icsneo_getPollingMessageLimit() and icsneo_setPollingMessageLimit() for more information.

In high traffic situations, the default 20k message limit can be reached very quickly. The client application will have to call icsneo_getMessages() very often to avoid losing messages, or change the limit.

If the message limit is exceeded before a call to icsneo_getMessages() takes ownership of the messages, the oldest message will be dropped (LOST) and an icsneo::APIEvent::PollingMessageOverflow will be flagged for the device.

This function will succeed even if the device is not open.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if polling could be enabled.

bool DLLExport icsneo_disableMessagePolling (const neodevice_t *device)

Disable buffering of messages for the specified hardware.

See icsneo_enableMessagePolling() for more information about the message polling system.

Any messages left in the API managed buffer will be lost upon disabling polling.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if polling could be disabled.

bool DLLExport icsneo_isMessagePollingEnabled (const neodevice_t *device)

Verify message polling status for the specified hardware.

This function does not modify the working state of the device at all.

See icsneo_enableMessagePolling() for an explanation about how polling works.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if polling is enabled.

bool DLLExport icsneo_getMessages (const neodevice_t *device, neomessage_t *messages, size_t *items, uint64_t timeout)

Read out messages which have been recieved.

Messages are available using this function if icsneo_goOnline() and icsneo_enableMessagePolling() have been called. See those functions for more information.

Messages are read out of the API managed buffer in order of oldest to newest. As they are read out, they are removed from the API managed buffer.

If size is too small to contain all messages, as many messages as will fit will be read out. Subsequent calls to icsneo_getMessages() can retrieve any messages which were not read out.

The memory for the data pointer within the neomessage_t is managed by the API. Do not attempt to free the data pointer. The memory will become invalid the next time icsneo_getMessages() is called for this device.

 C
size_t messageCount;
bool result = icsneo_getMessages(device, NULL, &messageCount, 0); // Reading the message count
// Handle errors here
neomessage_t* messages = malloc(messageCount * sizeof(neomessage_t)); // It is also possible and encouraged to use a static buffer
result = icsneo_getMessages(device, messages, &messageCount, 0); // Non-blocking
// Handle errors here
for(size_t i = 0; i < messageCount; i++) {
    switch(messages[i].type) {
        case ICSNEO_NETWORK_TYPE_CAN: {
            // All messages of type CAN can be accessed using neomessage_can_t
            neomessage_can_t* canMessage = (neomessage_can_t*)&messages[i];
            printf("ArbID: 0x%x\n", canMessage->arbid);
            printf("DLC: %u\n", canMessage->length);
            printf("Data: ");
            for(size_t i = 0; i < canMessage->length; i++) {
                printf("%02x ", canMessage->data[i]);
            }
            printf("\nTimestamp: %lu\n", canMessage->timestamp);
        }
    }
}
free(messages);

Warning

Do not call icsneo_close() while another thread is waiting on icsneo_getMessages(). Always allow the other thread to timeout first!

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • messages[out] A pointer to a buffer which neomessage_t structures will be written to. NULL can be passed, which will write the current message count to size.

  • items[inout] A pointer to a size_t which, prior to the call, holds the maximum number of messages to be written, and after the call holds the number of messages written.

  • timeout[in] The number of milliseconds to wait for a message to arrive. A value of 0 indicates a non-blocking call. Querying for the current message count is always asynchronous and ignores this value.

Returns:

True if the messages were read out successfully (even if there were no messages to read) or if the count was read successfully.

int DLLExport icsneo_getPollingMessageLimit (const neodevice_t *device)

Get the maximum number of messages which will be held in the API managed buffer for the specified hardware.

See icsneo_enableMessagePolling() for more information about the message polling system.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

Number of messages, or -1 if device is invalid.

bool DLLExport icsneo_setPollingMessageLimit (const neodevice_t *device, size_t newLimit)

Set the maximum number of messages which will be held in the API managed buffer for the specified hardware.

See icsneo_enableMessagePolling() for more information about the message polling system.

Setting the maximum lower than the current number of stored messages will cause the oldest messages to be dropped (LOST) and an icsneo::APIEvent::PollingMessageOverflow to be flagged for the device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • newLimit[in] The new limit to be enforced.

Returns:

True if the limit was set successfully.

int DLLExport icsneo_addMessageCallback (const neodevice_t *device, void(*callback)(neomessage_t), void *)

Adds a message callback to the specified device to be called when a new message is received.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • callback[in] A function pointer with void return type and a single neomessage_t parameter.

  • filter[in] Unused for now. Exists as a placeholder here for future backwards-compatibility.

Returns:

The id of the callback added, or -1 if the operation failed.

bool DLLExport icsneo_removeMessageCallback (const neodevice_t *device, int id)

Removes a message callback from the specified device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • id[in] The id of the callback to remove.

Returns:

True if the callback was successfully removed.

neonetid_t DLLExport icsneo_getNetworkByNumber (const neodevice_t *device, neonettype_t type, unsigned int number)

Get the network ID for the nth network of a specified type on this device.

This function is designed so that networks can be enumerated without knowledge of the specific device. For instance, on a ValueCAN 4-2, the second CAN network is ICSNEO_NETID_DWCAN_02, while on a neoVI FIRE the second CAN network is ICSNEO_NETID_DWCAN_08.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • type[in] An ICSNEO_NETWORK_TYPE_* constant denoting the network type

  • number[in] The number of this network starting from 1

Returns:

The netid if the call succeeds, ICSNEO_NETID_INVALID otherwise

bool DLLExport icsneo_getProductName (const neodevice_t *device, char *str, size_t *maxLength)

Get the friendly product name for a specified device.

In the case of a neoVI FIRE 2, this function will write a string “neoVI FIRE 2” with a NULL terminator into str.

The constant ICSNEO_DEVICETYPE_LONGEST_NAME is defined for the client application to create static buffers of the correct length.

See also icsneo_describeDevice().

A query for length (str == NULL) will return false. icsneo_getLastError() should be checked to verify that the neodevice_t provided was valid.

If the size provided is not large enough, the output will be truncated. An icsneo::APIEvent::OutputTruncatedError will be available in icsneo_getLastError() in this case. True will still be returned.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • str[out] A pointer to a buffer where the string will be written. NULL can be passed, which will write a character count to maxLength.

  • maxLength[inout] A pointer to a size_t which, prior to the call, holds the maximum number of characters to be written (so str must be of size maxLength + 1 to account for the NULL terminator), and after the call holds the number of characters written.

Returns:

True if str was written to

bool DLLExport icsneo_getProductNameForType (devicetype_t type, char *str, size_t *maxLength)

Get the friendly product name for a specified devicetype.

In the case of a neoVI FIRE 2, this function will write a string “neoVI FIRE 2” with a NULL terminator into str.

Note that icsneo_getProductName should always be preferred where available, as the product name may change based on device-specific factors, such as the serial number.

The constant ICSNEO_DEVICETYPE_LONGEST_NAME is defined for the client application to create static buffers of the correct length.

See also icsneo_describeDevice().

A query for length (str == NULL) will return false. icsneo_getLastError() should be checked to verify that the neodevice_t provided was valid.

If the size provided is not large enough, the output will be truncated. An icsneo::APIEvent::OutputTruncatedError will be available in icsneo_getLastError() in this case. True will still be returned.

Parameters:
  • type[in] A neodevice_t structure specifying the device to operate on.

  • str[out] A pointer to a buffer where the string will be written. NULL can be passed, which will write a character count to maxLength.

  • maxLength[inout] A pointer to a size_t which, prior to the call, holds the maximum number of characters to be written (so str must be of size maxLength + 1 to account for the NULL terminator), and after the call holds the number of characters written.

Returns:

True if str was written to

bool DLLExport icsneo_settingsRefresh (const neodevice_t *device)

Trigger a refresh of the settings structure for a specified device.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the refresh succeeded.

bool DLLExport icsneo_settingsApply (const neodevice_t *device)

Commit the settings structure for a specified device to non-volatile storage.

When modifications are made to the device settings, this function (or icsneo_settingsApplyTemporary()) must be called to send the changes to the device and make them active.

This function sets the settings such that they will survive device power cycles.

If the function fails, the settings will be refreshed so that the structure in the API matches the one held by the device.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the settings were applied.

bool DLLExport icsneo_settingsApplyTemporary (const neodevice_t *device)

Apply the settings structure for a specified device temporarily.

See icsneo_settingsApply() for further information about applying settings.

This function sets the settings such that they will revert to the values saved in non-volatile storage when the device loses power.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the settings were applied.

bool DLLExport icsneo_settingsApplyDefaults (const neodevice_t *device)

Apply the default settings structure for a specified device.

See icsneo_settingsApply() for further information about applying settings.

This function sets the default settings such that they will survive device power cycles.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the default settings were applied.

bool DLLExport icsneo_settingsApplyDefaultsTemporary (const neodevice_t *device)

Apply the default settings structure for a specified device temporarily.

See icsneo_settingsApply() for further information about applying settings. See icsneo_settingsApplyDefaults() for further information about applying default settings.

This function sets the default settings such that they will revert to the values saved in non-volatile storage when the device loses power.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the default settings were applied.

int DLLExport icsneo_settingsReadStructure (const neodevice_t *device, void *structure, size_t structureSize)

Apply the default settings structure for a specified device temporarily.

See icsneo_settingsApply() for further information about applying settings. See icsneo_settingsApplyDefaults() for further information about applying default settings.

This function sets the default settings such that they will revert to the values saved in non-volatile storage when the device loses power.

If possible, use functions specific to the operation you want to acomplish (such as icsneo_setBaudrate()) instead of modifying the structure directly. This allows the client application to work with other hardware.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • structure[out] A pointer to a device settings structure for the current device.

  • structureSize[in] The size of the current device settings structure in bytes.

Returns:

Number of bytes written to structure, or -1 if the operation failed.

bool DLLExport icsneo_settingsApplyStructure (const neodevice_t *device, const void *structure, size_t structureSize)

Apply a provided settings structure for a specified device.

This function immediately applies the provided settings. See icsneo_settingsApplyTemporary() for further information about applying settings.

If possible, use functions specific to the operation you want to acomplish (such as icsneo_setBaudrate()) instead of modifying the structure directly. This allows the client application to work with other hardware.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • structure[in] A pointer to a device settings structure for the current device.

  • structureSize[in] The size of the current device settings structure in bytes.

Returns:

True if the settings were applied.

bool DLLExport icsneo_settingsApplyStructureTemporary (const neodevice_t *device, const void *structure, size_t structureSize)

Apply a provided settings structure for a specified device without saving to non-volatile EEPROM.

This function immediately applies the provided settings. See icsneo_settingsApply() for further information about applying settings.

This function sets the default settings such that they will revert to the values saved in non-volatile storage when the device loses power.

If possible, use functions specific to the operation you want to acomplish (such as icsneo_setBaudrate()) instead of modifying the structure directly. This allows the client application to work with other hardware.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • structure[in] A pointer to a device settings structure for the current device.

  • structureSize[in] The size of the current device settings structure in bytes.

Returns:

True if the settings were applied.

int64_t DLLExport icsneo_getBaudrate (const neodevice_t *device, neonetid_t netid)

Get the network baudrate for a specified device.

In the case of CAN, this function gets the standard CAN baudrate. See icsneo_getFDBaudrate() to get the baudrate for (the baudrate-switched portion of) CAN FD.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network for which the baudrate should be retrieved.

Returns:

The value in baud with no multipliers. (i.e. 500k becomes 500000) A negative value is returned if an error occurs.

bool DLLExport icsneo_setBaudrate (const neodevice_t *device, neonetid_t netid, int64_t newBaudrate)

Set the network baudrate for a specified device.

In the case of CAN, this function sets the standard CAN baudrate. See icsneo_setFDBaudrate() to set the baudrate for (the baudrate-switched portion of) CAN FD.

Call icsneo_settingsApply() or similar to make the changes active on the device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network to which the new baudrate should apply.

  • newBaudrate[in] The requested baudrate, with no multipliers. (i.e. 500K CAN should be represented as 500000)

Returns:

True if the baudrate could be set.

int64_t DLLExport icsneo_getFDBaudrate (const neodevice_t *device, neonetid_t netid)

Get the CAN FD baudrate for a specified device.

See icsneo_getBaudrate() to get the baudrate for the non baudrate-switched portion of CAN FD, classical CAN 2.0, and other network types.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network for which the baudrate should be retrieved.

Returns:

The value in baud with no multipliers. (i.e. 500k becomes 500000) A negative value is returned if an error occurs.

bool DLLExport icsneo_setFDBaudrate (const neodevice_t *device, neonetid_t netid, int64_t newBaudrate)

Set the CAN FD baudrate for a specified device.

See icsneo_setBaudrate() to set the baudrate for the non baudrate-switched portion of CAN FD, classical CAN 2.0, and other network types.

Call icsneo_settingsApply() or similar to make the changes active on the device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network to which the new baudrate should apply.

  • newBaudrate[in] The requested baudrate, with no multipliers. (i.e. 2Mbaud CAN FD should be represented as 2000000)

Returns:

True if the baudrate could be set.

bool DLLExport icsneo_transmit (const neodevice_t *device, const neomessage_t *message)

Transmit a single message.

To transmit a message, you must set the data, length, and netid attributes of the neomessage_t.

The data attribute must be set to a pointer to a buffer of at least length which holds the payload bytes. This buffer only needs to be valid for the duration of this call, and can safely be deallocated or reused after the return.

You may also have to set network dependent variables. For CAN, you must set the arbid attribute defined in neomessage_can_t.

Other attributes of the neomessage_t such as timestamp, type and reserved which are not used should be set to 0. Unused status bits should also be set to 0.

Any types defined neomessage_*_t are designed to be binary compatible with neomessage_t.

For instance, for CAN, it is recommended to use neomessage_can_t as it exposes the arbid field.

 C
neomessage_can_t mySendMessage = {}; // Zero all before use
uint8_t myData[3] = { 0xAA, 0xBB, 0xCC }; // Either heap or stack allocated is okay
mySendMessage.netid = ICSNEO_NETID_DWCAN_01;
mySendMessage.arbid = 0x1c5001c5;
mySendMessage.length = 3;
mySendMessage.data = myData;
mySendMessage.status.canfdFDF = true; // CAN FD
mySendMessage.status.extendedFrame = true; // Extended (29-bit) arbitration IDs
mySendMessage.status.canfdBRS = true; // CAN FD Baudrate Switch
bool result = icsneo_transmit(device, (neomessage_t*)&mySendMessage);

myData[1] = 0x55; // The message and buffer can be safely reused for the next message
result = icsneo_transmit(device, (neomessage_t*)&mySendMessage);
Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to transmit on.

  • message[in] A pointer to the neomessage_t structure defining the message.

Returns:

True if the message was verified transmittable and enqueued for transmit.

bool DLLExport icsneo_transmitMessages (const neodevice_t *device, const neomessage_t *messages, size_t count)

Transmit a multiple messages.

See icsneo_transmit() for information regarding transmitting messages.

On a per-network basis, messages will be transmitted in the order that they were enqueued.

In this case, messages will be enqueued in order of increasing index.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to transmit on.

  • messages[in] A pointer to the neomessage_t structures defining the messages.

  • count[in] The number of messages to transmit.

Returns:

True if the messages were verified transmittable and enqueued for transmit.

void DLLExport icsneo_setWriteBlocks (const neodevice_t *device, bool blocks)

Set the behavior of whether writing is a blocking action or not.

By default, writing is a blocking action.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to transmit on.

  • blocks[in] Whether or not writing is a blocking action.

bool DLLExport icsneo_describeDevice (const neodevice_t *device, char *str, size_t *maxLength)

Get the friendly description for a specified device.

In the case of a neoVI FIRE 2 with serial number CY2285, this function will write a string “neoVI FIRE 2 CY2285” with a NULL terminator into str.

The constant ICSNEO_DEVICETYPE_LONGEST_DESCRIPTION is defined for the client application to create static buffers of the correct length.

See also icsneo_getProductName().

A query for length (str == NULL) will return false. icsneo_getLastError() should be checked to verify that the neodevice_t provided was valid.

If the size provided is not large enough, the output will be truncated. An icsneo::APIEvent::OutputTruncatedError will be available in icsneo_getLastError() in this case. True will still be returned.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • str[out] A pointer to a buffer where the string will be written. NULL can be passed, which will write a character count to maxLength.

  • maxLength[inout] A pointer to a size_t which, prior to the call, holds the maximum number of characters to be written (so str must be of size maxLength + 1 to account for the NULL terminator), and after the call holds the number of characters written.

Returns:

True if str was written to

neoversion_t DLLExport icsneo_getVersion (void)

Get the version of libicsneo in use.

Returns:

A neoversion_t structure containing the version.

int DLLExport icsneo_addEventCallback (void(*callback)(neoevent_t), void *)

Adds an event callback to be called when a new event is added.

Do not attempt to add or remove callbacks inside of a callback, as the stored callbacks are locked during calls.

Parameters:
  • callback[in] A function pointer with void return type and a single neoevent_t parameter.

  • filter[in] Unused for now. Exists as a placeholder here for future backwards-compatibility.

Returns:

The id of the callback added. Does not error.

bool DLLExport icsneo_removeEventCallback (int id)

Removes an event callback.

Parameters:

id[in] The id of the callback to remove.

Returns:

True if the callback was successfully removed.

bool DLLExport icsneo_getEvents (neoevent_t *events, size_t *size)

Read out events which have occurred in API operation.

Events contain INFO and WARNINGS, and may potentially contain one TooManyEvents WARNING at the end. No ERRORS are found in Events, see icsneo_getLastError() instead.

Events can be caused by API usage, such as providing too small of a buffer or disconnecting from a device.

Events can also occur asynchronously to the client application threads, in the case of a device communication event or similar.

Events are read out of the API managed buffer in order of oldest to newest. As they are read out, they are removed from the API managed buffer.

If size is too small to contain all events, as many events as will fit will be read out. Subsequent calls to icsneo_getEvents() can retrieve any events which were not read out.

Parameters:
  • events[out] A pointer to a buffer which neoevent_t structures will be written to. NULL can be passed, which will write the current event count to size.

  • size[inout] A pointer to a size_t which, prior to the call, holds the maximum number of events to be written, and after the call holds the number of events written.

Returns:

True if the events were read out successfully (even if there were no events to report).

bool DLLExport icsneo_getDeviceEvents (const neodevice_t *device, neoevent_t *events, size_t *size)

Read out events which have occurred in API operation for a specific device.

See icsneo_getEvents() for more information about the event system.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to read out events for. NULL can be passed, which indicates that ONLY events not associated with a device are desired (API events).

  • events[out] A pointer to a buffer which neoevent_t structures will be written to. NULL can be passed, which will write the current event count to size.

  • size[inout] A pointer to a size_t which, prior to the call, holds the maximum number of events to be written, and after the call holds the number of events written.

Returns:

True if the events were read out successfully (even if there were no events to report).

bool DLLExport icsneo_getLastError (neoevent_t *error)

Read out the last error which occurred in API operation on this thread.

All errors are stored on a per-thread basis, meaning that calling icsneo_getLastError() will return the last error that occured on the calling thread. Any errors can only be retrieved through this function, and NOT icsneo_getEvents() or similar! Only INFO and WARNING level events are accessible through those. Only the last error is stored, so the intention is for this function to be called immediately following another failed API call.

The API error system is thread-safe. Only an API error which occurred on the current thread will be returned.

See icsneo_getEvents() for more information about the event system.

This operation removes the returned error from the buffer, so subsequent calls to error functions will not include the error.

Parameters:

error[out] A pointer to a buffer which a neoevent_t structure will be written to.

Returns:

True if an error was read out.

void DLLExport icsneo_discardAllEvents (void)

Discard all events which have occurred in API operation. Does NOT discard any errors.

void DLLExport icsneo_discardDeviceEvents (const neodevice_t *device)

Discard all events which have occurred in API operation.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to discard events for. NULL can be passed, which indicates that ONLY events not associated with a device are desired (API events). Does NOT discard any errors (device or otherwise).

void DLLExport icsneo_setEventLimit (size_t newLimit)

Set the number of events which will be held in the API managed buffer before icsneo::APIEvent::TooManyEvents.

If the event limit is reached, an icsneo::APIEvent::TooManyEvents will be flagged.

If the newLimit is smaller than the current event count, events will be removed in order of decreasing age. This will also flag an icsneo::APIEvent::TooManyEvents.

Parameters:

newLimit[in] The new limit. Must be >10. 1 event slot is always reserved for a potential icsneo::APIEvent::TooManyEvents, so (newLimit - 1) other events can be stored.

size_t DLLExport icsneo_getEventLimit (void)

Get the number of events which can be held in the API managed buffer.

Returns:

The current limit.

bool DLLExport icsneo_getSupportedDevices (devicetype_t *devices, size_t *count)

Get the devices supported by the current version of the API.

See icsneo_getProductNameForType() to get textual descriptions of each device.

A query for length (devices == NULL) will return false.

If the count provided is not large enough, the output will be truncated. An icsneo::APIEvent::OutputTruncatedError will be available in icsneo_getLastError() in this case. True will still be returned.

Parameters:
  • devices[out] A pointer to a buffer of devicetype_t structures which will be written to. NULL can be passed, which will write the current supported device count to count.

  • count[inout] A pointer to a size_t which, prior to the call, holds the maximum number of devicetype_t structures to be written, and after the call holds the number of devicetype_t structures written.

Returns:

True if devices was written to

bool DLLExport icsneo_getTimestampResolution (const neodevice_t *device, uint16_t *resolution)

Get the timestamp resolution for the given device.

Parameters:
  • device[out] A pointer to the neodevice_t structure specifying the device to read out the timestamp for.

  • resolution[out] A pointer to a uint16_t where the resolution will be stored. This value is in nanoseconds.

Returns:

True if the resolution was written

bool DLLExport icsneo_getDigitalIO (const neodevice_t *device, neoio_t type, uint32_t number, bool *value)

Get the value of a digital IO for the given device.

These values are often not populated if the device is not “online”.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • type[in] The IO type

  • number[in] The index within the IO type, starting from 1

  • value[out] A pointer to the uint8_t which will store the value of the IO port, if successful

Returns:

True if the value is read successfully

bool DLLExport icsneo_setDigitalIO (const neodevice_t *device, neoio_t type, uint32_t number, bool value)

Get the value of a digital IO for the given device.

Note that this function is not synchronous with the device confirming the change.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • type[in] The IO type

  • number[in] The index within the IO type, starting from 1

  • value[in] The value which will be written to the IO

Returns:

True if the parameters and connection state are correct to submit the request to the device

bool DLLExport icsneo_isTerminationSupportedFor (const neodevice_t *device, neonetid_t netid)

Check whether software switchable termination is supported for a given network on this device.

This does not check whether another network in the termination group has termination enabled, check canTerminationBeEnabledFor for that.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network ID to check

Returns:

True if software switchable termination is supported

bool DLLExport icsneo_canTerminationBeEnabledFor (const neodevice_t *device, neonetid_t netid)

Check whether software switchable termination can currently be enabled for a given network.

If another network in the group is already enabled, or if termination is not supported on this network, false is returned and an error will have been reported in icsneo_getLastError().

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network ID to check

Returns:

True if software switchable termination can currently be enabled

bool DLLExport icsneo_isTerminationEnabledFor (const neodevice_t *device, neonetid_t netid)

Check whether software switchable termination is currently enabled for a given network in the currently active device settings.

Note that if the termination status is set, but not yet applied to the device, the current device status will be reflected here rather than the pending status.

False will be returned and an error will be set in icsneo_getLastError if the setting is unreadable.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network ID to check

Returns:

True if software switchable termination is currently enabled

bool DLLExport icsneo_setTerminationFor (const neodevice_t *device, neonetid_t netid, bool enabled)

Enable or disable software switchable termination for a given network.

All other networks in the termination group must be disabled prior to the call, but the change does not need to be applied to the device before enqueing the enable.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The network ID to affect

  • enabled[in] Whether to enable or disable switchable termination

Returns:

True if if the call was successful, otherwise an error will have been reported in icsneo_getLastError().

int DLLExport icsneo_getDeviceStatus (const neodevice_t *device, void *status, size_t *size)

Return the device status structures for a specified device.

This function populates the device status structures and sub members.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • status[in] A pointer to a device status structure for the current device.

  • size[in] The size of the current device status structure in bytes.

Returns:

True if the device status was successfully read.

bool DLLExport icsneo_getRTC (const neodevice_t *device, uint64_t *output)

Get the real-time clock for the given device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to read the RTC from.

  • output[out] A pointer to a uint64_t where the RTC will be stored. This value is in seconds.

Returns:

True if the RTC was successfully retrieved.

bool DLLExport icsneo_setRTC (const neodevice_t *device, uint64_t input)

Set the real-time clock for the given device.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to write the RTC to.

  • input[in] A uint64_t object holding the RTC value. This value is in seconds.

Returns:

True if the RTC was successfully set.

bool DLLExport icsneo_isOnlineSupported (const neodevice_t *device)

Check if the device supports the ability to go online.

Parameters:

device[in] A pointer to the neodevice_t structure specifying the device to operate on.

Returns:

True if the device supports the ability to go online

bool DLLExport icsneo_requestTC10Wake (const neodevice_t *device, neonetid_t netid)

Request TC10 wake.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The interface to request the TC10 wake on.

Returns:

True if the device successfully sent the TC10 wake request.

bool DLLExport icsneo_requestTC10Sleep (const neodevice_t *device, neonetid_t netid)

Request TC10 sleep.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The interface to request the TC10 sleep on.

Returns:

True if the device successfully sent the TC10 sleep request.

bool DLLExport icsneo_getTC10Status (const neodevice_t *device, neonetid_t netid, neotc10status_t *status)

Query TC10 status.

Parameters:
  • device[in] A pointer to the neodevice_t structure specifying the device to operate on.

  • netid[in] The interface to request the TC10 status for.

  • status[out] The TC10 status for the given interface

Returns:

True if the device successfully retreieved the TC10 status.

Typedefs

typedef void *devicehandle_t
typedef int32_t neodevice_handle_t
struct neodevice_t
#include <neodevice.h>

Public Members

devicehandle_t device
neodevice_handle_t handle
devicetype_t type
char serial[7]
union neomessage_statusbitfield_t
#include <neomessage.h>

Public Members

uint32_t globalError
uint32_t transmitMessage
uint32_t extendedFrame
uint32_t remoteFrame
uint32_t crcError
uint32_t canErrorPassive
uint32_t incompleteFrame
uint32_t lostArbitration
uint32_t undefinedError
uint32_t canBusOff
uint32_t canBusRecovered
uint32_t canBusShortedPlus
uint32_t canBusShortedGround
uint32_t checksumError
uint32_t badMessageBitTimeError
uint32_t ifrData
uint32_t hardwareCommError
uint32_t expectedLengthError
uint32_t incomingNoMatch
uint32_t statusBreak
uint32_t avsiRecOverflow
uint32_t testTrigger
uint32_t audioComment
uint32_t gpsData
uint32_t analogDigitalInput
uint32_t textComment
uint32_t networkMessageType
uint32_t vsiTXUnderrun
uint32_t vsiIFRCRCBit
uint32_t initMessage
uint32_t flexraySecondStartupFrame
uint32_t extended
uint32_t hasValue
uint32_t valueIsBoolean
uint32_t highVoltage
uint32_t longMessage
uint32_t __pad0__
uint32_t globalChange
uint32_t errorFrame
uint32_t __pad1__
uint32_t endOfLongMessage
uint32_t linErrorRXBreakNotZero
uint32_t linErrorRXBreakTooShort
uint32_t linErrorRXSyncNot55
uint32_t linErrorRXDataGreaterEight
uint32_t linErrorTXRXMismatch
uint32_t linErrorMessageIDParity
uint32_t linSyncFrameError
uint32_t linIDFrameError
uint32_t linSlaveByteError
uint32_t rxTimeoutError
uint32_t linNoSlaveData
uint32_t status3
uint32_t canfdESI
uint32_t canfdIDE
uint32_t canfdRTR
uint32_t canfdFDF
uint32_t canfdBRS
uint32_t linJustBreakSync
uint32_t linSlaveDataTooShort
uint32_t linOnlyUpdateSlaveTableOnce
struct neomessage_statusbitfield_t
uint32_t statusBitfield[4]
struct neomessage_t
#include <neomessage.h>

Public Members

uint8_t _reserved1[16]
uint64_t timestamp
uint64_t _reservedTimestamp
uint8_t _reserved2[sizeof(size_t) * 2 + 7 + sizeof(neonetid_t) + sizeof(neonettype_t)]
neomessagetype_t messageType
uint8_t _reserved3[12]
struct neomessage_frame_t
#include <neomessage.h>

Public Members

neomessage_statusbitfield_t status
uint64_t timestamp
uint64_t _reservedTimestamp
const uint8_t *data
size_t length
uint8_t header[4]
neonetid_t netid
neonettype_t type
uint8_t _reserved0
uint16_t description
neomessagetype_t messageType
uint8_t _reserved1[12]
struct neomessage_can_t
#include <neomessage.h>

Public Members

neomessage_statusbitfield_t status
uint64_t timestamp
uint64_t _reservedTimestamp
const uint8_t *data
size_t length
uint32_t arbid
neonetid_t netid
neonettype_t type
uint8_t dlcOnWire
uint16_t description
neomessagetype_t messageType
uint8_t _reserved1[12]
struct neomessage_can_error_t
#include <neomessage.h>

Public Members

neomessage_statusbitfield_t status
uint64_t timestamp
uint64_t _reservedTimestamp
size_t _reserved2[2]
uint8_t transmitErrorCount
uint8_t receiveErrorCount
uint8_t _reserved3[5]
neonetid_t netid
neonettype_t type
neomessagetype_t messageType
uint8_t _reserved4[12]
struct neomessage_eth_t
#include <neomessage.h>

Public Members

neomessage_statusbitfield_t status
uint64_t timestamp
uint64_t _reservedTimestamp
const uint8_t *data
size_t length
uint8_t preemptionFlags
uint8_t _reservedHeader[3]
neonetid_t netid
neonettype_t type
uint8_t _reserved0
uint16_t description
neomessagetype_t messageType
uint8_t _reserved1[12]
struct neomessage_linstatus_t
#include <neomessage.h>

Public Members

uint8_t txChecksumEnhanced
uint8_t txCommander
uint8_t txResponder
uint8_t txAborted
uint8_t updateResponderOnce
uint8_t hasUpdatedResponderOnce
uint8_t busRecovered
uint8_t breakOnly
struct neomessage_lin_t
#include <neomessage.h>

Public Members

neomessage_statusbitfield_t status
uint64_t timestamp
uint64_t _reservedTimestamp
const uint8_t *data
size_t length
uint8_t header[4]
neonetid_t netid
neonettype_t type
neomessage_linstatus_t linStatus
uint16_t description
neomessagetype_t messageType
uint8_t checksum
uint8_t _reserved1[11]

Defines

NEOVERSION_DEFINE_BEGIN

Variables

NEOVERSION_DEFINE_BEGIN uint16_t major
uint16_t minor
uint16_t patch
const char *metadata
const char *buildBranch
const char *buildTag
char reserved[32]
neoversion_t
struct neoevent_t
#include <event.h>

Public Members

const char *description
time_t timestamp
uint32_t eventNumber
uint8_t severity
char serial[7]
uint8_t reserved[16]