?? pro.cpp
字號:
//////////////////////////////////////////////////////////////////////
// Pro.cpp: implementation of the CPro class.
//這個類負責管理串行編程器和下載線,提供串口編程器或并口編程器類
//與界面的通信
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EPro.h"
#include "Pro.h"
#include "EProDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPro::CPro()
{
m_pReadBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x10000);//建立緩沖2
m_pWriteBuf=(BYTE*)GlobalAlloc(GMEM_FIXED,0x10000);//建立緩沖1
memset(m_pReadBuf,0xff,0x10000);
memset(m_pWriteBuf,0xff,0x10000);
m_pSerialPro=NULL;
m_pParlPro=NULL;
m_nChipSel=0;
}
CPro::~CPro()
{
}
BOOL CPro::InitPro(CWnd* pWnd,int nProType,int nIspSpd)
{
m_pDlg=(CEProDlg*)pWnd;
m_nProType=nProType;//編程器類型
if(m_nProType==0)
{
if(m_pSerialPro!=NULL)
delete m_pSerialPro;
m_pSerialPro=new CSerialPro;
switch(m_nBaudSel)//初始化串口
{
case 0:
return m_pSerialPro->InitPort(this,m_nSerialPort,9600);
case 1:
return m_pSerialPro->InitPort(this,m_nSerialPort,19200);
case 2:
return m_pSerialPro->InitPort(this,m_nSerialPort,28800);
case 3:
return m_pSerialPro->InitPort(this,m_nSerialPort,57600);
default : FALSE;
}
}
else if(m_nProType>=1 && m_nProType<=3)//使用并口的編程器
{
m_pParlPro=new CParallelPro;
return m_pParlPro->InitPort(this,0x378,m_nProType,nIspSpd);//初始化并口
}
return FALSE;
}
void CPro::Notify(int nInfo)//向界面發送消息
{
PostMessage(m_pDlg->m_hWnd, WM_PRO_MSG, (WPARAM)nInfo, 0);
}
void CPro::DetectPro(int nChipSel)//檢測編程器
{
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->DetectPro(GetChipType(nChipSel)->FID);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->DetectPro(GetChipType(nChipSel)->FID);
}
}
void CPro::DetectChip(int nChipSel)//檢測器件,就是讀特征字再比較特征字
{
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->ReadSign(GetChipType(nChipSel)->FID);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->ReadSign(GetChipType(nChipSel)->FID);
}
}
void CPro::Erase(int nChipSel)//擦除器件
{
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->Erase(GetChipType(nChipSel)->FID);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->Erase(GetChipType(nChipSel)->FID);
}
}
void CPro::Write(int nChipSel)//寫器件
{
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->BeginWrite(GetChipType(nChipSel)->FID);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->BeginWrite(GetChipType(nChipSel)->FID);
}
}
void CPro::Read(int nChipSel)//讀器件
{
memset(m_pReadBuf,0xff,0x10000);
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->BeginRead(GetChipType(nChipSel)->FID);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->BeginRead(GetChipType(nChipSel)->FID);
}
}
void CPro::LockBit(int nChipSel, int nBit)//寫鎖定位
{
if(m_nProType==0)//如果是串口的
{
m_pSerialPro->LockBit(GetChipType(nChipSel)->FID,nBit);
}
else if(m_nProType>=1 && m_nProType<=3)//如果是并口的
{
m_pParlPro->LockBit(GetChipType(nChipSel)->FID,nBit);
}
}
extern CString m_strAppPath;//應用程序所在的目錄
void CPro::LoadChipList()//從ChipList.chip中載入器件列表
{
CFile fileOpen;
if(fileOpen.Open(m_strAppPath+"ChipList.chip",CFile::shareCompat|CFile::modeRead,NULL))
{
int BufSize=fileOpen.GetLength();
int nVer;
int nChip;
BYTE* fileBuf=new BYTE[BufSize];
fileOpen.Read(fileBuf,BufSize);
memcpy(&nVer,fileBuf,4);
memcpy(&nChip,&fileBuf[4],4);
ChipType* pChip=(ChipType*)&fileBuf[8];
CString strChip;
for(int n=0;n<=nChip-1;n++)
{
m_arChips.Add(&pChip[n]);
strChip=pChip[n].Name;
m_pDlg->m_comboChipType.InsertString(n,strChip);
}
fileOpen.Close();
}
}
ChipType* CPro::GetCurChip()//得到當前的器件類型
{
return GetChipType(m_nChipSel);
}
ChipType* CPro::GetChipType(int nChipSel)//根據器件序號的到器件類型
{
if(nChipSel<0)
nChipSel=0;
m_nChipSel=nChipSel;
return m_arChips.GetAt(nChipSel);
}
int CPro::GetMinLength(BYTE *pBuf, int nLength)
{//計算緩沖中最小數據塊的長度,跳過0xFF
int n;
for(n=nLength-1;n>=0;n--)
{
if(pBuf[n]!=0xff)
{
if(n==0)
return m_nDataLength=1;
break;
}
}
if(n==0)
return m_nDataLength=0;
n++;
if(n>GetCurChip()->RomSize*1024)
return m_nDataLength=GetCurChip()->RomSize*1024;
return m_nDataLength=n;
}
BOOL CPro::CheckChip()//根據特征字緩沖中數據查找與之匹配的器件
{
int n;
for(n=0;n<m_arChips.GetSize();n++)
{
if(SignByte[0]==m_arChips.GetAt(n)->SignBytes[0]
&& SignByte[1]==m_arChips.GetAt(n)->SignBytes[1]
&& SignByte[2]==m_arChips.GetAt(n)->SignBytes[2])
{
Notify(PRO_DETECTCHIP_SEC);
m_nChipSel=n;
m_pDlg->m_comboChipType.SetCurSel(n);
return TRUE;
}
}
Notify(PRO_DETECTCHIP_ER);
return FALSE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -