Files
AireOptoSifAndSpectral/othersoft/TemperatureControler/src/Temperature/TemperatureRegulator.cpp
2025-11-04 17:19:32 +08:00

476 lines
15 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("")) {
// 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"];
// }
// }
// }
/*
* "Pin": {
"COOLER": {
"Pin": 24
},
"Fan": {
"Pin_H": 3,
"Pin_L": 2
},
"HOT": {
"Pin": 19
},
"WINDOWS": {
"Pin_H": 7,
"Pin_L": 10,
"WaitTime": 40
}
},
*/
int Cooler_Pin_EN=24;
int Fan_Pin_H=3;
int Fan_Pin_L=2;
int Hot_Pin_EN=19;
int Windows_Pin_H=7;
int Windows_Pin_L=10;
int Windows_WaitTime=40;
if (jconfig.contains("Pin")) {
if (jconfig["Pin"].contains("COOLER")) {
if (jconfig["Pin"]["COOLER"].contains("Pin")) {
Cooler_Pin_EN=jconfig["Pin"]["COOLER"]["Pin"];
}
}
if (jconfig["Pin"].contains("Fan")) {
if (jconfig["Pin"]["Fan"].contains("Pin_H")) {
Fan_Pin_H=jconfig["Pin"]["Fan"]["Pin_H"];
}
if (jconfig["Pin"]["Fan"].contains("Pin_L")) {
Fan_Pin_L=jconfig["Pin"]["Fan"]["Pin_L"];
}
}
if (jconfig["Pin"].contains("HOT")) {
if (jconfig["Pin"]["HOT"].contains("Pin")) {
Hot_Pin_EN=jconfig["Pin"]["HOT"]["Pin"];
}
}
if (jconfig["Pin"].contains("WINDOWS")) {
if (jconfig["Pin"]["WINDOWS"].contains("Pin_H")) {
Windows_Pin_H=jconfig["Pin"]["WINDOWS"]["Pin_H"];
}
if (jconfig["Pin"]["WINDOWS"].contains("Pin_L")) {
Windows_Pin_L=jconfig["Pin"]["WINDOWS"]["Pin_L"];
}
if (jconfig["Pin"]["WINDOWS"].contains("WaitTime")) {
Windows_WaitTime=jconfig["Pin"]["WINDOWS"]["WaitTime"];
}
}
}
m_TG_Manager=new TG_Manager();
m_TG_Manager->SetPin_V2(Windows_Pin_H,Windows_Pin_L,Cooler_Pin_EN,Hot_Pin_EN,Fan_Pin_H,Fan_Pin_L);
// 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() {
}
int timesforlog=0;
void TemperatureRegulator::loopsample() {
if (!isinit) return;
m_TemperaTureWoker->ReadTempreature();
// todo <20><>savedata<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼temperature
QString datastr="";
for (int i = 0; i < m_TemperaTureWoker->m_Tempreaturegroups.size(); ++i) {
for (int j = 0; j < 8; ++j) {
datastr+=QString::number(m_TemperaTureWoker->m_Tempreaturegroups[i].tempera[j])+",";
}
}
saveDataToFile("Tempratrue",datastr);
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;
if (timesforlog%60==0) {
logout("Temp","now minute of day is "+QString::number(nowminuteofday)+
" sunrise minute is "+QString::number(sunrise_minte)+
" sunset minute is "+QString::number(sunset_minte),6);
}
timesforlog++ ;
//<2F>ų<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB>Сʱ
if (nowminuteofday>60) {
if (last_time_in_today_minute<sunrise_minte&&nowminuteofday>=sunrise_minte&&nowminuteofday<sunset_minte) {
//sunrise happened
logout("Temp","sunrise happened",6);
m_TG_Manager->Windows_Close();
// m_TG_Manager->Stop();
}
if (last_time_in_today_minute<sunset_minte&&nowminuteofday>=sunset_minte) {
//sunset happened
logout("Temp","sunset happened",6);
m_TG_Manager->Windows_Open();
// m_TG_Manager->Stop();
}
}
last_time_in_today_minute=nowminuteofday;
};
void TemperatureRegulator::loop(){
if (!isinit) return;
m_TemperaTureWoker->ReadTempreature();
// todo <20><>savedata<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼temperature
QString datastr="";
for (int i = 0; i < m_TemperaTureWoker->m_Tempreaturegroups.size(); ++i) {
for (int j = 0; j < 8; ++j) {
datastr+=QString::number(m_TemperaTureWoker->m_Tempreaturegroups[i].tempera[j])+",";
}
}
saveDataToFile("Tempratrue",datastr);
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(true);
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(true);
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(true);
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(true);
}
else if (tempreture<M_Targert_Min_Tempreature)
{
m_TG_Manager->Heating(true);
}
else
{
m_TG_Manager->Stop();
}
}
bool TemperatureRegulator::looptask() {
g_tempretureRegulator->loopsample();
}