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

Contents of /trunk/FlisServer/FlisServerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 209 - (show annotations) (download)
Mon Dec 10 07:25:35 2007 UTC (16 years, 5 months ago) by kevin
File size: 22302 byte(s)
updated server software
1 // FlisServerDlg.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "FlisServer.h"
6 #include "FlisServerDlg.h"
7 #include <vector>
8 #include ".\flisserverdlg.h"
9 #include <atlrx.h>
10
11 #ifdef _DEBUG
12 #define new DEBUG_NEW
13 #endif
14
15
16 // CAboutDlg dialog used for App About
17
18 class CAboutDlg : public CDialog
19 {
20 public:
21 CAboutDlg();
22
23 // Dialog Data
24 enum { IDD = IDD_ABOUTBOX };
25
26 protected:
27 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
28
29 // Implementation
30 protected:
31 DECLARE_MESSAGE_MAP()
32 };
33
34 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
35 {
36 }
37
38 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
39 {
40 CDialog::DoDataExchange(pDX);
41 }
42
43 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
44 END_MESSAGE_MAP()
45
46
47 // CFlisServerDlg dialog
48
49
50
51 CFlisServerDlg::CFlisServerDlg(CWnd* pParent /*=NULL*/)
52 : CDialog(CFlisServerDlg::IDD, pParent)
53 {
54 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
55 }
56
57 void CFlisServerDlg::DoDataExchange(CDataExchange* pDX)
58 {
59 CDialog::DoDataExchange(pDX);
60 DDX_Control(pDX, IDC_Textwindow, m_Textwindow);
61 }
62
63 BEGIN_MESSAGE_MAP(CFlisServerDlg, CDialog)
64 ON_WM_SYSCOMMAND()
65 ON_WM_PAINT()
66 ON_WM_QUERYDRAGICON()
67 //}}AFX_MSG_MAP
68 ON_BN_CLICKED(IDCLOSE, OnBnClickedClose)
69 ON_BN_CLICKED(IDC_Start, OnBnClickedStart)
70 END_MESSAGE_MAP()
71
72
73 // CFlisServerDlg message handlers
74
75 BOOL CFlisServerDlg::OnInitDialog()
76 {
77 CDialog::OnInitDialog();
78
79 // Add "About..." menu item to system menu.
80
81 // IDM_ABOUTBOX must be in the system command range.
82 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
83 ASSERT(IDM_ABOUTBOX < 0xF000);
84
85 CMenu* pSysMenu = GetSystemMenu(FALSE);
86 if (pSysMenu != NULL)
87 {
88 CString strAboutMenu;
89 strAboutMenu.LoadString(IDS_ABOUTBOX);
90 if (!strAboutMenu.IsEmpty())
91 {
92 pSysMenu->AppendMenu(MF_SEPARATOR);
93 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
94 }
95 }
96
97 // Set the icon for this dialog. The framework does this automatically
98 // when the application's main window is not a dialog
99 SetIcon(m_hIcon, TRUE); // Set big icon
100 SetIcon(m_hIcon, FALSE); // Set small icon
101
102 // TODO: Add extra initialization here
103 StartSerial();
104 DBConnect();
105 ResetSms = 0;
106
107 return TRUE; // return TRUE unless you set the focus to a control
108 }
109
110 void CFlisServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
111 {
112 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
113 {
114 CAboutDlg dlgAbout;
115 dlgAbout.DoModal();
116 }
117 else
118 {
119 CDialog::OnSysCommand(nID, lParam);
120 }
121 }
122
123 // If you add a minimize button to your dialog, you will need the code below
124 // to draw the icon. For MFC applications using the document/view model,
125 // this is automatically done for you by the framework.
126
127 void CFlisServerDlg::OnPaint()
128 {
129 if (IsIconic())
130 {
131 CPaintDC dc(this); // device context for painting
132
133 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
134
135 // Center icon in client rectangle
136 int cxIcon = GetSystemMetrics(SM_CXICON);
137 int cyIcon = GetSystemMetrics(SM_CYICON);
138 CRect rect;
139 GetClientRect(&rect);
140 int x = (rect.Width() - cxIcon + 1) / 2;
141 int y = (rect.Height() - cyIcon + 1) / 2;
142
143 // Draw the icon
144 dc.DrawIcon(x, y, m_hIcon);
145 }
146 else
147 {
148 CDialog::OnPaint();
149 }
150 }
151
152 // The system calls this function to obtain the cursor to display while the user drags
153 // the minimized window.
154 HCURSOR CFlisServerDlg::OnQueryDragIcon()
155 {
156 return static_cast<HCURSOR>(m_hIcon);
157 }
158 int CFlisServerDlg::StartSerial(void)
159 {
160
161 int Baud;
162
163 ConfigFile config;
164 try {
165 config.ReadSettings();
166 } catch(...) {
167 MessageBox("Could not open config file");
168 OnOK();
169 return true;
170 }
171
172 Baud = 1200;
173 if( Serial.isOpen() )
174 {
175 try
176 {
177 Serial.close();
178 Serial.open( config.comport, Baud );
179 }
180 catch (exception* e)
181 {
182 MessageBox( "Serial.open() exception" );
183 return 0;
184 }
185 }
186 else
187 {
188 try
189 {
190 Serial.open( config.comport, Baud );
191 }
192 catch (exception* e)
193 {
194 MessageBox( "Serial.open() exception 2" );
195 return 0;
196 }
197 }
198
199
200 return 0;
201 }
202 std::vector<unsigned char> CFlisServerDlg::readFrame()
203 {
204 std::vector<unsigned char> buf;
205 while(Serial.getComstat().cbInQue > 0)
206 {
207 unsigned char data = Serial.readByte();
208
209 buf.push_back(data);
210 }
211 return buf;
212 }
213
214 void CFlisServerDlg::writeFrame(std::vector<unsigned char> data)
215 {
216 for (int i=0; i<data.size(); i++)
217 {
218 Serial.writeByte( data[i] );
219 Sleep(5);
220 }
221 Serial.writeByte(0x0D);
222 Sleep(100);
223
224 }
225 void CFlisServerDlg::SetPin()
226 {
227 bool ready = true;
228 CString tekst;
229 std::vector<unsigned char> data;
230
231 data.push_back('a');
232 data.push_back('t');
233 data.push_back('+');
234 data.push_back('c');
235 data.push_back('p');
236 data.push_back('i');
237 data.push_back('n');
238 data.push_back('?');
239
240 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 tekst.MakeLower();
258 int pos = tekst.Find("+cpin: ",0);
259 if (pos != -1)
260 {
261 tekst = tekst.Right( tekst.GetLength() - pos -1);
262 }
263
264 if (tekst == "cpin: sim pin")
265 {
266 CString pin;
267 ConfigFile config;
268 try {
269 config.ReadSettings();
270 } catch(...) {
271 MessageBox("Could not open config file");
272 }
273 Sleep(50);
274
275 data.clear();
276 data.push_back('a');
277 data.push_back('t');
278 data.push_back('+');
279 data.push_back('c');
280 data.push_back('p');
281 data.push_back('i');
282 data.push_back('n');
283 data.push_back('=');
284 for (int i = 0; i<config.pincode.GetLength(); i++)
285 {
286 data.push_back(config.pincode[i]);
287 }
288
289 writeFrame(data);
290
291 Sleep(500);
292
293 while (ready == true)
294 {
295 if (Serial.getComstat().cbInQue > 120)
296 {
297 std::vector<unsigned char> answer = readFrame();
298 CString tekst;
299
300 for (int i=0; i<answer.size(); i++)
301 {
302 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
303 {
304 tekst.AppendChar(answer[i]);
305 }
306 }
307 int n = tekst.Find("WIND: 11",0);
308 if (n > -1)
309 {
310 ready = false;
311 }
312 else
313 {
314 AppendText(tekst);
315 }
316 }
317 Sleep(10); //Small delay to avoid busy wait
318 }
319 }
320 else if (tekst == "cpin: ready")
321 {
322 AppendText("No pincode needed");
323 }
324 else
325 {
326 AppendText("Error in set pin part of the code");
327 }
328 }
329 void CFlisServerDlg::SendSmsData(std::vector<unsigned char> data)
330 {
331
332 for (int i=0; i<data.size(); i++)
333 {
334 Serial.writeByte( data[i] );
335 Sleep(5);
336 }
337 Serial.writeByte(0x1A);
338 Sleep(3000);
339 if(Serial.getComstat().cbInQue > 0)
340 {
341 CString tekst;
342 std::vector<unsigned char> answer = readFrame();
343 Sleep(50);
344
345 for (int i=0; i<answer.size(); i++)
346 {
347 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
348 {
349 tekst.AppendChar(answer[i]);
350 }
351 }
352 AppendText(tekst);
353 }
354
355 }
356 void CFlisServerDlg::SendSmsHead(std::vector<unsigned char> tlfnr)
357 {
358 vector<unsigned char> atcommand;
359 atcommand.push_back('a');
360 atcommand.push_back('t');
361 atcommand.push_back('+');
362 atcommand.push_back('c');
363 atcommand.push_back('m');
364 atcommand.push_back('g');
365 atcommand.push_back('s');
366 atcommand.push_back('=');
367 atcommand.push_back('"');
368 int s = (atcommand.size() -1 );
369
370 for (int i=0; i<(atcommand.size()); i++)
371 {
372 Serial.writeByte( atcommand[i] );
373 Sleep(5);
374 }
375
376 for (int i=0; i<tlfnr.size(); i++)
377 {
378 Serial.writeByte( tlfnr[i] );
379 Sleep(5);
380 }
381 Serial.writeByte(atcommand[s]);
382 Serial.writeByte(0x0D);
383 Sleep(250);
384 }
385 void CFlisServerDlg::DBConnect()
386 {
387 CString dsn;
388 ConfigFile config;
389 try {
390 config.ReadSettings();
391 } catch(...) {
392 MessageBox("Could not open config file");
393 }
394
395 dsn.Format("ODBC;Description=asd;DRIVER=PostgreSQL ANSI;SERVER=%s; uid=%s;password=%s;database=%s;sslmode=prefer",config.host,config.username, config.password, config.database);
396 db.OpenEx(dsn, CDatabase::noOdbcDialog);
397 }
398 vector<Commands> CFlisServerDlg::DBReadCommands(void)
399 {
400 vector<Commands> buffer;
401
402 CString SQL, IDnr, CommandID, InstallationsID;
403 SQL = "select id,date_trunc('second', created) as created,executed,commandid,installationid from command WHERE executed IS NULL ORDER BY created ASC LIMIT 1;";
404 CRecordset rs(&db);
405 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
406 if (rs.GetRecordCount()>0)
407 {
408 rs.MoveFirst();
409
410 Commands Mycom;
411 rs.GetFieldValue((short)0, IDnr);
412 rs.GetFieldValue(3, CommandID);
413 rs.GetFieldValue(4, InstallationsID);
414
415 Mycom.IDnr = IDnr;
416 Mycom.CommandID = CommandID;
417 Mycom.InstallationsID = InstallationsID;
418
419 buffer.push_back(Mycom);
420 rs.MoveNext();
421
422 }
423 rs.Close();
424 return buffer;
425 }
426 void CFlisServerDlg::ReadSms()
427 {
428 CString tekst;
429 Sleep(950); //Holder en pause for at lade hele sms'en komme ind i serial køen.
430 if(Serial.getComstat().cbInQue > 0)
431 {
432 std::vector<unsigned char> answer = readFrame();
433 Sleep(50);
434
435 for (int i=0; i<answer.size(); i++)
436 {
437 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
438 {
439 tekst.AppendChar(answer[i]);
440 }
441 }
442
443 AppendText(tekst);
444 SmsSplit(tekst);
445 }
446 }
447 void CFlisServerDlg::SmsSplit(CString data)
448 {
449 CString FyrData, TlfNr, SmsCount, Temper, Flamme, Flis, FremFejl, PowerFail;
450 TlfNr = data.Mid(24,8);
451 FyrData = data.Mid(57,data.GetLength()-59);
452 FyrData.Append(":");
453
454 if (FyrData.MakeLower() == "conf ok:")
455 {
456 HandleAcknowledge(TlfNr);
457 return;
458 }
459 CAtlRegExp<> regex;
460 if (regex.Parse("^{[0-9]+}:{[0-9]+}:[0-1]:[0-1]:[0-1]:[0-1]:$") == REPARSE_ERROR_OK)
461 {
462
463 CAtlREMatchContext<> pContext;
464
465 if (!regex.Match(FyrData, &pContext))
466 {
467 AppendText("Invalid SMS recieved");
468 return;
469 }
470 }
471 else
472 {
473 AppendText("Regex PARSE error!!!"); //Burde aldrig kunne ske !
474 }
475
476 SmsCount = Splitter(FyrData);
477 Temper = Splitter(FyrData);
478 Flamme = Splitter(FyrData);
479 Flis = Splitter(FyrData);
480 FremFejl = Splitter(FyrData);
481 PowerFail = Splitter(FyrData);
482
483 CString SQL, Textwindow, InstallNR;
484 SQL.Format("select ID from installation where installationphonenr=%s",TlfNr);
485
486 CRecordset rs(&db);
487 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
488 if (rs.GetRecordCount()>0)
489 {
490 rs.MoveFirst();
491 rs.GetFieldValue((short)0,InstallNR);
492 }
493 rs.Close();
494
495 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);
496 try
497 {
498 db.ExecuteSQL(SQL);
499 }
500 catch(CDBException* e)
501 {
502 MessageBox(e->m_strError);
503 }
504 AppendText("Sms added to Log");
505 Sleep(150);
506 }
507 CString CFlisServerDlg::Splitter(CString& fyrdata)
508 {
509 CString Output;
510
511 int pos = fyrdata.Find(':',0);
512 if (pos != -1)
513 {
514 Output = fyrdata.Left(pos);
515 fyrdata = fyrdata.Right( fyrdata.GetLength() - pos -1);
516 }
517 return Output;
518 }
519 void CFlisServerDlg::OnBnClickedClose()
520 {
521 // TODO: Add your control notification handler code here
522 continueThread = 0;
523 Sleep(250);
524 DeleteSms();
525
526 Sleep(500);
527 if( Serial.isOpen() )
528 {
529 Serial.close();
530 }
531
532 if(db.IsOpen())
533 {
534 db.Close();
535 }
536
537 OnOK();
538
539 }
540 void CFlisServerDlg::DeleteSms()
541 {
542 vector<unsigned char> atcommand;
543 atcommand.push_back('a');
544 atcommand.push_back('t');
545 atcommand.push_back('+');
546 atcommand.push_back('c');
547 atcommand.push_back('m');
548 atcommand.push_back('g');
549 atcommand.push_back('d');
550 atcommand.push_back('=');
551 atcommand.push_back('1');
552 atcommand.push_back(',');
553 atcommand.push_back('3');
554
555 writeFrame(atcommand);
556 Sleep(500);
557 }
558 UINT threadWrapper(LPVOID thread)
559 {
560 CFlisServerDlg *t = (CFlisServerDlg*) thread;
561 t->runthread();
562 return 0;
563 }
564
565 void CFlisServerDlg::startthread()
566 {
567 AfxBeginThread(threadWrapper, (LPVOID) this);
568 }
569
570 void CFlisServerDlg::runthread()
571 {
572 while (continueThread != 0)
573 {
574 MyMainThread();
575 }
576 }
577 void CFlisServerDlg::MyMainThread()
578 {
579 if(Serial.getComstat().cbInQue > 0)
580 {
581 Sleep(250);
582 std::vector<unsigned char> answer = readFrame();
583 Sleep(500);
584 CString tekst;
585
586 for (int i=0; i<answer.size(); i++)
587 {
588 if ((answer[i] != 0x0A) && (answer[i] != 0x0D))
589 {
590 tekst.AppendChar(answer[i]);
591 }
592 }
593 tekst.Append(":");
594
595 CString command;
596 bool plus = false;
597 int pos = tekst.Find('+',0);
598 if (pos != -1)
599 {
600 plus = true;
601 tekst = tekst.Right( tekst.GetLength() - pos -1);
602 pos = tekst.Find(':');
603 command = tekst.Left(pos);
604 tekst = tekst.Right( tekst.GetLength() - pos -1);
605 }
606
607
608 if(tekst.MakeLower() == "ok")
609 {
610 AppendText("OK tekst modtaget");
611 }
612 else if (tekst.MakeLower() == "error")
613 {
614 CString send;
615 send.Append("error tekst");
616 send.Append("\r\n");
617 send.Append(tekst);
618 AppendText(send);
619 }
620 else if (plus == true)
621 {
622 if (command.MakeLower() == "cmti")
623 {
624 CString smscount;
625 int pos = tekst.Find(',',0);
626 if (pos != -1)
627 {
628 smscount = tekst.Right( tekst.GetLength() - pos -1);
629 smscount.Remove(':');
630 ResetSms++;
631 }
632
633 std::vector<unsigned char> data;
634 data.push_back('a');
635 data.push_back('t');
636 data.push_back('+');
637 data.push_back('c');
638 data.push_back('m');
639 data.push_back('g');
640 data.push_back('r');
641 data.push_back('=');
642
643 for (int i=0; i< smscount.GetLength(); i++)
644 {
645 data.push_back(smscount[i]);
646 }
647 AppendText(CString(&data[0]));
648 writeFrame(data);
649 Sleep(200);
650 ReadSms();
651
652 }
653 else if(command.MakeLower() == "wind")
654 {
655
656 CString send;
657 send.Append("Wind modtaget");
658 send.Append("\r\n");
659 send.Append(tekst);
660 AppendText(send);
661 }
662 }
663 else
664 {
665 AppendText(tekst);
666 }
667 if(ResetSms == 20)
668 {
669 DeleteSms();
670 AppendText("Sms'er slettet da vi nåede grænsen");
671 }
672
673 }
674 if (continueThread == 1)
675 {
676
677 CString testdata, dataframe,testprint, sIDnr, sCommandID, sInstallationsID, sImei;
678 int commandtest = 0;
679 int iAll = 1;
680 std::vector<Commands> data;
681 data = DBReadCommands();
682 for (int i=0; i<data.size(); i++)
683 {
684 sIDnr = data[i].IDnr;
685 sCommandID = data[i].CommandID;
686 commandtest = atoi(data[i].CommandID);
687 sInstallationsID = "0";
688
689 if(commandtest > 1)
690 {
691 sInstallationsID = data[i].InstallationsID;
692 }
693 }
694
695 if (commandtest > 1)
696 {
697 iAll = 0;
698 }
699
700 if (sIDnr.GetLength() > 0)
701 {
702 SendConfig(sIDnr,sCommandID,sInstallationsID);
703 }
704 Sleep(300);
705
706 CheckAcknowledges();
707 Sleep(500);
708 }
709 CTime now = CTime::GetCurrentTime();
710
711 CTimeSpan elapsed = now-Alive.tid;
712
713 if (elapsed.GetTotalSeconds() >= 900)
714 {
715 keepaliveandread();
716 }
717 }
718 void CFlisServerDlg::SendConfig(CString IDnr,CString CommandID,CString InstallationsID)
719 {
720
721 std::vector<Installation> inst;
722
723 if (CommandID == "1")
724 inst = DBReadPhone("0");
725 else
726 inst = DBReadPhone(InstallationsID);
727
728 for ( int j=0; j < inst.size(); j++)
729 {
730 CString TlfNr, Imei, updaterate;
731 TlfNr.Empty();
732 Imei.Empty();
733 updaterate.Empty();
734
735 CString dataen = inst[j].InstPhoneNr;
736 TlfNr.Append(dataen);
737 CString Imeidata = inst[j].Imei;
738 Imei.Append(Imeidata);
739 CString updaterat = inst[j].Updaterate;
740 updaterate.Append(updaterat);
741
742 vector<unsigned char> tlfnr;
743 for (int i=0; i<TlfNr.GetLength(); i++)
744 {
745 tlfnr.push_back(TlfNr[i]);
746 }
747
748 int calcimei;
749 __int64 buf;
750
751 buf = atof(Imei);
752
753 calcimei = tversum(buf);
754
755 Imei.Format("%d",calcimei);
756
757 SendSmsHead(tlfnr);
758 Sleep(250);
759
760 vector<unsigned char> smsdata;
761
762 for (int i=0; i<Imei.GetLength(); i++)
763 {
764 smsdata.push_back(Imei[i]);
765 }
766 smsdata.push_back(':');
767 for (int i=0; i<Alive.Phonenr.GetLength(); i++)
768 {
769 smsdata.push_back(Alive.Phonenr[i]);
770 }
771 smsdata.push_back(':');
772 for (int i=0; i<updaterate.GetLength(); i++)
773 {
774 smsdata.push_back(updaterate[i]);
775 }
776
777 SendSmsData(smsdata);
778 Sleep(500);
779
780 if (IDnr != "0")
781 {
782 Acks.push_back( Acknowledge(inst[j].instID,TlfNr) );
783 }
784
785 }
786
787 if (IDnr != "0")
788 {
789 CString SQL, Textwindow;
790 SQL.Format("update command set executed=now() where id=%s",IDnr);
791 db.ExecuteSQL(SQL);
792 Sleep(100);
793 AppendText("Command executed");
794 }
795 Sleep(150);
796
797
798
799
800 }
801 vector<Installation> CFlisServerDlg::DBReadPhone(CString sInstallationsID)
802 {
803 vector<Installation> buffer;
804
805 CString SQL, phonenr, imei, updaterate, id;
806 Installation Myinst;
807
808 if (sInstallationsID != "0")
809 {
810 SQL.Format("select installationphonenr, imei, updaterate, id from installation WHERE id = %s", sInstallationsID);
811 }
812 else
813 {
814 SQL.Format("select installationphonenr, imei, updaterate, id from installation");
815 }
816
817 CRecordset rs(&db);
818 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
819 if (rs.GetRecordCount()>0)
820 {
821 rs.MoveFirst();
822 while(!rs.IsEOF())
823 {
824
825 rs.GetFieldValue((short)0,phonenr);
826 rs.GetFieldValue(1,imei);
827 rs.GetFieldValue(2,updaterate);
828 rs.GetFieldValue(3,id);
829
830 Myinst.InstPhoneNr = phonenr;
831 Myinst.Imei = imei;
832 Myinst.Updaterate = updaterate;
833 Myinst.instID = id;
834
835 buffer.push_back(Myinst);
836 rs.MoveNext();
837 }
838 }
839 rs.Close();
840 return buffer;
841 }
842 int CFlisServerDlg::tversum(__int64 input)
843 {
844 int sum = 0;
845 while (input > 0)
846 {
847 sum += (input %10);
848 input /= 10;
849 }
850 return sum;
851 }
852 void CFlisServerDlg::OnBnClickedStart()
853 {
854 // TODO: Add your control notification handler code here
855
856 AppendText("Indsætter Pinkode, og venter på modem bliver klar, hvis pinkode er nødvendig");
857 UpdateWindow();
858 SetPin();
859
860 Sleep(100); //Give the modem a chance to send the last data
861 while(Serial.getComstat().cbInQue > 0)
862 {
863 Serial.readByte(); //Flush the incoming queue
864 Sleep(1);
865 }
866 Sleep(5);
867
868 continueThread = 1;
869 keepaliveandread();
870 Sleep(150);
871 AppendText(CString("Server phonenr read from db: ") + Alive.Phonenr );
872 AppendText("Started");
873 AfxBeginThread(threadWrapper,AfxGetMainWnd());
874 }
875 void CFlisServerDlg::AppendText(CString s)
876 {
877 CTime now = CTime::GetCurrentTime();
878 CString Tekst;
879 m_Textwindow.GetWindowText(Tekst);
880 Tekst.AppendFormat("%02d:%02d:%02d : ", now.GetHour(), now.GetMinute(), now.GetSecond());
881 Tekst.Append(s);
882 Tekst.Append("\r\n");
883
884 m_Textwindow.SetWindowText(Tekst);
885 Sleep(5);
886 int g = m_Textwindow.GetScrollLimit(SB_VERT);
887 if (g > 0)
888 {
889 m_Textwindow.SetSel(m_Textwindow.GetWindowTextLength() -1,m_Textwindow.GetWindowTextLength(),false);
890 }
891
892 }
893 void ConfigFile::ReadSettings()
894 {
895 ifstream file("Server-Settings.ini");
896 if (!file.is_open())
897 throw("Could not open file");
898
899 char buf[200];
900 while (!file.eof() ) {
901 file.getline(buf,200);
902 CString tmp(buf);
903
904 if (tmp.GetAt(0) == '#')
905 continue;
906
907 int pos = tmp.Find('=');
908 if (pos>0) {
909 CString key = tmp.Left(pos).Trim().MakeLower();;
910 CString value = tmp.Right(tmp.GetLength()-pos-1).Trim();
911
912 if (key == "host")
913 host = value;
914 else if (key == "username")
915 username = value;
916 else if (key == "password")
917 password = value;
918 else if (key == "database")
919 database = value;
920 else if (key == "comport")
921 comport = value;
922 else if (key == "pincode")
923 pincode = value;
924 }
925
926 }
927
928 file.close();
929 }
930 void CFlisServerDlg::HandleAcknowledge(CString tlfnr)
931 {
932 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
933 {
934 Acknowledge& current = (*it);
935 if (current.sTlfNr == tlfnr)
936 {
937 CString SQL;
938 SQL.Format("UPDATE installation SET commerror = false WHERE id = %s", current.sInstallationID);
939 db.ExecuteSQL(SQL);
940
941 Acks.erase(it);
942
943 return;
944 }
945 }
946 }
947
948 void CFlisServerDlg::CheckAcknowledges()
949 {
950 CTime now = CTime::GetCurrentTime();
951 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
952 {
953 Acknowledge& current = (*it);
954
955 CTimeSpan elapsed = now-current.cTime;
956
957 if (elapsed.GetTotalSeconds() >= 300)
958 {
959 DumpAckList();
960 if (current.iRetry >= 1)
961 {
962 CString SQL;
963 SQL.Format("UPDATE installation SET commerror = true WHERE id = %s", current.sInstallationID);
964 db.ExecuteSQL(SQL);
965 Acks.erase(it);
966 return; // the iterator is now invalidated, but the thread loop will make sure we are here soon again
967 }
968 else
969 {
970 SendConfig("0","2",current.sInstallationID);
971 current.iRetry++;
972 current.cTime = CTime::GetCurrentTime();
973 AppendText( CString("Retry send config to ") + current.sTlfNr );
974 }
975 }
976 }
977 }
978
979 void CFlisServerDlg::DumpAckList() /* Debug tool */
980 {
981
982 CTime now = CTime::GetCurrentTime();
983 OutputDebugString("-------------------------------\n");
984 int count = 0;
985 for (std::list<Acknowledge>::iterator it = Acks.begin(); it != Acks.end(); ++it)
986 {
987 CString msg;
988 msg.Format("%d:%d:%d> %4d : %s\n", now.GetHour(), now.GetMinute(), now.GetSecond(), count, (*it).sTlfNr);
989 OutputDebugString(msg);
990 count++;
991 }
992 }
993 vector<keepalive> CFlisServerDlg::keepaliveandread(void)
994 {
995 vector<keepalive> buffer;
996
997 CString SQL, name, value;
998 SQL = "select name, value from config;";
999 CRecordset rs(&db);
1000 try
1001 {
1002 rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL);
1003 if (rs.GetRecordCount()>0)
1004 {
1005 rs.MoveFirst();
1006
1007 rs.GetFieldValue((short)0, name);
1008 rs.GetFieldValue(1,value);
1009
1010 Alive.name = name;
1011 Alive.value = value;
1012 Alive.tid = CTime::GetCurrentTime();
1013 if(Alive.name == "phonenr")
1014 {
1015 Alive.Phonenr = value;
1016 }
1017
1018 buffer.push_back(Alive);
1019 rs.MoveNext();
1020
1021 }
1022 rs.Close();
1023 return buffer;
1024 }
1025 catch (char * str)
1026 {
1027 AppendText("Keepalive failed, closing and opening the db connection again");
1028 if(db.IsOpen())
1029 {
1030 db.Close();
1031 AppendText("DB connection closed");
1032 }
1033 if(!db.IsOpen())
1034 {
1035 DBConnect();
1036 AppendText("DB connection started again");
1037 }
1038 return buffer;
1039 }
1040
1041
1042 }

  ViewVC Help
Powered by ViewVC 1.1.20