source: trunk/XSUC/CommParameters.cpp @ 42

Last change on this file since 42 was 11, checked in by marrucho, 11 years ago
File size: 14.6 KB
Line 
1// CommParameters.cpp : implementation file
2//
3
4#include "stdafx.h"
5#include "Modbucfg.h"
6#include "CommParameters.h"
7#include "OleFuncs.h"
8
9#ifdef _DEBUG
10#define new DEBUG_NEW
11#undef THIS_FILE
12static char THIS_FILE[] = __FILE__;
13#endif
14
15/////////////////////////////////////////////////////////////////////////////
16// CCommParameters dialog
17
18
19CCommParameters::CCommParameters(CWnd* pParent /*=NULL*/)
20        : CDialog(CCommParameters::IDD, pParent)
21{
22        //{{AFX_DATA_INIT(CCommParameters)
23        m_bDTRDSR = FALSE;
24        m_bRTSCTS = FALSE;
25        m_bXONXOFF = FALSE;
26        //}}AFX_DATA_INIT
27
28        m_pConnection=NULL;
29        m_bModeNew=FALSE;
30
31}
32
33
34void CCommParameters::DoDataExchange(CDataExchange* pDX)
35{
36        CDialog::DoDataExchange(pDX);
37        //{{AFX_DATA_MAP(CCommParameters)
38        DDX_Control(pDX, IDC_EDIT_DELAY, m_edtDelay);
39        DDX_Control(pDX, IDC_CHK_TCP_SERVER, m_chkTcpServer);
40        DDX_Control(pDX, IDC_EDIT_DCOM_SERVER, m_edtDcomServer);
41        DDX_Control(pDX, IDC_EDIT_PORT, m_edtServerPort);
42        DDX_Control(pDX, IDC_EDIT_IP_ADDR, m_edtServerIP);
43        DDX_Control(pDX, IDC_CHK_ACTIVE, m_chkActive);
44        DDX_Control(pDX, IDC_EDIT_CHAR_INTERVAL, m_edtCharInterval);
45        DDX_Control(pDX, IDC_EDIT_TIME_OUT, m_edtTimeOut);
46        DDX_Control(pDX, IDC_CBO_BYTESIZE, m_cboByteSize);
47        DDX_Control(pDX, IDC_CBO_STOPBITSCB, m_cboStopBits);
48        DDX_Control(pDX, IDC_CBO_PARITY, m_cboParity);
49        DDX_Control(pDX, IDC_CBO_COM_PORT, m_cboPorta);
50        DDX_Control(pDX, IDC_CBO_BAUD_RATE, m_cboBaudRate);
51        DDX_Check(pDX, IDC_CHK_DTRDSR, m_bDTRDSR);
52        DDX_Check(pDX, IDC_CHK_RTSCTS, m_bRTSCTS);
53        DDX_Check(pDX, IDC_CHK_XONXOFF, m_bXONXOFF);
54        //}}AFX_DATA_MAP
55}
56
57
58BEGIN_MESSAGE_MAP(CCommParameters, CDialog)
59        //{{AFX_MSG_MAP(CCommParameters)
60        ON_BN_CLICKED(IDC_OK, OnOkey)
61        ON_BN_CLICKED(IDC_BUTT_FIND_IP, OnButtFindIP)
62        //}}AFX_MSG_MAP
63END_MESSAGE_MAP()
64
65/////////////////////////////////////////////////////////////////////////////
66// CCommParameters message handlers
67
68void CCommParameters::LoadCombos()
69{
70
71        int nIndex=-1;
72    CString str;
73       
74        //port
75        m_cboPorta.AddString("COM1"); 
76        m_cboPorta.AddString("COM2");
77        m_cboPorta.AddString("COM3");
78        m_cboPorta.AddString("COM4");
79        m_cboPorta.AddString("COM5"); 
80        m_cboPorta.AddString("COM6");
81        m_cboPorta.AddString("COM7");
82        m_cboPorta.AddString("COM8");
83        m_cboPorta.SetCurSel(0);
84
85        //baudrate
86        /*CBR_110       CBR_19200
87    CBR_300     CBR_38400
88    CBR_600     CBR_56000
89        CBR_1200        CBR_57600
90        CBR_2400        CBR_115200
91        CBR_4800        CBR_128000
92        CBR_9600        CBR_256000
93        CBR_14400 */
94        str.Format("%d", CBR_110);
95    nIndex=m_cboBaudRate.AddString(str);
96        m_cboBaudRate.SetItemData( nIndex,CBR_110);
97
98        str.Format("%d", CBR_300);
99    nIndex=m_cboBaudRate.AddString(str);
100    m_cboBaudRate.SetItemData( nIndex,CBR_300);
101
102        str.Format("%d", CBR_600);
103    nIndex=m_cboBaudRate.AddString(str);
104    m_cboBaudRate.SetItemData( nIndex,CBR_600);
105
106        str.Format("%d", CBR_1200);
107    nIndex=m_cboBaudRate.AddString(str);
108    m_cboBaudRate.SetItemData( nIndex,CBR_1200);
109
110        str.Format("%d", CBR_2400);
111    nIndex=m_cboBaudRate.AddString(str);
112    m_cboBaudRate.SetItemData( nIndex,CBR_2400);
113
114        str.Format("%d", CBR_4800);
115    nIndex=m_cboBaudRate.AddString(str);
116    m_cboBaudRate.SetItemData( nIndex,CBR_4800);
117
118        str.Format("%d", CBR_9600);
119    nIndex=m_cboBaudRate.AddString(str);
120    m_cboBaudRate.SetItemData( nIndex,CBR_9600);
121
122        str.Format("%d", CBR_14400);
123    nIndex=m_cboBaudRate.AddString(str);
124    m_cboBaudRate.SetItemData( nIndex,CBR_14400);
125
126        str.Format("%d", CBR_19200);
127    nIndex=m_cboBaudRate.AddString(str);
128    m_cboBaudRate.SetItemData( nIndex,CBR_19200);
129
130        str.Format("%d", CBR_38400);
131    nIndex=m_cboBaudRate.AddString(str);
132    m_cboBaudRate.SetItemData( nIndex,CBR_38400);
133
134        str.Format("%d", CBR_56000);
135    nIndex=m_cboBaudRate.AddString(str);
136    m_cboBaudRate.SetItemData( nIndex,CBR_56000);
137
138        str.Format("%d", CBR_57600);
139    nIndex=m_cboBaudRate.AddString(str);
140    m_cboBaudRate.SetItemData( nIndex,CBR_57600);
141
142        str.Format("%d", CBR_115200);
143    nIndex=m_cboBaudRate.AddString(str);
144    m_cboBaudRate.SetItemData( nIndex,CBR_115200);
145
146        str.Format("%d", CBR_128000);
147    nIndex=m_cboBaudRate.AddString(str);
148    m_cboBaudRate.SetItemData( nIndex,CBR_128000);
149
150        str.Format("%d", CBR_256000);
151    nIndex=m_cboBaudRate.AddString(str);
152    m_cboBaudRate.SetItemData( nIndex,CBR_256000);
153        m_cboBaudRate.SetCurSel(0);
154
155        //parity
156    str="Even";
157        nIndex=m_cboParity.AddString(str);
158    m_cboParity.SetItemData( nIndex,EVENPARITY);
159
160        str="Mark";
161    nIndex=m_cboParity.AddString(str);
162    m_cboParity.SetItemData( nIndex,MARKPARITY);
163
164        str="No parity";
165    nIndex=m_cboParity.AddString(str);
166    m_cboParity.SetItemData( nIndex,NOPARITY);
167
168        str="Odd";
169    nIndex=m_cboParity.AddString(str);
170    m_cboParity.SetItemData( nIndex,ODDPARITY);
171
172        m_cboParity.SetCurSel(0);
173
174        //stop bits
175        str="1";
176        nIndex=m_cboStopBits.AddString(str);
177        m_cboStopBits.SetItemData( nIndex,ONESTOPBIT); 
178        str="1.5";
179        nIndex=m_cboStopBits.AddString(str);
180        m_cboStopBits.SetItemData( nIndex,ONE5STOPBITS);
181        str="2";
182        nIndex=m_cboStopBits.AddString(str);
183        m_cboStopBits.SetItemData( nIndex,TWOSTOPBITS);
184        m_cboStopBits.SetCurSel(0);
185
186        //Byte Size
187        str="7";
188        nIndex=m_cboByteSize.AddString(str);
189        m_cboByteSize.SetItemData( nIndex,7);
190       
191        str="8";
192        nIndex=m_cboByteSize.AddString(str);
193        m_cboByteSize.SetItemData( nIndex,8); 
194        m_cboByteSize.SetCurSel(0);
195
196
197}
198
199BOOL CCommParameters::OnInitDialog() 
200{
201        CDialog::OnInitDialog();
202       
203       
204        LoadCombos();
205       
206        if (!m_bModeNew) {
207                ShowParameters();
208        }
209       
210
211        return TRUE;  // return TRUE unless you set the focus to a control
212                      // EXCEPTION: OCX Property Pages should return FALSE
213}
214
215BOOL CCommParameters::ShowParameters()
216{
217        int iIndex;
218        CString str;
219        CButton* pRadTransMode;
220        BSTR bstrTCPServer=NULL;
221        long lTcpPort=0;
222        VARIANT_BOOL bVal;
223
224        ASSERT(m_pConnection);
225
226        CAutoModbus* m_pautoModbus = m_pConnection->AutoPtr();
227
228
229        str.Format("COM%d",m_pautoModbus->ComPort());
230        iIndex=m_cboPorta.FindString(-1, str);
231        m_cboPorta.SetCurSel( iIndex );
232        //baudrate
233        str.Format("%d",(m_pautoModbus->BaudRate()));
234    iIndex=m_cboBaudRate.FindString(-1, str);
235    m_cboBaudRate.SetCurSel( iIndex );
236
237        //parity
238        switch (m_pautoModbus->Parity()) {
239    case EVENPARITY:
240                 str="Even"; 
241                break;
242    case MARKPARITY:
243        str="Mark";
244                break;
245    case NOPARITY:
246        str="No parity";
247                break;
248        case ODDPARITY:
249                str="Odd";
250                break;
251    default:
252                str="";
253        }
254
255        iIndex=m_cboParity.FindString(-1, str);
256    m_cboParity.SetCurSel( iIndex );
257   
258
259        //StopBits
260        switch (m_pautoModbus->StopBits()) {
261    case ONESTOPBIT:
262                 str="1"; 
263                break;
264    case ONE5STOPBITS:
265        str="1.5";
266                break;
267    case TWOSTOPBITS:
268        str="2";
269                break;
270        default:
271                str="2";
272        }
273
274        iIndex=m_cboStopBits.FindString(-1, str);
275    m_cboStopBits.SetCurSel(iIndex);
276
277        //ByteSize
278        switch (m_pautoModbus->ByteSize()) {
279        case 7:
280                str="7";
281                break;
282        case 8:
283                str="8";
284                break;
285        default:
286                str="8";
287                break;
288       
289        }
290
291        iIndex=m_cboByteSize.FindString(-1, str);
292    m_cboByteSize.SetCurSel(iIndex);
293
294
295        //time-out
296    str.Format("%d",m_pautoModbus->Timeout());
297    m_edtTimeOut.SetWindowText(str);
298        //char interval
299    str.Format("%d",m_pautoModbus->SilentInterval());
300    m_edtCharInterval.SetWindowText(str);
301     
302    //Delay
303        str.Format("%d",m_pautoModbus->Delay());
304        m_edtDelay.SetWindowText(str);
305
306
307        //active com port
308        m_chkActive.SetCheck(m_pautoModbus->IsActive());
309
310        //flow control
311
312    m_bDTRDSR=(mbFC_DTRDSR&m_pautoModbus->FlowControl())!=0;
313        m_bRTSCTS=(mbFC_RTSCTS&m_pautoModbus->FlowControl())!=0;
314    m_bXONXOFF=(mbFC_XONXOFF&m_pautoModbus->FlowControl())!=0;
315
316        //Transmission Mode
317        switch (m_pautoModbus->TransmissionMode()) {
318        case mbMODE_RTU:
319                pRadTransMode=(CButton*)GetDlgItem(IDC_RAD_RTU);
320                break;
321       
322        case mbMODE_ASCII:
323       
324    default:
325                pRadTransMode=(CButton*)GetDlgItem(IDC_RAD_ASCII);
326
327        }
328       
329         pRadTransMode->SetCheck(1);
330
331         //Show DCOM
332        m_edtDcomServer.SetWindowText(m_pautoModbus->Machine());
333
334        //TCP Server
335        if (FAILED(m_pautoModbus->m_pITCPServer->get_ServerAddress(&bstrTCPServer))){
336                ASSERT(FALSE);
337        }
338        else {
339                str =bstrTCPServer;
340                ::SysFreeString(bstrTCPServer);
341                m_edtServerIP.SetWindowText(str);
342        }
343       
344        VERIFY(!FAILED(m_pautoModbus->m_pITCPServer->get_ServerPort(&lTcpPort)));
345        str.Format("%d",lTcpPort);
346        m_edtServerPort.SetWindowText(str);
347
348        bVal=VARIANT_FALSE;
349        VERIFY(!FAILED(m_pautoModbus->m_pITCPServer->get_ServerActive(&bVal)));
350
351        if (VARIANT_TRUE==bVal){
352                m_chkTcpServer.SetCheck(1);
353        }
354        else {
355                m_chkTcpServer.SetCheck(0);
356        }
357
358        if (!m_bModeNew) {
359                m_edtDcomServer.EnableWindow(FALSE);
360                m_cboPorta.EnableWindow(FALSE);
361        }
362
363        UpdateData(FALSE);
364
365        return TRUE;
366}
367
368
369BOOL CCommParameters::SaveParameters()
370{
371          int nIndex;
372          DWORD dwBaudRate=0;
373          BYTE byParity=0;
374          DWORD dwTimeout;
375          DWORD dwSilentInterval;
376          CString str;
377          CString sAux;
378          CString sConnectionName;
379          CString sMachine;
380          BSTR bstr=NULL;
381          BYTE byFlowControl;
382          CButton* pRadTransMode;
383          CAutoModbus* m_pautoModbus=NULL;     
384          VARIANT_BOOL bValue=VARIANT_FALSE;
385          HRESULT hr;
386
387          CWaitCursor wait;    // display wait cursor
388
389
390          UpdateData(TRUE);
391
392         
393          if (m_bModeNew) {
394                  //Create New Connection
395                  nIndex=m_cboPorta.GetCurSel();
396                  sAux.Format("com%d",nIndex+1);
397                  m_edtDcomServer.GetWindowText(sMachine);
398                  sMachine.TrimLeft();
399                  sMachine.TrimRight();
400                  if (!sMachine.IsEmpty()) { 
401                          str=sMachine+_T(":")+sAux;
402                  } 
403                  else{ 
404                          str = sAux;
405                  }
406                 
407                  sConnectionName= str; 
408                 
409                  if (gConnections.Lookup(sConnectionName,m_pConnection)) {
410                                AfxMessageBox("Connection Alredy Exist");
411                                Connection(NULL);
412                                return FALSE;
413                  }
414
415                 
416                  m_pConnection= gConnections.Add(sConnectionName, CConnection::AUTO);
417                 
418                  if (NULL==m_pConnection) {
419                           AfxMessageBox("Error Adding Connection");
420                           return FALSE;
421                  }
422
423                  m_pautoModbus=m_pConnection->AutoPtr();
424               
425                  hr = m_pautoModbus->CreateInstance(sMachine,sAux);
426                 
427                  if(FAILED(hr)) {
428                         
429                          if (!GetErrorMsg(hr,sAux.GetBuffer(500),500)) {
430                                  sAux= _T("Can't Create Automation Object");                     
431                          }
432
433                          AfxMessageBox(sAux);
434                          goto ParamError;
435                  }
436
437          }
438          else {
439
440                  //edit connection
441                  ASSERT(m_pConnection);
442                  m_pautoModbus= m_pConnection->AutoPtr();
443         
444          }
445         
446          if (0==m_chkActive.GetCheck()) {  //0==unchecked
447                  //if(!m_pautoModbus->CloseConnection()){
448                //        AfxMessageBox("Failed to close Connection");
449                  //}
450          }
451
452          if (m_pautoModbus->IsActive()&&m_bModeNew) {
453                        if (IDYES==AfxMessageBox( _T("This connection is already opened by other app. Show current parameters?")
454                                ,MB_YESNO)) {
455
456                                ShowParameters();
457                                goto ParamError;
458                        }
459               
460          }
461
462          //com port
463          nIndex=m_cboPorta.GetCurSel();
464         
465          if (nIndex<0) {
466                  AfxMessageBox("Invalid com port");
467                  goto ParamError;
468          }
469
470          m_pautoModbus->ComPort(BYTE(nIndex+1));
471         
472          //Baud Rate
473
474          nIndex=m_cboBaudRate.GetCurSel();
475
476          if (nIndex<0) {
477                  AfxMessageBox("Invalid Baud-Rate");
478                  goto ParamError;
479          }
480          dwBaudRate=m_cboBaudRate.GetItemData(nIndex);
481
482          m_pautoModbus->BaudRate(dwBaudRate);
483         
484          //parity 
485          nIndex=m_cboParity.GetCurSel();
486         
487          if (nIndex<0) {
488                  AfxMessageBox("Invalid Parity");
489                  goto ParamError;
490          }     
491
492          byParity=BYTE(m_cboParity.GetItemData(nIndex));
493
494          m_pautoModbus->Parity(byParity);
495                 
496          //Stop bits 
497          nIndex=m_cboStopBits.GetCurSel();
498         
499          if (nIndex<0) {
500                  AfxMessageBox("Invalid Stop Bits");
501                  goto ParamError;
502          }     
503         
504          m_pautoModbus->StopBits((BYTE)m_cboStopBits.GetItemData(nIndex));
505
506         
507          byFlowControl=mbFC_NONE; 
508          if (m_bDTRDSR) {
509                  byFlowControl=byFlowControl|mbFC_DTRDSR;
510          }
511         
512          if (m_bRTSCTS) {
513                  byFlowControl=byFlowControl|mbFC_RTSCTS;
514          }
515         
516          if (m_bXONXOFF) {
517                  byFlowControl=byFlowControl|mbFC_XONXOFF;
518          }
519          m_pautoModbus->FlowControl(byFlowControl);
520
521          //timeout
522          m_edtTimeOut.GetWindowText(str);
523          dwTimeout=(DWORD)atol(str);
524          if (0==dwTimeout) {
525                  AfxMessageBox("Invalid timeout");
526                  goto ParamError;
527          }
528          m_pautoModbus->Timeout(dwTimeout);
529
530          //silentinterval
531          m_edtCharInterval.GetWindowText(str);
532          dwSilentInterval=(DWORD)atol(str);
533          if (0==dwSilentInterval) {
534                  AfxMessageBox("Invalid Char Interval");
535                  goto ParamError;
536          }
537         
538          m_pautoModbus->SilentInterval(dwSilentInterval);
539
540
541          //Delay
542      m_edtDelay.GetWindowText(str);
543          m_pautoModbus->Delay((DWORD)atol(str));
544
545          //Transmission Mode
546          pRadTransMode=(CButton*)GetDlgItem(IDC_RAD_RTU);
547         
548          ASSERT(pRadTransMode);
549         
550          if (FALSE!=pRadTransMode->GetCheck()) {
551                  m_pautoModbus->TransmissionMode(mbMODE_RTU);
552          }
553          else {
554                  m_pautoModbus->TransmissionMode(mbMODE_ASCII);
555                 
556          }
557
558
559          //Byte Size 
560          nIndex=m_cboByteSize.GetCurSel();
561         
562          if (nIndex<0) {
563                  AfxMessageBox("Invalid Byte Size");
564                  goto ParamError;
565          }     
566         
567          m_pautoModbus->ByteSize((BYTE)m_cboByteSize.GetItemData(nIndex));
568         
569          if (! m_pautoModbus->Connect()){
570                  AfxMessageBox("Can't connect");
571                  goto ParamError;
572          }
573         
574
575          //TCP Server
576          if (1==m_chkTcpServer.GetCheck()) {//checked
577
578                //address
579                m_edtServerIP.GetWindowText(str);
580                bstr= str.AllocSysString();
581                m_pautoModbus->m_pITCPServer->put_ServerAddress(bstr);
582                ::SysFreeString(bstr);
583                //port
584                m_edtServerPort.GetWindowText(str);
585                m_pautoModbus->m_pITCPServer->put_ServerPort(WORD(atol(str)));
586                m_pautoModbus->m_pITCPServer->StartServer(&bValue);
587                if (VARIANT_FALSE==bValue){
588                         AfxMessageBox("Error Starting Modbus TCP server");
589                         goto ParamError;
590                }
591
592          }
593          else {
594                m_pautoModbus->m_pITCPServer->StopServer(&bValue);
595                if (VARIANT_FALSE==bValue){
596                         AfxMessageBox("Error Stoping Modbus TCP server");
597                         goto ParamError;
598                }
599          }
600          return (TRUE);
601
602ParamError:
603        if (m_bModeNew) {
604                gConnections.Remove(sConnectionName); //Remove New Connection
605                Connection(NULL);
606        }
607         return (FALSE);
608}
609
610
611
612
613
614void CCommParameters::Connection(CConnection* pConnection)
615{
616        m_pConnection = pConnection;
617}
618
619CConnection* CCommParameters::Connection(){
620 
621        return m_pConnection;
622}
623
624
625void CCommParameters::OnOkey() 
626{
627       
628        if (SaveParameters()) {
629                CDialog::OnOK();
630        }       
631}
632
633void CCommParameters::OnCancel() 
634{
635        // TODO: Add extra cleanup here
636        Connection(NULL);
637        CDialog::OnCancel();
638}
639
640void CCommParameters::OnButtFindIP() 
641{
642
643        CWaitCursor wait;    // display wait cursor
644
645        try {
646                m_edtServerIP.SetWindowText(CBlockingSocket::GetHostIP());
647        }
648        catch(CBlockingSocketException* e) {
649                e->Delete();
650                AfxMessageBox("Failed finding local machine IP");
651        }
652       
653}
Note: See TracBrowser for help on using the repository browser.