From ceb9602c3c2505b13edeb0b0ce8e2698dadcdb25 Mon Sep 17 00:00:00 2001 From: Jasper Date: Wed, 17 Aug 2022 08:48:09 +0200 Subject: [PATCH] Send button state to CAN --- Core/Inc/user_inputs.h | 14 ++++++++++++ Core/Inc/vehicle.h | 10 ++++++++- Core/Src/main.c | 5 +---- Core/Src/user_inputs.c | 49 ++++++++++++++++++++++++++++++++++++++---- Core/Src/vehicle.c | 28 ++++++++++++++++++++---- 5 files changed, 93 insertions(+), 13 deletions(-) diff --git a/Core/Inc/user_inputs.h b/Core/Inc/user_inputs.h index 4885758..0ae4ae4 100644 --- a/Core/Inc/user_inputs.h +++ b/Core/Inc/user_inputs.h @@ -4,6 +4,20 @@ #include "events.h" #include "stm32g4xx_hal.h" +#include "stm32g4xx_hal_gpio.h" + +typedef struct { + GPIO_PinState left; + GPIO_PinState right; + GPIO_PinState r2d; + GPIO_PinState enter; + GPIO_PinState enc0a; + GPIO_PinState enc0b; + GPIO_PinState enc1a; + GPIO_PinState enc1b; +} ButtonsState; + +ButtonsState get_buttons_state(); void handle_button_press(const ButtonPressEvent* ev); diff --git a/Core/Inc/vehicle.h b/Core/Inc/vehicle.h index 41049fd..24b3732 100644 --- a/Core/Inc/vehicle.h +++ b/Core/Inc/vehicle.h @@ -4,13 +4,21 @@ #include "state.h" #include "stm32g4xx_hal.h" +#include "stm32g4xx_hal_def.h" #include "stm32g4xx_hal_fdcan.h" #define CAN_ID_MISSION_SELECT 0x400 +#define CAN_ID_BUTTONS 0x401 #define CAN_ID_AS_MISSION_FB 0x410 +#define CAN_BUTTONS_LEFT (1 << 0) +#define CAN_BUTTONS_RIGHT (1 << 1) +#define CAN_BUTTONS_R2D (1 << 2) +#define CAN_BUTTONS_ENTER (1 << 3) + void vehicle_init(FDCAN_HandleTypeDef* handle); -void vehicle_send_mission_select(Mission mission); +HAL_StatusTypeDef vehicle_send_mission_select(Mission mission); +HAL_StatusTypeDef vehicle_send_buttons(); #endif // __VEHICLE_H diff --git a/Core/Src/main.c b/Core/Src/main.c index b4254b8..44c18b8 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -138,10 +138,7 @@ int main(void) { HAL_GPIO_WritePin(DISP_RESET_GPIO_Port, DISP_RESET_Pin, GPIO_PIN_SET); } handle_events(); - if (now - last_can > 100) { - // vehicle_send_mission_select(MISSION_ACCELERATION); - last_can = now; - } + vehicle_send_buttons(); loop_delay(); } /* USER CODE END 3 */ diff --git a/Core/Src/user_inputs.c b/Core/Src/user_inputs.c index 85f96ee..51b7b36 100644 --- a/Core/Src/user_inputs.c +++ b/Core/Src/user_inputs.c @@ -5,30 +5,58 @@ #include "state.h" #include "vehicle.h" +#include "stm32g4xx_hal.h" #include "stm32g4xx_hal_gpio.h" +#include + +#define MIN_PRESS_INTERVAL 100 + void HAL_GPIO_EXTI_Callback(uint16_t pin) { + static uint32_t last_presses[4] = {0, 0, 0, 0}; + Event ev; GPIO_PinState state = HAL_GPIO_ReadPin(GPIOB, pin); ev.type = state; + uint32_t now = HAL_GetTick(); switch (pin) { - case BTN0_Pin: + case BTN0_Pin: { + if (now - last_presses[0] < MIN_PRESS_INTERVAL) { + return; + } + last_presses[0] = now; ev.type = EV_BTN_PRESS; ev.btn_press = BTN_PRESS_PREV; break; - case BTN1_Pin: + } + case BTN1_Pin: { + if (now - last_presses[1] < MIN_PRESS_INTERVAL) { + return; + } + last_presses[1] = now; ev.type = EV_BTN_PRESS; ev.btn_press = BTN_PRESS_R2D; break; - case BTN2_Pin: + } + case BTN2_Pin: { + if (now - last_presses[2] < MIN_PRESS_INTERVAL) { + return; + } + last_presses[2] = now; ev.type = EV_BTN_PRESS; ev.btn_press = BTN_PRESS_OK; break; - case BTN3_Pin: + } + case BTN3_Pin: { + if (now - last_presses[3] < MIN_PRESS_INTERVAL) { + return; + } + last_presses[3] = now; ev.type = EV_BTN_PRESS; ev.btn_press = BTN_PRESS_NEXT; break; + } default: Error_Handler(); } @@ -75,3 +103,16 @@ void handle_button_press_mission_select(const ButtonPressEvent* ev) { } } } + +ButtonsState get_buttons_state() { + ButtonsState result; + result.left = HAL_GPIO_ReadPin(BTN0_GPIO_Port, BTN0_Pin); + result.right = HAL_GPIO_ReadPin(BTN3_GPIO_Port, BTN3_Pin); + result.r2d = HAL_GPIO_ReadPin(BTN1_GPIO_Port, BTN1_Pin); + result.enter = HAL_GPIO_ReadPin(BTN2_GPIO_Port, BTN2_Pin); + result.enc0a = HAL_GPIO_ReadPin(ENC0A_GPIO_Port, ENC0A_Pin); + result.enc0b = HAL_GPIO_ReadPin(ENC0B_GPIO_Port, ENC0B_Pin); + result.enc1a = HAL_GPIO_ReadPin(ENC1A_GPIO_Port, ENC1A_Pin); + result.enc1b = HAL_GPIO_ReadPin(ENC1B_GPIO_Port, ENC1B_Pin); + return result; +} diff --git a/Core/Src/vehicle.c b/Core/Src/vehicle.c index 41c632d..0ae0a0f 100644 --- a/Core/Src/vehicle.c +++ b/Core/Src/vehicle.c @@ -2,6 +2,7 @@ #include "main.h" #include "state.h" +#include "user_inputs.h" #include "stm32g4xx_hal_def.h" #include "stm32g4xx_hal_fdcan.h" @@ -47,7 +48,7 @@ void vehicle_init(FDCAN_HandleTypeDef* handle) { } } -void vehicle_send_mission_select(Mission mission) { +HAL_StatusTypeDef vehicle_send_mission_select(Mission mission) { // TODO: Automatically resend this until it's acknowledged FDCAN_TxHeaderTypeDef header; header.Identifier = CAN_ID_MISSION_SELECT; @@ -62,9 +63,28 @@ void vehicle_send_mission_select(Mission mission) { uint8_t data[1]; data[0] = mission; - if (HAL_FDCAN_AddMessageToTxFifoQ(can, &header, data) != HAL_OK) { - Error_Handler(); - } + return HAL_FDCAN_AddMessageToTxFifoQ(can, &header, data); +} + +HAL_StatusTypeDef vehicle_send_buttons() { + FDCAN_TxHeaderTypeDef header; + header.Identifier = CAN_ID_BUTTONS; + header.IdType = FDCAN_STANDARD_ID; + header.TxFrameType = FDCAN_DATA_FRAME; + header.DataLength = FDCAN_DLC_BYTES_1; + header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; + header.BitRateSwitch = FDCAN_BRS_OFF; + header.FDFormat = FDCAN_CLASSIC_CAN; + header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + header.MessageMarker = 0; + + ButtonsState buttons = get_buttons_state(); + uint8_t data[1]; + data[0] = (buttons.left ? CAN_BUTTONS_LEFT : 0) | + (buttons.right ? CAN_BUTTONS_RIGHT : 0) | + (buttons.r2d ? CAN_BUTTONS_R2D : 0) | + (buttons.enter ? CAN_BUTTONS_ENTER : 0); + return HAL_FDCAN_AddMessageToTxFifoQ(can, &header, data); } /* BEGIN CAN MESSAGE HANDLERS { */