updates to bottom half code and "debug switches" helper

This commit is contained in:
2025-03-25 19:27:20 -05:00
parent b594d6fcb3
commit 5bb6b05002
9 changed files with 243 additions and 191 deletions
+1
View File
@@ -1,4 +1,5 @@
set(SOURCES
"all.cpp"
"TM1640/TM16xx.cpp"
"TM1640/TM1640.cpp"
"SparkFunBQ27441/SparkFunBQ27441.cpp"
+3 -2
View File
@@ -5,7 +5,7 @@ static void init_i2c();
void init_drivers() {
init_i2c();
// init char_lcd so we can use it to report other initialization errors.
init_char_lcd();
init_lcd();
// init the bottom half so that we can get user input.
init_bottom_half();
init_sd();
@@ -31,7 +31,8 @@ static void init_i2c() {
// .scl_pullup_en = GPIO_PULLUP_ENABLE,
.master = {
.clk_speed = 100*1000,
}
},
.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL
};
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf));
+141 -120
View File
@@ -3,27 +3,145 @@
static const char *TAG = "bottom_half";
static uint16_t keypad_state;
static uint16_t button_state;
static uint8_t button_state;
static uint8_t switch_state;
static uint8_t touch_state;
static uint16_t keypad_pressed;
static uint16_t button_pressed;
static uint8_t button_pressed;
static uint8_t switch_flipped_up;
static uint8_t touch_pressed;
static uint16_t keypad_released;
static uint16_t button_released;
static uint8_t button_released;
static uint8_t switch_flipped_down;
static uint8_t touch_released;
/// read buffer
static uint8_t buf[8];
static void poll_bottom_task(void *arg);
static void receive_keypad();
static void receive_button_switch();
static void receive_touch();
// TODO: add intrupt on bottom half delta pin
// static void IRAM_ATTR gpio_isr_handler(void* arg)
// {
// // TODO: do somthing
// ESP_LOGI("BOTTOM_HALF", "Hit");
// }
void init_bottom_half() {
ESP_ERROR_CHECK(gpio_set_direction(BOTTOM_PIN_INTERUPT, GPIO_MODE_INPUT));
ESP_ERROR_CHECK(gpio_set_pull_mode(BOTTOM_PIN_INTERUPT, GPIO_PULLUP_ONLY));
// TODO: do interupt stuff.
// ESP_ERROR_CHECK(gpio_intr_enable(BOTTOM_PIN_INTERUPT));
// ESP_ERROR_CHECK(gpio_install_isr_service(ESP_INTR_FLAG))
//install gpio isr service
// gpio_install_isr_service(0);
//hook isr handler for specific gpio pin
// gpio_isr_handler_add(BOTTOM_INTERUPT_PIN, gpio_isr_handler, NULL);
receive_keypad();
receive_button_switch();
receive_touch();
xTaskCreate(poll_bottom_task, "poll_bottom", 4096, NULL, 10, NULL);
}
static uint8_t receive_delta(void) {
uint8_t reg = 1;
buf[0] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 1, (100 / portTICK_PERIOD_MS)));
return buf[0];
}
static void receive_keypad(void) {
uint8_t reg = 2;
buf[0] = 0;
buf[1] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
uint16_t new_keypad_state = buf[0] | (buf[1] << 8);
uint16_t just_pressed = new_keypad_state & ~keypad_state;
keypad_pressed |= just_pressed;
uint16_t just_released = ~new_keypad_state & keypad_state;
keypad_released |= just_released;
keypad_state = new_keypad_state;
}
static void receive_button_switch(void) {
uint8_t reg = 3;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
uint8_t new_button_state = buf[1];
uint8_t new_switch_state = buf[0];
// button
uint8_t just_pressed = new_button_state & ~button_state;
button_pressed |= just_pressed;
uint8_t just_released = ~new_button_state & button_state;
button_released |= just_released;
button_state = new_button_state;
// switch
uint8_t just_flipped_down = new_switch_state & ~switch_state;
switch_flipped_down |= just_flipped_down;
uint8_t just_flipped_up = ~new_switch_state & switch_state;
switch_flipped_up |= just_flipped_up;
switch_state = new_switch_state;
}
static void receive_touch(void) {
uint8_t reg = 4;
buf[0] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 1, (100 / portTICK_PERIOD_MS)));
bool new_touch_state = buf[0] != 0;
bool just_pressed = new_touch_state & !touch_state;
touch_pressed |= just_pressed;
bool just_released = (!new_touch_state) & touch_state;
touch_released |= just_released;
touch_state = new_touch_state;
}
static void poll_bottom_task(void *arg) {
// TODO: if using an interupt, switch this to use a queue
while (1) {
bool new_data = gpio_get_level(BOTTOM_PIN_INTERUPT) == 0;
if (new_data) {
uint8_t delta = receive_delta();
// ESP_LOGI(_TAG, "delta: %d", delta);
if (delta == 0) ESP_LOGW(TAG, "delta pin was low, but delta register returned 0");
if (delta & (1 << DELTA_BIT_KP)) receive_keypad();
if (delta & (1 << DELTA_BIT_BUTTON_SWITCH)) receive_button_switch();
if (delta & (1 << DELTA_BIT_TOUCH)) receive_touch();
}
vTaskDelay(pdMS_TO_TICKS(10));
}
vTaskDelete(NULL);
}
void clear_all_pressed_released(void) {
keypad_pressed = 0;
button_pressed = 0;
switch_flipped_up = 0;
touch_pressed = 0;
keypad_released = 0;
button_released = 0;
switch_flipped_down = 0;
touch_released = 0;
}
@@ -88,9 +206,12 @@ char char_of_keypad_key(KeypadKey kp) {
}
}
static bool _take_button(ButtonKey* button, uint16_t* button_bitfield) {
static bool _take_button(ButtonKey* button, uint8_t* button_bitfield) {
if (((*button_bitfield) & 0xF) == 0) return false;
// scan the 4 button bits for one that is set
for (int i = 0; i < 4; i++) {
int bit_selector = (1 << (i+8));
int bit_selector = (1 << i);
if ((*button_bitfield) & bit_selector) {
if (button != nullptr) {
*button = (ButtonKey) i;
@@ -102,15 +223,18 @@ static bool _take_button(ButtonKey* button, uint16_t* button_bitfield) {
}
return false;
}
static bool _take_switch(SwitchKey* switch_, uint16_t* button_bitfield) {
static bool _take_switch(SwitchKey* switch_, uint8_t* switch_bitfield) {
if (((*switch_bitfield) & 0xF) == 0) return false;
// scan the 4 switch bits for one that is set
for (int i = 0; i < 4; i++) {
int bit_selector = (1 << i);
if ((*button_bitfield) & bit_selector) {
if ((*switch_bitfield) & bit_selector) {
if (switch_ != nullptr) {
*switch_ = (SwitchKey) i;
}
// clear bit
*button_bitfield &= ~bit_selector;
*switch_bitfield &= ~bit_selector;
return true;
}
}
@@ -123,21 +247,23 @@ bool get_pressed_button(ButtonKey* button) {
bool get_released_button(ButtonKey* button) {
return _take_button(button, &button_released);
}
uint8_t get_button_state() {
return (uint8_t)((button_state >> 8) & 0xF);
return button_state;
}
bool get_flipped_up_switch(SwitchKey* switch_) {
return _take_switch(switch_, &button_released);
return _take_switch(switch_, &switch_flipped_up);
}
bool get_flipped_down_switch(SwitchKey* switch_) {
return _take_switch(switch_, &button_released);
return _take_switch(switch_, &switch_flipped_down);
}
bool get_flipped_switch(SwitchKey* switch_) {
for (int i = 0; i < 4; i++) {
int bit_selector = (1 << (i+4));
if (button_pressed & bit_selector || button_released & bit_selector) {
int bit_selector = (1 << i);
if (
((switch_flipped_up & bit_selector) != 0) ||
((switch_flipped_down & bit_selector) != 0)
) {
if (switch_ != nullptr) {
*switch_ = (SwitchKey) i;
}
@@ -151,7 +277,7 @@ bool get_flipped_switch(SwitchKey* switch_) {
}
uint8_t get_switch_state() {
return (uint8_t)(~button_state & 0xF);
return (uint8_t)(~switch_state & 0xF);
}
bool get_touch_state(void) {
@@ -167,108 +293,3 @@ bool get_touch_released(void) {
touch_released = false;
return return_;
}
static void poll_bottom_task(void *arg);
static void receive_keypad(void);
static void receive_button(void);
static void receive_touch(void);
// TODO: add intrupt on bottom half delta pin
// static void IRAM_ATTR gpio_isr_handler(void* arg)
// {
// // TODO: do somthing
// ESP_LOGI("BOTTOM_HALF", "Hit");
// }
void init_bottom_half() {
gpio_config_t delta_pin_conf = {};
// delta_pin_conf.intr_type = GPIO_INTR_LOW_LEVEL;
delta_pin_conf.mode = GPIO_MODE_INPUT;
// GPIO 0
delta_pin_conf.pin_bit_mask = (1ULL<<BOTTOM_PIN_INTERUPT);
delta_pin_conf.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&delta_pin_conf);
//install gpio isr service
// gpio_install_isr_service(0);
//hook isr handler for specific gpio pin
// gpio_isr_handler_add(BOTTOM_INTERUPT_PIN, gpio_isr_handler, NULL);
receive_keypad();
receive_button();
receive_touch();
xTaskCreate(poll_bottom_task, "poll_bottom", 4096, NULL, 10, NULL);
}
static uint8_t receive_delta(void) {
uint8_t reg = 1;
buf[0] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 1, (100 / portTICK_PERIOD_MS)));
return buf[0];
}
static void receive_keypad(void) {
uint8_t reg = 2;
buf[0] = 0;
buf[1] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
uint16_t new_keypad_state = buf[0] | (buf[1] << 8);
uint16_t just_pressed = new_keypad_state & ~keypad_state;
keypad_pressed |= just_pressed;
uint16_t just_released = ~new_keypad_state & keypad_state;
keypad_released |= just_released;
keypad_state = new_keypad_state;
}
static void receive_button(void) {
uint8_t reg = 3;
buf[0] = 0;
buf[1] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
uint16_t new_button_state = buf[0] | (buf[1] << 8);
uint16_t just_pressed = new_button_state & ~button_state;
button_pressed |= just_pressed;
uint16_t just_released = ~new_button_state & button_state;
button_released |= just_released;
button_state = new_button_state;
}
static void receive_touch(void) {
uint8_t reg = 4;
buf[0] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, &reg, 1, buf, 1, (100 / portTICK_PERIOD_MS)));
bool new_touch_state = buf[0] != 0;
bool just_pressed = new_touch_state & !touch_state;
touch_pressed |= just_pressed;
bool just_released = (!new_touch_state) & touch_state;
touch_released |= just_released;
touch_state = new_touch_state;
}
static void poll_bottom_task(void *arg) {
while (1) {
bool new_data = gpio_get_level(BOTTOM_PIN_INTERUPT) == 0;
if (new_data) {
uint8_t delta = receive_delta();
// ESP_LOGI(_TAG, "delta: %d", delta);
if (delta == 0) ESP_LOGW(TAG, "delta pin was low, but delta register returned 0");
if (delta & (1 << DELTA_BIT_KP)) receive_keypad();
if (delta & (1 << DELTA_BIT_BUTTON)) receive_button();
if (delta & (1 << DELTA_BIT_TOUCH)) receive_touch();
}
vTaskDelay(pdMS_TO_TICKS(10));
}
vTaskDelete(NULL);
}
+5 -5
View File
@@ -10,7 +10,7 @@
#define BOTTOM_PIN_INTERUPT GPIO_NUM_0
#define DELTA_BIT_KP 0
#define DELTA_BIT_BUTTON 1
#define DELTA_BIT_BUTTON_SWITCH 1
#define DELTA_BIT_TOUCH 2
/// @brief An enum for the possible keypad buttons.
@@ -39,10 +39,10 @@ typedef enum {
b2 = 1,
b3 = 2,
b4 = 3,
green = 0,
red = 1,
yellow = 2,
blue = 3,
button_green = 0,
button_red = 1,
button_yellow = 2,
button_blue = 3,
} ButtonKey;
/// @brief An enum for the possible switches.
+1 -1
View File
@@ -7,7 +7,7 @@ i2c_lcd_pcf8574_handle_t lcd;
static const char *TAG = "char_lcd";
void init_char_lcd() {
void init_lcd() {
ESP_LOGI(TAG, "Initializing LCD");
lcd_init(&lcd, LCD_ADDR, CHAR_LCD_I2C_NUM);