MINT32 CctImp::CCTOPWriteSensorReg(MVOID *puParaIn)
{
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SENSOR_FEATURE_ENUM eSensorFeature = SENSOR_FEATURE_SET_REGISTER;
    PACDK_CCT_REG_RW_STRUCT pSensorRegInfoIn = (PACDK_CCT_REG_RW_STRUCT)puParaIn;
    MUINT32 Data[2], sensorParaLen;

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_WRITE_SENSOR_REG]\n");

    Data[0] = pSensorRegInfoIn->RegAddr;
    Data[1] = pSensorRegInfoIn->RegData;

    sensorParaLen = 2 * sizeof(MUINT32);

    //err = m_pSensorDrvObj->sendCommand(CMD_SENSOR_CCT_FEATURE_CONTROL, (MUINT32 *)&eSensorFeature, &Data[0], &sensorParaLen);
    
    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPWriteSensorReg() error]\n");
        return err;
    }
    
    SENSOR_CCTOP_LOG("[CCTOPWriteSensorReg] regAddr = %x, regData = %x\n", Data[0], Data[1]);

    return err;
}
MINT32 CctImp::CCTOPGetLSCSensorRes(MVOID *pCCTSensorResOut, MUINT32 *pRealParaOutLen)
{
    #define ISP_RAW_WIDTH_PADD      4
    #define ISP_RAW_HEIGHT_PADD     6

    MINT32 err = CCTIF_NO_ERROR;
    PACDK_SENSOR_RESOLUTION_INFO_STRUCT pSensorResolution = (PACDK_SENSOR_RESOLUTION_INFO_STRUCT)pCCTSensorResOut;

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_GET_LSC_SENSOR_RESOLUTION]\n");

    //err = m_pSensorDrvObj->getResolution((PACDK_SENSOR_RESOLUTION_INFO_STRUCT )pSensorResolution);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetLSCSensorRes() error]\n");
        return err;
    }

    pSensorResolution->SensorFullWidth += ISP_RAW_WIDTH_PADD;
    pSensorResolution->SensorFullHeight += ISP_RAW_HEIGHT_PADD;
    pSensorResolution->SensorPreviewWidth += ISP_RAW_WIDTH_PADD;
    pSensorResolution->SensorPreviewHeight += ISP_RAW_HEIGHT_PADD;

    *pRealParaOutLen = sizeof(ACDK_SENSOR_RESOLUTION_INFO_STRUCT);

    return err;
}
MINT32 CctImp::CCTOPSetEngSensorPara(MVOID *pSensorItemInfoIn)
{
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SENSOR_FEATURE_ENUM eSensorFeature = SENSOR_FEATURE_SET_ITEM_INFO;
    ACDK_SENSOR_ITEM_INFO_STRUCT *pInfoIn = (ACDK_SENSOR_ITEM_INFO_STRUCT *)pSensorItemInfoIn;
    MUINT32 sensorParaLen = sizeof(ACDK_SENSOR_ITEM_INFO_STRUCT);

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_SET_ENG_SENSOR_PARA]\n");

    //err = m_pSensorDrvObj->sendCommand(CMD_SENSOR_CCT_FEATURE_CONTROL, (MUINT32 *)&eSensorFeature, (MUINT32 *)pInfoIn, &sensorParaLen);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPSetEngSensorPara() error]\n");
        return err;
    }

    return err;
}
MINT32 CctImp::CCTOPGetSensorInfo(MVOID *puParaIn, MVOID *puParaOut, MUINT32 *pu4RealParaOutLen)
{
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SCENARIO_ID_ENUM *pScenarioId = (ACDK_SCENARIO_ID_ENUM *)puParaIn;
    ACDK_SENSOR_INFO_STRUCT *pSensorInfo = (ACDK_SENSOR_INFO_STRUCT *)puParaOut;
    ACDK_SENSOR_CONFIG_STRUCT sensorConfigData;

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_GET_SENSOR_INFO]\n");

    //err = m_pSensorDrvObj->getInfo(*pScenarioId, pSensorInfo, &sensorConfigData);
    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetSensorInfo() error]\n");
        return err;
    }

    *pu4RealParaOutLen = sizeof(ACDK_SENSOR_INFO_STRUCT);

    return err;
}
MINT32 CctImp::CCTOPGetEngSensorGroupCount(MUINT32 *pGoupCntOut, MUINT32 *pRealParaOutLen)
{
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SENSOR_FEATURE_ENUM eSensorFeature = SENSOR_FEATURE_GET_GROUP_COUNT;
    MUINT32 sensorParaLen = sizeof(MUINT32);

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_GET_ENG_SENSOR_GROUP_COUNT]\n");

    //err = m_pSensorDrvObj->sendCommand(CMD_SENSOR_CCT_FEATURE_CONTROL, (MUINT32 *)&eSensorFeature, pGoupCntOut,  &sensorParaLen);

    *pRealParaOutLen = sizeof(MUINT32);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetEngSensorGroupCount() error]\n");
        return err;
    }

    return err;
}
MINT32 CctImp::CCTOPGetSensorRes(MVOID *pCCTSensorResOut, MUINT32 *pRealParaOutLen)
{
#if 0
    MINT32 err = CCTIF_NO_ERROR;
    PACDK_SENSOR_RESOLUTION_INFO_STRUCT pSensorResolution = (PACDK_SENSOR_RESOLUTION_INFO_STRUCT)pCCTSensorResOut;

    SENSOR_CCTOP_LOG("[ACDK_CCT_V2_OP_GET_SENSOR_RESOLUTION]\n");

    //err = m_pSensorDrvObj->getResolution((PACDK_SENSOR_RESOLUTION_INFO_STRUCT )pSensorResolution);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetSensorRes() error]\n");
        return err;
    }

    *pRealParaOutLen = sizeof(ACDK_SENSOR_RESOLUTION_INFO_STRUCT);
    
    return err;
#else
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_CCT_SENSOR_RESOLUTION_STRUCT *pSensorResolution = (ACDK_CCT_SENSOR_RESOLUTION_STRUCT *)pCCTSensorResOut;


    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                        SENSOR_CMD_GET_SENSOR_PRV_RANGE,
                                        (MINT32)&pSensorResolution->SensorPreviewWidth,
                                        (MINT32)&pSensorResolution->SensorPreviewHeight);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                        SENSOR_CMD_GET_SENSOR_FULL_RANGE,
                                        (MINT32)&pSensorResolution->SensorFullWidth,
                                        (MINT32)&pSensorResolution->SensorFullHeight,
                                        0);

    printf("[CCTOPGetSensorRes] PreviewWidth = %d, PreviewHeight = %d\n", pSensorResolution->SensorPreviewWidth, pSensorResolution->SensorPreviewHeight);
    printf("[CCTOPGetSensorRes] SensorFullWidth = %d, SensorFullHeight = %d\n", pSensorResolution->SensorFullWidth, pSensorResolution->SensorFullHeight);
    
    *pRealParaOutLen = sizeof(ACDK_CCT_SENSOR_RESOLUTION_STRUCT);
    
    return err;
    
#endif

}
MINT32 CctImp::CCTOPGetEngSensorGroupPara(MUINT32 groupIdx, MVOID *pGroupInfoOut, MUINT32 *pRealParaOutLen)
{
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SENSOR_FEATURE_ENUM eSensorFeature = SENSOR_FEATURE_GET_GROUP_INFO;
    MUINT32 sensorParaLen = sizeof(ACDK_SENSOR_GROUP_INFO_STRUCT);
    ACDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfoOut = (ACDK_SENSOR_GROUP_INFO_STRUCT *)pGroupInfoOut;
    pSensorGroupInfoOut->GroupIdx = groupIdx;

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_GET_ENG_SENSOR_GROUP_PARA]\n");

    //err = m_pSensorDrvObj->sendCommand(CMD_SENSOR_CCT_FEATURE_CONTROL, (MUINT32 *)&eSensorFeature, (MUINT32 *)pSensorGroupInfoOut, &sensorParaLen);
    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetEngSensorGroupPara() error]\n");
        return err;
    }

    *pRealParaOutLen = sizeof(ACDK_SENSOR_GROUP_INFO_STRUCT);

    return err; 
}
MINT32 CctImp::CCTOPQuerySensor(MVOID *a_pCCTSensorInfoOut, MUINT32 *pRealParaOutLen)
{

    MINT32 err = CCTIF_NO_ERROR;
    halSensorRawImageInfo_t rawImageInfo;
    ACDK_CCT_SENSOR_INFO_STRUCT *pSensorEngInfoOut = (ACDK_CCT_SENSOR_INFO_STRUCT*)a_pCCTSensorInfoOut;


    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                       SENSOR_CMD_SET_SENSOR_DEV,
                                       0,
                                       0,
                                       0);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOReadSensorReg() error]\n");
        return err;
    }

    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_SENSOR_ID, (MINT32)&pSensorEngInfoOut->DeviceId);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_SENSOR_TYPE, (MINT32)&pSensorEngInfoOut->Type);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_RAW_INFO, (MINT32)&rawImageInfo, 0);

    pSensorEngInfoOut->StartPixelBayerPtn = (ACDK_SENSOR_OUTPUT_DATA_FORMAT_ENUM)rawImageInfo.u1Order;
    pSensorEngInfoOut->GrabXOffset = 0;     // phase out, no multi-shot
    pSensorEngInfoOut->GrabYOffset = 0;     // phase out, no multi-shot

    printf("[CCTOPQuerySensor] Id = 0x%x\n", pSensorEngInfoOut->DeviceId);
    printf("[CCTOPQuerySensor] Type = %d\n", pSensorEngInfoOut->Type);
    printf("[CCTOPQuerySensor] StartPixelBayerPtn = %d\n", pSensorEngInfoOut->Type);
    printf("[CCTOPQuerySensor] GrabXOffset = %d\n", pSensorEngInfoOut->GrabXOffset);
    printf("[CCTOPQuerySensor] GrabYOffset = %d\n", pSensorEngInfoOut->GrabYOffset);


    *pRealParaOutLen = sizeof(ACDK_CCT_SENSOR_INFO_STRUCT);

    return err;

}
MINT32 CctImp::CCTOPGetLSCSensorRes(MVOID *pCCTSensorResOut, MUINT32 *pRealParaOutLen)
{
    #define ISP_RAW_WIDTH_PADD      0
    #define ISP_RAW_HEIGHT_PADD     0

    MINT32 err = CCTIF_NO_ERROR;
    PACDK_SENSOR_RESOLUTION_INFO_STRUCT pSensorResolution = (PACDK_SENSOR_RESOLUTION_INFO_STRUCT)pCCTSensorResOut;

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_GET_LSC_SENSOR_RESOLUTION]\n");

    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                        SENSOR_CMD_GET_SENSOR_PRV_RANGE,
                                        (MINT32)&pSensorResolution->SensorPreviewWidth,
                                        (MINT32)&pSensorResolution->SensorPreviewHeight);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                        SENSOR_CMD_GET_SENSOR_FULL_RANGE,
                                        (MINT32)&pSensorResolution->SensorFullWidth,
                                        (MINT32)&pSensorResolution->SensorFullHeight,
                                        0);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                        SENSOR_CMD_GET_SENSOR_VIDEO_RANGE,
                                        (MINT32)&pSensorResolution->SensorVideoWidth,
                                        (MINT32)&pSensorResolution->SensorVideoHeight,
                                        0);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPGetLSCSensorRes() error]\n");
        return err;
    }

    pSensorResolution->SensorFullWidth += ISP_RAW_WIDTH_PADD;
    pSensorResolution->SensorFullHeight += ISP_RAW_HEIGHT_PADD;
    pSensorResolution->SensorPreviewWidth += ISP_RAW_WIDTH_PADD;
    pSensorResolution->SensorPreviewHeight += ISP_RAW_HEIGHT_PADD;

    *pRealParaOutLen = sizeof(ACDK_SENSOR_RESOLUTION_INFO_STRUCT);

    return err;
}
MINT32 CctImp::CCTOPQuerySensor(MVOID *a_pCCTSensorInfoOut, MUINT32 *pRealParaOutLen)
{
#if 0
    MINT32 err = CCTIF_NO_ERROR;
    ACDK_SENSOR_FEATURE_ENUM eSensorFeature = SENSOR_FEATURE_GET_ENG_INFO;
    ACDK_CCT_SENSOR_INFO_STRUCT *pSensorEngInfoOut = (ACDK_CCT_SENSOR_INFO_STRUCT*)a_pCCTSensorInfoOut; //(ACDK_CCT_SENSOR_INFO_STRUCT *)a_pFeatureInfo->puParaOut;
    ACDK_SENSOR_ENG_INFO_STRUCT SensorEngInfo;
    MUINT32 sensorParaLen = sizeof(ACDK_SENSOR_ENG_INFO_STRUCT);

    SENSOR_CCTOP_LOG("[ACDK_CCT_OP_QUERY_SENSOR]\n");

    //err = m_pSensorDrvObj->sendCommand(CMD_SENSOR_CCT_FEATURE_CONTROL, (MUINT32 *)&eSensorFeature, (MUINT32 *)&SensorEngInfo, &sensorParaLen);
    
    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOPQuerySensor() error]\n");
        return err; 
    }

    if (SensorEngInfo.SensorType == CCD_SENSOR) {
        pSensorEngInfoOut->Type = ACDK_CCT_REG_CCD;
    }
    else {
        pSensorEngInfoOut->Type = ACDK_CCT_REG_CMOS;
    }

    pSensorEngInfoOut->DeviceId = SensorEngInfo.SensorId;
    pSensorEngInfoOut->StartPixelBayerPtn = SensorEngInfo.SensorOutputDataFormat;
    pSensorEngInfoOut->GrabXOffset = 0;     // phase out, no multi-shot
    pSensorEngInfoOut->GrabYOffset = 0;     // phase out, no multi-shot

    *pRealParaOutLen = sizeof(ACDK_CCT_SENSOR_INFO_STRUCT);
    return err; 
#else
    MINT32 err = CCTIF_NO_ERROR;
    halSensorRawImageInfo_t rawImageInfo;
    ACDK_CCT_SENSOR_INFO_STRUCT *pSensorEngInfoOut = (ACDK_CCT_SENSOR_INFO_STRUCT*)a_pCCTSensorInfoOut;


    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev,
                                       SENSOR_CMD_SET_SENSOR_DEV,
                                       0,
                                       0,
                                       0);

    if (err != SENSOR_NO_ERROR) {
        SENSOR_CCTOP_ERR("[CCTOReadSensorReg() error]\n");
        return err;
    }

    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_SENSOR_ID, (MINT32)&pSensorEngInfoOut->DeviceId);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_SENSOR_TYPE, (MINT32)&pSensorEngInfoOut->Type);
    err |= m_pSensorHalObj->sendCommand((halSensorDev_e)mSensorDev, SENSOR_CMD_GET_RAW_INFO, (MINT32)&rawImageInfo, 0);

    pSensorEngInfoOut->StartPixelBayerPtn = (ACDK_SENSOR_OUTPUT_DATA_FORMAT_ENUM)rawImageInfo.u1Order;
    pSensorEngInfoOut->GrabXOffset = 0;     // phase out, no multi-shot
    pSensorEngInfoOut->GrabYOffset = 0;     // phase out, no multi-shot

    printf("[CCTOPQuerySensor] Id = 0x%x\n", pSensorEngInfoOut->DeviceId);
    printf("[CCTOPQuerySensor] Type = %d\n", pSensorEngInfoOut->Type);
    printf("[CCTOPQuerySensor] StartPixelBayerPtn = %d\n", pSensorEngInfoOut->Type);
    printf("[CCTOPQuerySensor] GrabXOffset = %d\n", pSensorEngInfoOut->GrabXOffset);
    printf("[CCTOPQuerySensor] GrabYOffset = %d\n", pSensorEngInfoOut->GrabYOffset);
    

    *pRealParaOutLen = sizeof(ACDK_CCT_SENSOR_INFO_STRUCT);

    return err;
    
#endif
}