498 lines
15 KiB
C
498 lines
15 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: CC0-1.0
|
|
*/
|
|
|
|
#include "app_button.h"
|
|
|
|
button_handle_t btns[16] = {0};
|
|
uint32_t g_pressed_button_value = 0;
|
|
rc_channel_state_t channel_state = {0};
|
|
|
|
void vibration_motor_init(void)
|
|
{
|
|
// Prepare and then apply the LEDC PWM timer configuration
|
|
ledc_timer_config_t ledc_timer = {
|
|
.speed_mode = LEDC_MODE,
|
|
.timer_num = LEDC_TIMER,
|
|
.duty_resolution = LEDC_DUTY_RES,
|
|
.freq_hz = LEDC_FREQUENCY, // Set output frequency at 5 kHz
|
|
.clk_cfg = LEDC_AUTO_CLK
|
|
};
|
|
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
|
|
|
|
// Prepare and then apply the LEDC PWM channel configuration
|
|
ledc_channel_config_t ledc_channel = {
|
|
.speed_mode = LEDC_MODE,
|
|
.channel = LEDC_CHANNEL,
|
|
.timer_sel = LEDC_TIMER,
|
|
.intr_type = LEDC_INTR_DISABLE,
|
|
.gpio_num = LEDC_OUTPUT_IO,
|
|
.duty = 0, // Set duty to 0%
|
|
.hpoint = 0
|
|
};
|
|
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
|
|
}
|
|
|
|
static void vibration_motor_open(void)
|
|
{
|
|
uint8_t vibration_feedback_state = get_vibration_feedback_state();
|
|
if (vibration_feedback_state) {
|
|
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY));
|
|
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
|
|
}
|
|
}
|
|
|
|
static void vibration_motor_close(void)
|
|
{
|
|
uint8_t vibration_feedback_state = get_vibration_feedback_state();
|
|
if (vibration_feedback_state) {
|
|
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0));
|
|
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
|
|
}
|
|
}
|
|
|
|
static void up_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "up button.");
|
|
g_pressed_button_value |= UP_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_upBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void up_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~UP_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_upBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void left_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "left button.");
|
|
g_pressed_button_value |= LEFT_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_leftBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void left_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~LEFT_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_leftBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void down_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "down button.");
|
|
g_pressed_button_value |= DOWN_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_downBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void down_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~DOWN_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_downBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void right_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "right button.");
|
|
g_pressed_button_value |= RIGHT_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rightBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void right_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~RIGHT_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rightBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void lb_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "LB button.");
|
|
g_pressed_button_value |= LB_BUTTON_MASK;
|
|
channel_state.channel_3_status = !channel_state.channel_3_status;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_lbBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void lb_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~LB_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_lbBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void lt_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "LT button.");
|
|
g_pressed_button_value |= LT_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_ltBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void lt_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~LT_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_ltBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void select_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "select button.");
|
|
g_pressed_button_value |= SELECT_BUTTON_MASK;
|
|
channel_state.channel_1_status = !channel_state.channel_1_status;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_selectBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void select_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~SELECT_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_selectBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void x_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "X button.");
|
|
g_pressed_button_value |= X_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_xBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void x_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~X_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_xBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void y_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "Y button.");
|
|
g_pressed_button_value |= Y_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_yBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
|
|
}
|
|
|
|
static void y_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~Y_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_yBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void a_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "A button.");
|
|
g_pressed_button_value |= A_BUTTON_MASK;
|
|
channel_state.channel_2_status = 1;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_aBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void a_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~A_BUTTON_MASK;
|
|
channel_state.channel_2_status = 0;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_aBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void b_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "B button.");
|
|
g_pressed_button_value |= B_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_bBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void b_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~B_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_bBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void rb_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "RB button.");
|
|
g_pressed_button_value |= RB_BUTTON_MASK;
|
|
channel_state.channel_4_status = !channel_state.channel_4_status;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rbBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void rb_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~RB_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rbBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void rt_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "RT button.");
|
|
g_pressed_button_value |= RT_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rtBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void rt_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~RT_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rtBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void start_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "start button.");
|
|
g_pressed_button_value |= START_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_startBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void start_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~START_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_startBtn, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void left_rocker_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "left rocker button.");
|
|
g_pressed_button_value |= LEFT_ROCKER_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_leftRockerBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void left_rocker_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~LEFT_ROCKER_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_leftRockerBtn, lv_color_hex(0xA8A8A8), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void right_rocker_button_press_down_cb(void *arg, void *data)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "right rocker button.");
|
|
g_pressed_button_value |= RIGHT_ROCKER_BUTTON_MASK;
|
|
vibration_motor_open();
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rightRockerBtn, lv_color_hex(0xF2A860), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
static void right_rocker_button_press_up_cb(void *arg, void *data)
|
|
{
|
|
vibration_motor_close();
|
|
g_pressed_button_value &= ~RIGHT_ROCKER_BUTTON_MASK;
|
|
bsp_display_lock(0);
|
|
lv_obj_set_style_bg_color(ui_rightRockerBtn, lv_color_hex(0xA8A8A8), LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
bsp_display_unlock();
|
|
}
|
|
|
|
button_cb_t button_press_down_cb[16] = {
|
|
up_button_press_down_cb,
|
|
left_button_press_down_cb,
|
|
down_button_press_down_cb,
|
|
right_button_press_down_cb,
|
|
lb_button_press_down_cb,
|
|
lt_button_press_down_cb,
|
|
select_button_press_down_cb,
|
|
left_rocker_button_press_down_cb,
|
|
y_button_press_down_cb,
|
|
x_button_press_down_cb,
|
|
a_button_press_down_cb,
|
|
b_button_press_down_cb,
|
|
rb_button_press_down_cb,
|
|
rt_button_press_down_cb,
|
|
start_button_press_down_cb,
|
|
right_rocker_button_press_down_cb,
|
|
};
|
|
|
|
button_cb_t button_press_up_cb[16] = {
|
|
up_button_press_up_cb,
|
|
left_button_press_up_cb,
|
|
down_button_press_up_cb,
|
|
right_button_press_up_cb,
|
|
lb_button_press_up_cb,
|
|
lt_button_press_up_cb,
|
|
select_button_press_up_cb,
|
|
left_rocker_button_press_up_cb,
|
|
y_button_press_up_cb,
|
|
x_button_press_up_cb,
|
|
a_button_press_up_cb,
|
|
b_button_press_up_cb,
|
|
rb_button_press_up_cb,
|
|
rt_button_press_up_cb,
|
|
start_button_press_up_cb,
|
|
right_rocker_button_press_up_cb,
|
|
};
|
|
|
|
static void configure_74hc165_pin(void)
|
|
{
|
|
ESP_LOGI(BUTTON_TAG, "Configure 74hc165d GPIO!");
|
|
gpio_reset_pin(HC165D_PL);
|
|
gpio_reset_pin(HC165D_CE);
|
|
gpio_reset_pin(HC165D_SCL);
|
|
gpio_reset_pin(HC165D_DATA);
|
|
/* Set the GPIO as a push/pull output */
|
|
gpio_set_direction(HC165D_PL, GPIO_MODE_OUTPUT);
|
|
gpio_set_direction(HC165D_CE, GPIO_MODE_OUTPUT);
|
|
gpio_set_direction(HC165D_SCL, GPIO_MODE_OUTPUT);
|
|
gpio_set_direction(HC165D_DATA, GPIO_MODE_INPUT);
|
|
gpio_set_level(HC165D_PL, 1);
|
|
gpio_set_level(HC165D_CE, 0);
|
|
gpio_set_level(HC165D_SCL, 1);
|
|
}
|
|
|
|
static uint16_t read_74hc165d_data(void)
|
|
{
|
|
uint16_t data = 0;
|
|
uint8_t i = 0;
|
|
uint8_t q7_bit = 0;
|
|
gpio_set_level(HC165D_PL, 0);
|
|
gpio_set_level(HC165D_PL, 1);
|
|
q7_bit = gpio_get_level(HC165D_DATA);
|
|
if (q7_bit == 1) {
|
|
data |= 0x01;
|
|
}
|
|
for (i = 0; i < 15; i++) {
|
|
data = data << 1;
|
|
gpio_set_level(HC165D_SCL, 0);
|
|
gpio_set_level(HC165D_SCL, 1);
|
|
q7_bit = gpio_get_level(HC165D_DATA);
|
|
if (q7_bit == 1) {
|
|
data |= 0x01;
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
static uint8_t get_button_value(void *btn_index)
|
|
{
|
|
int button_index = (int)btn_index;
|
|
uint16_t data = read_74hc165d_data();
|
|
uint16_t mask = 1 << button_index;
|
|
uint8_t button_value = (data & mask) >> button_index;
|
|
return button_value;
|
|
}
|
|
|
|
void box_rc_button_init(void)
|
|
{
|
|
configure_74hc165_pin();
|
|
button_config_t button_cfg = {
|
|
.type = BUTTON_TYPE_CUSTOM,
|
|
.long_press_time = 1000,
|
|
.short_press_time = 180,
|
|
.custom_button_config = {
|
|
.button_custom_get_key_value = get_button_value,
|
|
},
|
|
};
|
|
|
|
for (int i = 0; i < 16; i++) {
|
|
if (btns[i] == NULL) {
|
|
button_cfg.custom_button_config.priv = (void *)i;
|
|
if (i == 7 || i == 15) {
|
|
button_cfg.custom_button_config.active_level = 1;
|
|
} else {
|
|
button_cfg.custom_button_config.active_level = 0;
|
|
}
|
|
btns[i] = iot_button_create(&button_cfg);
|
|
iot_button_register_cb(btns[i], BUTTON_PRESS_DOWN, button_press_down_cb[i], NULL);
|
|
iot_button_register_cb(btns[i], BUTTON_PRESS_UP, button_press_up_cb[i], NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
void box_rc_button_delete(void)
|
|
{
|
|
for (int i = 0; i < 16; i++) {
|
|
iot_button_delete(btns[i]);
|
|
btns[i] = NULL;
|
|
ESP_LOGI(BUTTON_TAG, "button %d deleted.\n", i);
|
|
}
|
|
}
|
|
|
|
uint32_t get_pressed_button_value(void)
|
|
{
|
|
return g_pressed_button_value;
|
|
}
|
|
|
|
rc_channel_state_t get_rc_button_state(void)
|
|
{
|
|
return channel_state;
|
|
}
|