新增暂态事件补招功能
This commit is contained in:
@@ -702,4 +702,67 @@ std::vector<uint8_t> generate_righttime_message(const std::tm& time) {
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>134(0x86)
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_RightTime));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||||
* @param Time1 <20><>ʼʱ<CABC><CAB1>
|
||||
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
|
||||
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<uint8_t> generate_recallevent_message(const std::tm& Time1, const std::tm& Time2,
|
||||
uint8_t eventType, uint8_t monitorPoint)
|
||||
{
|
||||
std::vector<uint8_t> DataBuf(25, 0x00); // <20><><EFBFBD><EFBFBD>25<32>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
||||
|
||||
// ǰ3<C7B0>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ã<EFBFBD><C3A3>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
||||
|
||||
DataBuf[3] = eventType; // 2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯<EFBFBD>¼<EFBFBD>
|
||||
DataBuf[4] = monitorPoint; // 0-<2D><><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڸ<D6BD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint16_t year1 = static_cast<uint16_t>(Time1.tm_year + 1900);
|
||||
DataBuf[5] = static_cast<uint8_t>((year1 >> 8) & 0xFF);
|
||||
DataBuf[6] = static_cast<uint8_t>(year1 & 0xFF);
|
||||
|
||||
uint16_t month1 = static_cast<uint16_t>(Time1.tm_mon + 1);
|
||||
DataBuf[7] = static_cast<uint8_t>((month1 >> 8) & 0xFF);
|
||||
DataBuf[8] = static_cast<uint8_t>(month1 & 0xFF);
|
||||
|
||||
uint16_t day1 = static_cast<uint16_t>(Time1.tm_mday);
|
||||
DataBuf[9] = static_cast<uint8_t>((day1 >> 8) & 0xFF);
|
||||
DataBuf[10] = static_cast<uint8_t>(day1 & 0xFF);
|
||||
|
||||
uint16_t hour1 = static_cast<uint16_t>(Time1.tm_hour);
|
||||
DataBuf[11] = static_cast<uint8_t>((hour1 >> 8) & 0xFF);
|
||||
DataBuf[12] = static_cast<uint8_t>(hour1 & 0xFF);
|
||||
|
||||
uint16_t minute1 = static_cast<uint16_t>(Time1.tm_min);
|
||||
DataBuf[13] = static_cast<uint8_t>((minute1 >> 8) & 0xFF);
|
||||
DataBuf[14] = static_cast<uint8_t>(minute1 & 0xFF);
|
||||
|
||||
uint16_t year2 = static_cast<uint16_t>(Time2.tm_year + 1900);
|
||||
DataBuf[15] = static_cast<uint8_t>((year2 >> 8) & 0xFF);
|
||||
DataBuf[16] = static_cast<uint8_t>(year2 & 0xFF);
|
||||
|
||||
uint16_t month2 = static_cast<uint16_t>(Time2.tm_mon + 1);
|
||||
DataBuf[17] = static_cast<uint8_t>((month2 >> 8) & 0xFF);
|
||||
DataBuf[18] = static_cast<uint8_t>(month2 & 0xFF);
|
||||
|
||||
uint16_t day2 = static_cast<uint16_t>(Time2.tm_mday);
|
||||
DataBuf[19] = static_cast<uint8_t>((day2 >> 8) & 0xFF);
|
||||
DataBuf[20] = static_cast<uint8_t>(day2 & 0xFF);
|
||||
|
||||
uint16_t hour2 = static_cast<uint16_t>(Time2.tm_hour);
|
||||
DataBuf[21] = static_cast<uint8_t>((hour2 >> 8) & 0xFF);
|
||||
DataBuf[22] = static_cast<uint8_t>(hour2 & 0xFF);
|
||||
|
||||
uint16_t minute2 = static_cast<uint16_t>(Time2.tm_min);
|
||||
DataBuf[23] = static_cast<uint8_t>((minute2 >> 8) & 0xFF);
|
||||
DataBuf[24] = static_cast<uint8_t>(minute2 & 0xFF);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x0D(<28>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>)
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Read_Event));
|
||||
}
|
||||
@@ -43,7 +43,9 @@ enum class MsgRequestType : unsigned char {
|
||||
//ѯ<><D1AF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
Request_Read_RunningInformation = 0x0e,
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
Request_RightTime = 0x86
|
||||
Request_RightTime = 0x86,
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
Request_Read_Event = 0x0D
|
||||
};
|
||||
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||
enum class MsgResponseType : unsigned char {
|
||||
@@ -77,6 +79,8 @@ enum class MsgResponseType : unsigned char {
|
||||
Response_Read_RunningInformation = 0x8e,
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ(δʹ<CEB4><CAB9>,<2C><><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͽ϶<CFBF><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>)
|
||||
Response_RightTime = 0x86,
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
Response_Read_Event = 0x8D,
|
||||
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
|
||||
Response_NewACK = 0x40,
|
||||
//Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
@@ -2189,4 +2193,13 @@ std::vector<unsigned char> generate_machineversion_message();
|
||||
* @param time <20>·<EFBFBD><C2B7>Ķ<EFBFBD>ʱʱ<CAB1><CAB1> (tmֵ)
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<uint8_t> generate_righttime_message(const std::tm& time);
|
||||
std::vector<uint8_t> generate_righttime_message(const std::tm& time);
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||||
* @param Time1 <20><>ʼʱ<CABC><CAB1>
|
||||
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
|
||||
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<uint8_t> generate_recallevent_message(const std::tm& Time1, const std::tm& Time2, uint8_t eventType = 2, uint8_t monitorPoint = 1);
|
||||
@@ -283,6 +283,37 @@ void ClientContext::clear_stat_cache() {
|
||||
stat_packets_cache_.clear();
|
||||
expected_total_packets_ = 0;
|
||||
}
|
||||
|
||||
bool ClientContext::event_add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets) {
|
||||
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
|
||||
|
||||
// 如果是第一帧,初始化缓存
|
||||
if (current_packet == 1) {
|
||||
event_stat_packets_cache_.clear();
|
||||
event_expected_total_packets_ = total_packets;
|
||||
}
|
||||
|
||||
// 添加到缓存
|
||||
event_stat_packets_cache_.push_back({ current_packet, packet });
|
||||
|
||||
// 检查是否收齐所有帧
|
||||
return (event_stat_packets_cache_.size() >= event_expected_total_packets_);
|
||||
}
|
||||
|
||||
std::vector<ClientContext::StatPacket> ClientContext::event_get_and_clear_stat_packets() {
|
||||
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
|
||||
auto packets = std::move(event_stat_packets_cache_);
|
||||
event_stat_packets_cache_.clear();
|
||||
event_expected_total_packets_ = 0;
|
||||
return packets;
|
||||
}
|
||||
|
||||
void ClientContext::event_clear_stat_cache() {
|
||||
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
|
||||
event_stat_packets_cache_.clear();
|
||||
event_expected_total_packets_ = 0;
|
||||
}
|
||||
|
||||
// 添加浮点数据到缓存
|
||||
bool ClientContext::add_float_data(ushort point_id, int data_type, const tagPqData_Float& float_data) {
|
||||
if (data_type < 0 || data_type > 3) return false;
|
||||
@@ -548,6 +579,7 @@ void on_close(uv_handle_t* handle) {
|
||||
ctx->stop_timers();
|
||||
// 清空缓存
|
||||
ctx->clear_stat_cache();
|
||||
ctx->event_clear_stat_cache();
|
||||
// 清除浮点数据缓存
|
||||
ctx->clear_float_cache();
|
||||
// 装置登录状态调整为离线
|
||||
@@ -1055,6 +1087,52 @@ bool ClientManager::clear_stat_cache(const std::string& identifier) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//保存多帧事件日志报文至缓存区等待收全
|
||||
bool ClientManager::add_eventlog_packet_to_device(const std::string& identifier,
|
||||
const std::vector<unsigned char>& packet,
|
||||
int current_packet,
|
||||
int total_packets) {
|
||||
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->event_add_stat_packet(packet, current_packet, total_packets);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//获取缓存区内所有多帧事件日志报文并清空缓存
|
||||
std::vector<ClientContext::StatPacket> ClientManager::get_and_clear_event_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->event_get_and_clear_stat_packets();
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
//清空所有事件日志缓存区
|
||||
bool ClientManager::clear_event_cache(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) {
|
||||
ctx->event_clear_stat_cache();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取pt和CT变比
|
||||
bool ClientManager::get_pt_ct_ratio(const std::string& identifier,
|
||||
int16_t nCpuNo,
|
||||
@@ -1093,6 +1171,25 @@ bool ClientManager::get_pt_ct_ratio(const std::string& identifier,
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取待补招测点序号
|
||||
bool ClientManager::get_event_lineid(const std::string& identifier,int& nCpuNo) {
|
||||
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) {
|
||||
|
||||
nCpuNo = ctx->event_lineNo;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
std::cerr << "[get_pt_ct_ratio] Device not found: " << identifier << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 添加浮点数据到指定设备的缓存
|
||||
bool ClientManager::add_float_data_to_device(const std::string& identifier,
|
||||
ushort point_id,
|
||||
@@ -1451,6 +1548,43 @@ bool ClientManager::read_devversion_action_to_device(const std::string& identifi
|
||||
}
|
||||
return false; // 设备未找到
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 补招事件日志动作
|
||||
* @param Time1 起始时间
|
||||
* @param Time2 结束时间
|
||||
* @param eventType 事件类型,默认2-暂态事件 4-告警时间
|
||||
* @param monitorPoint 监测点,默认1-监测点1 1-6 对应测点
|
||||
* @return 调用成功或失败的结果
|
||||
*/
|
||||
bool ClientManager::read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,
|
||||
uint8_t eventType, uint8_t monitorPoint) {
|
||||
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->event_lineNo = monitorPoint;
|
||||
// 生成定值描述报文
|
||||
auto packet = generate_recallevent_message(Time1, Time2, eventType, monitorPoint);
|
||||
|
||||
// 添加动作到队列 (状态: 读取文件目录)
|
||||
ctx->add_action(DeviceState::READING_EVENTLOG, packet);
|
||||
|
||||
// 如果当前空闲则立即执行
|
||||
if (ctx->current_state_ == DeviceState::IDLE) {
|
||||
ctx->process_next_action();
|
||||
}
|
||||
|
||||
return true; // 成功添加
|
||||
}
|
||||
}
|
||||
return false; // 设备未找到
|
||||
}
|
||||
|
||||
//获取指定装置测点的电压等级与接线方式
|
||||
bool ClientManager::get_point_scale_and_pttype(const std::string& identifier,
|
||||
ushort nCpuNo,
|
||||
|
||||
@@ -61,6 +61,7 @@ enum class DeviceState {
|
||||
READING_RUNNINGINFORMATION_2,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱִ<CAB1><D6B4>)
|
||||
READING_DEVVERSION, // <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
SET_RIGHTTIME, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
READING_EVENTLOG, // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||
};
|
||||
@@ -123,14 +124,21 @@ public:
|
||||
std::vector<unsigned char> data;
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------------------------------------------------------------------------
|
||||
std::vector<StatPacket> stat_packets_cache_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||
int expected_total_packets_ = 0; // Ԥ<><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
|
||||
std::mutex stat_cache_mutex_; // <20><><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<StatPacket> get_and_clear_stat_packets();//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
void clear_stat_cache();//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------------------------------------
|
||||
ushort event_lineNo = 1; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
|
||||
std::vector<StatPacket> event_stat_packets_cache_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||
int event_expected_total_packets_ = 0; // <20>¼<EFBFBD><C2BC><EFBFBD>־Ԥ<D6BE><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
|
||||
std::mutex event_stat_cache_mutex_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
||||
bool event_add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<StatPacket> event_get_and_clear_stat_packets();//<2F>¼<EFBFBD><C2BC><EFBFBD>־ȡ<D6BE><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
void event_clear_stat_cache();//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
|
||||
// ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
||||
struct PointFloatCache {
|
||||
@@ -296,12 +304,27 @@ public:
|
||||
//<2F><><EFBFBD>ն<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ı<EFBFBD><C4B1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>
|
||||
bool clear_stat_cache(const std::string& identifier);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ȫ
|
||||
bool add_eventlog_packet_to_device(const std::string& identifier,
|
||||
const std::vector<unsigned char>& packet,
|
||||
int current_packet,
|
||||
int total_packets);
|
||||
|
||||
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
std::vector<ClientContext::StatPacket> get_and_clear_event_packets(const std::string& identifier);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool clear_event_cache(const std::string& identifier);
|
||||
|
||||
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT<50><54>CT<43><54><EFBFBD><EFBFBD>ֵ
|
||||
bool get_pt_ct_ratio(const std::string& identifier,
|
||||
int16_t nCpuNo,
|
||||
float& pt_ratio,
|
||||
float& ct_ratio);
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool get_event_lineid(const std::string& identifier, int& nCpuNo);
|
||||
|
||||
// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
size_t client_count() {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -417,6 +440,16 @@ public:
|
||||
|
||||
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
bool read_devversion_action_to_device(const std::string& identifier);
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
||||
* @param Time1 <20><>ʼʱ<CABC><CAB1>
|
||||
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
|
||||
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||
* @return <20><><EFBFBD>óɹ<C3B3><C9B9><EFBFBD>ʧ<EFBFBD>ܵĽ<DCB5><C4BD><EFBFBD>
|
||||
*/
|
||||
bool read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,uint8_t eventType = 2, uint8_t monitorPoint = 1);
|
||||
private:
|
||||
ClientManager() : loop_(nullptr) {}
|
||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
||||
|
||||
@@ -47,6 +47,23 @@ std::string extract_filename(const std::string& path) {
|
||||
return path;
|
||||
}
|
||||
|
||||
//<2F>ļ<EFBFBD>crcУ<63>麯<EFBFBD><E9BAAF>
|
||||
uint16_t crc_16_new(const uint8_t* buf, uint32_t len) {
|
||||
uint16_t crc = 0xffff;
|
||||
for (uint32_t i = 0; i < len; i++) {
|
||||
crc = (uint16_t)(crc ^ buf[i]);
|
||||
for (int j = 0; j < 8; j++) {
|
||||
if (crc & 1) {
|
||||
crc = (uint16_t)((crc >> 1) ^ 0xA001);
|
||||
}
|
||||
else {
|
||||
crc = (uint16_t)(crc >> 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void process_received_message(string mac, string id,const char* data, size_t length) {
|
||||
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -73,7 +90,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
|
||||
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
|
||||
ClientManager::instance().read_devversion_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC>ִ<EFBFBD><D6B4>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ǰ<EFBFBD><C7B0>ȡ<EFBFBD>汾<EFBFBD><E6B1BE>Ϣȷ<CFA2>϶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9>
|
||||
|
||||
ClientManager::instance().add_file_menu_action_to_device(id, "/etcc");
|
||||
//ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
|
||||
//ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ
|
||||
//ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -85,7 +102,24 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
//ClientManager::instance().set_interfixedvalue_action_to_device();װ<><D7B0><EFBFBD><EFBFBD><DEB8>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>ṩ<EFBFBD><E1B9A9>
|
||||
//ClientManager::instance().read_runninginformation_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
|
||||
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1>: 2025<32><35>9<EFBFBD><39>1<EFBFBD><31> 10:30:45
|
||||
//std::tm start_time = {};
|
||||
//start_time.tm_year = 2025 - 1900; // <20><><EFBFBD>ݴ<EFBFBD>1900<30><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
//start_time.tm_mon = 8 - 1; // <20>·ݴ<C2B7>0<EFBFBD><30>ʼ (0=һ<><D2BB>)
|
||||
//start_time.tm_mday = 20;
|
||||
//start_time.tm_hour = 1;
|
||||
//start_time.tm_min = 1;
|
||||
//start_time.tm_sec = 1;
|
||||
|
||||
//// <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ʱ<EFBFBD><CAB1>: 2025<32><35>9<EFBFBD><39>4<EFBFBD><34> 12:15:30
|
||||
//std::tm end_time = {};
|
||||
//end_time.tm_year = 2025 - 1900;
|
||||
//end_time.tm_mon = 8 - 1;
|
||||
//end_time.tm_mday = 25;
|
||||
//end_time.tm_hour = 1;
|
||||
//end_time.tm_min = 1;
|
||||
//end_time.tm_sec = 1;
|
||||
//ClientManager::instance().read_eventlog_action_to_device(id, start_time, end_time,2,1);
|
||||
}
|
||||
if (udata[19] == 0x00) {
|
||||
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
|
||||
@@ -718,6 +752,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else {
|
||||
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
@@ -1758,7 +1793,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer);
|
||||
}
|
||||
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*std::cout << "Device Version Info (" << mac << "):\n"
|
||||
std::cout << "Device Version Info (" << mac << "):\n"
|
||||
<< " Base Model: " << versionInfo.BaseModel << "\n"
|
||||
<< " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n"
|
||||
<< " App Version: " << versionInfo.AppVersion << "\n"
|
||||
@@ -1768,7 +1803,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
<< " Wave File Types: " << versionInfo.WaveFileTypeCount << "\n"
|
||||
<< " Comm Protocols: 0x" << std::hex << versionInfo.CommProtocols << "\n"
|
||||
<< " Time Sync Methods: 0x" << versionInfo.TimeSyncMethods << "\n"
|
||||
<< " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";*/
|
||||
<< " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";
|
||||
|
||||
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
@@ -1803,6 +1838,234 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::READING_EVENTLOG:
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_Event)) {
|
||||
std::cout << "set success" << mac << std::endl;
|
||||
|
||||
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
|
||||
|
||||
if (parser.RecvData.size() >= 14) {
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ֡
|
||||
int current_frame = 0;
|
||||
if (parser.RecvData.size() >= 4) {
|
||||
std::vector<unsigned char> frame_data(parser.RecvData.begin(), parser.RecvData.begin() + 4);
|
||||
std::reverse(frame_data.begin(), frame_data.end()); // <20>ֽڷ<D6BD>ת
|
||||
current_frame = *reinterpret_cast<int*>(frame_data.data());
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1>
|
||||
int total_frames = 0;
|
||||
if (parser.RecvData.size() >= 8) {
|
||||
std::vector<unsigned char> total_frame_data(parser.RecvData.begin() + 4, parser.RecvData.begin() + 8);
|
||||
std::reverse(total_frame_data.begin(), total_frame_data.end()); // <20>ֽڷ<D6BD>ת
|
||||
total_frames = *reinterpret_cast<int*>(total_frame_data.data());
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С
|
||||
int file_size = 0;
|
||||
if (parser.RecvData.size() >= 12) {
|
||||
std::vector<unsigned char> size_data(parser.RecvData.begin() + 8, parser.RecvData.begin() + 12);
|
||||
std::reverse(size_data.begin(), size_data.end()); // <20>ֽڷ<D6BD>ת
|
||||
file_size = *reinterpret_cast<int*>(size_data.data());
|
||||
}
|
||||
|
||||
// <20><>ȡCRCУ<43><D0A3><EFBFBD><EFBFBD>
|
||||
uint16_t crc = 0;
|
||||
if (parser.RecvData.size() >= 14) {
|
||||
std::vector<unsigned char> crc_data(parser.RecvData.begin() + 12, parser.RecvData.begin() + 14);
|
||||
std::reverse(crc_data.begin(), crc_data.end()); // <20>ֽڷ<D6BD>ת
|
||||
crc = *reinterpret_cast<uint16_t*>(crc_data.data());
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<unsigned char> file_data;
|
||||
if (parser.RecvData.size() > 14) {
|
||||
file_data.assign(parser.RecvData.begin() + 14, parser.RecvData.end());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>棨ʹ<E6A3A8><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>READING_STATS<54><53><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
||||
bool complete = ClientManager::instance().add_eventlog_packet_to_device(
|
||||
id, file_data, current_frame, total_frames
|
||||
);
|
||||
std::cout << "event log:" << current_frame << "/" << total_frames << std::endl;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>֡
|
||||
if (complete) {
|
||||
// 1. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
||||
auto packets = ClientManager::instance().get_and_clear_event_packets(id);
|
||||
|
||||
// 2. <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::sort(packets.begin(), packets.end(),
|
||||
[](const ClientContext::StatPacket& a, const ClientContext::StatPacket& b) {
|
||||
return a.packet_index < b.packet_index;
|
||||
});
|
||||
|
||||
// 3. <20><><EFBFBD><EFBFBD>ÿ֡<C3BF><D6A1><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<unsigned char> full_data;
|
||||
|
||||
for (const auto& packet : packets) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
full_data.insert(full_data.end(),
|
||||
packet.data.begin(),
|
||||
packet.data.end());
|
||||
}
|
||||
|
||||
//ȷ<>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int event_lineid = 0;
|
||||
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||
int nPTType;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||
float fPT = 1.0f;
|
||||
float fCT = 1.0f;
|
||||
|
||||
if (!ClientManager::instance().get_event_lineid(id, event_lineid)) {
|
||||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ClientManager::instance().get_point_scale_and_pttype(
|
||||
id,
|
||||
event_lineid,
|
||||
strScale,
|
||||
nPTType) || !ClientManager::instance().get_pt_ct_ratio(id, event_lineid, fPT, fCT)) {
|
||||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>PTCT,<2C><>ѹ<EFBFBD>ȼ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// ========== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>full_data<74>е<EFBFBD>NewTaglogbuffer<65><72><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> ==========
|
||||
std::list<NewTaglogbuffer> eventList;
|
||||
size_t offset = 0;
|
||||
const size_t headSize = sizeof(NewHeadTaglogbuffer);
|
||||
const size_t bodyItemSize = sizeof(NewBodyTaglogbuffer);
|
||||
|
||||
while (offset + headSize <= full_data.size()) {
|
||||
// <20><>ȡͷ<C8A1><CDB7>
|
||||
NewHeadTaglogbuffer head;
|
||||
memcpy(&head, full_data.data() + offset, headSize);
|
||||
head.convertByteOrder(); // ת<><D7AA><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
||||
|
||||
uint32_t logParaNum = head.LogParaNum;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF><EFBFBD><EFBFBD>full_data<74><61>ռ<EFBFBD>õĿռ䣨<D5BC><E4A3A8><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ䣩
|
||||
size_t bodySpace;
|
||||
if (logParaNum <= 4) {
|
||||
bodySpace = 4 * bodyItemSize;
|
||||
}
|
||||
else {
|
||||
bodySpace = logParaNum * bodyItemSize;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
||||
if (offset + headSize + bodySpace > full_data.size()) {
|
||||
std::cerr << "Insufficient data for event body at offset " << offset << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
|
||||
NewTaglogbuffer event;
|
||||
event.head = head;
|
||||
event.bodyList.resize(logParaNum);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF>
|
||||
const uint8_t* bodyData = full_data.data() + offset + headSize;
|
||||
for (uint32_t i = 0; i < logParaNum; ++i) {
|
||||
memcpy(&event.bodyList[i], bodyData, bodyItemSize);
|
||||
event.bodyList[i].convertByteOrder();
|
||||
bodyData += bodyItemSize;
|
||||
}
|
||||
|
||||
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (event.head.name == event_lineid) {
|
||||
eventList.push_back(event);
|
||||
}
|
||||
|
||||
// <20>ƶ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ÿռ䣨<D5BC><E4A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䣩
|
||||
offset += headSize + bodySpace;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>eventList<73>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><F3A3ACBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
||||
std::cout << "Parsed " << eventList.size() << " events from event log." << std::endl;
|
||||
|
||||
std::list<QVVRRecord> recordlist;
|
||||
for (const auto& event : eventList) {
|
||||
|
||||
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;
|
||||
|
||||
recordlist.push_back(record);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//<2F><>ʱ<EFBFBD>Ƴ<EFBFBD>CRCУ<43><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//// ========== <20><><EFBFBD><EFBFBD> CRC <20><>֤ ==========
|
||||
//if (!full_data.empty()) {
|
||||
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> CRC
|
||||
// uint16_t calculated_crc = crc_16_new(full_data.data(), full_data.size());
|
||||
|
||||
// // <20>Ƚϼ<C8BD><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRC <20>ʹӱ<CDB4><D3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> CRC
|
||||
// if (calculated_crc == crc) {
|
||||
// std::cout << "CRC verification passed for event log data." << std::endl;
|
||||
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// }
|
||||
// else {
|
||||
// std::cerr << "CRC verification failed! Expected: " << crc
|
||||
// << ", Calculated: " << calculated_crc << std::endl;
|
||||
// // <20><><EFBFBD><EFBFBD> CRC У<><D0A3>ʧ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
// }
|
||||
//}
|
||||
//else {
|
||||
// //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
||||
// std::cerr << "No data received for event log." << std::endl;
|
||||
//}
|
||||
|
||||
}
|
||||
else {
|
||||
//δ<><CEB4>ȫ<EFBFBD><C8AB>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewNACK)) {
|
||||
std::cout << "set error" << mac << std::endl;
|
||||
|
||||
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
|
||||
|
||||
if (udata[10] == static_cast<unsigned char>(0x0c)) {
|
||||
//0x0c<30><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ڣ<EFBFBD>֪ͨǰ̨<C7B0><CCA8>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬
|
||||
std::cout << "not find event " << mac << std::endl;
|
||||
}
|
||||
else if (udata[10] == static_cast<unsigned char>(0x06)) {
|
||||
//0x0c<30><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨǰ̨<C7B0><CCA8><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
}
|
||||
else {
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD>
|
||||
}
|
||||
// װ<>÷<EFBFBD><C3B7><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־ʧ<D6BE>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else {
|
||||
std::cout << "set unknow error" << mac << std::endl;
|
||||
|
||||
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־ʧ<D6BE>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::CUSTOM_ACTION:
|
||||
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||
|
||||
@@ -158,11 +158,11 @@ void* client_manager_thread(void* arg) {
|
||||
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
|
||||
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
|
||||
};
|
||||
//00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6
|
||||
//00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 00-B7-8D-01-71-09 00-B7-8D-01-88-7f
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||
std::vector<DeviceInfo> devices = {
|
||||
{
|
||||
"D001", "Primary Device", "Model-X", "00-B7-8D-01-79-06",
|
||||
"D001", "Primary Device", "Model-X", "00-B7-8D-01-88-7f",
|
||||
1, points1,true
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user