From 8b5fc40ee5ed1a2583c282626f83a6b8abd9cb0b Mon Sep 17 00:00:00 2001 From: Mitchell M Date: Tue, 13 Aug 2024 13:43:19 -0500 Subject: [PATCH] make button and switch changes atomic --- Core/Src/main.c | 137 +++++++++--------------------------------------- 1 file changed, 26 insertions(+), 111 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index f7acdc3..385b60c 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -49,6 +49,7 @@ UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ /* Bitwise changed buffer */ +uint8_t old_delta; uint8_t delta; #define DELTA_KP_BIT 0 @@ -65,27 +66,14 @@ uint8_t i2c_register; #define I2C_REGISTER_RFID_PRESENT 4 #define I2C_REGISTER_RFID_ID 5 -// Keeps track of the current state of receiving on the I2C bus. -uint8_t i2c_reciving_status; +uint16_t old_keypad_state = 0; +uint16_t keypad_state = 0; -#define I2C_RECEIVING_NONE 0 -#define I2C_RECEIVING_REGISTER 1 +uint16_t old_button_state = 0; +uint16_t button_state = 0; -// Keeps track of the current state of transmitting on the I2C bus. -uint8_t i2c_transmitting_status; - -#define I2C_TRANSMITTING_NONE 0 -#define I2C_TRANSMITTING_REGISTER 1 - - -uint16_t old_keypad_state; -uint16_t keypad_state; - -uint16_t old_button_state; -uint16_t button_state; - -uint8_t old_card_present; -uint8_t card_present; +uint8_t old_card_present = 0; +uint8_t card_present = 0; #define CARD_ID_LEN 4 uint8_t old_card_id[CARD_ID_LEN] = {0}; @@ -107,15 +95,11 @@ static void MX_USART2_UART_Init(void); #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ -void init_keypad(void); -void init_buttons(void); - void scan_keypad(void); void scan_buttons(void); - -void send_iterupt(void); void rfid_check_card(void); +void send_iterupt(void); void printBinary(uint16_t num) { for (int i = 15; i >= 0; --i) { @@ -163,35 +147,26 @@ int main(void) MX_SPI1_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ - init_keypad(); - init_buttons(); - rc522_init(); + + // rc522_init(); HAL_I2C_EnableListen_IT(&hi2c1); - printf("initialized\r\n"); + // printf("initialized\r\n"); + /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { -// HAL_Delay(500); + // HAL_Delay(1); scan_keypad(); scan_buttons(); - rfid_check_card(); -// send_iterupt(); + // rfid_check_card(); + send_iterupt(); -// // ensure we are listening for i2c requests -// if (i2c_reciving_status == I2C_RECEIVING_NONE) { -// // listen for a register value -// HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, &i2c_register, 1, I2C_NEXT_FRAME); -// i2c_reciving_status = I2C_RECEIVING_REGISTER; -// } -// printBinary(keypad_state); // printf("s: %d\r\n", keypad_state); // printf("r: %d\r\n", recv_cnt); // printf("d: %d %d %d %d, %d %d %d %d\r\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); -// HAL_I2C_Slave_Receive_IT(&hi2c1, (uint8_t*)&data, 8); - /* USER CODE END WHILE */ @@ -512,7 +487,6 @@ void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, ui } else { send_register(); } - } uint8_t send_data[2]; @@ -521,6 +495,7 @@ void send_register(void) { case I2C_REGISTER_DELTA: HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME); break; + case I2C_REGISTER_KEYPAD: send_data[0] = keypad_state & 0xFF; send_data[1] = keypad_state >> 8; @@ -550,81 +525,15 @@ void send_register(void) { void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) { -// uint8_t data[32]; -// int len = sprintf(data, "reg: %d", i2c_register); -// HAL_UART_Transmit(&huart2, data, len, 0xFFFF); - send_register(); } void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) { - -} - -//uint8_t send_value; -//void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef* hi2c) -//{ -// printf("cb\r\n"); -// -// if (i2c_reciving_status == I2C_RECEIVING_REGISTER) { -// i2c_transmitting_status = I2C_TRANSMITTING_REGISTER; -// -// switch (i2c_register) { -// case I2C_REGISTER_DELTA: -// HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME); -// break; -// case I2C_REGISTER_KEYPAD_L: -// send_value = keypad_state & 0xFF; -// HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &send_value, 1, I2C_NEXT_FRAME); -// break; -// case I2C_REGISTER_KEYPAD_H: -// send_value = keypad_state >> 8; -// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1); -// break; -// -// case I2C_REGISTER_BUTTON_L: -// send_value = button_state & 0xFF; -// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1); -// break; -// case I2C_REGISTER_BUTTON_H: -// send_value = button_state >> 8; -// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1); -// break; -// -// case I2C_REGISTER_RFID_PRESENT: -// HAL_I2C_Slave_Transmit_IT(&hi2c1, &card_present, 1); -// break; -// case I2C_REGISTER_RFID_ID: -// HAL_I2C_Slave_Transmit_IT(&hi2c1, card_id, 4); -// break; -// } -// } -// -// // TODO: handle any other receiving status possibilities -// -// // clear receiving status -// i2c_reciving_status = I2C_RECEIVING_NONE; -//} - -void init_keypad(void) -{ - HAL_GPIO_WritePin(KP_C1_GPIO_Port, KP_C1_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(KP_C2_GPIO_Port, KP_C2_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(KP_C3_GPIO_Port, KP_C3_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(KP_C4_GPIO_Port, KP_C4_Pin, GPIO_PIN_SET); -} - -void init_buttons(void) -{ - HAL_GPIO_WritePin(COL1_GPIO_Port, COL1_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(COL2_GPIO_Port, COL2_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(COL3_GPIO_Port, COL3_Pin, GPIO_PIN_SET); } void scan_keypad(void) { - old_keypad_state = keypad_state; - keypad_state = 0; + uint16_t new_keypad_state = 0; HAL_GPIO_WritePin(KP_C1_GPIO_Port, KP_C1_Pin, GPIO_PIN_RESET); keypad_state |= (HAL_GPIO_ReadPin(KP_R1_GPIO_Port, KP_R1_Pin) == GPIO_PIN_RESET) << 0; @@ -654,6 +563,8 @@ void scan_keypad(void) keypad_state |= (HAL_GPIO_ReadPin(KP_R4_GPIO_Port, KP_R4_Pin) == GPIO_PIN_RESET) << 15; HAL_GPIO_WritePin(KP_C4_GPIO_Port, KP_C4_Pin, GPIO_PIN_SET); + old_keypad_state = keypad_state; + keypad_state = new_keypad_state; if (keypad_state != old_keypad_state) { delta |= 1 << DELTA_KP_BIT; } @@ -661,8 +572,7 @@ void scan_keypad(void) void scan_buttons(void) { - old_button_state = button_state; - button_state = 0; + uint16_t new_button_state = 0; HAL_GPIO_WritePin(COL1_GPIO_Port, COL1_Pin, GPIO_PIN_SET); button_state |= (HAL_GPIO_ReadPin(ROW1_GPIO_Port, ROW1_Pin) == GPIO_PIN_RESET) << 0; @@ -687,6 +597,8 @@ void scan_buttons(void) // TODO: read the touch sensors here too! + old_button_state = button_state; + button_state = new_button_state; if (button_state != old_button_state) { delta |= 1 << DELTA_KP_BIT; } @@ -714,7 +626,10 @@ void rfid_check_card() { void send_iterupt(void) { - HAL_GPIO_WritePin(INT_GPIO_Port, INT_Pin, delta != 0); + if (delta != old_delta) { + old_delta = delta; + HAL_GPIO_WritePin(INT_GPIO_Port, INT_Pin, delta != 0); + } } /* USER CODE END 4 */