KtLibProc.cpp 5.6 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "JZsdkLib.h"

#include "BaseConfig.h"

#include "../IRC_data_deal/IRC_data_deal.h"

#include <vector>
#include <mutex>

#ifdef KTIRC_LIB_STATUS_ON
    #include "M330Interface.h"
#endif

#include "MediaProc/MediaProc_Param.h"

#include "KtLibProc.h"
#include "MediaProc/ImageProc/PseudoColor/PseudoColor.h"

// 定义互斥锁
static std::mutex ktLibMutex;
 
T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo)
{
#ifdef KTIRC_LIB_STATUS_ON
    InitM330();

    KtLib_writeMarkData(HIGH_TEMP_DATA,dealInfo->HighT_NineFrame_Avg ,dealInfo->PixelNum);
    KtLib_writeMarkData(LOW_TEMP_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum);
    KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->SPC_Mark_Data ,dealInfo->PixelNum);

    JZSDK_LOG_INFO("KtLib_Init success");
#endif
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/**********************************************
 * 
 * 
 * 
 * 
 * 
 * **********************************************/
T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
{
    bool bool_ret;

    // 加锁
    std::lock_guard<std::mutex> lock(ktLibMutex);

#ifdef KTIRC_LIB_STATUS_ON
    switch (type)
    {
        //高温标记数据
        case HIGH_TEMP_DATA:
            bool_ret = LoadMarkData((int *)in ,size,HIGH_MARK_DATA);
            if (bool_ret == false)
            {
                JZSDK_LOG_ERROR("LoadMarkData HIGH_TEMP_DATA error");
                return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
            }
            else
            {
                JZSDK_LOG_INFO("LoadMarkData HIGH_TEMP_DATA success");
            }
            
        break;

        //低温标记数据
        case LOW_TEMP_DATA:
            bool_ret = LoadMarkData((int *)in ,size,LOW_MARK_DATA);
            if (bool_ret == false)
            {
                JZSDK_LOG_ERROR("LoadMarkData LOW_TEMP_DATA error");
                return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
            }
            else
            {
                JZSDK_LOG_INFO("LoadMarkData LOW_TEMP_DATA success");
                return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
            }

        break;

        //单点标记数据
        case SPC_MARK_DATA:
            bool_ret = LoadMarkData((int *)in ,size, SINGLE_MARK_DATA);
            if (bool_ret == false)
            {
                JZSDK_LOG_ERROR("LoadMarkData SPC_MARK_DATA error");
                return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
            }

            else
            {
                JZSDK_LOG_INFO("LoadMarkData SPC_MARK_DATA success");
                return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
            }

        break;
        
        default:
            break;
    }
    
#endif
}

static int lastCorrectMode = JZ_FLAGCODE_OFF;

T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, 
                                U8_t **RGB_data, unsigned int *RGB_dataSize,      
                                struct IRC_param *dealInfo)
{
    // 加锁
    std::lock_guard<std::mutex> lock(ktLibMutex);

    T_JZsdkReturnCode ret;
    bool bool_ret;

#ifdef KTIRC_LIB_STATUS_ON

    // 如果打开了单点校正
    if (dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC && lastCorrectMode != IRC_CORRCTION_SPC)
    {
        JZSDK_LOG_INFO("sdk开启单点校正");

        //关闭两点校正
        CloseDoubleNuc();

        //打开单点校正
        OpenSingleNuc();

        lastCorrectMode = IRC_CORRCTION_SPC;
    }


    // 如果打开了两点校正
    if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC && lastCorrectMode != IRC_CORRCTION_TPC)
    {

        JZSDK_LOG_INFO("sdk开启两点校正");

        //关闭单点校正
        CloseSingleNuc(); 
        
        //打开两点校正
        OpenDoubleNuc();

        lastCorrectMode = IRC_CORRCTION_TPC;
    }

    // 如果关闭了校正
    if (dealInfo->FrameCorrectMode == JZ_FLAGCODE_OFF && lastCorrectMode != JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_INFO("sdk无校正");

        //关闭单点校正
        CloseSingleNuc(); 

        //关闭两点校正
        CloseDoubleNuc();

        lastCorrectMode = JZ_FLAGCODE_OFF;
    }

    //将u16数据转为char 数据 以用于输入库
    char* inputDataChar = new char[U16_dataSize*2];
    int inputDataSize = U16_dataSize*2;
    for (int i = 0; i < U16_dataSize; i++)
    {
        inputDataChar[i*2+1] = (U16_data[i] & 0xFF00) >> 8;
        inputDataChar[i*2] = (U16_data[i] & 0x00FF);
    }

    //注册一个输出数组
    *RGB_data = new U8_t[dealInfo->PixelNum*3];
    *RGB_dataSize = 0;

    // 图像输出模式
    switch (dealInfo->OutputPixelColorMode)
    {
        case 0: // 默认输出模式
        case 2: // 气体色彩增强输出模式
        {
            bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
        }
        break;

        case 1: // 伪彩输出模式
        {
            bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
        
            //将rgb888数据反转为灰度数据并进行颜色映射
        }
        break;

        default:
            delete[] inputDataChar;
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        break;
    }

    if (bool_ret == false)
    {
        JZSDK_LOG_ERROR("sdk处理错误");
    }
    

    //JZSDK_LOG_DEBUG("ktlib pixnum*3:%d rgbsize:%d",dealInfo->PixelNum*3 ,*RGB_dataSize);

    delete[] inputDataChar;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}