--- trunk/FlisServer/FlisServerDlg.cpp 2007/11/30 07:24:35 105 +++ trunk/FlisServer/FlisServerDlg.cpp 2007/12/08 09:45:58 191 @@ -4,8 +4,9 @@ #include "stdafx.h" #include "FlisServer.h" #include "FlisServerDlg.h" -#include ".\flisserverdlg.h" #include +#include ".\flisserverdlg.h" +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -64,9 +65,8 @@ ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP - ON_BN_CLICKED(IDC_test, OnBnClickedtest) ON_BN_CLICKED(IDCLOSE, OnBnClickedClose) - ON_BN_CLICKED(IDC_GSMPIN, OnBnClickedGsmpin) + ON_BN_CLICKED(IDC_Start, OnBnClickedStart) END_MESSAGE_MAP() @@ -102,6 +102,7 @@ // TODO: Add extra initialization here StartSerial(); DBConnect(); + ResetSms = 0; return TRUE; // return TRUE unless you set the focus to a control } @@ -156,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; } @@ -176,82 +204,13 @@ 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; } -void CFlisServerDlg::OnBnClickedtest() -{ - // TODO: Add your control notification handler code here -/* -////////////////Read sms ting////////////////// - CString tekst; - std::vector 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('='); - data.push_back('1'); - writeFrame(data); - ReadSms(); -////////////////Read sms ting////////////////// -*/ -/* -////////////////DBRead stuff////////////////// - CString testdata; - std::vector data; - data = DBRead(); - for (int i=0; i tlfnr; - vector smsdata; - tlfnr.push_back('2'); - tlfnr.push_back('9'); - tlfnr.push_back('7'); - tlfnr.push_back('2'); - tlfnr.push_back('2'); - tlfnr.push_back('6'); - tlfnr.push_back('0'); - tlfnr.push_back('3'); - - SendSmsHead(tlfnr); - - //35:29860132:75 <--- demo pakke; - smsdata.push_back('3'); - smsdata.push_back('5'); - smsdata.push_back(':'); - smsdata.push_back('2'); - smsdata.push_back('9'); - smsdata.push_back('8'); - smsdata.push_back('6'); - smsdata.push_back('0'); - smsdata.push_back('1'); - smsdata.push_back('3'); - smsdata.push_back('2'); - smsdata.push_back(':'); - smsdata.push_back('7'); - smsdata.push_back('5'); - - SendSmsData(smsdata); -///////////////Send sms stuff///////////////// -*/ -} void CFlisServerDlg::writeFrame(std::vector data) { for (int i=0; i data; + data.push_back('a'); data.push_back('t'); data.push_back('+'); @@ -274,35 +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(750); + Sleep(100); if(Serial.getComstat().cbInQue > 0) { std::vector answer = readFrame(); Sleep(50); - char array1[25]; - int i; - 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); @@ -396,90 +418,93 @@ buffer.push_back(Mycom); rs.MoveNext(); - } + } rs.Close(); return buffer; } void CFlisServerDlg::ReadSms() { - CString tekst, oldtekst; - Sleep(950); + CString tekst; + 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; i regex; + if (regex.Parse("^{[0-9]+}:{[0-9]+}:[0-1]:[0-1]:[0-1]:[0-1]:$") == REPARSE_ERROR_OK) + { + + CAtlREMatchContext<> pContext; - for (int s=55; s<=(data.GetLength()-3); s++) + if (!regex.Match(FyrData, &pContext)) + { + AppendText("Invalid SMS recieved"); + return; + } + } + else { - FyrData.AppendChar(CharData[s]); + AppendText("Regex PARSE error!!!"); //Burde aldrig kunne ske ! } - FyrData.Append(":"); - + SmsCount = Splitter(FyrData); Temper = Splitter(FyrData); Flamme = Splitter(FyrData); Flis = Splitter(FyrData); FremFejl = Splitter(FyrData); PowerFail = Splitter(FyrData); -/////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////// Her skal sendes data til databasen ////////////////////////////////////////////// - m_Textwindow.GetWindowText(oldtekst); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer SmsCount. \r\n"); - oldtekst.Append(SmsCount); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer Temper. \r\n"); - oldtekst.Append(Temper); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer Flamme. \r\n"); - oldtekst.Append(Flamme); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer Flis. \r\n"); - oldtekst.Append(Flis); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer FremFejl. \r\n"); - oldtekst.Append(FremFejl); - oldtekst.Append("\r\n"); - oldtekst.Append("På næste linie kommer PowerFail. \r\n"); - oldtekst.Append(PowerFail); - m_Textwindow.SetWindowText(oldtekst); -/////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////// Her skal sendes data til databasen ////////////////////////////////////////////// + + CString SQL, Textwindow, InstallNR; + SQL.Format("select ID from installation where installationphonenr=%s",TlfNr); + + CRecordset rs(&db); + rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); + if (rs.GetRecordCount()>0) + { + 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) { @@ -496,7 +521,11 @@ void CFlisServerDlg::OnBnClickedClose() { // TODO: Add your control notification handler code here - + continueThread = 0; + Sleep(250); + DeleteSms(); + + Sleep(500); if( Serial.isOpen() ) { Serial.close(); @@ -504,13 +533,513 @@ if(db.IsOpen()) { - db.Close(); + db.Close(); } + OnOK(); + +} +void CFlisServerDlg::DeleteSms() +{ + vector atcommand; + atcommand.push_back('a'); + atcommand.push_back('t'); + atcommand.push_back('+'); + atcommand.push_back('c'); + atcommand.push_back('m'); + atcommand.push_back('g'); + atcommand.push_back('d'); + atcommand.push_back('='); + atcommand.push_back('1'); + atcommand.push_back(','); + atcommand.push_back('3'); + + writeFrame(atcommand); + Sleep(500); +} +UINT threadWrapper(LPVOID thread) +{ + CFlisServerDlg *t = (CFlisServerDlg*) thread; + t->runthread(); + return 0; } -void CFlisServerDlg::OnBnClickedGsmpin() +void CFlisServerDlg::startthread() { - // TODO: Add your control notification handler code here + AfxBeginThread(threadWrapper, (LPVOID) this); +} + +void CFlisServerDlg::runthread() +{ + while (continueThread != 0) + { + MyMainThread(); + } +} +void CFlisServerDlg::MyMainThread() +{ + if(Serial.getComstat().cbInQue > 0) + { + Sleep(250); + std::vector answer = readFrame(); + Sleep(500); + 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]); + } + AppendText(CString(&data[0])); + writeFrame(data); + Sleep(200); + ReadSms(); + ResetSms++; + + } + else if(command.MakeLower() == "wind") + { + + CString send; + send.Append("Wind modtaget"); + send.Append("\r\n"); + send.Append(tekst); + AppendText(send); + } + } + else + { + AppendText(tekst); + } + if(ResetSms == 20) + { + DeleteSms(); + AppendText("Sms'er slettet da vi nåede grænsen"); + } + + } + if (continueThread == 1) + { + + CString testdata, dataframe,testprint, sIDnr, sCommandID, sInstallationsID, sImei; + int commandtest = 0; + int iAll = 1; + std::vector data; + data = DBReadCommands(); + for (int i=0; i 1) + { + sInstallationsID = data[i].InstallationsID; + } + } + + if (commandtest > 1) + { + iAll = 0; + } + + if (sIDnr.GetLength() > 0) + { + 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) +{ + + std::vector inst; + + 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[j].InstPhoneNr; + TlfNr.Append(dataen); + CString Imeidata = inst[j].Imei; + Imei.Append(Imeidata); + CString updaterat = inst[j].Updaterate; + updaterate.Append(updaterat); + + vector tlfnr; + for (int i=0; i smsdata; + + for (int i=0; i CFlisServerDlg::DBReadPhone(CString sInstallationsID) +{ + vector buffer; + + CString SQL, phonenr, imei, updaterate, id; + Installation Myinst; + + if (sInstallationsID != "0") + { + SQL.Format("select installationphonenr, imei, updaterate, id from installation WHERE id = %s", sInstallationsID); + } + else + { + SQL.Format("select installationphonenr, imei, updaterate, id from installation"); + } + + CRecordset rs(&db); + rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); + if (rs.GetRecordCount()>0) + { + rs.MoveFirst(); + while(!rs.IsEOF()) + { + + 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(); + } + } + rs.Close(); + return buffer; +} +int CFlisServerDlg::tversum(__int64 input) +{ + int sum = 0; + while (input > 0) + { + sum += (input %10); + input /= 10; + } + return sum; +} +void CFlisServerDlg::OnBnClickedStart() +{ +// 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; + 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.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() +{ + 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; + else if (key == "pincode") + pincode = 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() /* 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; + } + + }