make button and switch changes atomic
This commit is contained in:
parent
edd2e31321
commit
8b5fc40ee5
135
Core/Src/main.c
135
Core/Src/main.c
@ -49,6 +49,7 @@ UART_HandleTypeDef huart2;
|
|||||||
|
|
||||||
/* USER CODE BEGIN PV */
|
/* USER CODE BEGIN PV */
|
||||||
/* Bitwise changed buffer */
|
/* Bitwise changed buffer */
|
||||||
|
uint8_t old_delta;
|
||||||
uint8_t delta;
|
uint8_t delta;
|
||||||
|
|
||||||
#define DELTA_KP_BIT 0
|
#define DELTA_KP_BIT 0
|
||||||
@ -65,27 +66,14 @@ uint8_t i2c_register;
|
|||||||
#define I2C_REGISTER_RFID_PRESENT 4
|
#define I2C_REGISTER_RFID_PRESENT 4
|
||||||
#define I2C_REGISTER_RFID_ID 5
|
#define I2C_REGISTER_RFID_ID 5
|
||||||
|
|
||||||
// Keeps track of the current state of receiving on the I2C bus.
|
uint16_t old_keypad_state = 0;
|
||||||
uint8_t i2c_reciving_status;
|
uint16_t keypad_state = 0;
|
||||||
|
|
||||||
#define I2C_RECEIVING_NONE 0
|
uint16_t old_button_state = 0;
|
||||||
#define I2C_RECEIVING_REGISTER 1
|
uint16_t button_state = 0;
|
||||||
|
|
||||||
// Keeps track of the current state of transmitting on the I2C bus.
|
uint8_t old_card_present = 0;
|
||||||
uint8_t i2c_transmitting_status;
|
uint8_t card_present = 0;
|
||||||
|
|
||||||
#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;
|
|
||||||
|
|
||||||
#define CARD_ID_LEN 4
|
#define CARD_ID_LEN 4
|
||||||
uint8_t old_card_id[CARD_ID_LEN] = {0};
|
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)
|
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
|
||||||
#endif /* __GNUC__ */
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
void init_keypad(void);
|
|
||||||
void init_buttons(void);
|
|
||||||
|
|
||||||
void scan_keypad(void);
|
void scan_keypad(void);
|
||||||
void scan_buttons(void);
|
void scan_buttons(void);
|
||||||
|
|
||||||
void send_iterupt(void);
|
|
||||||
void rfid_check_card(void);
|
void rfid_check_card(void);
|
||||||
|
|
||||||
|
void send_iterupt(void);
|
||||||
|
|
||||||
void printBinary(uint16_t num) {
|
void printBinary(uint16_t num) {
|
||||||
for (int i = 15; i >= 0; --i) {
|
for (int i = 15; i >= 0; --i) {
|
||||||
@ -163,35 +147,26 @@ int main(void)
|
|||||||
MX_SPI1_Init();
|
MX_SPI1_Init();
|
||||||
MX_USART2_UART_Init();
|
MX_USART2_UART_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
init_keypad();
|
|
||||||
init_buttons();
|
// rc522_init();
|
||||||
rc522_init();
|
|
||||||
HAL_I2C_EnableListen_IT(&hi2c1);
|
HAL_I2C_EnableListen_IT(&hi2c1);
|
||||||
printf("initialized\r\n");
|
// printf("initialized\r\n");
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
/* USER CODE BEGIN WHILE */
|
/* USER CODE BEGIN WHILE */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
// HAL_Delay(500);
|
// HAL_Delay(1);
|
||||||
scan_keypad();
|
scan_keypad();
|
||||||
scan_buttons();
|
scan_buttons();
|
||||||
rfid_check_card();
|
// rfid_check_card();
|
||||||
// send_iterupt();
|
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("s: %d\r\n", keypad_state);
|
||||||
// printf("r: %d\r\n", recv_cnt);
|
// 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]);
|
// 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 */
|
/* USER CODE END WHILE */
|
||||||
|
|
||||||
@ -512,7 +487,6 @@ void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, ui
|
|||||||
} else {
|
} else {
|
||||||
send_register();
|
send_register();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t send_data[2];
|
uint8_t send_data[2];
|
||||||
@ -521,6 +495,7 @@ void send_register(void) {
|
|||||||
case I2C_REGISTER_DELTA:
|
case I2C_REGISTER_DELTA:
|
||||||
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME);
|
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I2C_REGISTER_KEYPAD:
|
case I2C_REGISTER_KEYPAD:
|
||||||
send_data[0] = keypad_state & 0xFF;
|
send_data[0] = keypad_state & 0xFF;
|
||||||
send_data[1] = keypad_state >> 8;
|
send_data[1] = keypad_state >> 8;
|
||||||
@ -550,81 +525,15 @@ void send_register(void) {
|
|||||||
|
|
||||||
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
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)
|
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)
|
void scan_keypad(void)
|
||||||
{
|
{
|
||||||
old_keypad_state = keypad_state;
|
uint16_t new_keypad_state = 0;
|
||||||
keypad_state = 0;
|
|
||||||
|
|
||||||
HAL_GPIO_WritePin(KP_C1_GPIO_Port, KP_C1_Pin, GPIO_PIN_RESET);
|
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;
|
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;
|
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);
|
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) {
|
if (keypad_state != old_keypad_state) {
|
||||||
delta |= 1 << DELTA_KP_BIT;
|
delta |= 1 << DELTA_KP_BIT;
|
||||||
}
|
}
|
||||||
@ -661,8 +572,7 @@ void scan_keypad(void)
|
|||||||
|
|
||||||
void scan_buttons(void)
|
void scan_buttons(void)
|
||||||
{
|
{
|
||||||
old_button_state = button_state;
|
uint16_t new_button_state = 0;
|
||||||
button_state = 0;
|
|
||||||
|
|
||||||
HAL_GPIO_WritePin(COL1_GPIO_Port, COL1_Pin, GPIO_PIN_SET);
|
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;
|
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!
|
// TODO: read the touch sensors here too!
|
||||||
|
|
||||||
|
old_button_state = button_state;
|
||||||
|
button_state = new_button_state;
|
||||||
if (button_state != old_button_state) {
|
if (button_state != old_button_state) {
|
||||||
delta |= 1 << DELTA_KP_BIT;
|
delta |= 1 << DELTA_KP_BIT;
|
||||||
}
|
}
|
||||||
@ -714,7 +626,10 @@ void rfid_check_card() {
|
|||||||
|
|
||||||
void send_iterupt(void)
|
void send_iterupt(void)
|
||||||
{
|
{
|
||||||
|
if (delta != old_delta) {
|
||||||
|
old_delta = delta;
|
||||||
HAL_GPIO_WritePin(INT_GPIO_Port, INT_Pin, delta != 0);
|
HAL_GPIO_WritePin(INT_GPIO_Port, INT_Pin, delta != 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* USER CODE END 4 */
|
/* USER CODE END 4 */
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user