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

📄 btcamera.cpp

📁 蓝牙
💻 CPP
字号:
#include <stdlib.h>#include <sys/mman.h>#include "btcamera.h"#include "byjpeg.h"#include "bycmd.h"#include "webcamclient.h"#include "btrmtdevmgr.h"#include "inifile.h"#include "global.h"#include "xlog.h"#include "btsocket.h"#include "bthandsfree.h"extern int g_nCamDataPos;extern std::string g_strPeerJjtId;// 摄像头BTCONNHDL g_hSppCamera = BTSDK_INVALID_HANDLE;BTDEVHDL g_hDevCamera = BTSDK_INVALID_HANDLE;BTUINT8 g_nComCamera = 0xFF;char g_szCameraNo[128] = "0001";bool g_bCameraConnected = false;BTUINT8 g_szCameraAddr[BTSDK_BDADDR_LEN];BTUINT8 g_szOldCameraAddr[BTSDK_BDADDR_LEN];extern char EIMCode[10];extern int localx;extern int localy;extern int localwidth;extern int localheight;extern int remotex;extern int remotey;extern int remotewidth;extern int remoteheight;bool g_bCamSend = false;int g_nSendType = 0;#define CAM_WIDTH (320/2)#define CAM_HEIGHT (240/2)WebCamClient g_webCamClient;bool g_bTestUdp = false;char g_camDestAddr[128] = "127.0.0.1";#define VF_BYTES_PER_PIXEL 2#define FB_DEVICE "/dev/fb0"static int fd_fb = -1;static unsigned short *fb_map = NULL;#define VF_IMAGE_SIZE (CAM_WIDTH * CAM_HEIGHT * VF_BYTES_PER_PIXEL)unsigned char* g_rgb888 = NULL;unsigned char* g_rgb565 = NULL;void rgb888_to_rgb565(int nx, int ny, unsigned char* rgb888, unsigned char* rgb565){	unsigned char* src = rgb888;	unsigned char* dst = rgb565;	unsigned char* posSrc;	unsigned char* posDst;	unsigned char r, g, b;	for (int i = 0; i < ny; i++)	{		posSrc = src;		posDst = dst;		for (int j = 0; j < nx; j++)		{			// fix me,要不然红蓝反了			r = *posSrc++;			g = *posSrc++;			b = *posSrc++;			*((unsigned short*)posDst) = (unsigned short)(((r >> 3) << 11) | ((g >> 2) << 5)| ((b >> 3) << 0));			posDst += 2;		}		src += nx * 3;		dst += nx * 2;	}}void display_jpeg(const char* jpeg, int len){	if (!jpeg)	{		printf("jpeg is NULL!!!!\n");		return;	}	if (!jpeg_to_rgb(jpeg, len, (char*)g_rgb888, CAM_WIDTH * CAM_HEIGHT * 3, CAM_WIDTH, CAM_HEIGHT))	{		printf("jpeg_to_rgb failed\n");		DisconnectCamera();		return;	}	rgb888_to_rgb565(CAM_WIDTH, CAM_HEIGHT, g_rgb888, g_rgb565);	int i, j;	unsigned short* pfb = fb_map;	int x = (640 - CAM_WIDTH) / 2;	int y = (480 - CAM_HEIGHT) / 2;	for (i = 0; i < CAM_HEIGHT; i++)	{		pfb = fb_map + (CAM_HEIGHT - i - 1 + y) * 640 + x;		for (j = 0; j < CAM_WIDTH; j++)		{			*((unsigned short*)pfb + j)=*((unsigned short*)g_rgb565 + CAM_WIDTH*i + j);		}	}}void display_jpeg_dynamic(const char* jpeg, int len,int xpos,int ypos,int width,int height){	if (!jpeg)	{		printf("jpeg is NULL!!!!\n");		return;	}	if (!jpeg_to_rgb(jpeg, len, (char*)g_rgb888, width * height * 3, width,height))	{		printf("jpeg_to_rgb failed\n");		DisconnectCamera();		return;	}	rgb888_to_rgb565(width,height,g_rgb888, g_rgb565);	int i, j;	unsigned short* pfb = fb_map;	int x = xpos;	int y = ypos;	for (i = 0; i < height; i++)	{		pfb = fb_map + (height - i - 1 + y) * 640 + x;		for (j = 0; j < width; j++)		{			*((unsigned short*)pfb + j)=*((unsigned short*)g_rgb565 + width*i + j);		}        }}bool ConnectToWebCamServer(){	if (g_webCamClient.m_bConnected)		return true;	IniFile ini;	ini.Open("minibox.conf");	std::string ip = ini.Read("camera", "web_camera_ip", "");	std::string port = ini.Read("camera", "web_camera_port", "");	// std::string web_cam_no = ini.Read("camera", "web_camera_user_no", "");	std::string web_cam_no = ini.Read("BYIM", "jjtid", "");	printf("%s:%s, %s\n", ip.c_str(), port.c_str(), web_cam_no.c_str());	g_webCamClient.Close();	g_webCamClient.Create();	g_webCamClient.m_bConnected = false;        if (g_webCamClient.Connect(ip.c_str(), atoi(port.c_str())))	{		g_webCamClient.m_bConnected = true;		char head[9];		int n;		strcpy(head, "0001");		n = g_webCamClient.Send("0001", 4);                if(n>0)		{		        printf("3333333333333333333333333333333333333333333333333333333333333333333333333333333\n");         	}			strcpy(head, "000008");		n += g_webCamClient.Send("000008", 6);                          if(n>0)		{		        printf("4444444444444444444444444444444444444444444444444444444444444444444444444444444\n");         	}				n += g_webCamClient.Send(web_cam_no.c_str(), web_cam_no.length());                if(n>0)                {		        printf("5555555555555555555555555555555555555555555555555555555555555555555555555555555\n");		}	         	printf("%d\n", n);		return true;	}	return false;}bool ConnectToCamera(int n){	if (g_rgb565)	{		delete[] g_rgb565;		g_rgb565 = NULL;	}	g_rgb565 = new unsigned char[CAM_WIDTH * CAM_HEIGHT * 2];	if (g_rgb888)	{		delete[] g_rgb888;		g_rgb888 = NULL;	}	g_rgb888 = new unsigned char[CAM_WIDTH * CAM_HEIGHT * 3];	if (fd_fb == -1)	{		if ((fd_fb = open(FB_DEVICE, O_RDWR)) <= 0)		{			printf("Frame buffer %s open error!\n", FB_DEVICE);		}		else		{			printf("Use %s as frame buffer device.\n", FB_DEVICE);			if (fb_map == NULL)			{				if ((fb_map = (unsigned short*)mmap(0, 640 * 480 * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0)) == 0)				{					printf("Error: failed to map framebuffer device %s.\n", FB_DEVICE);					close(fd_fb);					fd_fb = -1;				}			}		}	}	DisconnectCamera();	BtSdkSPPConnParamStru comstru;	comstru.size = sizeof(BtSdkSPPConnParamStru);	comstru.mask = 0;	comstru.com_index = 7;	char no[128];	sprintf(no, "addr%d", n);	sprintf(g_szCameraNo, "%04d", n);	IniFile ini;	ini.Open("minibox.conf");	std::string addr = ini.Read("camera", no, "");	if (addr.empty())	{		printf("摄像头地址为空\n");		return false;	}	ParseBtAddr(addr.c_str(), g_szCameraAddr);	memcpy(g_szOldCameraAddr, g_szCameraAddr, sizeof(g_szCameraAddr));	OutputBtAddr(g_szCameraAddr);	printf("%s %s\n", no, g_szCameraNo);	g_hDevCamera = Btsdk_AddRemoteDevice(g_szCameraAddr);	BTINT32 result = Btsdk_StartClientEx(g_hDevCamera, BTSDK_CLS_SERIAL_PORT, 0, &g_hSppCamera);	// BtSdkConnectionPropertyStru conn_prop;	// Btsdk_GetConnectionProperty(g_hSppCamera, &conn_prop);	g_bCameraConnected = false;	g_nCamDataPos = 0;        if (result == BTSDK_OK)        {		LOG(DEBUG, "ConnectToCamera 成功\n");		g_bCameraConnected = true;		g_nComCamera = Btsdk_GetClientPort(g_hSppCamera);        	std::string count = ini.Read("camera", "frames_per_second", "1");		printf("%s\n", count.c_str());		IpcPacket o(CAM_START);		o.Write32(atoi(count.c_str()));		RcvSdrvData(g_nComCamera, (char*)o.GetPtr(), o.GetSize());	}	else if (result == BTSDK_ER_CONNECTION_EXIST)	{		LOG(DEBUG, "ConnectToCameraConnection exist\n");		g_bCameraConnected = true;	}    else	{		LOG(DEBUG, "ConnectToCamera %lu\n", result);        g_bCameraConnected = false;    }	return g_bCameraConnected;}void StopCameraSend(){	IpcPacket o(CAM_STOP);	RcvSdrvData(g_nComCamera, (char*)o.GetPtr(), o.GetSize());}void DisconnectCamera(){	if (g_hSppCamera != BTSDK_INVALID_HANDLE)	{		StopCameraSend();		BTINT32 result = Btsdk_Disconnect(g_hSppCamera);		if (result == BTSDK_OK)		{			LOG(DEBUG, "断开 SPP 连接成功\n");			g_nComCamera = 0xFF;                        /*			char head[128] = { 0 };		        int n;			strcpy(head,"0007");		        n = g_webCamClient.Send(head, 4);		        sprintf(head, "%06d", 4);			n = g_webCamClient.Send(head, 6);                                                strcpy(head, g_szCameraNo);                         n = g_webCamClient.Send(head, 4);	         	printf("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\n");*/		}		else		{			LOG(DEBUG, "断开 SPP 连接失败\n");		}	}	if (g_rgb888)	{		delete[] g_rgb888;		g_rgb888 = NULL;	}	if (g_rgb565)	{		delete[] g_rgb565;		g_rgb565 = NULL;	}	g_nCamDataPos = 0;	g_hSppCamera = BTSDK_INVALID_HANDLE;	g_bCameraConnected = false;}void ProcessCamData(const IpcPacket& in){	static char buf[50 * 1024] = { 0 }; 	int n ;               int size; 	size = in.ReadData(buf);	// printf("ProcessCamData, %d, %d, %d\n", in.GetSize(), g_bCamSend, size);	if (g_bCamSend && g_nSendType == 0)	{		if (fd_fb != -1 && fb_map)		{			if (!g_rgb565)				g_rgb565 = new unsigned char[CAM_WIDTH * CAM_HEIGHT * 2];			if (!g_rgb888)				g_rgb888 = new unsigned char[CAM_WIDTH * CAM_HEIGHT * 3];			display_jpeg(buf, size);		}		else			printf("Can not display jpeg\n");		 if (g_bTestUdp)		 {		 	IpcPacket o(in.GetCmd());		 	o.WriteData(buf, size);		 	g_btSock.SendTo(o, BY_MAIN_PORT, g_camDestAddr);		 }	}	if (g_bCamSend && g_nSendType == 1)	{		if (fd_fb != -1 && fb_map)		{			if (!g_rgb565)				g_rgb565 = new unsigned char[localwidth * localheight* 2];			if (!g_rgb888)				g_rgb888 = new unsigned char[localwidth * localheight* 3];                        display_jpeg_dynamic(buf, size,localx,localy,localwidth,localheight);			printf("%d\n",localx);			printf("%d\n",localy);			printf("%d\n",localwidth);			printf("%d\n",localheight);		}		else			printf("Can not display jpeg\n");		if (g_bTestUdp)		{		 	IpcPacket o(in.GetCmd());		 	o.WriteData(buf, size);		 	g_btSock.SendTo(o, BY_MAIN_PORT, g_camDestAddr);		}        }	if (g_webCamClient.m_bConnected)	{		char head[128] = { 0 };		int n;		if (g_nSendType == 1)                { 			strcpy(head, "0041");                }		else			strcpy(head,"0002");		// printf("%s\n", head);		n = g_webCamClient.Send(head, 4);                if (g_nSendType == 0)		{                        size+=4; 			sprintf(head, "%06d", size);			n = g_webCamClient.Send(head, 6);                }                if (g_nSendType == 1)                {                        size+=12;			sprintf(head, "%06d", size);			n = g_webCamClient.Send(head, 6);                }		strcpy(head, g_szCameraNo); // 摄像头编号		n = g_webCamClient.Send(head, 4);                if (g_nSendType == 1)		{			n = g_webCamClient.Send(EIMCode,8);			printf("%s\n",EIMCode);		}                if (g_nSendType == 1)		{                        size-=12;                        n = g_webCamClient.Send(buf, size);                        if(n!=size)                 		printf("send failed, len = %d, n = %d\n", size, n);			else				printf("send ok\n");                }                if (g_nSendType == 0)		{                        size-=4;                        n = g_webCamClient.Send(buf, size);                        if(n!=size)                 		printf("send failed, len = %d, n = %d\n", size, n);			else				printf("send ok\n");                }	}}

⌨️ 快捷键说明

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