Fix multiple serial device init issues (#43)

This commit is contained in:
Tony Miceli 2026-04-21 00:35:36 +10:00 committed by GitHub
parent fddbf726d7
commit 18f043a62e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 47 additions and 49 deletions

View File

@ -84,6 +84,8 @@ int moza_update(SerialDevice* serialdevice, unsigned short rpm, unsigned short m
int moza_init(SerialDevice* serialdevice, const char* portdev) int moza_init(SerialDevice* serialdevice, const char* portdev)
{ {
serialdevice->id = monocoque_serial_open(serialdevice, portdev); int id = monocoque_serial_open(serialdevice, portdev);
return serialdevice->id; if (id < 0) return id;
serialdevice->id = id;
return 0;
} }

View File

@ -74,8 +74,9 @@ int moza_new_update(SerialDevice* serialdevice, SimData* simData)
int moza_new_init(SerialDevice* serialdevice, const char* portdev) int moza_new_init(SerialDevice* serialdevice, const char* portdev)
{ {
serialdevice->id = monocoque_serial_open(serialdevice, portdev); int id = monocoque_serial_open(serialdevice, portdev);
if (serialdevice->id == -1) return serialdevice->id; if (id < 0) return id;
serialdevice->id = id;
unsigned char p1[] = MOZA_RPM_COLOR_PAYLOAD_1; unsigned char p1[] = MOZA_RPM_COLOR_PAYLOAD_1;
unsigned char p2[] = MOZA_RPM_COLOR_PAYLOAD_2; 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); 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); 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); unsigned char* payloads[] = {p1, p2, p3, p4};
monocoque_serial_write(serialdevice->id, p2, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); for (int i = 0; i < 4; i++) {
monocoque_serial_write(serialdevice->id, p3, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); int result = monocoque_serial_write(serialdevice->id, payloads[i], MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT);
monocoque_serial_write(serialdevice->id, p4, MOZA_COLOR_PAYLOAD_SIZE, MOZA_TIMEOUT); if (result < 0) return result;
}
return serialdevice->id;
return 0;
} }

View File

@ -27,10 +27,13 @@ int check(enum sp_return result)
error_message = sp_last_error_message(); error_message = sp_last_error_message();
sloge("error: serial write failed: %s", error_message); sloge("error: serial write failed: %s", error_message);
sp_free_error_message(error_message); sp_free_error_message(error_message);
return result;
case SP_ERR_SUPP: case SP_ERR_SUPP:
printf("Error: Not supported.\n"); printf("Error: Not supported.\n");
return result;
case SP_ERR_MEM: case SP_ERR_MEM:
printf("Error: Couldn't allocate memory.\n"); printf("Error: Couldn't allocate memory.\n");
return result;
case SP_OK: case SP_OK:
default: default:
return result; return result;
@ -114,23 +117,30 @@ int monocoque_input_wait(uint8_t serialdevicenum)
return sp_input_waiting(monocoque_serial_dev.port); 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); 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", dev->portname, dev->busy, dev->open, dev->openfail);
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(dev->port == NULL)
if(monocoque_serial_dev.port == NULL)
{ {
sloge("port is null"); sloge("port is null");
} }
int result = -1; return dev;
if(monocoque_serial_dev.busy == false && monocoque_serial_dev.open == true) }
int monocoque_serial_write(uint8_t serialdevicenum, void* data, size_t size, int timeout)
{ {
monocoque_serial_dev.busy = true; monocoque_serial_device* dev = monocoque_get_serial_device(serialdevicenum);
result = sp_blocking_write(monocoque_serial_dev.port, data, size, timeout);
int result = -1;
if(dev->busy == false && dev->open == true)
{
dev->busy = true;
result = sp_blocking_write(dev->port, data, size, timeout);
} }
else else
{ {
@ -138,67 +148,51 @@ int monocoque_serial_write(uint8_t serialdevicenum, void* data, size_t size, int
result = -1; result = -1;
} }
slogt("write result is %i", result); slogt("write result is %i", result);
monocoque_serial_dev.busy = false; dev->busy = false;
return result; return result;
} }
int monocoque_serial_write_block(uint8_t serialdevicenum, void* data, size_t size, int timeout) int monocoque_serial_write_block(uint8_t serialdevicenum, void* data, size_t size, int timeout)
{ {
slogt("serial device id %i", serialdevicenum); monocoque_serial_device* dev = monocoque_get_serial_device(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");
}
int result = -1; 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"); slogt("hopefully this doesn't happen long");
continue; continue;
} }
monocoque_serial_dev.busy = true; dev->busy = true;
result = sp_blocking_write(monocoque_serial_dev.port, data, size, timeout); result = sp_blocking_write(dev->port, data, size, timeout);
slogi("actually performed write"); slogi("actually performed write");
} }
monocoque_serial_dev.busy = false; dev->busy = false;
return result; return result;
} }
int monocoque_serial_read_block(uint8_t serialdevicenum, void* data, size_t size, int timeout) int monocoque_serial_read_block(uint8_t serialdevicenum, void* data, size_t size, int timeout)
{ {
slogt("serial device id %i", serialdevicenum); monocoque_serial_device* dev = monocoque_get_serial_device(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");
}
int result = -1; 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"); slogt("hopefully this doesn't happen long");
continue; continue;
} }
monocoque_serial_dev.busy = true; dev->busy = true;
result = sp_blocking_read(monocoque_serial_dev.port, data, size, timeout); result = sp_blocking_read(dev->port, data, size, timeout);
slogi("actually performed read"); slogi("actually performed read");
} }
monocoque_serial_dev.busy = false; dev->busy = false;
return result; return result;
} }

View File

@ -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 // logic for different devices
int b = 0; int b = 0;

@ -1 +1 @@
Subproject commit 1c0b788adb10aaa10c6a5bd63fdeb5811e8ab1ca Subproject commit 532e89a6d9edf026335c1ac29da60aa965616241