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

📄 cardtest.cpp

📁 我的比赛作品 第22届全国青少年科技创新大赛3等奨 备注: 同时使用VC及Delphi开发
💻 CPP
字号:
// CardTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"
#include "mwrf32.h"
#include "winio.h"

#include <string.h>
#include "winsock2.h"
#include <mysql.h>

/** CAM **/
#include <vfw.h>
#pragma comment(lib,"vfw32")
#pragma comment(lib,"winmm")
/** CAM **/

char settingPath[MAX_PATH] = {0};
HANDLE icdev = NULL;
BOOL noOut = false;
HANDLE hCard = NULL;
HANDLE hRand = NULL;
BOOL dbg_disable[3] = {0};
BOOL updState = false;
int station = 0;
int compid = 0;
char direction = 0;
unsigned char updBuf[16] = {0};
unsigned long lastcard = 0;
unsigned char radBuf[16] = {0};
unsigned char radPeople = 0;

char UcarNo[16] = "MF-1234";

#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define BROWN 6
#define LIGHTGREY 7
#define DARKGREY 8
#define LIGHTBLUE 9
#define LIGHTGREEN 10
#define LIGHTCYAN 11
#define LIGHTRED 12
#define LIGHTMAGENTA 13
#define YELLOW 14
#define WHITE 15
#define BLINK 128
HANDLE  screen;
int textcolor = LIGHTGREY;
int backgroundcolor = BLACK;

MYSQL		* myData = NULL;

/** WEB CAM **/
#define QCIF_WIDTH  320
#define QCIF_HEIGHT 240
typedef  bool(__stdcall CHANGE)(char *,char *);
char camPath[MAX_PATH] = {0};
int cam_count = 0;
int wIndex[100]={0};
/** WEB CAM **/

void TextColor(int fontcolor,int backgroundcolor,HANDLE screen)
{
   int color_attribute;
   color_attribute = backgroundcolor;
   color_attribute = _rotl(color_attribute,4) | fontcolor;
   SetConsoleTextAttribute(screen,color_attribute);
}

void dbg_p(unsigned char msg,char *fmt, ...)
{
	if(msg!=0 && dbg_disable[msg]) return;
	va_list ap;
	char tmpstr[2048];
	va_start(ap, fmt);
    SYSTEMTIME now;
    GetLocalTime(&now);
	sprintf(tmpstr,"%02d-%02d %02d:%02d:%02d",now.wMonth,now.wDay,now.wHour,now.wMinute,now.wSecond);
	//strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
	sprintf(tmpstr + strlen(tmpstr), ": %s", fmt);

	TextColor(msg == 0 ? LIGHTRED : YELLOW,backgroundcolor,screen);
	vprintf(tmpstr, ap);
	TextColor(textcolor,backgroundcolor,screen);

	va_end(ap);
}

DWORD WINAPI VideoThread(int *pParam)
{
	HINSTANCE hInst = LoadLibrary("jpgdll.dll");
	if (hInst == NULL)
	{
		dbg_p(0,"System Error!\n");
		return 0;
	}
	CHANGE *pFunc;
	pFunc = (CHANGE*)GetProcAddress(hInst,"BmpToJpg");
	if (pFunc == NULL)
	{
		dbg_p(0,"System Error!\n");
		return 0;
	}
	HWND m_capwnd = NULL;
	m_capwnd = capCreateCaptureWindow("Capture",WS_POPUPWINDOW/* | WS_VISIBLE*/,0,0,QCIF_WIDTH,QCIF_HEIGHT,0,0);

	if(m_capwnd==NULL)
	{
		dbg_p(0,"Cam: Unable to create capture window.\n");
		return FALSE;
	}

	char srcBMP[MAX_PATH], srcJPEG[MAX_PATH];
	int pindex;
	pindex = *pParam;
	sprintf(srcBMP,"picture%d.bmp",pindex);
	sprintf(srcJPEG,"%s\\picture%d.jpg",camPath,pindex);
	while (true)
	{
		if (!capDriverConnect(m_capwnd, pindex))
		{
			dbg_p(0,"Cam: Unable to open Video Capture Device.\n");
			return FALSE;
		}

		capFileSaveDIB(m_capwnd,srcBMP);
		pFunc(srcBMP,srcJPEG);
		capDriverDisconnect(m_capwnd);
		Sleep(3000);
	}
	
	FreeLibrary(hInst);
}
BOOL InitVideo()
{
	char szDeviceName[100],szDeviceVersion[100];

	TextColor(GREEN,backgroundcolor,screen);

	printf("Camera driver lists\n");
	int wIndexShow=0;
	for (wIndexShow = 0; wIndexShow < 10; wIndexShow++)
	{
		if (capGetDriverDescription(wIndexShow, szDeviceName,
			sizeof (szDeviceName), szDeviceVersion,
			sizeof (szDeviceVersion)))
		{
			// 加入名字到一个已经安装的设备列表中
			printf("%d -> %s %s\n",wIndexShow,szDeviceName,szDeviceVersion);
			// 让用户选择一个使用。
		}
	}

	for (int i =0; i<cam_count;i++)
	{
		CreateThread(NULL,0,(unsigned long (__stdcall *)(void *))&VideoThread,&wIndex[i],0,0);
	}
	return TRUE;
}

BOOL db_query(char *szSQL)
{

	if (!mysql_query( myData, szSQL ))
	{
		return true;
	}else
	{
		dbg_p(0,"Database: Query Error\nDatabase: %s\nQuery: %s\n",mysql_error(myData),szSQL);
		return false;
	}
}

void CarCheck(unsigned char *CarNo, char people, int station)
{
	BOOL passAll = false;
	char szSQL[255];
	MYSQL_RES	* res ;
	MYSQL_ROW	row ;
	int rowNum = 0;
	int bid = 0;
	int roid = 0;

	sprintf(szSQL,"SELECT bid,roid,unix_timestamp() FROM bus_busrun WHERE number='%s'",CarNo);
	
	if (db_query(szSQL))
	{
		res = mysql_store_result( myData ) ;
		rowNum = (int) mysql_num_rows( res ) ;
		if (rowNum==0){
			dbg_p(0,"Unauthentication car!! (Car no: %s)\n",CarNo);
			mysql_free_result( res ) ;
		}else if (rowNum>1)
		{
			dbg_p(0,"Database: information error, more then one car!! (Car no: %s)\n",CarNo);
			mysql_free_result( res ) ;
		}else
		{
			if ( row = mysql_fetch_row( res ) ) {
				bid = atoi(row[0]);
				roid = atoi(row[1]);
				sprintf(szSQL,"UPDATE bus_busrun SET station='%d' WHERE bid='%d'",station/*,people*/,bid);
				//,people='%d'
				if (db_query(szSQL))
				{
					sprintf(szSQL,"INSERT INTO bus_log (bid,direction,roid,station,passtime) VALUES ('%d','%d','%d','%d','%s')",bid,direction,roid,station,row[2]);
					if (db_query(szSQL)) passAll = true;
				}
			}
			mysql_free_result( res ) ;
		}
	}
	if (passAll)
	{
		dbg_p(2,"update database success! (Car no: %s  People: %d)\n",CarNo,people);
	}else{
		dbg_p(0,"update database fail! (Car no: %s  People: %d)\n",CarNo,people);
	}
}

DWORD WINAPI RandThread(void *pParam)
{
	while (true)
	{
		radPeople+= (rand() % 10)-5;
		if (radPeople>128) radPeople = -radPeople;
		CarCheck(radBuf,radPeople,station);
		Sleep(1000);
	}
}

DWORD WINAPI CardThread(void *pParam)
{
	unsigned char buff[1024];
	unsigned long cardsn;
	int i=0;
	ZeroMemory(buff,sizeof(buff));
	lib_ver(buff);
	dbg_p(1,"software driver version is %s\n",buff);

	dbg_p(1,"init com port %d\n",compid+1);
	icdev = rf_init(compid,115200);
	if ((long)icdev <= 0)
	{
		dbg_p(0,"error init com port!\n");
		Beep(3000,1500);
		hCard = NULL;
		return 0;
	}
	dbg_p(1,"com port handle: %u\n",icdev);

	dbg_p(1,"start load key\n");
	for (i=0;i<16;i++)
	{
		if (rf_load_key_hex(icdev,0,i,"a3b6c9a3b6c9")!=0)
		{
			dbg_p(0,"Load key for sector %d error!!Please check the com port setting.\n",i);
			Beep(3000,500);
		}
	}

	lastcard=0;
	dbg_p(1,"start listen loop\n");
	while (true)
	{
		if (rf_card(icdev,1,&cardsn) == 0)
		{
			if (cardsn!=lastcard || updState)
			{
				dbg_p(1,"check card in (card sn: 0x%x)\n",cardsn);
				lastcard = cardsn;

				/*for (i=0;i<16;i++)
				{
					dbg_p(1,"authentication sector %d %d\n",i,rf_authentication(icdev,0,i));
				}*/
				if (rf_authentication(icdev,0,0) != 0)
				{
					//rf_beep(icdev,20);
					dbg_p(0,"authentication error!\n");
				}else
				{
					dbg_p(1,"authentication success!\n");
					unsigned char block_buf[32];
					char people = 0;
					/*int i;
					int j;
					//for (j=0;j<16;j++)
					{
						//if (rf_authentication(icdev,0,j)==0)
						{
							for (i=0;i<63;i++)
							{
								if (rf_read_hex(icdev,i,(char *)block_buf)==0)
								{
									printf("block %d: %s\n",i,block_buf);
								}
							}
						}
					}*/
					
					if (rf_read(icdev,1,block_buf)==0)
					{
						memcpy(&people,block_buf+15,sizeof(char));
						dbg_p(1,"read success! (Car no: %s  People: %d)\n",block_buf,people);

						CarCheck(block_buf,people,station);
					}
					if (updState)
					{
						updState = false;
						rf_write(icdev,1,updBuf);
						memcpy(&people,updBuf+15,sizeof(char));
						printf("Check card exists, update card success! Reload card.\n");
						lastcard = 0;
					}
				}
			}
		}else{
			lastcard = 0;
		}
		rf_halt(icdev);
		Sleep(100);
	}

	rf_exit(icdev);
	return 0;
}

DWORD WINAPI PeopleThread(void *pParam)
{
	//static DWORD LastTime = 0;
		
	DWORD dwPortVal = 0;
	DWORD lastVal = 0;
	char query[1024];

	while (true)
	{
		GetPortVal(0x379, &dwPortVal, 1);
		if ((dwPortVal & 16) == 0 && (lastVal & 16) != 0)
		{
			sprintf(query,"UPDATE bus_busrun SET people=people+1 WHERE number='%s'",UcarNo);
			db_query(query);
			dbg_p(1,"bus %s come 1 people\n",UcarNo);
			//check ok (Ir1)
		}
		if ((dwPortVal & 32) == 0 && (lastVal & 32) != 0)
		{
			sprintf(query,"UPDATE bus_busrun SET people=people-1 WHERE number='%s'",UcarNo);
			db_query(query);
			dbg_p(1,"bus %s leave 1 people\n",UcarNo);
			//check ok (Ir2)
		}
		//printf("%d  %d   %d %d\n",dwPortVal & 16, dwPortVal & 32,lastVal & 16, lastVal & 32);
		lastVal = dwPortVal;
		Sleep(50);
	}
}

void outSucc()
{
	TextColor(LIGHTCYAN,backgroundcolor,screen);
	printf("Success.\n");
	TextColor(textcolor,backgroundcolor ,screen); 
}

void outFail()
{
	TextColor(LIGHTRED,backgroundcolor,screen);
	printf("Fail.\n");
	TextColor(textcolor,backgroundcolor ,screen); 
}

int main(int argc, char* argv[])
{
	//char		, aszFlds[ 25 ][ 25 ];
	char szDB[ 50 ], szUser[50], szPass[50], szHost[50];
	//const  char   *pszT;
	//int			i, j, k, l, x ;

	/*strcpy(szHost,"localhost");
	strcpy(szUser,"root");
	strcpy(szPass,"test");
	strcpy(szDB,"bus");*/

	printf("                         Bus station control panel\n");
	printf("-------------------------------------------------------------------------------\n");

	screen = GetStdHandle(STD_OUTPUT_HANDLE);

	//FillConsoleOutputAttribute(screen, _rotl(backgroundcolor,4) , 80 * 50,coord , &cWritten); 

	TextColor(LIGHTGREEN,backgroundcolor,screen);
	printf("System: Initalize data...");

	GetModuleFileName(NULL,settingPath,sizeof(settingPath));
    int i;
    for (i=strlen(settingPath)-1;i>=0;i--){
        if (settingPath[i] == '\\')
        {
            settingPath[i+1]='\0';
            break;
        }
    }
    strcat(settingPath,"config.ini");
	outSucc();
	
	TextColor(LIGHTGREEN,backgroundcolor,screen);
	printf("System: loading config file...");
	compid = GetPrivateProfileInt("Setting","com",0,settingPath);
	GetPrivateProfileString("Database","host","localhost",szHost,sizeof(szHost),settingPath);
	GetPrivateProfileString("Database","username","root",szUser,sizeof(szUser),settingPath);
	GetPrivateProfileString("Database","password","",szPass,sizeof(szPass),settingPath);
	GetPrivateProfileString("Database","database","bus",szDB,sizeof(szDB),settingPath);

	GetPrivateProfileString("Setting","cam_pic",".\\",camPath,sizeof(camPath),settingPath);
	cam_count = GetPrivateProfileInt("Setting","cam_count",0,settingPath);
	for (i=0;i<cam_count;i++)
	{
		char read_str[30];
		sprintf(read_str,"cam_%d",i);
		wIndex[i] = GetPrivateProfileInt("Setting",read_str,0,settingPath);
	}
	outSucc();
	
	TextColor(CYAN,backgroundcolor,screen);
	printf("Config: com %d\n",compid +1);
	printf("Config: database host: %s  user: %s  pass: *****  database: %s\n",szHost,szUser,szDB);

	TextColor(LIGHTGREEN,backgroundcolor,screen);
	printf("Cam: Initalize...");
	outSucc();

	InitVideo();

	TextColor(LIGHTGREEN,backgroundcolor,screen);
	printf("Database: Connecting database (%s@%s  DB: %s)...",szUser,szHost,szDB);
	
	if ( (myData = mysql_init((MYSQL*) 0)) && 
       mysql_real_connect( myData, szHost, szUser, szPass, NULL, MYSQL_PORT, NULL, 0 ) )
    {
		outSucc();

		myData->reconnect= 1;
		
		TextColor(LIGHTGREEN,backgroundcolor,screen);
		printf("Database: Selecting database...");
		if ( mysql_select_db( myData, szDB ) > 0 ) {
			outFail();
			goto clean;
		}else{
			outSucc();
		}
    }else
	{
		outFail();
		goto clean;
	}

//start:
	dbg_p(1,"init parallel port\n");
	
	// 初始化I/O并口
	if(!InitializeWinIo())
	{
		dbg_p(0,"error init com port!\n");
	}

	hCard = CreateThread(NULL,0,&CardThread,NULL,0,0);
	CreateThread(NULL,0,&PeopleThread,NULL,0,0);
	while (true)
	{
		switch (getch())
		{
			case '?':
				printf("                                    Help\n");
				printf("-------------------------------------------------------------------------------\n");
				printf("?\tHelp\n");
				printf("q\tExit\n");
				printf("x\tExit\n");

				printf("c\tChange card reader to enable/disable.\n");
				printf("d\tChange card reader debug log.\n");
				printf("e\tChange car status debug log.\n");
				printf("f\tChange cureent station.\n");
				printf("m\tManual car load.\n");
				printf("p\tPeople update car no.\n");
				printf("s\tShow status.\n");
				printf("u\tUpdate card data.\n");
				printf("v\tRandom data.\n");
				break;
			case 'q':
			case 'x':
				goto clean;
				break;
			case 'd':
				dbg_disable[1]=!dbg_disable[1];
				printf("Change card reader debug log to %s.\n",(dbg_disable[1] ? "DISABLE" : "ENABLE"));
				break;
			case 'e':
				dbg_disable[2]=!dbg_disable[2];
				printf("Change car status debug log to %s.\n",(dbg_disable[2] ? "DISABLE" : "ENABLE"));
				break;
			case 'f':
				{
					int ustation = 0;
					char udirection = 0;
					printf("Station: ");
					scanf("%d",&ustation);
					printf("Direction [0/1]: ");
					scanf("%d",&udirection);
					station = ustation;
					direction = udirection;
					printf("Update current station to %d, direction to %d OK!\n",ustation,udirection);
				}
				break;
			case 'u':
				{
					char people = 0;
					printf("Car number: ");
					scanf("%s",updBuf);
					printf("People: ");
					scanf("%d",&people);
					memcpy(updBuf+15,&people,sizeof(char));
					updState = true;
				}
				break;
			case 'm':
				{
					unsigned char cbuf[16];
					char people = 0;
					int stationid = 0;
					printf("Car number: ");
					scanf("%s",cbuf);
					printf("People: ");
					scanf("%d",&people);
					printf("Station: ");
					scanf("%d",&stationid);
					memcpy(cbuf+15,&people,sizeof(char));
					CarCheck(cbuf,people,stationid);
				}
				break;
			case 'p':
				{
					char tmp[16];
					printf("Car number[%s]: ",UcarNo);
					scanf("%s",tmp);
					if (strlen(tmp) > 3)
					{
						strcpy(UcarNo,tmp);
					}
				}
				break;
			case 's':
				if (lastcard!=0 && hCard!=NULL)
				{
					printf("Card find!\n");
				}else{
					printf("No card find!\n");
				}
				break;
			case 'c':
				if (hCard == NULL)
				{
					hCard = CreateThread(NULL,0,&CardThread,NULL,0,0);
					printf("Change card reader to enable!\n");
				}else
				{
					TerminateThread(hCard,0);
					rf_exit(icdev);
					hCard = NULL;
					printf("Change card reader to disable!\n");
				}
				break;
			case 'v':
				if (hRand == NULL)
				{
					printf("Car number: ");
					scanf("%s",radBuf);
					hRand = CreateThread(NULL,0,&RandThread,NULL,0,0);
					printf("Change random car record to enable!\n");
				}else
				{
					TerminateThread(hRand,0);
					hRand = NULL;
					printf("Change random car record to disable!\n");
				}
				break;
			case '\r':
				break;
			default:
				printf("Input error, pause ? to get help!\n");
		}
	}
clean:
	if (hCard!=NULL) TerminateThread(hCard,0);
	if (icdev!=NULL) rf_exit(icdev);
	if (myData!=NULL) mysql_close( myData ) ;
	hCard = NULL;
	printf("Pause any key to exit...");
	getch();
	return 0;
}

⌨️ 快捷键说明

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