388 lines
12 KiB
C++
388 lines
12 KiB
C++
#include <aladin/serdlg.hpp>
|
|
#include <aladin/aladin.hpp>
|
|
#include <aladin/appreg.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 SerialReset :
|
|
reset();
|
|
break;
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType SerialDlg::closeHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
void SerialDlg::initSerialSettings(void)
|
|
{
|
|
AppReg appReg;
|
|
|
|
initPorts();
|
|
initBaud();
|
|
initDataBits();
|
|
initStopBits();
|
|
initParity();
|
|
sendMessage(SerialPort,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)appReg.getPort());
|
|
sendMessage(SerialBaud,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)appReg.getBaud());
|
|
sendMessage(SerialDataBits,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)appReg.getDataBits());
|
|
sendMessage(SerialParity,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)appReg.getParity());
|
|
sendMessage(SerialStopBits,CB_SELECTSTRING,-1,(LPARAM)(LPSTR)appReg.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;
|
|
AppReg appReg;
|
|
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);
|
|
appReg.setBaud(strBaud);
|
|
sendMessage(SerialDataBits,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strDataBits);
|
|
appReg.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";
|
|
appReg.setParity(strParity);
|
|
currSel=sendMessage(SerialStopBits,CB_GETCURSEL,0,0L);
|
|
sendMessage(SerialStopBits,CB_GETLBTEXT,0,(LPARAM)(LPSTR)strStopBits);
|
|
appReg.setStopBits(strStopBits);
|
|
mStatusBar->setText("Settings have been applied.");
|
|
return true;
|
|
}
|
|
|
|
void SerialDlg::reset()
|
|
{
|
|
AppReg appReg;
|
|
CommControl commControl;
|
|
Block<String> deviceList;
|
|
|
|
|
|
if(IDCANCEL==::MessageBox(*this,"Reset serial settings to default values?","Confirm",MB_OKCANCEL))return;
|
|
commControl.enumerateDevices(deviceList);
|
|
appReg.setBaud("19200");
|
|
appReg.setParity("N");
|
|
appReg.setDataBits("8");
|
|
appReg.setStopBits("1");
|
|
appReg.setPort(deviceList.size()?deviceList[0]:"COM1");
|
|
initSerialSettings();
|
|
}
|
|
|
|
/*void SerialDlg::testDevice()
|
|
{
|
|
CommControl commControl;
|
|
DeviceControlBlock dcb;
|
|
|
|
if(!commControl.open(getCommPort())){mStatusBar->setText("Error opening port.");return;}
|
|
if(!commControl.setDeviceControlBlock(getCommSettings())){mStatusBar->setText("Failed to apply settings.");return;}
|
|
mStatusBar->setText("loading data...");
|
|
commControl.getDeviceControlBlock(dcb);
|
|
dcb.dtrControl(DeviceControlBlock::DtrControlEnable);
|
|
dcb.rtsControl(DeviceControlBlock::RtsControlEnable);
|
|
commControl.setDeviceControlBlock(dcb);
|
|
|
|
} */
|
|
|
|
/*
|
|
|
|
|
|
void printDCB(CommControl &control,bool wait);
|
|
bool getControlData(CommControl &control);
|
|
|
|
Console console;
|
|
|
|
DeviceControlBlock dcb;
|
|
CommControl control;
|
|
Block<String> deviceList;
|
|
String selDevice;
|
|
String strPrompt;
|
|
String strCommState="baud=19200 parity=N data=8 stop=1";
|
|
|
|
control.enumerateDevices(deviceList);
|
|
for(int index=0;index<deviceList.size();index++)console.writeLine(String(String("Found ")+deviceList[index]));
|
|
console.writeLine("Select a device.");
|
|
console.read(selDevice);
|
|
selDevice.removeTokens("\r\n");
|
|
selDevice.upper();
|
|
console.writeLine(String("Trying '")+selDevice+String("'"));
|
|
if(!control.open(CommControl::stringToPort(selDevice)))
|
|
{
|
|
console.writeLine("Open failed.");
|
|
console.read();
|
|
return 0;
|
|
}
|
|
console.writeLine("port opened, press enter start data retrieval.");
|
|
console.read(strPrompt);
|
|
strPrompt.removeTokens("\r\n");
|
|
strPrompt.upper();
|
|
if(strPrompt=="Q")
|
|
{
|
|
control.close();
|
|
return 0;
|
|
}
|
|
|
|
control.setDeviceControlBlock(strCommState);
|
|
control.getDeviceControlBlock(dcb);
|
|
|
|
// printDCB(control);
|
|
|
|
dcb.dtrControl(DeviceControlBlock::DtrControlEnable);
|
|
dcb.rtsControl(DeviceControlBlock::RtsControlEnable);
|
|
|
|
// console.writeLine("ready to set RTS/DTR, press enter.");
|
|
// console.read();
|
|
|
|
control.setDeviceControlBlock(dcb);
|
|
printDCB(control,false);
|
|
|
|
// console.writeLine("Press enter to read.");
|
|
// console.read();
|
|
|
|
bool readResult=false;
|
|
int count=0;
|
|
while(!(readResult=getControlData(control))&&count<5)
|
|
{
|
|
console.writeLine("Data not ready, recycle...");
|
|
count++;
|
|
::Sleep(2000);
|
|
}
|
|
if(!readResult)console.writeLine("Unable to read from device.");
|
|
|
|
control.close();
|
|
console.writeLine("Press enter to terminate");
|
|
console.read();
|
|
return 0;
|
|
}
|
|
|
|
void printDCB(CommControl &control,bool wait)
|
|
{
|
|
DeviceControlBlock dcb;
|
|
|
|
if(!control.isOkay()){console.writeLine("Device is not ready.");console.read();return;}
|
|
if(!control.getDeviceControlBlock(dcb))console.writeLine("Failed to get DCB.");
|
|
else console.writeLine(dcb.toString());
|
|
if(!wait)return;
|
|
console.writeLine("Press enter to continue.");
|
|
console.read();
|
|
return;
|
|
}
|
|
|
|
bool getControlData(CommControl &control)
|
|
{
|
|
char rcvChar;
|
|
char rcvBuff[2046];
|
|
int sync=0;
|
|
|
|
char syncBuff[]="UUU\0";
|
|
int index=0;
|
|
int skipped=0;
|
|
|
|
::memset(rcvBuff,0,sizeof(rcvBuff));
|
|
while((sizeof(syncBuff)!=index)&&(skipped<sizeof(rcvBuff)+4))
|
|
{
|
|
control.read(&rcvChar,sizeof(rcvChar));
|
|
if(0==rcvChar){skipped++;continue;}
|
|
if(rcvChar==syncBuff[index])index++;
|
|
else {index=0;skipped++;}
|
|
}
|
|
if(sizeof(syncBuff)!=index)return;
|
|
console.writeLine("");
|
|
if(!sync)return false;
|
|
control.read(rcvBuff,sizeof(rcvBuff));
|
|
File outFile("c:\\aladin.dat","wb");
|
|
outFile.write(rcvBuff,sizeof(rcvBuff));
|
|
Block<String> strLines;
|
|
FormatLines::hexasciiLines(strLines,rcvBuff,sizeof(rcvBuff));
|
|
for(int index=0;index<strLines.size();index++)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
outFile.close();
|
|
return true;
|
|
}
|
|
|
|
|
|
*/ |