Files
Work/aladin/serdlg.cpp
2024-08-07 09:12:07 -04:00

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