]> git.leonardobizzoni.com Git - pioneer-stm32/commitdiff
Status reporting
authorLeonardoBizzoni <leo2002714@gmail.com>
Wed, 28 Jan 2026 15:43:08 +0000 (16:43 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Wed, 28 Jan 2026 15:43:08 +0000 (16:43 +0100)
pioneer_controller/Core/Src/firmware/fwm_core.c
pioneer_controller/Core/Src/main.c

index 0c0877ad2af45c120d2c8e43e56f2532f85f5505..499c92803e7a7a93c8586a1000d0a3424d2d9fb5 100644 (file)
@@ -34,7 +34,7 @@ void fmw_result_log_uart(UART_HandleTypeDef *huart, FMW_Result result,
                          int32_t line) {
   char buff[512] = {0};
   int32_t length = fmw_result_format(buff, sizeof buff, filename, filename_length, line, result);
-  HAL_UART_Transmit(huart, (uint8_t*)buff, length, HAL_MAX_DELAY);
+  (void)HAL_UART_Transmit(huart, (uint8_t*)buff, length, HAL_MAX_DELAY);
 }
 
 // ============================================================
@@ -253,6 +253,7 @@ void fmw_led_update(FMW_Led *led) {
 
 // ============================================================
 // Buzzers
+// NOTE(lb): replace bool with uint8_t bitmask?
 FMW_Result fmw_buzzer_set(FMW_Buzzer buzzer[], int32_t count, bool on) {
   if (count < 1) { return FMW_Result_Error_InvalidArguments; }
   for (int32_t i = 0; i < count; ++i) {
index 2db5cf4f337d94d59d835d37bcf53f3299159cda..914a98b2f6711b756554f95ad4d6138725ed8fc0 100644 (file)
@@ -162,9 +162,6 @@ static uint32_t led_update_period = 200;
 \r
 static volatile int32_t ticks_left  = 0;\r
 static volatile int32_t ticks_right = 0;\r
-static volatile float previous_tx_millis;\r
-static volatile uint8_t tx_done_flag = 1;\r
-/* volatile MessageStatusCode otto_status = MessageStatusCode_Waiting4Config; */\r
 \r
 static volatile FMW_Message run_msg = {0};\r
 \r
@@ -821,7 +818,7 @@ void start(void) {
 FMW_Result message_handler(FMW_Message *msg) {\r
   // NOTE(lb): the `msg->header.crc != -1` checks are just because i haven't\r
   //           implemented CRC into the program that sends these messages.\r
-  //           i also don't know if the code to calculate CRC is correct.\r
+  //           i also don't know if the code to calculate CRC is correct (probably isn't).\r
   if (msg->header.crc != -1) {\r
     uint32_t crc_received = msg->header.crc;\r
     msg->header.crc = 0;\r
@@ -883,9 +880,27 @@ FMW_Result message_handler(FMW_Message *msg) {
     case FMW_MessageType_Status: { // TODO(lb): this should be `GetStatus` or something like that.\r
       int32_t current_ticks_left = ticks_left + fmw_encoder_count_get(&encoders.left);\r
       int32_t current_ticks_right = ticks_right + fmw_encoder_count_get(&encoders.right);\r
-      (void)current_ticks_left;\r
-      (void)current_ticks_right;\r
-      // TODO(lb): add the rest.\r
+      ticks_left = ticks_right = 0;\r
+\r
+      static float time_millis_previous = 0.f;\r
+      float time_millis_current = HAL_GetTick();\r
+      float time_millis_delta = time_millis_current - time_millis_previous;\r
+      time_millis_previous = time_millis_current;\r
+\r
+      // NOTE(lb): Does a status response need to be its own message or\r
+      //           is just logging fine? Is the workstation program interactive\r
+      //           (is there a user choosing which messages to send)\r
+      //           or is automated? And if it is automated wouldn't\r
+      //           it want to know if the board actually received its message?\r
+      //           If the build process wasn't so overcomplicated i could just add\r
+      //           a compilation flag and switch between both at comptime.\r
+\r
+      char buffer[128] = {0};\r
+      int32_t buffer_size = snprintf(buffer, ARRLENGTH(buffer), "time_millis_delta : %f\n"\r
+                                                                "ticks_left        : %ld\n"\r
+                                                                "ticks_right       : %ld\n",\r
+                                     time_millis_delta, current_ticks_left, current_ticks_right);\r
+      (void)HAL_UART_Transmit(UART_MESSANGER_HANDLE, (uint8_t*)buffer, buffer_size, HAL_MAX_DELAY);\r
     } break;\r
     case FMW_MessageType_Velocity: {\r
       fmw_odometry_setpoint_from_velocities(&odometry, msg->velocity.linear, msg->velocity.angular);\r
@@ -943,88 +958,64 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
 \r
     // NOTE(lb): listen for the next message.\r
     HAL_UART_Receive_DMA(huart, (uint8_t*)&run_msg, sizeof run_msg);\r
-\r
-#if 0\r
-    /*\r
-     * Manage new transmission\r
-     */\r
-\r
-    int32_t left_ticks_tx = left_ticks + encoder_count_get(&encoders.left);\r
-    int32_t right_ticks_tx = right_ticks + encoder_count_get(&encoders.right);\r
-\r
-    status_msg.left_ticks = left_ticks_tx;\r
-    status_msg.right_ticks = right_ticks_tx;\r
-\r
-    left_ticks = 0;\r
-    right_ticks = 0;\r
-\r
-    float current_tx_millis = HAL_GetTick();\r
-    status_msg.delta_millis = current_tx_millis - previous_tx_millis;\r
-    previous_tx_millis = current_tx_millis;\r
-\r
-    status_msg.status = otto_status;\r
-\r
-    uint32_t crc_tx = HAL_CRC_Calculate(&hcrc, (uint32_t*) &status_msg, 12);\r
-\r
-    status_msg.crc = crc_tx;\r
-\r
-    if (tx_done_flag) {\r
-      HAL_UART_Transmit_DMA(&huart6, (uint8_t*) &status_msg, sizeof(status_msg));\r
-      tx_done_flag = 0;\r
-    }\r
-#endif\r
   }\r
 }\r
 \r
-void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) {\r
-  tx_done_flag = 1;\r
-}\r
-\r
-uint8_t uart_err = 0;\r
-void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle) {\r
-  uart_err += 1;\r
-}\r
-\r
 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {\r
   uint32_t time_now = HAL_GetTick();\r
 \r
   switch (GPIO_Pin) {\r
   case aux_Pin: {\r
     if (time_now - time_aux_press > FMW_DEBOUNCE_DELAY) {\r
+      // NOTE(lb): is this useful?\r
       time_aux_press = time_now;\r
       HAL_GPIO_TogglePin(GPIOB, LD1_Pin);\r
       HAL_GPIO_TogglePin(GPIOB, LD2_Pin);\r
       HAL_GPIO_TogglePin(GPIOB, LD3_Pin);\r
       /* char msg[] = "AUX1 button pressed\r\n"; */\r
       /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
+      // NOTE(lb): lol strlen\r
     }\r
   } break;\r
   case aux2_Pin: {\r
     if (time_now - time_aux2_press > FMW_DEBOUNCE_DELAY) {\r
+      // NOTE(lb): is this useful?\r
       time_aux2_press = time_now;\r
       /* char msg[] = "AUX2 button pressed\r\n"; */\r
       /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
+      // NOTE(lb): lol strlen\r
     }\r
   } break;\r
   case motors_btn_Pin: {\r
     if (time_now - time_last_motors > FMW_DEBOUNCE_DELAY) {\r
+      // NOTE(lb): in both branches the buffer is turned off. When i should turn it on?\r
+      //           even in https://github.com/giuseppe-caliaro/pioneer3dx-control\r
+      //           Buzzer_Set is never called with true.\r
+\r
       time_last_motors = time_now;\r
       /* char msg[] = "Motors button pressed\r\n"; */\r
       /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
-      if(motors.left.active && motors.right.active) {\r
+      // NOTE(lb): lol strlen\r
+      if (motors.left.active && motors.right.active) {\r
         fmw_motor_disable(&motors.left);\r
         fmw_motor_disable(&motors.right);\r
         HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_RESET);\r
-        fmw_buzzer_set(&buzzer, 1, false);\r
+        fmw_buzzer_set(&buzzer, 1, false); // <--------------------------------\r
         /* char msg[] = "Motors OFF\r\n"; */\r
         /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
+        // NOTE(lb): lol strlen\r
       } else {\r
+        // NOTE(lb): is it safe to assert here since the motors aren't running?\r
+        assert(!motors.left.active);\r
+        assert(!motors.right.active);\r
+\r
         fmw_motor_enable(&motors.left);\r
         fmw_motor_enable(&motors.right);\r
         HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_SET);\r
-        fmw_buzzer_set(&buzzer, 1, false);\r
+        fmw_buzzer_set(&buzzer, 1, false);  // <--------------------------------\r
         /* char msg[] = "Motors ON\r\n"; */\r
         /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
+        // NOTE(lb): lol strlen\r
       }\r
     }\r
   } break;\r