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

📄 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 页
字号:
            // Set Still format to QQVGA
            inputIOCTL.Set = CSPROPSETID_Connection;
            inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
            inputIOCTL.Flags = CSPROPERTY_TYPE_SET;
            if (!DeviceIoControl(hPreviewPin,               // file handle to the driver
                     IOCTL_CS_PROPERTY,                     // I/O control code
                     &inputIOCTL,                           // in buffer
                     sizeof(CSPROPERTY),                    // in buffer size
                     pPreviewDataFormat,                    // 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 change image size while camera is running.  We will now stop it and try again.\r\n")));
            }
            else
            {
                g_pKato->Log(CAM_ZONE_ERROR,(TEXT("We should not be able to change image while camera running.  Arrrgh, I die.\r\n")));
                return FALSE;
            }

            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            inputIOCTL.Set = CSPROPSETID_Connection;
            inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
            inputIOCTL.Flags = CSPROPERTY_TYPE_SET;
            // Try again to change image size
            if (!DeviceIoControl(hPreviewPin,               // file handle to the driver
                     IOCTL_CS_PROPERTY,                     // I/O control code
                     &inputIOCTL,                           // in buffer
                     sizeof(CSPROPERTY),                    // in buffer size
                     pPreviewDataFormat,                    // 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 change image size.  Aborting\r\n")));
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

           task++;
            
           g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Image size modified by 1/4.\r\n")));
        }
#ifndef BSP_MX27
        else if ((elapsedTicks > 20000) && (task == 4)) // 20 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            // change window offset for preview
            pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 3;
            pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 3;

            if (!ChangeOffset(pPreviewDataFormat))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }
        else if ((elapsedTicks > 24000) && (task == 5)) // 25 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            // change window offset for preview
            pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 5;
            pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 5;

            if (!ChangeOffset(pPreviewDataFormat))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }

        else if ((elapsedTicks > 32000) && (task == 6)) // 25 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            // change window offset for preview
            pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 20;
            pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 20;

            if (!ChangeOffset(pPreviewDataFormat))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }

        else if ((elapsedTicks > 40000) && (task == 7)) // 25 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            // change window offset for preview
            pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 50;
            pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 50;

            if (!ChangeOffset(pPreviewDataFormat))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }
        else if ((elapsedTicks > 51000) && (task == 8)) // 44 seconds
        {

            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

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

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }

        else if ((elapsedTicks > 57000) && (task == 9)) // 44 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            // rotate image vertically for capture
            if (!ChangeFlipping(CS_VideoControlFlag_FlipVertical))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Offset modified.\r\n")));
        }

        else if ((elapsedTicks > 62000) && (task == 10)) // 44 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            if (!ChangeRotation(90))
            {
                goto vf_error;
            }

            // Restart viewfinder
            if (!PreviewSetState(CAMERA_STATE_PAUSE))
                return FALSE;

            if (!PreviewSetState(CAMERA_STATE_RUN))
                return FALSE;

            task++;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Rotated 90 degrees.\r\n")));
        }

        else if ((elapsedTicks > 72000) && (task == 11)) // 44 seconds
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            if (!ChangeRotation(0))
            {
                goto vf_error;
            }

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Done operations... Ending viewfinding.\r\n")));

            g_bKillFrameRateThread = TRUE;

            WaitForSingleObject(hFrameRateThreadShutdown, 10000);

            if (hFrameRateThread)
            {
                TerminateThread(hFrameRateThread, 0);
                CloseHandle(hFrameRateThread);
                hFrameRateThread = NULL;
            }
            if (NULL != pCsPin)
               free(pCsPin);
            if (NULL != pPreviewDataRange)            
               free(pPreviewDataRange);
            if (NULL != pPreviewDataFormat)            
               free(pPreviewDataFormat);
           
            return TRUE;
        }
#else
        else if ((elapsedTicks > 20000) && (task == 4)) // 20S
        {
            // Stop viewfinder
            if (!PreviewSetState(CAMERA_STATE_STOP))
                return FALSE;

            g_pKato->Log(CAM_ZONE_ERROR,
                (TEXT("PreviewISR: Done operations... Ending viewfinding.\r\n")));

            g_bKillFrameRateThread = TRUE;

            WaitForSingleObject(hFrameRateThreadShutdown, 10000);

            if (hFrameRateThread)
            {
                TerminateThread(hFrameRateThread, 0);
                CloseHandle(hFrameRateThread);
                hFrameRateThread = NULL;
            }

            if (NULL != pCsPin)
               free(pCsPin);
            if (NULL != pPreviewDataRange)            
               free(pPreviewDataRange);
            if (NULL != pPreviewDataFormat)            
               free(pPreviewDataFormat);
           
            return TRUE;
        }

#endif
    }

vf_error:
    // Stop viewfinder
    PreviewSetState(CAMERA_STATE_STOP);
    if (NULL != pCsPin)
      free(pCsPin);
    if (NULL != pPreviewDataRange)            
      free(pPreviewDataRange);
    if (NULL != pPreviewDataFormat)            
      free(pPreviewDataFormat);
           
    CAM_TEST_FUNCTION_EXIT();
    return FALSE;
}

#ifndef BSP_MX27
//------------------------------------------------------------------------------
//
// Function: StillCaptureAndDisplay
//
// This function turns on the still pin, captures an image, and
// writes it to the framebuffer.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
static void StillCaptureAndDisplay()
{
    CS_MSGQUEUE_BUFFER CsMsgQBuff;
    DWORD size, flags;
    CSPROPERTY_VIDEOCONTROL_MODE_S stillIOCTL;
    //DWORD dwBufferCommand;
    PCS_DATARANGE_VIDEO pStillDataRange;
    PCS_DATAFORMAT_VIDEOINFOHEADER pStillDataFormat;
    RECT rcFBDest;
    PCSP_PIN pCsPin;
    PCSMULTIPLE_ITEM pCSDataRangeItems;
    PCS_DATARANGE_VIDEO pCSDataRangeVideo;
    DWORD dwStructSize;
    CSBUFFER_INFO csBufferInfo;
    BOOL bResult = FALSE;
    
    stillIOCTL.Property.Set = PROPSETID_VIDCAP_VIDEOCONTROL;
    stillIOCTL.Property.Id = CSPROPERTY_VIDEOCONTROL_MODE;
    stillIOCTL.Property.Flags = CSPROPERTY_TYPE_SET;
    stillIOCTL.StreamIndex = 1;
    stillIOCTL.Mode = CS_VideoControlFlag_Trigger;

    // modify Still data format to fit LCD screen (240x320)

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

    if (NULL == pStillDataRange )
        return; 
        

⌨️ 快捷键说明

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