优化倒地自平衡和手柄震动反馈功能

This commit is contained in:
myperworld committed 2025-10-18 09:59:26 +08:00
1 parent c211e9600b
commit f1043392e2
2 files changed
+36 -33

No files matched your search

+19 -19
View File
@@ -23,8 +23,7 @@ enum VibrateState {
};
VibrateState vibrateState = VIBRATE_OFF;
unsigned long vibrateStartMs = 0; // 震动开始的时间戳
const unsigned long KEY_VIBRATE_DURATION = 200; // 按键震动持续时间
const unsigned long TRIGGER_VIBRATE_DURATION = 300; // 扳机震动持续时间
unsigned long long xbox_vibrate_duration = 200; // 按键震动持续时间 (可被函数动态更新)
/************ 外部函数声明 *************/
extern void processControllerData(const XboxControllerNotificationParser& data);
@@ -41,9 +40,9 @@ void updateXboxVibration() {
unsigned long currentMs = millis();
// 处理按键震动的"开启→等待→关闭"流程
if (vibrateState == VIBRATE_STARTED) {
if (vibrateState == VIBRATE_STARTED || vibrateState == VIBRATE_TRIGGER) {
// 检查是否达到震动持续时间
if (currentMs - vibrateStartMs >= KEY_VIBRATE_DURATION) {
if (currentMs - vibrateStartMs >= xbox_vibrate_duration) {
// 执行原函数中delay后的关闭逻辑
repo.v.power.center = 0;
repo.v.power.shake = 0;
@@ -51,19 +50,17 @@ void updateXboxVibration() {
vibrateState = VIBRATE_OFF; // 回到未震动状态
}
}
// 处理扳机键震动的关闭逻辑
else if (vibrateState == VIBRATE_TRIGGER) {
if (currentMs - vibrateStartMs >= TRIGGER_VIBRATE_DURATION) {
repo.v.power.center = 0;
repo.v.power.shake = 0;
xboxController.writeHIDReport(repo);
vibrateState = VIBRATE_OFF;
}
}
}
// 按键震动(完整复现原逻辑的非阻塞版本)
void XboxKeyVibration() {
void XboxKeyVibration(uint8_t power = 20, unsigned long duration = 200) {
power = constrain(power, 0, 100); // 约束功率范围(防止无效值,确保在0-100之间)
duration = constrain(duration, 50, 2000); // 时长限制50-2000ms(合理范围)
// 核心:将传入的时长(默认200或自定义)赋值给全局变量
xbox_vibrate_duration = duration;
// 若正在震动,先重置状态(避免重复触发导致混乱)
if (vibrateState != VIBRATE_OFF) {
repo.v.power.center = 0;
@@ -77,8 +74,8 @@ void XboxKeyVibration() {
repo.v.select.left = true;
repo.v.select.right = true;
repo.v.select.shake = true;
repo.v.power.center = 20; // 30% power
repo.v.power.shake = 20;
repo.v.power.center = power; // 20% power
repo.v.power.shake = power;
repo.v.timeActive = 10; // x/100 second
xboxController.writeHIDReport(repo);
@@ -88,10 +85,13 @@ void XboxKeyVibration() {
}
// 扳机键震动(同样保留完整时序)
void XboxtrigRTVibration() {
void XboxtrigRTVibration( unsigned long duration = 300) {
static uint16_t TrigMax = XboxControllerNotificationParser::maxTrig;
uint8_t power = (uint8_t)((float)xboxController.xboxNotif.trigRT / TrigMax * 100) * 0.5;
// 核心:将传入的时长(默认300或自定义)赋值给全局变量
xbox_vibrate_duration = duration;
// 若扳机键松开,直接关闭震动
if (power == 0) {
repo.v.power.center = 0;
@@ -121,13 +121,13 @@ void process_xbox_notif() {
xboxController.onLoop();
if (xboxController.isConnected() && !xboxController.isWaitingForFirstNotification()) {
if(!wasConnected){ // 原来未链接,现在链接成功
XboxKeyVibration();
XboxKeyVibration(100,1000);
wasConnected = 1;
}
processControllerData(xboxController.xboxNotif);
}else{
if(wasConnected){ // 原来是链接成功的,说明断了
XboxKeyVibration();
XboxKeyVibration(80,1000);
wasConnected = 0;
}
}