Example #1
0
void CameraThread(cyg_addrword_t pParam)
{
	//IMG_COMP_INFO iPreImage;
#ifdef RECORDER
	LIST *plPic2Mail;	//待发文件列表
	time_t tMail;	//上次发送邮件的时间
	BOOL bSendIpMail = FALSE;
#endif
	MSG_T msg;	//消息
	unsigned int usedlen=0;
	BOOL bExit = FALSE;	//退出标志
	//BOOL bSendIpMail = TRUE; //是否发送IPdata的标志
	BOOL RecordInit = FALSE;
	
	UsedBuf* AsBuf = (UsedBuf*)pParam;
	W99702_DATA_EXCHANGE_T g_dataW99702;
	memset(&g_dataW99702, 0, sizeof(W99702_DATA_EXCHANGE_T));
	
	if (AsBuf == NULL) 
	{
		diag_printf("Camera do not have enough buf\n");
		return;
	}
	
	g_WebCamState.acImgBuf[0] = (char *)Asmalloc(AsBuf,&usedlen,MAX_CAMERA_IMG_LENGTH);	
	g_WebCamState.acImgBuf[1] = (char *)Asmalloc(AsBuf,&usedlen,MAX_CAMERA_IMG_LENGTH);
	if((g_WebCamState.acImgBuf[0] == NULL) || (g_WebCamState.acImgBuf[1] == NULL))
	{
		diag_printf("not enough buf for camera\n");
		return;
	}
			
	/*assigned buffer for rtsp and recorder*/	
	if(Buffer_Assign() == FALSE)
	{
		diag_printf("not enough buffer for rtsp");
		return;
	}
	
#ifdef RECORDER	
	plPic2Mail =(LIST*) CreateFileList();
	tMail = mytime();
#endif
	//iPreImage.pcBmpBuf = NULL;	
	
	while (!bExit)
	{	
		int iC = 0, tm;
		if (!TryGetMsg(g_pMsgCamera, &msg))
		{
#ifdef RECORDER
			Do_TestSendIpMail(&bSendIpMail);
#endif
			W99702_OpenCamera(&g_dataW99702,AsBuf,&usedlen);			
		}
		else if (msg.lMsg == MSG_QUIT) break;
		else
		{
			if (msg.lMsg == MSG_CAMERA_MONITOR_RECT
				|| msg.lMsg == MSG_CUSTOM_PROC)
				free((void *)msg.lData);
			continue;
		}
		
		g_WebCamState.ucCamera = CAMERA_ON;
		SetCameraInitState();
		iC = 0;tm = mytime();	
	
		//cyg_thread_create(PTD_PRIORITY, &GetAudioThread, (cyg_addrword_t) &g_dataW99702, "ptdGetAudio", ptdGetAudio_stack, STACKSIZE2, &ptdGetAudio_handle, &g_ptdGetAudio);
		//if ( ptdGetAudio_handle == NULL)
		//{
		//	fprintf(stderr, "Thread for ftp creation failed!\n");
		//	return;
		//}
		//cyg_thread_resume(ptdGetAudio_handle);
		
		while (!bExit)
		{
		
			if (!TryGetMsg(g_pMsgCamera, &msg))
			{
				int iNextReadyImg;
				char *pcJpeg;
				int *piJpegLen;
#ifdef RECORDER
				Do_TestSendIpMail(&bSendIpMail);
#endif
				iNextReadyImg = g_WebCamState.iReadyImg + 1;
				if (iNextReadyImg >= 2) iNextReadyImg = 0;
				pcJpeg = g_WebCamState.acImgBuf[iNextReadyImg];
				piJpegLen = &g_WebCamState.iImgBufLen[iNextReadyImg];
				if (W99702_GetOneImage(pcJpeg, MAX_CAMERA_IMG_LENGTH, piJpegLen,&g_dataW99702,RecordInit)
					&& (g_pOnGetImage == NULL || (*g_pOnGetImage)(pcJpeg, *piJpegLen)))
				{
					BOOL bMotionDetected = FALSE;
					if (TRUE)	//!bErrorImage)
					{						
						SaveJpeg(pcJpeg, *piJpegLen, bMotionDetected);						
					}
				}
				else
				{
					diag_printf("Return false\n");
					//break;	//读图像错误,退出,等待用户再次开启
				}
			}
			else 
			{
				diag_printf("Get message: %d\n", msg.lMsg);
				switch(msg.lMsg)
				{			
				case MSG_EXTERNEL_DETECTOR:     //??????
					break;
								
				case MSG_QUIT:
					bExit = TRUE;
					break;
				
				case MSG_CAMERA_MOTION:
#ifdef RECORDER
					wb702EnableMotionDetect ((g_ConfigParam.ucMotionDetectWay == MOTION_DETECT_SOFT ? TRUE : FALSE),
						CMD_MOTION_DETECT_MIDDLE);	
				
					if(g_ConfigParam.ucMotionDetectWay == MOTION_DETECT_SOFT)
					{
						recorder_memset();
						RecordInit = TRUE;
						diag_printf("Montion Dectect Enable!\n");
					}
					else
					{	
						RecordInit = FALSE;	
						recorder_dis();						
						diag_printf("Montion Dectect Disable!\n");
					}
#endif
					break;
				
				case MSG_CAMERA_DIRECTION:
					{
						int iResX, iResY;
						CMD_ROTATE_E eRotate = -1;
						W99702_GetImageResolution ( &iResX, &iResY);
						switch (msg.lData)
						{
							case 0x00:	eRotate = CMD_ROTATE_NORMAL;	break;
							case 0x01:	eRotate = CMD_ROTATE_FLIP;		break;
							case 0x02:	eRotate = CMD_ROTATE_MIRROR;	break;
							case 0x03:	eRotate = CMD_ROTATE_R180;		break;
							default:	eRotate = -1;
						}
						if (eRotate != -1)
						{
							wb702SetLocalVideoSource (iResX, iResY, eRotate);
							g_WebCamState.eRotate = eRotate;
							g_WebCamState.ucX_Direction = (unsigned char) ((msg.lData & 0x02) >> 1);
							g_WebCamState.ucY_Direction = (unsigned char) (msg.lData & 0x01);
						}
					}
					break;
				
				case MSG_CAMERA_RES:
					{
						BOOL bRt = FALSE;
						/*H163 not support 320*240 and 640*480, if set these resolution revert to 352*288*/
						switch (msg.lData)
						{
						case 0:
							bRt = W99702_SetImageResolution(176, 144,&g_dataW99702); break;
						case 1:
						{
							if (g_ConfigParam.eVideoFormat == CMD_VIDEO_H263)
							{
								msg.lData = 2;	//Try 352*288
								bRt = W99702_SetImageResolution(352, 288,&g_dataW99702);
							}
							else
								bRt = W99702_SetImageResolution(320, 240,&g_dataW99702);
							break;
						}
						case 2:
							bRt = W99702_SetImageResolution(352, 288,&g_dataW99702); break;
						case 3:
						{
							if (g_ConfigParam.eVideoFormat == CMD_VIDEO_H263)
							{
								msg.lData = 2;	//Try 352*288
								bRt = W99702_SetImageResolution(352, 288,&g_dataW99702);
							}
							else
								bRt = W99702_SetImageResolution(640, 480,&g_dataW99702);
							break;
						}
						default:
							;
						}

						if (bRt == TRUE)
						{
							g_WebCamState.ucResolution = msg.lData;	
						}							
					}
					break;
				
				case MSG_CAMERA_QUALITY:
					if (W99702_SetImageQuality( msg.lData,&g_dataW99702))
						g_WebCamState.ucCompressionRatio = msg.lData;
					break;
				
				case MSG_CAMERA_FRAMERATE:
					if (W99702_SetFramerate( msg.lData,&g_dataW99702))
						g_WebCamState.ucFramerate = msg.lData;
					break;
				
				case MSG_CAMERA_BRIGHTNESS:			
					if((W99702_SetImageBrightness((int)msg.lData, &g_dataW99702)) == TRUE)
						g_WebCamState.ucBright = msg.lData;
					diag_printf("Image brightness is %d\n",g_WebCamState.ucBright);
					break;
				
				case MSG_SPEAKER_VOLUME:
					if(( W99702_SetSpeakerVolume((int)msg.lData,&g_dataW99702))==TRUE)
						g_WebCamState.ucSpeakerVolume = msg.lData;
					diag_printf("Speaker volume is %d\n",g_WebCamState.ucSpeakerVolume);
					break;
				
				case MSG_MIC_VOLUME:
					if(( W99702_SetMicVolume((int)msg.lData,&g_dataW99702))==TRUE)
						g_WebCamState.ucMicVolume = msg.lData;
					diag_printf("mic volume is %d\n",g_WebCamState.ucMicVolume);
					break;
				case MSG_SET_LOGO:
					{
						int i;
						wb702EnableDrawImageTime(false);
						
						for(i = 0; i < 2; i++)
						{
	            			switch(g_ConfigParam.ShowPos[i])
    	        			{
        	       				case 0:
            	        			wb702SetDrawContent(i, g_ConfigParam.ShowString[i],0,0);
                	    			break;
								case 1:
									wb702SetDrawContent(i, g_ConfigParam.ShowString[i],-1,0);
									break;
								case 2:
									wb702SetDrawContent(i, g_ConfigParam.ShowString[i],0,-1);
									break;
								case 3:
									wb702SetDrawContent(i, g_ConfigParam.ShowString[i],-1,-1);
									break;
								default:
									break;
							}
							diag_printf("show string %s at position %d\n",g_ConfigParam.ShowString[i],g_ConfigParam.ShowPos[i]);
						}
           				break;
					}
				default:
					diag_printf("Unknown msg: %d\n", msg.lMsg);
				}
			}
		}
		
		//Audio_Exit();
		W99702_CloseCamera(&g_dataW99702);
		g_WebCamState.ucCamera = CAMERA_OFF;
#ifdef RECORDER
		Do_TestSendMail(&plPic2Mail, &tMail, TRUE);
#endif
	}
Example #2
0
/**
* @brief JPEG manager thread
* @param arg [I ] Not used.
* @return 0 on normal end.
*/
void *JpgMngThr(void *arg)
{
	int nState, nSetFlg;
	unsigned short nFlg;
	while(!(GetJpgState(0) & JPG_THR_EXIT)){
		JPG_DBG("Ready\n");
		while(!((nState = GetJpgState(JPG_RUN | JPG_DST_MASK | JPG_STOP)) & (JPG_RUN | JPG_THR_EXIT))){
			if(SemWait(hAlarmStatusSem) == 0){
				nFlg = pSysinfo->lan_config.alarmstatus & (~FLG_UI_JPG);
				if(!(nFlg & (FLG_UI_AVI | FLG_UI_JPG)))
					nFlg &= (~FLG_UI_RECORD);
				fSetAlarmStatus(nFlg);
				SemRelease(hAlarmStatusSem);
			}
			JPG_DBG("JpgMngThr sleep\n");
			pthread_cond_wait(&gJpgRunCond, &gJpgConMutex);
			JPG_DBG("JpgMngThr Wake up\n");
		}
		if(JPG_THR_EXIT & nState)
			break;
		nSetFlg = 0;
		if(!pSysinfo->lan_config.Supportstream1){
			JPG_DBG("Jpeg stream not support\n");
			continue;
		}
		if(SemWait(hAlarmStatusSem) == 0){
			nFlg = pSysinfo->lan_config.alarmstatus | FLG_UI_JPG |	FLG_UI_RECORD;
			fSetAlarmStatus(nFlg);
			SemRelease(hAlarmStatusSem);
		}
		JPG_DBG("Jpeg Run\n");
		if((nState & JPG_DST_MASK) == 0){
			JPG_ERR("Unknown jpeg file destination\n");
			continue;
		}
#if 0
		if(nState & JPG_TO_SMTP)
			DoJpegDispatch(NULL, JPG_DISPATCH_TO_SMTP);
		if(nState & JPG_TO_FTP)
			DoJpegDispatch(NULL, JPG_DISPATCH_TO_FTP);
		if(nState & JPG_TO_SD)
			SaveJpegToSD();
		else
			sleep(5);
#else
		if(nState & JPG_TO_SMTP)
			nSetFlg |= FILE_DISPATCH_TO_SMTP;
		if(nState & JPG_TO_FTP)
			nSetFlg |= FILE_DISPATCH_TO_FTP;
		if(nState & JPG_TO_SD)
			nSetFlg |= FILE_DISPATCH_TO_SD;
		if(gFileDispCount < FILE_DISP_THR_LIMIT){
			JPG_DBG("nSetFlg is 0x%x\n", nSetFlg);
			SaveJpeg(nSetFlg);
		} else
			printf("Jpeg save limit \n");
#endif
	}
	JPG_DBG("Thread exit\n");
	return (void *)0;
}