FMW_LedState state;
} FMW_Led;
+typedef struct FMW_Buzzer {
+ TIM_HandleTypeDef *const timer;
+ uint32_t timer_channel;
+} FMW_Buzzer;
+
typedef void fmw_interrupt(void *user_data);
void fmw_motor_init(FMW_Motor motors[], int32_t count) __attribute__((nonnull));
void fmw_led_init(FMW_Led *led) __attribute__((nonnull));
void fmw_led_update(FMW_Led *led) __attribute__((nonnull));
+FMW_Result fmw_buzzer_set(FMW_Buzzer buzzer[], int32_t count, bool on) __attribute__((nonnull));
+
void fmw_result_log_uart(UART_HandleTypeDef *huart, FMW_Result result,
const char *filename, int16_t filename_length,
int32_t line) __attribute__((nonnull));
#ifndef FMW_MESSAGE_H
#define FMW_MESSAGE_H
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_TICKS_PER_REVOLUTION 1
-#define FMW_MAX_ACCEPTABLE_TICKS_PER_REVOLUTION 10000
-
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_PID_PROPORTIONAL -1.f
-#define FMW_MAX_ACCEPTABLE_PID_PROPORTIONAL 1.f
-
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_PID_INTEGRAL -1.f
-#define FMW_MAX_ACCEPTABLE_PID_INTEGRAL 1.f
-
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_PID_DERIVATIVE -1.f
-#define FMW_MAX_ACCEPTABLE_PID_DERIVATIVE 1.f
-
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_LED_VOLTAGE 0.f
-#define FMW_MAX_ACCEPTABLE_LED_VOLTAGE 1.f
-
-// TODO(lb): fill with sensible values
-#define FMW_MIN_ACCEPTABLE_LED_UPDATE_PERIOD 1
-#define FMW_MAX_ACCEPTABLE_LED_UPDATE_PERIOD 10000
-
typedef union {
struct {
float proportional;
#define FMW_RESULT_VARIANTS(X) \
X(FMW_Result_Ok) \
+ X(FMW_Result_Error_InvalidArguments) \
X(FMW_Result_Error_UART_Crc) \
X(FMW_Result_Error_UART_NegativeTimeout) \
X(FMW_Result_Error_UART_ReceiveTimeoutElapsed) \
X(FMW_Result_Error_Encoder_NonPositiveTicksPerRevolution) \
X(FMW_Result_Error_Encoder_NonPositiveWheelCircumference) \
X(FMW_Result_Error_Encoder_GetTick) \
+ X(FMW_Result_Error_Buzzer_Timer) \
X(FMW_Result_Error_MessageHandler_InvalidState) \
X(FMW_Result_Error_MessageHandler_Init_NonPositiveBaseline) \
X(FMW_Result_Error_MessageHandler_Init_NonPositiveWheelCircumference) \
// ============================================================
// Motor controller
void fmw_motor_init(FMW_Motor motors[], int32_t count) {
- for (int32_t i = 0; i < count; ++ i) {
+ for (int32_t i = 0; i < count; ++i) {
assert(motors[i].sleep_gpio_port);
assert(motors[i].dir_gpio_port);
assert(motors[i].pwm_timer);
__HAL_TIM_SET_COMPARE(led->timer, led->timer_channel, duty);
}
+
+// ============================================================
+// Buzzers
+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) {
+ HAL_StatusTypeDef res;
+ if (on) {
+ __HAL_TIM_SET_COMPARE(buzzer[i].timer, buzzer[i].timer_channel,
+ buzzer[i].timer->Init.Period / 2);
+ res = HAL_TIM_PWM_Start(buzzer[i].timer, buzzer[i].timer_channel);
+ } else {
+ res = HAL_TIM_PWM_Stop(buzzer[i].timer, buzzer[i].timer_channel);
+ }
+ if (res != HAL_OK) { return FMW_Result_Error_Buzzer_Timer; }
+ }
+ return FMW_Result_Ok;
+}
.state = FMW_LedState_Red,\r
};\r
\r
+FMW_Buzzer buzzer = {\r
+ .timer = &htim1,\r
+ .timer_channel = TIM_CHANNEL_2,\r
+};\r
+\r
int32_t pid_max = 0;\r
int32_t pid_min = 0;\r
\r
return FMW_Result_Ok;\r
}\r
\r
-// TODO(lb): move to fmw. maybe create a FMW_Buzzer?\r
-void buzzer_set(bool on) {\r
- if (on) {\r
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, htim1.Init.Period / 2);\r
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);\r
- } else {\r
- HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);\r
- }\r
-}\r
-\r
// TIMER 100Hz PID control\r
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {\r
// NOTE(lb): metrics taken for transmission\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
- buzzer_set(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
} else {\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
- buzzer_set(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
}\r