From e4ad47e0e230b41894fb0de2f00c888a08a01363 Mon Sep 17 00:00:00 2001 From: pandx Date: Tue, 1 Apr 2025 11:48:59 +0800 Subject: [PATCH] add wave retransfer schedule. --- .settings/language.settings.xml | 4 +- jsonparse/cmt_parse.cpp | 2 +- scheduler/schedule.cpp | 74 ++++++++++++++++++++++++++++++--- scheduler/schedule.hpp | 6 +++ 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 9f396fc..a813cfe 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/jsonparse/cmt_parse.cpp b/jsonparse/cmt_parse.cpp index 496e426..e399081 100644 --- a/jsonparse/cmt_parse.cpp +++ b/jsonparse/cmt_parse.cpp @@ -571,7 +571,7 @@ void JsonData::CmtCmd_87(char* MeasurementID,char* send_data,int& send_length) get_eigenvalue_res[j].Phase4 = atof(arrRes[j][15].c_str()); get_eigenvalue_res[j].Time = atoi(arrRes[j][17].c_str()); } - memcpy(send_data,(char*)&get_eigenvalue_res,sizeof(GetEigenvalueRes) * j); + memcpy(send_data,(char*)get_eigenvalue_res,sizeof(GetEigenvalueRes) * j); send_length = sizeof(GetEigenvalueRes) * j; } } diff --git a/scheduler/schedule.cpp b/scheduler/schedule.cpp index f96df0b..b48aec1 100644 --- a/scheduler/schedule.cpp +++ b/scheduler/schedule.cpp @@ -35,12 +35,16 @@ int SensorScheduler::StartSchedule(int short_addr, int &next_duration) { nth_eigen_value_slice_ = seconds_in_current_wave_slice_ / eigen_value_send_interval_; seconds_in_current_eigen_slice_ = seconds_in_current_wave_slice_ % eigen_value_send_interval_; ts_in_eigen_slice_ = false; + if (seconds_in_current_eigen_slice_ < eigen_value_slice_total_seconds_ - 3) { ts_in_eigen_slice_ = true; - } + } if (ts_in_eigen_slice_) { nth_eigen_slice_ = (seconds_in_current_eigen_slice_ + 2) / eigen_value_send_duration_; + if (nth_eigen_value_slice_ == 0 && nth_eigen_slice_ == 0) { + ClearFailureSuccessMap(); + } } else { nth_wave_slice_ = (seconds_in_current_eigen_slice_ - eigen_value_slice_total_seconds_ + 3) / seconds_per_wave_slice_; } @@ -135,9 +139,18 @@ int SensorScheduler::StartSchedule(int short_addr, int &next_duration) { } } - // if (retransfer_wave) { - - // } + if (RetransferWave(short_addr)) { + wave_feature_set_inst::instance().GetWaveCfg(short_addr, g_x, g_y, g_z); + if (g_x || g_y || g_z) { + zlog_warn(zct, "[%d:%x] it is retransfer wave time", id, short_addr); + current_request_ = kScheduleWaveForm; + return kScheduleWaveForm; + } else { + next_duration = GetNextDuration(short_addr); + zlog_warn(zct, "[%d:%x] no need for wave", id, short_addr); + return kScheduleWrongTime; + } + } // if (update_.count(id)) { // // execute config // zlog_warn(zct, "[%d:%x] in idle time to update config", id, short_addr); @@ -199,7 +212,24 @@ long SensorScheduler::CalcNextTimestamp(int id, uint16_t short_addr) { } } } - } + } else { + if (g_x || g_y || g_z) { + if (RetransferWave(short_addr)) { + for (int i = 0; i < wave_slice_num_per_eigen_interval_; ++i) { + if (slice_sensor_id_[i+forward_wave_slice_num] == 0) { + // 判断此空闲位置是否被占用 + long current_wave_slice_ts = current_wave_start_ts_ + nth_eigen_value_slice_ * eigen_value_send_interval_ + eigen_value_slice_total_seconds_ + i * seconds_per_wave_slice_; + if (free_slice_ocuppied_.count(current_wave_slice_ts) == 0) { + available_ts = current_wave_slice_ts; + free_slice_ocuppied_.insert(available_ts); + zlog_warn(zct, "[Nxt][%d:%x] %d nth free wave slice will be used to retransfer wave, utc time:[%s]", id, short_addr, i+forward_wave_slice_num, GetUTCTime(available_ts).c_str()); + break; + } + } + } + } + } + } if (send_wave_ts > 0 && available_ts > 0) { long min_ts = std::min(send_wave_ts, available_ts); zlog_warn(zct, "[Nxt] [%d:%x] next feature send utc time1:%s", id, short_addr, GetUTCTime(min_ts).c_str()); @@ -329,14 +359,46 @@ SensorScheduler::SensorScheduler() { } void SensorScheduler::WaveError(int short_addr) { - + auto iter = failure_map_.find(short_addr); + if (iter == failure_map_.end()) { + failure_map_[short_addr] = 3; // 重试次数 + zlog_warn(zct, "[WaveError][%x] will try 3 times", short_addr); + return; + } + if (iter->second == 0) { + zlog_warn(zct, "[WaveError][%x] no try times"); + failure_map_.erase(short_addr); + return; + } + iter->second = iter->second - 1; + zlog_warn(zct, "[WaveError][%x] remain try %d times", short_addr, iter->second); return; } +bool SensorScheduler::RetransferWave(uint16_t short_addr) { + auto iter = failure_map_.find(short_addr); + if (iter != failure_map_.end()) { + return true; + } + return false; +} + void SensorScheduler::WaveSuccess(int short_addr) { + success_map_[short_addr] = 1; + auto iter = failure_map_.find(short_addr); + if (iter != failure_map_.end()) { + zlog_warn(zct, "[WaveSuccess][%x] try %d times success", short_addr, 4 - iter->second); + failure_map_.erase(short_addr); + return; + } return; } +void SensorScheduler::ClearFailureSuccessMap() { + failure_map_.clear(); + success_map_.clear(); +} + long SensorScheduler::GetBaseTimestamp(int short_addr) { int id = 0; auto iter = short_addr_map_.find(short_addr); diff --git a/scheduler/schedule.hpp b/scheduler/schedule.hpp index 2ce1529..fbe893c 100644 --- a/scheduler/schedule.hpp +++ b/scheduler/schedule.hpp @@ -126,6 +126,12 @@ private: std::map sensor_id_nth_slice_; // 传感器编号与第几个波形发送窗口对应关系 std::map short_addr_map_; // base_relation.json + // 存储当前2小时内失败与成功的传感器 + std::map failure_map_; + std::map success_map_; + void ClearFailureSuccessMap(); + bool RetransferWave(uint16_t short_addr); + // 空闲时间戳被占用 std::unordered_set free_slice_ocuppied_;