// // Created by xin on 25-4-2. // #include "TemperatureRegulator.h" #include "logout.h" #include "sunupanddown.h" TemperatureRegulator *g_tempretureRegulator; TemperatureRegulator::TemperatureRegulator(){ g_tempretureRegulator=this; } /* "PortName": "ttyS2", "BaudRate": 115200, "Pin": { "TG": { "Pin_H": 2, "Pin_L": 3 }, "Fan": { "Pin": 10 }, "HOT": { "Pin": 7 } }, "Constant_Temperature": { "CoolBegin_Temp_Insight": 20, "CoolBegin_Diff_Temp": 5, "HeatingBegin_Temp_Insight": 0, "IsCoolInDaylight": false }, "Location": { "latitude": 0, "longitude": 0 }, "IndexInfo": { "Insight": [{"x":7,"y":1},{"x":8,"y":1}], "Outside": [{"x":1,"y":1},{"x":2,"y":1}] } **/ void TemperatureRegulator::setconfig(json jconfig) { QString Port_Name="ttyS2"; int BaudRate=115200; if (jconfig.contains("PortName")) { Port_Name=QString::fromStdString(jconfig["PortName"]); } if (jconfig.contains("BaudRate")) { BaudRate=jconfig["BaudRate"]; } m_TemperaTureWoker=new TemperaTureWoker(); m_TemperaTureWoker->OpenCom(Port_Name,BaudRate); int pin1_H=7; int pin1_L=10; int pin2_H=2; int pin2_L=4; if (jconfig.contains("Pin")) { if (jconfig["Pin"].contains("TG")) { if (jconfig["Pin"]["TG"].contains("Pin_H")) { pin1_H=jconfig["Pin"]["TG"]["Pin_H"]; } if (jconfig["Pin"]["TG"].contains("Pin_L")) { pin1_L=jconfig["Pin"]["TG"]["Pin_L"]; } } if (jconfig["Pin"].contains("Fan")) { if (jconfig["Pin"]["Fan"].contains("Pin")) { pin2_H=jconfig["Pin"]["Fan"]["Pin"]; } } if (jconfig["Pin"].contains("HOT")) { if (jconfig["Pin"]["HOT"].contains("Pin")) { pin2_L=jconfig["Pin"]["HOT"]["Pin"]; } } } m_TG_Manager=new TG_Manager(); m_TG_Manager->SetPin(pin1_H,pin1_L,pin2_H,pin2_L); if (jconfig.contains("Constant_Temperature")) { if (jconfig["Constant_Temperature"].contains("CoolBegin_Temp_Insight")) { m_CoolBegin_Temp_Insight=jconfig["Constant_Temperature"]["CoolBegin_Temp_Insight"]; } if (jconfig["Constant_Temperature"].contains("CoolBegin_Diff_Temp")) { m_CoolBegin_Diff_Temp=jconfig["Constant_Temperature"]["CoolBegin_Diff_Temp"]; } if (jconfig["Constant_Temperature"].contains("HeatingBegin_Temp_Insight")) { m_HeatingBegin_Temp_Insight=jconfig["Constant_Temperature"]["HeatingBegin_Temp_Insight"]; } if (jconfig["Constant_Temperature"].contains("IsCoolInDaylight")) { m_IsCoolInDaylight=jconfig["Constant_Temperature"]["IsCoolInDaylight"].get(); } } if (jconfig.contains("Location")) { if (jconfig["Location"].contains("latitude")) { m_Latitude=jconfig["Location"]["latitude"]; } if (jconfig["Location"].contains("longitude")) { m_Longitude=jconfig["Location"]["longitude"]; } } if (jconfig.contains("IndexInfo")) { if (jconfig["IndexInfo"].contains("Insight")) { for (int i = 0; i < jconfig["IndexInfo"]["Insight"].size(); ++i) { int x=jconfig["IndexInfo"]["Insight"][i]["x"]; int y=jconfig["IndexInfo"]["Insight"][i]["y"]; addTargetIndex(x,y,INSIGHT_TEMPERATURE); } } if (jconfig["IndexInfo"].contains("Outside")) { for (int i = 0; i < jconfig["IndexInfo"]["Outside"].size(); ++i) { int x=jconfig["IndexInfo"]["Outside"][i]["x"]; int y=jconfig["IndexInfo"]["Outside"][i]["y"]; addTargetIndex(x,y,OUTSIGHT_TEMPERATURE); } } } isinit=true; } void TemperatureRegulator::SetTartGetX_Y(int x,int y){ m_target_index=x; m_target_indey=y; } void TemperatureRegulator::addTargetIndex(int x, int y,int Data_type) { //判断数据有效性 if (x<0||y<0) { logout("TemperatureRegulator","addTargetIndex error little than 0",6); return; } if (x>7||y>7) { logout("TemperatureRegulator","addTargetIndex error Big",6); return; } switch (Data_type) { case INSIGHT_TEMPERATURE: { m_target_index_of_insight.push_back({x-1,y-1}); break; } case OUTSIGHT_TEMPERATURE: { m_target_index_of_outsight.push_back({x-1,y-1}); break; } default: { break; } } } float TemperatureRegulator::GetMax_of_Vector(int Data_type) { switch (Data_type) { case INSIGHT_TEMPERATURE: { float max=0; for (int i = 0; i < m_target_index_of_insight.size(); ++i) { int x=m_target_index_of_insight[i].x; int y=m_target_index_of_insight[i].y; if (m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]>max) { max=m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]; } } return max; } case OUTSIGHT_TEMPERATURE: { float max=0; for (int i = 0; i < m_target_index_of_outsight.size(); ++i) { int x=m_target_index_of_outsight[i].x; int y=m_target_index_of_outsight[i].y; if (m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]>max) { max=m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]; } } return max; } default: { return 0; } } } float TemperatureRegulator::GetMin_of_Vector(int Data_type) { switch (Data_type) { case INSIGHT_TEMPERATURE: { float min=100; for (int i = 0; i < m_target_index_of_insight.size(); ++i) { int x=m_target_index_of_insight[i].x; int y=m_target_index_of_insight[i].y; if (m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]m_Tempreaturegroups[y].tempera[x]; } } return min; } case OUTSIGHT_TEMPERATURE: { float min=100; for (int i = 0; i < m_target_index_of_outsight.size(); ++i) { int x=m_target_index_of_outsight[i].x; int y=m_target_index_of_outsight[i].y; if (m_TemperaTureWoker->m_Tempreaturegroups[y].tempera[x]m_Tempreaturegroups[y].tempera[x]; } } return min; } default: { return 0; } } } void TemperatureRegulator::init(){ } void TemperatureRegulator::PanduanCooling() { } void TemperatureRegulator::loop(){ if (!isinit) return; m_TemperaTureWoker->ReadTempreature(); // todo 用savedata函数记录temperature QDateTime currentTime=QDateTime::currentDateTime(); int year=currentTime.date().year(); int month=currentTime.date().month(); int day=currentTime.date().day(); int nowhour=currentTime.time().hour(); int nowminute=currentTime.time().minute(); long nowminuteofday=nowhour*60+nowminute; SunInfo sunInfo=calculateSunriseSunset(year,month,day,m_Latitude,m_Longitude); float sunrise_minte=sunInfo.sunrise_h*60+sunInfo.sunrise_m; float sunset_minte=sunInfo.sunset_h*60+sunInfo.sunset_m; //如果时白天(前后个加15分钟误差) if (nowminuteofday>sunrise_minte+15&&nowminuteofdaym_CoolBegin_Diff_Temp) { // 如果当前insight温度大于设定起始值 if (maxinsighttemp>m_CoolBegin_Temp_Insight) { m_TG_Manager->Cooling(); logout("Temp","current max insight temp is "+QString::number(maxinsighttemp),6); } else { m_TG_Manager->Stop(); logout("Temp","current max insight temp is "+QString::number(maxinsighttemp),6); } } else { m_TG_Manager->Stop(); logout("Temp","current diff is "+QString::number(diff),6); } } //如果 开始加热温度高于开始降温温度 说明参数设置有问题 推出 if (m_CoolBegin_Temp_InsightHeating(); logout("Temp","current min insight temp is "+QString::number(mininsighttemp),6); } else { m_TG_Manager->Stop(); logout("Temp","current min insight temp is "+QString::number(mininsighttemp),6); } } else //夜晚 { //夜间只降温 且只要外部温度大于内部温度即降温 //第一步 获取内部最大温度 float maxinsighttemp=GetMax_of_Vector(INSIGHT_TEMPERATURE); //第二步 获取外部最小温度 float minoutsighttemp=GetMin_of_Vector(OUTSIGHT_TEMPERATURE); // 如果外部温度小于内部温度 if (maxinsighttemp>minoutsighttemp) { m_TG_Manager->Cooling(); logout("Temp","current max insight temp is "+QString::number(maxinsighttemp),6); } else { m_TG_Manager->Stop(); logout("Temp","current max insight temp is "+QString::number(maxinsighttemp),6); } } return; float tempreture=m_TemperaTureWoker->m_Tempreaturegroups[m_target_index].tempera[m_target_indey]; //printf("current tempreture is %f\n",tempreture); logout("Temp","current tempreture is "+QString::number(tempreture),6); // qDebug()<< "current tempreture is " << tempreture; if (tempreture>M_Targert_Max_Tempreature) { m_TG_Manager->Cooling(); } else if (tempretureHeating(); } else { m_TG_Manager->Stop(); } } bool TemperatureRegulator::looptask() { g_tempretureRegulator->loop(); }