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

📄 parksysview.cpp

📁 停车场收费系统系统平台 GPS/GSM车辆监控及调度指挥系统 基于移动通信网络的车辆管理系统+ 远程无线通信的视频、图像监控管理系统
💻 CPP
字号:
// ParkSysView.cpp : implementation of the CParkSysView class
//

#include "stdafx.h"
#include "ParkSys.h"

#include "ParkSysDoc.h"
#include "ParkSysView.h"
#include "readprice.h"
#include <atlbase.h>
#include "led.h"
#include "InputBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CParkSysView

IMPLEMENT_DYNCREATE(CParkSysView, CFormView)

BEGIN_MESSAGE_MAP(CParkSysView, CFormView)
	//{{AFX_MSG_MAP(CParkSysView)
	ON_COMMAND(ID_GENERATE_ACCOUNT, OnGenerateAccount)
	ON_WM_CTLCOLOR()
	ON_WM_CANCELMODE()
	ON_COMMAND(ID_CHAREGE, OnCharge)
	//}}AFX_MSG_MAP
	// Standard printing commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CParkSysView construction/destruction

CParkSysView::CParkSysView()
	: CFormView(CParkSysView::IDD)
{
	//{{AFX_DATA_INIT(CParkSysView)
	m_enCardID = _T("");
	m_enInTime = _T("");
	m_exCardID = _T("");
	m_exChargeNum = _T("");
	m_exInTime = _T("");
	m_exOutTime = _T("");
	m_exUseTime = _T("");
	m_NowCarNum = 0;
	m_TotalCarNum = 0;
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CParkSysView::~CParkSysView()
{
	CParkSysApp *app = (CParkSysApp *)AfxGetApp();
	app->database.Close();
}

void CParkSysView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CParkSysView)
	DDX_Control(pDX, IDC_EX_ANI, m_aviEx);
	DDX_Control(pDX, IDC_EN_ANI, m_aviEn);
	DDX_Control(pDX, IDC_INIMAGE, m_bmpIn);
	DDX_Text(pDX, IDC_EN_CARDID, m_enCardID);
	DDX_Text(pDX, IDC_EN_INTIME, m_enInTime);
	DDX_Text(pDX, IDC_EX_CARDID, m_exCardID);
	DDX_Text(pDX, IDC_EX_CHARGENUM, m_exChargeNum);
	DDX_Text(pDX, IDC_EX_INTIME, m_exInTime);
	DDX_Text(pDX, IDC_EX_OUTTIME, m_exOutTime);
	DDX_Text(pDX, IDC_EX_USETIME, m_exUseTime);
	DDX_Text(pDX, IDC_NOWCARNUM, m_NowCarNum);
	DDX_Text(pDX, IDC_TOTALCARNUM, m_TotalCarNum);
	//}}AFX_DATA_MAP

}
BOOL CParkSysView::PreCreateWindow(CREATESTRUCT& cs)
{
	// 初始化串口
	//入口
	CRegKey regKey;
	regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\CommSet"));

	//条码打印机
	DWORD LabelPrinter;
	regKey.QueryValue(LabelPrinter, _T("LPComm"));
	LabelPrinter+=1;
	if (m_CommLP.InitPort(this, LabelPrinter, 9600, 'N',8,1))
		m_CommLP.StartMonitoring();
	else
		MessageBox("条码打印机连接错误",NULL,MB_OK | MB_ICONERROR);
	//电子显示屏
	DWORD LED;
	regKey.QueryValue(LED, _T("LEDComm"));
	LED+=1;
	if (m_CommLED.InitPort(this, LED, 9600, 'N',8,1))
	{
		m_CommLED.StartMonitoring();
	}
	else
		MessageBox("电子显示屏连接错误",NULL,MB_OK | MB_ICONERROR);
	
	//初始化参数


	//显示车位
	CParkSysApp *app = (CParkSysApp *)AfxGetApp();
	CCountTime rs_CountTime( &app->database );
	rs_CountTime.Open();
	while(!rs_CountTime.IsEOF())
	{
		m_NowCarNum += 1;
		rs_CountTime.MoveNext();
	}

	rs_CountTime.Close();		

	//显示总的车位数
	regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\ParaSet"));
	regKey.QueryValue(m_TotalCarNum, _T("Park_capacity"));
	regKey.Close();

	return CFormView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CParkSysView printing

/////////////////////////////////////////////////////////////////////////////
// CParkSysView diagnostics

/////////////////////////////////////////////////////////////////////////////
// CParkSysView message handlers
void CParkSysView::DisplayImage(CLongBinary* image)
{

	DWORD lsize = image->m_dwDataLength;
	HANDLE ghandle = image->m_hData;

	DWORD s = GlobalSize(ghandle);
	void* p = GlobalLock(ghandle);



	DWORD nBytesToWrite = lsize;

/*#if defined(_DEBUG)
	AfxMessageBox("check the existance of carout.bmp");
#endif*/

	CString str = ((CParkSysApp *)AfxGetApp())->ExtractFilePath();
	str += "carout.bmp";
	HANDLE hFile = CreateFile(str,
		GENERIC_WRITE,
		/*FILE_SHARE_WRITE | FILE_SHARE_READ*/0,NULL,
		CREATE_ALWAYS,0,0);
	ASSERT(hFile != INVALID_HANDLE_VALUE);

	BOOL reval = WriteFile(hFile,p,nBytesToWrite,
		&nBytesToWrite, NULL);
	CloseHandle(hFile);

/*#if defined(_DEBUG)
	AfxMessageBox("check the content of carout.bmp");
#endif*/

	BOOL val = GlobalUnlock(ghandle);
	HGLOBAL h = GlobalFree(ghandle);

	CFile fBmp;
	fBmp.Open(str, CFile::modeRead);
	DWORD dwLength=fBmp.GetLength();
	fBmp.Close();
	if (dwLength > 0)
	{
		TRY
		{
			DeleteObject(m_bmpIn.SetBitmap((HBITMAP)LoadFromFile(str)));
		}
		CATCH_ALL(e)
		{
			AfxMessageBox("Delphi DLL LoadFromFile发生错误!");
			THROW_LAST();
		}
		END_CATCH_ALL
	}
	else
	{
		AfxMessageBox("Carout.bmp长度为零!");	
	}
	UpdateData(FALSE);
}                                       

void CParkSysView::OnGrabimage(CString strCardID)
{
	CParkSysApp* app = (CParkSysApp *)AfxGetApp();
	CString str = app->ExtractFilePath();
	str += "carin.dib";
	BOOL revalue = capFileSaveDIB(app->avi.m_hWndCap, (LPCTSTR)str);
	UpdateWindow();

	//判断如果保存图像不成功,那么就直接返回。
	if (!revalue)
	{
		AfxMessageBox("保存图像失败,程序还将继续,但是,在此车出门的时候您不能进行比对。");
		return;
	}

	HANDLE hFile = CreateFile(str,GENERIC_READ,
		0/*FILE_SHARE_READ |FILE_SHARE_WRITE*/,NULL,		//读写共享
		OPEN_EXISTING,0,0);
	ASSERT(hFile != INVALID_HANDLE_VALUE);
	
	DWORD hsize;
	DWORD lsize = GetFileSize(hFile, &hsize);

	HGLOBAL ghandle = GlobalAlloc(GMEM_MOVEABLE, lsize);
	DWORD s = GlobalSize(ghandle);
	void* p = GlobalLock(ghandle);
	DWORD nBytesToRead = lsize;
	BOOL reval = TRUE;
	reval = ReadFile(hFile,p,nBytesToRead, &nBytesToRead, NULL);
	CloseHandle(hFile);

	CLongBinary image;

	CCountTime rs_CountTime( &app->database );

	//转换2进制文件为16进制文件
	CString csSQL = "UPDATE TAB_COUNTTIME SET CAR_IMAGE=0x";

	LPTSTR szTemp = new TCHAR[ lsize*2 + 1 ];
	extern const TCHAR HEX[256][2];
	for (DWORD i = 0; i < lsize; i++)
	{
		* (szTemp + (i << 1)) = HEX[(unsigned char)*((BYTE*)p + i)][0];
		* (szTemp + (i << 1) + 1) = HEX[(unsigned char)*((BYTE*)p + i)][1];
	}
	szTemp[ lsize*2 ] = 0;
	
	csSQL += szTemp;
	csSQL += " WHERE CARD_ID='" + strCardID+"'";

	app->database.ExecuteSQL( csSQL );
	delete []szTemp;

	BOOL val = GlobalUnlock(ghandle);
	HGLOBAL h = GlobalFree(ghandle);

	
}

void CParkSysView::CreateNewLabel()
{
	DWORD CardID;
	CRegKey regKey;
	regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\ParaSet"));
	regKey.QueryValue(CardID, _T("LabelCardID"));
	if (CardID>=99999)
		CardID=0;
	CardID += 1;
	regKey.SetValue(CardID, _T("LabelCardID"));
	regKey.Close();
	CParkSysApp* app = (CParkSysApp*)AfxGetApp();
	CCountTime rs_CountTime( &app->database );
	rs_CountTime.Open();

	CardID += 30000000;

	char buff[20];
	_itoa(CardID, buff, 10);
	CString strCardID = buff;

	rs_CountTime.AddNew();
	rs_CountTime.m_CARD_ID = strCardID;
	CTime inTime = CTime::GetCurrentTime();
	rs_CountTime.m_IN_TIME = inTime;
	rs_CountTime.Update();
	rs_CountTime.Close();

	//使用Zebra Corp. ZPL II 编码向支持ZPL的条形码打印机发送打印指令。
	// ZPL 的意思是 Zebra Programming Language
	CString strFormat = "^XA\n\r"
						"^FO200,200^BY3\n\r"
						"^BCN,100,Y,N,N^FD%d^FS\n\r"
						"^FO100,400^FD%s^FS\n\r"
						"^XZ\n\r";
	CString strZPLLabel;
	//把数据填入到上面的ZPL串中。卡号CardID,进入时间 YYYY-mm-dd hh:MM:SS
	strZPLLabel.Format(strFormat, CardID, inTime.Format("%Y-%m-%d %H:%M:%S"));
	
	m_CommLP.WriteToPort(strZPLLabel.GetBuffer(strZPLLabel.GetLength() + 1));
	strZPLLabel.ReleaseBuffer();

	OnGrabimage(strCardID); //抓取一幅汽车进入图像

	m_NowCarNum += 1;
	m_enCardID = strCardID;
	m_enInTime = inTime.Format("%Y-%m-%d %H:%M:%S");
	UpdateData(FALSE);
}

BOOL CParkSysView::Charge(CString cardid, double &cyFee)
{
	CParkSysApp *app = (CParkSysApp *)AfxGetApp();
	cyFee = 0.0;

	CTime inTime;
	CTime outTime = CTime::GetCurrentTime();
	CTimeSpan spanTime;

	CCountTime rs_counttime(&app->database);
	rs_counttime.m_strFilter = "Card_ID = \'" + cardid + "\'";
	rs_counttime.Open();
	rs_counttime.MoveFirst();
	
	inTime = rs_counttime.m_IN_TIME;
	
	rs_counttime.Close();
	
	//显示卡号
	m_exCardID = cardid;
	//显示进出时间
	
	spanTime = outTime - inTime;
	m_exInTime = inTime.Format( "%Y-%m-%d %H:%M:%S" );
	m_exOutTime += outTime.Format( "%Y-%m-%d %H:%M:%S" );
	m_exUseTime = spanTime.Format( "%D天%H小时%M分%S秒" );
	do
	{
		if (inTime>=outTime)
		{
			AfxMessageBox("系统时间错误");
			break;
		}
	
		if(cardid >= "30000000")
		{
			
			double fHours = spanTime.GetTotalMinutes() / 60.0;
			
			//retCode = m_StoredProcFee.PRC_FEE_PC_HOUR(cardid, fHours, &mFee);
			//每小时停车费2元RMB
			cyFee = fHours * 2.0; 
			
			CString strMoney;
			strMoney.Format("%0.4lf元", cyFee);
			
			m_exChargeNum = strMoney;	
			
			UpdateData(FALSE);//显示金额
			
			CLED led(&m_CommLED);
			led.TakeEffect(CString("!\\纸卡收费") + strMoney + "\\!@@");
			
			CWaitCursor wait;
			CReadPrice readprice;
			readprice.ReadPrice(atof(strMoney));
			wait.Restore();
			
			if (AfxMessageBox("纸卡用户按时付费,交易结束后按确定,否则按取消。"
				, MB_OKCANCEL | MB_ICONINFORMATION) != IDOK)
			{
				break;
			}
		}		
		UpdateData(FALSE);//显示信息
		return TRUE;	
	}while(false);
	
	UpdateData(FALSE);//显示信息
	return FALSE;		
}

void CParkSysView::OnGenerateAccount() 
{
	CreateNewLabel();
	m_aviEn.Play();
}

HBRUSH CParkSysView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
	char szClassName[50] = {0};
	GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
	if (strnicmp(szClassName, "EDIT", sizeof(szClassName)) == 0)
	{
		CBrush brush(RGB(255, 255, 200));
		hbr = (HBRUSH)brush.Detach();
		pDC->SetBkMode(TRANSPARENT);
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

void CParkSysView::OnCharge() 
{
	CString strCardID;
	CInputBox inputBox("收费", "请扫描或者输入卡号:", &strCardID);	
	if (IDOK == inputBox.DoModal())
	{
		//出车
		BOOL ret = CheckCarOut(strCardID);
		if (ret)
		{
			m_aviEx.Play();
		}
		//计算车辆数量
		RefreshCarCount(strCardID);
	}
}
LONG CParkSysView::RefreshCarCount(CString strCardID)
{

	//得到目前停车场中的车辆数。	
	CParkSysApp *app = (CParkSysApp *)AfxGetApp();
	CCountTime rs_CountTime( &app->database );
	rs_CountTime.Open();
	if( rs_CountTime.GetRecordCount() != 0 )
	{
		rs_CountTime.MoveFirst();
	}
	int RecordCount = 0;
	while( !rs_CountTime.IsEOF() )
	{
		rs_CountTime.MoveNext();
		RecordCount += 1;
	}
	rs_CountTime.Close();

	m_NowCarNum = RecordCount;
	UpdateData( FALSE );
	return 0;
}

BOOL CParkSysView::CheckCarOut(CString strCardID)
{
	CParkSysApp *app = (CParkSysApp *)AfxGetApp();
	
	//显示进门的图象
	CCountTime rs_CountTime( &app->database );
	rs_CountTime.m_strFilter = "TAB_COUNTTIME.CARD_ID='"
		+ strCardID+"'";
	rs_CountTime.Open();	
	DisplayImage(&rs_CountTime.m_CAR_IMAGE);
	rs_CountTime.Close();
	
	//开始收费
	double cyFee = 0.0;	//金额
	BOOL ret = Charge(strCardID, cyFee); 
	
	if(ret)
	{
		//保存记录和把该车占用的车位还原。
		ret = app->database.BeginTrans();
		if(ret)
		{
			TRY
			{
				 const char * sqlTemplate = "insert into tab_history_card select card_id,"
					" in_time, GetDate(), %lf, car_image from"
					" tab_counttime where card_id = \'%s\'";
				
				CString strSQL;
				strSQL.Format(sqlTemplate, cyFee, strCardID);
				app->database.ExecuteSQL(strSQL);
				
				
				strSQL = "delete from tab_counttime where"
					" Card_id like \'" + strCardID + "\'";
				
				app->database.ExecuteSQL(strSQL);
				
				ret = app->database.CommitTrans();
				if(ret)
					--m_NowCarNum;
				
			}
			CATCH(CDBException, e)
			{
				app->database.Rollback();
				ret = FALSE;
			}
			END_CATCH
		}
	}
	UpdateData(FALSE);
	return ret;
		
}

⌨️ 快捷键说明

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