314 lines
10 KiB
C++
314 lines
10 KiB
C++
#include <m68hc11/serdlg.hpp>
|
|
#include <m68hc11/m68reg.hpp>
|
|
|
|
SerialDlg::SerialDlg(void)
|
|
{
|
|
mInitHandler.setCallback(this,&SerialDlg::initHandler);
|
|
mDestroyHandler.setCallback(this,&SerialDlg::destroyHandler);
|
|
mCommandHandler.setCallback(this,&SerialDlg::commandHandler);
|
|
mCloseHandler.setCallback(this,&SerialDlg::closeHandler);
|
|
DWindow::insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
DWindow::insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
DWindow::insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
DWindow::insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
}
|
|
|
|
SerialDlg::~SerialDlg()
|
|
{
|
|
DWindow::removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
DWindow::removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
DWindow::removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
DWindow::removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
}
|
|
|
|
SerialDlg &SerialDlg::operator=(const SerialDlg &/*someSerialDlg*/)
|
|
{ // private implementation
|
|
return *this;
|
|
}
|
|
|
|
BOOL SerialDlg::perform(GUIWindow &parentWindow) // ,SerialSettings &serialSettings)
|
|
{
|
|
return ::DialogBoxParam(processInstance(),(LPSTR)"SERIAL",(HWND)parentWindow,DWindow::DlgProc,(LPARAM)(DWindow*)this);
|
|
}
|
|
|
|
CallbackData::ReturnType SerialDlg::initHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
mStatusBar=::new StatusBarEx(*this,StatusBarID);
|
|
mStatusBar.disposition(PointerDisposition::Delete);
|
|
initSerialSettings();
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType SerialDlg::destroyHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType SerialDlg::commandHandler(CallbackData &someCallbackData)
|
|
{
|
|
switch(someCallbackData.wmCommandID())
|
|
{
|
|
case IDOK :
|
|
if(applySerialSettings())endDialog(TRUE);
|
|
break;
|
|
case IDCANCEL :
|
|
endDialog(FALSE);
|
|
break;
|
|
case SerialStopBits :
|
|
case SerialParity :
|
|
case SerialDataBits :
|
|
case SerialBaud :
|
|
case SerialPort :
|
|
mStatusBar->setText(" ");
|
|
break;
|
|
case SerialApply :
|
|
applySerialSettings();
|
|
break;
|
|
case SerialTest :
|
|
testDevice();
|
|
break;
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType SerialDlg::closeHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
void SerialDlg::initSerialSettings(void)
|
|
{
|
|
M68Reg mcuReg;
|
|
|
|
initPorts();
|
|
initBaud();
|
|
initDataBits();
|
|
initStopBits();
|
|
initParity();
|
|
sendMessage(SerialPort,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)mcuReg.getPort());
|
|
sendMessage(SerialBaud,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)mcuReg.getBaud());
|
|
sendMessage(SerialDataBits,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)mcuReg.getDataBits());
|
|
sendMessage(SerialParity,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)mcuReg.getParity());
|
|
sendMessage(SerialStopBits,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)mcuReg.getStopBits());
|
|
}
|
|
|
|
void SerialDlg::initPorts(void)
|
|
{
|
|
String strPort;
|
|
CommControl commControl;
|
|
Block<CommControl::Port> ports;
|
|
|
|
sendMessage(SerialPort,CB_RESETCONTENT,0,0L);
|
|
commControl.enumerateDevices(ports);
|
|
for(int index=0;index<ports.size();index++)
|
|
{
|
|
if(ports[index]==CommControl::PortCOM1)sendMessage(SerialPort,CB_ADDSTRING,0,(LPARAM)(LPSTR)String(STRING_COM1));
|
|
else if(ports[index]==CommControl::PortCOM2)sendMessage(SerialPort,CB_ADDSTRING,0,(LPARAM)(LPSTR)String(STRING_COM2));
|
|
else if(ports[index]==CommControl::PortCOM3)sendMessage(SerialPort,CB_ADDSTRING,0,(LPARAM)(LPSTR)String(STRING_COM3));
|
|
else if(ports[index]==CommControl::PortCOM4)sendMessage(SerialPort,CB_ADDSTRING,0,(LPARAM)(LPSTR)String(STRING_COM4));
|
|
}
|
|
}
|
|
|
|
void SerialDlg::initBaud(void)
|
|
{
|
|
String strBaudRate;
|
|
|
|
sendMessage(SerialBaud,CB_RESETCONTENT,0,0L);
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"1200");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"2400");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"4800");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"9600");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"14400");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"19200");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"38400");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"57600");
|
|
sendMessage(SerialBaud,CB_ADDSTRING,0,(LPARAM)(LPSTR)"115200");
|
|
}
|
|
|
|
void SerialDlg::initDataBits(void)
|
|
{
|
|
sendMessage(SerialDataBits,CB_RESETCONTENT,0,0L);
|
|
sendMessage(SerialDataBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"4");
|
|
sendMessage(SerialDataBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"5");
|
|
sendMessage(SerialDataBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"6");
|
|
sendMessage(SerialDataBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"7");
|
|
sendMessage(SerialDataBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"8");
|
|
}
|
|
|
|
void SerialDlg::initParity(void)
|
|
{
|
|
sendMessage(SerialParity,CB_RESETCONTENT,0,0L);
|
|
sendMessage(SerialParity,CB_ADDSTRING,0,(LPARAM)(LPSTR)"None");
|
|
sendMessage(SerialParity,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Odd");
|
|
sendMessage(SerialParity,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Even");
|
|
sendMessage(SerialParity,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Mark");
|
|
sendMessage(SerialParity,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Space");
|
|
}
|
|
|
|
void SerialDlg::initStopBits()
|
|
{
|
|
sendMessage(SerialStopBits,CB_RESETCONTENT,0,0L);
|
|
sendMessage(SerialStopBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"1");
|
|
sendMessage(SerialStopBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"1.5");
|
|
sendMessage(SerialStopBits,CB_ADDSTRING,0,(LPARAM)(LPSTR)"2");
|
|
}
|
|
|
|
CommControl::Port SerialDlg::getCommPort(void)const
|
|
{
|
|
String strPort;
|
|
|
|
sendMessage(SerialPort,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strPort);
|
|
return CommControl::stringToPort(strPort);
|
|
}
|
|
|
|
String SerialDlg::getCommSettings(void)const
|
|
{
|
|
String strBaud;
|
|
String strDataBits;
|
|
String strSettings;
|
|
String strParity;
|
|
String strStopBits;
|
|
LRESULT currSel;
|
|
|
|
sendMessage(SerialBaud,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strBaud);
|
|
strSettings+="baud=";
|
|
strSettings+=strBaud;
|
|
strSettings+=" ";
|
|
sendMessage(SerialDataBits,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strDataBits);
|
|
strSettings+="data=";
|
|
strSettings+=strDataBits;
|
|
strSettings+=" ";
|
|
currSel=sendMessage(SerialParity,CB_GETCURSEL,0,0L);
|
|
sendMessage(SerialParity,CB_GETLBTEXT,0,(LPARAM)(LPSTR)strParity);
|
|
if(String("None")==strParity)strParity="N";
|
|
else if(String("Odd")==strParity)strParity="O";
|
|
else if(String("Even")==strParity)strParity="E";
|
|
else if(String("Space")==strParity)strParity="S";
|
|
strSettings+="parity=";
|
|
strSettings+=strParity;
|
|
strSettings+=" ";
|
|
currSel=sendMessage(SerialStopBits,CB_GETCURSEL,0,0L);
|
|
sendMessage(SerialStopBits,CB_GETLBTEXT,0,(LPARAM)(LPSTR)strStopBits);
|
|
strSettings+="stop=";
|
|
strSettings+=strStopBits;
|
|
return strSettings;
|
|
}
|
|
|
|
bool SerialDlg::applySerialSettings(void)
|
|
{
|
|
CommControl commControl;
|
|
M68Reg mcuReg;
|
|
String strCommSettings;
|
|
String strBaud;
|
|
String strDataBits;
|
|
String strStopBits;
|
|
String strParity;
|
|
LRESULT currSel;
|
|
|
|
strCommSettings=getCommSettings();
|
|
if(!commControl.open(getCommPort()))
|
|
{
|
|
mStatusBar->setText("Error opening port.");
|
|
::MessageBeep(0);
|
|
return false;
|
|
}
|
|
if(!commControl.setDeviceControlBlock(strCommSettings)){mStatusBar->setText("Failed to apply settings.");return false;}
|
|
sendMessage(SerialBaud,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strBaud);
|
|
mcuReg.setBaud(strBaud);
|
|
sendMessage(SerialDataBits,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strDataBits);
|
|
mcuReg.setDataBits(strDataBits);
|
|
currSel=sendMessage(SerialParity,CB_GETCURSEL,0,0L);
|
|
sendMessage(SerialParity,CB_GETLBTEXT,0,(LPARAM)(LPSTR)strParity);
|
|
if(String("None")==strParity)strParity="N";
|
|
else if(String("Odd")==strParity)strParity="O";
|
|
else if(String("Even")==strParity)strParity="E";
|
|
else if(String("Space")==strParity)strParity="S";
|
|
mcuReg.setParity(strParity);
|
|
currSel=sendMessage(SerialStopBits,CB_GETCURSEL,0,0L);
|
|
sendMessage(SerialStopBits,CB_GETLBTEXT,0,(LPARAM)(LPSTR)strStopBits);
|
|
mcuReg.setStopBits(strStopBits);
|
|
mStatusBar->setText("Settings have been applied.");
|
|
return true;
|
|
}
|
|
|
|
void SerialDlg::testDevice(void)
|
|
{
|
|
CommControl commControl;
|
|
BYTE prefix(0xFF);
|
|
GlobalData<BYTE> rcvBuffer;
|
|
GlobalData<BYTE> sndBuffer;
|
|
BYTE codeBytes[]={0x8E,0x00,0xFF,0xCE,0x10,0x00,0x6F,0x2C,0xCC,0x33,0x0C,0xA7,0x2B,0xE7,0x2D,0x1F,0x2E,0x20,0xFC,0xA6,0x2F,0x4C,0x1F,0x2E,0x80,0xFC,0xA7,0x2F,0x7E,0x00,0x0F};
|
|
|
|
sndBuffer.size(256);
|
|
sndBuffer.setZero();
|
|
rcvBuffer.size(sndBuffer.size());
|
|
rcvBuffer.setZero();
|
|
::memcpy(&sndBuffer[0],codeBytes,sizeof(codeBytes));
|
|
if(IDCANCEL==::MessageBox(*this,"This operation will overwrite the contents of MCU RAM with the ECHO program.","WARNING",MB_OKCANCEL))return;
|
|
if(!commControl.open(getCommPort())){mStatusBar->setText("Error opening port.");return;}
|
|
if(!commControl.setDeviceControlBlock(getCommSettings())){mStatusBar->setText("Failed to apply settings.");return;}
|
|
mStatusBar->setText("waiting for break signal....please reset the device.");
|
|
if(!commControl.waitForBreak()){mStatusBar->setText("timeout waiting for break.");return;}
|
|
mStatusBar->setText("break received, loading code...");
|
|
commControl.write(&prefix,sizeof(prefix));
|
|
commControl.clearReceiveQueue();
|
|
commControl.write(sndBuffer);
|
|
mStatusBar->setText("Waiting for response.");
|
|
if(!commControl.waitForData()){mStatusBar->setText("Timeout reached for receive.");return;}
|
|
commControl.readFully(rcvBuffer);
|
|
if(::memcmp(&rcvBuffer[0],&sndBuffer[0],sndBuffer.size()))
|
|
{
|
|
mStatusBar->setText("Failed to verify program load.");
|
|
return;
|
|
}
|
|
::Sleep(250);
|
|
if(!echo(commControl))mStatusBar->setText("Received unexpected results from program.");
|
|
else mStatusBar->setText("The program has been verified, all tests successful.");
|
|
return;
|
|
}
|
|
|
|
bool SerialDlg::echo(CommControl &commControl)
|
|
{
|
|
BYTE sndByte('a');
|
|
BYTE rcvByte=0;
|
|
DWORD rcvCount(0);
|
|
String str;
|
|
|
|
if(!commControl.isOkay())
|
|
{
|
|
if(!commControl.open(getCommPort())){mStatusBar->setText("Unable to open comm port.");mStatusBar->setText("Error opening port.");return false;}
|
|
if(!commControl.setDeviceControlBlock(getCommSettings())){mStatusBar->setText("Failed to apply settings.");return false;}
|
|
}
|
|
commControl.clearError();
|
|
while('z'!=rcvByte)
|
|
{
|
|
CommStatus commStatus;
|
|
commControl.write(&sndByte,sizeof(sndByte));
|
|
if(commControl.waitForData())
|
|
{
|
|
rcvByte=0;
|
|
commControl.read(&rcvByte,sizeof(rcvByte));
|
|
str+=rcvByte;
|
|
mStatusBar->setText(str);
|
|
if(!rcvCount&&rcvByte!='b')
|
|
{
|
|
mStatusBar->setText("Unexpected character in input stream.");
|
|
return false;
|
|
}
|
|
sndByte++;
|
|
rcvCount++;
|
|
}
|
|
}
|
|
::Sleep(250);
|
|
return true;
|
|
}
|
|
|
|
String SerialDlg::getByteString(BYTE charByte)
|
|
{
|
|
String str;
|
|
::sprintf(str.str(),"char:%d(0x%08lx)",(int)charByte,(int)charByte);
|
|
return str;
|
|
}
|
|
|
|
|