#include "Inputs.hpp" #include #include #include Inputs::Inputs(std::string node_name){ // Here we doing all the boring stuff FILE* input_file = fopen(INPUTS_FILE, "rb"); char input_file_buffer[JSON_BUFFER_SIZE]; rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); d.ParseStream(is); fclose(input_file); // Init all variables is_sender=d["nodes"][node_name.c_str()]["is_sender"].GetBool(); use_hint=d["nodes"][node_name.c_str()]["use_hint"].GetBool(); data_size=d["nodes"][node_name.c_str()]["data_size"].GetInt(); extended=d["extended"].GetBool(); // Instantiate wake_ts for(auto& v:d["nodes"][node_name.c_str()]["wake_ts"].GetArray()){ wake_ts.push_back(v.GetDouble()); } // Instantiate wake_duration for(auto& v:d["nodes"][node_name.c_str()]["wake_duration"].GetArray()){ wake_duration.push_back(v.GetDouble()); } // Identity check if(wake_ts.size()!=wake_duration.size()){ std::cerr << "Invalid node configuration: wake_ts.size() != wake_duration.size()" <=next_ts){ // Create variable for convenience double start=cur_ts; double end=std::max(cur_ts+cur_duration,next_ts+next_duration); wake_duration[i]=end-start; // Now remove next event wake_ts.erase(wake_ts.begin() + i + 1); wake_duration.erase(wake_duration.begin() + i +1); // This is not optimal. Yet it is simple :D MergeEvents(); } } } double Inputs::GetNextTS(){ // Ensure the caller is smart if(wake_duration.size()<2){ std::cerr << "You are trying to access to the next timestamp but it does not exists" <=ts){ wake_ts.insert(it,ts); break; } pos++; } // Ensure that ts and duration should not go to the end if(pos==wake_ts.size()){ wake_ts.push_back(ts); wake_duration.push_back(duration); } else { // Handle durations here int pos2=0; for(auto it = std::begin(wake_duration); it != std::end(wake_duration); ++it) { if(pos==pos2){ wake_duration.insert(it,duration); break; } else if (it+1==std::end(wake_duration)) { wake_duration.push_back(duration); } pos2++; } } // Don't forget MergeEvents(); } void Inputs::GeneratePlatform(std::string p){ // The boring stuff FILE* input_file = fopen(INPUTS_FILE, "rb"); char input_file_buffer[JSON_BUFFER_SIZE]; rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); rapidjson::Document d; d.ParseStream(is); fclose(input_file); // Write platform file std::ofstream pf; pf.open (p); pf << "\n"; pf << "\n"; pf << "\n \n"; pf << " \n"; for (Value::ConstMemberIterator itr = d["nodes"].MemberBegin(); itr != d["nodes"].MemberEnd(); ++itr) { std::string name=itr->name.GetString(); double power_on=d["nodes"][itr->name.GetString()]["power_on"].GetDouble(); double power_off=d["nodes"][itr->name.GetString()]["power_off"].GetDouble(); // Create node pf << " \n"; pf << " \n"; pf << " \n \n"; pf << " \n"; } pf << " \n\n"; pf.close(); }