From b01ceb6b0bc856a2a0169693116a6fecad9d788e Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 11:38:34 +0300 Subject: [PATCH 1/9] Issue #18: Rename dispatch functions to reflect the commands they process --- KPI_Rover/Communication/ProtocolHandler.c | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index a19a9ad..e4bbf6f 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -17,16 +17,16 @@ static osThreadAttr_t ta = { .stack_size = 64 * 4 }; -static void dispatch_00(void) {} +static void dispatch_not_a_command(void) {} -static void dispatch_01(void) +static void dispatch_get_api_version(void) { sendBuffer[0] = 0x01; sendBuffer[1] = 0x01; UARTTransport_send(sendBuffer, 2); } -static void dispatch_02(void) +static void dispatch_set_motor_speed(void) { sendBuffer[0] = 0x02; @@ -51,23 +51,23 @@ static void dispatch_02(void) UARTTransport_send(sendBuffer, 2); } -static void dispatch_03(void) +static void dispatch_set_all_motors_speed(void) { sendBuffer[0] = 0x03; sendBuffer[1] = 0x00; UARTTransport_send(sendBuffer, 2); } -static void dispatch_04(void) {} +static void dispatch_get_encoder(void) {} -static void dispatch_05(void) +static void dispatch_get_all_encoders(void) { sendBuffer[0] = 0x05; memset(sendBuffer + 1, 0xBB, 16); UARTTransport_send(sendBuffer, 17); } -static void dispatch_06(void) +static void dispatch_get_imu(void) { sendBuffer[0] = 0x06; memset(sendBuffer + 1, 0xCC, 52); @@ -75,13 +75,13 @@ static void dispatch_06(void) } static const void (*dispatch_table[])(void) = { - dispatch_00, - dispatch_01, - dispatch_02, - dispatch_03, - dispatch_04, - dispatch_05, - dispatch_06, + dispatch_not_a_command, + dispatch_get_api_version, + dispatch_set_motor_speed, + dispatch_set_all_motors_speed, + dispatch_get_encoder, + dispatch_get_all_encoders, + dispatch_get_imu, }; void ProtocolHandler_processTask(void *d) From 9e5ca0e774cd47308b319ac3cdcc8a371eb623a3 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 12:33:00 +0300 Subject: [PATCH 2/9] Issue #18: Add endianness converter for int32_t --- KPI_Rover/Communication/ProtocolHandler.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index e4bbf6f..d19ff67 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -17,6 +17,11 @@ static osThreadAttr_t ta = { .stack_size = 64 * 4 }; +static int32_t switch_endianness_int32(const uint8_t * const address) +{ + return (int32_t) ((((uint32_t)address[0]) << 24) + (((uint32_t)address[1]) << 16) + (((uint32_t)address[2]) << 8) + ((uint32_t)address[3])); +} + static void dispatch_not_a_command(void) {} static void dispatch_get_api_version(void) From b243556c954af5de1bca5e33bc9b60704e86acbf Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 12:34:30 +0300 Subject: [PATCH 3/9] Issue #18: Add target motor RPM parameters to database --- KPI_Rover/Database/ulDatabase.h | 4 ++++ KPI_Rover/KPIRover.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/KPI_Rover/Database/ulDatabase.h b/KPI_Rover/Database/ulDatabase.h index a065695..8ebf00e 100644 --- a/KPI_Rover/Database/ulDatabase.h +++ b/KPI_Rover/Database/ulDatabase.h @@ -23,6 +23,10 @@ enum ulDatabase_ParamId { MOTOR_FR_RPM, MOTOR_RL_RPM, MOTOR_RR_RPM, + TARGET_MOTOR_FL_RPM, + TARGET_MOTOR_FR_RPM, + TARGET_MOTOR_RL_RPM, + TARGET_MOTOR_RR_RPM, IMU_ACCEL_X, IMU_ACCEL_Y, IMU_ACCEL_Z, diff --git a/KPI_Rover/KPIRover.c b/KPI_Rover/KPIRover.c index 99cb3e7..511eef8 100644 --- a/KPI_Rover/KPIRover.c +++ b/KPI_Rover/KPIRover.c @@ -17,6 +17,10 @@ static struct ulDatabase_ParamMetadata ulDatabase_params[] = { {0, INT32, false, 0}, // MOTOR_FR_RPM, {0, INT32, false, 0}, // MOTOR_RL_RPM, {0, INT32, false, 0}, // MOTOR_RR_RPM, + {0, INT32, false, 0}, // TARGET_MOTOR_FL_RPM, + {0, INT32, false, 0}, // TARGET_MOTOR_FR_RPM, + {0, INT32, false, 0}, // TARGET_MOTOR_RL_RPM, + {0, INT32, false, 0}, // TARGET_MOTOR_RR_RPM, {0, FLOAT, false, 0.0f}, // IMU_ACCEL_X {0, FLOAT, false, 0.0f}, // IMU_ACCEL_Y {0, FLOAT, false, 0.0f}, // IMU_ACCEL_Z From 864cdcd9d7e23f7648cd0b1e892f5c8f6e54e5ce Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 12:36:12 +0300 Subject: [PATCH 4/9] Issue #18: Include ulDatabase header --- KPI_Rover/Communication/ProtocolHandler.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index d19ff67..bb602a0 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -4,6 +4,8 @@ #include #include "cmsis_os2.h" +#include "Database/ulDatabase.h" + #define SEND_BUFFER_SIZE 64 #define RECV_BUFFER_SIZE 32 From c9c7062d6d9cff36962ba86e25a3cd79acf0c4b3 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 12:37:07 +0300 Subject: [PATCH 5/9] Issue #18: Integrate set_motor_speed and set_all_motors_speed commands with the database --- KPI_Rover/Communication/ProtocolHandler.c | 25 +++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index bb602a0..5ab9969 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -36,19 +36,24 @@ static void dispatch_get_api_version(void) static void dispatch_set_motor_speed(void) { sendBuffer[0] = 0x02; + sendBuffer[1] = 0x00; + + static int32_t target_value; + + target_value = switch_endianness_int32(&(recvBuffer[2])); // big (network) to little (host) switch (recvBuffer[1]) { case 0: - sendBuffer[1] = 0x0; + ulDatabase_setInt32(TARGET_MOTOR_FL_RPM, target_value); break; case 1: - sendBuffer[1] = 0x0; + ulDatabase_setInt32(TARGET_MOTOR_RL_RPM, target_value); break; case 2: - sendBuffer[1] = 0x0; + ulDatabase_setInt32(TARGET_MOTOR_FR_RPM, target_value); break; case 3: - sendBuffer[1] = 0x0; + ulDatabase_setInt32(TARGET_MOTOR_RR_RPM, target_value); break; default: sendBuffer[1] = 0x01; @@ -60,6 +65,18 @@ static void dispatch_set_motor_speed(void) static void dispatch_set_all_motors_speed(void) { + static int32_t target_value_fl, target_value_rl, target_value_fr, target_value_rr; + + target_value_fl = switch_endianness_int32(&(recvBuffer[1])); + target_value_rl = switch_endianness_int32(&(recvBuffer[5])); + target_value_fr = switch_endianness_int32(&(recvBuffer[9])); + target_value_rr = switch_endianness_int32(&(recvBuffer[13])); + + ulDatabase_setInt32(TARGET_MOTOR_FL_RPM, target_value_fl); + ulDatabase_setInt32(TARGET_MOTOR_RL_RPM, target_value_rl); + ulDatabase_setInt32(TARGET_MOTOR_FR_RPM, target_value_fr); + ulDatabase_setInt32(TARGET_MOTOR_RR_RPM, target_value_rr); + sendBuffer[0] = 0x03; sendBuffer[1] = 0x00; UARTTransport_send(sendBuffer, 2); From 454078d965428aa740b97efc3e11431c7c4d4637 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 13:53:59 +0300 Subject: [PATCH 6/9] Issue #18: Prefix encoder-related fields in database with "ENCODER_" --- KPI_Rover/Database/ulDatabase.h | 8 ++++---- KPI_Rover/Encoders/ulEncoder.c | 2 +- KPI_Rover/KPIRover.c | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/KPI_Rover/Database/ulDatabase.h b/KPI_Rover/Database/ulDatabase.h index 8ebf00e..20b9c42 100644 --- a/KPI_Rover/Database/ulDatabase.h +++ b/KPI_Rover/Database/ulDatabase.h @@ -19,10 +19,10 @@ enum ulDatabase_ParamType { enum ulDatabase_ParamId { ENCODER_CONTROL_PERIOD_MS, ENCODER_TICKS_PER_REVOLUTION, - MOTOR_FL_RPM, - MOTOR_FR_RPM, - MOTOR_RL_RPM, - MOTOR_RR_RPM, + ENCODER_MOTOR_FL_RPM, + ENCODER_MOTOR_FR_RPM, + ENCODER_MOTOR_RL_RPM, + ENCODER_MOTOR_RR_RPM, TARGET_MOTOR_FL_RPM, TARGET_MOTOR_FR_RPM, TARGET_MOTOR_RL_RPM, diff --git a/KPI_Rover/Encoders/ulEncoder.c b/KPI_Rover/Encoders/ulEncoder.c index 9004ba0..1a204aa 100644 --- a/KPI_Rover/Encoders/ulEncoder.c +++ b/KPI_Rover/Encoders/ulEncoder.c @@ -35,7 +35,7 @@ static void ulEncoder_TimerCallback(void *argument) { float rpm = ticks_per_sec * 60.0f / encoder_ticks_per_rev; int32_t rpm_to_db = (int32_t)rpm; - ulDatabase_setInt32(MOTOR_FL_RPM + i, rpm_to_db); + ulDatabase_setInt32(ENCODER_MOTOR_FL_RPM + i, rpm_to_db); lastTicks_RPM[i] = currentTicks; } diff --git a/KPI_Rover/KPIRover.c b/KPI_Rover/KPIRover.c index 511eef8..ddb18b9 100644 --- a/KPI_Rover/KPIRover.c +++ b/KPI_Rover/KPIRover.c @@ -13,10 +13,10 @@ static struct ulDatabase_ParamMetadata ulDatabase_params[] = { {0, UINT16, true, 5}, // ENCODER_CONTROL_PERIOD_MS, {0, FLOAT, true, 820.0f}, // ENCODER_TICKS_PER_REVOLUTION, - {0, INT32, false, 0}, // MOTOR_FL_RPM, - {0, INT32, false, 0}, // MOTOR_FR_RPM, - {0, INT32, false, 0}, // MOTOR_RL_RPM, - {0, INT32, false, 0}, // MOTOR_RR_RPM, + {0, INT32, false, 0}, // ENCODER_MOTOR_FL_RPM, + {0, INT32, false, 0}, // ENCODER_MOTOR_FR_RPM, + {0, INT32, false, 0}, // ENCODER_MOTOR_RL_RPM, + {0, INT32, false, 0}, // ENCODER_MOTOR_RR_RPM, {0, INT32, false, 0}, // TARGET_MOTOR_FL_RPM, {0, INT32, false, 0}, // TARGET_MOTOR_FR_RPM, {0, INT32, false, 0}, // TARGET_MOTOR_RL_RPM, From 6a3e9cb12a0f850c88463b57f4e1c7bee9da526d Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 13:55:31 +0300 Subject: [PATCH 7/9] Issue #18: Integrate get_encoder and get_all_encoders commands with the database --- KPI_Rover/Communication/ProtocolHandler.c | 48 ++++++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index 5ab9969..120afe4 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -82,12 +82,56 @@ static void dispatch_set_all_motors_speed(void) UARTTransport_send(sendBuffer, 2); } -static void dispatch_get_encoder(void) {} +static void dispatch_get_encoder(void) +{ + sendBuffer[0] = 0x04; + + static int32_t source_value; + + switch (recvBuffer[1]) { + case 0: + ulDatabase_getInt32(ENCODER_MOTOR_FL_RPM, &source_value); + break; + case 1: + ulDatabase_getInt32(ENCODER_MOTOR_RL_RPM, &source_value); + break; + case 2: + ulDatabase_getInt32(ENCODER_MOTOR_FR_RPM, &source_value); + break; + case 3: + ulDatabase_getInt32(ENCODER_MOTOR_RR_RPM, &source_value); + break; + default: + // failure is not an option in the protocol + break; + } + + source_value = switch_endianness_int32((uint8_t *) &source_value); // little (host) to big (network) + memcpy(&(sendBuffer[1]), &source_value, sizeof(source_value)); + + UARTTransport_send(sendBuffer, 5); +} static void dispatch_get_all_encoders(void) { + static int32_t source_value_fl, source_value_rl, source_value_fr, source_value_rr; + + ulDatabase_getInt32(ENCODER_MOTOR_FL_RPM, &source_value_fl); + ulDatabase_getInt32(ENCODER_MOTOR_RL_RPM, &source_value_rl); + ulDatabase_getInt32(ENCODER_MOTOR_FR_RPM, &source_value_fr); + ulDatabase_getInt32(ENCODER_MOTOR_RR_RPM, &source_value_rr); + + source_value_fl = switch_endianness_int32((uint8_t *) &source_value_fl); + source_value_rl = switch_endianness_int32((uint8_t *) &source_value_rl); + source_value_fr = switch_endianness_int32((uint8_t *) &source_value_fr); + source_value_rr = switch_endianness_int32((uint8_t *) &source_value_rr); + sendBuffer[0] = 0x05; - memset(sendBuffer + 1, 0xBB, 16); + memcpy(&(sendBuffer[1]), &source_value_fl, sizeof(source_value_fl)); + memcpy(&(sendBuffer[5]), &source_value_rl, sizeof(source_value_rl)); + memcpy(&(sendBuffer[9]), &source_value_fr, sizeof(source_value_fr)); + memcpy(&(sendBuffer[13]), &source_value_rr, sizeof(source_value_rr)); + UARTTransport_send(sendBuffer, 17); } From 8ed81a0efd2a2214ee243cccb6ca62f4d93b9253 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 14:32:17 +0300 Subject: [PATCH 8/9] Issue #18: Add missing IMU fields to ulDatabase --- KPI_Rover/Database/ulDatabase.h | 7 +++++++ KPI_Rover/KPIRover.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/KPI_Rover/Database/ulDatabase.h b/KPI_Rover/Database/ulDatabase.h index 20b9c42..cb087cf 100644 --- a/KPI_Rover/Database/ulDatabase.h +++ b/KPI_Rover/Database/ulDatabase.h @@ -33,6 +33,13 @@ enum ulDatabase_ParamId { IMU_GYRO_X, IMU_GYRO_Y, IMU_GYRO_Z, + IMU_MAG_X, + IMU_MAG_Y, + IMU_MAG_Z, + IMU_QUAT_W, + IMU_QUAT_X, + IMU_QUAT_Y, + IMU_QUAT_Z, IMU_CALIB_CMD, IMU_CALIB_STATUS, IMU_IS_CALIBRATED, diff --git a/KPI_Rover/KPIRover.c b/KPI_Rover/KPIRover.c index ddb18b9..efc2c0d 100644 --- a/KPI_Rover/KPIRover.c +++ b/KPI_Rover/KPIRover.c @@ -27,6 +27,13 @@ static struct ulDatabase_ParamMetadata ulDatabase_params[] = { {0, FLOAT, false, 0.0f}, // IMU_GYRO_X {0, FLOAT, false, 0.0f}, // IMU_GYRO_Y {0, FLOAT, false, 0.0f}, // IMU_GYRO_Z + {0, FLOAT, false, 0.0f}, // IMU_MAG_X + {0, FLOAT, false, 0.0f}, // IMU_MAG_Y + {0, FLOAT, false, 0.0f}, // IMU_MAG_Z + {0, FLOAT, false, 0.0f}, // IMU_QUAT_W + {0, FLOAT, false, 0.0f}, // IMU_QUAT_X + {0, FLOAT, false, 0.0f}, // IMU_QUAT_Y + {0, FLOAT, false, 0.0f}, // IMU_QUAT_Z {0, UINT8, false, 0}, // IMU_CALIB_CMD {0, UINT8, false, 0}, // IMU_CALIB_STATUS {0, UINT8, false, 0}, // IMU_IS_CALIBRATED From 6306cff85db1d04c22ee708d6d610ef41fce4fbe Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 4 Apr 2026 14:07:29 +0300 Subject: [PATCH 9/9] Issue #18: Integrate get_imu command with the database --- KPI_Rover/Communication/ProtocolHandler.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/KPI_Rover/Communication/ProtocolHandler.c b/KPI_Rover/Communication/ProtocolHandler.c index 120afe4..2f9c739 100644 --- a/KPI_Rover/Communication/ProtocolHandler.c +++ b/KPI_Rover/Communication/ProtocolHandler.c @@ -138,7 +138,24 @@ static void dispatch_get_all_encoders(void) static void dispatch_get_imu(void) { sendBuffer[0] = 0x06; - memset(sendBuffer + 1, 0xCC, 52); + + ulDatabase_getFloat(IMU_ACCEL_X, (float *) (sendBuffer + 1)); + ulDatabase_getFloat(IMU_ACCEL_Y, (float *) (sendBuffer + 5)); + ulDatabase_getFloat(IMU_ACCEL_Z, (float *) (sendBuffer + 9)); + + ulDatabase_getFloat(IMU_GYRO_X, (float *) (sendBuffer + 13)); + ulDatabase_getFloat(IMU_GYRO_Y, (float *) (sendBuffer + 17)); + ulDatabase_getFloat(IMU_GYRO_Z, (float *) (sendBuffer + 21)); + + ulDatabase_getFloat(IMU_MAG_X, (float *) (sendBuffer + 25)); + ulDatabase_getFloat(IMU_MAG_Y, (float *) (sendBuffer + 29)); + ulDatabase_getFloat(IMU_MAG_Z, (float *) (sendBuffer + 33)); + + ulDatabase_getFloat(IMU_QUAT_X, (float *) (sendBuffer + 37)); + ulDatabase_getFloat(IMU_QUAT_X, (float *) (sendBuffer + 41)); + ulDatabase_getFloat(IMU_QUAT_Y, (float *) (sendBuffer + 45)); + ulDatabase_getFloat(IMU_QUAT_Z, (float *) (sendBuffer + 49)); + UARTTransport_send(sendBuffer, 53); }