From a7738f192fad9c40e2d491da4c4412bb4a1cd9ed Mon Sep 17 00:00:00 2001 From: David Rebbe Date: Wed, 4 Dec 2024 00:24:26 -0500 Subject: [PATCH] added icsneo_message_get_type and icsneo_message_get_bus_type --- api/icsneo/icsneo.cpp | 37 +++++++++++++++++++++++++------------ include/icsneo/icsneo.h | 26 +++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/api/icsneo/icsneo.cpp b/api/icsneo/icsneo.cpp index 99aaf6b..5e777c2 100644 --- a/api/icsneo/icsneo.cpp +++ b/api/icsneo/icsneo.cpp @@ -327,6 +327,7 @@ ICSNEO_API icsneo_error_t icsneo_get_messages(icsneo_device_t* device, icsneo_me if (!device || !messages || !messages_count) { return icsneo_error_invalid_parameters; } + // TODO: Check if device is valid auto dev = device->device; // Wait for messages auto start_time = std::chrono::steady_clock::now(); @@ -366,9 +367,10 @@ ICSNEO_API icsneo_error_t icsneo_get_messages(icsneo_device_t* device, icsneo_me } ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_device_t* device, icsneo_message_t* message, bool* is_valid) { - if (!message || !is_valid) { + if (!device || !message || !is_valid) { return icsneo_error_invalid_parameters; } + // TODO: Check if device is valid *is_valid = std::find_if(device->messages.begin(), device->messages.end(), [&](const auto& msg) { return msg->message == message->message; }) == device->messages.end(); @@ -376,20 +378,31 @@ ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_device_t* device, icsne return icsneo_error_success; } -ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, uint32_t* type) { - if (!message || !type) { +ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, icsneo_msg_type_t* msg_type) { + if (!device || !message || !msg_type) { return icsneo_error_invalid_parameters; } - // TODO: Fix this in the core so we actually get the message type from the message - if (dynamic_cast(message->message.get())) { - return 100; - } else if (dynamic_cast(message->message.get())) { - return 200; - } else if (dynamic_cast(message->message.get())) { - return 300; - } else { - return 999; + // TODO: Check if message is valid + + // Assign the message type + *msg_type = message->message->getMsgType(); + + return icsneo_error_success; +} + +ICSNEO_API icsneo_error_t icsneo_message_get_bus_type(icsneo_device_t* device, icsneo_message_t* message, icsneo_msg_bus_type_t* bus_type) { + if (!device || !message || !bus_type) { + return icsneo_error_invalid_parameters; } + // TODO: Check if message is valid + + // Make sure the message is a bus message + if (message->message->getMsgType() != icsneo_msg_type_bus) { + return icsneo_error_invalid_type; + } + // We can static cast here because we are relying on the type being correct at this point + auto bus_message = static_cast(message->message.get()); + *bus_type = bus_message->getBusType(); return icsneo_error_success; } diff --git a/include/icsneo/icsneo.h b/include/icsneo/icsneo.h index a3741ac..b2f444c 100644 --- a/include/icsneo/icsneo.h +++ b/include/icsneo/icsneo.h @@ -65,6 +65,8 @@ typedef enum _icsneo_error_t { icsneo_error_sync_rtc_failed, // Error getting messages. icsneo_error_get_messages_failed, + // Generic invalid type error + icsneo_error_invalid_type, } _icsneo_error_t; /** @brief Integer representation of _icsneo_error_t enum. @@ -286,7 +288,29 @@ ICSNEO_API icsneo_error_t icsneo_get_messages(icsneo_device_t* device, icsneo_me */ ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_device_t* device, icsneo_message_t* message, bool* is_valid); -ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, uint32_t* type); +/** @brief Get the type of a message + * + * @param[in] icsneo_device_t* device The device to check against. + * @param[in] icsneo_message_t* message The message to check. + * @param[out] icsneo_msg_type_t* msg_type Pointer to a icsneo_msg_type_t to copy the type of the value into. + * + * @return icsneo_error_t icsneo_error_success if successful, icsneo_error_invalid_parameters otherwise. + * + * @see icsneo_msg_type_t + */ +ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, icsneo_msg_type_t* msg_type); + +/** @brief Get the type of a bus message + * + * @param[in] icsneo_device_t* device The device to check against. + * @param[in] icsneo_message_t* message The message to check. + * @param[out] icsneo_msg_type_t* msg_type Pointer to a icsneo_msg_type_t to copy the type of the value into. + * + * @return icsneo_error_t icsneo_error_success if successful, icsneo_error_invalid_parameters or icsneo_error_invalid_type otherwise. + * + * @see icsneo_msg_bus_type_t + */ +ICSNEO_API icsneo_error_t icsneo_message_get_bus_type(icsneo_device_t* device, icsneo_message_t* message, icsneo_msg_bus_type_t* bus_type); #ifdef __cplusplus }