add wave retransfer schedule.
This commit is contained in:
parent
86da196047
commit
e4ad47e0e2
@ -5,7 +5,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1289772839912558009" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1102353172776392420" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1289773380490434009" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1102351351620288196" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|||||||
@ -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].Phase4 = atof(arrRes[j][15].c_str());
|
||||||
get_eigenvalue_res[j].Time = atoi(arrRes[j][17].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;
|
send_length = sizeof(GetEigenvalueRes) * j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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_;
|
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_;
|
seconds_in_current_eigen_slice_ = seconds_in_current_wave_slice_ % eigen_value_send_interval_;
|
||||||
ts_in_eigen_slice_ = false;
|
ts_in_eigen_slice_ = false;
|
||||||
|
|
||||||
if (seconds_in_current_eigen_slice_ < eigen_value_slice_total_seconds_ - 3) {
|
if (seconds_in_current_eigen_slice_ < eigen_value_slice_total_seconds_ - 3) {
|
||||||
ts_in_eigen_slice_ = true;
|
ts_in_eigen_slice_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts_in_eigen_slice_) {
|
if (ts_in_eigen_slice_) {
|
||||||
nth_eigen_slice_ = (seconds_in_current_eigen_slice_ + 2) / eigen_value_send_duration_;
|
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 {
|
} else {
|
||||||
nth_wave_slice_ = (seconds_in_current_eigen_slice_ - eigen_value_slice_total_seconds_ + 3) / seconds_per_wave_slice_;
|
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)) {
|
// if (update_.count(id)) {
|
||||||
// // execute config
|
// // execute config
|
||||||
// zlog_warn(zct, "[%d:%x] in idle time to update config", id, short_addr);
|
// 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) {
|
if (send_wave_ts > 0 && available_ts > 0) {
|
||||||
long min_ts = std::min(send_wave_ts, available_ts);
|
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());
|
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) {
|
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;
|
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) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SensorScheduler::ClearFailureSuccessMap() {
|
||||||
|
failure_map_.clear();
|
||||||
|
success_map_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
long SensorScheduler::GetBaseTimestamp(int short_addr) {
|
long SensorScheduler::GetBaseTimestamp(int short_addr) {
|
||||||
int id = 0;
|
int id = 0;
|
||||||
auto iter = short_addr_map_.find(short_addr);
|
auto iter = short_addr_map_.find(short_addr);
|
||||||
|
|||||||
@ -126,6 +126,12 @@ private:
|
|||||||
std::map<int, int> sensor_id_nth_slice_; // 传感器编号与第几个波形发送窗口对应关系
|
std::map<int, int> sensor_id_nth_slice_; // 传感器编号与第几个波形发送窗口对应关系
|
||||||
std::map<uint16_t, int> short_addr_map_; // base_relation.json
|
std::map<uint16_t, int> short_addr_map_; // base_relation.json
|
||||||
|
|
||||||
|
// 存储当前2小时内失败与成功的传感器
|
||||||
|
std::map<uint16_t, int> failure_map_;
|
||||||
|
std::map<uint16_t, int> success_map_;
|
||||||
|
void ClearFailureSuccessMap();
|
||||||
|
bool RetransferWave(uint16_t short_addr);
|
||||||
|
|
||||||
// 空闲时间戳被占用
|
// 空闲时间戳被占用
|
||||||
std::unordered_set<long> free_slice_ocuppied_;
|
std::unordered_set<long> free_slice_ocuppied_;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user