📄 camtest.cpp
字号:
// 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 + -