JZ_TempControl.c 8.5 KB
/* Includes ------------------------------------------------------------------*/
#include "JZ_TempControl.h"
#include "JZ_lamp.h"
#include "JZ_widget.h"
/* Private constants ---------------------------------------------------------*/

/* Private types -------------------------------------------------------------*/

/* Private values -------------------------------------------------------------*/
TempControlData *tempData;//存放温度、亮度数据
int InitialLumen;//最初亮度
int tempControlFlag = TEMP_NOTTRIGGER;//判断当前温度是否执行过温控
int light_mode = LIGHT_OFF; //探照灯模式
int tempMax = 70;//限制温度
int Initialflag = DEFAULT_STATUS;

/* Private functions declaration ---------------------------------------------*/

/* Exported functions definition ---------------------------------------------*/

/************************************
*温度控制线程
*函数名:TempControl_Task
*函数参数:
          
*返回值:
*函数作者:wzy
*************************************/
static void* TempControl_Task(void *arg)
{  
    int OutTime;//输出的调控时间
   
   while (1)
   {   
        Jz_LampTempControl(tempData->InputTemp,tempData->InputLumen,&InitialLumen,&OutTime,&tempData->OutLumen);
        // printf("触发调控,输入温度%d,输入亮度%d,设置亮度%d,调控时间%d\n",tempData->InputTemp,tempData->InputLumen,InitialLumen,OutTime);
        if(OutTime > 0)
        {  
        tempControlFlag = TEMP_TRIGGER;
        printf("触发调控,输入温度%d,输入亮度%d,设置亮度%d,调控时间%d\n",tempData->InputTemp,tempData->InputLumen,InitialLumen,OutTime);
        usleep(OutTime*1000);     
        }
        else
        {
        usleep(1*1000);
        }  
        OutTime = 0;    
    
   }
   
}
/************************************
*温度控制任务创建
*函数名:TempControl_Task
*函数参数:
          @serFd:串口文件描述符
*返回值:
*函数作者:wzy
*************************************/
int Jz_TempControlTaskCreate(void)
{ 
    //需确保拿到亮度数据后再开启任务
  usleep(1000*1000);
  pthread_t pthread;
  pthread_attr_t pthread_attr;
 
  pthread_attr_init(&pthread_attr);
  pthread_attr_setdetachstate(&pthread_attr, PTHREAD_CREATE_DETACHED);    //设置线程分离属性

  int ret = pthread_create(&pthread,&pthread_attr,TempControl_Task,NULL);
  if(ret !=0)
  {
    printf("线程创建失败\n");
    return -1;
  }
 
   pthread_t pthread1;
   
  ret = pthread_create(&pthread1,&pthread_attr,TempControl_TempChangeTask,NULL);
  if(ret !=0)
  {
    printf("线程创建失败\n");
    return -1;
  }
 
  return 0;
}

/************************************
*温度调控
*函数名:LampTempControl
*函数参数:
           @InputTemp:当前温度
           @InputLumen: 当前亮度
           @InitialLumen: 当前设置的亮度
           @OutTime: 调控时间
           @OutLumen: 调控后亮度
*返回值:
*函数作者:wzy
*************************************/
int Jz_LampTempControl(float InputTemp, int InputLumen,int *InitialLumen,int *OutTime,int *OutLumen)
{
  
   int ControlFlag = DEFAULT_STATUS; //无变化为0, 升温为1,降温为2  
  
   //限制温度高于当前温度
   if(tempMax >= InputTemp)
  {
     if(*InitialLumen > InputLumen) //输入亮度低于设置的初始亮度
    {
        *OutTime = Jz_LampGetTempControlTime(tempMax - InputTemp);
        ControlFlag = LUMEN_UP;//亮度提高
    }
    else//输入亮度已达到设置的亮度,无需操作
    {
       *OutTime = 0;
       *OutLumen = InputLumen;
       ControlFlag = DEFAULT_STATUS;
       return 0;
    }
  }
  else if(tempMax < InputTemp)//限制温度低于当前温度
  { 
    *OutTime = Jz_LampGetTempControlTime(InputTemp - tempMax);
     ControlFlag = LUMEN_DOWN;//亮度降低
      
  }
 
  //改变输出亮度,在输入亮度基础上
    switch (ControlFlag)
    {
    case LUMEN_UP: 
         *OutLumen = InputLumen + 1;
         Initialflag = LUMEN_UP;
         break;
    case LUMEN_DOWN:
        *OutLumen = InputLumen - 1;
        //如果在亮度回升期间,需要降低亮度
        if (Initialflag == LUMEN_UP)
        {
            //由于温度需要下降,说明初值亮度还是太高了
            //将初值亮度降低1点
            *InitialLumen -= 1;         
            Initialflag = LUMEN_DOWN;
        }
        break;
    }

  return 0;
}
/************************************
*获取温控时间
*函数名:LampGetTempControlTime
*函数参数:
          @value: 当前温度与限制温度的差值
*返回值:
*函数作者:wzy
*************************************/
static int Jz_LampGetTempControlTime(float value)
{
  //如果范围在0.4度以内
    if (value <= 0.4)
    {
        return 5000; //延时5000ms
    }
    //0.4~1.0
    else if ( (value > 0.4) && (value <= 1.0))
    {
        return 4600;
    }
    //1.0~1.8
    else if ( (value > 1.0) && (value <= 1.8))
    {
        return 4100;
    }
    //1.8~2.8
    else if ( (value > 1.8) && (value <= 2.8))
    {
        return 3500;
    }
    //2.8~4.0
    else if ( (value > 2.8) && (value <= 4.0))
    {
        return 2800;
    }
    //4.0~5.4
    else if ( (value > 4.0) && (value <= 5.4))
    {
        return 2000;
    }
    //5.4~7.0
    else if ( (value > 5.4) && (value <= 7.0))
    {
        return 1100;
    }
    //7.0~9.8
    else if ( (value > 7.0) && (value <= 9.8))
    {
        return 200;
    }
    else
    {
        return 100;
    }

} 

/************************************
*控件修改时,修改亮度初值
*函数名:LampGetTempControlTime
*函数参数:
           @value
*返回值:
*函数作者:wzy
*************************************/
void JZ_LightSetInitialLumen(int value)
{  
   if(value >= 0 && value <= 100)
   {
     InitialLumen = value;
     Initialflag = DEFAULT_STATUS;    
   } 
   
}

/************************************
*结构体初始化
*函数名:LampGetTempControlTime
*函数参数:
           @tempdata:温控结构体变量
*返回值:
*函数作者:wzy
*************************************/
void JZ_TempStructInit(void)
{   
    tempData = (TempControlData *)malloc(sizeof(TempControlData));
    InitialLumen = 0;
    tempData->InputLumen = 0;
    tempData->InputTemp = 0;
    tempData->OutLumen = 0;
}

/************************************
*判断灯的温度变化
*函数名:
*函数参数:
           @lastTemp:上次温度
           @curTemp:当前温度
           @ControlFlag:温控标志位
*返回值:
*函数作者:wzy
*************************************/
// static void JZ_TempChangeJudgment(int lastTemp,int curTemp,int *ControlFlag)
// {    
//     switch (*ControlFlag)
//     {
//     case LUMEN_UP: 
//           //亮度提升时温度升高
//          if(lastTemp < curTemp)
//          { //此时不提升亮度,等到温度平稳
//          *ControlFlag = DEFAULT_STATUS;
//          }
//          break;
//     case LUMEN_DOWN:
//         if(lastTemp > curTemp)
//          {
//           *ControlFlag = DEFAULT_STATUS;
//          }
//         break;    
//     }
     
// }

//改变温度部分
/************************************
*温度线程
*函数名: TempControl_TempChangeTask
*函数参数:
          
*返回值:
*函数作者:wzy
*************************************/

static void *TempControl_TempChangeTask(void *arg)
{
    int Lumen = 0; //亮度
    int lastLumen;//上一次亮度 
   

    while (1)
    {   
      if(tempData->OutLumen < 0)
      {
        tempData->OutLumen = 0;
      }
        Lumen = tempData->OutLumen;
        
        //判断是否超出温控范围了
        if (tempData->InputTemp > tempMax +10) //超出最大温度10度
        { 
          Jz_set_widget_value(4,0);
          Jz_set_widget_value(5,0);         
          Lumen = 0;
          tempData->InputLumen = Lumen;//改变温控输入亮度
          JZ_LightSetInitialLumen(Lumen);//改变设置的亮度初值
          Jz_LampLumenControl(Lumen,Lumen);
          
        }
         if(Lumen != lastLumen)//亮度改变
         {
            lastLumen = Lumen;   
       
         if(tempControlFlag == TEMP_TRIGGER)//触发了温控  
         {
            tempControlFlag = TEMP_NOTTRIGGER;      
            if(Lumen != 0) 
           {                                         
            //重设亮度
           
            Jz_LampLumenControl(Lumen,Lumen);
            tempData->InputLumen = Lumen;
            Jz_set_widget_value(4,Lumen);                                   
           }  
         } 
       }       
        usleep(200*1000);
    }
}