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

📄 capture1.cpp

📁 rfid在wince的平台的驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
#ifdef AUTO_ADJUST
	W(0x13, 0xa3);	//enable AGC, AEC
	W(0x06, 0x80);	//brightness
	W(0x10, 0x00);	//exposure
	W(0x00, 0x00);	//gain
#else
	W(0x13, 0xa0);	//disable AGC, AEC
	W(0x06, 0xa0);	//brightness
	W(0x10, 0x20);	//exposure
	W(0x00, 0x1f);	//gain
	//W(0x11, 0x00);	//gain
	//{ 0x14, 0x04 },		//00(04), bit5:QVGA
	//{ 0x28, 0x60 },		//60(80)	//select for 7141
#endif
}

void StartCapture()
{
	HANDLE	hthrd;
	int cbInput, cbOutput;

	if(!inited)
		return;
	if(started)
		return;
	started = 1;

//	lightcontrol(1, 1);

	cbInput = 0;
	cbOutput = 0;

	cbInput = sizeof(XLLP_OVERLAY_T);

	if (bCapturingVideo == FALSE)
	{
#ifdef DISPLAY_PIC
		ExtEscape(hDC, OVERLAY2_ENABLE, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL);
#endif

		hthrd = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CameraCaptureThread,NULL,0,NULL);
		CloseHandle(hthrd);
	}
}

void PauseCapture()
{
	if(!inited)
		return;
	if(!started)
		return;
	if(!bPauseCapture) {
		bPauseCapture = TRUE;
		WaitForSingleObject(hPausedEvent, 300);
//		lightcontrol(0, 0);
	} else {	//save picture
	//	extern int savetobmpfile(const void * buf, unsigned int len, unsigned int width, unsigned int height, unsigned int bpp, const char * path);
		//savetobmpfile(pOverlay2_Y, XllpOverlay.ch2_size, XllpOverlay.OverlayWidth, \
		//	XllpOverlay.OverlayHeight, 8, "/cap-lcd.bmp");
	//	savetobmpfile(ring_buffer_address[frameCount], CameraApp.VideoWidth * CameraApp.VideoHeight, \
	//		CameraApp.VideoWidth, CameraApp.VideoHeight, 8, "/cap-raw.bmp");
	}
}

void ContinueCapture()
{
	if(!inited)
		return;
	if(!started)
		return;
	if(bPauseCapture) {
//		lightcontrol(1, 1);
		bPauseCapture = FALSE;
		SetEvent(hContinueEvent);
	}
}

void StopCapture()
{
	int cbInput, cbOutput;

	if(!inited)
		return;
	if(!started)
		return;
	started = 0;

//	lightcontrol(0, 0);

	cbInput = 0;
	cbOutput = 0;

	cbInput = sizeof(XLLP_OVERLAY_T);

	// can't disable when the L clk is too high
#ifdef DISPLAY_PIC
	ExtEscape(hDC, OVERLAY2_DISABLE, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL);
#endif

	bCapturingVideo = FALSE;

	// for the case that capture already paused, let the thread go and exit
	ContinueCapture();
}

int InitCapture()
{
	int cbInput, cbOutput;
	unsigned int i;
	cbInput = sizeof(XLLP_OVERLAY_T);
	cbOutput = 0;
	hDC = CreateDC(NULL, NULL, NULL, NULL);
	NKDbgPrintfW(_T("\t\thDC:0x%x\r\n"), hDC);
	// Fill in the overlay parameters, then query for the dynamic address of the overlay channels
	//XllpOverlay.OverlayWidth = 240;
	//XllpOverlay.OverlayHeight = 270;
	//XllpOverlay.X_Position = (240 - XllpOverlay.OverlayWidth) / 2;
	//XllpOverlay.Y_Position = 25;
#ifdef DISPLAY_PIC
	XllpOverlay.OverlayWidth = 214;
	XllpOverlay.OverlayHeight = 160;
	XllpOverlay.X_Position = 13;
	XllpOverlay.Y_Position = 50;

	XllpOverlay.Format = FORMAT_PLANAR_422;
	XllpOverlay.OverlayBPP = O_BPP_16;
	XllpOverlay.DegradeBaseFrame = FALSE;

	if(ExtEscape(hDC, GET_OVERLAY2_ADDRESS, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL) <= 0)
	{
		//error or not support
		ERRORMSG(1,(TEXT("ExtEscape get_overlay2_address error\r\n")));
		return -1;
	}
	// Copy YUV data to buffers pointed to by .CH2, .CH3, .CH4 (addresses filled in by video driver)
	pOverlay2_Y = (PBYTE)VirtualAllocCopy(320*240*4,"pOverlay2_Y",(PVOID)(XllpOverlay.CH2_Y));
	pOverlay2_Cb = (PBYTE)VirtualAllocCopy(320*240,"pOverlay2_Cb",(PVOID)(XllpOverlay.CH3_Cb));
	pOverlay2_Cr = (PBYTE)VirtualAllocCopy(320*240,"pOverlay2_Cr",(PVOID)(XllpOverlay.CH4_Cr));
#endif

#ifdef FULL_CAPTURE_SIZE
	CameraApp.VideoWidth = 640;
	CameraApp.VideoHeight = 480;
#else
	CameraApp.VideoWidth = XllpOverlay.OverlayWidth;
	CameraApp.VideoHeight = XllpOverlay.OverlayHeight;
#endif
	CameraApp.StillWidth = 640;	
	CameraApp.StillHeight = 480;
	CameraApp.CaptureFormat = FORMAT_RAW_8;
	CameraApp.FrameRate = 0; // 0 = max frame rate available
	
	// Initialize the Camera with our settings
	cbInput = sizeof(CAMERA_APP_T);
	if(ExtEscape(hDC, CAMERA_INITIALIZE, cbInput, (LPCSTR)&CameraApp, cbOutput, NULL) <= 0) {
		ERRORMSG(1,(TEXT("ExtEscape camera_initialize error\r\n")));
		return -2;
	}

	if(CameraApp.frame_nums <= 0) {
		ERRORMSG(1,(TEXT("got camera frame nums: %d!\r\n"), CameraApp.frame_nums));
		return -3;
	}
	for (i = 0; i < CameraApp.frame_nums; i++)
	{
		ring_buffer_address[i] = (void *)VirtualAllocCopy(CameraApp.VideoWidth * CameraApp.VideoHeight ,"ringbuffer",(PVOID)(CameraApp.ring_buffer_address[i]));
		if(!ring_buffer_address[i]) {
			ERRORMSG(1,(TEXT("map ring buffer(%d) address error!\r\n"), i));
			return -4;
		}
	}

	// capture thread waits on this event for each frame
	hEvent = CreateEvent(NULL, FALSE, FALSE, CAMERA_EVENT_NAME);
	if(!hEvent) {
		ERRORMSG(1,(TEXT("create event failed! 0x%x\r\n"),GetLastError()));
		return -5;
	}

	hContinueEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	hPausedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	//wsizecontrol();
	//cisizecontrol();
	setregisters();

	inited = 1;

	return 0;
}

void DeinitCapture()
{
	int status;

	if(!inited)
		return;
	if(started)
		StopCapture();
	status = ExtEscape(hDC, CAMERA_DEINIT, 0, NULL, 0, NULL);
	if(status <= 0)
		ERRORMSG(1,(TEXT("deinit capture fail, 0x%x(0x%x)\r\n"), status, GetLastError()));
}

#define PAGE_SIZE 0x1000
#define ALIGNMENT_MASK (PAGE_SIZE-1)
extern "C" BOOL VirtualCopy( 
  LPVOID lpvDest, 
  LPVOID lpvSrc, 
  DWORD cbSize, 
  DWORD fdwProtect 
);

static PVOID VirtualAllocCopy(unsigned size,char *str,PVOID pVirtualAddress)
{
	PVOID ptr;
    unsigned offset;

	offset = (unsigned)pVirtualAddress & ALIGNMENT_MASK;

	size +=offset ? PAGE_SIZE : 0;
	ptr = VirtualAlloc(0,size,MEM_RESERVE,PAGE_NOACCESS);
	if (ptr == NULL) {
		ERRORMSG(1,(TEXT("VirtualAlloc failed! %s : size=0x%x, (0x%x)\r\n"),str,size,GetLastError()));
		return(0);
	}

	if (!VirtualCopy((PVOID)ptr,(PVOID)((unsigned)pVirtualAddress - offset),size,PAGE_READWRITE|PAGE_NOCACHE)) {
		ERRORMSG(1,(TEXT("VirtualCopy failed! %s : addr=0x%x, offset=0x%x(0x%x)\r\n"),str,(unsigned)pVirtualAddress,offset,GetLastError()));
		return(0);
	}  
	return((PVOID)((PBYTE)ptr+offset));
}

void SavePic(void *p)
{
	memcpy(p, ring_buffer_address[frameCount], 640*480);
}

void SeePic(void *p)
{
//	XllpOverlay.OverlayWidth = 230;
//	XllpOverlay.OverlayHeight = 188;
//	CameraApp.StillWidth = 640;	
//	CameraApp.StillHeight = 480;
/*	unsigned int i,j,t,w;
	unsigned char * src = new unsigned char[XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth];
	unsigned char * dst = pOverlay2_Y;
	int rt_Height = (CameraApp.StillHeight-
					 (CameraApp.StillHeight % XllpOverlay.OverlayHeight))/
					 XllpOverlay.OverlayHeight;
	int rt_Width = (CameraApp.StillWidth-
					(CameraApp.StillWidth % XllpOverlay.OverlayWidth))
					/XllpOverlay.OverlayWidth;
	unsigned long rtf_Height = CameraApp.StillHeight/XllpOverlay.OverlayHeight;
	unsigned long rtf_Width = CameraApp.StillWidth/XllpOverlay.OverlayWidth;
	
//图片缩放
	for(i=0; i<XllpOverlay.OverlayHeight; i++)
		for (j=0; j<XllpOverlay.OverlayWidth; j++)
		{
			t=(int)((i+1)*rtf_Height);
			w=(int)((j+1)*rtf_Width);
			if (t>CameraApp.StillHeight||w>CameraApp.StillWidth)
			{
				AfxMessageBox(_T("chang size error"));
				return;
			}
			t-=1;
			w-=1;
			*(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + t*CameraApp.StillWidth+w);
		}

	memcpy(dst, src, XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth);
	delete(src);
	*/
#ifdef DISPLAY_PIC
	unsigned int i,j;
	unsigned int size;
	size = XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth;
	unsigned char * src = new unsigned char[size];
	unsigned char * dst = pOverlay2_Y;
	memset(src, 0, size);
	for(i=0; i<XllpOverlay.OverlayHeight; i++)
	{
		for (j=0; j<XllpOverlay.OverlayWidth; j++)
		{
		//	*(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + (TOP_SPACE_LINE+i*2)*CameraApp.StillWidth+LEFT_SPACE_LINE+j*2);
			*(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + 3*i*CameraApp.StillWidth+3*j);
		}
	}
	memcpy(dst, src, XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth);
	delete(src);
#endif
}

⌨️ 快捷键说明

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