--- trunk/H7 Server/H7 ServerDlg.cpp 2007/01/30 16:13:04 18 +++ trunk/H7 Server/H7 ServerDlg.cpp 2007/01/30 16:13:27 19 @@ -12,6 +12,26 @@ #endif +void WriteLastError(char *format) +{ + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + printf(format, lpMsgBuf); + CString Tmp; + Tmp.Format( "%s", lpMsgBuf); + MessageBox(0,Tmp,"",MB_OK); +} + std::vector GetAvailableComPorts() { std::vector ports; @@ -135,7 +155,12 @@ /**********************************************************************/ // TODO: Add extra initialization here - ServerInit(); + // if there is no free com ports, the program shut down. + if (!ServerInit() ) + { + OnOK(); + return false; + } /**********************************************************************/ return TRUE; // return TRUE unless you set the focus to a control @@ -192,23 +217,21 @@ void CH7ServerDlg::OnBnClickedStart() { -// Get TCp port - CRegKey reg; - reg.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Projekt\\Server"); - unsigned long Port; - reg.QueryDWORDValue("Port", Port); - // Add's user defined Baud-Rate to regedit before the server start. + CRegKey reg; CString Baud; m_BaudRate.GetWindowText(Baud); + + reg.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Projekt\\Server"); reg.SetDWORDValue("BaudRate", atoi(Baud) ); StartTcp(); + StartSerial(); } int CH7ServerDlg::StartTcp(void) { -// Gets the TCP Port number from regedit. +// Get the TCP Port number from regedit. unsigned long Port; CRegKey reg; reg.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Projekt\\Server"); @@ -249,9 +272,9 @@ { } -void CH7ServerDlg::ServerInit(void) +bool CH7ServerDlg::ServerInit(void) { - int i; + unsigned int i; CRegKey reg; // Sets values in baud-rate combo box m_BaudRate.AddString("1200"); @@ -318,6 +341,10 @@ m_BaudRate.SetWindowText(TBaudRate); m_Serial.SetWindowText(LoadCom); + if( Serial.size() == 0 ){ + MessageBox( "No (free) serial port's found" ); + return false; + } // Checks for valid COM port in regedit. for (i=0; i< Serial.size() ; i++) { @@ -333,5 +360,88 @@ reg.SetStringValue("Serial", Serial[0]); } reg.Close(); + return true; +} + +int CH7ServerDlg::StartSerial(void) +{ + char SerialPort[6]; + unsigned long size = 6; + unsigned long Baud; + CRegKey reg; + + reg.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Projekt\\Server"); + reg.QueryStringValue("Serial", SerialPort, &size); + reg.QueryDWORDValue("BaudRate", Baud); + + HANDLE hComPort; + + hComPort = CreateFile( "COM1", + GENERIC_READ | GENERIC_WRITE, + 0, + 0, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + 0 + ); + + // Error check. + if( hComPort == INVALID_HANDLE_VALUE ){ + WriteLastError("Fail\n%s\n"); + return 1; + } + + + DCB dcb, dcb_restore; + + // DCB structure for com port setup + dcb.DCBlength = sizeof(DCB); + dcb_restore.DCBlength = sizeof(DCB); + + // Error check. + if( (!GetCommState(hComPort, &dcb)) || + (!GetCommState(hComPort, &dcb_restore)) ){ + WriteLastError("Fail\n%s\n"); + return 2; + } + + // Init com port setup + dcb.BaudRate = Baud; + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + dcb.fDtrControl = DTR_CONTROL_DISABLE; + dcb.fRtsControl = RTS_CONTROL_DISABLE; + dcb.fParity = FALSE; + dcb.fDsrSensitivity = FALSE; + + if( !SetCommState(hComPort,&dcb) ){ + WriteLastError("Fail\n%s\n"); + return 3; + } + + // ready to send stuff... + + + unsigned char receive; + unsigned long rSize; + CString Tmp; + ReadFile(hComPort,&receive,1,&rSize,0); + if( rSize != 1 ){ + MessageBox( "Error when trying to receive date from serial port" ); + return false; + } + Tmp.Format( "%s", &receive ); + m_Status.SetWindowText(Tmp); + + + + if( !SetCommState( hComPort, &dcb_restore ) ){ + WriteLastError("Fail\n%s\n"); + return 4; + } + + + return 0; }