⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camtest.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//      tpParam
//           [in] Ignored.
//
//      lpFTE
//           [in] Ignored.
//
// Returns:
//      Specifies if the test passed (TPR_PASS), failed (TPR_FAIL), or was
//      skipped (TPR_SKIP).
//
//------------------------------------------------------------------------------
TESTPROCAPI CameraTestCapture(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE)
{
    CSPROPERTY_VIDEOCONTROL_MODE_S rotateIOCTL;
    //DWORD dwBufferCommand;
    PCS_DATARANGE_VIDEO pCaptureDataRange;
    PCSMULTIPLE_ITEM pCSDataRangeItems;
    PCSP_PIN pCsPin;
    PCS_DATARANGE_VIDEO pCSDataRangeVideo;
    DWORD dwStructSize;
    CSBUFFER_INFO csBufferInfo;

    CAM_TEST_FUNCTION_ENTRY();

    // Validate that the shell wants the test to run
    if (uMsg != TPM_EXECUTE)
    {
        return TPR_NOT_HANDLED;
    }

    // reset the interrupt count each time this test is run
    int_count = 0;

    gCurrentIndex = 0;

    rotateIOCTL.Property.Set = PROPSETID_VIDCAP_VIDEOCONTROL;
    rotateIOCTL.Property.Id = CSPROPERTY_VIDEOCONTROL_MODE;
    rotateIOCTL.Property.Flags = CSPROPERTY_TYPE_SET;
    rotateIOCTL.StreamIndex = 1;

    // Stop Capture Stream
    // First we must stop, in case stream was running before, and
    // to change the format.
    if (!CaptureSetState(CAMERA_STATE_STOP))
    {
        return TPR_FAIL;
    }

    // modify Capture data format to RGB, so we can draw it to the
    // framebuffer and view it on the LCD.  Try QCIF.

    pCaptureDataRange = (PCS_DATARANGE_VIDEO) malloc(sizeof(CS_DATARANGE_VIDEO));

    if (NULL == pCaptureDataRange)
     return FALSE;

#ifndef BSP_MX27
    if (!GetDataFormat(1, QCIF, pCaptureDataRange)) 
#else
    if (!GetDataFormat(0, QCIF, pCaptureDataRange))
#endif        
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not find QCIF datarange for CAPTURE pin...bummer.\r\n")));
    }

    inputIOCTL.Set = CSPROPSETID_Pin;
    inputIOCTL.Id = CSPROPERTY_PIN_DATAINTERSECTION;
    inputIOCTL.Flags = CSPROPERTY_TYPE_GET;

    // Get Dataformat using PININTERSECTION
    dwStructSize = sizeof(CSP_PIN) + sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCsPin = (PCSP_PIN) malloc(dwStructSize);

    if (NULL == pCsPin)
     return FALSE;
    
    pCsPin->Property = inputIOCTL;
#ifndef BSP_MX27    
    pCsPin->PinId = 1;
#else
    pCsPin->PinId = 0;
#endif
    pCSDataRangeItems = (PCSMULTIPLE_ITEM) (pCsPin + 1);
    pCSDataRangeItems->Count = 1;
    pCSDataRangeItems->Size = sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCSDataRangeVideo = (PCS_DATARANGE_VIDEO) (pCSDataRangeItems + 1);
    memcpy(pCSDataRangeVideo, pCaptureDataRange, sizeof(CS_DATARANGE_VIDEO));

    g_pCapDataFormat = (PCS_DATAFORMAT_VIDEOINFOHEADER) malloc(sizeof(CS_DATAFORMAT_VIDEOINFOHEADER));

    if (NULL == g_pCapDataFormat)
     return TPR_FAIL;

    // Get Capture format
    if (!DeviceIoControl(hCamera,                    // file handle to the driver
             IOCTL_CS_PROPERTY,                      // I/O control code
             pCsPin,                                 // in buffer
             dwStructSize,                           // in buffer size
             g_pCapDataFormat,                       // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER),  // out buffer size
             &gBytesTransferred,                     // number of bytes returned
             NULL))                                  // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAINTERSECTION GET. Dang.\r\n")));
        return TPR_FAIL;
    }

    // Set Capture format to QCIF
    inputIOCTL.Set = CSPROPSETID_Connection;
    inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
    inputIOCTL.Flags = CSPROPERTY_TYPE_SET;
    if (!DeviceIoControl(hCapturePin,                // file handle to the driver
             IOCTL_CS_PROPERTY,                      // I/O control code
             &inputIOCTL,                            // in buffer
             sizeof(CSPROPERTY),                     // in buffer size
             g_pCapDataFormat,                       // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER),  // out buffer size
             &gBytesTransferred,                     // number of bytes returned
             NULL))                                  // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAFORMAT SET. Dang.\r\n")));
        return TPR_FAIL;
    }

    // Start Capture Stream
    // First we must pause, and then transition to run state
    if (!CaptureSetState(CAMERA_STATE_PAUSE))
    {
        return TPR_FAIL;
    }

    // allocate buffer for capture pin
    csBufferInfo.dwCommand = CS_ALLOCATE;
    csBufferInfo.pStreamDescriptor = &captureStreamDesc;

    DeviceIoControl(hCapturePin,                   // file handle to the driver
                    IOCTL_CS_BUFFERS,              // I/O control code
                    &csBufferInfo,                 // in buffer
                    sizeof(csBufferInfo),          // in buffer size
                    &captureStreamDesc,            // out buffer
                    sizeof(CS_STREAM_DESCRIPTOR),  // out buffer size
                    &gBytesTransferred,            // number of bytes returned
                    NULL);                         // ignored (=NULL)

    if (!CaptureSetState(CAMERA_STATE_RUN))
    {
        return TPR_FAIL;
    }

    // Enter ISR loop
    if (!CaptureISR(INFINITE))
    {
        CAM_TEST_FUNCTION_EXIT();

        if (NULL != pCaptureDataRange)
            free(pCaptureDataRange);
        if (NULL != pCsPin)
            free(pCsPin);
    
        return TPR_FAIL;
    }
    else
    {
        CAM_TEST_FUNCTION_EXIT();

        if (NULL != pCaptureDataRange)
            free(pCaptureDataRange);
        if (NULL != pCsPin)
            free(pCsPin);
        
        return TPR_PASS;
    }
}

//------------------------------------------------------------------------------
//
// Function: CaptureISR
//
// This function performs image capture for the CAPTURE Pin.
// It contains a loop in which a CAPTURE pin image is read from
// its message queue, drawn the display, and then a new buffer
// in enqueued.  Intermittently, the camera driver is
// modified.  These modifications include changing the
// camera zoom and modifying the flipping orientation.
//
// Parameters:
//      timeout
//           [in] Timeout period while waiting for an interrupt
//
// Returns:
//      TRUE if success, FALSE if failure.
//
//------------------------------------------------------------------------------
static BOOL CaptureISR(DWORD timeout)
{
    CS_MSGQUEUE_BUFFER CsMsgQBuff;
    DWORD size, flags;
    DWORD startTicks, elapsedTicks;
    int task;
    RECT rcFBDest;
    //DWORD dwBufferCommand;
    BOOL bResult;
    CSBUFFER_INFO csBufferInfo;

    CAM_TEST_FUNCTION_ENTRY();

    startTicks = GetTickCount();
    task = 1;

    // loop here
    while(TRUE)
    {
        // Add buffer to the message queue
        csBufferInfo.dwCommand = CS_ENQUEUE;
        csBufferInfo.pStreamDescriptor = &captureStreamDesc;

        bResult = DeviceIoControl(hCapturePin,            // file handle to the driver
                 IOCTL_CS_BUFFERS,              // I/O control code
                 &csBufferInfo,                 // in buffer
                 sizeof(csBufferInfo),          // in buffer size
                 &captureStreamDesc,            // out buffer
                 sizeof(CS_STREAM_DESCRIPTOR),  // out buffer size
                 &gBytesTransferred,            // number of bytes returned
                 NULL);                         // ignored (=NULL)

        if (TRUE == bResult)
        {
           g_pKato->Log(CAM_ZONE_ERROR, (TEXT("CaptureISR: WaitForSingleObject\r\n")));

           // Wait for message queue to be signaled
           if (WaitForSingleObject(hCaptureMsgQ, timeout) != WAIT_OBJECT_0)
           {
               g_pKato->Log(CAM_ZONE_ERROR, (TEXT("CaptureISR: WaitForSingleObject Timeout!\r\n")));
               return FALSE;
           }

           // Our message queue handle has been signaled.
           // Now try to read a captured image from the buffer queue.
           if (!ReadMsgQueue(hCaptureMsgQ, &CsMsgQBuff, sizeof(CS_MSGQUEUE_BUFFER), &size, 10, &flags))
           {
               g_pKato->Log(CAM_ZONE_ERROR, (TEXT("CaptureISR: Could not read from buffer queue!\r\n")));
               goto enc_error;
           }

           pCaptureBuffer = reinterpret_cast<PUINT8>(CsMsgQBuff.pStreamDescriptor->CsStreamHeader.Data);

           rcFBDest.top = 0;
           rcFBDest.left = 0;
        
#ifndef BSP_MX27 
           DrawToFrameBuffer(pCaptureBuffer, abs(g_pCapDataFormat->VideoInfoHeader.bmiHeader.biWidth),
               abs(g_pCapDataFormat->VideoInfoHeader.bmiHeader.biHeight), &rcFBDest);
#else
// In MX27, Capture pin don't support RGB output format. So we can not watch a correct picture in the screen.
           g_dwPanelBPP = 12;
           DrawToFrameBuffer(pCaptureBuffer, abs(g_pCapDataFormat->VideoInfoHeader.bmiHeader.biWidth),
               abs(g_pCapDataFormat->VideoInfoHeader.bmiHeader.biHeight), &rcFBDest);
           g_dwPanelBPP = 16;
#endif
           g_pKato->Log(CAM_ZONE_ERROR,(TEXT("write finish...............\r\n")));

        }
        else
        {
            g_pKato->Log(CAM_ZONE_ERROR, (TEXT("CaptureISR: Enqueue the buffer error!\r\n")));
            g_pKato->Log(CAM_ZONE_ERROR, (TEXT("CaptureISR: Don't suspend the system during running this test case!\r\n")));
            Sleep(500);        
        }

        // Increment count of interrupts that have occurred
        int_count++;

        // After a certain period has elapsed, stop viewfinder
        elapsedTicks = GetTickCount() - startTicks;

        if ((elapsedTicks > 5000) && (task == 1)) // 5 seconds
        {
            if (!Zoom(2))
            {
                goto enc_error;
            }

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("CameraISR: Completed camera zoom update.\r\n")));
        }
        
        if ((elapsedTicks > 12000) && (task == 2)) // 12 seconds
        {
            if (!Zoom(1))
            {
                goto enc_error;
            }

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("CaptureISR: Return to normal zoom setting (1X).\r\n")));
        }

#ifndef BSP_MX27
        if ((elapsedTicks > 14000) && (task == 3)) // 14 seconds
        {
            // Stop capture
            if (!CaptureSetState(CAMERA_STATE_STOP))
                return FALSE;

            // rotate image horizontally for capture
            if (!ChangeFlipping(CS_VideoControlFlag_FlipHorizontal))
            {
                goto enc_error;
            }

            // Restart capture
            if (!CaptureSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!CaptureSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("CaptureISR: Image flipped horizontally.\r\n")));
        }

        if ((elapsedTicks > 18000) && (task == 4)) // 18 seconds
        {
            // Stop capture
            if (!CaptureSetState(CAMERA_STATE_STOP))
                return FALSE;

            // rotate image horizontally for capture
            if (!ChangeFlipping(CS_VideoControlFlag_FlipVertical))
            {
                goto enc_error;
            }

            // Restart capture
            if (!CaptureSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!CaptureSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("CaptureISR: Image flipped vertically.\r\n")));
        }

        if ((elapsedTicks > 22000) && (task == 5)) // 22 seconds
        {
            // Stop capture
            if (!CaptureSetState(CAMERA_STATE_STOP))
                return FALSE;

            // rotate image horizontally for capture
            if (!ChangeFlipping((CS_VideoControlFlags)(CS_VideoControlFlag_FlipVertical | CS_VideoControlFlag_FlipHorizontal)))
            {
                goto enc_error;
            }

            // Restart capture

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -