--- trunk/FlisServer/FlisServerDlg.cpp 2007/12/03 14:40:44 138 +++ trunk/FlisServer/FlisServerDlg.cpp 2007/12/10 07:25:35 209 @@ -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,96 @@ 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 0) { @@ -361,13 +446,33 @@ } void CFlisServerDlg::SmsSplit(CString data) { - CString FyrData, TlfNr, SmsCount, Temper, Flamme, Flis, FremFejl, PowerFail, oldtekst; - char CharData[150]; - strcpy(CharData,data); + CString FyrData, TlfNr, SmsCount, Temper, Flamme, Flis, FremFejl, PowerFail; 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 +520,7 @@ { // TODO: Add your control notification handler code here continueThread = 0; + Sleep(250); DeleteSms(); Sleep(500); @@ -431,22 +537,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,18 +571,17 @@ { while (continueThread != 0) { - Reader(); + MyMainThread(); } } -void CFlisServerDlg::Reader() +void CFlisServerDlg::MyMainThread() { if(Serial.getComstat().cbInQue > 0) { Sleep(250); std::vector answer = readFrame(); Sleep(500); - CString tekst, oldtekst; - int lol; + CString tekst; for (int i=0; i data; - data.push_back('a'); - data.push_back('t'); - data.push_back('+'); - data.push_back('c'); - data.push_back('m'); - data.push_back('g'); - data.push_back('r'); - data.push_back('='); - - for (int i=0; i< smscount.GetLength(); i++) - { - data.push_back(smscount[i]); - } - m_Textwindow.GetWindowText(oldteskst); - oldteskst.Append("\r\n"); - for (int i=0; i data; + data.push_back('a'); + data.push_back('t'); + data.push_back('+'); + data.push_back('c'); + data.push_back('m'); + data.push_back('g'); + data.push_back('r'); + data.push_back('='); + + for (int i=0; i< smscount.GetLength(); i++) + { + data.push_back(smscount[i]); + } + AppendText(CString(&data[0])); + writeFrame(data); + Sleep(200); + ReadSms(); } else if(command.MakeLower() == "wind") @@ -580,11 +662,7 @@ } else { - CString send; - send.Append("Anden tekst end forventet"); - send.Append("\r\n"); - send.Append(tekst); - AppendText(send); + AppendText(tekst); } if(ResetSms == 20) { @@ -623,95 +701,119 @@ { SendConfig(sIDnr,sCommandID,sInstallationsID); } + Sleep(300); + + 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 +825,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,17 +853,41 @@ { // TODO: Add your control notification handler code here + AppendText("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); + } + Sleep(5); + continueThread = 1; - m_Textwindow.SetWindowText("Started"); + keepaliveandread(); + Sleep(150); + AppendText(CString("Server phonenr read from db: ") + Alive.Phonenr ); + AppendText("Started"); AfxBeginThread(threadWrapper,AfxGetMainWnd()); } void CFlisServerDlg::AppendText(CString s) { + CTime now = CTime::GetCurrentTime(); CString Tekst; m_Textwindow.GetWindowText(Tekst); - Tekst.Append("\r\n"); + Tekst.AppendFormat("%02d:%02d:%02d : ", now.GetHour(), now.GetMinute(), now.GetSecond()); Tekst.Append(s); + Tekst.Append("\r\n"); + 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() @@ -791,9 +919,124 @@ database = value; else if (key == "comport") comport = value; + else if (key == "pincode") + pincode = value; } } 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; + } + + +}