JZ_SearchLightTemp_calculation.c 5.5 KB
/****************************************************/
#include <stdio.h>
#include "version_choose.h"


typedef enum {
    DEFAULT_STATUS = 0x0000, //默认状态
    LUMEN_UP = 0x0001, //亮度提高
    LUMEN_DOWN =0x0002, //亮度降低
    
} JZ_TemControl_Code;



// typedef enum {
//     JZ_T30 = 0x0000,
//     JZ_T60 = 0x0001,
//     JZ_T90 = 0x0002,
//     JZ_T60S = 0x0003,    
//     JZ_U3 = 0x0004,
//     JZ_A1 = 0x0005,
// } JZ_DeviceModel_Code;

static int InitialLumen = 0; //最初亮度
static int InitialFlag = 0; //最初亮度变化flag


/***
 * 
 *  控件修改时,给温控模块一个亮度初值
 * 
 * ****/
int JZsdk_SearchLightSetInitialLumen(int value)
{
    if (InitialLumen >= 100)
    {
        InitialLumen = 100;
    }
    else if (InitialLumen <= 0)
    {
        InitialLumen = 0;
    }
    
    
    InitialLumen = value;
    InitialFlag = DEFAULT_STATUS;

    printf("刷新亮度初值%d\n",InitialLumen);
}

/***
 * 
 *  获取限制温度
 * 
 * ****/
static int JZsdk_SearchLightGetLimitTemp(int DeviceMode)
{
    switch (DeviceMode)
    {
        // case JZ_T30:
        //     return 65;
        //     break;

        // case JZ_T60:
        //     return 80;
        //     break;
        
        // case JZ_T90:
        //     return 70;
        //     break;
        
        // case JZ_T60S:
        //     return 65;
        //     break;
        
        case JZ_U3:
            return 70;
            break;

        case JZ_U3S:
            return 70;
            break;        
            
        case JZ_U3D:
            return 70;
            break;   

        case TF_A1:
            return 70;
            break;
        
        default:
            break;
    }

    return -1;
}

/***
 * 
 *  根据超出范围/ 小于范围 获取温控时间
 *  如果要优化,可以改成余弦曲线
 * ****/
static int JZsdk_SearchLightGetLumenControlTime(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;
    }
}

int JZsdk_SearchLightTemControl(float InputTemp, int InputLumen, int *OutputLumen, int *OutputDelay)
{
    //初始化
    *OutputLumen = 0;
    *OutputDelay = 0;
    int ControlFlag = DEFAULT_STATUS; //无变化为0, 升温为1,降温为2
    float TempRange = 0;  //温度范围
    int LumenVariation = 0; //亮度变化值

    //1、获取限制温度 
    int LimitTemp = JZsdk_SearchLightGetLimitTemp(DEVICE_VERSION);
    if (LimitTemp == -1) 
    {
        //没有对应的限制温度,返回失败及亮度0
        *OutputLumen = 0;
        *OutputDelay = 0;
        return -1;
    }

    //2、判断是否要升高/降低温度 以及 获取差距范围
    //如果输入的温度高于限制温度,说明要降亮度
    if (InputTemp >= LimitTemp)
    {
        TempRange = InputTemp - LimitTemp;

        //控制标志位: 降低亮度
        ControlFlag = LUMEN_DOWN;
    }
    //如果输出的温度 小于限制温度,则要判断输入亮度与亮度初值的关系
    else if (InputTemp < LimitTemp)
    {
        //如果输入亮度小于初值亮度
        if (InputLumen < InitialLumen)
        {
            TempRange = LimitTemp - InputTemp;

            //控制标志位:提高亮度
            ControlFlag = LUMEN_UP;
        }
        //否则,不用进行处理
        else
        {
            *OutputLumen = InputLumen;
            *OutputDelay = 0;
            ControlFlag = DEFAULT_STATUS;
            return 0;
        }
    }
    
    //3、根据输入的温度范围 获取降低/升高 的时间间隔
    *OutputDelay = JZsdk_SearchLightGetLumenControlTime(TempRange);

    //4、根据输入的温度范围 获取降低/升高 的亮度的步长 并 加上原亮度 得到新亮度
    //暂时固定一度
    if (ControlFlag == LUMEN_DOWN)
    {
        *OutputLumen = InputLumen - 1;

        //如果在亮度回升期间,需要降低亮度
        if (InitialFlag == LUMEN_UP)
        {
            //由于温度需要下降,说明初值亮度还是太高了
            //将初值亮度降低1点
            InitialLumen = InitialLumen-1;
            printf("触发降低初值%d\n",InitialLumen);

            InitialFlag = LUMEN_DOWN;
        }
    }
    else if (ControlFlag == LUMEN_UP)
    {
        *OutputLumen = InputLumen + 1;

        //如果亮度回升了
        InitialFlag = LUMEN_UP;
    }
    else
    {
        //没有对应的标志位,温控失败
        *OutputLumen = 0;
        *OutputDelay = 0;
        return -1;
    }

    return 0;
}

/***
 *  
 *  用于判断是否超出最大温度范围10度
 *  用于超出温度时的直接关灯
 *  超过最大范围10度后 返回1
 *  不超返回0
 * ****/
int JZsdk_SearchLightTemControl_WhetherExceedsMaxRange(int InputTemp)
{
    int LimitTemp = (JZsdk_SearchLightGetLimitTemp(DEVICE_VERSION) + 10);
    if (InputTemp > LimitTemp)
    {
        return 1;
    }
    return 0;
}