#ifndef KEYBOARD_H
#define KEYBOARD_H

#include <BleKeyboard.h>
#include <FastLED.h>
#include <EEPROM.h>
#include "esp_bt_main.h"
#include "esp_bt.h"
#include "esp_sleep.h"
#include "save.h"
#include "scan.h"
#include "sleep.h"
#include "driver/rtc_io.h"
#include "Wire.h"

//正常使用或者不需要键盘打印输出时可将 ' #define DEBUG_K ' 注释
#define DEBUG_K

#define SDA_PIN 36
#define SCL_PIN 35

//键盘信息
#define DeviceName "ELECROW_BT" //设备名
#define Manufacturer "ELECROW"        //设备制造商
#define DevicePower 100            //默认设备电量
#define KEYBOARD_VERSION 1         //键盘版本

//键盘模式
#define USB_MODE 1                  //USB 模式
#define BLE_MODE 2                  //BLE 模式

////定义on和off值
#define OFF 0
#define ON 1

//char mac_save = 0;  //保存蓝牙地址标志

#define KEYBOARD_ROW 6        //输出    
#define KEYBOARD_COLUMN  17      // 输入

//定义矩阵行列对应的IO
#define Row0 6
#define Row1 5
#define Row2 4
#define Row3 3
#define Row4 2
#define Row5 1


#define Col0 7
#define Col1 8
#define Col2 9
#define Col3 10
#define Col4 11
#define Col5 12
#define Col6 13
#define Col7 14
#define Col8 15
#define Col9 16
#define Col10 17
#define Col11 18
#define Col12 37
#define Col13 38
#define Col14 39
#define Col15 40
#define Col16 41

#define BAT_DET_CON 42
#define ENTER_SLEEP GPIO_NUM_21
#define KEY_ENTER_PIN 21
char KEY_ENTER_State = 0;
uint8_t game_flag = 1;

//矩阵行列最大设置
#define NumRows 6
#define NumCols 17
#define NumLayers 3

#define FUNCTION_SW   256
#define NULL_CON      257
#define NEXT          258
#define PREV          259
#define FN          260


#define DEFAULT_KEYBOARD_MODE 2     //键盘模式 默认为1
#define DEFAULT_LIGHT_COLOR 0     //灯光颜色 默认为 0
#define DEFAULT_LIGHT_BRGIGHTNESS 40 //灯光亮度0-100  默认为50 
#define DEFAULT_LIGHT_MODE 2        //灯光模式 默认为2全亮
#define DEFAULT_BLUETOOTH_CHANNEL 0        //蓝牙通道选择  默认为0->通道1
#define DEFAULT_KEYBOARD_SYSTEM  0        //系统模式默认为windows
#define USB_MODE 1                  //USB 模式
#define BLE_MODE 2                  //BLE 模式
#define WINDOWS_SYSTEM 0                  //WINDOWS 模式
#define MAC_OS_SYSTEM  1                  //MAC OS 模式
#define DEFAULT_KEYBOARD_SPEED 50     //默认为50

#define ERROR_CODE 255 //函数运行错误码 错误码最大值只能为 255

#define USB_BLE_MODE_X 1     //USB 键所在行         
#define USB_BLE_MODE_Y 4     //USB 键所在列
#define Fn_X 5            //Fn键所在行
#define Fn_Y 10            //Fn键所在列
#define CAPS_X 3             //大写锁定键所在行
#define CAPS_Y 0             //大写锁定键所在列
#define Fn_F1_X 0            //F1键所在行
#define Fn_F1_Y 2            //F1键所在列
#define Fn_F2_X 0            //F2键所在行
#define Fn_F2_Y 3            //F2键所在列
#define Fn_F3_X 0            //F3键所在行
#define Fn_F3_Y 4            //F3键所在列
#define Fn_F4_X 0            //F4键所在行
#define Fn_F4_Y 5            //F4键所在列
#define Fn_F5_X 0            //F5键所在行
#define Fn_F5_Y 6            //F5键所在列
#define Fn_F6_X 0            //F6键所在行
#define Fn_F6_Y 7            //F6键所在列
#define Fn_F7_X 0            //F7键所在行
#define Fn_F7_Y 8            //F7键所在列
#define Fn_F8_X 0            //F8键所在行
#define Fn_F8_Y 9            //F8键所在列
#define Fn_F9_X 0            //F9键所在行
#define Fn_F9_Y 10            //F9键所在列
#define Fn_F10_X 0            //F10键所在行
#define Fn_F10_Y 11            //F10键所在列
#define Fn_F11_X 0            //F11键所在行
#define Fn_F11_Y 12            //F11键所在列
#define Fn_F12_X 0            //F12键所在行
#define Fn_F12_Y 13            //F12键所在列
#define Fn_W_X  2            //W键所在行
#define Fn_W_Y  2            //W键所在列
#define Fn_A_X  3            //A键所在行
#define Fn_A_Y  1            //A键所在列

#define Fn_UP_X  4            //↑键所在行
#define Fn_UP_Y  15            //↑键所在列
#define Fn_DOWN_X  5            //↓键所在行
#define Fn_DOWN_Y  15            //↓键所在列
#define Fn_LEFT_X  5            //←键所在行
#define Fn_LEFT_Y  14            //←键所在列
#define Fn_RIGHT_X  5            //→键所在行
#define Fn_RIGHT_Y  16            //→键所在列
#define Fn_DEL_X  2            //DEL键所在行
#define Fn_DEL_Y  14            //DEL键所在列
#define Fn_INS_X  1            //INS键所在行
#define Fn_INS_Y  14            //INS键所在列
#define Fn_ESC_X  0            //ESC键所在行
#define Fn_ESC_Y  0            //ESC键所在列
#define Fn_6_X  1            //6键所在行
#define Fn_6_Y  6            //6键所在列
#define Bluetooth_channel_1_X   1 //BLE1 键所在行     
#define Bluetooth_channel_1_Y   1 //BLE1 键所在列    
#define Bluetooth_channel_2_X   1 //BLE2 键所在行     
#define Bluetooth_channel_2_Y   2 //BLE2 键所在列     
#define Bluetooth_channel_3_X   1 //BLE3 键所在行     
#define Bluetooth_channel_3_Y   3 //BLE3 键所在列  
#define Bluetooth_channel_4_X   1 //BLE4 键所在行     
#define Bluetooth_channel_4_Y   7 //BLE4 键所在列
#define Bluetooth_channel_5_X   1 //BLE5 键所在行     
#define Bluetooth_channel_5_Y   8 //BLE5 键所在列   
#define Bluetooth_channel_6_X   1 //BLE6 键所在行     
#define Bluetooth_channel_6_Y   9 //BLE6 键所在列      
#define Fn_5_X   1 //清空蓝牙通道    
#define Fn_5_Y   5 //清空蓝牙通道 

#define LCTRL_X 5   //左CTRL所在行
#define LCTRL_Y 0   //左CTRL所在列
#define LGUI_X 5    //左GUI所在行
#define LGUI_Y 1    //左GUI所在列
#define LALT_X 5    //左ALT所在行
#define LALT_Y 2    //左ALT所在列
#define LSHIFT_X 4  //左SHIFT所在行
#define LSHIFT_Y 0  //左SHIFT所在列
#define RCTRL_X 5   //右CTRL所在行
#define RCTRL_Y 11  //右CTRL所在列
#define RSHIFT_X 4  //右SHIFT所在行
#define RSHIFT_Y 11 //右SHIFT所在列
#define ENTER_X 3
#define ENTER_Y 12
const int maxdevice = 3;
//
uint8_t MACAddress[maxdevice][6] =
{
  {0x94, 0xe6, 0xf7, 0x34, 0x05, 0xfc },  //test1
  {0x50, 0xED, 0x3C, 0x0A, 0xFA, 0x7B },  //test2
  {0xc0, 0xe4, 0x34, 0x62, 0xd7, 0xd8 },  //test3
  // ...
};

//要扫描的行和要读取的列
short Rows[NumRows] = {Row0, Row1, Row2 , Row3, Row4, Row5};
short Cols[NumCols] = {Col0, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16};


//根据硬件电路更改
//WS2812
#define WS2812Pin 48
#define WS2812_NUMBER 87                  //WS2812灯珠的数量
#define NR_OF_ALL_BITS 24 * WS2812_NUMBER //所有LED数据占用的位数 一个颜色占8位一个LED占3*8位 总共3*8*64位
//可更改 需要注意灯光的最大工作电流 电流过大会使锂电池充电芯片发烫或者烧毁
#define LIGHT_MODE_NUM 13        //灯光模式最大值(模式数量) (0, 1, 2) 用于灯光模式切换
#define LIGHT_BRGIGHTNESS_MAX 100 //亮度
#define LIGHT_CORLOR_MAX 7          //颜色值
#define LIGHT_SPEED_MAX 50          //灯光速度

#define LedType SK6812
#define ColorOrder GRB
uint8_t max_bright = 80;
#define Horizontal_wave_mode 8
uint8_t Horizontal_wave_flag = 0;
uint8_t RGB_mode_change_flag = 0;

CRGB leds[WS2812_NUMBER];

//根据硬件电路更改
//需要根据按键对应灯珠序号位置更改
#define esc_led 0
#define w_led 35
#define a_led 61
#define s_led 60
#define d_led 59
#define up_led 75
#define down_led 77
#define left_led 78
#define right_led 76

//按键未操作时间设置
#define USB_PRESS_TIME 480000   //USB模式 键盘未操作超时 单位ms  设置为 0 则关闭自动关机功能
#define BT_PRESS_TIME 480000    //BLE模式 键盘未操作超时 单位ms  设置为 0 则关闭自动关机功能
#define BT_CONNECT_TIME 35000    //BLE模式 键盘未操作超时 单位ms  设置为 0 则关闭自动关机功能
#endif
