#ifndef SCHEDULE_HPP_ #define SCHEDULE_HPP_ #include #include #include #include #include #include #define SCHEDULE_CONFIG "./schedule_test.json" #define BASE_RELATION "./base_relation.json" #define CONFIG_UPDATE "./config_update.json" #define UPGRADE_CONFIG "./upgrade.json" typedef enum { kScheduleResultNone = 0, kScheduleUnknownSensor = 1, kScheduleConfigSensor = 2, kScheduleEigenValue = 3, kScheduleWaveForm = 4, kScheduleUpgrade = 5, kScheduleWrongTime = 6 } ScheduleResult; typedef struct { int try_times; std::string sensor_type; int hw_version; std::string current_sw_version; std::string upgrade_sw_version; std::string submit_time; std::vector try_world_time1; } UpgradeInfo; class SensorScheduler { public: SensorScheduler(); int Init(); int StartSchedule(int pan_id, int &next_duration); long CalcNextTimestamp(int id); int Config(int eigen_value_send_interval, int wave_form_send_interval, int eigen_value_send_duration, int wave_form_send_duration, int max_sensor_num); int CalcAvailableSlice(int eigen_value_send_interval, int wave_form_send_interval, int eigen_value_send_duration, int wave_form_send_duration, int max_sensor_num, int &available_slice, int &free_slice); void GetSensorTs(int pan_id, long &eigen_ts, long &wave_ts); // ======schedule.json操作开始====== // 无线网关程序重启时 // void ReadScheduleCfg(); // 配置完成后 int WriteScheduleCfg(long &ts, std::string &world_time); // 当系统进行校时时,修改时间戳信息, "slices"字段 void ModifyScheduleTs(long start_ts); // 当接入传感器时,设置为不可修改; 当停用所有传感器后,修改为可修改 void AdjustSupportModification(bool support_modification); // ======schedule.json操作结束====== long GetLocalTs(); long GetLocalWorldTime(std::string &world_time); std::string GetUTCTime(long ts); int GetAvailableId(int pan_id); private: // user config int eigen_value_send_interval_; int eigen_value_send_duration_; int wave_form_send_interval_; int wave_form_send_duration_; int max_sensor_num_; // calc result long start_timestamp_; std::string start_ts_str_; int available_slice_; int free_slice_; int wave_slice_num_per_eigen_interval_; // 每个特征值窗口中有几个波形发送窗口 int seconds_per_wave_slice_; // 波形窗口时长 int eigen_value_slice_total_seconds_; // 特征值窗口总时长 std::vector slice_sensor_id_; // 每个时间窗是哪个传感器使用的 bool support_modification_; std::map sensor_id_nth_slice_; // 传感器编号与第几个波形发送窗口对应关系 std::map short_addr_map_; // base_relation.json // 空闲时间戳被占用 std::unordered_set free_slice_ocuppied_; // sensor config update std::unordered_set update_; // sensor upgrade std::map upgrade_; // temp variables long current_ts_; // 当前时间戳 long current_wave_start_ts_; // 当前所在的波形发送间隔的开始时间戳 long nth_wave_start_slice_; // 第几个波形发送窗口 long seconds_in_current_wave_slice_; // 时间戳相对波形开始时间戳的秒数 int nth_eigen_value_slice_; // 第几个特征值发送窗口 int seconds_in_current_eigen_slice_; // 相对特征值发送间隔的秒数 bool ts_in_eigen_slice_; // 时间位于特征值发送窗口中 int nth_eigen_slice_; // 如果ts_in_eigen_slice_是真的话,此值表明是第几个特征值窗口 bool nth_wave_slice_; // 如果ts_in_eigen_slice_是假的话,此值表明是第几个波形窗口 int current_request_; }; typedef boost::container::dtl::singleton_default scheduler; #endif // SCHEDULE_HPP_