source: trunk/XSUC/CommParameters.cpp@ 15

Last change on this file since 15 was 11, checked in by marrucho, 12 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.