📄 cardtest.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 + -