重构了红外接收

This commit is contained in:
2025-09-23 23:58:49 +08:00
parent 9f663aed0b
commit 41e14ec828
4 changed files with 410 additions and 510 deletions

View File

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