@@ -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"];
|
||||
|
||||
Reference in New Issue
Block a user