\r
/* Private define ------------------------------------------------------------*/\r
/* USER CODE BEGIN PD */\r
+#define MOTOR_COUNT 2\r
+#define ENCODER_COUNT 2\r
+#define UART_MESSANGER_HANDLE (&huart3)\r
/* USER CODE END PD */\r
\r
/* Private macro -------------------------------------------------------------*/\r
/* USER CODE BEGIN PM */\r
-#define MOTOR_COUNT 2\r
-#define ENCODER_COUNT 2\r
/* USER CODE END PM */\r
\r
/* Private variables ---------------------------------------------------------*/\r
TIM_HandleTypeDef htim6;\r
\r
UART_HandleTypeDef huart3;\r
+DMA_HandleTypeDef hdma_usart3_rx;\r
\r
/* USER CODE BEGIN PV */\r
\r
-#define UART_MESSANGER_HANDLE (&huart3)\r
-\r
// TODO(lb): fill with sensible default\r
static union {\r
FMW_Encoder values[ENCODER_COUNT];\r
\r
static volatile int32_t ticks_left = 0;\r
static volatile int32_t ticks_right = 0;\r
-\r
-static volatile FMW_Message run_msg = {0};\r
-\r
-static volatile uint32_t time_aux_press = 0;\r
-static volatile uint32_t time_aux2_press = 0;\r
+static volatile FMW_Message uart_message_buffer = {0};\r
static volatile uint32_t time_last_motors = 0;\r
-static volatile FMW_State fmw_state = FMW_State_Init;\r
+static volatile FMW_Mode current_mode = FMW_Mode_Init;\r
\r
/* USER CODE END PV */\r
\r
/* Private function prototypes -----------------------------------------------*/\r
void SystemClock_Config(void);\r
static void MX_GPIO_Init(void);\r
+static void MX_DMA_Init(void);\r
static void MX_USART3_UART_Init(void);\r
static void MX_ADC1_Init(void);\r
static void MX_TIM4_Init(void);\r
/* USER CODE BEGIN 0 */\r
/* USER CODE END 0 */\r
\r
+/**\r
+ * @brief The application entry point.\r
+ * @retval int\r
+ */\r
int main(void)\r
{\r
\r
\r
/* Initialize all configured peripherals */\r
MX_GPIO_Init();\r
+ MX_DMA_Init();\r
MX_USART3_UART_Init();\r
MX_ADC1_Init();\r
MX_TIM4_Init();\r
}\r
\r
/**\r
- * @brief System Clock Configuration\r
- * @retval None\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
\r
/** Configure LSE Drive Capability\r
- */\r
+ */\r
HAL_PWR_EnableBkUpAccess();\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
\r
/** Initializes the RCC Oscillators according to the specified parameters\r
- * in the RCC_OscInitTypeDef structure.\r
- */\r
+ * in the RCC_OscInitTypeDef structure.\r
+ */\r
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\r
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\r
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r
RCC_OscInitStruct.PLL.PLLQ = 4;\r
RCC_OscInitStruct.PLL.PLLR = 2;\r
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
\r
/** Activate the Over-Drive mode\r
- */\r
+ */\r
if (HAL_PWREx_EnableOverDrive() != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
\r
/** Initializes the CPU, AHB and APB buses clocks\r
- */\r
+ */\r
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\r
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\r
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\r
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\r
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\r
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\r
\r
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
}\r
\r
/**\r
- * @brief ADC1 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief ADC1 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_ADC1_Init(void)\r
{\r
\r
/* USER CODE END ADC1_Init 1 */\r
\r
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)\r
- */\r
+ */\r
hadc1.Instance = ADC1;\r
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;\r
hadc1.Init.Resolution = ADC_RESOLUTION_12B;\r
hadc1.Init.DMAContinuousRequests = DISABLE;\r
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;\r
if (HAL_ADC_Init(&hadc1) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
\r
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.\r
- */\r
+ */\r
sConfig.Channel = ADC_CHANNEL_2;\r
sConfig.Rank = ADC_REGULAR_RANK_1;\r
sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES;\r
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN ADC1_Init 2 */\r
\r
/* USER CODE END ADC1_Init 2 */\r
}\r
\r
/**\r
- * @brief CRC Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief CRC Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_CRC_Init(void)\r
{\r
\r
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;\r
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;\r
if (HAL_CRC_Init(&hcrc) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN CRC_Init 2 */\r
\r
/* USER CODE END CRC_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM1 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief TIM1 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_TIM1_Init(void)\r
{\r
\r
htim1.Init.RepetitionCounter = 0;\r
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sConfigOC.OCMode = TIM_OCMODE_PWM1;\r
sConfigOC.Pulse = 0;\r
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;\r
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;\r
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;\r
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;\r
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;\r
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;\r
sBreakDeadTimeConfig.Break2Filter = 0;\r
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;\r
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN TIM1_Init 2 */\r
\r
/* USER CODE END TIM1_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM2 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief TIM2 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_TIM2_Init(void)\r
{\r
\r
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\r
sConfig.IC2Filter = 0;\r
if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN TIM2_Init 2 */\r
\r
/* USER CODE END TIM2_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM3 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief TIM3 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_TIM3_Init(void)\r
{\r
\r
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\r
sConfig.IC2Filter = 0;\r
if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN TIM3_Init 2 */\r
\r
/* USER CODE END TIM3_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM4 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief TIM4 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_TIM4_Init(void)\r
{\r
\r
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\r
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sConfigOC.OCMode = TIM_OCMODE_PWM1;\r
sConfigOC.Pulse = 0;\r
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;\r
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;\r
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN TIM4_Init 2 */\r
\r
/* USER CODE END TIM4_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM6 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief TIM6 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_TIM6_Init(void)\r
{\r
\r
htim6.Init.Period = 65535;\r
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN TIM6_Init 2 */\r
\r
/* USER CODE END TIM6_Init 2 */\r
}\r
\r
/**\r
- * @brief USART3 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * @brief USART3 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_USART3_UART_Init(void)\r
{\r
\r
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;\r
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;\r
if (HAL_UART_Init(&huart3) != HAL_OK)\r
- {\r
- Error_Handler();\r
- }\r
+ {\r
+ Error_Handler();\r
+ }\r
/* USER CODE BEGIN USART3_Init 2 */\r
\r
/* USER CODE END USART3_Init 2 */\r
}\r
\r
/**\r
- * @brief GPIO Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
+ * Enable DMA controller clock\r
+ */\r
+static void MX_DMA_Init(void)\r
+{\r
+\r
+ /* DMA controller clock enable */\r
+ __HAL_RCC_DMA1_CLK_ENABLE();\r
+\r
+ /* DMA interrupt init */\r
+ /* DMA1_Stream1_IRQn interrupt configuration */\r
+ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);\r
+ HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);\r
+\r
+}\r
+\r
+/**\r
+ * @brief GPIO Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
static void MX_GPIO_Init(void)\r
{\r
GPIO_InitTypeDef GPIO_InitStruct = {0};\r
\r
/* USER CODE BEGIN 4 */\r
void start(void) {\r
- for (FMW_Message msg = {0}; fmw_state == FMW_State_Init; ) {\r
- FMW_Result res = fmw_message_uart_receive(UART_MESSANGER_HANDLE, &msg, 180 * 1000);\r
- FMW_Message response = {0};\r
- response.header.type = FMW_MessageType_Response;\r
- response.result = (res == FMW_Result_Ok) ? message_handler(&msg, &hcrc) : res;\r
- fmw_message_uart_send(UART_MESSANGER_HANDLE, &hcrc, &response, HAL_MAX_DELAY);\r
- }\r
+ // Enables UART RX interrupt\r
+ HAL_UART_Receive_DMA(UART_MESSANGER_HANDLE, (uint8_t*)&uart_message_buffer, sizeof uart_message_buffer);\r
+ for (; current_mode == FMW_Mode_Init; );\r
\r
fmw_encoder_init(encoders.values, ENCODER_COUNT);\r
fmw_motor_init(motors.values, MOTOR_COUNT);\r
HAL_StatusTypeDef timer_status = HAL_TIM_Base_Start_IT(&htim6);\r
FMW_ASSERT(timer_status == HAL_OK);\r
\r
- // Enables UART RX interrupt\r
- HAL_UART_Receive_DMA(UART_MESSANGER_HANDLE, (uint8_t*)&run_msg, sizeof run_msg);\r
-\r
for (uint32_t time_last_led_update = 0;;) {\r
uint32_t time_now = HAL_GetTick();\r
if (time_now - time_last_led_update >= led_update_period) {\r
if (!(crc_computed == crc_received)) { return FMW_Result_Error_UART_Crc; }\r
}\r
\r
- switch (fmw_state) {\r
- case FMW_State_Init: {\r
+ switch (current_mode) {\r
+ case FMW_Mode_Init: {\r
switch (msg->header.type) {\r
case FMW_MessageType_StateChange_Run: {\r
- fmw_state = FMW_State_Running;\r
+ current_mode = FMW_Mode_Run;\r
} break;\r
case FMW_MessageType_Config_Robot: {\r
if (!(msg->config_robot.baseline > 0.f)) {\r
} break;\r
}\r
} break;\r
- case FMW_State_Running: {\r
+ case FMW_Mode_Run: {\r
switch (msg->header.type) {\r
case FMW_MessageType_Run_GetStatus: {\r
int32_t current_ticks_left = ticks_left + fmw_encoder_count_get(&encoders.left);\r
if (huart == UART_MESSANGER_HANDLE) {\r
FMW_Message response = {0};\r
response.header.type = FMW_MessageType_Response;\r
- response.result = message_handler((FMW_Message*)&run_msg, &hcrc);\r
+ response.result = message_handler((FMW_Message*)&uart_message_buffer, &hcrc);\r
fmw_message_uart_send(UART_MESSANGER_HANDLE, &hcrc, &response, HAL_MAX_DELAY);\r
-\r
// NOTE(lb): listen for the next message.\r
- HAL_UART_Receive_DMA(huart, (uint8_t*)&run_msg, sizeof run_msg);\r
+ HAL_UART_Receive_DMA(UART_MESSANGER_HANDLE, (uint8_t*)&uart_message_buffer, sizeof uart_message_buffer);\r
}\r
}\r
\r
+void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {\r
+ FMW_ASSERT(false);\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
- // 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
+ fmw_motor_disable(motors.values, ARRLENGTH(motors.values));\r
HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_RESET);\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
+ fmw_buzzer_set(&buzzer, 1, false);\r
} else {\r
- // NOTE(lb): is it safe to FMW_ASSERT here since the motors aren't running?\r
FMW_ASSERT(!motors.left.active);\r
FMW_ASSERT(!motors.right.active);\r
-\r
- fmw_motor_enable(&motors.left);\r
- fmw_motor_enable(&motors.right);\r
+ fmw_motor_enable(motors.values, ARRLENGTH(motors.values));\r
HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_SET);\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
+ fmw_buzzer_set(&buzzer, 1, false);\r
}\r
}\r
} break;\r
/* USER CODE END 4 */\r
\r
/**\r
- * @brief This function is executed in case of error occurrence.\r
- * @retval None\r
- */\r
+ * @brief This function is executed in case of error occurrence.\r
+ * @retval None\r
+ */\r
void Error_Handler(void)\r
{\r
/* USER CODE BEGIN Error_Handler_Debug */\r
}\r
#ifdef USE_FULL_ASSERT\r
/**\r
- * @brief Reports the name of the source file and the source line number\r
- * where the assert_param error has occurred.\r
- * @param file: pointer to the source file name\r
- * @param line: assert_param error line source number\r
- * @retval None\r
- */\r
+ * @brief Reports the name of the source file and the source line number\r
+ * where the assert_param error has occurred.\r
+ * @param file: pointer to the source file name\r
+ * @param line: assert_param error line source number\r
+ * @retval None\r
+ */\r
void assert_failed(uint8_t *file, uint32_t line)\r
{\r
/* USER CODE BEGIN 6 */\r