Files
Work/m68hc11/SERDLG.CPP
2024-08-07 09:16:27 -04:00

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;
}