diff --git a/api/icsneoc2/icsneoc2messages.cpp b/api/icsneoc2/icsneoc2messages.cpp index d05e63a..e2f57d4 100644 --- a/api/icsneoc2/icsneoc2messages.cpp +++ b/api/icsneoc2/icsneoc2messages.cpp @@ -7,6 +7,7 @@ #include "icsneo/communication/message/message.h" #include "icsneo/communication/message/canmessage.h" #include "icsneo/communication/message/canerrormessage.h" +#include "icsneo/communication/message/apperrormessage.h" #include "icsneo/communication/message/linmessage.h" #include "icsneo/communication/message/ethernetmessage.h" #include "icsneo/communication/packet/canpacket.h" @@ -316,6 +317,44 @@ icsneoc2_error_t icsneoc2_message_can_error_props_get( return icsneoc2_error_success; } +icsneoc2_error_t icsneoc2_message_is_app_error(icsneoc2_message_t* message, bool* is_app_error) { + if(!message || !is_app_error) { + return icsneoc2_error_invalid_parameters; + } + *is_app_error = std::dynamic_pointer_cast(message->message) != nullptr; + return icsneoc2_error_success; +} + +icsneoc2_error_t icsneoc2_message_app_error_props_get(icsneoc2_message_t* message, + icsneoc2_app_error_type_t* error_type, icsneoc2_netid_t* error_netid) { + if(!message) { + return icsneoc2_error_invalid_parameters; + } + auto app_err = std::dynamic_pointer_cast(message->message); + if(!app_err) { + return icsneoc2_error_invalid_type; + } + if(error_type) { + *error_type = static_cast(app_err->getAppErrorType()); + } + if(error_netid) { + *error_netid = static_cast(app_err->errorNetID); + } + return icsneoc2_error_success; +} + +icsneoc2_error_t icsneoc2_message_app_error_string_get(icsneoc2_message_t* message, + char* value, size_t* value_length) { + if(!message || !value_length) { + return icsneoc2_error_invalid_parameters; + } + auto app_err = std::dynamic_pointer_cast(message->message); + if(!app_err) { + return icsneoc2_error_invalid_type; + } + return safe_str_copy(value, value_length, app_err->getAppErrorString()) ? icsneoc2_error_success : icsneoc2_error_string_copy_failed; +} + icsneoc2_error_t icsneoc2_message_is_lin(icsneoc2_message_t* message, bool* is_lin) { if(!message || !is_lin) { return icsneoc2_error_invalid_parameters; diff --git a/examples/c2/simple/src/main.c b/examples/c2/simple/src/main.c index 7d18ea0..d5a9355 100644 --- a/examples/c2/simple/src/main.c +++ b/examples/c2/simple/src/main.c @@ -359,6 +359,7 @@ int process_messages(icsneoc2_message_t** messages, size_t messages_count) { // Print the type and bus type of each message size_t tx_count = 0; size_t can_error_count = 0; + size_t app_error_count = 0; for(size_t i = 0; i < messages_count; i++) { icsneoc2_message_t* message = messages[i]; @@ -392,6 +393,27 @@ int process_messages(icsneoc2_message_t** messages, size_t messages_count) { continue; } + // Check for application error messages + bool is_app_error = false; + res = icsneoc2_message_is_app_error(message, &is_app_error); + if(res != icsneoc2_error_success) { + return print_error_code("\tFailed to check if message is an app error", res); + } + if(is_app_error) { + icsneoc2_app_error_type_t error_type = icsneoc2_app_error_type_no_error; + icsneoc2_netid_t error_netid = 0; + char description[256] = {0}; + size_t description_length = sizeof(description); + res = icsneoc2_message_app_error_props_get(message, &error_type, &error_netid); + res += icsneoc2_message_app_error_string_get(message, description, &description_length); + if(res != icsneoc2_error_success) { + return print_error_code("\tFailed to get app error properties", res); + } + printf("\t%zd) App Error (type %u) on netid 0x%x: %s\n", i, error_type, error_netid, description); + app_error_count++; + continue; + } + bool is_frame = false; res = icsneoc2_message_is_frame(message, &is_frame); if(res != icsneoc2_error_success) { @@ -472,7 +494,7 @@ int process_messages(icsneoc2_message_t** messages, size_t messages_count) { printf(" ]\n"); } } - printf("\tReceived %zu messages total, %zu were TX messages, %zu were CAN errors\n", messages_count, tx_count, can_error_count); + printf("\tReceived %zu messages total, %zu were TX messages, %zu were CAN errors, %zu were app errors\n", messages_count, tx_count, can_error_count, app_error_count); return icsneoc2_error_success; } diff --git a/include/icsneo/communication/message/apperrormessage.h b/include/icsneo/communication/message/apperrormessage.h index 8c81b54..0f1341d 100644 --- a/include/icsneo/communication/message/apperrormessage.h +++ b/include/icsneo/communication/message/apperrormessage.h @@ -4,6 +4,7 @@ #ifdef __cplusplus #include "icsneo/communication/message/message.h" +#include "icsneo/icsneoc2types.h" #include #include #include "icsneo/api/eventmanager.h" @@ -11,57 +12,57 @@ namespace icsneo { -enum class AppErrorType : uint16_t { - AppErrorRxMessagesFull = 0, - AppErrorTxMessagesFull = 1, - AppErrorTxReportMessagesFull = 2, - AppErrorBadCommWithDspIC = 3, - AppErrorDriverOverflow = 4, - AppErrorPCBuffOverflow = 5, - AppErrorPCChksumError = 6, - AppErrorPCMissedByte = 7, - AppErrorPCOverrunError = 8, - AppErrorSettingFailure = 9, - AppErrorTooManySelectedNetworks = 10, - AppErrorNetworkNotEnabled = 11, - AppErrorRtcNotCorrect = 12, - AppErrorLoadedDefaultSettings = 13, - AppErrorFeatureNotUnlocked = 14, - AppErrorFeatureRtcCmdDropped = 15, - AppErrorTxMessagesFlushed = 16, - AppErrorTxMessagesHalfFull = 17, - AppErrorNetworkNotValid = 18, - AppErrorTxInterfaceNotImplemented = 19, - AppErrorTxMessagesCommEnableIsOff = 20, - AppErrorRxFilterMatchCountExceeded = 21, - AppErrorEthPreemptionNotEnabled = 22, - AppErrorTxNotSupportedInMode = 23, - AppErrorJumboFramesNotSupported = 24, - AppErrorEthernetIpFragment = 25, - AppErrorTxMessagesUnderrun = 26, - AppErrorDeviceFanFailure = 27, - AppErrorDeviceOvertemperature = 28, - AppErrorTxMessageIndexOutOfRange = 29, - AppErrorUndersizedFrameDropped = 30, - AppErrorOversizedFrameDropped = 31, - AppErrorWatchdogEvent = 32, - AppErrorSystemClockFailure = 33, - AppErrorSystemClockRecovered = 34, - AppErrorSystemPeripheralReset = 35, - AppErrorSystemCommunicationFailure = 36, - AppErrorTxMessagesUnsupportedSourceOrPacketId = 37, - AppErrorWbmsManagerConnectFailed = 38, - AppErrorWbmsManagerConnectBadState = 39, - AppErrorWbmsManagerConnectTimeout = 40, - AppErrorFailedToInitializeLoggerDisk = 41, - AppErrorInvalidSetting = 42, - AppErrorSystemFailureRequestedReset = 43, - AppErrorPortKeyMistmatch = 45, - AppErrorBusFailure = 46, - AppErrorTapOverflow = 47, - AppErrorEthTxNoLink = 48, - AppErrorErrorBufferOverflow = 254, - AppNoError = 255 +enum class AppErrorType : icsneoc2_app_error_type_t { + AppErrorRxMessagesFull = icsneoc2_app_error_type_rx_messages_full, + AppErrorTxMessagesFull = icsneoc2_app_error_type_tx_messages_full, + AppErrorTxReportMessagesFull = icsneoc2_app_error_type_tx_report_messages_full, + AppErrorBadCommWithDspIC = icsneoc2_app_error_type_bad_comm_with_dsp_ic, + AppErrorDriverOverflow = icsneoc2_app_error_type_driver_overflow, + AppErrorPCBuffOverflow = icsneoc2_app_error_type_pc_buff_overflow, + AppErrorPCChksumError = icsneoc2_app_error_type_pc_chksum_error, + AppErrorPCMissedByte = icsneoc2_app_error_type_pc_missed_byte, + AppErrorPCOverrunError = icsneoc2_app_error_type_pc_overrun_error, + AppErrorSettingFailure = icsneoc2_app_error_type_setting_failure, + AppErrorTooManySelectedNetworks = icsneoc2_app_error_type_too_many_selected_networks, + AppErrorNetworkNotEnabled = icsneoc2_app_error_type_network_not_enabled, + AppErrorRtcNotCorrect = icsneoc2_app_error_type_rtc_not_correct, + AppErrorLoadedDefaultSettings = icsneoc2_app_error_type_loaded_default_settings, + AppErrorFeatureNotUnlocked = icsneoc2_app_error_type_feature_not_unlocked, + AppErrorFeatureRtcCmdDropped = icsneoc2_app_error_type_feature_rtc_cmd_dropped, + AppErrorTxMessagesFlushed = icsneoc2_app_error_type_tx_messages_flushed, + AppErrorTxMessagesHalfFull = icsneoc2_app_error_type_tx_messages_half_full, + AppErrorNetworkNotValid = icsneoc2_app_error_type_network_not_valid, + AppErrorTxInterfaceNotImplemented = icsneoc2_app_error_type_tx_interface_not_implemented, + AppErrorTxMessagesCommEnableIsOff = icsneoc2_app_error_type_tx_messages_comm_enable_is_off, + AppErrorRxFilterMatchCountExceeded = icsneoc2_app_error_type_rx_filter_match_count_exceeded, + AppErrorEthPreemptionNotEnabled = icsneoc2_app_error_type_eth_preemption_not_enabled, + AppErrorTxNotSupportedInMode = icsneoc2_app_error_type_tx_not_supported_in_mode, + AppErrorJumboFramesNotSupported = icsneoc2_app_error_type_jumbo_frames_not_supported, + AppErrorEthernetIpFragment = icsneoc2_app_error_type_ethernet_ip_fragment, + AppErrorTxMessagesUnderrun = icsneoc2_app_error_type_tx_messages_underrun, + AppErrorDeviceFanFailure = icsneoc2_app_error_type_device_fan_failure, + AppErrorDeviceOvertemperature = icsneoc2_app_error_type_device_overtemperature, + AppErrorTxMessageIndexOutOfRange = icsneoc2_app_error_type_tx_message_index_out_of_range, + AppErrorUndersizedFrameDropped = icsneoc2_app_error_type_undersized_frame_dropped, + AppErrorOversizedFrameDropped = icsneoc2_app_error_type_oversized_frame_dropped, + AppErrorWatchdogEvent = icsneoc2_app_error_type_watchdog_event, + AppErrorSystemClockFailure = icsneoc2_app_error_type_system_clock_failure, + AppErrorSystemClockRecovered = icsneoc2_app_error_type_system_clock_recovered, + AppErrorSystemPeripheralReset = icsneoc2_app_error_type_system_peripheral_reset, + AppErrorSystemCommunicationFailure = icsneoc2_app_error_type_system_communication_failure, + AppErrorTxMessagesUnsupportedSourceOrPacketId = icsneoc2_app_error_type_tx_messages_unsupported_source_or_packet_id, + AppErrorWbmsManagerConnectFailed = icsneoc2_app_error_type_wbms_manager_connect_failed, + AppErrorWbmsManagerConnectBadState = icsneoc2_app_error_type_wbms_manager_connect_bad_state, + AppErrorWbmsManagerConnectTimeout = icsneoc2_app_error_type_wbms_manager_connect_timeout, + AppErrorFailedToInitializeLoggerDisk = icsneoc2_app_error_type_failed_to_initialize_logger_disk, + AppErrorInvalidSetting = icsneoc2_app_error_type_invalid_setting, + AppErrorSystemFailureRequestedReset = icsneoc2_app_error_type_system_failure_requested_reset, + AppErrorPortKeyMistmatch = icsneoc2_app_error_type_port_key_mistmatch, + AppErrorBusFailure = icsneoc2_app_error_type_bus_failure, + AppErrorTapOverflow = icsneoc2_app_error_type_tap_overflow, + AppErrorEthTxNoLink = icsneoc2_app_error_type_eth_tx_no_link, + AppErrorErrorBufferOverflow = icsneoc2_app_error_type_error_buffer_overflow, + AppNoError = icsneoc2_app_error_type_no_error }; class AppErrorMessage : public RawMessage { diff --git a/include/icsneo/icsneoc2messages.h b/include/icsneo/icsneoc2messages.h index 8dc6f96..fd100f8 100644 --- a/include/icsneo/icsneoc2messages.h +++ b/include/icsneo/icsneoc2messages.h @@ -516,6 +516,42 @@ icsneoc2_error_t icsneoc2_message_can_error_props_get( icsneoc2_can_error_code_t *data_error_code, icsneoc2_message_can_error_flags_t *flags); +/** + * Check if a message is an application error message + * + * @param[in] message The message to check. + * @param[out] is_app_error Pointer to a bool to copy the app error status of the message into. + * + * @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters otherwise. + */ +icsneoc2_error_t icsneoc2_message_is_app_error(icsneoc2_message_t* message, bool* is_app_error); + +/** + * Get the application error specific properties of a message + * + * @param[in] message The message to check. + * @param[out] error_type Pointer to a icsneoc2_app_error_type_t to copy the error type into. If NULL, it's ignored. + * @param[out] error_netid Pointer to a icsneoc2_netid_t to copy the associated network ID into. If NULL, it's ignored. + * + * @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters or icsneoc2_error_invalid_type otherwise. + * + * @see icsneoc2_app_error_type_t, icsneoc2_message_app_error_string_get + */ +icsneoc2_error_t icsneoc2_message_app_error_props_get(icsneoc2_message_t* message, + icsneoc2_app_error_type_t* error_type, icsneoc2_netid_t* error_netid); + +/** + * Get a human-readable description string for an application error message + * + * @param[in] message The message to check. + * @param[out] value Pointer to a char buffer to copy the description into. + * @param[in,out] value_length On input, the size of the value buffer; on output, the length of the copied string. + * + * @return icsneoc2_error_t icsneoc2_error_success if successful, icsneoc2_error_invalid_parameters, icsneoc2_error_invalid_type, or icsneoc2_error_string_copy_failed otherwise. + */ +icsneoc2_error_t icsneoc2_message_app_error_string_get(icsneoc2_message_t* message, + char* value, size_t* value_length); + #ifdef __cplusplus } #endif diff --git a/include/icsneo/icsneoc2types.h b/include/icsneo/icsneoc2types.h index b3bf15c..173b59a 100644 --- a/include/icsneo/icsneoc2types.h +++ b/include/icsneo/icsneoc2types.h @@ -465,6 +465,61 @@ typedef uint8_t icsneoc2_can_error_code_t; #define ICSNEOC2_MESSAGE_CAN_ERROR_FLAGS_ERROR_PASSIVE 0x02 // Error passive state #define ICSNEOC2_MESSAGE_CAN_ERROR_FLAGS_ERROR_WARN 0x04 // Error warning state +typedef enum _icsneoc2_app_error_type_t { + icsneoc2_app_error_type_rx_messages_full = 0, + icsneoc2_app_error_type_tx_messages_full = 1, + icsneoc2_app_error_type_tx_report_messages_full = 2, + icsneoc2_app_error_type_bad_comm_with_dsp_ic = 3, + icsneoc2_app_error_type_driver_overflow = 4, + icsneoc2_app_error_type_pc_buff_overflow = 5, + icsneoc2_app_error_type_pc_chksum_error = 6, + icsneoc2_app_error_type_pc_missed_byte = 7, + icsneoc2_app_error_type_pc_overrun_error = 8, + icsneoc2_app_error_type_setting_failure = 9, + icsneoc2_app_error_type_too_many_selected_networks = 10, + icsneoc2_app_error_type_network_not_enabled = 11, + icsneoc2_app_error_type_rtc_not_correct = 12, + icsneoc2_app_error_type_loaded_default_settings = 13, + icsneoc2_app_error_type_feature_not_unlocked = 14, + icsneoc2_app_error_type_feature_rtc_cmd_dropped = 15, + icsneoc2_app_error_type_tx_messages_flushed = 16, + icsneoc2_app_error_type_tx_messages_half_full = 17, + icsneoc2_app_error_type_network_not_valid = 18, + icsneoc2_app_error_type_tx_interface_not_implemented = 19, + icsneoc2_app_error_type_tx_messages_comm_enable_is_off = 20, + icsneoc2_app_error_type_rx_filter_match_count_exceeded = 21, + icsneoc2_app_error_type_eth_preemption_not_enabled = 22, + icsneoc2_app_error_type_tx_not_supported_in_mode = 23, + icsneoc2_app_error_type_jumbo_frames_not_supported = 24, + icsneoc2_app_error_type_ethernet_ip_fragment = 25, + icsneoc2_app_error_type_tx_messages_underrun = 26, + icsneoc2_app_error_type_device_fan_failure = 27, + icsneoc2_app_error_type_device_overtemperature = 28, + icsneoc2_app_error_type_tx_message_index_out_of_range = 29, + icsneoc2_app_error_type_undersized_frame_dropped = 30, + icsneoc2_app_error_type_oversized_frame_dropped = 31, + icsneoc2_app_error_type_watchdog_event = 32, + icsneoc2_app_error_type_system_clock_failure = 33, + icsneoc2_app_error_type_system_clock_recovered = 34, + icsneoc2_app_error_type_system_peripheral_reset = 35, + icsneoc2_app_error_type_system_communication_failure = 36, + icsneoc2_app_error_type_tx_messages_unsupported_source_or_packet_id = 37, + icsneoc2_app_error_type_wbms_manager_connect_failed = 38, + icsneoc2_app_error_type_wbms_manager_connect_bad_state = 39, + icsneoc2_app_error_type_wbms_manager_connect_timeout = 40, + icsneoc2_app_error_type_failed_to_initialize_logger_disk = 41, + icsneoc2_app_error_type_invalid_setting = 42, + icsneoc2_app_error_type_system_failure_requested_reset = 43, + icsneoc2_app_error_type_port_key_mistmatch = 45, + icsneoc2_app_error_type_bus_failure = 46, + icsneoc2_app_error_type_tap_overflow = 47, + icsneoc2_app_error_type_eth_tx_no_link = 48, + icsneoc2_app_error_type_error_buffer_overflow = 254, + icsneoc2_app_error_type_no_error = 255 +} _icsneoc2_app_error_type_t; + +typedef uint16_t icsneoc2_app_error_type_t; + typedef uint64_t icsneoc2_message_can_error_flags_t; typedef enum _icsneoc2_tc10_wake_status_t { diff --git a/test/unit/icsneoc2.cpp b/test/unit/icsneoc2.cpp index 06f6820..fa7670b 100644 --- a/test/unit/icsneoc2.cpp +++ b/test/unit/icsneoc2.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -174,6 +175,9 @@ TEST(icsneoc2, test_icsneoc2_error_invalid_parameters_and_invalid_device) ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_is_valid(NULL, NULL)); ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_is_can_error(NULL, NULL)); ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_can_error_props_get(NULL, NULL, NULL, NULL, NULL, NULL)); + ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_is_app_error(NULL, NULL)); + ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_app_error_props_get(NULL, NULL, NULL)); + ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_app_error_string_get(NULL, NULL, NULL)); // LIN message NULL parameter checks ASSERT_EQ(icsneoc2_error_invalid_parameters, icsneoc2_message_is_lin(NULL, NULL)); @@ -1223,6 +1227,51 @@ TEST(icsneoc2, test_icsneoc2_message_can_error_props_get_invalid_type_for_can_me icsneoc2_message_can_error_props_get(&message, &tx_err_count, &rx_err_count, &error_code, &data_error_code, &flags)); } +TEST(icsneoc2, test_icsneoc2_message_app_error_props_get_invalid_type_for_can_message) +{ + icsneoc2_message_t message; + message.message = std::make_shared(); + + bool is_app_error = true; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_message_is_app_error(&message, &is_app_error)); + ASSERT_FALSE(is_app_error); + + icsneoc2_app_error_type_t error_type = icsneoc2_app_error_type_no_error; + icsneoc2_netid_t error_netid = 0; + ASSERT_EQ(icsneoc2_error_invalid_type, + icsneoc2_message_app_error_props_get(&message, &error_type, &error_netid)); +} + +TEST(icsneoc2, test_icsneoc2_message_app_error_props_get) +{ + auto app_err = std::make_shared(); + app_err->errorType = icsneoc2_app_error_type_pc_buff_overflow; + app_err->errorNetID = icsneo::Network::NetID::DWCAN_01; + + icsneoc2_message_t message; + message.message = app_err; + + bool is_app_error = false; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_message_is_app_error(&message, &is_app_error)); + ASSERT_TRUE(is_app_error); + + icsneoc2_app_error_type_t error_type = icsneoc2_app_error_type_no_error; + icsneoc2_netid_t error_netid = 0; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_message_app_error_props_get(&message, &error_type, &error_netid)); + ASSERT_EQ(error_type, icsneoc2_app_error_type_pc_buff_overflow); + ASSERT_EQ(error_netid, static_cast(icsneo::Network::NetID::DWCAN_01)); + + // NULL out-params are ignored + ASSERT_EQ(icsneoc2_error_success, icsneoc2_message_app_error_props_get(&message, NULL, NULL)); + + // String getter returns the human-readable description + char buf[128] = {0}; + size_t buf_len = sizeof(buf); + ASSERT_EQ(icsneoc2_error_success, icsneoc2_message_app_error_string_get(&message, buf, &buf_len)); + ASSERT_STREQ(buf, "PC buffer overflow"); + ASSERT_EQ(buf_len, sizeof("PC buffer overflow") - 1); +} + TEST(icsneoc2, test_icsneoc2_disk_format_enums) { // Disk layout enum values @@ -1301,6 +1350,114 @@ TEST(icsneoc2, test_icsneoc2_can_error_code_t) ASSERT_EQ(sizeof(icsneoc2_message_can_error_flags_t), sizeof(uint64_t)); } +TEST(icsneoc2, test_icsneoc2_app_error_type_t) +{ + ASSERT_EQ(sizeof(icsneoc2_app_error_type_t), sizeof(uint16_t)); + + ASSERT_EQ(icsneoc2_app_error_type_rx_messages_full, 0); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_full, 1); + ASSERT_EQ(icsneoc2_app_error_type_tx_report_messages_full, 2); + ASSERT_EQ(icsneoc2_app_error_type_bad_comm_with_dsp_ic, 3); + ASSERT_EQ(icsneoc2_app_error_type_driver_overflow, 4); + ASSERT_EQ(icsneoc2_app_error_type_pc_buff_overflow, 5); + ASSERT_EQ(icsneoc2_app_error_type_pc_chksum_error, 6); + ASSERT_EQ(icsneoc2_app_error_type_pc_missed_byte, 7); + ASSERT_EQ(icsneoc2_app_error_type_pc_overrun_error, 8); + ASSERT_EQ(icsneoc2_app_error_type_setting_failure, 9); + ASSERT_EQ(icsneoc2_app_error_type_too_many_selected_networks, 10); + ASSERT_EQ(icsneoc2_app_error_type_network_not_enabled, 11); + ASSERT_EQ(icsneoc2_app_error_type_rtc_not_correct, 12); + ASSERT_EQ(icsneoc2_app_error_type_loaded_default_settings, 13); + ASSERT_EQ(icsneoc2_app_error_type_feature_not_unlocked, 14); + ASSERT_EQ(icsneoc2_app_error_type_feature_rtc_cmd_dropped, 15); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_flushed, 16); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_half_full, 17); + ASSERT_EQ(icsneoc2_app_error_type_network_not_valid, 18); + ASSERT_EQ(icsneoc2_app_error_type_tx_interface_not_implemented, 19); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_comm_enable_is_off, 20); + ASSERT_EQ(icsneoc2_app_error_type_rx_filter_match_count_exceeded, 21); + ASSERT_EQ(icsneoc2_app_error_type_eth_preemption_not_enabled, 22); + ASSERT_EQ(icsneoc2_app_error_type_tx_not_supported_in_mode, 23); + ASSERT_EQ(icsneoc2_app_error_type_jumbo_frames_not_supported, 24); + ASSERT_EQ(icsneoc2_app_error_type_ethernet_ip_fragment, 25); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_underrun, 26); + ASSERT_EQ(icsneoc2_app_error_type_device_fan_failure, 27); + ASSERT_EQ(icsneoc2_app_error_type_device_overtemperature, 28); + ASSERT_EQ(icsneoc2_app_error_type_tx_message_index_out_of_range, 29); + ASSERT_EQ(icsneoc2_app_error_type_undersized_frame_dropped, 30); + ASSERT_EQ(icsneoc2_app_error_type_oversized_frame_dropped, 31); + ASSERT_EQ(icsneoc2_app_error_type_watchdog_event, 32); + ASSERT_EQ(icsneoc2_app_error_type_system_clock_failure, 33); + ASSERT_EQ(icsneoc2_app_error_type_system_clock_recovered, 34); + ASSERT_EQ(icsneoc2_app_error_type_system_peripheral_reset, 35); + ASSERT_EQ(icsneoc2_app_error_type_system_communication_failure, 36); + ASSERT_EQ(icsneoc2_app_error_type_tx_messages_unsupported_source_or_packet_id, 37); + ASSERT_EQ(icsneoc2_app_error_type_wbms_manager_connect_failed, 38); + ASSERT_EQ(icsneoc2_app_error_type_wbms_manager_connect_bad_state, 39); + ASSERT_EQ(icsneoc2_app_error_type_wbms_manager_connect_timeout, 40); + ASSERT_EQ(icsneoc2_app_error_type_failed_to_initialize_logger_disk, 41); + ASSERT_EQ(icsneoc2_app_error_type_invalid_setting, 42); + ASSERT_EQ(icsneoc2_app_error_type_system_failure_requested_reset, 43); + ASSERT_EQ(icsneoc2_app_error_type_port_key_mistmatch, 45); + ASSERT_EQ(icsneoc2_app_error_type_bus_failure, 46); + ASSERT_EQ(icsneoc2_app_error_type_tap_overflow, 47); + ASSERT_EQ(icsneoc2_app_error_type_eth_tx_no_link, 48); + ASSERT_EQ(icsneoc2_app_error_type_error_buffer_overflow, 254); + ASSERT_EQ(icsneoc2_app_error_type_no_error, 255); + + using _T = icsneo::AppErrorType; + ASSERT_EQ(static_cast(_T::AppErrorRxMessagesFull), icsneoc2_app_error_type_rx_messages_full); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesFull), icsneoc2_app_error_type_tx_messages_full); + ASSERT_EQ(static_cast(_T::AppErrorTxReportMessagesFull), icsneoc2_app_error_type_tx_report_messages_full); + ASSERT_EQ(static_cast(_T::AppErrorBadCommWithDspIC), icsneoc2_app_error_type_bad_comm_with_dsp_ic); + ASSERT_EQ(static_cast(_T::AppErrorDriverOverflow), icsneoc2_app_error_type_driver_overflow); + ASSERT_EQ(static_cast(_T::AppErrorPCBuffOverflow), icsneoc2_app_error_type_pc_buff_overflow); + ASSERT_EQ(static_cast(_T::AppErrorPCChksumError), icsneoc2_app_error_type_pc_chksum_error); + ASSERT_EQ(static_cast(_T::AppErrorPCMissedByte), icsneoc2_app_error_type_pc_missed_byte); + ASSERT_EQ(static_cast(_T::AppErrorPCOverrunError), icsneoc2_app_error_type_pc_overrun_error); + ASSERT_EQ(static_cast(_T::AppErrorSettingFailure), icsneoc2_app_error_type_setting_failure); + ASSERT_EQ(static_cast(_T::AppErrorTooManySelectedNetworks), icsneoc2_app_error_type_too_many_selected_networks); + ASSERT_EQ(static_cast(_T::AppErrorNetworkNotEnabled), icsneoc2_app_error_type_network_not_enabled); + ASSERT_EQ(static_cast(_T::AppErrorRtcNotCorrect), icsneoc2_app_error_type_rtc_not_correct); + ASSERT_EQ(static_cast(_T::AppErrorLoadedDefaultSettings), icsneoc2_app_error_type_loaded_default_settings); + ASSERT_EQ(static_cast(_T::AppErrorFeatureNotUnlocked), icsneoc2_app_error_type_feature_not_unlocked); + ASSERT_EQ(static_cast(_T::AppErrorFeatureRtcCmdDropped), icsneoc2_app_error_type_feature_rtc_cmd_dropped); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesFlushed), icsneoc2_app_error_type_tx_messages_flushed); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesHalfFull), icsneoc2_app_error_type_tx_messages_half_full); + ASSERT_EQ(static_cast(_T::AppErrorNetworkNotValid), icsneoc2_app_error_type_network_not_valid); + ASSERT_EQ(static_cast(_T::AppErrorTxInterfaceNotImplemented), icsneoc2_app_error_type_tx_interface_not_implemented); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesCommEnableIsOff), icsneoc2_app_error_type_tx_messages_comm_enable_is_off); + ASSERT_EQ(static_cast(_T::AppErrorRxFilterMatchCountExceeded), icsneoc2_app_error_type_rx_filter_match_count_exceeded); + ASSERT_EQ(static_cast(_T::AppErrorEthPreemptionNotEnabled), icsneoc2_app_error_type_eth_preemption_not_enabled); + ASSERT_EQ(static_cast(_T::AppErrorTxNotSupportedInMode), icsneoc2_app_error_type_tx_not_supported_in_mode); + ASSERT_EQ(static_cast(_T::AppErrorJumboFramesNotSupported), icsneoc2_app_error_type_jumbo_frames_not_supported); + ASSERT_EQ(static_cast(_T::AppErrorEthernetIpFragment), icsneoc2_app_error_type_ethernet_ip_fragment); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesUnderrun), icsneoc2_app_error_type_tx_messages_underrun); + ASSERT_EQ(static_cast(_T::AppErrorDeviceFanFailure), icsneoc2_app_error_type_device_fan_failure); + ASSERT_EQ(static_cast(_T::AppErrorDeviceOvertemperature), icsneoc2_app_error_type_device_overtemperature); + ASSERT_EQ(static_cast(_T::AppErrorTxMessageIndexOutOfRange), icsneoc2_app_error_type_tx_message_index_out_of_range); + ASSERT_EQ(static_cast(_T::AppErrorUndersizedFrameDropped), icsneoc2_app_error_type_undersized_frame_dropped); + ASSERT_EQ(static_cast(_T::AppErrorOversizedFrameDropped), icsneoc2_app_error_type_oversized_frame_dropped); + ASSERT_EQ(static_cast(_T::AppErrorWatchdogEvent), icsneoc2_app_error_type_watchdog_event); + ASSERT_EQ(static_cast(_T::AppErrorSystemClockFailure), icsneoc2_app_error_type_system_clock_failure); + ASSERT_EQ(static_cast(_T::AppErrorSystemClockRecovered), icsneoc2_app_error_type_system_clock_recovered); + ASSERT_EQ(static_cast(_T::AppErrorSystemPeripheralReset), icsneoc2_app_error_type_system_peripheral_reset); + ASSERT_EQ(static_cast(_T::AppErrorSystemCommunicationFailure), icsneoc2_app_error_type_system_communication_failure); + ASSERT_EQ(static_cast(_T::AppErrorTxMessagesUnsupportedSourceOrPacketId), icsneoc2_app_error_type_tx_messages_unsupported_source_or_packet_id); + ASSERT_EQ(static_cast(_T::AppErrorWbmsManagerConnectFailed), icsneoc2_app_error_type_wbms_manager_connect_failed); + ASSERT_EQ(static_cast(_T::AppErrorWbmsManagerConnectBadState), icsneoc2_app_error_type_wbms_manager_connect_bad_state); + ASSERT_EQ(static_cast(_T::AppErrorWbmsManagerConnectTimeout), icsneoc2_app_error_type_wbms_manager_connect_timeout); + ASSERT_EQ(static_cast(_T::AppErrorFailedToInitializeLoggerDisk), icsneoc2_app_error_type_failed_to_initialize_logger_disk); + ASSERT_EQ(static_cast(_T::AppErrorInvalidSetting), icsneoc2_app_error_type_invalid_setting); + ASSERT_EQ(static_cast(_T::AppErrorSystemFailureRequestedReset), icsneoc2_app_error_type_system_failure_requested_reset); + ASSERT_EQ(static_cast(_T::AppErrorPortKeyMistmatch), icsneoc2_app_error_type_port_key_mistmatch); + ASSERT_EQ(static_cast(_T::AppErrorBusFailure), icsneoc2_app_error_type_bus_failure); + ASSERT_EQ(static_cast(_T::AppErrorTapOverflow), icsneoc2_app_error_type_tap_overflow); + ASSERT_EQ(static_cast(_T::AppErrorEthTxNoLink), icsneoc2_app_error_type_eth_tx_no_link); + ASSERT_EQ(static_cast(_T::AppErrorErrorBufferOverflow), icsneoc2_app_error_type_error_buffer_overflow); + ASSERT_EQ(static_cast(_T::AppNoError), icsneoc2_app_error_type_no_error); +} + TEST(icsneoc2, test_icsneoc2_message_can_flags_t) { ASSERT_EQ(ICSNEOC2_MESSAGE_CAN_FLAGS_RTR, 0x01);