mirror of
https://github.com/whowechina/chu_pico.git
synced 2025-03-01 15:30:33 +01:00
Support for 3 aux buttons
This commit is contained in:
parent
26574899b5
commit
719058f5aa
Binary file not shown.
@ -8,7 +8,7 @@ link_libraries(pico_multicore pico_stdlib hardware_i2c hardware_spi
|
|||||||
|
|
||||||
function(make_firmware board board_def)
|
function(make_firmware board board_def)
|
||||||
add_executable(${board}
|
add_executable(${board}
|
||||||
main.c slider.c air.c rgb.c save.c config.c commands.c
|
main.c slider.c air.c rgb.c button.c save.c config.c commands.c
|
||||||
cli.c lzfx.c vl53l0x.c mpr121.c usb_descriptors.c)
|
cli.c lzfx.c vl53l0x.c mpr121.c usb_descriptors.c)
|
||||||
target_compile_definitions(${board} PUBLIC ${board_def})
|
target_compile_definitions(${board} PUBLIC ${board_def})
|
||||||
pico_enable_stdio_usb(${board} 1)
|
pico_enable_stdio_usb(${board} 1)
|
||||||
|
@ -17,12 +17,13 @@
|
|||||||
#define IR_GROUP_ABC_GPIO { 3, 4, 5 }
|
#define IR_GROUP_ABC_GPIO { 3, 4, 5 }
|
||||||
#define IR_SIG_ADC_CHANNEL { 0, 1 }
|
#define IR_SIG_ADC_CHANNEL { 0, 1 }
|
||||||
|
|
||||||
|
#define BUTTON_DEF { 13, 14, 15 }
|
||||||
#define RGB_MAIN_PIN 2
|
#define RGB_MAIN_PIN 2
|
||||||
#define RGB_TOWER_LEFT_PIN 0
|
#define RGB_TOWER_LEFT_PIN 0
|
||||||
#define RGB_TOWER_RIGHT_PIN 1
|
#define RGB_TOWER_RIGHT_PIN 1
|
||||||
#define RGB_ORDER GRB // or RGB
|
#define RGB_ORDER GRB // or RGB
|
||||||
|
|
||||||
#define NKRO_KEYMAP "1aqz2swx3dec4frv5gtb6hyn7jum8ki90olp,."
|
#define NKRO_KEYMAP "1aqz2swx3dec4frv5gtb6hyn7jum8ki90olp,.[]\\"
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
82
firmware/src/button.c
Normal file
82
firmware/src/button.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Controller Buttons
|
||||||
|
* WHowe <github.com/whowechina>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "button.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "hardware/gpio.h"
|
||||||
|
#include "hardware/timer.h"
|
||||||
|
|
||||||
|
#include "board_defs.h"
|
||||||
|
|
||||||
|
static const uint8_t button_gpio[] = BUTTON_DEF;
|
||||||
|
|
||||||
|
#define BUTTON_NUM (sizeof(button_gpio))
|
||||||
|
|
||||||
|
static bool sw_val[BUTTON_NUM]; /* true if pressed */
|
||||||
|
static uint64_t sw_freeze_time[BUTTON_NUM];
|
||||||
|
|
||||||
|
static uint16_t button_reading;
|
||||||
|
|
||||||
|
void button_init()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < BUTTON_NUM; i++) {
|
||||||
|
sw_val[i] = false;
|
||||||
|
sw_freeze_time[i] = 0;
|
||||||
|
int8_t gpio = button_gpio[i];
|
||||||
|
gpio_init(gpio);
|
||||||
|
gpio_set_function(gpio, GPIO_FUNC_SIO);
|
||||||
|
gpio_set_dir(gpio, GPIO_IN);
|
||||||
|
gpio_pull_up(gpio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make valid initial reading */
|
||||||
|
button_reading = 0;
|
||||||
|
for (int i = 0; i < BUTTON_NUM; i++) {
|
||||||
|
sw_val[i] = !gpio_get(button_gpio[i]);
|
||||||
|
if (sw_val[i]) {
|
||||||
|
button_reading |= (1 << i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t button_num()
|
||||||
|
{
|
||||||
|
return BUTTON_NUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If a switch flips, it freezes for a while */
|
||||||
|
#define DEBOUNCE_FREEZE_TIME_US 3000
|
||||||
|
void button_update()
|
||||||
|
{
|
||||||
|
uint64_t now = time_us_64();
|
||||||
|
uint16_t buttons = 0;
|
||||||
|
|
||||||
|
for (int i = BUTTON_NUM - 1; i >= 0; i--) {
|
||||||
|
bool sw_pressed = !gpio_get(button_gpio[i]);
|
||||||
|
|
||||||
|
if (now >= sw_freeze_time[i]) {
|
||||||
|
if (sw_pressed != sw_val[i]) {
|
||||||
|
sw_val[i] = sw_pressed;
|
||||||
|
sw_freeze_time[i] = now + DEBOUNCE_FREEZE_TIME_US;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons <<= 1;
|
||||||
|
if (sw_val[i]) {
|
||||||
|
buttons |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button_reading = buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t button_read()
|
||||||
|
{
|
||||||
|
return button_reading;
|
||||||
|
}
|
18
firmware/src/button.h
Normal file
18
firmware/src/button.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Controller Buttons
|
||||||
|
* WHowe <github.com/whowechina>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BUTTON_H
|
||||||
|
#define BUTTON_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "hardware/flash.h"
|
||||||
|
|
||||||
|
void button_init();
|
||||||
|
uint8_t button_num();
|
||||||
|
void button_update();
|
||||||
|
uint16_t button_read();
|
||||||
|
|
||||||
|
#endif
|
@ -35,6 +35,7 @@
|
|||||||
#include "slider.h"
|
#include "slider.h"
|
||||||
#include "air.h"
|
#include "air.h"
|
||||||
#include "rgb.h"
|
#include "rgb.h"
|
||||||
|
#include "button.h"
|
||||||
#include "lzfx.h"
|
#include "lzfx.h"
|
||||||
|
|
||||||
struct __attribute__((packed)) {
|
struct __attribute__((packed)) {
|
||||||
@ -82,10 +83,15 @@ static void gen_joy_report()
|
|||||||
|
|
||||||
/* to cope with Redboard mapping which I don't really understand why */
|
/* to cope with Redboard mapping which I don't really understand why */
|
||||||
hid_joy.buttons = ((airmap >> 1) & 0x07) | ((airmap & 0x01) << 3) | (airmap & 0x30);
|
hid_joy.buttons = ((airmap >> 1) & 0x07) | ((airmap & 0x01) << 3) | (airmap & 0x30);
|
||||||
|
|
||||||
|
uint16_t aux = button_read();
|
||||||
|
hid_joy.buttons |= (aux & 0x01) ? 0x200 : 0; // START
|
||||||
|
hid_joy.buttons |= (aux & 0x02) ? 0x100 : 0; // SERVICE
|
||||||
|
hid_joy.buttons |= (aux & 0x04) ? 0x1000 : 0; // TEST
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t keycode_table[128][2] = { HID_ASCII_TO_KEYCODE };
|
const uint8_t keycode_table[128][2] = { HID_ASCII_TO_KEYCODE };
|
||||||
const uint8_t keymap[38 + 1] = NKRO_KEYMAP; // 32 keys, 6 air keys, 1 terminator
|
const uint8_t keymap[41 + 1] = NKRO_KEYMAP; // 32 keys, 6 air keys, 3 aux, 1 terminator
|
||||||
static void gen_nkro_report()
|
static void gen_nkro_report()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 32; i++) {
|
for (int i = 0; i < 32; i++) {
|
||||||
@ -110,6 +116,18 @@ static void gen_nkro_report()
|
|||||||
hid_nkro.keymap[byte] &= ~(1 << bit);
|
hid_nkro.keymap[byte] &= ~(1 << bit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t aux = button_read();
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
uint8_t code = keycode_table[keymap[38 + i]][1];
|
||||||
|
uint8_t byte = code / 8;
|
||||||
|
uint8_t bit = code % 8;
|
||||||
|
if (aux & (1 << i)) {
|
||||||
|
hid_nkro.keymap[byte] |= (1 << bit);
|
||||||
|
} else {
|
||||||
|
hid_nkro.keymap[byte] &= ~(1 << bit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t last_hid_time = 0;
|
static uint64_t last_hid_time = 0;
|
||||||
@ -172,6 +190,28 @@ static void aime_run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void runtime_ctrl()
|
||||||
|
{
|
||||||
|
/* Just use long-press SERVICE to reset touch in runtime */
|
||||||
|
static bool applied = false;
|
||||||
|
static uint64_t press_time = 0;
|
||||||
|
static bool last_svc_button = false;
|
||||||
|
bool svc_button = button_read() & 0x02;
|
||||||
|
|
||||||
|
if (svc_button) {
|
||||||
|
if (!last_svc_button) {
|
||||||
|
press_time = time_us_64();
|
||||||
|
applied = false;
|
||||||
|
}
|
||||||
|
if (!applied && (time_us_64() - press_time > 2000000)) {
|
||||||
|
slider_sensor_init();
|
||||||
|
applied = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last_svc_button = svc_button;
|
||||||
|
}
|
||||||
|
|
||||||
static mutex_t core1_io_lock;
|
static mutex_t core1_io_lock;
|
||||||
static void core1_loop()
|
static void core1_loop()
|
||||||
{
|
{
|
||||||
@ -199,10 +239,37 @@ static void core0_loop()
|
|||||||
|
|
||||||
slider_update();
|
slider_update();
|
||||||
air_update();
|
air_update();
|
||||||
|
button_update();
|
||||||
|
|
||||||
gen_joy_report();
|
gen_joy_report();
|
||||||
gen_nkro_report();
|
gen_nkro_report();
|
||||||
report_usb_hid();
|
report_usb_hid();
|
||||||
|
|
||||||
|
runtime_ctrl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if certain key pressed when booting, enter update mode */
|
||||||
|
static void update_check()
|
||||||
|
{
|
||||||
|
const uint8_t pins[] = BUTTON_DEF;
|
||||||
|
int pressed = 0;
|
||||||
|
for (int i = 0; i < count_of(pins); i++) {
|
||||||
|
uint8_t gpio = pins[i];
|
||||||
|
gpio_init(gpio);
|
||||||
|
gpio_set_function(gpio, GPIO_FUNC_SIO);
|
||||||
|
gpio_set_dir(gpio, GPIO_IN);
|
||||||
|
gpio_pull_up(gpio);
|
||||||
|
sleep_ms(1);
|
||||||
|
if (!gpio_get(gpio)) {
|
||||||
|
pressed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pressed >= 2) {
|
||||||
|
sleep_ms(100);
|
||||||
|
reset_usb_boot(0, 2);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,6 +278,9 @@ void init()
|
|||||||
sleep_ms(50);
|
sleep_ms(50);
|
||||||
set_sys_clock_khz(150000, true);
|
set_sys_clock_khz(150000, true);
|
||||||
board_init();
|
board_init();
|
||||||
|
|
||||||
|
update_check();
|
||||||
|
|
||||||
tusb_init();
|
tusb_init();
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
|
|
||||||
@ -218,6 +288,7 @@ void init()
|
|||||||
mutex_init(&core1_io_lock);
|
mutex_init(&core1_io_lock);
|
||||||
save_init(0xca34cafe, &core1_io_lock);
|
save_init(0xca34cafe, &core1_io_lock);
|
||||||
|
|
||||||
|
button_init();
|
||||||
slider_init();
|
slider_init();
|
||||||
air_init();
|
air_init();
|
||||||
rgb_init();
|
rgb_init();
|
||||||
|
@ -27,6 +27,14 @@ static uint16_t touch[3];
|
|||||||
static unsigned touch_count[36];
|
static unsigned touch_count[36];
|
||||||
static bool present[3];
|
static bool present[3];
|
||||||
|
|
||||||
|
void slider_sensor_init()
|
||||||
|
{
|
||||||
|
for (int m = 0; m < 3; m++) {
|
||||||
|
mpr121_init(MPR121_ADDR + m);
|
||||||
|
}
|
||||||
|
slider_update_config();
|
||||||
|
}
|
||||||
|
|
||||||
void slider_init()
|
void slider_init()
|
||||||
{
|
{
|
||||||
i2c_init(I2C_PORT, I2C_FREQ);
|
i2c_init(I2C_PORT, I2C_FREQ);
|
||||||
@ -35,10 +43,7 @@ void slider_init()
|
|||||||
gpio_pull_up(I2C_SDA);
|
gpio_pull_up(I2C_SDA);
|
||||||
gpio_pull_up(I2C_SCL);
|
gpio_pull_up(I2C_SCL);
|
||||||
|
|
||||||
for (int m = 0; m < 3; m++) {
|
slider_sensor_init();
|
||||||
present[m] = mpr121_init(MPR121_ADDR + m);
|
|
||||||
}
|
|
||||||
slider_update_config();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *slider_sensor_status()
|
const char *slider_sensor_status()
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
void slider_init();
|
void slider_init();
|
||||||
|
void slider_sensor_init();
|
||||||
void slider_update();
|
void slider_update();
|
||||||
bool slider_touched(unsigned key);
|
bool slider_touched(unsigned key);
|
||||||
const uint16_t *slider_raw();
|
const uint16_t *slider_raw();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user