\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
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
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
\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