add keypad module, fix keys gpio define

This commit is contained in:
Sheikah
2023-01-24 00:44:56 +08:00
parent df4db6d8c4
commit 22f90eb896
9 changed files with 154 additions and 32 deletions

71
Core/App/Input/keypad.c Normal file
View File

@ -0,0 +1,71 @@
#include <stdint.h>
#include "keypad.h"
#include "gpio.h"
#include "RotaryCoder.h"
static uint8_t key_status = 0;
static uint16_t encoder_value = 0;
static GPIO_TypeDef *ports[] = {
KEY_1_GPIO_Port,
KEY_2_GPIO_Port,
KEY_3_GPIO_Port,
KEY_4_GPIO_Port,
KEY_5_GPIO_Port,
KEY_6_GPIO_Port,
ENCODER_KEY_GPIO_Port
};
static uint16_t pins[] = {
KEY_1_Pin,
KEY_2_Pin,
KEY_3_Pin,
KEY_4_Pin,
KEY_5_Pin,
KEY_6_Pin,
ENCODER_KEY_Pin
};
static uint8_t keys[] = {
kp_KEY1,
kp_KEY2,
kp_KEY3,
kp_KEY4,
kp_KEY5,
kp_KEY6,
kp_KEYENCODER
};
#define K_GET(x) (((0b1 << x) & key_status) >> x)
#define K_SET0(x) (key_status = (~(0b1 << x)) & key_status)
#define K_SET1(x) (key_status = (0b1 << x) | key_status)
#define K_HGET(x) (HAL_GPIO_ReadPin(ports[x], pins[x]) == GPIO_PIN_RESET)
#define K_EVENT(event, value) ((value << 4) | event)
uint8_t kp_query() {
// Scan keypad
uint16_t rota_value = EC11_COUNT();
uint16_t differ = rota_value - encoder_value;
uint8_t direction = kp_ROTATE_LEFT;
if (differ > 0) {
if (differ > 32768) {
differ = 0xFFFF - differ + 1;
direction = kp_ROTATE_RIGHT;
}
differ = differ / 2; // filter 2x
}
if (differ > 0) {
encoder_value = rota_value;
return K_EVENT(direction, differ);
}
uint8_t state, mstate, key_n;
for (key_n = 0; key_n < sizeof(keys); key_n ++) {
state = K_HGET(key_n);
mstate = K_GET(key_n);
if (state && (!mstate)) {
K_SET1(key_n);
return K_EVENT(kp_KEY_DOWN, keys[key_n]);
} else if ((!state) && mstate) {
K_SET0(key_n);
return K_EVENT(kp_KEY_UP, keys[key_n]);
}
}
return K_EVENT(kp_NOP, 0);
}

21
Core/App/Input/keypad.h Normal file
View File

@ -0,0 +1,21 @@
#pragma once
#define kp_NOP 0x0
#define kp_KEY_DOWN 0x1
#define kp_KEY_UP 0x2
#define kp_ROTATE_LEFT 0x3
#define kp_ROTATE_RIGHT 0x4
#define kp_KEY1 0x0
#define kp_KEY2 0x1
#define kp_KEY3 0x2
#define kp_KEY4 0x3
#define kp_KEY5 0x4
#define kp_KEY6 0x5
#define kp_KEYENCODER 0x6
#define kp_Type(x) (x & 0b1111)
#define kp_Value(x) (x >> 4)
// query and return keypad event
uint8_t kp_query();

View File

@ -1,11 +1,27 @@
#include "gpio.h"
#include "ui.h"
#include "keypad.h"
void app_init() {
// 程序开始时执行一次
ui_screen_main();
kp_query();
printf("\n====start====\n");
}
#include "gpio.h" //test
void app_main_loop() {
HAL_GPIO_TogglePin(LED_STATUS_GPIO_Port,LED_STATUS_Pin);
HAL_Delay(300);
// 反复被调用执行
// HAL_GPIO_TogglePin(LED_STATUS_GPIO_Port,LED_STATUS_Pin);
// HAL_Delay(1000);
uint8_t event = kp_query();
uint8_t event_type = kp_Type(event);
uint8_t event_value = kp_Value(event);
// printf("Raw Event Value: %d\n", event);
if (event_type != kp_NOP) {
printf("event: %d, key: %d\n", event_type, event_value);
}
GPIO_PinState state = HAL_GPIO_ReadPin(ENCODER_KEY_GPIO_Port, ENCODER_KEY_Pin);
HAL_GPIO_WritePin(LED_STATUS_GPIO_Port, LED_STATUS_Pin, state);
}