Files
SeasonWings_LINGNITHM/BootLoader&Firmware/source code/src/Touch.h
T
2022-06-15 02:15:01 +08:00

184 lines
5.0 KiB
C

////基础定义////
#ifndef _BV
#define _BV(bit) (1 << (bit))
#endif
#include "mpr121-helper.h"
#include "mpr121-config.h"
#include "serial.h"
#include "HID-Project.h"
#include "FastLED.h"
#include "Air.h"
#define Serial SerialUSB
////MPR定义////
#define CA_ADDR 0x5A//mpr121A
#define CB_ADDR 0x5B//mpr121B
#define CC_ADDR 0x5C//mpr121C
uint16_t LastA = -1, CurrA, LastB = -1, CurrB, LastC = -1, CurrC; //存储触摸的状态
static MPR121 capA, capB, capC; //mpr121定义
////串口定义////
#define CLAMP(val, lo, hi) (val < lo ? lo : (val > hi ? hi : val))
uint8_t checkrelease[32];
static bool auto_scan = false;//串口用标记
////按键定义////
KeyboardKeycode KeyCode[32] = {//键值列表
KEY_I, KEY_COMMA, KEY_8, KEY_K, KEY_U, KEY_M, KEY_7, KEY_J, KEY_Y, KEY_N,
KEY_6, KEY_H, KEY_T, KEY_B, KEY_5, KEY_G, KEY_R, KEY_V, KEY_4, KEY_F, KEY_E, KEY_C,
KEY_3, KEY_D, KEY_W, KEY_X, KEY_2, KEY_S, KEY_Q, KEY_Z, KEY_1, KEY_A,
};
////灯光定义////
uint16_t LED_BRI = 255; //灯亮度
#define LED_PIN 7 //灯针脚
#define LED_NUM 31 //灯数量
CRGB leds[LED_NUM];
uint32_t MiddleLED=CRGB::Black; //中缝灯色
uint32_t GroundLED=CRGB::Aqua; //触摸区常态灯色
uint32_t PressLED=CRGB::Red; //触摸时灯色
////函数指针////
void (*AirSensor)();
void (*AirLED)();
void (*TouchCheck)();
void (*TouchLEDCheck)();
void LEDset() {//灯光初始化
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_NUM);
FastLED.addLeds<WS2812B, air_right_pin, GRB>(AIR_RIGHT, air_right_num);
FastLED.addLeds<WS2812B, air_left_pin, GRB>(AIR_LEFT, air_left_num);
}
void TouchSetup() {//触摸初始化
capA.begin(CA_ADDR);
capA.init();
capA.run();
capB.begin(CB_ADDR);
capB.init();
capB.run();
capC.begin(CC_ADDR);
capC.init();
capC.run();
Wire.setClock(800000);//I2C波特率
}
//直连触摸函数部分//
int CalCheck(int bl, int fd) {//触摸数值计算
int cal = bl - fd;
return cal > 4 ? 5 * cal : (cal > 0 ? cal : 0) ;
}
//键盘触摸函数部分//
uint8_t ledindex = 0;
uint8_t TouchState[32];
uint8_t val = 30;
void K32Check() {
int16_t bl, fl, cal, calpress[32];
for (uint8_t i = 0; i < 12; i++) {//计算数值
if (i < 10) {
bl = capA.baselineData(i);
fl = capA.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i] = CLAMP(cal, 0, 255);
}
bl = capB.baselineData(i);
fl = capB.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i + 10] = CLAMP(cal, 0, 255);
if (i < 10) {
bl = capC.baselineData(i);
fl = capC.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i + 10 + 12] = CLAMP(cal, 0, 255);
}
}
for (uint8_t i = 0; i < 32; i++) {
uint8_t calkeypress = calpress[i];
Serial.println(calpress[i]);
if (ledindex <= 15) {//初始化完成后的灯
leds[31 - i * 2] = MiddleLED;
leds[30 - i * 2] = GroundLED;
FastLED[0].showLeds(255);
ledindex++;
}
if (calkeypress >= val) {//Check
checkrelease[i] = SLIDER_CMD_AUTO_SCAN;
NKROKeyboard.press(KeyCode[i]);
i%2==0?leds[i] = PressLED:leds[i-1] = PressLED;
}
else {
if (checkrelease[i]) {
checkrelease[i] = 0;
NKROKeyboard.release(KeyCode[i]);
i%2==0?leds[i] = GroundLED:leds[i-1] = GroundLED;
}
continue;
}
}
leds[7] = PressLED;
leds[15] = PressLED;
leds[23] = PressLED;
FastLED[0].showLeds(255);
}
void NoTouch(){//转为Option时的无HIDTouch
int16_t bl, fl, cal, calpress[32];
for (uint8_t i = 0; i < 12; i++) {//计算数值
if (i < 10) {
bl = capA.baselineData(i);
fl = capA.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i] = CLAMP(cal, 0, 255);
}
bl = capB.baselineData(i);
fl = capB.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i + 10] = CLAMP(cal, 0, 255);
if (i < 10) {
bl = capC.baselineData(i);
fl = capC.filteredData(i);
cal = CalCheck(bl, fl);
calpress[i + 10 + 12] = CLAMP(cal, 0, 255);
}
}
for (uint8_t i = 0; i < 32; i++) {
uint8_t calkeypress = calpress[i];
Serial.println(calpress[i]);
if(i < 22){
if (calkeypress >= val) {//Check
checkrelease[i] = SLIDER_CMD_AUTO_SCAN;
TouchState[i] = 1;
}else {
if (checkrelease[i]) {
checkrelease[i] = 0;
TouchState[i] = 0;
}
continue;
}
}else{
if (calkeypress >= val) {//Check
i%2==0?leds[i] = PressLED:leds[i - 1] = PressLED;
checkrelease[i] = SLIDER_CMD_AUTO_SCAN;
TouchState[i] = 1;
}else {
if (checkrelease[i]) {
i%2==0?leds[i] = GroundLED:leds[i - 1] = GroundLED;
checkrelease[i] = 0;
TouchState[i] = 0;
}
continue;
}
}
}
leds[23] = PressLED;
leds[25] = MiddleLED;
leds[27] = MiddleLED;
leds[29] = MiddleLED;
FastLED[0].show(leds, LED_NUM, LED_BRI);
}
void NoTouchLED(){}