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

📄 consolesample.c

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include "mainprofile_error.h"
#include "typedef.h"

#ifdef _WIN32
#include <direct.h>
#include <io.h>
#define	RECORD_ROOT_PATH		"c:\\H263Files"
#define	DECODER_ROOT_PATH		"C:\\DecoderCbFile"
#define	CHAR_PATH_SEP			'\\'
#else
#include <pthread.h>
#include <sys/time.h>

#define	RECORD_ROOT_PATH		"H263Files"
#define	DECODER_ROOT_PATH		"DecoderCbFile"
#define	CHAR_PATH_SEP			'/'
#endif // _WIN32

#define	_DO_FILE_IO
#define	MAX_GOP_FILE_NUM		100

TCHANNEL_INFO	g_Channel_Info[MAX_CHANNELS];
int				g_iFocus = 0;
char			g_szUpgradeFile[256];

#ifdef _WIN32
#define	STRICMP				stricmp
#define	STRNINCMP			strnicmp

CRITICAL_SECTION	g_CS[MAX_CHANNELS];
#else
#define	STRICMP				strcasecmp
#define	STRNICMP			strncasecmp
pthread_mutex_t g_CS[MAX_CHANNELS];
#endif // _WIN32

//HANDLE			g_ExitWait[MAX_CHANNELS];
BOOL			g_bExitFlag[MAX_CHANNELS];
HANDLE			g_hDataBroker;
HANDLE			g_hAvSync;
int				g_nMaxChannel = 1;
BOOL			g_bExit = FALSE;
int				g_nMaxDecoderFileNum = 50;
char			g_szExtName[5] = "bmp";
int				g_nType = 0;
int				g_nTimeout = 0;
BOOL			g_bFlushUart = FALSE;
int				g_nUpgradeTimes = 1;
DWORD			g_nUpgradeLoopWait = 5000;
BOOL			g_bCBDecoder = TRUE;
#ifdef _AVSYNC
EPIXELFORMAT	g_eAVRawType = PF_BMP24;
#endif // _AVSYNC

SCODE __stdcall DataBrokerAVCallBack(DWORD dwContext,TMediaDataPacketInfo *pMediaDataPacket);
SCODE __stdcall DataBrokerInputAVCallBack(DWORD dwContext,TMediaDataPacketInfo *pMediaDataPacket);
SCODE __stdcall DataBrokerStatusCallBack(DWORD dwContext, TDataBrokerStatusType tStatusType, PVOID pvParam1, PVOID pvParam2);
SCODE __stdcall DataBrokerInputStatusCallBack(DWORD dwContext, TDataBrokerStatusType tStatusType, PVOID pvParam1, PVOID pvParam2);
SCODE __stdcall DataBrokerNetPacketCallback(DWORD dwContext, DWORD dwMediaType, DWORD dwLen, BYTE *pbyPacket);

#ifdef _AVSYNC
SCODE __stdcall AvSynchronizerDecodeCallback(DWORD dwContext, TMediaType tFrameType, TFRAMEINFO * tframeinfo );
#endif // _AVSYNC

void OutputUsage(const char *pszProgName, int nType);
int Connect_Channel(void);
int Disconnect_Channel(int nIndex, BOOL bBlock);
int Release_Module(void);
int Initial_Module(void);
int HandleNormalConnect();

enum
{
	connErrAuth,
	connErrConnFailed,
	connErrHttpRead,
	connErrOutMemory,
	connErrAccessName
} ELocConnectErrorType;

#ifdef _WIN32
BOOL WINAPI StaticControlHandler ( DWORD dwCtrlType )
{
    switch( dwCtrlType )
    {
        case CTRL_BREAK_EVENT:  // use Ctrl+C or Ctrl+Break to simulate
        case CTRL_C_EVENT:      // SERVICE_CONTROL_STOP in debug mode
			printf("Stopping sample...\n");
			Release_Module();
			g_bExit = TRUE;
            break;
    }
    return FALSE;
}
#endif // _WIN32

int MoreOptionsForNormalConnect(const char *pszArgument)
{
	if (strncmp(pszArgument, "-P", 2) == 0)	// protocol
	{
		g_Channel_Info[0].dwProtocol = atoi(&pszArgument[2]);
	}
	else if (strncmp(pszArgument, "-C", 2) == 0)	// if test to use net callback in DataBroker
	{
		if (STRICMP(&pszArgument[2], "true") == 0 ||
			STRICMP(&pszArgument[2], "yes") == 0)
			g_Channel_Info[0].bNetPacketCallback = TRUE;
		else if (STRICMP(&pszArgument[2], "false") == 0 ||
			STRICMP(&pszArgument[2], "no") == 0)
			g_Channel_Info[0].bNetPacketCallback = FALSE;
		else
			g_Channel_Info[0].bNetPacketCallback = (atoi(&pszArgument[2])?TRUE:FALSE);
	}
#ifdef _AVSYNC
	else if (strncmp(pszArgument, "-R", 2) == 0)
	{
		g_eAVRawType = atoi(&pszArgument[2]);
		if (g_eAVRawType > PF_BGR16555)
			g_eAVRawType = PF_BGR16555;
		else if (g_eAVRawType < PF_YUY2)
			g_eAVRawType = PF_YUY2;

		switch (g_eAVRawType)
		{
		case PF_YUY2:
		case PF_YUV:
			strcpy(g_szExtName, "yuv");
			break;
		case PF_RGB16565:		
		case PF_RGB16555:
		case PF_RGB32:
		case PF_RGB24:
		case PF_BGR16565:
		case PF_BGR16555:
		case PF_BGR32:
		case PF_BGR24:
			strcpy(g_szExtName, "raw");

			break;
		case PF_JPEG:
			strcpy(g_szExtName, "jpg");
			break;
		case PF_BMP16565:
		case PF_BMP24:
		case PF_BMP32:
		case PF_BMP16555:
		default:
			strcpy(g_szExtName, "bmp");
		}
	}
#endif // _AVSYNC
	else
		return -1;

	return 0;
}

int MoreOptionsForUart(const char *pszArgument)
{
	if (strncmp(pszArgument, "-O", 2) == 0)	// timeout
	{
		g_nTimeout = atoi(&pszArgument[2]);
		if (g_nTimeout > 25000)
			g_nTimeout = 25000;
	}
	else if (strncmp(pszArgument, "-F", 2) == 0)	// flush
	{
		if (STRICMP(&pszArgument[2], "true") == 0 ||
			STRICMP(&pszArgument[2], "yes") == 0)
			g_bFlushUart = TRUE;
		else if (STRICMP(&pszArgument[2], "false") == 0 ||
			STRICMP(&pszArgument[2], "no") == 0)
			g_bFlushUart = FALSE;
		else
			g_bFlushUart = (atoi(&pszArgument[2])?TRUE:FALSE);
	}
	else
		return -1;

	return 0;
}

int MoreOptionsForUpgrade(const char *pszArgument)
{
	if (strncmp(pszArgument, "-F", 2) == 0)	// protocol
	{
		strcpy(g_szUpgradeFile, &pszArgument[2]);
	}
	else if (strncmp(pszArgument, "-L", 2) == 0)	// loop times
	{
		g_nUpgradeTimes = atoi(&pszArgument[2]);
		if (g_nUpgradeTimes < 1 || g_nUpgradeTimes > 1000)
			g_nUpgradeTimes = 1;
	}
	else if (strncmp(pszArgument, "-W", 2) == 0)	// loop times
	{
		g_nUpgradeLoopWait = atoi(&pszArgument[2]);
	}
	else
		return -1;

	return 0;
}

int ServerUtlConnectToServer(HANDLE *phServerUtl, HANDLE *phDevice, char *pszModelName)
{
	TSERVERUTL_DEV_PROPERTY tDevProperty;
	SCODE scRet;

	memset(&tDevProperty, 0, sizeof(tDevProperty));
	tDevProperty.lpszHost=g_Channel_Info[0].chHostIP;
	tDevProperty.lpszPassword=g_Channel_Info[0].chPassword;
	tDevProperty.lpszUserName=g_Channel_Info[0].chUserName;
	tDevProperty.dwTimeout = 30000;

	tDevProperty.dwHttpPort = g_Channel_Info[0].dwHTTPPort;

	scRet = ServerUtl_Initial(phServerUtl, SERVERUTL_VERSION);
	if (scRet != S_OK)
	{
		printf("ServerUtl_Initial failed %X\n", scRet);
		return -1;
	}

	scRet = ServerUtl_CreateDevice(*phServerUtl, phDevice);
	if (scRet != S_OK)
	{
		printf("ServerUtl_CreateDevice failed %X\n", scRet);
		ServerUtl_Release(phServerUtl);
		return -1;
	}

	scRet = ServerUtl_SetDeviceProperty(*phDevice, tDevProperty, FALSE);
	if (scRet != S_OK)
	{
		if (scRet == SERVUTL_E_AUTH)
			printf("User name or password incorrect\n");
		else
			printf("Can't connect to server\n");
		ServerUtl_DeleteDevice(*phDevice);
		ServerUtl_Release(phServerUtl);

		return -1;
	}

	pszModelName[0] = 0;
	scRet = ServerUtl_GetDeviceModel(*phDevice, pszModelName);
	if (scRet != S_OK)
	{
		printf("ServerUtl_GetDeviceModel failed %X\n", scRet);
		ServerUtl_DeleteDevice(*phDevice);
		ServerUtl_Release(phServerUtl);
		return -1;
	}

	scRet = ServerUtl_OpenDevice(*phDevice, pszModelName);
	if (scRet != S_OK)
	{
		printf("ServerUtl_OpenDevice failed %X\n", scRet);
		ServerUtl_DeleteDevice(*phDevice);
		ServerUtl_Release(phServerUtl);

		return -1;
	}

	return 0;
}


int HandleCommandLineArgument(int argc, char* argv[])
{
	int nCnt;

	if (argc < 2)
	{
		OutputUsage(argv[0], -1);
		return -1;
	}

	if (strncmp(argv[1], "-Z", 2) != 0)
	{
		OutputUsage(argv[0], -1);
		return -1;
	}

	g_nType = atoi(&argv[1][2]);

	if (g_nType < 0)
	{
		OutputUsage(argv[0], -1);
		return -1;
	}

	if (g_nType < 8)
	{
		if (argc < 5)
		{
			OutputUsage(argv[0], g_nType);
			return -1;
		}

		// read the server info
		memset(g_Channel_Info, 0, sizeof(g_Channel_Info));
		g_Channel_Info[0].dwProtocol = 1;
		g_Channel_Info[0].dwHTTPPort = 80;

		for (nCnt = 2; nCnt < argc; nCnt++)
		{
			if (strncmp(argv[nCnt], "-N", 2) == 0)	// server name or IP
			{
				strncpy(g_Channel_Info[0].chHostIP, &argv[nCnt][2], 63);
			}
			else if (strncmp(argv[nCnt], "-U", 2) == 0)	// user name
			{
				strncpy(g_Channel_Info[0].chUserName, &argv[nCnt][2], 31);
			}
			else if (strncmp(argv[nCnt], "-S", 2) == 0)	// pwssword
			{
				if (strlen(argv[nCnt]) > 2)
					strncpy(g_Channel_Info[0].chPassword, &argv[nCnt][2], 31);
				else
					g_Channel_Info[0].chPassword[0] = 0;
			}
			else if (strncmp(argv[nCnt], "-T", 2) == 0)	// server port (http)
			{
				g_Channel_Info[0].dwHTTPPort = atoi(&argv[nCnt][2]);
			}
			else if (strncmp(argv[nCnt], "-M", 2) == 0)	// server model (friendly model name)
			{
				strncpy(g_Channel_Info[0].chServer_Type, &argv[nCnt][2], 31);
			}
			else if (strncmp(argv[nCnt], "-B", 2) == 0)	// server model (friendly model name)
			{
				if (STRICMP(&argv[nCnt][2], "true") == 0 ||
					STRICMP(&argv[nCnt][2], "yes") == 0)
					g_bCBDecoder = FALSE;
				else if (STRICMP(&argv[nCnt][2], "false") == 0 ||
					STRICMP(&argv[nCnt][2], "no") == 0)
					g_bCBDecoder = TRUE;
				else
					g_bCBDecoder = (atoi(&argv[nCnt][2])?FALSE:TRUE);				
			}
			else
			{
				int nRet = 0;

				if (g_nType == 0)
					nRet = MoreOptionsForNormalConnect(argv[nCnt]);
				else if (g_nType == 5)
					nRet = MoreOptionsForUart(argv[nCnt]);
				else if (g_nType == 7)
					nRet = MoreOptionsForUpgrade(argv[nCnt]);

				if (nRet < 0)
				{
					OutputUsage(argv[0], g_nType);
					return -1;
				}
			}
		}
	}

	return 0;
}

int HandleNormalConnect()
{
#ifdef _WIN32
	CreateDirectory(RECORD_ROOT_PATH, NULL);
	CreateDirectory(DECODER_ROOT_PATH, NULL);
#else
	mkdir(RECORD_ROOT_PATH, 0);
	mkdir(DECODER_ROOT_PATH, 0);
#endif // _WIN32

#ifdef _WIN32
	SetConsoleCtrlHandler( StaticControlHandler, TRUE );
#endif // _WIN32

	if (Initial_Module() != 0)
		return 1;

#if defined(_AVSYNC) && !defined(_WIN32)
	AvSynchronizer_UseAllCodecs ();
#endif // _AVSYNC

	if (Connect_Channel() != 0)
		return 1;

	while (1)
	{
		if (g_bExit)
			break;

	#ifdef _WIN32
			Sleep(500);
	#else
			sleep(1);
	#endif // _WIN32
	}

	return 0;
}

int ListSupportedModel()
{
	// List support Server_Model Name
	char **pFriendlyNameList;
	DWORD dwSrv_Model_Num;
	int i;

	SrvDepResource_EnumerateSupportingMode(&pFriendlyNameList,&dwSrv_Model_Num);
	
	for ( i = 0; i < (int) dwSrv_Model_Num ; i++)
	{
		if ((i % 5) == 0)
		{
			if (i != 0)
				printf("\n");
		}
		else
			printf(", ");

		printf(pFriendlyNameList[i]);
	}

	printf("\n\nTotal %d models\n", dwSrv_Model_Num);

	SrvDepResource_FreeFriendlyNameList(&pFriendlyNameList);

	return 0;
}

int DetectServerModel()
{
	HANDLE hSrvUtl;
	HANDLE hDevice;
	char lpszModelName[64]; 
	char FriendlyName[64];

	if (ServerUtlConnectToServer(&hSrvUtl, &hDevice, lpszModelName) < 0)
		return -1;

	ServerUtl_DeleteDevice(hDevice);
	ServerUtl_Release(&hSrvUtl);

	if (lpszModelName[0] == 0)
	{
		printf("Get Model name failed");
		return -1;
	}
	
	FriendlyName[0] = 0;
	SrvDepResource_GetMappingFriendlyName(lpszModelName,FriendlyName);

	printf("The server Model for %s is: %s\n", g_Channel_Info[0].chHostIP, FriendlyName);

	return 0;
}

int TestGetSystemSettings()
{
	HANDLE hSrvUtl;
	HANDLE hDevice;
	char lpszModelName[64]; 
	char szInputBuf[256];
	char szSection[256], szEntry[256];
	char szContent[256];
	int nNum;
	SCODE scRet;

	if (ServerUtlConnectToServer(&hSrvUtl, &hDevice, lpszModelName) < 0)
		return -1;

	// do a while loop to ask user for item to retrieve
	while (1)
	{
		printf("To end this program, please press Enter directly.\n");
		printf("Please select the info index to retrieve (range: %d to %d):",
			eSystemResetSystem, eCamCtrlPatrolName);

⌨️ 快捷键说明

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