#include #include 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 ports; sendMessage(SerialPort,CB_RESETCONTENT,0,0L); commControl.enumerateDevices(ports); for(int index=0;indexsetText("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 rcvBuffer; GlobalData 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; }