Files
AireOptoSifAndSpectral/othersoft/TemperatureControler/src/Temperature/TemperatureRegulator.cpp

359 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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<bool>();
}
}
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) {
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
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]<min) {
min=m_TemperaTureWoker->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]<min) {
min=m_TemperaTureWoker->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 <20><>savedata<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼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;
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>죨ǰ<ECA3A8><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>15<31><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (nowminuteofday>sunrise_minte+15&&nowminuteofday<sunset_minte-15) //<2F><><EFBFBD><EFBFBD>
{
if (m_IsCoolInDaylight) {
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD>m_CoolBegin_Diff_Temp <20>ҵ<EFBFBD>ǰinsight<68>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><E8B6A8>ʼֵ <20><><EFBFBD>Կ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
//<2F><>һ<EFBFBD><D2BB> <20><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float maxinsighttemp=GetMax_of_Vector(INSIGHT_TEMPERATURE);
//<2F>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ȡ<EFBFBD>ⲿ<EFBFBD><E2B2BF>С<EFBFBD><EFBFBD>
float minoutsighttemp=GetMin_of_Vector(OUTSIGHT_TEMPERATURE);
// <20><><EFBFBD><EFBFBD>diff
float diff=maxinsighttemp-minoutsighttemp;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>ֵ
if (diff>m_CoolBegin_Diff_Temp) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰinsight<68>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><E8B6A8>ʼֵ
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);
}
}
//<2F><><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>¶ȸ<C2B6><C8B8>ڿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ˵<><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƴ<EFBFBD>
if (m_CoolBegin_Temp_Insight<m_HeatingBegin_Temp_Insight)
{
logout("Temp","CoolBegin_Temp_Insight is less than HeatingBegin_Temp_Insight",6);
return;
}
//<2F><><EFBFBD><EFBFBD>ֻ<EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>¶ȵ<C2B6><C8B5><EFBFBD>m_HeatingBeginTemp_Insight <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
//<2F><>һ<EFBFBD><D2BB> <20><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>С<EFBFBD><EFBFBD>
float mininsighttemp=GetMin_of_Vector(INSIGHT_TEMPERATURE);
//<2F>ڶ<EFBFBD><DAB6><EFBFBD> <20><>m_HeatingBeginTemp_Insight<68>Ƚ<EFBFBD>
if (mininsighttemp<m_HeatingBegin_Temp_Insight)
{
m_TG_Manager->Heating();
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 //ҹ<><D2B9>
{
//ҹ<><D2B9>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD> <20><>ֻҪ<D6BB>ⲿ<EFBFBD>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>¶ȼ<C2B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><>һ<EFBFBD><D2BB> <20><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float maxinsighttemp=GetMax_of_Vector(INSIGHT_TEMPERATURE);
//<2F>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ȡ<EFBFBD>ⲿ<EFBFBD><E2B2BF>С<EFBFBD><EFBFBD>
float minoutsighttemp=GetMin_of_Vector(OUTSIGHT_TEMPERATURE);
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
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 (tempreture<M_Targert_Min_Tempreature)
{
m_TG_Manager->Heating();
}
else
{
m_TG_Manager->Stop();
}
}
bool TemperatureRegulator::looptask() {
g_tempretureRegulator->loop();
}