#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include "JZsdkLib.h"
#include "./Camera.h"
#include "version_choose.h"
#include "BaseConfig.h"
#include "./Kt_Irc/Kt_Irc.h"
#include "../ImageProc/PseudoColor/PseudoColor.h"
#include "MediaProc/MediaProc_Param.h"

#include "MediaProc/IRC_funtion/IRC_funtion.h"


static int PseudoColor = JZ_FLAGCODE_OFF; //伪彩颜色
static int PixelColorMode = JZ_FLAGCODE_OFF;  //像素颜色模式

static int g_CameraCorrectionMode = JZ_FLAGCODE_OFF; //相机校正模式
static int g_CameraGasEnhancementColor = 0; //默认红0 绿1 蓝2

int g_CameraRegionBox_FirstPixel[2] = {0, 0}; // 初始化第一点坐标(x, y)为(0, 0)  
int g_CameraRegionBox_SecondPixel[2] = {0, 0}; // 初始化第二点坐标(x, y)为(0, 0)
int g_CameraRegionBox_ClickTime = 0;


//快门开关
/***********************************
 * 
 *  value on为开 off为关
 * 
 * 
 * ***************************************/
T_JZsdkReturnCode JZsdk_Camera_ShutterSwitch(int value)
{
    T_JZsdkReturnCode ret;
#if DEVICE_VERSION == JZ_C1
    ret = JZsdk_Kt_Irc_ShutterSwitch(value);
#else
    ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
#endif

    return ret;
}

//坏点校正快关
/********************
 * 
 *  该功能为一次性功能
 * 
 * 
 * **************************/
T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch()
{
    IRC_SetRawPixel_ResetFlag();
    IRC_SetGrayPixel_ResetFlag();
}

//单点纠正开关
/********************
 * 
 *  该功能为一次性功能
 * 
 * 
 * **************************/
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch()
{
    IRC_SetSPC_ResetFlag();
}

//气体纠正开关
/********************
 * 
 *  该功能为一次性功能
 * 
 * 
 * **************************/
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch()
{
    IRC_SetDGCE_ResetFlag();
}

/********************
 * 
 *  设置相机框选区域
 * //第一次点 //有一个单点坐标
//第二次点 //变成矩形
//第0次点 //关闭坐标

 * 
 * ******************/
T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
{        
    //1、检查该点是否合法
#if  DEVICE_VERSION == JZ_C1
    //红外相机下的坐标参数是0~319 0~255
    if ( !( (PointX >= 0) && (PointX <320 ) && (PointY >= 0) && (PointY < 256)))
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
        
#endif

    printf("设置框选点X:%d Y:%d\n",PointX,PointY);

    //如果本次操作是画第一个点
    if (g_CameraRegionBox_ClickTime+1 == 1)
    {
        g_CameraRegionBox_FirstPixel[0] = PointX;
        g_CameraRegionBox_FirstPixel[1] = PointY;

        IRC_Set_RegionBox(0, PointX, PointY);
        IRC_Set_RegionMode(1);
    }
    else if (g_CameraRegionBox_ClickTime+1 == 2)
    {
        g_CameraRegionBox_SecondPixel[0] = PointX;
        g_CameraRegionBox_SecondPixel[1] = PointY;

        IRC_Set_RegionBox(1, PointX, PointY);
        IRC_Set_RegionMode(2);
    }

    g_CameraRegionBox_ClickTime++;

    if (g_CameraRegionBox_ClickTime == 3)
    {
        g_CameraRegionBox_ClickTime=0;
        IRC_Set_RegionMode(0);
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/********************
 * 
 *  设置纠正模式

 * 
 * ******************/
static T_JZsdkReturnCode Camera_CorrectionMode(int mode)
{        
    g_CameraCorrectionMode = mode;

#if  DEVICE_VERSION == JZ_C1
    int RealMode = 0;
    switch (mode)
    {
        case 0:
            RealMode = JZ_FLAGCODE_OFF;
        break;

        case 1:
            RealMode = IRC_CORRCTION_SPC;
        break;
    
        case 2:
            RealMode = IRC_CORRCTION_TPC;
        break;
    
        default:
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        break;
    }
    
    //设置相机的当前纠正模式
    IRC_Set_CorrectionMode(RealMode);
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif

    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}

/********************
 * 
 *  设置气体增强颜色

 * 
 * ******************/
static T_JZsdkReturnCode Camera_GasEnhancementColor(int mode)
{        
#if  DEVICE_VERSION == JZ_C1
    int RealMode = 0;
    switch (mode)
    {
        case 0:
            RealMode = IRC_GAS_ENHANCEMENT_RED;
        break;

        case 1:
            RealMode = IRC_GAS_ENHANCEMENT_GREEN;
        break;
    
        case 2:
            RealMode = IRC_GAS_ENHANCEMENT_BLUE;
        break;
    
        default:
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        break;
    }

    g_CameraGasEnhancementColor = mode;
    
    IRC_Set_GasEnhancementColor(RealMode);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif

    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}

/*******************************
 * 
 *  设置相机参数
 * 
 * 
 * *****************************/
T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *value)
{
    T_JZsdkReturnCode ret;

    if (flagcode == JZ_FLAGCODE_GET)
    {
        switch (paramflag)
        {
            case CAMERA_PSEUDO_COLOR:
            {
               *value = PseudoColor;
            }
            break;     

            case CAMERA_PIXEL_PSEUDO_COLOR_MODE:
            {
                *value = PixelColorMode;
            }        
            break;

            case CAMERA_REGION_BOX:
            {
                value[0] = g_CameraRegionBox_FirstPixel[0]; 
                value[1] = g_CameraRegionBox_FirstPixel[1];
                value[2] = g_CameraRegionBox_SecondPixel[0]; 
                value[3] = g_CameraRegionBox_SecondPixel[1];                    
            }   
            break;

            case CAMERA_CORRCTION_MODE:
            {
                *value = g_CameraCorrectionMode;
            }  
            break;

            case CAMERA_GAS_ENHANCEMENT_COLOR:
            {
                *value = g_CameraGasEnhancementColor;
            }

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }
    else if (flagcode == JZ_FLAGCODE_SET)
    {
        switch (paramflag)
        {
            case CAMERA_PSEUDO_COLOR:
            {
                ret = PseudoColor_256Gray2Rgb_ResetColor(*value);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }
                PseudoColor = *value;
            }
            break;

            case CAMERA_PIXEL_PSEUDO_COLOR_MODE:
            {
                ret = IRC_Set_OutputPixelColorMode(*value);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }
                PixelColorMode = *value;
            }   
            break;

            case CAMERA_REGION_BOX:
            {
                ret = Camera_RegionBox(value[0], value[1]);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }  
            }
            break;

            case CAMERA_CORRCTION_MODE:
            {
                ret = Camera_CorrectionMode(*value);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }                  
            }  
            break;

            case CAMERA_GAS_ENHANCEMENT_COLOR:
            {
                ret = Camera_GasEnhancementColor(*value);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }     
            }   
            break;

            case CAMERA_GAS_ENHANCEMENT_CORRCTION:
            {
                ret = JZsdk_Camera_GasEnhancementCorrectSwitch(*value);
                if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                {
                    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
                }    
            }
            break;

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    JZSDK_LOG_ERROR("参数获取出错");
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}