Fixed some issues as suggested

This commit is contained in:
nuphy-src 2023-12-28 01:03:37 +08:00
parent 3995b3669c
commit f4495d4d41
12 changed files with 682 additions and 677 deletions

View File

@ -15,422 +15,22 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "user_kb.h"
#include "ansi.h"
#include "usb_main.h"
user_config_t user_config;
DEV_INFO_STRUCT dev_info = {
.rf_baterry = 100,
.link_mode = LINK_USB,
.rf_state = RF_IDLE,
};
extern bool f_rf_sw_press;
extern bool f_sleep_show;
extern bool f_dev_reset_press;
extern bool f_bat_num_show;
extern bool f_rgb_test_press;
extern bool f_bat_hold;
extern uint16_t no_act_time;
extern uint8_t rf_sw_temp;
extern uint16_t rf_sw_press_delay;
extern user_config_t user_config;
extern DEV_INFO_STRUCT dev_info;
bool f_bat_hold = 0;
bool f_sys_show = 0;
bool f_sleep_show = 0;
bool f_send_channel = 0;
bool f_dial_sw_init_ok = 0;
bool f_rf_sw_press = 0;
bool f_dev_reset_press = 0;
bool f_rgb_test_press = 0;
bool f_bat_num_show = 0;
uint16_t rf_linking_time = 0;
uint16_t rf_link_show_time = 0;
uint8_t rf_blink_cnt = 0;
uint16_t no_act_time = 0;
uint8_t rf_sw_temp = 0;
uint16_t dev_reset_press_delay = 0;
uint16_t rf_sw_press_delay = 0;
uint16_t rgb_test_press_delay = 0;
uint8_t host_mode = 0;
host_driver_t *m_host_driver = 0;
extern bool f_rf_new_adv_ok;
extern report_keyboard_t *keyboard_report;
extern report_nkro_t *nkro_report;
extern uint8_t bitkb_report_buf[32];
extern uint8_t bytekb_report_buf[8];
extern uint8_t side_mode;
extern uint8_t side_light;
extern uint8_t side_speed;
extern uint8_t side_rgb;
extern uint8_t side_colour;
void dev_sts_sync(void);
void rf_uart_init(void);
void rf_device_init(void);
void uart_send_report_func(void);
void uart_receive_pro(void);
uint8_t uart_send_cmd(uint8_t cmd, uint8_t ack_cnt, uint8_t delayms);
void uart_send_report(uint8_t report_type, uint8_t *report_buf, uint8_t report_size);
void side_speed_contol(uint8_t dir);
void side_light_contol(uint8_t dir);
void side_colour_control(uint8_t dir);
void side_mode_control(uint8_t dir);
void side_led_show(void);
void sleep_handle(void);
void bat_led_close(void);
void num_led_show(void);
void rgb_test_show(void);
/**
* @brief gpio initial.
*/
void gpio_init(void) {
/* enable led power driver */
setPinOutput(DRIVER_LED_CS_PIN);
setPinOutput(DRIVER_SIDE_CS_PIN);
writePinLow(DRIVER_LED_CS_PIN);
writePinLow(DRIVER_SIDE_CS_PIN);
/* set side led pin output low */
setPinOutput(DRIVER_SIDE_PIN);
writePinLow(DRIVER_SIDE_PIN);
/* config RF module pin */
setPinOutput(NRF_WAKEUP_PIN);
writePinHigh(NRF_WAKEUP_PIN);
setPinInputHigh(NRF_TEST_PIN);
/* reset RF module */
setPinOutput(NRF_RESET_PIN);
writePinLow(NRF_RESET_PIN);
wait_ms(50);
writePinHigh(NRF_RESET_PIN);
/* config dial switch pin */
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
/* open led DC driver */
setPinOutput(DC_BOOST_PIN);
writePinHigh(DC_BOOST_PIN);
}
/**
* @brief long press key process.
*/
void long_press_key(void) {
static uint32_t long_press_timer = 0;
if (timer_elapsed32(long_press_timer) < 100) return;
long_press_timer = timer_read32();
// Open a new RF device
if (f_rf_sw_press) {
rf_sw_press_delay++;
if (rf_sw_press_delay >= RF_LONG_PRESS_DELAY) {
f_rf_sw_press = 0;
dev_info.link_mode = rf_sw_temp;
dev_info.rf_channel = rf_sw_temp;
dev_info.ble_channel = rf_sw_temp;
uint8_t timeout = 5;
while (timeout--) {
uart_send_cmd(CMD_NEW_ADV, 0, 1);
wait_ms(20);
uart_receive_pro();
if (f_rf_new_adv_ok) break;
}
}
} else {
rf_sw_press_delay = 0;
}
// The device is restored to factory Settings
if (f_dev_reset_press) {
dev_reset_press_delay++;
if (dev_reset_press_delay >= DEV_RESET_PRESS_DELAY) {
f_dev_reset_press = 0;
if (dev_info.link_mode != LINK_USB) {
if (dev_info.link_mode != LINK_RF_24) {
dev_info.link_mode = LINK_BT_1;
dev_info.ble_channel = LINK_BT_1;
dev_info.rf_channel = LINK_BT_1;
}
} else {
dev_info.ble_channel = LINK_BT_1;
dev_info.rf_channel = LINK_BT_1;
}
uart_send_cmd(CMD_SET_LINK, 10, 10);
wait_ms(500);
uart_send_cmd(CMD_CLR_DEVICE, 10, 10);
void device_reset_show(void);
void device_reset_init(void);
eeconfig_init();
device_reset_show();
device_reset_init();
if (dev_info.sys_sw_state == SYS_SW_MAC) {
default_layer_set(1 << 0);
keymap_config.nkro = 0;
} else {
default_layer_set(1 << 2);
keymap_config.nkro = 1;
}
}
} else {
dev_reset_press_delay = 0;
}
// Enter the RGB test mode
if (f_rgb_test_press) {
rgb_test_press_delay++;
if (rgb_test_press_delay >= RGB_TEST_PRESS_DELAY) {
f_rgb_test_press = 0;
rgb_test_show();
}
} else {
rgb_test_press_delay = 0;
}
}
/**
* @brief Release all keys, clear keyboard report.
*/
void break_all_key(void) {
uint8_t report_buf[16];
bool nkro_temp = keymap_config.nkro;
clear_weak_mods();
clear_mods();
clear_keyboard();
keymap_config.nkro = 1;
memset(keyboard_report, 0, sizeof(report_keyboard_t));
host_keyboard_send(keyboard_report);
wait_ms(10);
keymap_config.nkro = 0;
memset(keyboard_report, 0, sizeof(report_keyboard_t));
host_keyboard_send(keyboard_report);
wait_ms(10);
keymap_config.nkro = nkro_temp;
if (dev_info.link_mode != LINK_USB) {
memset(report_buf, 0, 16);
uart_send_report(CMD_RPT_BIT_KB, report_buf, 16);
wait_ms(10);
uart_send_report(CMD_RPT_BYTE_KB, report_buf, 8);
wait_ms(10);
}
memset(bitkb_report_buf, 0, sizeof(bitkb_report_buf));
memset(bytekb_report_buf, 0, sizeof(bytekb_report_buf));
}
/**
* @brief switch device link mode.
* @param mode : link mode
*/
void switch_dev_link(uint8_t mode) {
if (mode > LINK_USB) return;
break_all_key();
dev_info.link_mode = mode;
dev_info.rf_state = RF_IDLE;
f_send_channel = 1;
if (mode == LINK_USB) {
host_mode = HOST_USB_TYPE;
host_set_driver(m_host_driver);
rf_link_show_time = 0;
} else {
host_mode = HOST_RF_TYPE;
host_set_driver(0);
}
}
/**
* @brief scan dial switch.
*/
void dial_sw_scan(void) {
uint8_t dial_scan = 0;
static uint8_t dial_save = 0xf0;
static uint8_t debounce = 0;
static uint32_t dial_scan_timer = 0;
static bool f_first = true;
if (!f_first) {
if (timer_elapsed32(dial_scan_timer) < 20) return;
}
dial_scan_timer = timer_read32();
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
if (readPin(DEV_MODE_PIN)) dial_scan |= 0X01;
if (readPin(SYS_MODE_PIN)) dial_scan |= 0X02;
if (dial_save != dial_scan) {
break_all_key();
no_act_time = 0;
rf_linking_time = 0;
dial_save = dial_scan;
debounce = 25;
f_dial_sw_init_ok = 0;
return;
} else if (debounce) {
debounce--;
return;
}
if (dial_scan & 0x01) {
if (dev_info.link_mode != LINK_USB) {
switch_dev_link(LINK_USB);
}
} else {
if (dev_info.link_mode != dev_info.rf_channel) {
switch_dev_link(dev_info.rf_channel);
}
}
if (dial_scan & 0x02) {
if (dev_info.sys_sw_state != SYS_SW_MAC) {
f_sys_show = 1;
default_layer_set(1 << 0);
dev_info.sys_sw_state = SYS_SW_MAC;
keymap_config.nkro = 0;
break_all_key();
}
} else {
if (dev_info.sys_sw_state != SYS_SW_WIN) {
f_sys_show = 1;
default_layer_set(1 << 2);
dev_info.sys_sw_state = SYS_SW_WIN;
keymap_config.nkro = 1;
break_all_key();
}
}
if (f_dial_sw_init_ok == 0) {
f_dial_sw_init_ok = 1;
f_first = false;
if (dev_info.link_mode != LINK_USB) {
host_set_driver(0);
}
}
}
/**
* @brief power on scan dial switch.
*/
void dial_sw_fast_scan(void) {
{
uint8_t dial_scan_dev = 0;
uint8_t dial_scan_sys = 0;
uint8_t dial_check_dev = 0;
uint8_t dial_check_sys = 0;
uint8_t debounce = 0;
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
// Debounce to get a stable state
for(debounce=0; debounce<10; debounce++) {
dial_scan_dev = 0;
dial_scan_sys = 0;
if (readPin(DEV_MODE_PIN)) dial_scan_dev = 0x01;
else dial_scan_dev = 0;
if (readPin(SYS_MODE_PIN)) dial_scan_sys = 0x01;
else dial_scan_sys = 0;
if((dial_scan_dev != dial_check_dev)||(dial_scan_sys != dial_check_sys))
{
dial_check_dev = dial_scan_dev;
dial_check_sys = dial_scan_sys;
debounce = 0;
}
wait_ms(1);
}
// RF link mode
if (dial_scan_dev) {
if (dev_info.link_mode != LINK_USB) {
switch_dev_link(LINK_USB);
}
} else {
if (dev_info.link_mode != dev_info.rf_channel) {
switch_dev_link(dev_info.rf_channel);
}
}
// Win or Mac
if (dial_scan_sys) {
if (dev_info.sys_sw_state != SYS_SW_MAC) {
default_layer_set(1 << 0);
dev_info.sys_sw_state = SYS_SW_MAC;
keymap_config.nkro = 0;
break_all_key();
}
} else {
if (dev_info.sys_sw_state != SYS_SW_WIN) {
//f_sys_show = 1;
default_layer_set(1 << 2);
dev_info.sys_sw_state = SYS_SW_WIN;
keymap_config.nkro = 1;
break_all_key();
}
}
}
}
/**
* @brief timer process.
*/
void timer_pro(void) {
static uint32_t interval_timer = 0;
static bool f_first = true;
if (f_first) {
f_first = false;
interval_timer = timer_read32();
m_host_driver = host_get_driver();
}
if (timer_elapsed32(interval_timer) < 10)
return;
else
interval_timer = timer_read32();
if (rf_link_show_time < RF_LINK_SHOW_TIME) rf_link_show_time++;
if (no_act_time < 0xffff) no_act_time++;
if (rf_linking_time < 0xffff) rf_linking_time++;
}
/**
* @brief londing eeprom data.
*/
void londing_eeprom_data(void) {
eeconfig_read_user_datablock(&user_config);
if (user_config.default_brightness_flag != 0xA5) {
/* first power on, set rgb matrix brightness at middle level*/
rgb_matrix_sethsv(255, 255, RGB_MATRIX_MAXIMUM_BRIGHTNESS - RGB_MATRIX_VAL_STEP * 2);
user_config.default_brightness_flag = 0xA5;
user_config.ee_side_mode = side_mode;
user_config.ee_side_light = side_light;
user_config.ee_side_speed = side_speed;
user_config.ee_side_rgb = side_rgb;
user_config.ee_side_colour = side_colour;
user_config.sleep_enable = true;
eeconfig_update_user_datablock(&user_config);
} else {
side_mode = user_config.ee_side_mode;
side_light = user_config.ee_side_light;
side_speed = user_config.ee_side_speed;
side_rgb = user_config.ee_side_rgb;
side_colour = user_config.ee_side_colour;
}
}
/* qmk process record */
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
@ -528,24 +128,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
case MAC_TASK:
if (record->event.pressed) {
host_consumer_send(0x029F);
} else {
host_consumer_send(0);
}
return false;
case MAC_SEARCH:
if (record->event.pressed) {
register_code(KC_LGUI);
register_code(KC_SPACE);
wait_ms(50);
unregister_code(KC_LGUI);
unregister_code(KC_SPACE);
}
return false;
case MAC_VOICE:
if (record->event.pressed) {
host_consumer_send(0xcf);
@ -554,14 +136,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
case MAC_CONSOLE:
if (record->event.pressed) {
host_consumer_send(0x02A0);
} else {
host_consumer_send(0);
}
return false;
case MAC_DND:
if (record->event.pressed) {
host_system_send(0x9b);
@ -570,42 +144,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
case MAC_PRT:
if (record->event.pressed) {
register_code(KC_LGUI);
register_code(KC_LSFT);
register_code(KC_3);
wait_ms(50);
unregister_code(KC_3);
unregister_code(KC_LSFT);
unregister_code(KC_LGUI);
}
return false;
case MAC_PRTA:
if (record->event.pressed) {
if (dev_info.sys_sw_state == SYS_SW_WIN) {
register_code(KC_LGUI);
register_code(KC_LSFT);
register_code(KC_S);
wait_ms(50);
unregister_code(KC_S);
unregister_code(KC_LSFT);
unregister_code(KC_LGUI);
}
else {
register_code(KC_LGUI);
register_code(KC_LSFT);
register_code(KC_4);
wait_ms(50);
unregister_code(KC_4);
unregister_code(KC_LSFT);
unregister_code(KC_LGUI);
}
}
return false;
case SIDE_VAI:
if (record->event.pressed) {
side_light_contol(1);

View File

@ -27,12 +27,8 @@ enum custom_keycodes {
LNK_BLE2,
LNK_BLE3,
MAC_TASK,
MAC_SEARCH,
MAC_VOICE,
MAC_CONSOLE,
MAC_PRT,
MAC_PRTA,
MAC_DND,
SIDE_VAI,
SIDE_VAD,
@ -44,129 +40,11 @@ enum custom_keycodes {
DEV_RESET,
SLEEP_MODE,
BAT_SHOW,
MAC_DND,
BAT_NUM,
RGB_TEST
};
typedef enum {
RX_Idle,
RX_Receiving,
RX_Done,
RX_Fail,
RX_OV_ERR,
RX_SUM_ERR,
RX_CMD_ERR,
RX_DATA_ERR,
RX_DATA_OV,
RX_FORMAT_ERR,
TX_OK = 0XE0,
TX_DONE,
TX_BUSY,
TX_TIMEOUT,
TX_DATA_ERR,
} TYPE_RX_STATE;
#define RF_IDLE 0
#define RF_PAIRING 1
#define RF_LINKING 2
#define RF_CONNECT 3
#define RF_DISCONNECT 4
#define RF_SLEEP 5
#define RF_SNIF 6
#define RF_INVAILD 0XFE
#define RF_ERR_STATE 0XFF
#define CMD_POWER_UP 0XF0
#define CMD_SLEEP 0XF1
#define CMD_HAND 0XF2
#define CMD_SNIF 0XF3
#define CMD_24G_SUSPEND 0XF4
#define CMD_IDLE_EXIT 0XFE
#define CMD_RPT_MS 0XE0
#define CMD_RPT_BYTE_KB 0XE1
#define CMD_RPT_BIT_KB 0XE2
#define CMD_RPT_CONSUME 0XE3
#define CMD_RPT_SYS 0XE4
#define CMD_SET_LINK 0XC0
#define CMD_SET_CONFIG 0XC1
#define CMD_GET_CONFIG 0XC2
#define CMD_SET_NAME 0XC3
#define CMD_GET_NAME 0XC4
#define CMD_CLR_DEVICE 0XC5
#define CMD_NEW_ADV 0XC7
#define CMD_RF_STS_SYSC 0XC9
#define CMD_SET_24G_NAME 0XCA
#define CMD_GO_TEST 0XCF
#define CMD_RF_DFU 0XB1
#define CMD_WRITE_DATA 0X80
#define CMD_READ_DATA 0X81
#define LINK_RF_24 0
#define LINK_BT_1 1
#define LINK_BT_2 2
#define LINK_BT_3 3
#define LINK_USB 4
#define UART_HEAD 0x5A
#define FUNC_VALID_LEN 32
#define UART_MAX_LEN 64
#define SYS_SW_WIN 0xa1
#define SYS_SW_MAC 0xa2
#define RF_LINK_SHOW_TIME 300
#define HOST_USB_TYPE 0
#define HOST_BLE_TYPE 1
#define HOST_RF_TYPE 2
#define LINK_TIMEOUT (100 * 120)
#define SLEEP_TIME_DELAY (100 * 360)
#define POWER_DOWN_DELAY (24)
#define RF_LONG_PRESS_DELAY 30
#define DEV_RESET_PRESS_DELAY 30
#define RGB_TEST_PRESS_DELAY 30
typedef struct
{
uint8_t RXDState;
uint8_t RXDLen;
uint8_t RXDOverTime;
uint8_t TXDLenBack;
uint8_t TXDOffset;
uint8_t TXDBuf[UART_MAX_LEN];
uint8_t RXDBuf[UART_MAX_LEN];
} USART_MGR_STRUCT;
typedef struct
{
uint8_t link_mode;
uint8_t rf_channel;
uint8_t ble_channel;
uint8_t rf_state;
uint8_t rf_charge;
uint8_t rf_led;
uint8_t rf_baterry;
uint8_t sys_sw_state;
} DEV_INFO_STRUCT;
typedef struct
{
uint8_t default_brightness_flag;
uint8_t ee_side_mode;
uint8_t ee_side_light;
uint8_t ee_side_speed;
uint8_t ee_side_rgb;
uint8_t ee_side_colour;
uint8_t sleep_enable;
uint8_t retain1;
uint8_t retain2;
} user_config_t;
#define SYS_PRT G(S(KC_3))
#define MAC_PRTA G(S(KC_4))
#define WIN_PRTA G(S(KC_S))
#define MAC_SEARCH G(KC_SPC)

View File

@ -24,7 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NRF_TEST_PIN B5
#define NRF_WAKEUP_PIN B8
#define DRIVER_LED_CS_PIN C6
#define DRIVER_SIDE_PIN C8
#define DRIVER_SIDE_CS_PIN C9
@ -40,5 +39,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_USER_DATA_SIZE 8
#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
#define RGB_DISABLE_WHEN_USB_SUSPENDED

View File

@ -31,6 +31,7 @@
"max_brightness": 128,
"val_steps": 26,
"speed_steps": 52,
"sleep": true,
"animations": {
"gradient_up_down": true,
"gradient_left_right": true,
@ -169,8 +170,9 @@
"ws2812": {
"pin": "A7"
},
"community_layouts": ["75_ansi"],
"layouts": {
"LAYOUT_ansi_84": {
"LAYOUT_75_ansi": {
"layout": [
{"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "F1", "matrix": [0, 1], "x": 1, "y": 0},
@ -266,3 +268,4 @@
}
}
}

View File

@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// layer Mac
[0] = LAYOUT_ansi_84(
KC_ESC, KC_BRID, KC_BRIU, MAC_TASK, MAC_SEARCH, MAC_VOICE, MAC_DND, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, MAC_PRTA, KC_INS, KC_DEL,
[0] = LAYOUT_75_ansi(
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, MAC_SEARCH, MAC_VOICE, MAC_DND, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, MAC_PRTA, KC_INS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
// layer Mac Fn
[1] = LAYOUT_ansi_84(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MAC_PRT, _______, _______,
[1] = LAYOUT_75_ansi(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, SYS_PRT, _______, _______,
_______, LNK_BLE1, LNK_BLE2, LNK_BLE3, LNK_RF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DEV_RESET, SLEEP_MODE, BAT_SHOW, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, MO(1), _______, RGB_MOD, RGB_VAD, RGB_HUI),
// layer win
[2] = LAYOUT_ansi_84(
[2] = LAYOUT_75_ansi(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
@ -47,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(3), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
// layer win Fn
[3] = LAYOUT_ansi_84(
[3] = LAYOUT_75_ansi(
_______, KC_BRID, KC_BRIU, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, LNK_BLE1, LNK_BLE2, LNK_BLE3, LNK_RF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DEV_RESET, SLEEP_MODE, BAT_SHOW, _______,
@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, MO(3), _______, RGB_MOD, RGB_VAD, RGB_HUI),
// layer 4
[4] = LAYOUT_ansi_84(
[4] = LAYOUT_75_ansi(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

View File

@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// layer Mac
[0] = LAYOUT_ansi_84(
KC_ESC, KC_BRID, KC_BRIU, MAC_TASK, MAC_SEARCH, MAC_VOICE, MAC_CONSOLE,KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, MAC_PRTA, KC_INS, KC_DEL,
[0] = LAYOUT_75_ansi(
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, MAC_SEARCH, MAC_VOICE, MAC_DND, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, MAC_PRTA, KC_INS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
// layer Mac Fn
[1] = LAYOUT_ansi_84(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MAC_PRT, _______, _______,
[1] = LAYOUT_75_ansi(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, SYS_PRT, _______, _______,
_______, LNK_BLE1, LNK_BLE2, LNK_BLE3, LNK_RF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DEV_RESET, SLEEP_MODE, BAT_SHOW, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, MO(1), _______, RGB_MOD, RGB_VAD, RGB_HUI),
// layer win
[2] = LAYOUT_ansi_84(
[2] = LAYOUT_75_ansi(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
@ -47,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(3), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
// layer win Fn
[3] = LAYOUT_ansi_84(
[3] = LAYOUT_75_ansi(
_______, KC_BRID, KC_BRIU, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, LNK_BLE1, LNK_BLE2, LNK_BLE3, LNK_RF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DEV_RESET, SLEEP_MODE, BAT_SHOW, _______,
@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, MO(3), _______, RGB_MOD, RGB_VAD, RGB_HUI),
// layer 4
[4] = LAYOUT_ansi_84(
[4] = LAYOUT_75_ansi(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

View File

@ -15,8 +15,9 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ansi.h"
#include "user_kb.h"
#include "uart.h" // qmk uart.h
#include "ansi.h"
USART_MGR_STRUCT Usart_Mgr;
#define RX_SBYTE Usart_Mgr.RXDBuf[0]

View File

@ -1,5 +1,6 @@
SRC += side.c
SRC += rf.c
SRC += sleep.c
SRC += user_kb.c
SRC += side_driver.c
QUANTUM_LIB_SRC += uart.c

View File

@ -15,8 +15,10 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "user_kb.h"
#include "ansi.h"
#include "side_table.h"
#include "ws2812.h"
#define SIDE_BRIGHT_MAX 4
#define SIDE_SPEED_MAX 4
@ -756,7 +758,7 @@ void device_reset_init(void) {
f_bat_hold = false;
rgb_matrix_enable();
rgb_matrix_mode(RGB_MATRIX_DEFAULT_MODE);
rgb_matrix_mode(RGB_MATRIX_CYCLE_LEFT_RIGHT);
rgb_matrix_set_speed(255 - RGB_MATRIX_SPD_STEP * 2);
rgb_matrix_sethsv(255, 255, RGB_MATRIX_MAXIMUM_BRIGHTNESS - RGB_MATRIX_VAL_STEP * 2);

View File

@ -15,6 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "user_kb.h"
#include "ansi.h"
#include "hal_usb.h"
#include "usb_main.h"

View File

@ -0,0 +1,416 @@
/*
Copyright 2023 @ Nuphy <https://nuphy.com/>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "user_kb.h"
#include "ansi.h"
#include "usb_main.h"
user_config_t user_config;
DEV_INFO_STRUCT dev_info = {
.rf_baterry = 100,
.link_mode = LINK_USB,
.rf_state = RF_IDLE,
};
bool f_bat_hold = 0;
bool f_sys_show = 0;
bool f_sleep_show = 0;
bool f_send_channel = 0;
bool f_dial_sw_init_ok = 0;
bool f_rf_sw_press = 0;
bool f_dev_reset_press = 0;
bool f_rgb_test_press = 0;
bool f_bat_num_show = 0;
uint8_t rf_blink_cnt = 0;
uint8_t rf_sw_temp = 0;
uint8_t host_mode = 0;
uint16_t rf_linking_time = 0;
uint16_t rf_link_show_time = 0;
uint16_t no_act_time = 0;
uint16_t dev_reset_press_delay = 0;
uint16_t rf_sw_press_delay = 0;
uint16_t rgb_test_press_delay = 0;
host_driver_t *m_host_driver = 0;
extern bool f_rf_new_adv_ok;
extern report_keyboard_t *keyboard_report;
extern report_nkro_t *nkro_report;
extern uint8_t bitkb_report_buf[32];
extern uint8_t bytekb_report_buf[8];
extern uint8_t side_mode;
extern uint8_t side_light;
extern uint8_t side_speed;
extern uint8_t side_rgb;
extern uint8_t side_colour;
/**
* @brief gpio initial.
*/
void gpio_init(void) {
/* enable led power driver */
setPinOutput(DRIVER_LED_CS_PIN);
setPinOutput(DRIVER_SIDE_CS_PIN);
writePinLow(DRIVER_LED_CS_PIN);
writePinLow(DRIVER_SIDE_CS_PIN);
/* set side led pin output low */
setPinOutput(DRIVER_SIDE_PIN);
writePinLow(DRIVER_SIDE_PIN);
/* config RF module pin */
setPinOutput(NRF_WAKEUP_PIN);
writePinHigh(NRF_WAKEUP_PIN);
setPinInputHigh(NRF_TEST_PIN);
/* reset RF module */
setPinOutput(NRF_RESET_PIN);
writePinLow(NRF_RESET_PIN);
wait_ms(50);
writePinHigh(NRF_RESET_PIN);
/* config dial switch pin */
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
/* open led DC driver */
setPinOutput(DC_BOOST_PIN);
writePinHigh(DC_BOOST_PIN);
}
/**
* @brief long press key process.
*/
void long_press_key(void) {
static uint32_t long_press_timer = 0;
if (timer_elapsed32(long_press_timer) < 100) return;
long_press_timer = timer_read32();
// Open a new RF device
if (f_rf_sw_press) {
rf_sw_press_delay++;
if (rf_sw_press_delay >= RF_LONG_PRESS_DELAY) {
f_rf_sw_press = 0;
dev_info.link_mode = rf_sw_temp;
dev_info.rf_channel = rf_sw_temp;
dev_info.ble_channel = rf_sw_temp;
uint8_t timeout = 5;
while (timeout--) {
uart_send_cmd(CMD_NEW_ADV, 0, 1);
wait_ms(20);
uart_receive_pro();
if (f_rf_new_adv_ok) break;
}
}
} else {
rf_sw_press_delay = 0;
}
// The device is restored to factory Settings
if (f_dev_reset_press) {
dev_reset_press_delay++;
if (dev_reset_press_delay >= DEV_RESET_PRESS_DELAY) {
f_dev_reset_press = 0;
if (dev_info.link_mode != LINK_USB) {
if (dev_info.link_mode != LINK_RF_24) {
dev_info.link_mode = LINK_BT_1;
dev_info.ble_channel = LINK_BT_1;
dev_info.rf_channel = LINK_BT_1;
}
} else {
dev_info.ble_channel = LINK_BT_1;
dev_info.rf_channel = LINK_BT_1;
}
uart_send_cmd(CMD_SET_LINK, 10, 10);
wait_ms(500);
uart_send_cmd(CMD_CLR_DEVICE, 10, 10);
void device_reset_show(void);
void device_reset_init(void);
eeconfig_init();
device_reset_show();
device_reset_init();
if (dev_info.sys_sw_state == SYS_SW_MAC) {
default_layer_set(1 << 0);
keymap_config.nkro = 0;
} else {
default_layer_set(1 << 2);
keymap_config.nkro = 1;
}
}
} else {
dev_reset_press_delay = 0;
}
// Enter the RGB test mode
if (f_rgb_test_press) {
rgb_test_press_delay++;
if (rgb_test_press_delay >= RGB_TEST_PRESS_DELAY) {
f_rgb_test_press = 0;
rgb_test_show();
}
} else {
rgb_test_press_delay = 0;
}
}
/**
* @brief Release all keys, clear keyboard report.
*/
void break_all_key(void) {
uint8_t report_buf[16];
bool nkro_temp = keymap_config.nkro;
clear_weak_mods();
clear_mods();
clear_keyboard();
keymap_config.nkro = 1;
memset(keyboard_report, 0, sizeof(report_keyboard_t));
host_keyboard_send(keyboard_report);
wait_ms(10);
keymap_config.nkro = 0;
memset(keyboard_report, 0, sizeof(report_keyboard_t));
host_keyboard_send(keyboard_report);
wait_ms(10);
keymap_config.nkro = nkro_temp;
if (dev_info.link_mode != LINK_USB) {
memset(report_buf, 0, 16);
uart_send_report(CMD_RPT_BIT_KB, report_buf, 16);
wait_ms(10);
uart_send_report(CMD_RPT_BYTE_KB, report_buf, 8);
wait_ms(10);
}
memset(bitkb_report_buf, 0, sizeof(bitkb_report_buf));
memset(bytekb_report_buf, 0, sizeof(bytekb_report_buf));
}
/**
* @brief switch device link mode.
* @param mode : link mode
*/
void switch_dev_link(uint8_t mode) {
if (mode > LINK_USB) return;
break_all_key();
dev_info.link_mode = mode;
dev_info.rf_state = RF_IDLE;
f_send_channel = 1;
if (mode == LINK_USB) {
host_mode = HOST_USB_TYPE;
host_set_driver(m_host_driver);
rf_link_show_time = 0;
} else {
host_mode = HOST_RF_TYPE;
host_set_driver(0);
}
}
/**
* @brief scan dial switch.
*/
void dial_sw_scan(void) {
uint8_t dial_scan = 0;
static uint8_t dial_save = 0xf0;
static uint8_t debounce = 0;
static uint32_t dial_scan_timer = 0;
static bool f_first = true;
if (!f_first) {
if (timer_elapsed32(dial_scan_timer) < 20) return;
}
dial_scan_timer = timer_read32();
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
if (readPin(DEV_MODE_PIN)) dial_scan |= 0X01;
if (readPin(SYS_MODE_PIN)) dial_scan |= 0X02;
if (dial_save != dial_scan) {
break_all_key();
no_act_time = 0;
rf_linking_time = 0;
dial_save = dial_scan;
debounce = 25;
f_dial_sw_init_ok = 0;
return;
} else if (debounce) {
debounce--;
return;
}
if (dial_scan & 0x01) {
if (dev_info.link_mode != LINK_USB) {
switch_dev_link(LINK_USB);
}
} else {
if (dev_info.link_mode != dev_info.rf_channel) {
switch_dev_link(dev_info.rf_channel);
}
}
if (dial_scan & 0x02) {
if (dev_info.sys_sw_state != SYS_SW_MAC) {
f_sys_show = 1;
default_layer_set(1 << 0);
dev_info.sys_sw_state = SYS_SW_MAC;
keymap_config.nkro = 0;
break_all_key();
}
} else {
if (dev_info.sys_sw_state != SYS_SW_WIN) {
f_sys_show = 1;
default_layer_set(1 << 2);
dev_info.sys_sw_state = SYS_SW_WIN;
keymap_config.nkro = 1;
break_all_key();
}
}
if (f_dial_sw_init_ok == 0) {
f_dial_sw_init_ok = 1;
f_first = false;
if (dev_info.link_mode != LINK_USB) {
host_set_driver(0);
}
}
}
/**
* @brief power on scan dial switch.
*/
void dial_sw_fast_scan(void) {
{
uint8_t dial_scan_dev = 0;
uint8_t dial_scan_sys = 0;
uint8_t dial_check_dev = 0;
uint8_t dial_check_sys = 0;
uint8_t debounce = 0;
setPinInputHigh(DEV_MODE_PIN);
setPinInputHigh(SYS_MODE_PIN);
// Debounce to get a stable state
for(debounce=0; debounce<10; debounce++) {
dial_scan_dev = 0;
dial_scan_sys = 0;
if (readPin(DEV_MODE_PIN)) dial_scan_dev = 0x01;
else dial_scan_dev = 0;
if (readPin(SYS_MODE_PIN)) dial_scan_sys = 0x01;
else dial_scan_sys = 0;
if((dial_scan_dev != dial_check_dev)||(dial_scan_sys != dial_check_sys))
{
dial_check_dev = dial_scan_dev;
dial_check_sys = dial_scan_sys;
debounce = 0;
}
wait_ms(1);
}
// RF link mode
if (dial_scan_dev) {
if (dev_info.link_mode != LINK_USB) {
switch_dev_link(LINK_USB);
}
} else {
if (dev_info.link_mode != dev_info.rf_channel) {
switch_dev_link(dev_info.rf_channel);
}
}
// Win or Mac
if (dial_scan_sys) {
if (dev_info.sys_sw_state != SYS_SW_MAC) {
default_layer_set(1 << 0);
dev_info.sys_sw_state = SYS_SW_MAC;
keymap_config.nkro = 0;
break_all_key();
}
} else {
if (dev_info.sys_sw_state != SYS_SW_WIN) {
//f_sys_show = 1;
default_layer_set(1 << 2);
dev_info.sys_sw_state = SYS_SW_WIN;
keymap_config.nkro = 1;
break_all_key();
}
}
}
}
/**
* @brief timer process.
*/
void timer_pro(void) {
static uint32_t interval_timer = 0;
static bool f_first = true;
if (f_first) {
f_first = false;
interval_timer = timer_read32();
m_host_driver = host_get_driver();
}
if (timer_elapsed32(interval_timer) < 10)
return;
else
interval_timer = timer_read32();
if (rf_link_show_time < RF_LINK_SHOW_TIME) rf_link_show_time++;
if (no_act_time < 0xffff) no_act_time++;
if (rf_linking_time < 0xffff) rf_linking_time++;
}
/**
* @brief londing eeprom data.
*/
void londing_eeprom_data(void) {
eeconfig_read_user_datablock(&user_config);
if (user_config.default_brightness_flag != 0xA5) {
/* first power on, set rgb matrix brightness at middle level*/
rgb_matrix_sethsv(255, 255, RGB_MATRIX_MAXIMUM_BRIGHTNESS - RGB_MATRIX_VAL_STEP * 2);
user_config.default_brightness_flag = 0xA5;
user_config.ee_side_mode = side_mode;
user_config.ee_side_light = side_light;
user_config.ee_side_speed = side_speed;
user_config.ee_side_rgb = side_rgb;
user_config.ee_side_colour = side_colour;
user_config.sleep_enable = true;
eeconfig_update_user_datablock(&user_config);
} else {
side_mode = user_config.ee_side_mode;
side_light = user_config.ee_side_light;
side_speed = user_config.ee_side_speed;
side_rgb = user_config.ee_side_rgb;
side_colour = user_config.ee_side_colour;
}
}

View File

@ -0,0 +1,167 @@
/*
Copyright 2023 @ Nuphy <https://nuphy.com/>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
typedef enum {
RX_Idle,
RX_Receiving,
RX_Done,
RX_Fail,
RX_OV_ERR,
RX_SUM_ERR,
RX_CMD_ERR,
RX_DATA_ERR,
RX_DATA_OV,
RX_FORMAT_ERR,
TX_OK = 0XE0,
TX_DONE,
TX_BUSY,
TX_TIMEOUT,
TX_DATA_ERR,
} TYPE_RX_STATE;
#define RF_IDLE 0
#define RF_PAIRING 1
#define RF_LINKING 2
#define RF_CONNECT 3
#define RF_DISCONNECT 4
#define RF_SLEEP 5
#define RF_SNIF 6
#define RF_INVAILD 0XFE
#define RF_ERR_STATE 0XFF
#define CMD_POWER_UP 0XF0
#define CMD_SLEEP 0XF1
#define CMD_HAND 0XF2
#define CMD_SNIF 0XF3
#define CMD_24G_SUSPEND 0XF4
#define CMD_IDLE_EXIT 0XFE
#define CMD_RPT_MS 0XE0
#define CMD_RPT_BYTE_KB 0XE1
#define CMD_RPT_BIT_KB 0XE2
#define CMD_RPT_CONSUME 0XE3
#define CMD_RPT_SYS 0XE4
#define CMD_SET_LINK 0XC0
#define CMD_SET_CONFIG 0XC1
#define CMD_GET_CONFIG 0XC2
#define CMD_SET_NAME 0XC3
#define CMD_GET_NAME 0XC4
#define CMD_CLR_DEVICE 0XC5
#define CMD_NEW_ADV 0XC7
#define CMD_RF_STS_SYSC 0XC9
#define CMD_SET_24G_NAME 0XCA
#define CMD_GO_TEST 0XCF
#define CMD_RF_DFU 0XB1
#define CMD_WRITE_DATA 0X80
#define CMD_READ_DATA 0X81
#define LINK_RF_24 0
#define LINK_BT_1 1
#define LINK_BT_2 2
#define LINK_BT_3 3
#define LINK_USB 4
#define UART_HEAD 0x5A
#define FUNC_VALID_LEN 32
#define UART_MAX_LEN 64
#define SYS_SW_WIN 0xa1
#define SYS_SW_MAC 0xa2
#define RF_LINK_SHOW_TIME 300
#define HOST_USB_TYPE 0
#define HOST_BLE_TYPE 1
#define HOST_RF_TYPE 2
#define LINK_TIMEOUT (100 * 120)
#define SLEEP_TIME_DELAY (100 * 360)
#define POWER_DOWN_DELAY (24)
#define RF_LONG_PRESS_DELAY 30
#define DEV_RESET_PRESS_DELAY 30
#define RGB_TEST_PRESS_DELAY 30
typedef struct
{
uint8_t RXDState;
uint8_t RXDLen;
uint8_t RXDOverTime;
uint8_t TXDLenBack;
uint8_t TXDOffset;
uint8_t TXDBuf[UART_MAX_LEN];
uint8_t RXDBuf[UART_MAX_LEN];
} USART_MGR_STRUCT;
typedef struct
{
uint8_t link_mode;
uint8_t rf_channel;
uint8_t ble_channel;
uint8_t rf_state;
uint8_t rf_charge;
uint8_t rf_led;
uint8_t rf_baterry;
uint8_t sys_sw_state;
} DEV_INFO_STRUCT;
typedef struct
{
uint8_t default_brightness_flag;
uint8_t ee_side_mode;
uint8_t ee_side_light;
uint8_t ee_side_speed;
uint8_t ee_side_rgb;
uint8_t ee_side_colour;
uint8_t sleep_enable;
uint8_t retain1;
uint8_t retain2;
} user_config_t;
void dev_sts_sync(void);
void rf_uart_init(void);
void rf_device_init(void);
void uart_send_report_func(void);
void uart_receive_pro(void);
void uart_send_report(uint8_t report_type, uint8_t *report_buf, uint8_t report_size);
void side_speed_contol(uint8_t dir);
void side_light_contol(uint8_t dir);
void side_colour_control(uint8_t dir);
void side_mode_control(uint8_t dir);
void side_led_show(void);
void sleep_handle(void);
void bat_led_close(void);
void num_led_show(void);
void rgb_test_show(void);
void gpio_init(void);
void long_press_key(void);
void break_all_key(void);
void switch_dev_link(uint8_t mode);
void dial_sw_scan(void);
void dial_sw_fast_scan(void);
void timer_pro(void);
void londing_eeprom_data(void);
uint8_t uart_send_cmd(uint8_t cmd, uint8_t ack_cnt, uint8_t delayms);