调整了实时数据与统计数据的转换方式。更新了暂态事件与波形的处理
This commit is contained in:
@@ -76,6 +76,139 @@ unsigned char GetCrcSum(const std::vector<unsigned char>& Check, int nOffset, in
|
|||||||
return reg_b;
|
return reg_b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ʱ<><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TagMsTime -> <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
uint64_t convertTagMsTimeToMsTimestamp(const TagMsTime& t) {
|
||||||
|
struct tm tm_time = {};
|
||||||
|
tm_time.tm_year = t.Year - 1900;
|
||||||
|
tm_time.tm_mon = t.Month - 1;
|
||||||
|
tm_time.tm_mday = t.Day;
|
||||||
|
tm_time.tm_hour = t.Hour;
|
||||||
|
tm_time.tm_min = t.Min;
|
||||||
|
tm_time.tm_sec = t.Sec;
|
||||||
|
tm_time.tm_isdst = -1; // <20>Զ<EFBFBD><D4B6>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ʱ
|
||||||
|
|
||||||
|
// ת<><D7AA>Ϊʱ<CEAA><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩
|
||||||
|
time_t seconds = mktime(&tm_time);
|
||||||
|
if (seconds == -1) return 0;
|
||||||
|
|
||||||
|
// <20><><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD>
|
||||||
|
return static_cast<uint64_t>(seconds) * 1000 + t.Ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>QVVRRecord
|
||||||
|
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(
|
||||||
|
const std::string& strScale,
|
||||||
|
uint32_t nPTType,
|
||||||
|
float fPT,
|
||||||
|
const NewTaglogbuffer& log) {
|
||||||
|
|
||||||
|
QVVRRecord record;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// ת<><D7AA>ʱ<EFBFBD><CAB1>
|
||||||
|
record.triggerTimeMs = convertTagMsTimeToMsTimestamp(log.head.Devtime);
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||||
|
float fParam1 = 0.0f; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||||
|
float fParam2 = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
|
float fParam3 = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ֵ
|
||||||
|
|
||||||
|
for (const auto& body : log.bodyList) {
|
||||||
|
switch (body.ParaCode) {
|
||||||
|
case 0: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
||||||
|
fParam2 = static_cast<float>(body.ParaValue) / 65536.0f;
|
||||||
|
break;
|
||||||
|
case 1: // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(˲̬<CBB2><CCAC><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
|
||||||
|
fParam1 = static_cast<float>(body.ParaValue) / 65536.0f;
|
||||||
|
break;
|
||||||
|
case 25: // <20><><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ֵ(˲̬<CBB2><CCAC><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
|
||||||
|
fParam3 = static_cast<float>(body.ParaValue) / 65536.0f;
|
||||||
|
break;
|
||||||
|
case 3: //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ȣ<EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
||||||
|
record.fMagntitude = (static_cast<float>(body.ParaValue) / 65536.0f) / 100.0f;
|
||||||
|
break;
|
||||||
|
case 5: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
||||||
|
record.phase = static_cast<float>(body.ParaValue) / 65536.0f;
|
||||||
|
break;
|
||||||
|
case 6: //˲<><CBB2><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
||||||
|
record.transientValue = (static_cast<float>(body.ParaValue) / 65536.0f) / 100.0f;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
record.fPersisstime = fParam1;
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵfBase
|
||||||
|
float fBase = 0.0f;
|
||||||
|
if (fParam3 < 50.0f) { // δ<><CEB4><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>ż<EFBFBD>
|
||||||
|
if (fPT != 1.0f) { // <20><><EFBFBD>Ȳ<EFBFBD>Ϊ1
|
||||||
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::string strTemp = strScale;
|
||||||
|
std::transform(strTemp.begin(), strTemp.end(), strTemp.begin(), ::tolower);
|
||||||
|
size_t pos = strTemp.find('k');
|
||||||
|
if (pos != std::string::npos) {
|
||||||
|
std::string numPart = strTemp.substr(0, pos);
|
||||||
|
try {
|
||||||
|
float fTemp = std::stof(numPart) * 1000.0f;
|
||||||
|
fBase = (nPTType == 0) ? (fTemp / std::sqrt(3.0f)) : fTemp;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fBase = fParam3; // ʹ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ż<EFBFBD>ֵ
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
switch (log.head.LogCode) {
|
||||||
|
case 0: case 26: case 40: case 54: case 68: case 82:
|
||||||
|
record.nType = 3;
|
||||||
|
break;
|
||||||
|
case 1: case 27: case 41: case 55: case 69: case 83:
|
||||||
|
record.nType = 1;
|
||||||
|
break;
|
||||||
|
case 13: case 36: case 50: case 64: case 78: case 92:
|
||||||
|
record.nType = 2;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
// <20>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
record.nType = 1; // ģ<><C4A3><EFBFBD><EFBFBD>ѹ<EFBFBD>ݽ<EFBFBD>
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
record.nType = 4; // ˲̬<CBB2>¼<EFBFBD>
|
||||||
|
default:
|
||||||
|
// δ֪<CEB4><D6AA><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>0
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>¼<EFBFBD><C2BC>ҷ<EFBFBD>ֵ<EFBFBD>ϴ<EFBFBD>
|
||||||
|
if (record.nType == 3 && fParam2 > fBase * 0.1f) {
|
||||||
|
fParam2 /= 100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||||
|
record.fMagntitude = fParam2 / fBase;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
// <20>쳣ʱ<ECB3A3><CAB1><EFBFBD>ؿռ<D8BF>¼
|
||||||
|
record = QVVRRecord{};
|
||||||
|
}
|
||||||
|
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
||||||
std::vector<unsigned char> GetMsg(const std::vector<unsigned char>& SrcData, unsigned char nType) {
|
std::vector<unsigned char> GetMsg(const std::vector<unsigned char>& SrcData, unsigned char nType) {
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
@@ -237,3 +370,24 @@ std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo,
|
|||||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_New_3S));
|
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_New_3S));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName) {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С: 3(<28><><EFBFBD><EFBFBD>) + 4(֡<><D6A1><EFBFBD><EFBFBD>) + 128(<28>ļ<EFBFBD><C4BC><EFBFBD>) = 135<33>ֽ<EFBFBD>
|
||||||
|
std::vector<unsigned char> dataBuf(135, 0x00);
|
||||||
|
|
||||||
|
// д<><D0B4>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> (4<>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
|
//uint32_t netFrameIndex = htonl(static_cast<uint32_t>(frameIndex));
|
||||||
|
//memcpy(dataBuf.data() + 3, &netFrameIndex, sizeof(uint32_t));
|
||||||
|
// <20>Ƴ<EFBFBD>htonlת<6C><D7AA><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ʹ<EFBFBD><CAB9>ԭʼ֡<CABC><D6A1><EFBFBD><EFBFBD>(С<><D0A1><EFBFBD><EFBFBD>)
|
||||||
|
uint32_t rawFrameIndex = static_cast<uint32_t>(frameIndex);
|
||||||
|
memcpy(dataBuf.data() + 3, &rawFrameIndex, sizeof(uint32_t));
|
||||||
|
|
||||||
|
// д<><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> (<28><><EFBFBD><EFBFBD>128<32>ֽ<EFBFBD>)
|
||||||
|
size_t copyLen = std::min(fileName.size(), static_cast<size_t>(128));
|
||||||
|
if (copyLen > 0) {
|
||||||
|
memcpy(dataBuf.data() + 7, fileName.c_str(), copyLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_File_Download));
|
||||||
|
}
|
||||||
@@ -9,13 +9,13 @@
|
|||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <arpa/inet.h> // <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA>
|
#include <arpa/inet.h> // <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
float IntToFloat(int num);
|
float IntToFloat(int num);
|
||||||
float ShorToFloat100(short num);
|
float ShorToFloat100(short num);
|
||||||
float ShorToFloat1000(short num);
|
float ShorToFloat1000(short num);
|
||||||
float ShorToFloat10000(short num);
|
float ShorToFloat10000(short num);
|
||||||
|
|
||||||
// <20><><EFBFBD>ͱ<EFBFBD><CDB1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
// <20><><EFBFBD>ͱ<EFBFBD><CDB1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||||
enum class MsgRequestType : unsigned char {
|
enum class MsgRequestType : unsigned char {
|
||||||
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||||
@@ -23,7 +23,9 @@ enum class MsgRequestType : unsigned char {
|
|||||||
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
Request_Stat = 0x8a,
|
Request_Stat = 0x8a,
|
||||||
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||||
Request_New_3S = 0x04
|
Request_New_3S = 0x04,
|
||||||
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
||||||
|
Request_File_Download = 0x07
|
||||||
};
|
};
|
||||||
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||||
enum class MsgResponseType : unsigned char {
|
enum class MsgResponseType : unsigned char {
|
||||||
@@ -32,7 +34,13 @@ enum class MsgResponseType : unsigned char {
|
|||||||
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
Response_Stat = 0x26,
|
Response_Stat = 0x26,
|
||||||
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||||
Response_New_3S = 0x84
|
Response_New_3S = 0x84,
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>̬<EFBFBD>¼<EFBFBD>
|
||||||
|
Response_Event = 0x16,
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD>¼<EFBFBD>
|
||||||
|
Response_ActiveSOEInfo = 0x17,
|
||||||
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
||||||
|
Response_File_Download = 0x87
|
||||||
};
|
};
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
||||||
class MessageParser {
|
class MessageParser {
|
||||||
@@ -688,6 +696,472 @@ public:
|
|||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA>
|
||||||
|
std::string ConvertToBase64_Delta() const {
|
||||||
|
std::vector<float> float_buffer;
|
||||||
|
|
||||||
|
// 0-8λ<38><CEBB>Rmsȡ0-8
|
||||||
|
for (int i = 0; i < 9; ++i) {
|
||||||
|
float_buffer.push_back(Rms[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9-11λ<31><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12-14λ<34><CEBB>UU_Deviation<6F><6E>UL_Deviation<6F><6E><EFBFBD><EFBFBD>ȡǰ<C8A1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ0<CEAA><30>ֵ
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
|
||||||
|
float_buffer.push_back(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 15-16λ<36><CEBB>F_Deviation<6F><6E>ȡ0-1
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
float_buffer.push_back(F_Deviation[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>8λ<38><CEBB>UI_Seqȡ0-7
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 4; ++j) {
|
||||||
|
if (i * 4 + j < 8) { // ֻȡǰ8<C7B0><38>
|
||||||
|
float_buffer.push_back(UI_Seq[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>3<EFBFBD><33>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[3][i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>4<EFBFBD><34>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[4][i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>5<EFBFBD><35>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[5][i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>FuHarm<72><6D>0-2<><32>ȡ1-49λ
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>3-5<><35>ȡ1-49λ
|
||||||
|
for (int j = 3; j < 6; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarmPhase[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>0-2<><32>ȡ1-49λ
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarmPhase[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>50*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 50 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>50*3λ<33><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>3-5<><35>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
|
||||||
|
for (int j = 3; j < 6; ++j) {
|
||||||
|
for (int i = 0; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(InHarm[j][i].Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>50*3λ<33><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>0-2<><32>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int i = 0; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(InHarm[j][i].Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>12λ<32><CEBB><EFBFBD>δ<EFBFBD>Total_Power<65><72>0-3<><33>ȡ0-2λ
|
||||||
|
for (int j = 0; j < 4; ++j) {
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(Total_Power[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].P);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].P);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].P);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].P);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>Harm_Contain<69>е<EFBFBD>3-5<><35>ȡ1-49λ
|
||||||
|
for (int j = 3; j < 6; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Contain[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>Harm_Contain<69>е<EFBFBD>0-2<><32>ȡ1-49λ
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Contain[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>Harm_Aberrance<63>е<EFBFBD>3-5<><35>ȡֵ
|
||||||
|
for (int i = 3; i < 6; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Aberrance[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>Harm_Aberrance<63>е<EFBFBD>0-2<><32>ȡֵ
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Aberrance[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>4λ<34><CEBB>Cos_PF<50><46>ȡ0-3
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(Cos_PF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>4λ<34><CEBB>Cos_DF<44><46>ȡ0-3
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(Cos_DF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>U_Fluctuation<6F><6E>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(U_Fluctuation[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>U_Flicker<65><72>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(U_Flicker[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>UL_Flicker<65><72>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(UL_Flicker[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ת<><D7AA>ΪBase64
|
||||||
|
const size_t byte_size = float_buffer.size() * sizeof(float);
|
||||||
|
const unsigned char* byte_data = reinterpret_cast<const unsigned char*>(float_buffer.data());
|
||||||
|
return base64_encode(byte_data, byte_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
//<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA>
|
||||||
|
std::string ConvertToBase64_Star() const {
|
||||||
|
std::vector<float> float_buffer;
|
||||||
|
|
||||||
|
// 0-8λ<38><CEBB>Rmsȡ0-8
|
||||||
|
for (int i = 0; i < 9; ++i) {
|
||||||
|
float_buffer.push_back(Rms[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9-11λ<31><CEBB>UU_Deviation<6F><6E>UL_Deviation<6F><6E><EFBFBD><EFBFBD>ȡǰ<C8A1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ0<CEAA><30>ֵ
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
|
||||||
|
float_buffer.push_back(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12-14λ<34><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 15-16λ<36><CEBB>F_Deviation<6F><6E>ȡ0-1
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
float_buffer.push_back(F_Deviation[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>8λ<38><CEBB>UI_Seqȡ0-7
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 4; ++j) {
|
||||||
|
if (i * 4 + j < 8) { // ֻȡǰ8<C7B0><38>
|
||||||
|
float_buffer.push_back(UI_Seq[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>0<EFBFBD><30>ȡ1-49λ (ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʼ)
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[0][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>1<EFBFBD><31>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[1][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>2<EFBFBD><32>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[2][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>3<EFBFBD><33>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[3][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>4<EFBFBD><34>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[4][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>5<EFBFBD><35>ȡ1-49λ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarm[5][i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>0-2<><32>ȡ1-49λ
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarmPhase[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>3-5<><35>ȡ1-49λ
|
||||||
|
for (int j = 3; j < 6; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(FuHarmPhase[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>50*6λ<36><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>0-5<><35>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
|
||||||
|
for (int j = 0; j < 6; ++j) {
|
||||||
|
for (int i = 0; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(InHarm[j][i].Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>50*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 50 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>12λ<32><CEBB><EFBFBD>δ<EFBFBD>Total_Power<65><72>0-3<><33>ȡ0-2λ
|
||||||
|
for (int j = 0; j < 4; ++j) {
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(Total_Power[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].P);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].Q);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[0][i].S);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].P);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].Q);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[1][i].S);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].P);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].Q);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[2][i].S);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Pֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].P);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Qֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].Q);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>Sֵ
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Power[3][i].S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>49*6λ<36><CEBB>Harm_Contain<69>е<EFBFBD>0-5<><35>ȡ1-49λ
|
||||||
|
for (int j = 0; j < 6; ++j) {
|
||||||
|
for (int i = 1; i < HARMNUM; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Contain[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 49 * 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>6λ<36><CEBB>Harm_Aberrance<63>е<EFBFBD>0-5<><35>ȡֵ
|
||||||
|
for (int i = 0; i < 6; ++i) {
|
||||||
|
float_buffer.push_back(Harm_Aberrance[i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>4λ<34><CEBB>Cos_PF<50><46>ȡ0-3
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(Cos_PF[i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>4λ<34><CEBB>Cos_DF<44><46>ȡ0-3
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(Cos_DF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>U_Fluctuation<6F><6E>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(U_Fluctuation[i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>U_Flicker<65><72>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(U_Flicker[i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>UL_Flicker<65><72>ȡ0-2
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(UL_Flicker[i]);
|
||||||
|
}
|
||||||
|
// <20>ٺ<EFBFBD>3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ת<><D7AA>ΪBase64
|
||||||
|
const size_t byte_size = float_buffer.size() * sizeof(float);
|
||||||
|
const unsigned char* byte_data = reinterpret_cast<const unsigned char*>(float_buffer.data());
|
||||||
|
return base64_encode(byte_data, byte_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD>ʽѡ<CABD><D1A1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʽ
|
||||||
|
std::string ConvertToBase64(int type) const {
|
||||||
|
//1Ϊ<31><CEAA><EFBFBD>ͽ<EFBFBD><CDBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
|
||||||
|
if (type == 1) {
|
||||||
|
return ConvertToBase64_Delta();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return ConvertToBase64_Star();
|
||||||
|
}
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
void SerializeFloats(std::vector<float>& buffer) const {
|
void SerializeFloats(std::vector<float>& buffer) const {
|
||||||
@@ -1203,8 +1677,377 @@ public:
|
|||||||
|
|
||||||
return base64_encode(byte_data, byte_size);
|
return base64_encode(byte_data, byte_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string floatVectorToBase64(const std::vector<float>& float_buffer) const {
|
||||||
|
const size_t byte_size = float_buffer.size() * sizeof(float);
|
||||||
|
const unsigned char* byte_data =
|
||||||
|
reinterpret_cast<const unsigned char*>(float_buffer.data());
|
||||||
|
|
||||||
|
return base64_encode(byte_data, byte_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::string ConvertToBase64_Star() const {
|
||||||
|
std::vector<float> float_buffer;
|
||||||
|
|
||||||
|
// 0-8: RMSֵ
|
||||||
|
for (int i = 0; i < 9; ++i) {
|
||||||
|
float_buffer.push_back(Rms[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9-11: <20><>ѹƫ<D1B9>ȡ<EEA3A8><C8A1>Ϊ0<CEAA><30>ֵ<EFBFBD><D6B5>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
|
||||||
|
float_buffer.push_back(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12-14: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹλ<D1B9>ã<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 15-20: THD<48>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD>ʣ<EFBFBD>0-5<><35>
|
||||||
|
for (int i = 0; i < 6; ++i) {
|
||||||
|
float_buffer.push_back(THD[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 21-23: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹTHD<48><44>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 24-25: Ƶ<>ʼ<EFBFBD>ƫ<EFBFBD><C6AB>
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
float_buffer.push_back(FREQ[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 26-33: <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ8<C7B0><38>Ԫ<EFBFBD>أ<EFBFBD>
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 4; ++j) { // ȡÿ<C8A1>е<EFBFBD>ǰ4<C7B0><34>Ԫ<EFBFBD><D4AA>
|
||||||
|
if (i == 0 || j < 3) { // ȷ<><C8B7>ֻȡ8<C8A1><38>
|
||||||
|
float_buffer.push_back(UI_Seq[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 34-45: <20>ܹ<EFBFBD><DCB9><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
float_buffer.push_back(TOTAL_POWER[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 46-49: <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(COS_PF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 50-53: λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(COS_DF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 54-200: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMV[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 201-347: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3 * 49; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 348-494: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMI[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 495-641: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMVP[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 642-788: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||||
|
for (int i = 0; i < 3 * 49; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 789-935: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMIP[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 936-1085: <20><>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 0; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(INHARMV[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1086-1235: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3 * 50; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ת<><D7AA>ΪBase64
|
||||||
|
return floatVectorToBase64(float_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::string ConvertToBase64_Delta() const {
|
||||||
|
std::vector<float> float_buffer;
|
||||||
|
|
||||||
|
// 0-8: RMSֵ
|
||||||
|
for (int i = 0; i < 9; ++i) {
|
||||||
|
float_buffer.push_back(Rms[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9-11: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹλ<D1B9>ã<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12-14: <20><>ѹƫ<D1B9>ȡ<EEA3A8><C8A1>Ϊ0<CEAA><30>ֵ<EFBFBD><D6B5>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
|
||||||
|
float_buffer.push_back(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 15-17: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹTHD<48><44>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 18-20: THD<48>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>3-5<><35>
|
||||||
|
for (int i = 3; i < 6; ++i) {
|
||||||
|
float_buffer.push_back(THD[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 21-23: THD<48><44><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>0-2<><32>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
float_buffer.push_back(THD[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 24-25: Ƶ<>ʼ<EFBFBD>ƫ<EFBFBD><C6AB>
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
float_buffer.push_back(FREQ[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 26-33: <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ8<C7B0><38>Ԫ<EFBFBD>أ<EFBFBD>
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
for (int j = 0; j < 4; ++j) {
|
||||||
|
if (i == 0 || j < 3) {
|
||||||
|
float_buffer.push_back(UI_Seq[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 34-45: <20>ܹ<EFBFBD><DCB9><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
float_buffer.push_back(TOTAL_POWER[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 46-49: <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(COS_PF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 50-53: λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
float_buffer.push_back(COS_DF[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 54-200: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3 * 49; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 201-347: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMV[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 348-494: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMI[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 495-641: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||||
|
for (int i = 0; i < 3 * 49; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 642-788: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMVP[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 789-935: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 1; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(HARMIP[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 936-1085: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>
|
||||||
|
for (int i = 0; i < 3 * 50; ++i) {
|
||||||
|
float_buffer.push_back(3.1415f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1086-1235: <20><>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0-49<34>Σ<EFBFBD>
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
for (int j = 0; j < HARMNUM; ++j) {
|
||||||
|
float_buffer.push_back(INHARMV[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ת<><D7AA>ΪBase64
|
||||||
|
return floatVectorToBase64(float_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ݽ<EFBFBD><DDBD>߷<EFBFBD>ʽѡ<CABD><D1A1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::string ConvertToBase64(int wiringType) const {
|
||||||
|
// 1Ϊ<31><CEAA><EFBFBD>ͽ<EFBFBD><CDBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
|
||||||
|
if (wiringType == 1) {
|
||||||
|
return ConvertToBase64_Delta();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return ConvertToBase64_Star();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ------------------------------
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
|
// ʱ<><CAB1><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||||
|
struct TagMsTime {
|
||||||
|
uint16_t Year;
|
||||||
|
uint16_t Month;
|
||||||
|
uint16_t Day;
|
||||||
|
uint16_t Hour;
|
||||||
|
uint16_t Min;
|
||||||
|
uint16_t Sec;
|
||||||
|
uint16_t Ms;
|
||||||
|
|
||||||
|
void convertByteOrder() {
|
||||||
|
Year = ntohs(Year);
|
||||||
|
Month = ntohs(Month);
|
||||||
|
Day = ntohs(Day);
|
||||||
|
Hour = ntohs(Hour);
|
||||||
|
Min = ntohs(Min);
|
||||||
|
Sec = ntohs(Sec);
|
||||||
|
Ms = ntohs(Ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20>澯<EFBFBD>¼<EFBFBD>ͷ<EFBFBD>ṹ
|
||||||
|
struct NewHeadTaglogbuffer {
|
||||||
|
uint16_t name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
TagMsTime Devtime; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||||
|
uint16_t LogType; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||||
|
uint16_t LogCode; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||||
|
uint16_t LogLb; // <20><>־¼<D6BE><C2BC>
|
||||||
|
uint16_t LogBackup; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>λ
|
||||||
|
uint32_t LogParaNum; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
void convertByteOrder() {
|
||||||
|
name = ntohs(name);
|
||||||
|
Devtime.convertByteOrder();
|
||||||
|
LogType = ntohs(LogType);
|
||||||
|
LogCode = ntohs(LogCode);
|
||||||
|
LogLb = ntohs(LogLb);
|
||||||
|
LogBackup = ntohs(LogBackup);
|
||||||
|
LogParaNum = ntohl(LogParaNum);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20>澯<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
||||||
|
struct NewBodyTaglogbuffer {
|
||||||
|
uint32_t ParaCode; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
uint32_t ParaValue; // <20><><EFBFBD><EFBFBD>ֵ
|
||||||
|
|
||||||
|
void convertByteOrder() {
|
||||||
|
ParaCode = ntohl(ParaCode);
|
||||||
|
ParaValue = ntohl(ParaValue);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20>澯<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
||||||
|
class NewTaglogbuffer {
|
||||||
|
public:
|
||||||
|
NewHeadTaglogbuffer head;
|
||||||
|
std::vector<NewBodyTaglogbuffer> bodyList;
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
void parseFromData(const uint8_t* data, size_t data_size) {
|
||||||
|
// <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
|
||||||
|
if (data_size < sizeof(NewHeadTaglogbuffer)) {
|
||||||
|
throw std::runtime_error("Insufficient data for header");
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&head, data, sizeof(NewHeadTaglogbuffer));
|
||||||
|
head.convertByteOrder();
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF>
|
||||||
|
const size_t body_start = sizeof(NewHeadTaglogbuffer);
|
||||||
|
const size_t body_size = head.LogParaNum * sizeof(NewBodyTaglogbuffer);
|
||||||
|
|
||||||
|
if (data_size < body_start + body_size) {
|
||||||
|
throw std::runtime_error("Insufficient data for body");
|
||||||
|
}
|
||||||
|
|
||||||
|
bodyList.resize(head.LogParaNum);
|
||||||
|
const uint8_t* body_data = data + body_start;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < head.LogParaNum; ++i) {
|
||||||
|
memcpy(&bodyList[i], body_data, sizeof(NewBodyTaglogbuffer));
|
||||||
|
bodyList[i].convertByteOrder();
|
||||||
|
body_data += sizeof(NewBodyTaglogbuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C#<23>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
static NewTaglogbuffer createFromData(const uint8_t* data, size_t data_size) {
|
||||||
|
NewTaglogbuffer result;
|
||||||
|
result.parseFromData(data, data_size);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>QVVRRecord<72>ṹ<EFBFBD><E1B9B9>
|
||||||
|
struct QVVRRecord {
|
||||||
|
uint64_t triggerTimeMs; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UTC<54><43><EFBFBD><EFBFBD>1970-01-01 00:00:00<30><30>ʼ<EFBFBD><CABC>
|
||||||
|
int nType = 0; // <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>0-δ֪ 1-<2D>ݽ<EFBFBD> 2-<2D><><EFBFBD><EFBFBD> 3-<2D>ж<EFBFBD> 4-˲̬
|
||||||
|
float fPersisstime = 0.0f; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣨<EFBFBD>룩
|
||||||
|
float fMagntitude = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||||
|
float phase = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲̬ʹ<CCAC>ã<EFBFBD>0-A 1-B 2-C 3-AB 4-BC 5-CA ?-ABC
|
||||||
|
float transientValue = 0.0f;// ˲<><CBB2><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>˲̬ʹ<CCAC>ã<EFBFBD>
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>QVVRRecord
|
||||||
|
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(const std::string& strScale, uint32_t nPTType, float fPT, const NewTaglogbuffer& log);
|
||||||
|
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ-------------------------------
|
||||||
|
|
||||||
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
||||||
std::vector<unsigned char> generate_binary_message(
|
std::vector<unsigned char> generate_binary_message(
|
||||||
uint16_t msg_type,
|
uint16_t msg_type,
|
||||||
@@ -1218,3 +2061,5 @@ std::vector<unsigned char> generate_statequerytime_message();
|
|||||||
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType);
|
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType);
|
||||||
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ʵʱ<CAB5><CAB1><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
|
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ʵʱ<CAB5><CAB1><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
|
||||||
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo, unsigned char StaTtype, unsigned char flag);
|
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo, unsigned char StaTtype, unsigned char flag);
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName);
|
||||||
@@ -248,7 +248,7 @@ void ClientContext::process_next_action() {
|
|||||||
// 新增方法:发送当前状态对应的报文
|
// 新增方法:发送当前状态对应的报文
|
||||||
void ClientContext::send_current_packet() {
|
void ClientContext::send_current_packet() {
|
||||||
if (!current_packet_.empty()) {
|
if (!current_packet_.empty()) {
|
||||||
send_binary_data(this, current_packet_.data(), current_packet_.size());
|
safe_send_binary_data(this, current_packet_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,6 +417,37 @@ void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增函数:在事件循环线程中安全发送数据
|
||||||
|
void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data) {
|
||||||
|
uv_work_t* req = new uv_work_t;
|
||||||
|
req->data = new std::pair<ClientContext*, std::vector<unsigned char>>(ctx, std::move(data));
|
||||||
|
|
||||||
|
uv_queue_work(ctx->loop, req, [](uv_work_t* req) {
|
||||||
|
// 在工作线程中不执行实际工作
|
||||||
|
}, [](uv_work_t* req, int status) {
|
||||||
|
// 在事件循环线程中执行实际发送
|
||||||
|
auto* pair = static_cast<std::pair<ClientContext*, std::vector<unsigned char>>*>(req->data);
|
||||||
|
ClientContext* ctx = pair->first;
|
||||||
|
const auto& data = pair->second;
|
||||||
|
|
||||||
|
if (ctx->state == ConnectionState::CONNECTED) {
|
||||||
|
// 实际发送逻辑(原 send_binary_data 的核心部分)
|
||||||
|
uv_buf_t buf = uv_buf_init(const_cast<char*>(reinterpret_cast<const char*>(data.data())), data.size());
|
||||||
|
uv_write_t* write_req = new uv_write_t;
|
||||||
|
write_req->data = new std::vector<unsigned char>(data); // 复制数据
|
||||||
|
|
||||||
|
int ret = uv_write(write_req, (uv_stream_t*)&ctx->client, &buf, 1, on_write);
|
||||||
|
if (ret < 0) {
|
||||||
|
// 错误处理
|
||||||
|
delete static_cast<std::vector<unsigned char>*>(write_req->data);
|
||||||
|
delete write_req;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete pair;
|
||||||
|
delete req;
|
||||||
|
});
|
||||||
|
}
|
||||||
/* 连接关闭回调 */
|
/* 连接关闭回调 */
|
||||||
void on_close(uv_handle_t* handle) {
|
void on_close(uv_handle_t* handle) {
|
||||||
ClientContext* ctx = static_cast<ClientContext*>(handle->data);
|
ClientContext* ctx = static_cast<ClientContext*>(handle->data);
|
||||||
@@ -503,7 +534,7 @@ void on_connect(uv_connect_t* req, int status) {
|
|||||||
//客户端连接完毕后,发送装置登陆消息
|
//客户端连接完毕后,发送装置登陆消息
|
||||||
std::cout << "connected: " << ctx->device_info.mac << " send login msg!" << std::endl;
|
std::cout << "connected: " << ctx->device_info.mac << " send login msg!" << std::endl;
|
||||||
auto binary_data = generate_frontlogin_message(ctx->device_info.mac);
|
auto binary_data = generate_frontlogin_message(ctx->device_info.mac);
|
||||||
send_binary_data(ctx, binary_data.data(), binary_data.size());
|
safe_send_binary_data(ctx, binary_data);
|
||||||
|
|
||||||
uv_read_start((uv_stream_t*)&ctx->client, alloc_buffer, on_read);
|
uv_read_start((uv_stream_t*)&ctx->client, alloc_buffer, on_read);
|
||||||
ctx->start_timer();
|
ctx->start_timer();
|
||||||
@@ -623,30 +654,6 @@ void ClientManager::remove_device(const std::string& device_id) {
|
|||||||
std::cout << "[Device " << device_id << "] Removed successfully\n";
|
std::cout << "[Device " << device_id << "] Removed successfully\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientManager::send_to_device(const std::string& identifier,
|
|
||||||
const unsigned char* data,
|
|
||||||
size_t size) {
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
|
|
||||||
for (auto& pair : clients_) {
|
|
||||||
auto& ctx = pair.second;
|
|
||||||
// 匹配装置ID或MAC地址
|
|
||||||
if (ctx->device_info.device_id == identifier ||
|
|
||||||
ctx->device_info.mac == identifier) {
|
|
||||||
|
|
||||||
if (ctx->state == ConnectionState::CONNECTED) {
|
|
||||||
send_binary_data(ctx.get(), data, size);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
std::cerr << "[Device " << identifier << "] Not connected\n";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "[Device " << identifier << "] Not found\n";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientManager::stop_all() {
|
void ClientManager::stop_all() {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
for (auto& pair : clients_) {
|
for (auto& pair : clients_) {
|
||||||
@@ -1012,3 +1019,156 @@ bool ClientManager::set_real_state_count(const std::string& identifier, int coun
|
|||||||
std::cerr << "[set_real_state_count] Device not found: " << identifier << std::endl;
|
std::cerr << "[set_real_state_count] Device not found: " << identifier << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ClientManager::get_point_scale_and_pttype(const std::string& identifier,
|
||||||
|
ushort nCpuNo,
|
||||||
|
std::string& out_scale,
|
||||||
|
int& out_pttype) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
// 遍历所有客户端上下文
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
|
||||||
|
// 检查标识符是否匹配设备ID或MAC地址
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
|
||||||
|
// 在装置的测点列表中查找匹配的测点
|
||||||
|
for (const auto& point : ctx->device_info.points) {
|
||||||
|
if (point.nCpuNo == nCpuNo) {
|
||||||
|
out_scale = point.strScale;
|
||||||
|
out_pttype = point.nPTType;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测点未找到
|
||||||
|
std::cerr << "Point with nCpuNo " << nCpuNo
|
||||||
|
<< " not found for device: " << identifier << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设备未找到
|
||||||
|
std::cerr << "Device not found: " << identifier << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//修改待发送报文的帧序号(仅在暂态文件中使用)
|
||||||
|
bool ClientManager::update_current_packet_frame(const std::string& identifier, int next_frame) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier || ctx->device_info.mac == identifier) {
|
||||||
|
std::lock_guard<std::mutex> state_lock(ctx->state_mutex_);
|
||||||
|
|
||||||
|
// 检查报文长度是否足够
|
||||||
|
if (ctx->current_packet_.size() < 16) {
|
||||||
|
std::cerr << "Packet too short to update frame number" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 小端序写入新帧序号 (位置12-15字节)
|
||||||
|
ctx->current_packet_[12] = (next_frame >> 0) & 0xFF;
|
||||||
|
ctx->current_packet_[13] = (next_frame >> 8) & 0xFF;
|
||||||
|
ctx->current_packet_[14] = (next_frame >> 16) & 0xFF;
|
||||||
|
ctx->current_packet_[15] = (next_frame >> 24) & 0xFF;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClientManager::parse_download_packet(const std::string& identifier, DownloadInfo& out_info) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
|
||||||
|
// 获取当前状态报文
|
||||||
|
std::vector<unsigned char> current_packet;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> state_lock(ctx->state_mutex_);
|
||||||
|
current_packet = ctx->current_packet_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析帧序号 (12-15字节小端序)
|
||||||
|
if (current_packet.size() >= 16) {
|
||||||
|
out_info.current_frame =
|
||||||
|
(static_cast<int>(current_packet[12])) |
|
||||||
|
(static_cast<int>(current_packet[13]) << 8) |
|
||||||
|
(static_cast<int>(current_packet[14]) << 16) |
|
||||||
|
(static_cast<int>(current_packet[15]) << 24);
|
||||||
|
|
||||||
|
// 解析文件名 (从偏移量16开始)
|
||||||
|
if (current_packet.size() > 16) {
|
||||||
|
const char* filename_start = reinterpret_cast<const char*>(current_packet.data()) + 16;
|
||||||
|
size_t filename_len = 128;
|
||||||
|
out_info.filename.assign(filename_start, filename_len);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClientManager::add_file_packet_to_device(const std::string& identifier,
|
||||||
|
int frame_index,
|
||||||
|
const unsigned char* data,
|
||||||
|
size_t size) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
ctx->add_file_packet(frame_index, data, size);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<unsigned char>>
|
||||||
|
ClientManager::get_and_clear_file_packets(const std::string& identifier) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
return ctx->get_and_clear_file_packets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClientManager::update_current_filename(const std::string& identifier,
|
||||||
|
const std::string& filename) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
ctx->set_current_filename(filename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ClientManager::get_current_filename(const std::string& identifier) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier) {
|
||||||
|
return ctx->get_current_filename();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
@@ -20,6 +20,8 @@ struct PointInfo {
|
|||||||
double PT2; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>2
|
double PT2; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>2
|
||||||
double CT1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
|
double CT1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
|
||||||
double CT2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
|
double CT2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
|
||||||
|
std::string strScale; // <20><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||||
|
int nPTType; // <20><><EFBFBD>߷<EFBFBD>ʽ 0-<2D><><EFBFBD><EFBFBD> 1-<2D><><EFBFBD><EFBFBD>
|
||||||
};
|
};
|
||||||
|
|
||||||
// װ<><D7B0><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
// װ<><D7B0><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
||||||
@@ -44,6 +46,7 @@ enum class DeviceState {
|
|||||||
READING_STATS, // <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
READING_STATS, // <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
|
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
|
||||||
READING_REALSTAT, // <20><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
READING_REALSTAT, // <20><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||||
|
READING_EVENTFILE, // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||||
};
|
};
|
||||||
@@ -161,6 +164,60 @@ public:
|
|||||||
realtime_packets_cache_.clear();
|
realtime_packets_cache_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<2F><>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
struct FileDownloadPacket {
|
||||||
|
int frame_index;
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<FileDownloadPacket> file_download_cache_; // <20>ļ<EFBFBD><C4BC><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
|
||||||
|
std::string current_filename_; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
std::mutex file_cache_mutex_; // <20><><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
void add_file_packet(int frame_index, const unsigned char* data, size_t size) {
|
||||||
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
||||||
|
file_download_cache_.push_back({ frame_index, std::vector<unsigned char>(data, data + size) });
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>з<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::vector<std::vector<unsigned char>> get_and_clear_file_packets() {
|
||||||
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
||||||
|
|
||||||
|
// <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::sort(file_download_cache_.begin(), file_download_cache_.end(),
|
||||||
|
[](const FileDownloadPacket& a, const FileDownloadPacket& b) {
|
||||||
|
return a.frame_index < b.frame_index;
|
||||||
|
});
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||||
|
std::vector<std::vector<unsigned char>> packets;
|
||||||
|
for (const auto& pkt : file_download_cache_) {
|
||||||
|
packets.push_back(pkt.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||||
|
file_download_cache_.clear();
|
||||||
|
return packets;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
void clear_file_cache() {
|
||||||
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
||||||
|
file_download_cache_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
void set_current_filename(const std::string& filename) {
|
||||||
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
||||||
|
current_filename_ = filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
std::string get_current_filename() {
|
||||||
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
||||||
|
return current_filename_;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
int index_;
|
int index_;
|
||||||
|
|
||||||
@@ -185,7 +242,6 @@ public:
|
|||||||
|
|
||||||
void add_device(const DeviceInfo& device);//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
void add_device(const DeviceInfo& device);//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
void remove_device(const std::string& device_id);//ɾ<><C9BE>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
void remove_device(const std::string& device_id);//ɾ<><C9BE>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
bool send_to_device(const std::string& identifier, const unsigned char* data, size_t size);//ѡ<><D1A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>װ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
void restart_device(const std::string& device_id);//<2F>ر<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
void restart_device(const std::string& device_id);//<2F>ر<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
void stop_all();//ֹͣ<CDA3><D6B9><EFBFBD>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
void stop_all();//ֹͣ<CDA3><D6B9><EFBFBD>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
bool set_cloud_status(const std::string& identifier, int status);//<2F><EFBFBD><DEB8><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬
|
bool set_cloud_status(const std::string& identifier, int status);//<2F><EFBFBD><DEB8><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬
|
||||||
@@ -279,6 +335,33 @@ public:
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ<EFBFBD>ȼ<EFBFBD><C8BC>ͽ<EFBFBD><CDBD>߷<EFBFBD>ʽ
|
||||||
|
bool get_point_scale_and_pttype(const std::string& identifier,
|
||||||
|
ushort nCpuNo,
|
||||||
|
std::string& out_scale,
|
||||||
|
int& out_pttype);
|
||||||
|
|
||||||
|
//<2F><EFBFBD><DEB8><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ĵ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||||
|
bool update_current_packet_frame(const std::string& identifier, int next_frame);
|
||||||
|
|
||||||
|
//<2F><>ȡ<EFBFBD><C8A1>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ϣ
|
||||||
|
struct DownloadInfo {
|
||||||
|
std::string filename;
|
||||||
|
int current_frame;
|
||||||
|
};
|
||||||
|
bool parse_download_packet(const std::string& identifier, DownloadInfo& out_info);
|
||||||
|
|
||||||
|
bool add_file_packet_to_device(const std::string& identifier,
|
||||||
|
int frame_index,
|
||||||
|
const unsigned char* data,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
std::vector<std::vector<unsigned char>> get_and_clear_file_packets(const std::string& identifier);
|
||||||
|
|
||||||
|
bool update_current_filename(const std::string& identifier, const std::string& filename);
|
||||||
|
|
||||||
|
std::string get_current_filename(const std::string& identifier);
|
||||||
private:
|
private:
|
||||||
ClientManager() : loop_(nullptr) {}
|
ClientManager() : loop_(nullptr) {}
|
||||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
||||||
@@ -289,6 +372,7 @@ private:
|
|||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
void start_client_connect(const std::vector<DeviceInfo>& devices);
|
void start_client_connect(const std::vector<DeviceInfo>& devices);
|
||||||
void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data_size);
|
void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data_size);
|
||||||
|
void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data);
|
||||||
void on_timer(uv_timer_t* handle);
|
void on_timer(uv_timer_t* handle);
|
||||||
void try_reconnect(uv_timer_t* timer);
|
void try_reconnect(uv_timer_t* timer);
|
||||||
void on_connect(uv_connect_t* req, int status);
|
void on_connect(uv_connect_t* req, int status);
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sys/stat.h> // <20><><EFBFBD><EFBFBD>mkdir
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "cloudfront/code/interface.h" //lnk20250708
|
#include "cloudfront/code/interface.h" //lnk20250708
|
||||||
@@ -32,12 +33,23 @@ time_t ConvertToTimestamp(const tagPqData_Float& data) {
|
|||||||
return mktime(&t);
|
return mktime(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<2F>ļ<EFBFBD><C4BC>ָ<EFBFBD>ȡ<EFBFBD>ֶ<EFBFBD>
|
||||||
|
std::string extract_filename(const std::string& path) {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'<27><>λ<EFBFBD><CEBB>
|
||||||
|
size_t last_slash = path.find_last_of('/');
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>'/'<27><><EFBFBD><EFBFBD>'/'֮<><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
||||||
|
if (last_slash != std::string::npos) {
|
||||||
|
return path.substr(last_slash + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>'/'<27><>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>ԭ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||||
|
return path;
|
||||||
|
}
|
||||||
void process_received_message(string mac, string id,const char* data, size_t length) {
|
void process_received_message(string mac, string id,const char* data, size_t length) {
|
||||||
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
||||||
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ʵ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
|
|
||||||
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
@@ -72,7 +84,142 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
//<2F><>¼<EFBFBD><C2BC><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//<2F><>¼<EFBFBD><C2BC><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> <20><>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>/<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Event)) {
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||||
|
int nPTType;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||||
|
float fPT = 1.0f;
|
||||||
|
float fCT = 1.0f;
|
||||||
|
if (ClientManager::instance().get_point_scale_and_pttype(
|
||||||
|
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||||
|
event.head.name, // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
strScale,
|
||||||
|
nPTType) && ClientManager::instance().get_pt_ct_ratio(id, event.head.name, fPT, fCT))
|
||||||
|
{
|
||||||
|
// ʹ<>û<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>¼
|
||||||
|
QVVRRecord record = DynamicLog_GetQVVRRecordFromLogBuffer(
|
||||||
|
strScale, nPTType, fPT, event);
|
||||||
|
|
||||||
|
// ʹ<>ü<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ݣ<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
|
||||||
|
std::cout << "<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << record.nType
|
||||||
|
<< ", <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: " << record.fPersisstime << "s"
|
||||||
|
<< ", <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: " << record.fMagntitude << " pu"
|
||||||
|
<< ", ʱ<><CAB1><EFBFBD><EFBFBD>: " << record.triggerTimeMs << "ms" << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡʧ<C8A1>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::cerr << "Failed to get point parameters for: " << mac << std::endl;
|
||||||
|
}
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ĺ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_ActiveSOEInfo)) {
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||||
|
unsigned char file_type = udata[12];//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cfg dat hdr 1-3
|
||||||
|
unsigned char line_id = udata[13];//¼<><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
|
||||||
|
const uint8_t* data_ptr = parser.RecvData.data() + 2;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>ǰ<EFBFBD><C7B0>λ
|
||||||
|
size_t data_size = parser.RecvData.size() - 2;
|
||||||
|
// ֱ<>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2BFBD><EFBFBD><EFBFBD>
|
||||||
|
std::string tempfilename(
|
||||||
|
reinterpret_cast<const char*>(data_ptr),
|
||||||
|
data_size
|
||||||
|
);
|
||||||
|
|
||||||
|
// ========== <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========
|
||||||
|
// 1. <20>ָ<EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ͺ<EFBFBD>
|
||||||
|
size_t dotPos = tempfilename.find_last_of('.');
|
||||||
|
std::string baseName, originalExt;
|
||||||
|
if (dotPos != std::string::npos) {
|
||||||
|
baseName = tempfilename.substr(0, dotPos);
|
||||||
|
originalExt = tempfilename.substr(dotPos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
baseName = tempfilename;
|
||||||
|
originalExt = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. ȷ<><C8B7><EFBFBD><EFBFBD>Сд<D0A1><D0B4><EFBFBD><EFBFBD>
|
||||||
|
bool isUppercase = false;
|
||||||
|
if (!originalExt.empty()) {
|
||||||
|
isUppercase = true;
|
||||||
|
for (char c : originalExt) {
|
||||||
|
if (std::isalpha(c) && std::islower(c)) {
|
||||||
|
isUppercase = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ĺ<EFBFBD><EFBFBD>б<EFBFBD>
|
||||||
|
std::vector<std::string> requiredExts;
|
||||||
|
if (file_type == 3) { // <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
|
requiredExts = { ".cfg", ".dat", ".hdr" };
|
||||||
|
}
|
||||||
|
else { // Ĭ<><C4AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
|
requiredExts = { ".cfg", ".dat" };
|
||||||
|
//requiredExts = { ".dat" };
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BA>Сд
|
||||||
|
if (isUppercase) {
|
||||||
|
for (auto& ext : requiredExts) {
|
||||||
|
for (char& c : ext) {
|
||||||
|
if (std::isalpha(c)) c = std::toupper(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>б<EFBFBD>
|
||||||
|
std::vector<std::string> fullFilenames;
|
||||||
|
for (const auto& ext : requiredExts) {
|
||||||
|
fullFilenames.push_back(baseName + ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>ʹ<EFBFBD><CAB9><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ӡ<EFBFBD><EFBFBD><DFBC><EFBFBD>
|
||||||
|
std::cout << "Generated filenames: ";
|
||||||
|
for (const auto& name : fullFilenames) {
|
||||||
|
std::cout << name << " ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
// ========== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊÿ<CEAA><C3BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========
|
||||||
|
for (const auto& filename : fullFilenames) {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (֡<><D6A1><EFBFBD>Ź̶<C5B9>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
|
auto downloadMsg = generate_downloadfile_message(1, filename);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||||
|
ClientManager::instance().add_action_to_device(
|
||||||
|
id,
|
||||||
|
DeviceState::READING_EVENTFILE,
|
||||||
|
downloadMsg
|
||||||
|
);
|
||||||
|
|
||||||
|
std::cout << "Added download request for: " << filename << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰװ<C7B0>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰװ<C7B0>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ִ<EFBFBD>У<EFBFBD>
|
||||||
|
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
|
||||||
|
if (!ClientManager::instance().get_device_state(id, currentState)) {
|
||||||
|
std::cerr << "Failed to get device state for: " << id << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (currentState) {
|
||||||
|
case DeviceState::IDLE:
|
||||||
|
//<2F><>ǰװ<C7B0>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ClientManager::instance().post_message_processing(id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//<2F>ǿ<EFBFBD><C7BF>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>״ֱ̬<CCAC><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ٳ<EFBFBD><D9B3>Ի<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ĺ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||||
|
return;
|
||||||
|
}
|
||||||
//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
|
//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
|
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
|
||||||
@@ -170,12 +317,21 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
tagPqData_Float avg_data = all_data[2];
|
tagPqData_Float avg_data = all_data[2];
|
||||||
tagPqData_Float cp95_data = all_data[3];
|
tagPqData_Float cp95_data = all_data[3];
|
||||||
|
|
||||||
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
|
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||||
std::string max_base64Str = max_data.ConvertToBase64();
|
int nPTType = 0;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||||
std::string min_base64Str = min_data.ConvertToBase64();
|
ClientManager::instance().get_point_scale_and_pttype(
|
||||||
std::string avg_base64Str = avg_data.ConvertToBase64();
|
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||||
std::string cp95_base64Str = cp95_data.ConvertToBase64();
|
pq_data.name, // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
strScale,
|
||||||
|
nPTType);
|
||||||
|
|
||||||
|
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
|
||||||
|
std::string max_base64Str = max_data.ConvertToBase64(nPTType);
|
||||||
|
std::string min_base64Str = min_data.ConvertToBase64(nPTType);
|
||||||
|
std::string avg_base64Str = avg_data.ConvertToBase64(nPTType);
|
||||||
|
std::string cp95_base64Str = cp95_data.ConvertToBase64(nPTType);
|
||||||
|
//std::cout << "New star base64Str0:" << max_base64Str << std::endl;
|
||||||
|
//std::cout << "New del base64Str1:" << avg_data.ConvertToBase64(1) << std::endl;
|
||||||
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
|
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
|
||||||
time_t data_time = ConvertToTimestamp(avg_data);
|
time_t data_time = ConvertToTimestamp(avg_data);
|
||||||
|
|
||||||
@@ -339,8 +495,16 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string base64 = realdata.ConvertToBase64();
|
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||||
std::cout << base64 << std::endl;
|
int nPTType = 0;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||||
|
ClientManager::instance().get_point_scale_and_pttype(
|
||||||
|
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||||
|
static_cast<unsigned char>(udata[12]), // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
strScale,
|
||||||
|
nPTType);
|
||||||
|
|
||||||
|
std::string base64 = realdata.ConvertToBase64(nPTType);
|
||||||
|
//std::cout << base64 << std::endl;
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||||
}
|
}
|
||||||
@@ -352,6 +516,92 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DeviceState::READING_EVENTFILE:
|
||||||
|
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::cout << "READING_EVENTFILE state: Processing stats time from " << mac << std::endl;
|
||||||
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_File_Download)) {
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1>ǰ֡<C7B0><D6A1><EFBFBD>ţ<EFBFBD>12-15<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
int current_frame = (static_cast<int>(udata[12]) << 24) |
|
||||||
|
(static_cast<int>(udata[13]) << 16) |
|
||||||
|
(static_cast<int>(udata[14]) << 8) |
|
||||||
|
static_cast<int>(udata[15]);
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>16-19<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
int total_frames = (static_cast<int>(udata[16]) << 24) |
|
||||||
|
(static_cast<int>(udata[17]) << 16) |
|
||||||
|
(static_cast<int>(udata[18]) << 8) |
|
||||||
|
static_cast<int>(udata[19]);
|
||||||
|
|
||||||
|
//std::cout << "eventfile frames: " << current_frame << "/" << total_frames << std::endl;
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD> ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ14λ <20><><EFBFBD><EFBFBD><DFBC>Ժ<EFBFBD><D4BA><EFBFBD>д<EFBFBD><D0B4>
|
||||||
|
const uint8_t* data_ptr = parser.RecvData.data() + 14;
|
||||||
|
size_t data_size = parser.RecvData.size() - 14;
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>¼<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
if (current_frame == 1) {
|
||||||
|
ClientManager::DownloadInfo info;
|
||||||
|
if (ClientManager::instance().parse_download_packet(id, info)) {
|
||||||
|
ClientManager::instance().update_current_filename(id, info.filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
std::string filename = ClientManager::instance().get_current_filename(id);
|
||||||
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ClientManager::instance().add_file_packet_to_device(id, current_frame, data_ptr, data_size);
|
||||||
|
|
||||||
|
//std::cout << "fileinfo: " << info.filename << "/" << info.current_frame << std::endl;
|
||||||
|
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB>δ<EFBFBD><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ģ<EFBFBD><C4A3><EFBFBD>ȫ<EFBFBD><C8AB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||||
|
if (current_frame < total_frames) {
|
||||||
|
// δ<><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD>״̬,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<DEB8><C4B5>±<EFBFBD><C2B1><EFBFBD>
|
||||||
|
int nextframe = current_frame + 1;
|
||||||
|
auto downloadMsg = generate_downloadfile_message(nextframe, filename);
|
||||||
|
ClientManager::instance().change_device_state(id, DeviceState::READING_EVENTFILE, downloadMsg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
|
std::cout << "mac: " << mac << " fileinfo: " << filename <<std::endl;
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>з<EFBFBD>Ƭ
|
||||||
|
auto packets = ClientManager::instance().get_and_clear_file_packets(id);
|
||||||
|
|
||||||
|
// <20>ϲ<EFBFBD><CFB2>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
std::vector<unsigned char> file_data;
|
||||||
|
for (const auto& packet : packets) {
|
||||||
|
file_data.insert(file_data.end(), packet.begin(), packet.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
|
std::string mac_dir = mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
|
||||||
|
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
||||||
|
if (mkdir(mac_dir.c_str(), 0777) != 0 && errno != EEXIST) {
|
||||||
|
std::cerr << "Failed to create directory: " << mac_dir << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string path = extract_filename(filename);
|
||||||
|
|
||||||
|
std::string file_path = mac_dir + "/" + path;
|
||||||
|
std::ofstream out_file(file_path, std::ios::binary);
|
||||||
|
if (out_file) {
|
||||||
|
out_file.write(reinterpret_cast<const char*>(file_data.data()),
|
||||||
|
file_data.size());
|
||||||
|
std::cout << "File saved: " << file_path << std::endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cerr << "Failed to save file: " << file_path
|
||||||
|
<< ", Error: " << strerror(errno) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//<2F><>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>أ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>еȺ<D0B5><C8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>״̬<D7B4><CCAC>ֱ<EFBFBD>ӾͻῪʼ<E1BFAA><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||||
|
// <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||||
|
std::cout << "udata[8]: " << static_cast<int>(udata[8]) << std::endl;
|
||||||
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case DeviceState::CUSTOM_ACTION:
|
case DeviceState::CUSTOM_ACTION:
|
||||||
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
||||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||||
|
|||||||
@@ -124,12 +124,12 @@ void* client_manager_thread(void* arg) {
|
|||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
std::vector<PointInfo> points1 = {
|
std::vector<PointInfo> points1 = {
|
||||||
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1},
|
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
|
||||||
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1}
|
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<PointInfo> points2 = {
|
std::vector<PointInfo> points2 = {
|
||||||
{"P101", "Generator Output", "D002",1 ,1, 1, 1, 1}
|
{"P101", "Generator Output", "D002",1 ,1, 1, 1, 1,"0.38k",0}
|
||||||
};
|
};
|
||||||
//00-B7-8D-A8-00-D6 00-B7-8D-01-79-06
|
//00-B7-8D-A8-00-D6 00-B7-8D-01-79-06
|
||||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||||
|
|||||||
Reference in New Issue
Block a user