/*Configure GPIO pin Output Level */\r
HAL_GPIO_WritePin(GPIOF, sleep2_Pin|sleep1_Pin, GPIO_PIN_SET);\r
\r
- /*Configure GPIO pin : PC13 */\r
- GPIO_InitStruct.Pin = GPIO_PIN_13;\r
+ /*Configure GPIO pin : PtPin */\r
+ GPIO_InitStruct.Pin = user_button_Pin;\r
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;\r
GPIO_InitStruct.Pull = GPIO_NOPULL;\r
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\r
+ HAL_GPIO_Init(user_button_GPIO_Port, &GPIO_InitStruct);\r
\r
/*Configure GPIO pin : PtPin */\r
GPIO_InitStruct.Pin = current2_Pin;\r
\r
/*Configure GPIO pin : PtPin */\r
GPIO_InitStruct.Pin = fault2_Pin;\r
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\r
- GPIO_InitStruct.Pull = GPIO_NOPULL;\r
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;\r
+ GPIO_InitStruct.Pull = GPIO_PULLUP;\r
HAL_GPIO_Init(fault2_GPIO_Port, &GPIO_InitStruct);\r
\r
/*Configure GPIO pins : PFPin PFPin */\r
\r
/*Configure GPIO pin : PtPin */\r
GPIO_InitStruct.Pin = fault1_Pin;\r
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\r
- GPIO_InitStruct.Pull = GPIO_NOPULL;\r
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;\r
+ GPIO_InitStruct.Pull = GPIO_PULLUP;\r
HAL_GPIO_Init(fault1_GPIO_Port, &GPIO_InitStruct);\r
\r
/* EXTI interrupt init*/\r
/* USER CODE END 0 */\r
\r
/**\r
- * @brief The application entry point.\r
- * @retval int\r
- */\r
-int main(void)\r
-{\r
+ * @brief The application entry point.\r
+ * @retval int\r
+ */\r
+int main(void) {\r
/* USER CODE BEGIN 1 */\r
/* USER CODE END 1 */\r
- \r
\r
/* MCU Configuration--------------------------------------------------------*/\r
\r
\r
//Enables UART RX interrupt\r
HAL_UART_Receive_DMA(&huart6, (uint8_t*) &proto_buffer_rx,\r
- VelocityCommand_size);\r
+ VelocityCommand_size);\r
\r
/* USER CODE END 2 */\r
\r
}\r
\r
/**\r
- * @brief System Clock Configuration\r
- * @retval None\r
- */\r
-void SystemClock_Config(void)\r
-{\r
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};\r
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\r
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\r
+ * @brief System Clock Configuration\r
+ * @retval None\r
+ */\r
+void SystemClock_Config(void) {\r
+ RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\r
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\r
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\r
\r
/** Configure the main internal regulator output voltage \r
- */\r
+ */\r
__HAL_RCC_PWR_CLK_ENABLE();\r
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);\r
/** Initializes the CPU, AHB and APB busses clocks \r
- */\r
+ */\r
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;\r
RCC_OscInitStruct.HSIState = RCC_HSI_ON;\r
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\r
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;\r
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\r
- {\r
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r
Error_Handler();\r
}\r
/** Initializes the CPU, AHB and APB busses clocks \r
- */\r
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\r
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\r
+ */\r
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\r
+ | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\r
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\r
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\r
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\r
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\r
\r
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)\r
- {\r
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {\r
Error_Handler();\r
}\r
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART6;\r
PeriphClkInitStruct.Usart6ClockSelection = RCC_USART6CLKSOURCE_PCLK2;\r
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)\r
- {\r
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\r
Error_Handler();\r
}\r
}\r
\r
/**\r
- * @brief NVIC Configuration.\r
- * @retval None\r
- */\r
-static void MX_NVIC_Init(void)\r
-{\r
+ * @brief NVIC Configuration.\r
+ * @retval None\r
+ */\r
+static void MX_NVIC_Init(void) {\r
/* TIM3_IRQn interrupt configuration */\r
HAL_NVIC_SetPriority(TIM3_IRQn, 2, 1);\r
HAL_NVIC_EnableIRQ(TIM3_IRQn);\r
//TIMER 10Hz Transmit\r
if (htim->Instance == TIM6) {\r
\r
- pb_ostream_t stream = pb_ostream_from_buffer(proto_buffer_tx, sizeof(proto_buffer_tx));\r
+ pb_ostream_t stream = pb_ostream_from_buffer(proto_buffer_tx,\r
+ sizeof(proto_buffer_tx));\r
\r
float left_wheel = left_encoder.GetLinearVelocity();\r
float right_wheel = right_encoder.GetLinearVelocity();\r
\r
pb_encode(&stream, StatusMessage_fields, &status_msg);\r
\r
- HAL_UART_Transmit_DMA(&huart6,(uint8_t*) &proto_buffer_tx, StatusMessage_size);\r
+ HAL_UART_Transmit_DMA(&huart6, (uint8_t*) &proto_buffer_tx,\r
+ StatusMessage_size);\r
}\r
}\r
\r
float angular_velocity;\r
\r
pb_istream_t stream = pb_istream_from_buffer(proto_buffer_rx,\r
- VelocityCommand_size);\r
+ VelocityCommand_size);\r
\r
bool status = pb_decode(&stream, VelocityCommand_fields, &vel_cmd);\r
\r
float cross_setpoint = left_setpoint - right_setpoint;\r
cross_pid.set(cross_setpoint);\r
\r
-\r
}\r
\r
HAL_UART_Receive_DMA(&huart6, (uint8_t*) &proto_buffer_rx,\r
- VelocityCommand_size);\r
+ VelocityCommand_size);\r
}\r
\r
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {\r
//Blue user button on the NUCLEO board\r
- if (GPIO_Pin == GPIO_PIN_13) {\r
+ if (GPIO_Pin == user_button_Pin) {\r
if (mode == 0) {\r
mode = 1;\r
//Enables TIM3 interrupt (used for PID control)\r
HAL_TIM_Base_Start_IT(&htim3);\r
-\r
}\r
+\r
+ } else if (GPIO_Pin == fault1_Pin) {\r
+ left_motor.brake();\r
+ right_motor.brake();\r
+ //stop TIM3 interrupt (used for PID control)\r
+ HAL_TIM_Base_Stop_IT(&htim3);\r
+\r
+ //Send status message with error code\r
+ status_msg.linear_velocity = 0;\r
+ status_msg.angular_velocity = 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 = 4;\r
+\r
+ pb_ostream_t stream = pb_ostream_from_buffer(proto_buffer_tx,\r
+ sizeof(proto_buffer_tx));\r
+ pb_encode(&stream, StatusMessage_fields, &status_msg);\r
+\r
+ HAL_UART_Transmit_DMA(&huart6, (uint8_t*) &proto_buffer_tx,\r
+ StatusMessage_size);\r
+\r
+ //loops forever, manual reset is needed\r
+ while (1);\r
+\r
+ } else if (GPIO_Pin == fault2_Pin) {\r
+ left_motor.brake();\r
+ right_motor.brake();\r
+ //stop TIM3 interrupt (used for PID control)\r
+ HAL_TIM_Base_Stop_IT(&htim3);\r
+\r
+ //Send status message with error code\r
+ status_msg.linear_velocity = 0;\r
+ status_msg.angular_velocity = 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 = 5;\r
+\r
+ pb_ostream_t stream = pb_ostream_from_buffer(proto_buffer_tx,\r
+ sizeof(proto_buffer_tx));\r
+ pb_encode(&stream, StatusMessage_fields, &status_msg);\r
+\r
+ HAL_UART_Transmit_DMA(&huart6, (uint8_t*) &proto_buffer_tx,\r
+ StatusMessage_size);\r
+\r
+ //loops forever, manual reset is needed\r
+ while (1);\r
}\r
+\r
}\r
/* USER CODE END 4 */\r
\r
/**\r
- * @brief This function is executed in case of error occurrence.\r
- * @retval None\r
- */\r
-void Error_Handler(void)\r
-{\r
+ * @brief This function is executed in case of error occurrence.\r
+ * @retval None\r
+ */\r
+void Error_Handler(void) {\r
/* USER CODE BEGIN Error_Handler_Debug */\r
/* User can add his own implementation to report the HAL error return state */\r
\r