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

📄 number.cpp

📁 vc ad
💻 CPP
字号:
// Number.cpp : implementation file
//

#include "stdafx.h"
#include "version.h"
#include "card.h"
#include "cardtest.h"
#include "Number.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CNumber dialog


CNumber::CNumber(CWnd* pParent /*=NULL*/, CCard* pCard)
	: CDialog(CNumber::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNumber)
	m_sMonth = _T("");
	m_sYear = _T("");
	m_sSerial = _T("");
	m_sType = _T("");
	m_bErase = FALSE;
	m_nType = 0;
	m_nVol = 0;
	m_bRevD2 = FALSE;
	//}}AFX_DATA_INIT
	m_nFail=0;
	m_nSuc=0;
	m_bLoop=FALSE;
	m_pCard=pCard;
	m_pParent=(CCardtestDlg*)pParent;
}


void CNumber::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNumber)
	DDX_Text(pDX, IDC_MONTH, m_sMonth);
	DDX_Text(pDX, IDC_YEAR, m_sYear);
	DDX_Text(pDX, IDC_SERIALN, m_sSerial);
	DDX_Text(pDX, IDC_TYPEN, m_sType);
	DDX_Check(pDX, IDC_ERASE, m_bErase);
	DDX_Radio(pDX, IDC_TYPE_UNKNOWN, m_nType);
	DDX_Radio(pDX, IDC_VOL_UNKNOWN, m_nVol);
	DDX_Check(pDX, IDC_VERSION, m_bRevD2);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNumber, CDialog)
	//{{AFX_MSG_MAP(CNumber)
	ON_BN_CLICKED(IDC_TYPE_XS, OnTypeXs)
	ON_BN_CLICKED(IDC_TYPE_XD, OnTypeXd)
	ON_BN_CLICKED(IDC_TYPE_XM, OnTypeXm)
	ON_BN_CLICKED(IDC_TYPE_XQ, OnTypeXq)
	ON_BN_CLICKED(IDC_TYPE_III, OnTypeIii)
	ON_BN_CLICKED(IDC_ERASE, OnErase)
	ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
	ON_BN_CLICKED(IDC_WRITE, OnWrite)
	ON_BN_CLICKED(IDC_VOL_NONE, OnVol)
	ON_BN_CLICKED(IDC_STARTLOOP, OnStartloop)
	ON_MESSAGE(WM_I2CLOOP, OnI2CLoop)
	ON_BN_CLICKED(IDC_STOPLOOP, OnStoploop)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_TYPE_XDPRO, OnTypeXdpro)
	ON_BN_CLICKED(IDC_VOL_62429, OnVol)
	ON_BN_CLICKED(IDC_VOL_ANASW, OnVol)
	ON_BN_CLICKED(IDC_TYPE_XSPRO, OnTypeXspro)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNumber message handlers

BOOL CNumber::OnInitDialog() 
{
	CDialog::OnInitDialog();
	// TODO: Add extra initialization here
	GetHeader();
	GetDlgItem(IDC_STOPLOOP)->EnableWindow(FALSE);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
const int g_nVol[]={VOL_UNKNOWN, VOL_NONE, VOL_62429, VOL_NONE, VOL_ANASW, VOL_NONE, VOL_ANASW, VOL_ANASW, VOL_ANASW};
void CNumber::GetHeader()
{
	UCHAR Head[12];
	char buf[20];
	if(!m_pCard->GetEepromHeader(Head)){
		MessageBox("EEPROM 出错!", "错误", MB_ICONSTOP);
		g_Main->OutString("读EEPROM出错。");
	}
	else
		g_Main->OutString("读EEPROM正确。");
	int nVendor=((Head[2]<<8)|(Head[3]));
	m_pCard->SetCardType(CNumber::GetType((Head[0]<<8)|(Head[1])), Head[6]&0x80);
	if(nVendor==0xffff){
		CTime time=CTime::GetCurrentTime();
		m_nType=m_pParent->GetLastType();
		m_nVol=g_nVol[m_nType];
		sprintf(buf, "%02d", time.GetMonth());
		m_sMonth=buf;
		sprintf(buf, "%02d", time.GetYear()-2000);
		m_sYear=buf;
		buf[1]=0;
		buf[0]=TypeToChar(m_nType);
		m_sType=buf;
		int nSerial=m_pParent->GetLastSerial();
		if(m_nType==TYPE_XQ||m_nType==TYPE_XDPRO){
			int nBus, nSlot;
			m_pCard->GetBusSlot(&nBus, &nSlot);
			if(nSlot==4)
				nSerial++;
		}
		else
			nSerial++;
		sprintf(buf, "%05d", nSerial);
		m_sSerial=buf;
		GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
	}
	else{
		if(nVendor!=0x5468)
			m_nType=TYPE_UNKNOWN;
		else
			m_nType=GetType((Head[0]<<8)|Head[1]);
		if(nVendor==0x0010)
			m_nType=TYPE_SS3000;
		m_nVol=GetVol(Head[6]&0x07);
		m_bRevD2=((Head[6]&0x80)!=0);
		m_nSerial=(Head[7]<<24)|(Head[8]<<16)|(Head[9]<<8)|(Head[10]);
		sprintf(buf, "%010d", m_nSerial);
		char buf2[3];
		buf2[2]=0;
		buf2[0]=buf[0];
		buf2[1]=buf[1];
		m_sYear=buf2;
		buf2[0]=buf[2];
		buf2[1]=buf[3];
		m_sMonth=buf2;
		buf2[1]=0;
		buf2[0]=buf[4];
		m_sType=buf2;
		m_sSerial=buf+5;
		DisableInput();
		GetDlgItem(IDC_ERASE)->EnableWindow(TRUE);
	}
	m_pCard->SetCardType(m_nType, Head[6]&0x80);
	UpdateData(FALSE);
	//GetDlgItem(IDC_TYPE_UNKNOWN)->EnableWindow(FALSE);
	//GetDlgItem(IDC_VOL_UNKNOWN)->EnableWindow(FALSE);
}
void CNumber::EnableInput()
{
	GetDlgItem(IDC_TYPES)->EnableWindow(TRUE);
#if(TARGET==AVE2K)
	GetDlgItem(IDC_TYPE_XS)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPE_XD)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPE_XM)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPE_XQ)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPE_XDPRO)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPE_XSPRO)->EnableWindow(TRUE);
#else
	GetDlgItem(IDC_TYPE_III)->EnableWindow(TRUE);
#endif
	GetDlgItem(IDC_VOLS)->EnableWindow(TRUE);
	GetDlgItem(IDC_VOL_NONE)->EnableWindow(TRUE);
	GetDlgItem(IDC_VOL_62429)->EnableWindow(TRUE);
	GetDlgItem(IDC_VOL_ANASW)->EnableWindow(TRUE);
	GetDlgItem(IDC_SERIAL)->EnableWindow(TRUE);
	GetDlgItem(IDC_YEAR)->EnableWindow(TRUE);
	GetDlgItem(IDC_MONTH)->EnableWindow(TRUE);
	GetDlgItem(IDC_TYPEN)->EnableWindow(TRUE);
	GetDlgItem(IDC_SERIALN)->EnableWindow(TRUE);
	GetDlgItem(IDC_WRITE)->EnableWindow(TRUE);
	UpdateData();
	if(m_nType==4 || m_nType==6)
		GetDlgItem(IDC_VERSION)->EnableWindow(TRUE);
}
void CNumber::DisableInput()
{
	GetDlgItem(IDC_TYPES)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XS)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XD)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XM)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XQ)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_III)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XDPRO)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPE_XSPRO)->EnableWindow(FALSE);
	GetDlgItem(IDC_VOLS)->EnableWindow(FALSE);
	GetDlgItem(IDC_VOL_NONE)->EnableWindow(FALSE);
	GetDlgItem(IDC_VOL_62429)->EnableWindow(FALSE);
	GetDlgItem(IDC_VOL_ANASW)->EnableWindow(FALSE);
	GetDlgItem(IDC_SERIAL)->EnableWindow(FALSE);
	GetDlgItem(IDC_YEAR)->EnableWindow(FALSE);
	GetDlgItem(IDC_MONTH)->EnableWindow(FALSE);
	GetDlgItem(IDC_TYPEN)->EnableWindow(FALSE);
	GetDlgItem(IDC_SERIALN)->EnableWindow(FALSE);
	GetDlgItem(IDC_WRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_VERSION)->EnableWindow(FALSE);
	m_bErase=0;
}
int CNumber::GetVol(int nVolCode)
{
	switch(nVolCode){
	case 0:
		return VOL_NONE;
	case 3:
		return VOL_62429;
	case 4:
		return VOL_ANASW;
	default:
		return VOL_UNKNOWN;
	}
}
int CNumber::GetType(int nTypeCode)
{
	switch(nTypeCode){
	case 0x2000:
	case 0x2001:
		return TYPE_XS;
	case 0x2002:
		return TYPE_XD;
	case 0x2003:
		return TYPE_XM;
	case 0x2004:
		return TYPE_XQ;
	case 0x2005:
		return TYPE_XDPRO;
	case 0x2006:
		return TYPE_XSPRO;
	case 3:
		return TYPE_III;
	case 0x5410:
		return TYPE_SS3000;
	default:
		return TYPE_UNKNOWN;
	}
}
char CNumber::TypeToChar(int nType)
{
	switch(nType){
	case TYPE_XS:
		return '1';
	case TYPE_XD:
		return '2';
	case TYPE_XM:
		return '4';
	case TYPE_III:
		return '7';
	case TYPE_XQ:
		return '5';
	case TYPE_XDPRO:
		return '6';
	case TYPE_XSPRO:
		return '7';
	default:
		return 0;
	}
}
void CNumber::SelectType(BOOL bNewVersion)
{
	UpdateData();
	m_nVol=g_nVol[m_nType];
	m_sType=TypeToChar(m_nType);
	UpdateData(FALSE);
	if(bNewVersion)
		GetDlgItem(IDC_VERSION)->EnableWindow(TRUE);
	else{
		GetDlgItem(IDC_VERSION)->EnableWindow(FALSE);
		((CButton*)GetDlgItem(IDC_VERSION))->SetCheck(0);
	}
}
void CNumber::OnTypeXs() 
{
	// TODO: Add your control notification handler code here
	SelectType(FALSE);
}

void CNumber::OnTypeXd() 
{
	// TODO: Add your control notification handler code here
	SelectType(FALSE);
}

void CNumber::OnTypeXm() 
{
	// TODO: Add your control notification handler code here
	SelectType(FALSE);
}

void CNumber::OnTypeXq() 
{
	// TODO: Add your control notification handler code here
	SelectType(TRUE);
}

void CNumber::OnTypeIii() 
{
	// TODO: Add your control notification handler code here
	SelectType(FALSE);
}

void CNumber::OnTypeXdpro() 
{
	// TODO: Add your control notification handler code here
	SelectType(TRUE);
}

void CNumber::OnTypeXspro() 
{
	// TODO: Add your control notification handler code here
	SelectType(FALSE);
	((CButton*)GetDlgItem(IDC_VERSION))->SetCheck(1);
}

void CNumber::OnErase() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_bErase)
		EnableInput();
	else
		DisableInput();
}

void CNumber::OnRefresh() 
{
	// TODO: Add your control notification handler code here
	GetHeader();
}

void CNumber::OnWrite() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_pParent->SetLastSerial(atol(m_sSerial));
	m_pParent->SetLastType(m_nType);
	//m_pCard->SetCardType(m_nType);
	char buf[20];
	UCHAR Head[12];
	int nTypeCodes[]={0xffff, 0x2001, 0x2002, 0x2003, 0x2004, 0x0003, 0x2005, 0x2006, 0x2007};
	int nVolCodes[]={0xff, 0, 3, 4};
	int nTypeCode=nTypeCodes[m_nType];
	Head[0]=nTypeCode>>8;
	Head[1]=nTypeCode&0xff;
	Head[2]=0x54;
	Head[3]=0x68;
	Head[4]=0x25;
	Head[5]=0x0f;
	Head[6]=nVolCodes[m_nVol];
	//XS Pro only has REVD2
	//beside of XS Pro, only XDPRO & XQ have REVD2
	if(m_nType==7 ||((m_nType==4 || m_nType==6) && m_bRevD2))
		Head[6]|=0x80;//bit 7 is flag for OSD, relay & VIDV
	else
		Head[6]&=0x7f;
	strcpy(buf, m_sYear);
	strcat(buf, m_sMonth);
	strcat(buf, m_sType);
	strcat(buf, m_sSerial);
	int nSerial=atol(buf);
	Head[7]=(nSerial>>24)&0xff;
	Head[8]=(nSerial>>16)&0xff;
	Head[9]=(nSerial>>8)&0xff;
	Head[10]=(nSerial)&0xff;
	//memset(Head, 0xff, 11);
	m_pCard->SetCardType(CNumber::GetType((Head[0]<<8)|(Head[1])), Head[6]);
	if(m_bErase)
		g_Main->OutString("覆盖写入新数据。");
	if(!m_pCard->SetEepromHeader(Head)){
		MessageBox("EEPROM 出错!", "错误", MB_ICONSTOP);
		g_Main->OutString("写入EEPROM 出错。");
	}
	else
		g_Main->OutString("写入EEPROM正确。");
}

void CNumber::OnVol() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	UpdateData(FALSE);
}

void CNumber::OnStartloop() 
{
	// TODO: Add your control notification handler code here
/*	PUCHAR pBuf=m_FirstBuf;
	if(!m_pCard->GetEepromContent(pBuf)){
		MessageBox("Read error!", "Error", MB_ICONWARNING);
	}*/
	
	PostMessage(WM_I2CLOOP, 0, 0);
	
	// add i2c test code here
	// i2cinit
	// i2cwrite
	// i2cread

	m_bLoop=TRUE;
	GetDlgItem(IDC_STARTLOOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOPLOOP)->EnableWindow(TRUE);
}

void CNumber::OnI2CLoop(ULONG wParam, ULONG lParam)
{
	/*
	UCHAR buf[256];
	PUCHAR pBuf=buf;
	BOOL bFail;
	bFail=!m_pCard->GetEepromContent(pBuf);
	for(int i=0; i<256; i++){
		if(buf[i]!=m_FirstBuf[i]){
			bFail=TRUE;
			break;
		}
	}

	if(bFail)//!m_pCard->GetEepromHeader(Head))
	{
		m_nFail++;
		CString s;
		s.Format("%d", m_nFail);
		GetDlgItem(IDC_LOOPFAIL)->SetWindowText(s);
	}
	else{
		m_nSuc++;
		CString s;
		s.Format("%d", m_nSuc);
		GetDlgItem(IDC_LOOPSUC)->SetWindowText(s);
	}*/
	if(m_pCard->InitMTV118("0 2 - 0 4 - 0 5 / C H a b c d ")==0){
		m_nFail++;
		CString s;
		s.Format("%d", m_nFail);
		GetDlgItem(IDC_LOOPFAIL)->SetWindowText(s);
	}
	else{
		m_nSuc++;
		CString s;
		s.Format("%d", m_nSuc);
		GetDlgItem(IDC_LOOPSUC)->SetWindowText(s);
	}

	if(m_bLoop)
		SetTimer(1, 5, NULL);
}

void CNumber::OnStoploop() 
{
	// TODO: Add your control notification handler code here
	m_bLoop=FALSE;	
	GetDlgItem(IDC_STOPLOOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_STARTLOOP)->EnableWindow(TRUE);
}

void CNumber::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	KillTimer(1);
	PostMessage(WM_I2CLOOP, 0, 0);
	CDialog::OnTimer(nIDEvent);
}


⌨️ 快捷键说明

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