--- trunk/FlisServer/FlisServerDlg.cpp 2007/12/03 14:40:44 138 +++ trunk/FlisServer/FlisServerDlg.cpp 2007/12/06 12:53:06 174 @@ -6,6 +6,7 @@ #include "FlisServerDlg.h" #include #include ".\flisserverdlg.h" +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -65,7 +66,6 @@ ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDCLOSE, OnBnClickedClose) - ON_BN_CLICKED(IDC_GSMPIN, OnBnClickedGsmpin) ON_BN_CLICKED(IDC_Start, OnBnClickedStart) END_MESSAGE_MAP() @@ -224,8 +224,10 @@ } void CFlisServerDlg::SetPin() { + bool ready = true; CString tekst; std::vector data; + data.push_back('a'); data.push_back('t'); data.push_back('+'); @@ -233,13 +235,80 @@ data.push_back('p'); data.push_back('i'); data.push_back('n'); - data.push_back('='); - data.push_back('2'); - data.push_back('5'); - data.push_back('9'); - data.push_back('5'); + data.push_back('?'); writeFrame(data); + Sleep(100); + if(Serial.getComstat().cbInQue > 0) + { + std::vector answer = readFrame(); + Sleep(50); + + for (int i=0; i 120) + { + std::vector answer = readFrame(); + CString tekst; + + for (int i=0; i -1) + { + ready = false; + } + else + { + AppendText(tekst); + } + } + Sleep(10); //Small delay to avoid busy wait + } + } + else if (tekst.MakeLower() == "+cpin: ready") + { + AppendText("No pincode needed"); + } + else + { + AppendText("Error in pincode message"); + } } void CFlisServerDlg::SendSmsData(std::vector data) { @@ -367,7 +436,29 @@ TlfNr = data.Mid(24,8); FyrData = data.Mid(57,data.GetLength()-59); FyrData.Append(":"); - + + if (FyrData.MakeLower() == "conf ok:") + { + HandleAcknowledge(TlfNr); + return; + } + CAtlRegExp<> regex; + if (regex.Parse("^{[0-9]+}:{[0-9]+}:[0-1]:[0-1]:[0-1]:[0-1]:$") == REPARSE_ERROR_OK) + { + + CAtlREMatchContext<> pContext; + + if (!regex.Match(FyrData, &pContext)) + { + AppendText("Invalid SMS recieved"); + return; + } + } + else + { + AppendText("Regex PARSE error!!!"); //Burde aldrig kunne ske ! + } + SmsCount = Splitter(FyrData); Temper = Splitter(FyrData); Flamme = Splitter(FyrData); @@ -415,6 +506,7 @@ { // TODO: Add your control notification handler code here continueThread = 0; + Sleep(250); DeleteSms(); Sleep(500); @@ -431,22 +523,6 @@ OnOK(); } - -void CFlisServerDlg::OnBnClickedGsmpin() -{ - // TODO: Add your control notification handler code here - m_Textwindow.SetWindowText("Indsætter Pinkode, efterfuldt af 60sec pause"); - UpdateWindow(); - SetPin(); - Sleep(50000); - - while (Serial.getComstat().cbInQue > 0) - { - Serial.readByte(); //Flush the incoming queue - } - - OnBnClickedStart(); -} void CFlisServerDlg::DeleteSms() { vector atcommand; @@ -481,10 +557,10 @@ { while (continueThread != 0) { - Reader(); + MyMainThread(); } } -void CFlisServerDlg::Reader() +void CFlisServerDlg::MyMainThread() { if(Serial.getComstat().cbInQue > 0) { @@ -492,7 +568,6 @@ std::vector answer = readFrame(); Sleep(500); CString tekst, oldtekst; - int lol; for (int i=0; i= 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 +818,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(); @@ -749,8 +846,22 @@ { // TODO: Add your control notification handler code here + m_Textwindow.SetWindowText("Indsætter Pinkode, og venter på modem bliver klar, hvis pinkode er nødvendig"); + UpdateWindow(); + SetPin(); + + 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); + } + 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) @@ -760,6 +871,12 @@ Tekst.Append("\r\n"); Tekst.Append(s); m_Textwindow.SetWindowText(Tekst); + Sleep(5); + int g = m_Textwindow.GetScrollLimit(SB_VERT); + if (g > 0) + { + m_Textwindow.SetSel(m_Textwindow.GetWindowTextLength() -1,m_Textwindow.GetWindowTextLength(),false); + } } void ConfigFile::ReadSettings() @@ -796,4 +913,117 @@ } file.close(); -} \ No newline at end of file +} +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() /* Debug tool */ +{ + + 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); + try + { + 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; + } + catch (char * str) + { + AppendText("Keepalive failed, closing and opening the db connection again"); + if(db.IsOpen()) + { + db.Close(); + AppendText("DB connection closed"); + } + if(!db.IsOpen()) + { + DBConnect(); + AppendText("DB connection started again"); + } + return buffer; + } + + +}