From 18f043a62e137b5924521752b15715d5872076b1 Mon Sep 17 00:00:00 2001 From: Tony Miceli <6946957+wasabinator@users.noreply.github.com> Date: Tue, 21 Apr 2026 00:35:36 +1000 Subject: [PATCH] Fix multiple serial device init issues (#43) --- src/monocoque/devices/serial/moza.c | 6 ++- src/monocoque/devices/serial/moza_new.c | 16 +++--- src/monocoque/devices/serialadapter.c | 70 +++++++++++-------------- src/monocoque/helper/confighelper.c | 2 +- src/monocoque/simulatorapi/simapi | 2 +- 5 files changed, 47 insertions(+), 49 deletions(-) diff --git a/src/monocoque/devices/serial/moza.c b/src/monocoque/devices/serial/moza.c index 4aba2a2..b2f38bb 100644 --- a/src/monocoque/devices/serial/moza.c +++ b/src/monocoque/devices/serial/moza.c @@ -84,6 +84,8 @@ int moza_update(SerialDevice* serialdevice, unsigned short rpm, unsigned short m int moza_init(SerialDevice* serialdevice, const char* portdev) { - serialdevice->id = monocoque_serial_open(serialdevice, portdev); - return serialdevice->id; + int id = monocoque_serial_open(serialdevice, portdev); + if (id < 0) return id; + serialdevice->id = id; + return 0; } diff --git a/src/monocoque/devices/serial/moza_new.c b/src/monocoque/devices/serial/moza_new.c index 8ec0f80..4d7a245 100644 --- a/src/monocoque/devices/serial/moza_new.c +++ b/src/monocoque/devices/serial/moza_new.c @@ -74,8 +74,9 @@ int moza_new_update(SerialDevice* serialdevice, SimData* simData) int moza_new_init(SerialDevice* serialdevice, const char* portdev) { - serialdevice->id = monocoque_serial_open(serialdevice, portdev); - if (serialdevice->id == -1) return serialdevice->id; + int id = monocoque_serial_open(serialdevice, portdev); + if (id < 0) return id; + serialdevice->id = id; unsigned char p1[] = MOZA_RPM_COLOR_PAYLOAD_1; unsigned char p2[] = MOZA_RPM_COLOR_PAYLOAD_2; @@ -87,10 +88,11 @@ int moza_new_init(SerialDevice* serialdevice, const char* portdev) p3[MOZA_COLOR_PAYLOAD_SIZE-1] = moza_checksum(p3, MOZA_COLOR_PAYLOAD_SIZE); p4[MOZA_COLOR_PAYLOAD_SIZE-1] = moza_checksum(p4, MOZA_COLOR_PAYLOAD_SIZE); - monocoque_serial_write(serialdevice->id, p1, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); - monocoque_serial_write(serialdevice->id, p2, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); - monocoque_serial_write(serialdevice->id, p3, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); - monocoque_serial_write(serialdevice->id, p4, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); + unsigned char* payloads[] = {p1, p2, p3, p4}; + for (int i = 0; i < 4; i++) { + int result = monocoque_serial_write(serialdevice->id, payloads[i], MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); + if (result < 0) return result; + } - return serialdevice->id; + return 0; } diff --git a/src/monocoque/devices/serialadapter.c b/src/monocoque/devices/serialadapter.c index d092ba7..45a7c32 100644 --- a/src/monocoque/devices/serialadapter.c +++ b/src/monocoque/devices/serialadapter.c @@ -27,10 +27,13 @@ int check(enum sp_return result) error_message = sp_last_error_message(); sloge("error: serial write failed: %s", error_message); sp_free_error_message(error_message); + return result; case SP_ERR_SUPP: printf("Error: Not supported.\n"); + return result; case SP_ERR_MEM: printf("Error: Couldn't allocate memory.\n"); + return result; case SP_OK: default: return result; @@ -114,23 +117,30 @@ int monocoque_input_wait(uint8_t serialdevicenum) return sp_input_waiting(monocoque_serial_dev.port); } -int monocoque_serial_write(uint8_t serialdevicenum, void* data, size_t size, int timeout) +// Helper function to get and validate device +static monocoque_serial_device* monocoque_get_serial_device(uint8_t serialdevicenum) { + monocoque_serial_device* dev = &monocoque_serial_devices[serialdevicenum]; slogt("serial device id %i", serialdevicenum); - monocoque_serial_device monocoque_serial_dev = monocoque_serial_devices[serialdevicenum]; - - slogt("port name: %s, busy %i, open %i, openfail %i", monocoque_serial_dev.portname, monocoque_serial_dev.busy, monocoque_serial_dev.open, monocoque_serial_dev.busy); - - if(monocoque_serial_dev.port == NULL) + slogt("port name: %s, busy %i, open %i, openfail %i", dev->portname, dev->busy, dev->open, dev->openfail); + + if(dev->port == NULL) { sloge("port is null"); } + + return dev; +} + +int monocoque_serial_write(uint8_t serialdevicenum, void* data, size_t size, int timeout) +{ + monocoque_serial_device* dev = monocoque_get_serial_device(serialdevicenum); int result = -1; - if(monocoque_serial_dev.busy == false && monocoque_serial_dev.open == true) + if(dev->busy == false && dev->open == true) { - monocoque_serial_dev.busy = true; - result = sp_blocking_write(monocoque_serial_dev.port, data, size, timeout); + dev->busy = true; + result = sp_blocking_write(dev->port, data, size, timeout); } else { @@ -138,67 +148,51 @@ int monocoque_serial_write(uint8_t serialdevicenum, void* data, size_t size, int result = -1; } slogt("write result is %i", result); - monocoque_serial_dev.busy = false; + dev->busy = false; return result; } int monocoque_serial_write_block(uint8_t serialdevicenum, void* data, size_t size, int timeout) { - slogt("serial device id %i", serialdevicenum); - monocoque_serial_device monocoque_serial_dev = monocoque_serial_devices[serialdevicenum]; - - slogt("port name: %s, busy %i, open %i, openfail %i", monocoque_serial_dev.portname, monocoque_serial_dev.busy, monocoque_serial_dev.open, monocoque_serial_dev.busy); - - if(monocoque_serial_dev.port == NULL) - { - sloge("port is null"); - } + monocoque_serial_device* dev = monocoque_get_serial_device(serialdevicenum); int result = -1; - if(monocoque_serial_dev.open == true) + if(dev->open == true) { - while(monocoque_serial_dev.busy == true) + while(dev->busy == true) { slogt("hopefully this doesn't happen long"); continue; } - monocoque_serial_dev.busy = true; - result = sp_blocking_write(monocoque_serial_dev.port, data, size, timeout); + dev->busy = true; + result = sp_blocking_write(dev->port, data, size, timeout); slogi("actually performed write"); } - monocoque_serial_dev.busy = false; + dev->busy = false; return result; } int monocoque_serial_read_block(uint8_t serialdevicenum, void* data, size_t size, int timeout) { - slogt("serial device id %i", serialdevicenum); - monocoque_serial_device monocoque_serial_dev = monocoque_serial_devices[serialdevicenum]; - - slogt("port name: %s, busy %i, open %i, openfail %i", monocoque_serial_dev.portname, monocoque_serial_dev.busy, monocoque_serial_dev.open, monocoque_serial_dev.busy); - - if(monocoque_serial_dev.port == NULL) - { - sloge("port is null"); - } + monocoque_serial_device* dev = monocoque_get_serial_device(serialdevicenum); int result = -1; - if(monocoque_serial_dev.open == true) + if(dev->open == true) { - while(monocoque_serial_dev.busy == true) + while(dev->busy == true) { slogt("hopefully this doesn't happen long"); continue; } - monocoque_serial_dev.busy = true; - result = sp_blocking_read(monocoque_serial_dev.port, data, size, timeout); + dev->busy = true; + result = sp_blocking_read(dev->port, data, size, timeout); slogi("actually performed read"); } - monocoque_serial_dev.busy = false; + dev->busy = false; return result; } diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index 4ce9c57..d55aad1 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -720,7 +720,7 @@ int devsetup(const char* device_type, const char* device_subtype, const char* co } } - if (ds->dev_subtype == SIMDEVTYPE_USBHAPTIC || ds->dev_subtype == SIMDEVTYPE_USBWHEEL) + if (ds->dev_subtype == SIMDEVTYPE_USBHAPTIC || ds->dev_subtype == SIMDEVTYPE_USBWHEEL || ds->dev_subtype == SIMDEVTYPE_SERIALWHEEL) { // logic for different devices int b = 0; diff --git a/src/monocoque/simulatorapi/simapi b/src/monocoque/simulatorapi/simapi index 1c0b788..532e89a 160000 --- a/src/monocoque/simulatorapi/simapi +++ b/src/monocoque/simulatorapi/simapi @@ -1 +1 @@ -Subproject commit 1c0b788adb10aaa10c6a5bd63fdeb5811e8ab1ca +Subproject commit 532e89a6d9edf026335c1ac29da60aa965616241