97 lines
2.8 KiB
C
97 lines
2.8 KiB
C
/* ---------------------------------
|
||
* 蓝牙手柄(Xbox)模块
|
||
* 包含:蓝牙实体、状态变量、连接处理函数
|
||
* 不包含:手柄数据解析逻辑(processControllerData)
|
||
------------------------------------- */
|
||
#ifndef XBOX_BLUETOOTH_H
|
||
#define XBOX_BLUETOOTH_H
|
||
|
||
#include <Arduino.h>
|
||
#include <XboxSeriesXControllerESP32_asukiaaa.hpp> // Xbox手柄库
|
||
|
||
/************ Xbox手柄全局实体 *************/
|
||
// 连接目标手柄的MAC地址(保持原地址不变)
|
||
XboxSeriesXControllerESP32_asukiaaa::Core xboxController("0a:27:12:5c:71:79");
|
||
|
||
// 震动
|
||
XboxSeriesXHIDReportBuilder_asukiaaa::ReportBase repo;
|
||
|
||
/************ 外部函数声明 *************/
|
||
// 声明主文件中的数据处理函数(在主文件中实现)
|
||
extern void processControllerData(const XboxControllerNotificationParser& data);
|
||
|
||
/************ 蓝牙手柄核心函数 *************/
|
||
|
||
// 初始化蓝牙手柄(供主文件setup()调用)
|
||
void xboxControllerInit() {
|
||
// 启动蓝牙连接
|
||
xboxController.begin();
|
||
}
|
||
|
||
// 处理蓝牙手柄通知(循环调用,保持连接并接收数据)
|
||
void process_xbox_notif() {
|
||
xboxController.onLoop(); // 维持蓝牙连接状态
|
||
|
||
if (xboxController.isConnected()) {
|
||
if (xboxController.isWaitingForFirstNotification()) {
|
||
// 可添加调试信息(如"等待手柄数据...")
|
||
} else {
|
||
// 接收数据后,调用主文件的解析函数
|
||
processControllerData(xboxController.xboxNotif);
|
||
}
|
||
} else {
|
||
// 可添加调试信息(如"手柄未连接")
|
||
}
|
||
}
|
||
|
||
// xbox 按键震动
|
||
void XboxKeyVibration()
|
||
{
|
||
repo.setAllOff();
|
||
repo.v.select.center = true;
|
||
repo.v.select.left = true;
|
||
repo.v.select.right = true;
|
||
repo.v.select.shake = true;
|
||
repo.v.power.center = 20;
|
||
repo.v.power.shake = 20;
|
||
repo.v.timeActive = 10;
|
||
xboxController.writeHIDReport(repo);
|
||
|
||
delay(250);
|
||
repo.v.power.center = 0;
|
||
repo.v.power.shake = 0;
|
||
xboxController.writeHIDReport(repo);
|
||
}
|
||
|
||
// xbox 扳机键震动
|
||
void XboxtrigRTVibration()
|
||
{
|
||
repo.setAllOff();
|
||
repo.v.select.center = true;
|
||
repo.v.select.left = true;
|
||
repo.v.select.right = true;
|
||
repo.v.select.shake = true;
|
||
|
||
static uint16_t TrigMax = XboxControllerNotificationParser::maxTrig;
|
||
uint8_t power = (uint8_t)((float)xboxController.xboxNotif.trigRT / (float)TrigMax * 100) * 0.8;
|
||
// Serial.print("trigRT:" + String(xboxController.xboxNotif.trigRT));
|
||
// Serial.print(",TrigMax:" + String(TrigMax));
|
||
// Serial.println(",power:" + String(power));
|
||
|
||
repo.v.power.center = power;
|
||
repo.v.power.shake = power;
|
||
repo.v.power.center = power;
|
||
repo.v.power.shake = power;
|
||
|
||
repo.v.timeActive = 10;
|
||
xboxController.writeHIDReport(repo);
|
||
|
||
delay(500);
|
||
repo.v.power.center = 0;
|
||
repo.v.power.shake = 0;
|
||
xboxController.writeHIDReport(repo);
|
||
|
||
}
|
||
|
||
#endif // XBOX_BLUETOOTH_H
|
||
|