--- trunk/FlisServer/FlisServerDlg.cpp 2007/12/03 09:22:26 130 +++ trunk/FlisServer/FlisServerDlg.cpp 2007/12/04 13:26:00 144 @@ -63,7 +63,6 @@ ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() - ON_MESSAGE(UWM_MYMESSAGE, OnShowString) //}}AFX_MSG_MAP ON_BN_CLICKED(IDCLOSE, OnBnClickedClose) ON_BN_CLICKED(IDC_GSMPIN, OnBnClickedGsmpin) @@ -158,18 +157,45 @@ } int CFlisServerDlg::StartSerial(void) { + int Baud; - CString SerialPort = "COM3"; + ConfigFile config; + try { + config.ReadSettings(); + } catch(...) { + MessageBox("Could not open config file"); + OnOK(); + return true; + } + Baud = 1200; - if( Serial.isOpen() ){ - Serial.close(); - Serial.open( SerialPort, Baud ); + if( Serial.isOpen() ) + { + try + { + Serial.close(); + Serial.open( config.comport, Baud ); + } + catch (exception* e) + { + MessageBox( "Serial.open() exception" ); + return 0; + } } - else { - Serial.open( SerialPort, Baud ); + else + { + try + { + Serial.open( config.comport, Baud ); + } + catch (exception* e) + { + MessageBox( "Serial.open() exception 2" ); + return 0; + } } - + return 0; } @@ -178,9 +204,9 @@ std::vector buf; while(Serial.getComstat().cbInQue > 0) { - unsigned char data = Serial.readByte(); + unsigned char data = Serial.readByte(); - buf.push_back(data); + buf.push_back(data); } return buf; } @@ -214,28 +240,6 @@ data.push_back('5'); writeFrame(data); -/* Sleep(750); - if(Serial.getComstat().cbInQue > 0) - { - std::vector answer = readFrame(); - Sleep(50); - char array1[25]; - int i; - for (int i=0; i data) { @@ -252,25 +256,19 @@ CString tekst; std::vector answer = readFrame(); Sleep(50); - char array1[150]; - int i; - for (int i=0; i data) +void CFlisServerDlg::SendSmsHead(std::vector tlfnr) { vector atcommand; atcommand.push_back('a'); @@ -290,9 +288,9 @@ Sleep(5); } - for (int i=0; i CFlisServerDlg::DBRead(void) +vector CFlisServerDlg::DBReadCommands(void) { vector buffer; CString SQL, IDnr, CommandID, InstallationsID; - SQL = "select id,date_trunc('second', created) as created,executed,commandid,installationid from command WHERE executed IS NULL;"; + SQL = "select id,date_trunc('second', created) as created,executed,commandid,installationid from command WHERE executed IS NULL ORDER BY created ASC LIMIT 1;"; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); if (rs.GetRecordCount()>0) { rs.MoveFirst(); - while(!rs.IsEOF()) - { - Commands Mycom; - rs.GetFieldValue((short)0, IDnr); - rs.GetFieldValue(3, CommandID); - rs.GetFieldValue(4, InstallationsID); - Mycom.IDnr = IDnr; - Mycom.CommandID = CommandID; - Mycom.InstallationsID = InstallationsID; + Commands Mycom; + rs.GetFieldValue((short)0, IDnr); + rs.GetFieldValue(3, CommandID); + rs.GetFieldValue(4, InstallationsID); + + Mycom.IDnr = IDnr; + Mycom.CommandID = CommandID; + Mycom.InstallationsID = InstallationsID; + + buffer.push_back(Mycom); + rs.MoveNext(); - buffer.push_back(Mycom); - rs.MoveNext(); - } } rs.Close(); return buffer; @@ -338,30 +341,21 @@ void CFlisServerDlg::ReadSms() { CString tekst, oldtekst; - Sleep(950); + Sleep(950); //Holder en pause for at lade hele sms'en komme ind i serial køen. if(Serial.getComstat().cbInQue > 0) { std::vector answer = readFrame(); Sleep(50); - char array1[250]; - int i; - for (int i=0; i0) + { + rs.MoveFirst(); + rs.GetFieldValue((short)0,InstallNR); + } + rs.Close(); + + SQL.Format("insert into logtable (logtime,temperature,flamedetector,solidfuelempty,conveyorerror,powerfailure,messagenr,installationnr) Values (now(),%s,'%s','%s','%s','%s',%s,%s)",Temper, Flamme, Flis, FremFejl, PowerFail, SmsCount,InstallNR); + try + { + db.ExecuteSQL(SQL); + } + catch(CDBException* e) + { + MessageBox(e->m_strError); + } + AppendText("Sms added to Log"); + Sleep(150); } CString CFlisServerDlg::Splitter(CString& fyrdata) { @@ -434,7 +421,7 @@ { // TODO: Add your control notification handler code here continueThread = 0; - DeleteSms(); //<--- crasher, men gider ikke bruge flere af mine penge på at teste det med sms'er, hele close laver crash, bare ikke når jeg stepper. :S + DeleteSms(); Sleep(500); if( Serial.isOpen() ) @@ -444,7 +431,7 @@ if(db.IsOpen()) { - db.Close(); + db.Close(); } OnOK(); @@ -454,8 +441,43 @@ void CFlisServerDlg::OnBnClickedGsmpin() { // TODO: Add your control notification handler code here + bool ready = true; + m_Textwindow.SetWindowText("Indsætter Pinkode, og venter på modem bliver klar"); + UpdateWindow(); SetPin(); - Sleep(35000); + Sleep(500); + + while (ready == true) + { + if (Serial.getComstat().cbInQue > 120) + { + std::vector answer = readFrame(); + CString tekst; + + for (int i=0; i -1) + { + ready = false; + } + else + { + AppendText(tekst); + } + } + } + Sleep(100); //Give the modem a chance to send the last data + while(Serial.getComstat().cbInQue > 0) + { + Serial.readByte(); //Flush the incoming queue + Sleep(1); + } OnBnClickedStart(); } void CFlisServerDlg::DeleteSms() @@ -476,15 +498,7 @@ writeFrame(atcommand); Sleep(500); } -LRESULT CFlisServerDlg::OnShowString(WPARAM wParam, LPARAM lParam) -{ - CString *s = (CString*) lParam; - GetDlgItem(IDC_Textwindow)->SetWindowText(*s); - - delete s; - return 0; - -}UINT threadWrapper(LPVOID thread) +UINT threadWrapper(LPVOID thread) { CFlisServerDlg *t = (CFlisServerDlg*) thread; t->runthread(); @@ -512,24 +526,18 @@ Sleep(500); CString tekst, oldtekst; int lol; - char array1[250]; - int i; - for (int i=0; i data; - data = DBRead(); + data = DBReadCommands(); for (int i=0; i 1) { - testdata.Append(data[i].InstallationsID); - testdata.Append(":"); + sInstallationsID = data[i].InstallationsID; } } - sIDnr = Splitter(testdata); - sCommandID = Splitter(testdata); - sInstallationsID = "0"; + if (commandtest > 1) { - sInstallationsID = Splitter(testdata); - iAll = 0; + iAll = 0; } if (sIDnr.GetLength() > 0) { - DBReadData(sIDnr,sCommandID,sInstallationsID); + SendConfig(sIDnr,sCommandID,sInstallationsID); } Sleep(500); + + CheckAcknowledges(); + Sleep(500); + } + CTime now = CTime::GetCurrentTime(); + + CTimeSpan elapsed = now-Alive.tid; + + if (elapsed.GetTotalSeconds() >= 900) + { + keepaliveandread(); } } -void CFlisServerDlg::DBReadData(CString IDnr,CString CommandID,CString InstallationsID) -{ - CString ServerTlfNr; - int i = 0; - ServerTlfNr = "29860132"; - +void CFlisServerDlg::SendConfig(CString IDnr,CString CommandID,CString InstallationsID) +{ std::vector inst; - inst = DBReadPhone(InstallationsID); - while (i < inst.size()) + + if (CommandID == "1") + inst = DBReadPhone("0"); + else + inst = DBReadPhone(InstallationsID); + + for ( int j=0; j < inst.size(); j++) { CString TlfNr, Imei, updaterate; TlfNr.Empty(); Imei.Empty(); updaterate.Empty(); - CString dataen = inst[i].InstPhoneNr; + CString dataen = inst[j].InstPhoneNr; TlfNr.Append(dataen); - CString Imeidata = inst[i].Imei; + CString Imeidata = inst[j].Imei; Imei.Append(Imeidata); - CString updaterat = inst[i].Updaterate; + CString updaterat = inst[j].Updaterate; updaterate.Append(updaterat); - i++; - - vector tlfnr; - for (int i=0; i tlfnr; + for (int i=0; i smsdata; - - for (int i=0; i smsdata; + + for (int i=0; i CFlisServerDlg::DBReadPhone(CString sInstallationsID) { vector buffer; - CString SQL, phonenr, imei, updaterate; - int installernull; + CString SQL, phonenr, imei, updaterate, id; Installation Myinst; - installernull = atoi(sInstallationsID); - if (installernull > 1) + + if (sInstallationsID != "0") { - SQL.Format("select installationphonenr, imei, updaterate from installation WHERE id = %s", sInstallationsID); + SQL.Format("select installationphonenr, imei, updaterate, id from installation WHERE id = %s", sInstallationsID); } - else if(installernull < 2) + else { - SQL.Format("select installationphonenr, imei, updaterate from installation"); + SQL.Format("select installationphonenr, imei, updaterate, id from installation"); } + CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); if (rs.GetRecordCount()>0) @@ -747,10 +775,12 @@ rs.GetFieldValue((short)0,phonenr); rs.GetFieldValue(1,imei); rs.GetFieldValue(2,updaterate); + rs.GetFieldValue(3,id); Myinst.InstPhoneNr = phonenr; Myinst.Imei = imei; Myinst.Updaterate = updaterate; + Myinst.instID = id; buffer.push_back(Myinst); rs.MoveNext(); @@ -772,8 +802,148 @@ void CFlisServerDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here - + continueThread = 1; - + keepaliveandread(); + Sleep(150); + m_Textwindow.SetWindowText(CString("Server phonenr read from db: ") + Alive.Phonenr ); + AppendText("Started"); AfxBeginThread(threadWrapper,AfxGetMainWnd()); } +void CFlisServerDlg::AppendText(CString s) +{ + CString Tekst; + m_Textwindow.GetWindowText(Tekst); + Tekst.Append("\r\n"); + Tekst.Append(s); + m_Textwindow.SetWindowText(Tekst); + +} +void ConfigFile::ReadSettings() +{ + ifstream file("Server-Settings.ini"); + if (!file.is_open()) + throw("Could not open file"); + + char buf[200]; + while (!file.eof() ) { + file.getline(buf,200); + CString tmp(buf); + + if (tmp.GetAt(0) == '#') + continue; + + int pos = tmp.Find('='); + if (pos>0) { + CString key = tmp.Left(pos).Trim().MakeLower();; + CString value = tmp.Right(tmp.GetLength()-pos-1).Trim(); + + if (key == "host") + host = value; + else if (key == "username") + username = value; + else if (key == "password") + password = value; + else if (key == "database") + database = value; + else if (key == "comport") + comport = value; + } + + } + + file.close(); +} +void CFlisServerDlg::HandleAcknowledge(CString tlfnr) +{ + for (std::list::iterator it = Acks.begin(); it != Acks.end(); ++it) + { + Acknowledge& current = (*it); + if (current.sTlfNr == tlfnr) + { + CString SQL; + SQL.Format("UPDATE installation SET commerror = false WHERE id = %s", current.sInstallationID); + db.ExecuteSQL(SQL); + + Acks.erase(it); + + return; + } + } +} + +void CFlisServerDlg::CheckAcknowledges() +{ + CTime now = CTime::GetCurrentTime(); + for (std::list::iterator it = Acks.begin(); it != Acks.end(); ++it) + { + Acknowledge& current = (*it); + + CTimeSpan elapsed = now-current.cTime; + + if (elapsed.GetTotalSeconds() >= 300) + { + DumpAckList(); + if (current.iRetry >= 1) + { + CString SQL; + SQL.Format("UPDATE installation SET commerror = true WHERE id = %s", current.sInstallationID); + db.ExecuteSQL(SQL); + Acks.erase(it); + return; // the iterator is now invalidated, but the thread loop will make sure we are here soon again + } + else + { + SendConfig("0","2",current.sInstallationID); + current.iRetry++; + current.cTime = CTime::GetCurrentTime(); + AppendText( CString("Retry send config to ") + current.sTlfNr ); + } + } + } +} + +void CFlisServerDlg::DumpAckList() +{ + CTime now = CTime::GetCurrentTime(); + OutputDebugString("-------------------------------\n"); + int count = 0; + for (std::list::iterator it = Acks.begin(); it != Acks.end(); ++it) + { + CString msg; + msg.Format("%d:%d:%d> %4d : %s\n", now.GetHour(), now.GetMinute(), now.GetSecond(), count, (*it).sTlfNr); + OutputDebugString(msg); + count++; + } +} +vector CFlisServerDlg::keepaliveandread(void) +{ + vector buffer; + + CString SQL, name, value; + SQL = "select name, value from config;"; + CRecordset rs(&db); + rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); + if (rs.GetRecordCount()>0) + { + rs.MoveFirst(); + + rs.GetFieldValue((short)0, name); + rs.GetFieldValue(1,value); + + Alive.name = name; + Alive.value = value; + Alive.tid = CTime::GetCurrentTime(); + if(Alive.name == "phonenr") + { + Alive.Phonenr = value; + } + + buffer.push_back(Alive); + rs.MoveNext(); + + } + rs.Close(); + return buffer; + +} \ No newline at end of file