fixed messages

David Rebbe 2024-12-03 21:39:47 -05:00
parent fde2f670b5
commit 63fd8c2f3a
3 changed files with 32 additions and 14 deletions

View File

@ -2,14 +2,20 @@
#include <icsneo/device/device.h> #include <icsneo/device/device.h>
#include "icsneo/device/devicefinder.h" #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 <string> #include <string>
#include <deque> #include <vector>
#include <algorithm> #include <algorithm>
using namespace icsneo; using namespace icsneo;
typedef struct icsneo_device_t { typedef struct icsneo_device_t {
std::shared_ptr<Device> device; std::shared_ptr<Device> device;
std::vector<std::shared_ptr<icsneo_message_t>> messages;
icsneo_open_options_t options; icsneo_open_options_t options;
} icsneo_device_t; } icsneo_device_t;
@ -19,8 +25,7 @@ typedef struct icsneo_message_t {
} icsneo_message_t; } icsneo_message_t;
static std::deque<std::shared_ptr<icsneo_device_t>> g_devices; static std::vector<std::shared_ptr<icsneo_device_t>> g_devices;
static std::deque<std::shared_ptr<icsneo_message_t>> g_messages;
ICSNEO_API icsneo_error_t icsneo_error_code(icsneo_error_t error_code, const char* value, uint32_t* value_length) { ICSNEO_API icsneo_error_t icsneo_error_code(icsneo_error_t error_code, const char* value, uint32_t* value_length) {
if (!value || !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; return icsneo_error_success;
} }
dev->close(); dev->close();
// Clear out old messages
device->messages.clear();
return icsneo_error_success; 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; *messages_count = min_size;
// Copy the messages into our global message container // Copy the messages into our global message container
g_messages.clear(); device->messages.clear();
for (auto& message : queried_messages) { for (auto& message : queried_messages) {
auto message_t = std::make_shared<icsneo_message_t>(); auto message_t = std::make_shared<icsneo_message_t>();
message_t->message = message; message_t->message = message;
g_messages.push_back(message_t); device->messages.push_back(message_t);
} }
// Copy the messages into the output array // Copy the messages into the output array
for (uint32_t i = 0; i < min_size; i++) { 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; 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) { if (!message || !is_valid) {
return icsneo_error_invalid_parameters; 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; return msg->message == message->message;
}) == g_messages.end(); }) == device->messages.end();
return icsneo_error_success; 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) { if (!message || !type) {
return icsneo_error_invalid_parameters; 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<CANMessage*>(message->message.get())) {
return 100;
} else if (dynamic_cast<LINMessage*>(message->message.get())) {
return 200;
} else if (dynamic_cast<EthernetMessage*>(message->message.get())) {
return 300;
} else {
return 999;
}
return icsneo_error_success; return icsneo_error_success;
} }

View File

@ -100,6 +100,7 @@ int main(int argc, char* argv[]) {
icsneo_message_t* messages[20000] = {0}; icsneo_message_t* messages[20000] = {0};
uint32_t message_count = 20000; 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); res = icsneo_get_messages(device, messages, &message_count, 3000);
if (res != icsneo_error_success) { if (res != icsneo_error_success) {
return print_error_code("Failed to get messages from device", res); 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++) { for (uint32_t i = 0; i < message_count; i++) {
icsneo_message_t* message = messages[i]; icsneo_message_t* message = messages[i];
uint32_t type = 0; uint32_t type = 0;
res = icsneo_message_get_type(message, &type); res = icsneo_message_get_type(device, message, &type);
if (res != icsneo_error_success) { if (res != icsneo_error_success) {
return print_error_code("Failed to get message type", res); return print_error_code("Failed to get message type", res);
} }

View File

@ -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 /** @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[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. * @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. * @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 #ifdef __cplusplus
} }