From 63fd8c2f3afdaf251ead45a160145f122e35eced Mon Sep 17 00:00:00 2001 From: David Rebbe Date: Tue, 3 Dec 2024 21:39:47 -0500 Subject: [PATCH] fixed messages --- api/icsneo/icsneo.cpp | 38 +++++++++++++++++++++++++----------- examples/c/simple/src/main.c | 3 ++- include/icsneo/icsneo.h | 5 +++-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/api/icsneo/icsneo.cpp b/api/icsneo/icsneo.cpp index 0466c71..99aaf6b 100644 --- a/api/icsneo/icsneo.cpp +++ b/api/icsneo/icsneo.cpp @@ -2,14 +2,20 @@ #include #include "icsneo/device/devicefinder.h" +#include "icsneo/communication/message/message.h" +#include "icsneo/communication/message/canmessage.h" +#include "icsneo/communication/message/linmessage.h" +#include "icsneo/communication/message/ethernetmessage.h" + #include -#include +#include #include using namespace icsneo; typedef struct icsneo_device_t { std::shared_ptr device; + std::vector> messages; icsneo_open_options_t options; } icsneo_device_t; @@ -19,8 +25,7 @@ typedef struct icsneo_message_t { } icsneo_message_t; -static std::deque> g_devices; -static std::deque> g_messages; +static std::vector> g_devices; ICSNEO_API icsneo_error_t icsneo_error_code(icsneo_error_t error_code, const char* value, uint32_t* value_length) { if (!value || !value_length) { @@ -180,6 +185,8 @@ ICSNEO_API icsneo_error_t icsneo_close(icsneo_device_t* device) { return icsneo_error_success; } dev->close(); + // Clear out old messages + device->messages.clear(); return icsneo_error_success; } @@ -343,37 +350,46 @@ ICSNEO_API icsneo_error_t icsneo_get_messages(icsneo_device_t* device, icsneo_me *messages_count = min_size; // Copy the messages into our global message container - g_messages.clear(); + device->messages.clear(); for (auto& message : queried_messages) { auto message_t = std::make_shared(); message_t->message = message; - g_messages.push_back(message_t); + device->messages.push_back(message_t); } // Copy the messages into the output array for (uint32_t i = 0; i < min_size; i++) { - messages[i] = g_messages[i].get(); + messages[i] = device->messages[i].get(); } return icsneo_error_success; } -ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_message_t* message, bool* is_valid) { +ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_device_t* device, icsneo_message_t* message, bool* is_valid) { if (!message || !is_valid) { return icsneo_error_invalid_parameters; } - *is_valid = std::find_if(g_messages.begin(), g_messages.end(), [&](const auto& msg) { + *is_valid = std::find_if(device->messages.begin(), device->messages.end(), [&](const auto& msg) { return msg->message == message->message; - }) == g_messages.end(); + }) == device->messages.end(); return icsneo_error_success; } -ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_message_t* message, uint32_t* type) { +ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, uint32_t* type) { if (!message || !type) { return icsneo_error_invalid_parameters; } - *type = (uint32_t)message->message->type; + // 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; + } return icsneo_error_success; } diff --git a/examples/c/simple/src/main.c b/examples/c/simple/src/main.c index 713ad94..c38c924 100644 --- a/examples/c/simple/src/main.c +++ b/examples/c/simple/src/main.c @@ -100,6 +100,7 @@ int main(int argc, char* argv[]) { icsneo_message_t* messages[20000] = {0}; uint32_t message_count = 20000; + printf("Getting messages from device with timeout of 3000ms on %s...\n", description); res = icsneo_get_messages(device, messages, &message_count, 3000); if (res != icsneo_error_success) { return print_error_code("Failed to get messages from device", res); @@ -109,7 +110,7 @@ int main(int argc, char* argv[]) { for (uint32_t i = 0; i < message_count; i++) { icsneo_message_t* message = messages[i]; uint32_t type = 0; - res = icsneo_message_get_type(message, &type); + res = icsneo_message_get_type(device, message, &type); if (res != icsneo_error_success) { return print_error_code("Failed to get message type", res); } diff --git a/include/icsneo/icsneo.h b/include/icsneo/icsneo.h index 488cc07..a3741ac 100644 --- a/include/icsneo/icsneo.h +++ b/include/icsneo/icsneo.h @@ -278,14 +278,15 @@ ICSNEO_API icsneo_error_t icsneo_get_messages(icsneo_device_t* device, icsneo_me /** @brief Check if a message is valid * + * @param[in] icsneo_device_t* device The device to check against. * @param[in] icsneo_message_t* message The message to check. * @param[out] bool* is_valid Pointer to a bool to copy the validity of the message into. * * @return icsneo_error_t icsneo_error_success if successful, icsneo_error_invalid_parameters otherwise. */ -ICSNEO_API icsneo_error_t icsneo_is_message_valid(icsneo_message_t* message, bool* is_valid); +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_message_t* message, uint32_t* type); +ICSNEO_API icsneo_error_t icsneo_message_get_type(icsneo_device_t* device, icsneo_message_t* message, uint32_t* type); #ifdef __cplusplus }