revert 修复红外的兼容性问题
This commit is contained in:
2025-09-23 14:09:49 +08:00
parent 21d21f8247
commit 9f663aed0b
3 changed files with 133 additions and 388 deletions

View File

@@ -190,11 +190,8 @@ void sendStoredIRSignal(String buttonName) {
// 从字符串解析红外信号
IRSignal parseIRSignalFromString(String dataStr) {
IRSignal signal;
signal.markTimes = nullptr;
signal.spaceTimes = nullptr;
signal.markCount = 0;
signal.spaceCount = 0;
signal.carrierFreq = IR_CARRIER_FREQ;
signal.data = nullptr;
signal.length = 0;
signal.isValid = false;
if (dataStr.length() == 0) {
@@ -206,11 +203,11 @@ IRSignal parseIRSignalFromString(String dataStr) {
for (int i = 0; i < dataStr.length(); i++) {
if (dataStr[i] == ',') commaCount++;
}
int totalLength = commaCount + 1;
signal.length = commaCount + 1;
// 分配临时内存存储原始数据
unsigned int* tempData = (unsigned int*)malloc(totalLength * sizeof(unsigned int));
if (tempData == nullptr) {
// 分配内存
signal.data = (unsigned int*)malloc(signal.length * sizeof(unsigned int));
if (signal.data == nullptr) {
return signal;
}
@@ -220,78 +217,27 @@ IRSignal parseIRSignalFromString(String dataStr) {
for (int i = 0; i <= dataStr.length(); i++) {
if (i == dataStr.length() || dataStr[i] == ',') {
String valueStr = dataStr.substring(startPos, i);
tempData[index] = valueStr.toInt();
signal.data[index] = valueStr.toInt();
index++;
startPos = i + 1;
}
}
// 分离mark和space数据
signal.markCount = (totalLength + 1) / 2;
signal.spaceCount = totalLength / 2;
// 分配mark时间数组
if (signal.markCount > 0) {
signal.markTimes = (unsigned int*)malloc(signal.markCount * sizeof(unsigned int));
if (signal.markTimes == nullptr) {
free(tempData);
return signal;
}
for (int i = 0; i < signal.markCount; i++) {
signal.markTimes[i] = tempData[i * 2];
}
}
// 分配space时间数组
if (signal.spaceCount > 0) {
signal.spaceTimes = (unsigned int*)malloc(signal.spaceCount * sizeof(unsigned int));
if (signal.spaceTimes == nullptr) {
if (signal.markTimes != nullptr) {
free(signal.markTimes);
signal.markTimes = nullptr;
signal.markCount = 0;
}
free(tempData);
return signal;
}
for (int i = 0; i < signal.spaceCount; i++) {
signal.spaceTimes[i] = tempData[i * 2 + 1];
}
}
free(tempData);
signal.isValid = true;
return signal;
}
// 将红外信号转换为字符串
String irSignalToString(const IRSignal& signal) {
if (!signal.isValid ||
(signal.markTimes == nullptr && signal.spaceTimes == nullptr) ||
(signal.markCount == 0 && signal.spaceCount == 0)) {
if (!signal.isValid || signal.data == nullptr || signal.length == 0) {
return "";
}
String result = "";
int maxCount = max(signal.markCount, signal.spaceCount);
// 重建原始时序数据交替输出mark和space
for (int i = 0; i < maxCount; i++) {
// 添加mark时间
if (i < signal.markCount) {
if (result.length() > 0) result += ",";
result += String(signal.markTimes[i]);
}
// 添加space时间
if (i < signal.spaceCount) {
if (result.length() > 0) result += ",";
result += String(signal.spaceTimes[i]);
}
for (int i = 0; i < signal.length; i++) {
if (i > 0) result += ",";
result += String(signal.data[i]);
}
return result;
}
@@ -805,7 +751,7 @@ void handleStartRecord() {
prefs.putString(("ir_" + buttonName).c_str(), irDataStr);
Serial.println("红外信号录入成功: " + buttonName);
Serial.println("mark数量: " + String(signal.markCount) + ", space数量: " + String(signal.spaceCount));
Serial.println("信号长度: " + String(signal.length));
freeIRSignal(signal);
server.send(200, "application/json", "{\"success\":true}");
@@ -822,7 +768,7 @@ void handleSendIR() {
return;
}
DynamicJsonDocument doc(26700);
DynamicJsonDocument doc(200);
deserializeJson(doc, server.arg("plain"));
String buttonName = doc["button"];