--- trunk/FlisServer/FlisServerDlg.cpp 2007/12/03 14:40:44 138 +++ trunk/FlisServer/FlisServerDlg.cpp 2007/12/04 13:26:00 144 @@ -367,6 +367,12 @@ TlfNr = data.Mid(24,8); FyrData = data.Mid(57,data.GetLength()-59); FyrData.Append(":"); + + if (FyrData.MakeLower() == "conf ok:") + { + HandleAcknowledge(TlfNr); + return; + } SmsCount = Splitter(FyrData); Temper = Splitter(FyrData); @@ -435,16 +441,43 @@ void CFlisServerDlg::OnBnClickedGsmpin() { // TODO: Add your control notification handler code here - m_Textwindow.SetWindowText("Indsætter Pinkode, efterfuldt af 60sec pause"); + bool ready = true; + m_Textwindow.SetWindowText("Indsætter Pinkode, og venter på modem bliver klar"); UpdateWindow(); SetPin(); - Sleep(50000); + Sleep(500); - while (Serial.getComstat().cbInQue > 0) + 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() @@ -504,7 +537,7 @@ tekst.Append(":"); CString command; - bool plus; + bool plus = false; int pos = tekst.Find('+',0); if (pos != -1) { @@ -580,11 +613,7 @@ } else { - CString send; - send.Append("Anden tekst end forventet"); - send.Append("\r\n"); - send.Append(tekst); - AppendText(send); + AppendText(tekst); } if(ResetSms == 20) { @@ -624,94 +653,117 @@ 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::SendConfig(CString IDnr,CString CommandID,CString InstallationsID) -{ - CString ServerTlfNr; - int i = 0; - ServerTlfNr = "29860132"; - +{ 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) @@ -723,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(); @@ -748,9 +802,12 @@ void CFlisServerDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here - + continueThread = 1; - m_Textwindow.SetWindowText("Started"); + keepaliveandread(); + Sleep(150); + m_Textwindow.SetWindowText(CString("Server phonenr read from db: ") + Alive.Phonenr ); + AppendText("Started"); AfxBeginThread(threadWrapper,AfxGetMainWnd()); } void CFlisServerDlg::AppendText(CString s) @@ -796,4 +853,97 @@ } 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