/[H9]/trunk/FlisServer/FlisServerDlg.cpp
ViewVC logotype

Diff of /trunk/FlisServer/FlisServerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 138 by kevin, Mon Dec 3 14:40:44 2007 UTC revision 174 by kevin, Thu Dec 6 12:53:06 2007 UTC
# Line 6  Line 6 
6  #include "FlisServerDlg.h"  #include "FlisServerDlg.h"
7  #include <vector>  #include <vector>
8  #include ".\flisserverdlg.h"  #include ".\flisserverdlg.h"
9    #include <atlrx.h>
10    
11  #ifdef _DEBUG  #ifdef _DEBUG
12  #define new DEBUG_NEW  #define new DEBUG_NEW
# Line 65  BEGIN_MESSAGE_MAP(CFlisServerDlg, CDialo Line 66  BEGIN_MESSAGE_MAP(CFlisServerDlg, CDialo
66          ON_WM_QUERYDRAGICON()          ON_WM_QUERYDRAGICON()
67          //}}AFX_MSG_MAP          //}}AFX_MSG_MAP
68          ON_BN_CLICKED(IDCLOSE, OnBnClickedClose)          ON_BN_CLICKED(IDCLOSE, OnBnClickedClose)
         ON_BN_CLICKED(IDC_GSMPIN, OnBnClickedGsmpin)  
69          ON_BN_CLICKED(IDC_Start, OnBnClickedStart)          ON_BN_CLICKED(IDC_Start, OnBnClickedStart)
70  END_MESSAGE_MAP()  END_MESSAGE_MAP()
71    
# Line 224  void CFlisServerDlg::writeFrame(std::vec Line 224  void CFlisServerDlg::writeFrame(std::vec
224  }  }
225  void CFlisServerDlg::SetPin()  void CFlisServerDlg::SetPin()
226  {  {
227            bool ready = true;
228          CString tekst;          CString tekst;
229          std::vector<unsigned char> data;          std::vector<unsigned char> data;
230    
231          data.push_back('a');          data.push_back('a');
232          data.push_back('t');          data.push_back('t');
233          data.push_back('+');          data.push_back('+');
# Line 233  void CFlisServerDlg::SetPin() Line 235  void CFlisServerDlg::SetPin()
235          data.push_back('p');          data.push_back('p');
236          data.push_back('i');          data.push_back('i');
237          data.push_back('n');          data.push_back('n');
238          data.push_back('=');          data.push_back('?');
         data.push_back('2');  
         data.push_back('5');  
         data.push_back('9');  
         data.push_back('5');  
239    
240          writeFrame(data);          writeFrame(data);
241            Sleep(100);
242            if(Serial.getComstat().cbInQue > 0)
243            {
244                    std::vector<unsigned char> answer = readFrame();
245                    Sleep(50);
246    
247                    for (int i=0; i<answer.size(); i++)
248                            {
249                                    if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
250                                    {
251                                            tekst.AppendChar(answer[i]);
252                                    }
253                            }
254                            AppendText(tekst);
255            }
256            Sleep(5);
257            if (tekst.MakeLower() == "+cpin: sim pin")
258            {
259                    data.clear();
260                    data.push_back('a');
261                    data.push_back('t');
262                    data.push_back('+');
263                    data.push_back('c');
264                    data.push_back('p');
265                    data.push_back('i');
266                    data.push_back('n');
267                    data.push_back('=');
268                    data.push_back('2');
269                    data.push_back('5');
270                    data.push_back('9');
271                    data.push_back('5');
272    
273                    writeFrame(data);
274    
275                    Sleep(500);
276    
277                    while (ready == true)
278                    {
279                            if (Serial.getComstat().cbInQue > 120)
280                            {
281                                    std::vector<unsigned char> answer = readFrame();
282                                    CString tekst;
283                            
284                                    for (int i=0; i<answer.size(); i++)
285                                    {
286                                            if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
287                                            {
288                                                    tekst.AppendChar(answer[i]);
289                                            }
290                                    }
291                                    int n = tekst.Find("WIND: 11",0);
292                                    if (n > -1)
293                                    {
294                                            ready = false;
295                                    }
296                                    else
297                                    {
298                                            AppendText(tekst);
299                                    }
300                            }
301                            Sleep(10); //Small delay to avoid busy wait
302                    }
303            }
304            else if (tekst.MakeLower() == "+cpin: ready")
305            {
306                    AppendText("No pincode needed");
307            }
308            else
309            {
310                    AppendText("Error in pincode message");
311            }
312  }  }
313  void CFlisServerDlg::SendSmsData(std::vector<unsigned char> data)  void CFlisServerDlg::SendSmsData(std::vector<unsigned char> data)
314  {        {      
# Line 367  void CFlisServerDlg::SmsSplit(CString da Line 436  void CFlisServerDlg::SmsSplit(CString da
436          TlfNr = data.Mid(24,8);          TlfNr = data.Mid(24,8);
437          FyrData = data.Mid(57,data.GetLength()-59);          FyrData = data.Mid(57,data.GetLength()-59);
438          FyrData.Append(":");          FyrData.Append(":");
439            
440            if (FyrData.MakeLower() == "conf ok:")
441            {
442                    HandleAcknowledge(TlfNr);
443                    return;
444            }
445            CAtlRegExp<> regex;
446            if (regex.Parse("^{[0-9]+}:{[0-9]+}:[0-1]:[0-1]:[0-1]:[0-1]:$") == REPARSE_ERROR_OK)
447            {
448    
449                    CAtlREMatchContext<> pContext;
450    
451                    if (!regex.Match(FyrData, &pContext))
452                    {
453                            AppendText("Invalid SMS recieved");
454                            return;
455                    }
456            }
457            else
458            {
459                    AppendText("Regex PARSE error!!!"); //Burde aldrig kunne ske !
460            }
461    
462          SmsCount = Splitter(FyrData);          SmsCount = Splitter(FyrData);
463          Temper = Splitter(FyrData);          Temper = Splitter(FyrData);
464          Flamme = Splitter(FyrData);          Flamme = Splitter(FyrData);
# Line 415  void CFlisServerDlg::OnBnClickedClose() Line 506  void CFlisServerDlg::OnBnClickedClose()
506  {  {
507          // TODO: Add your control notification handler code here          // TODO: Add your control notification handler code here
508          continueThread = 0;          continueThread = 0;
509            Sleep(250);
510          DeleteSms();          DeleteSms();
511    
512          Sleep(500);          Sleep(500);
# Line 431  void CFlisServerDlg::OnBnClickedClose() Line 523  void CFlisServerDlg::OnBnClickedClose()
523          OnOK();          OnOK();
524    
525  }  }
   
 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();  
 }  
526  void CFlisServerDlg::DeleteSms()  void CFlisServerDlg::DeleteSms()
527  {  {
528          vector<unsigned char> atcommand;          vector<unsigned char> atcommand;
# Line 481  void CFlisServerDlg::runthread() Line 557  void CFlisServerDlg::runthread()
557  {  {
558          while (continueThread != 0)          while (continueThread != 0)
559          {          {
560                  Reader();                  MyMainThread();
561          }          }
562  }  }
563  void CFlisServerDlg::Reader()  void CFlisServerDlg::MyMainThread()
564  {  {
565          if(Serial.getComstat().cbInQue > 0)          if(Serial.getComstat().cbInQue > 0)
566                  {                  {
# Line 492  void CFlisServerDlg::Reader() Line 568  void CFlisServerDlg::Reader()
568                          std::vector<unsigned char> answer = readFrame();                          std::vector<unsigned char> answer = readFrame();
569                          Sleep(500);                          Sleep(500);
570                          CString tekst, oldtekst;                          CString tekst, oldtekst;
                         int lol;  
571                                    
572                          for (int i=0; i<answer.size(); i++)                          for (int i=0; i<answer.size(); i++)
573                          {                          {
# Line 504  void CFlisServerDlg::Reader() Line 579  void CFlisServerDlg::Reader()
579                          tekst.Append(":");                          tekst.Append(":");
580    
581                          CString command;                          CString command;
582                          bool plus;                          bool plus = false;
583                                  int pos = tekst.Find('+',0);                                  int pos = tekst.Find('+',0);
584                                  if (pos != -1)                                  if (pos != -1)
585                                  {                                  {
# Line 580  void CFlisServerDlg::Reader() Line 655  void CFlisServerDlg::Reader()
655                          }                          }
656                          else                          else
657                          {                          {
658                                  CString send;                                  AppendText(tekst);
                                 send.Append("Anden tekst end forventet");  
                                 send.Append("\r\n");  
                                 send.Append(tekst);  
                                 AppendText(send);  
659                          }                          }
660                          if(ResetSms == 20)                          if(ResetSms == 20)
661                          {                          {
# Line 623  void CFlisServerDlg::Reader() Line 694  void CFlisServerDlg::Reader()
694                          {                          {
695                                  SendConfig(sIDnr,sCommandID,sInstallationsID);                                  SendConfig(sIDnr,sCommandID,sInstallationsID);
696                          }                          }
697                            Sleep(300);
698    
699                            CheckAcknowledges();
700                          Sleep(500);                          Sleep(500);
701                  }                  }
702                    CTime now = CTime::GetCurrentTime();
703    
704                    CTimeSpan elapsed = now-Alive.tid;
705    
706                    if (elapsed.GetTotalSeconds() >= 900)
707                    {
708                            keepaliveandread();
709                    }
710  }  }
711  void CFlisServerDlg::SendConfig(CString IDnr,CString CommandID,CString InstallationsID)  void CFlisServerDlg::SendConfig(CString IDnr,CString CommandID,CString InstallationsID)
712  {  {      
         CString ServerTlfNr;  
         int i = 0;  
         ServerTlfNr = "29860132";  
                   
713                    
714          std::vector<Installation> inst;          std::vector<Installation> inst;
715          inst = DBReadPhone(InstallationsID);  
716          while (i < inst.size())          if (CommandID == "1")
717                    inst = DBReadPhone("0");
718            else
719                    inst = DBReadPhone(InstallationsID);
720    
721            for ( int j=0; j < inst.size(); j++)
722          {          {
723                  CString TlfNr, Imei, updaterate;                  CString TlfNr, Imei, updaterate;
724                  TlfNr.Empty();                  TlfNr.Empty();
725                  Imei.Empty();                  Imei.Empty();
726                  updaterate.Empty();                  updaterate.Empty();
727    
728                  CString dataen = inst[i].InstPhoneNr;                  CString dataen = inst[j].InstPhoneNr;
729                  TlfNr.Append(dataen);                  TlfNr.Append(dataen);
730                  CString Imeidata = inst[i].Imei;                  CString Imeidata = inst[j].Imei;
731                  Imei.Append(Imeidata);                  Imei.Append(Imeidata);
732                  CString updaterat = inst[i].Updaterate;                  CString updaterat = inst[j].Updaterate;
733                  updaterate.Append(updaterat);                  updaterate.Append(updaterat);
                 i++;  
           
         vector<unsigned char> tlfnr;  
         for (int i=0; i<TlfNr.GetLength(); i++)  
         {  
                 tlfnr.push_back(TlfNr[i]);  
         }  
734                    
735          int calcimei;                  vector<unsigned char> tlfnr;
736          __int64 buf;                  for (int i=0; i<TlfNr.GetLength(); i++)
737                    {
738                            tlfnr.push_back(TlfNr[i]);
739                    }
740                    
741                    int calcimei;
742                    __int64 buf;
743    
744          buf = atof(Imei);                  buf = atof(Imei);
745                            
746          calcimei = tversum(buf);                  calcimei = tversum(buf);
747                            
748          Imei.Format("%d",calcimei);                  Imei.Format("%d",calcimei);
749                            
750          SendSmsHead(tlfnr);                  SendSmsHead(tlfnr);
751          Sleep(250);                  Sleep(250);
752                            
753          vector<unsigned char> smsdata;                  vector<unsigned char> smsdata;
754                            
755          for (int i=0; i<Imei.GetLength(); i++)                  for (int i=0; i<Imei.GetLength(); i++)
756          {                  {
757                  smsdata.push_back(Imei[i]);                          smsdata.push_back(Imei[i]);
758          }                  }
759          smsdata.push_back(':');                  smsdata.push_back(':');
760          for (int i=0; i<ServerTlfNr.GetLength(); i++)                  for (int i=0; i<Alive.Phonenr.GetLength(); i++)
761          {                  {
762                  smsdata.push_back(ServerTlfNr[i]);                          smsdata.push_back(Alive.Phonenr[i]);
763          }                  }
764          smsdata.push_back(':');                  smsdata.push_back(':');
765          for (int i=0; i<updaterate.GetLength(); i++)                  for (int i=0; i<updaterate.GetLength(); i++)
766          {                  {
767                  smsdata.push_back(updaterate[i]);                          smsdata.push_back(updaterate[i]);
768          }                  }
769    
770                    SendSmsData(smsdata);
771                    Sleep(500);
772    
773                    if (IDnr != "0")
774                    {
775                            Acks.push_back( Acknowledge(inst[j].instID,TlfNr) );
776                    }
777    
         SendSmsData(smsdata);  
         Sleep(500);  
           
778          }          }
779    
780            if (IDnr != "0")
781            {
782                  CString SQL, Textwindow;                  CString SQL, Textwindow;
783                  SQL.Format("update command set executed=now() where id=%s",IDnr);                  SQL.Format("update command set executed=now() where id=%s",IDnr);
784                  db.ExecuteSQL(SQL);                  db.ExecuteSQL(SQL);
785                    Sleep(100);
786                  AppendText("Command executed");                  AppendText("Command executed");
787                  Sleep(150);          }
788            Sleep(150);
789    
790    
791    
792    
793  }  }
794  vector<Installation> CFlisServerDlg::DBReadPhone(CString sInstallationsID)  vector<Installation> CFlisServerDlg::DBReadPhone(CString sInstallationsID)
795  {  {
796          vector<Installation> buffer;          vector<Installation> buffer;
797    
798          CString SQL, phonenr, imei, updaterate;          CString SQL, phonenr, imei, updaterate, id;
         int installernull;  
799          Installation Myinst;          Installation Myinst;
800          installernull = atoi(sInstallationsID);  
801          if (installernull > 1)          if (sInstallationsID != "0")
802          {          {
803                  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);
804          }          }
805          else if(installernull < 2)          else
806          {          {
807                  SQL.Format("select installationphonenr, imei, updaterate from installation");                  SQL.Format("select installationphonenr, imei, updaterate, id from installation");
808          }          }
809    
810          CRecordset rs(&db);          CRecordset rs(&db);
811          rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);          rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
812          if (rs.GetRecordCount()>0)          if (rs.GetRecordCount()>0)
# Line 723  vector<Installation> CFlisServerDlg::DBR Line 818  vector<Installation> CFlisServerDlg::DBR
818                          rs.GetFieldValue((short)0,phonenr);                          rs.GetFieldValue((short)0,phonenr);
819                          rs.GetFieldValue(1,imei);                          rs.GetFieldValue(1,imei);
820                          rs.GetFieldValue(2,updaterate);                          rs.GetFieldValue(2,updaterate);
821                            rs.GetFieldValue(3,id);
822    
823                          Myinst.InstPhoneNr = phonenr;                          Myinst.InstPhoneNr = phonenr;
824                          Myinst.Imei = imei;                          Myinst.Imei = imei;
825                          Myinst.Updaterate = updaterate;                          Myinst.Updaterate = updaterate;
826                            Myinst.instID = id;
827    
828                          buffer.push_back(Myinst);                          buffer.push_back(Myinst);
829                          rs.MoveNext();                          rs.MoveNext();
# Line 749  void CFlisServerDlg::OnBnClickedStart() Line 846  void CFlisServerDlg::OnBnClickedStart()
846  {  {
847  // TODO: Add your control notification handler code here  // TODO: Add your control notification handler code here
848    
849            m_Textwindow.SetWindowText("Indsætter Pinkode, og venter på modem bliver klar, hvis pinkode er nødvendig");
850            UpdateWindow();
851            SetPin();
852            
853            Sleep(100); //Give the modem a chance to send the last data
854            while(Serial.getComstat().cbInQue > 0)
855            {
856                    Serial.readByte(); //Flush the incoming queue
857                    Sleep(1);
858            }
859        
860          continueThread = 1;          continueThread = 1;
861          m_Textwindow.SetWindowText("Started");          keepaliveandread();
862            Sleep(150);
863            m_Textwindow.SetWindowText(CString("Server phonenr read from db: ") + Alive.Phonenr );
864            AppendText("Started");
865          AfxBeginThread(threadWrapper,AfxGetMainWnd());          AfxBeginThread(threadWrapper,AfxGetMainWnd());
866  }  }
867  void CFlisServerDlg::AppendText(CString s)  void CFlisServerDlg::AppendText(CString s)
# Line 760  void CFlisServerDlg::AppendText(CString Line 871  void CFlisServerDlg::AppendText(CString
871          Tekst.Append("\r\n");          Tekst.Append("\r\n");
872          Tekst.Append(s);          Tekst.Append(s);
873          m_Textwindow.SetWindowText(Tekst);          m_Textwindow.SetWindowText(Tekst);
874            Sleep(5);
875            int g = m_Textwindow.GetScrollLimit(SB_VERT);
876            if (g > 0)
877            {
878            m_Textwindow.SetSel(m_Textwindow.GetWindowTextLength() -1,m_Textwindow.GetWindowTextLength(),false);
879            }
880    
881  }  }
882  void ConfigFile::ReadSettings()  void ConfigFile::ReadSettings()
# Line 796  void ConfigFile::ReadSettings() Line 913  void ConfigFile::ReadSettings()
913          }          }
914    
915          file.close();          file.close();
 }  
916    }
917    void CFlisServerDlg::HandleAcknowledge(CString tlfnr)
918    {
919            for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
920            {
921                    Acknowledge& current = (*it);
922                    if (current.sTlfNr == tlfnr)
923                    {
924                            CString SQL;
925                            SQL.Format("UPDATE installation SET commerror = false WHERE id = %s", current.sInstallationID);
926                            db.ExecuteSQL(SQL);
927    
928                            Acks.erase(it);
929    
930                            return;
931                    }
932            }
933    }
934    
935    void CFlisServerDlg::CheckAcknowledges()
936    {
937            CTime now = CTime::GetCurrentTime();
938            for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
939            {
940                    Acknowledge& current = (*it);
941    
942                    CTimeSpan elapsed = now-current.cTime;
943    
944                    if (elapsed.GetTotalSeconds() >= 300)
945                    {
946                            DumpAckList();
947                            if (current.iRetry >= 1)
948                            {
949                                    CString SQL;
950                                    SQL.Format("UPDATE installation SET commerror = true WHERE id = %s", current.sInstallationID);
951                                    db.ExecuteSQL(SQL);
952                                    Acks.erase(it);
953                                    return; // the iterator is now invalidated, but the thread loop will make sure we are here soon again
954                            }
955                            else
956                            {
957                                    SendConfig("0","2",current.sInstallationID);
958                                    current.iRetry++;
959                                    current.cTime = CTime::GetCurrentTime();
960                                    AppendText( CString("Retry send config to ") + current.sTlfNr );
961                            }
962                    }
963            }
964    }
965    
966    void CFlisServerDlg::DumpAckList()      /* Debug tool */
967    {
968            
969            CTime now = CTime::GetCurrentTime();
970            OutputDebugString("-------------------------------\n");
971            int count = 0;
972            for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
973            {
974                    CString msg;
975                    msg.Format("%d:%d:%d> %4d : %s\n", now.GetHour(), now.GetMinute(), now.GetSecond(), count, (*it).sTlfNr);
976                    OutputDebugString(msg);
977                    count++;
978            }
979    }
980    vector<keepalive> CFlisServerDlg::keepaliveandread(void)
981    {
982            vector<keepalive> buffer;
983    
984            CString SQL, name, value;
985            SQL = "select name, value from config;";
986            CRecordset rs(&db);
987            try
988            {
989                    rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
990                    if (rs.GetRecordCount()>0)
991                    {
992                            rs.MoveFirst();
993                            
994                            rs.GetFieldValue((short)0, name);
995                            rs.GetFieldValue(1,value);
996                    
997                            Alive.name = name;
998                            Alive.value = value;
999                            Alive.tid = CTime::GetCurrentTime();
1000                            if(Alive.name == "phonenr")
1001                            {
1002                                    Alive.Phonenr = value;
1003                            }
1004    
1005                            buffer.push_back(Alive);
1006                            rs.MoveNext();
1007    
1008                    }
1009                    rs.Close();
1010                    return buffer;
1011            }
1012            catch (char * str)
1013            {
1014                    AppendText("Keepalive failed, closing and opening the db connection again");
1015                    if(db.IsOpen())
1016                    {
1017                            db.Close();
1018                            AppendText("DB connection closed");
1019                    }
1020                    if(!db.IsOpen())
1021                    {
1022                            DBConnect();
1023                            AppendText("DB connection started again");
1024                    }
1025                    return buffer;
1026            }
1027    
1028            
1029    }

Legend:
Removed from v.138  
changed lines
  Added in v.174

  ViewVC Help
Powered by ViewVC 1.1.20