QuakeGod
2023-05-19 418cb35b936f21415807a2bcc21b2d75934bd4d2
提交 | 用户 | age
0ed438 1 // MTerm2CtrlView.cpp: 实现文件
Q 2 //
3
4
5 // MultiTerminal1Dlg.cpp: 实现文件
6 //
7
8 #include "pch.h"
9 #include "framework.h"
10 #include "MTerm2.h"
11 #include "MTerm2Doc.h"
0a20f7 12 #include "ChildFrm.h"
0ed438 13
Q 14 #include "MTerm2CommDevView.h"
15
16 #include <devguid.h>
17 #include <SetupAPI.h>
18 #include "../MyLib/Functions.hpp"
19 #include "../MyLib/UI_Func/UI_Func.hpp"
65f713 20 #include "AnsiParser.h"
Q 21 #include "DataParser1.h"
0ed438 22 #include "KLink.h"
Q 23 //#include "../MyLib/SerialCom/SerialCom.hpp"
24 #include <Dbt.h>
65f713 25 #include "DialogCommSet1.h"
Q 26 #include "DialogSysRegSet.h"
27 #include "DialogStatusShow.h"
28 #include "DialogInfoDisplay.h"
0ed438 29
65f713 30 #include "DialogCoilMon.h"
Q 31 #include "DialogDataMon.h"
0ed438 32
65f713 33 #include "DialogProgress.h"
Q 34 #include "DialogEventLog.h"
35 #include "DialogDateTime.h"
36 #include "DialogForceIO.h"
0ed438 37 #include "HvSerialPort.h"
Q 38
39 #ifdef _DEBUG
40 #define new DEBUG_NEW
41 #endif
42
43 //#pragma comment(lib,"setupapi.lib")
44 bool bAutoStart;
45 //int nComPort;
46 //int nBaud;
47
48 stCfgValCtrl myCfgValCtrls[] = {
49     "AutoStart", vtbool, &bAutoStart, IDC_CHECK_AUTO_START, ctCheckBox,
50 //    "LastComPort", vtInt, &nComPort, IDC_COMBO_COMPORT, ctComboBoxIndex,
51 //    "Baud", vtInt, &nBaud, IDC_COMBO_COM_BAUD, ctComboBoxString,
52     "Ref1", NULL, nullptr, IDC_EDIT_REF1, ctEdit,
53 };
54
55
56 int nMarkConfigs = sizeof(myCfgValCtrls) / sizeof(stCfgValCtrl);
57
58 int nTest1 = 1;
59 float nTest2 = 2;
60 double nTest3 = 3;
61
62 int MonitorTotalCount = 0;
63 int MonitorSuccessCount = 0;
64 int MonitorFailCount = 0;
65 int MonitorSpeed = 0;
66 int LastMonitorTotalCount = 0;
67
68 stCfgValCtrl myCfgTest1[] = {
69     "Test1", vtInt, &nTest1, 0,0,
70     "Test2", vtFloat, &nTest2, 0,0,
71     "Test3", vtDouble, &nTest3, 0,0,
72 };
73 int nCfgTestCount = sizeof(myCfgTest1) / sizeof(stCfgValCtrl);
74
75 unsigned char send1[40000];
76 unsigned char recv1[40000];
77
78 volatile int nDataToSend = 0;
79
80 volatile int BulkSendTest = 0;
81
82 unsigned char SDTbuf[512];
83 unsigned char WYbuf[256];
84
85
86 // CMTerm2CommDevView
87
88 IMPLEMENT_DYNCREATE(CMTerm2CommDevView, CFormView)
89
90 CMTerm2CommDevView::CMTerm2CommDevView()
91     : CFormView(IDD_MTerm2CommDevView2)
92 {
93
94 }
95
96 CMTerm2CommDevView::~CMTerm2CommDevView()
97 {
98 }
99
100 void CMTerm2CommDevView::DoDataExchange(CDataExchange* pDX)
101 {
102     CFormView::DoDataExchange(pDX);
103     DDX_Control(pDX, IDC_COMBO_COMPORT, m_combo_comport);
104     DDX_Control(pDX, IDC_COMBO_COM_BAUD, m_combo_com_baud);
105     DDX_Control(pDX, IDC_EDIT_DISPLAY, m_edit_display);
106     DDX_Control(pDX, IDC_COMBO_INPUT, m_combo_input);
107 //    DDX_Control(pDX, IDC_TREE1, m_treectrl1);
108     DDX_Control(pDX, IDC_EDIT_MON, m_edit_mon1);
109     DDX_Control(pDX, IDC_EDIT_MON2, m_edit_mon2);
110     DDX_Control(pDX, IDC_STATIC_CONNECT, m_static_connect);
111
112 }
113
114 BEGIN_MESSAGE_MAP(CMTerm2CommDevView, CFormView)
115
116 //    ON_WM_SYSCOMMAND()
117 //    ON_WM_PAINT()
118 //    ON_WM_CLOSE()
119 //    ON_WM_SIZE()
120     ON_WM_TIMER()
121     ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CMTerm2CommDevView::OnBnClickedButtonConnect)
122     ON_BN_CLICKED(IDC_BUTTON_DISCONNECT, &CMTerm2CommDevView::OnBnClickedButtonDisconnect)
123     ON_BN_CLICKED(IDC_BUTTON_START, &CMTerm2CommDevView::OnBnClickedButtonStart)
124     ON_BN_CLICKED(IDC_BUTTON_STOP, &CMTerm2CommDevView::OnBnClickedButtonStop)
125
126     ON_BN_CLICKED(IDC_BUTTON_CLRSCR, &CMTerm2CommDevView::OnBnClickedButtonClrscr)
127     ON_BN_CLICKED(IDC_BUTTON_SEND, &CMTerm2CommDevView::OnBnClickedButtonSend)
128 //    ON_CBN_EDITCHANGE(IDC_COMBO_INPUT, &CMTerm2CommDevView::OnCbnEditchangeComboInput)
129 //    ON_CBN_SELCHANGE(IDC_COMBO_RES, &CMTerm2CommDevView::OnCbnSelchangeComboRes)
130     ON_BN_CLICKED(IDC_BUTTON_DO, &CMTerm2CommDevView::OnBnClickedButtonDo)
131 //    ON_CBN_SELCHANGE(IDC_COMBO_CMD_TYPE, &CMTerm2CommDevView::OnCbnSelchangeComboCmdType)
132 //    ON_CBN_SELCHANGE(IDC_COMBO_DCOUNT, &CMTerm2CommDevView::OnCbnSelchangeComboDcount)
133 //    ON_BN_CLICKED(IDC_BUTTON_START_BULK_TEST, &CMTerm2CommDevView::OnBnClickedButtonStartBulkTest)
134 //    ON_BN_CLICKED(IDC_BUTTON_STOP_BULK_TEST, &CMTerm2CommDevView::OnBnClickedButtonStopBulkTest)
135 //    ON_WM_DEVICECHANGE()
136 //    ON_WM_INITMENUPOPUP()
137 //    ON_WM_MOUSEWHEEL()
138 //    ON_BN_CLICKED(IDC_BUTTON_CLEAR_STAT, &CMTerm2CommDevView::OnBnClickedButtonClearStat)
139 //    ON_BN_CLICKED(IDC_BUTTON_READ, &CMTerm2CommDevView::OnBnClickedButtonRead)
140 //    ON_BN_CLICKED(IDC_BUTTON11, &CMTerm2CommDevView::OnBnClickedButton11)
326d3e 141     ON_BN_CLICKED(IDC_BUTTON12, &CMTerm2CommDevView::OnBnClickedButton12)
Q 142     ON_BN_CLICKED(IDC_BUTTON13, &CMTerm2CommDevView::OnBnClickedButton13)
65f713 143     ON_BN_CLICKED(IDC_BUTTON31, &CMTerm2CommDevView::OnBnClickedButton31)
Q 144     ON_BN_CLICKED(IDC_BUTTON2, &CMTerm2CommDevView::OnBnClickedButton2)
145     ON_BN_CLICKED(IDC_BUTTON3, &CMTerm2CommDevView::OnBnClickedButton3)
0ed438 146 END_MESSAGE_MAP()
Q 147
148
149 // CMTerm2CommDevView 诊断
150
151 #ifdef _DEBUG
152 void CMTerm2CommDevView::AssertValid() const
153 {
154     CFormView::AssertValid();
155 }
156
157 #ifndef _WIN32_WCE
158 void CMTerm2CommDevView::Dump(CDumpContext& dc) const
159 {
160     CFormView::Dump(dc);
161 }
162 #endif
163 #endif //_DEBUG
164
165
166 // CMTerm2CommDevView 消息处理程序
167
168 void CMTerm2CommDevView::OnInitialUpdate()
169 {
170     CFormView::OnInitialUpdate();
171     // TODO: 在此添加专用代码和/或调用基类
0a20f7 172 //    ResizeParentToFit();
Q 173 //    ((CChildFrame *)GetParentFrame())->RecalcLayout();
0ed438 174     m_bResourceOpened = 0;
Q 175
176     LoadResourceList();
177     DisplayParams();
178
179     LoadModel();
180     /*
181         //    m_treectrl1.SetExtendedStyle(TVS_EX_DRAWIMAGEASYNC,TVS_EX_DRAWIMAGEASYNC);
182         m_ColorTreeImages.Create(IDB_FILE_VIEW, 16, 0, RGB(255, 0, 255));
183         //    m_ColorTreeImages.Create(IDB_PNG1,220,0,RGB(255,0,255));
184
185         m_treectrl1.SetImageList(&m_ColorTreeImages, TVSIL_NORMAL);
186
187         HTREEITEM hItem, hGroupItem, hSubItem;
188         hItem = m_treectrl1.InsertItem(_T("Parent1"), 0, 0, TVI_ROOT); // 在根结点上添加Parent1
189         hGroupItem = m_treectrl1.InsertItem(_T("Group1_1"), 1, 1, hItem);//在Parent1上添加一个子结点
190
191         hSubItem = m_treectrl1.InsertItem(_T("Child1_1"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
192         hSubItem = m_treectrl1.InsertItem(_T("Child1_2"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
193         hSubItem = m_treectrl1.InsertItem(_T("Child1_3"), 2, 2, hGroupItem, hSubItem);
194
195         hGroupItem = m_treectrl1.InsertItem(_T("Group1_2"), 1, 1, hItem, hGroupItem);//在Parent1上添加一个子结点
196         hSubItem = m_treectrl1.InsertItem(_T("Child1_4"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
197         hSubItem = m_treectrl1.InsertItem(_T("Child1_5"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
198         hSubItem = m_treectrl1.InsertItem(_T("Child1_6"), 2, 2, hGroupItem, hSubItem);
199
200         hItem = m_treectrl1.InsertItem(_T("Parent2"), TVI_ROOT, hItem);
201         hGroupItem = m_treectrl1.InsertItem(_T("Group2_1"), 1, 1, hItem);//在Parent1上添加一个子结点
202
203         hSubItem = m_treectrl1.InsertItem(_T("Child2_1"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
204         hSubItem = m_treectrl1.InsertItem(_T("Child2_2"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
205         hSubItem = m_treectrl1.InsertItem(_T("Child2_3"), 2, 2, hGroupItem, hSubItem);
206
207         hGroupItem = m_treectrl1.InsertItem(_T("Group2_2"), 1, 1, hItem, hGroupItem);//在Parent1上添加一个子结点
208         hSubItem = m_treectrl1.InsertItem(_T("Child2_4"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
209         hSubItem = m_treectrl1.InsertItem(_T("Child2_5"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
210         hSubItem = m_treectrl1.InsertItem(_T("Child2_6"), 2, 2, hGroupItem, hSubItem);
211
212         hItem = m_treectrl1.InsertItem(_T("Parent3"), TVI_ROOT, hItem);
213         hGroupItem = m_treectrl1.InsertItem(_T("Group3_1"), 1, 1, hItem);//在Parent1上添加一个子结点
214
215         hSubItem = m_treectrl1.InsertItem(_T("Child3_1"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
216         hSubItem = m_treectrl1.InsertItem(_T("Child3_2"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
217         hSubItem = m_treectrl1.InsertItem(_T("Child3_3"), 2, 2, hGroupItem, hSubItem);
218
219         hGroupItem = m_treectrl1.InsertItem(_T("Group3_2"), 1, 1, hItem, hGroupItem);//在Parent1上添加一个子结点
220         hSubItem = m_treectrl1.InsertItem(_T("Child3_4"), 2, 2, hGroupItem);//在Parent1上添加一个子结点
221         hSubItem = m_treectrl1.InsertItem(_T("Child3_5"), 2, 2, hGroupItem, hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
222         hSubItem = m_treectrl1.InsertItem(_T("Child3_6"), 2, 2, hGroupItem, hSubItem);
223     */
224     //    TVINSERTSTRUCT TVI_ROOT
225     //    m_treectrl1.SetItemData(htree15,15);
226
227 //    m_status_Cusp_Size.SetCtlColor(RGB(0xff, 0x40, 0x40));
228 //    m_status_Hz.SetCtlColor(RGB(0xff, 0x40, 0x40));
229 //    m_status_db.SetCtlColor(RGB(0xff, 0x40, 0x40));
230
231     SetTimer(0, 50, NULL);//delayinit
232     SetTimer(2, 100, NULL);//display
233
234     m_static_connect.SetCtlColor(RGB(0, 255, 0));
235
236 }
237
238
239
240 int CMTerm2CommDevView::DelayInit()
241 {
242     //    InitCamera();
243     //    InitPlcComm();
244         //    InitAnalyzer();
0a20f7 245     SetTimer(1, 20, NULL);  //plc
0ed438 246     SetTimer(3, 300, NULL);    //Analyzer
Q 247     SetTimer(4, 1000, NULL); //Speed;
248     m_static_connect.SetCtlColor(RGB(255, 0, 0));
249     //    m_static_connect.RedrawWindow();
250     return 0;
251 }
252
253 int CMTerm2CommDevView::Clear_COM_Stats()
254 {
255     // TODO: 在此处添加实现代码.
256     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
257     pDoc->myHvSerialPort1.TotalRecvBytes = 0;
258     pDoc->myHvSerialPort1.TotalRecvBytes = 0;
259
260     MonitorTotalCount = 0;
261     MonitorSuccessCount = 0;
262     MonitorFailCount = 0;
263     return 0;
264 }
265
266 int CMTerm2CommDevView::UpdateDataDisplay()
267 {
268     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
269     if (!m_bOnline) return 0;
270     static int stepCount = 0;
271     CString s1, s2;
272     pDoc->myHvSerialPort1.CalSpeed();
273     s1.Format(_T("Send %8d %5d Bps \r\nRecv %8d %5d Bps\r\n"), pDoc->myHvSerialPort1.TotalSendBytes, pDoc->myHvSerialPort1.SendSpeed, pDoc->myHvSerialPort1.TotalRecvBytes, pDoc->myHvSerialPort1.RecvSpeed);
274
275     //    s1.AppendFormat(_T("Total S %8d \r\nTotal R %8d \r\n"), MySerialCom1.TotalSendBytes, MySerialCom1.TotalRecvBytes);
276     s1 += intToString(pDoc->myHvSerialPort1.TotalRecvBytes) + _T("\r\n");
277     //    stepCount++;
fc8a81 278
Q 279     static double LastCalTime = 0;
0ed438 280     double thisTime = GetTimemS();
Q 281     if (thisTime - LastCalTime > 500)
282     {
283         MonitorSpeed = int ((MonitorTotalCount - LastMonitorTotalCount) * 1000 / (thisTime - LastCalTime));
284         LastMonitorTotalCount = MonitorTotalCount;
285         LastCalTime = thisTime;
286         //        stepCount = 0;
287     }
288     s1.AppendFormat(_T("MT %6d Seq %d/%d %d/S \r\nOK %6d NG %d "),
289         MonitorTotalCount, pDoc->MyKLink1.m_nSeq, pDoc->MyKLink1.m_nRSeq, MonitorSpeed,
290         MonitorSuccessCount, MonitorFailCount);
291     SetDlgItemText(IDC_STATIC_SPEED, s1);
292
293
294     int nCount = 32;
295     s2.Empty();//    s2.AppendFormat(_T("%d    "), MonitorSuccessCount);
296     nCount = 16;
297     s2.Append(_T("WX  "));
298     for (int i = 0; i < (nCount + 15) / 16; i++)
299     {
300         //s2.AppendFormat(_T("%02X: "), i * 16);
301         for (int j = 0; j < 8; j++)
302         {
303             s2.AppendFormat(_T("%04X"), pDoc->MyKLink1.MEM.WX[i * 8 + j]);
304             if (j == 3) { s2.Append(_T("  ")); }
305             else { s2.Append(_T(" ")); }
306         }
307         s2.Append(_T("\r\n"));
308     }
309     nCount = 16;
310     s2.Append(_T("WY  "));
311     for (int i = 0; i < (nCount + 15) / 16; i++)
312     {
313         // s2.AppendFormat(_T("%02X: "), i * 16);
314         for (int j = 0; j < 8; j++)
315         {
316             s2.AppendFormat(_T("%04X"), pDoc->MyKLink1.MEM.WY[i * 8 + j]);
317             if (j == 3) { s2.Append(_T("  ")); }
318             else { s2.Append(_T(" ")); }
319         }
320         s2.Append(_T("\r\n"));
321     }
322     nCount = 32;
323     s2.Append(_T("  WR\r\n"));
324     for (int i = 0; i < (nCount + 15) / 16; i++)
325     {
326         s2.AppendFormat(_T("%02X: "), i * 16);
327         for (int j = 0; j < 8; j++)
328         {
329             s2.AppendFormat(_T("%04X"), pDoc->MyKLink1.MEM.WR[i * 8 + j]);
330             if (j == 3) { s2.Append(_T("  ")); }
331             else { s2.Append(_T(" ")); }
332         }
333         s2.Append(_T("\r\n"));
334     }
335     nCount = 96;
336     s2.Append(_T("  DT\r\n"));
337     for (int i = 0; i < (nCount + 15) / 16; i++)
338     {
339         s2.AppendFormat(_T("%02X: "), i * 16);
340         for (int j = 0; j < 8; j++)
341         {
342             s2.AppendFormat(_T("%04X"), pDoc->MyKLink1.MEM.DT[i * 8 + j]);
343             if (j == 3) { s2.Append(_T("  ")); }
344             else { s2.Append(_T(" ")); }
345         }
346         s2.Append(_T("\r\n"));
347     }
348     nCount = 256;
349     s2.Append(_T("  SDT\r\n"));
350     for (int i = 0; i < (nCount + 15) / 16; i++)
351     {
352         s2.AppendFormat(_T("%3X: "), i * 16);
353         for (int j = 0; j < 8; j++)
354         {
355             s2.AppendFormat(_T("%04X"), pDoc->MyKLink1.MEM.SDT[i * 8 + j]);
356             if (j == 3) { s2.Append(_T("  ")); }
357             else { s2.Append(_T(" ")); }
358         }
359         s2.Append(_T("\r\n"));
360     }
fc8a81 361     s2.Append(_T("\r\n"));
Q 362
363     for (int i = 8; i < (nCount + 15) / 16; i++)
364     {
365         s2.AppendFormat(_T("%3X: "), i * 16);
366         for (int j = 0; j < 16; j++)
367         {
368             s2.AppendFormat(_T("%02X"), pDoc->MyKLink1.MEM.SDB[i * 16 + j]);
369             if (j == 7) { s2.Append(_T("  ")); }
370             else { s2.Append(_T(" ")); }
371         }
372         s2.Append(_T("\r\n"));
373     }
374
0ed438 375     //    s2.AppendFormat(_T("%d\r\n"), pDoc->MyKLink1.MEM.SDD[5]);
Q 376
377     nCount = 32;
378     //SetRedraw(FALSE);
379     if (m_bMonitoring) {
380         SetDlgItemText(IDC_EDIT_MON, s2);
381     }
382
383     s2.Empty();
384     if (m_bMonitoring) {
385         s1.Empty();
386         s1.Format(_T("主机\r\n"));
387
0a20f7 388         s1.AppendFormat(_T("00 跳线 %02X %s 当前 %02X\r\n"), pDoc->MyKLink1.MEM.SDD[0], intToBinString(pDoc->MyKLink1.MEM.SDD[0]), pDoc->MyKLink1.MEM.SDD[1]);
0ed438 389         //        s1.AppendFormat(_T("当前跳线 %02X %s\r\n"), pDoc->MyKLink1.MEM.SDD[1], intToBinString(pDoc->MyKLink1.MEM.SDD[1]));
0a20f7 390         s1.AppendFormat(_T("02 Tick计数  %u \r\n"), pDoc->MyKLink1.MEM.SDD[2]);
0ed438 391         s1.AppendFormat(_T("03 nRunCount %u \r\n"), pDoc->MyKLink1.MEM.SDD[3]);
Q 392         s1.AppendFormat(_T("04 RunStat %d \r\n"), pDoc->MyKLink1.MEM.SDD[4]);
393         s1.AppendFormat(_T("05 ErrStat %d \r\n"), pDoc->MyKLink1.MEM.SDD[5]);
394         s1.AppendFormat(_T("06 PwrOnCount %d \r\n"), pDoc->MyKLink1.MEM.SDD[6]);
395         s1.AppendFormat(_T("07 ThisRunTime %d \r\n"), pDoc->MyKLink1.MEM.SDD[7]);
396
397         int nTime1 = pDoc->MyKLink1.MEM.SDD[7];
398         s1.AppendFormat(_T("%dd %02d:%02d:%02d \r\n"), nTime1 / 86400, nTime1 / 3600 % 24, nTime1 / 60 % 60, nTime1 % 60);
399         s1.AppendFormat(_T("08 TotalTime %d \r\n"), pDoc->MyKLink1.MEM.SDD[8]);
400         nTime1 = pDoc->MyKLink1.MEM.SDD[8];
401         s1.AppendFormat(_T("%dd %02d:%02d:%02d \r\n"), nTime1 / 86400, nTime1 / 3600 % 24, nTime1 / 60 % 60, nTime1 % 60);
402         s1.AppendFormat(_T("09 CurTime %d \r\n"), pDoc->MyKLink1.MEM.SDD[9]);
403
404         nTime1 = pDoc->MyKLink1.MEM.SDD[9];
405         __time32_t time1 = nTime1;
406         CString s3;
407         //_tctime32_s(s3.GetBuffer(1024),1024, &time1);
408         //s3.ReleaseBuffer();
409
410         CTime ctime1 = time1;
411         if (nTime1 >= 0) s3 = ctime1.Format(_T("%Y-%m-%d %H:%M:%S"));
412         s1.Append(s3 + _T("\r\n"));
413         //        s1.AppendFormat(_T("%04d-%02d-%02d %02d:%02d:%02d \r\n"), nTime1 / 86400, nTime1 / 3600 % 24, nTime1 / 60 % 60, nTime1 % 60);
414         s1.AppendFormat(_T("10 PwrFailCount %d \r\n"), pDoc->MyKLink1.MEM.SDD[10]);
415         s1.AppendFormat(_T("11 LastPwrFailTime %d \r\n"), pDoc->MyKLink1.MEM.SDD[11]);
416         nTime1 = pDoc->MyKLink1.MEM.SDD[11];
417         time1 = nTime1;
418         _tctime32_s(s3.GetBuffer(1024), 1024, &time1);
419         s3.ReleaseBuffer();
420         ctime1 = time1;
421         ctime1 += (30 * 365 + 7) * 24 * 3600;
422         ctime1 = CStringToCTime(_T("2000-01-01 08:00:00"));
423         ctime1 += nTime1;
424         s3 = ctime1.Format(_T("%Y-%m-%d %H:%M:%S"));
425         s1.Append(s3 + _T("\r\n"));
426
0a20f7 427         s1.AppendFormat(_T("12 LastScanTime uS %u \r\n"), pDoc->MyKLink1.MEM.SDD[12]);
0ed438 428         s1.AppendFormat(_T("13 ScanTime uS %d  \r\n"), pDoc->MyKLink1.MEM.SDD[13]);
Q 429         s1.AppendFormat(_T("14 MinScanTime uS %d \r\n"), pDoc->MyKLink1.MEM.SDD[14]);
430         s1.AppendFormat(_T("15 %d \r\n"), pDoc->MyKLink1.MEM.SDD[15]);
431         s1.AppendFormat(_T("16 %d \r\n"), pDoc->MyKLink1.MEM.SDD[16]);
432         s1.AppendFormat(_T("17 %d \r\n"), pDoc->MyKLink1.MEM.SDD[17]);
433         s1.AppendFormat(_T("18 %d \r\n"), pDoc->MyKLink1.MEM.SDD[18]);
434         s1.AppendFormat(_T("19 %d \r\n"), pDoc->MyKLink1.MEM.SDD[19]);
435         s1.AppendFormat(_T("20 %d \r\n"), pDoc->MyKLink1.MEM.SDD[20]);
436         s1.AppendFormat(_T("21 %d \r\n"), pDoc->MyKLink1.MEM.SDD[21]);
437         s1.AppendFormat(_T("22 %d \r\n"), pDoc->MyKLink1.MEM.SDD[22]);
438         s1.AppendFormat(_T("23 %d \r\n"), pDoc->MyKLink1.MEM.SDD[23]);
439
0a20f7 440         float Vref = 1.2f;
Q 441         float Vcor = (float)pDoc->MyKLink1.MEM.SDT[53] / pDoc->MyKLink1.MEM.SDT[55];
442         float V33 = 3.3f * Vcor;
0ed438 443
0a20f7 444         s1.AppendFormat(_T("24 24V电压 %d %.2f V \r\n"), pDoc->MyKLink1.MEM.SDT[48], pDoc->MyKLink1.MEM.SDT[48] * V33 / 4096 * 11);
0ed438 445         s1.AppendFormat(_T("25 %d \r\n"), pDoc->MyKLink1.MEM.SDT[49]);
0a20f7 446         s1.AppendFormat(_T("26 5V 电压 %d %.3f V \r\n"), pDoc->MyKLink1.MEM.SDT[50], pDoc->MyKLink1.MEM.SDT[50] * V33 / 4096 * 2);
0ed438 447         s1.AppendFormat(_T("27 %d \r\n"), pDoc->MyKLink1.MEM.SDT[51]);
Q 448         s1.AppendFormat(_T("28 %d \r\n"), pDoc->MyKLink1.MEM.SDT[52]);
449         s1.AppendFormat(_T("29 %d \r\n"), pDoc->MyKLink1.MEM.SDT[53]);
0a20f7 450         float temp = (1430 - pDoc->MyKLink1.MEM.SDT[54]* 0.806f ) / 4.3f + 25;
Q 451         s1.AppendFormat(_T("30 芯片温度 %d %.1f ℃ \r\n"), pDoc->MyKLink1.MEM.SDT[54],temp);
452         s1.AppendFormat(_T("31 1.2V参考 %d  3.3V电压 %.3f V \r\n"), pDoc->MyKLink1.MEM.SDT[55], V33);
0ed438 453
Q 454
455
456         //型号
457         //版本
458         //协议版本
459         //生产日期
460         //生产批号
461         //序列号
462
463         //开机次数
464         //总开机时间
465         //最大连续开机时间
466         //本次开机时间
467         //电源闪断次数
468         //总看门狗动作次数
469         //本次看门狗动作次数
470         //电源电压
471         //核心温度
472
473         //输入输出
474         //IO状态,开路,短路,熔断.....
475
476         //包顺序错误 
477         //令牌  广播形式, 环路形式
478         //
479
480         s2 += s1;
481         s2.AppendFormat(_T("\r\n"));
482         int nOffset = 32;
483         s1.Empty();
484         s1.Format(_T("子机1\r\n"));
485         KLink::pChnStat pchnstat1 = (KLink::pChnStat)&(pDoc->MyKLink1.MEM.SDD[nOffset + 0]);
486         unsigned int nSendPackets = pchnstat1->SendPackets;
487         s1.AppendFormat(_T("当前状态: %04X\r\n"), pchnstat1->Stat);
488         s1.AppendFormat(_T("发收包数:%6d/%6d(%.2f%%)\r\n发送时间 %10u (uS)\r\n"),
489             pchnstat1->SendPackets,
490             pchnstat1->RecvPackets, pchnstat1->RecvPackets *100.0 / nSendPackets,
491             pchnstat1->LastSentTimeuS);
492
493         s1.AppendFormat(_T("丢包计数:%d(%.2f%%) 连续 %d(Max:%d)\r\n"),
494             pchnstat1->LostPackets, pchnstat1->LostPackets *100.0 / nSendPackets,
495             pchnstat1->CtnLstPkts,
496             pchnstat1->MaxCtnLstPkts);
497
498         s1.AppendFormat(_T("返回延迟 %d(max:%d) uS\r\n"),
499             pchnstat1->Delay, pchnstat1->MaxDelay);
500         s1.AppendFormat(_T("循环时间 %d uS\r\n"),
501             pchnstat1->SendTimeInterval);
502
503         s1.AppendFormat(_T("子机收发 %6d/%6d \r\n"),
504             pchnstat1->ClientRecvPkts,
505             pchnstat1->ClientSendPkts);
506
507         s2 += s1;
508         s2.AppendFormat(_T("\r\n"));
509
510         nOffset = 32 + 24;
511         s1.Format(_T("子机2\r\n"));
512         pchnstat1 = (KLink::pChnStat)&(pDoc->MyKLink1.MEM.SDD[nOffset + 0]);
513         nSendPackets = pchnstat1->SendPackets;
514         s1.AppendFormat(_T("当前状态: %04X\r\n"), pchnstat1->Stat);
515         s1.AppendFormat(_T("发收包数:%6d/%6d(%.2f%%)\r\n发送时间 %10u (uS)\r\n"),
516             pchnstat1->SendPackets,
517             pchnstat1->RecvPackets, pchnstat1->RecvPackets *100.0 / nSendPackets,
518             pchnstat1->LastSentTimeuS);
519
520         s1.AppendFormat(_T("丢包计数:%d(%.2f%%) 连续 %d(Max:%d)\r\n"),
521             pchnstat1->LostPackets, pchnstat1->LostPackets *100.0 / nSendPackets,
522             pchnstat1->CtnLstPkts,
523             pchnstat1->MaxCtnLstPkts);
524
525         s1.AppendFormat(_T("返回延迟 %d(max:%d) uS\r\n"),
526             pchnstat1->Delay, pchnstat1->MaxDelay);
527         s1.AppendFormat(_T("循环时间 %d uS\r\n"),
528             pchnstat1->SendTimeInterval);
529
530         s1.AppendFormat(_T("子机收发 %6d/%6d \r\n"),
531             pchnstat1->ClientRecvPkts,
532             pchnstat1->ClientSendPkts);
533
534         s2 += s1;
535         //m_edit_mon2.SetSel(0, -1);
536         //m_edit_mon2.ReplaceSel(s2);
537         SetDlgItemText(IDC_EDIT_MON2, s2);
538     }
539     //SetRedraw(TRUE);
540     //s1.Append(s2);
541     //s1.Append(_T("\r\n"));
542
543     return 0;
544 }
545
546 void CMTerm2CommDevView::OnTimer(UINT_PTR nIDEvent)
547 {
548     // TODO:  在此添加消息处理程序代码和/或调用默认值
549     CString s1, s2;
550
551     if (nIDEvent == 0)
552     {
553         KillTimer(0);
554         DelayInit();
555     }
556     else if (nIDEvent == 1)
557     {
558         //ProcessPLC();
559         MonitorPLC();
560     }
561     else if (nIDEvent == 2)
562     {
563         //        ProcessInput();
564         //DrawPic1();
565 //        MyLogger1.UpdateLogDisplay(0);
566         UpdateDataDisplay();
65f713 567         UpdateLEDDisplay();
0ed438 568     }
Q 569     else if (nIDEvent == 3)
570     {
571         if (m_bResourceOpened && !m_bPause)
572         {
573             //            int n=AcqureDatas(m_nChannel);
574             int n = 0;
575             if (n > 0)
576             {
577             }
578         }
579     }
580     else if (nIDEvent == 4) {}
581     else {}
582     CFormView::OnTimer(nIDEvent);
583 }
584
585
586 // 如果向对话框添加最小化按钮,则需要下面的代码
587 //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
588 //  这将由框架自动完成。
589
590 /*
591 BOOL CMTerm2CommDevView::PreTranslateMessage(MSG* pMsg)
592 {
593     // TODO:  在此添加专用代码和/或调用基类
594     CString s1;
595     if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
596     {
597         if (GetDlgItem(IDC_COMBO_INPUT) == GetFocus())
598         {
599             OnBnClickedButtonSend();
600         }
601         return   FALSE;
602     }
603     if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_BACK)
604     {
605         return   FALSE;
606     }
607     if (pMsg->message == WM_KEYDOWN)
608     {
609
610         BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x80;
611         switch (pMsg->wParam)
612         {
613         case 'a':
614         case 'A':
615             if (bCtrl)
616             {
617                 CEdit* edit = (CEdit*)(GetDlgItem(IDC_EDIT_LOG1));
618                 //edit->SetFocus();
619                 edit->SetSel(0, -1);
620                 return FALSE;
621             }
622         }
623     }
624     try
625     {
626         return CFormView::PreTranslateMessage(pMsg);
627     }
628     catch (CMemoryException* e)
629     {
630         CString Serror;
631         e->GetErrorMessage(Serror.GetBuffer(256), 256);
632         Serror.ReleaseBuffer();
633         s1.Format(_T("程序 发生 内存 错误 %s \r\n"), Serror);
634         PopupMessage(s1);
635     }
636     catch (CFileException* e)
637     {
638         CString Serror;
639         e->GetErrorMessage(Serror.GetBuffer(256), 256);
640         Serror.ReleaseBuffer();
641         s1.Format(_T("程序 发生 文件 错误 %s \r\n"), Serror);
642         PopupMessage(s1);
643     }
644     catch (SE_Exception & e)
645     {
646         s1.Format(_T("程序 发生 SE 错误 Code %08X Addr %08X \r\n%s\r\n"), e.getSeNumber(), e.getAddress(), e.getInfoStr());
647         PopupMessage(s1);
648     }
649     catch (CException* e)
650     {
651         CString Serror;
652         e->GetErrorMessage(Serror.GetBuffer(256), 256);
653         Serror.ReleaseBuffer();
654         s1.Format(_T("程序 发生 C++ 错误 %s \r\n"), Serror);
655         PopupMessage(s1);
656     }
657     catch (...)
658     {
659         s1.Format(_T("程序 发生未知错误 \r\n"));
660         PopupMessage(s1);
661     }
662     return TRUE;
663
664     return CFormView::PreTranslateMessage(pMsg);
665 }
666 */
667 void CMTerm2CommDevView::FindComPort()
668 {
669     CString s1, s2;
670     m_combo_comport.ResetContent();
671     for (int i = 1; i <= 16; i++)
672     {
673         s1.Format(_T("COM%d"), i);
674         if (get_com_name(s1, s2)) s1 = s2;
675         m_combo_comport.AddString(s1);
676     }
677     sComSelStr = _T("COM3");
678     m_combo_comport.SelectString(0, sComSelStr);
679     m_combo_comport.SetCurSel(2);
680     return;
681     HKEY   hKey;
682     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey) == ERROR_SUCCESS)
683     {
684         TCHAR       szPortName[256], szComName[256];
685         DWORD       dwLong, dwSize;
686         int         nCount = 0;
687
688         m_combo_comport.ResetContent();
689         while (true)
690         {
691             dwLong = dwSize = 256;
692             if (RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize) == ERROR_NO_MORE_ITEMS)
693                 break;
694
695             m_combo_comport.InsertString(nCount, szComName);
696             nCount++;
697         }
698         RegCloseKey(hKey);
699         m_combo_comport.SetCurSel(0);
700     }
701 }
702 BOOL CMTerm2CommDevView::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
703 {
704     if (nEventType == DBT_DEVNODES_CHANGED)
705     {
706         FindComPort();
707     }
708
709     return  TRUE;
710 }
711
712 int CMTerm2CommDevView::LoadResourceList()
713 {
714     Hash & ResourceCfg = MyCfg1["Resources"];
715     int nCount;
716     nCount = _tstoi(ResourceCfg["Count"]);
717     CString s1, s2;
718     for (int i = 0; i < nCount; i++)
719     {
720         s1.Format(_T("Addr%d"), i);
721         s2 = ResourceCfg[s1];
722         ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->AddString(s2);
723     }
724     s1 = ResourceCfg["LastAddr"];
725     ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->SetWindowText(s1);
726     return nCount;
727 }
728
729 int CMTerm2CommDevView::SaveResourceList()
730 {
731     Hash & ResourceCfg = MyCfg1["Resources"];
732     int nCount1 = _tstoi(ResourceCfg["Count"]);
733     CString s1, s2, s3;
734     ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->GetWindowText(s3);
735
736     int bFound = 0;
737     int nCount2 = ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->GetCount();
738     for (int i = 0; i < nCount2; i++)
739     {
740         ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->GetLBText(i, s2);
741         if (s2 == s3) { bFound = 1; break; }
742     }
743     if (!bFound)
744     {
745         ((CComboBox *)GetDlgItem(IDC_COMBO_RES))->AddString(s3);
746         s1.Format(_T("Addr%d"), nCount1);
747         ResourceCfg[s1] = s3;
748         nCount1 = nCount1 + 1;
749         s1.Format(_T("%d"), nCount1);
750         ResourceCfg["Count"] = s1;
751     }
752     ResourceCfg["LastAddr"] = s3;
753
754     return nCount1;
755 }
756
757 int CMTerm2CommDevView::DisplayParams()
758 {
759     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
760     CString s1, s2;
761     Hash & ModelConfg = MyCfg1["Model"];
762     ModelConfg.SetCtrlList(this, myCfgValCtrls, nMarkConfigs);
763
764     for (int i = 1; i <= 16; i++)
765     {
766         s1.Format(_T("COM%d"), i);
767         if (get_com_name(s1, s2)) (s1 = s2);
768         m_combo_comport.AddString(s1);
769
770     }
771     sComSelStr = _T("COM3");
772     m_combo_comport.SelectString(0, sComSelStr);
773     m_combo_comport.SetCurSel(2);
774
775     m_combo_com_baud.AddString(_T("1200"));
776     m_combo_com_baud.AddString(_T("2400"));
777     m_combo_com_baud.AddString(_T("4800"));
778     m_combo_com_baud.AddString(_T("9600"));
779     m_combo_com_baud.AddString(_T("19200"));
780     m_combo_com_baud.AddString(_T("38400"));
781     m_combo_com_baud.AddString(_T("57600"));
782     m_combo_com_baud.AddString(_T("115200"));
783     m_combo_com_baud.AddString(_T("128000"));
784     m_combo_com_baud.AddString(_T("187500"));
785     m_combo_com_baud.AddString(_T("230400"));
786     m_combo_com_baud.AddString(_T("460800"));
787     m_combo_com_baud.AddString(_T("921600"));
788     m_combo_com_baud.AddString(_T("1000000"));
789     m_combo_com_baud.AddString(_T("2000000"));
790     m_combo_com_baud.AddString(_T("3000000"));
791     sBaudSelStr = _T("230400");
792     m_combo_com_baud.SelectString(0, sBaudSelStr);
793
794     MyThreadProc1ToRun = 0;
795     MyThreadProc1Running = 0;
796
797     ((CComboBox *)GetDlgItem(IDC_COMBO_MADDR))->SetCurSel(0);
798     ((CComboBox *)GetDlgItem(IDC_COMBO_CMD))->SetCurSel(2);
799     ((CComboBox *)GetDlgItem(IDC_COMBO_CMD_TYPE))->SetCurSel(0);
800     ((CComboBox *)GetDlgItem(IDC_COMBO_DADDR))->SetCurSel(0);
801     ((CComboBox *)GetDlgItem(IDC_COMBO_DCOUNT))->SetCurSel(6);
802
803     return 0;
804 }
805
806 int CMTerm2CommDevView::GetParams()
807 {
808     CString s1, s2;
809     Hash & ModelConfg = MyCfg1["Model"];
810     ModelConfg.GetCtrlList(this, myCfgValCtrls, nMarkConfigs);
811
812     return 0;
813 }
814
815 int CMTerm2CommDevView::LoadModel()
816 {
817     CString s1;
818
819     Hash & ModelConfg = MyCfg1["Model"];
820     return 0;
821 }
822
823 int CMTerm2CommDevView::SaveModel()
824 {
825     CString s1, s2;
826     Hash & ModelConfg = MyCfg1["Model"];
827     return 0;
828 }
829
830
831 int CMTerm2CommDevView::OpenResource(CStringA ResourceStr)
832 {
833     CString s1;
834     CMTerm2Doc *pDoc = (CMTerm2Doc *) GetDocument();
835     
836     int r = pDoc->Connect();
837     s1.Format(_T("Open %s  = %d"), pDoc->myHvSerialPort1.m_strResult, r);
838     SysLog(s1);
839     if (r == pDoc->myHvSerialPort1.R_OK)
840     {
841         m_bResourceOpened = true;
842         pDoc->MyKLink1.Open();
843         m_static_connect.SetCtlColor(RGB(0, 255, 0));
844         return true;
845     }
846     return false;
847 }
848
849 int CMTerm2CommDevView::CloseResource()
850 {
851     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
852
853     m_static_connect.SetCtlColor(RGB(80, 80, 80));
854     if (m_bResourceOpened)
855     {
856         pDoc->DisConnect();
857         pDoc->MyKLink1.Close();
858         m_bResourceOpened = false;
859     }
860     return 0;
861 }
862
863 int CMTerm2CommDevView::LoadData(CString sFilePathName)
864 {
865     CFile file1;
866     CFileException e1;
867     CStringA s1a;
868     int nDataCount = 0;
869     int r = file1.Open(sFilePathName, CFile::modeRead, &e1);
870     if (r)
871     {
872         int len1 = (int)file1.GetLength();
873         file1.Read(s1a.GetBufferSetLength(len1 + 100), len1);
874         s1a.ReleaseBuffer(len1);
875         int k = s1a.Find("\n", 0);
876         int n = atoi(s1a.Left(k));
877         CStringA s2A;
878         CStringA resultstr[100];
879         for (int i = 0; i < n; i++)
880         {
881             int j = s1a.Find("\n", k + 1);
882             s2A = s1a.Mid(k + 1, j - k - 1);
883             Split(s2A, ",", resultstr);
884             float a = (float)atof(resultstr[0]);
885             float b = (float)atof(resultstr[1]);
886             float c = (float)atof(resultstr[2]);
887             k = j;
888         }
889         nDataCount = n;
890     }
891     return nDataCount;
892 }
893
894 int CMTerm2CommDevView::SaveData(CString sFilePathName)
895 {
896     CFile file1;
897     CFileException e1;
898     CStringA s1a;
899     int nDataCount = 0;
900     int r = file1.Open(sFilePathName, CFile::modeCreate | CFile::modeWrite, &e1);
901     if (r)
902     {
903         s1a.Format("%d\r\n", nDataCount);
904         for (int i = 0; i < nDataCount; i++)
905         {
906             s1a.AppendFormat("%f,%f,%f\r\n", 0, 0, 0);
907         }
908         file1.Write(s1a.GetBuffer(), s1a.GetLength());
909         file1.Close();
910     }
911     return 0;
912 }
913
914 void CMTerm2CommDevView::OnSize(UINT nType, int cx, int cy)
915 {
916     CFormView::OnSize(nType, cx, cy);
917     if (!this->IsWindowVisible() && !BInited) { return; }
918     CString s1;
919     s1.Format(_T("Dialog OnSize Type %d  cx %d  cy %d \r\n"), nType, cx, cy);
920     //    SysLog(s1);
921     switch (nType)
922     {
923     case SIZE_MAXHIDE:
924     case SIZE_MAXSHOW:
925     case SIZE_MINIMIZED:
926         return;
927     }
928     if (nType == SIZE_MAXIMIZED || nType == SIZE_RESTORED)
929     {
930         //        calLayerOuts();
931         //        CalButtonsLayerOut();
932     }
933     // TODO:  在此处添加消息处理程序代码
934 }
935
936 int CMTerm2CommDevView::calLayerOuts()
937 {
938     GetClientRect(&MainClientRect);
939     MainClientRect.bottom -= 20;
940     int w = MainClientRect.Width();
941     int h = MainClientRect.Height();
942     DivRectX(MainClientRect, LeftRect, RightRect, 600, 0.7f);
943
944     DivRectY3(LeftRect, ItemRect, ButtonRect, LogRect, 0.7f, 0.1f, 0.2f);
945
946     CRect ItemRect1, ItemRect2;
947     DivRectX(ItemRect, ItemRect1, ItemRect2, 0.5f, 0.5f);
948
949     PicRect = RightRect;
950
951     DivRectY(PicRect, PicRectUp, PicRectDown, 24, 0.95f);
952
953     //    dialogitemshow1.MoveWindow(&ItemRect1);
954     //    dialogitemshow2.MoveWindow(&ItemRect2);
955
956     GetDlgItem(IDC_EDIT_DISPLAY)->MoveWindow(&PicRectUp);
957     GetDlgItem(IDC_COMBO_INPUT)->MoveWindow(&PicRectDown);
958     GetDlgItem(IDC_EDIT_LOG1)->MoveWindow(&LogRect);
959
960     //CalButtonsLayerOut();
961     RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
962
963
964     return 0;
965 }
966
967 int CMTerm2CommDevView::MonitorPLC()
968 {
969     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
970
971     if (m_bMonitoring && pDoc->myHvSerialPort1.m_bOpened)
972     {
973         unsigned char DstAddr = 1;
974         unsigned char DataType = pDoc->MyKLink1.KLDataTypeSDT;
975         unsigned short DAddr = 0;
976         unsigned char DCount = 32;
977         //        unsigned char Data1[256];
978         unsigned char ExtFrameLen = 0;
979
980         unsigned short nCount;
981         CString s1, s2;
982         MonitorTotalCount++;
983         int nThisSuccessCount = 0;
984         int nThisFailCount = 0;
985         int res;
986         static int nStep = 0;
987         // WX
988         ///*
989         if (nStep == 0)
990         {
991             DataType = pDoc->MyKLink1.KLDataTypeWX;
992             DCount = 16;
65f713 993             res = pDoc->MyKLink1.ReadDataByte(DstAddr,  DataType, DAddr, DCount, &pDoc->MyKLink1.MEM.WXB[DAddr]);
0ed438 994             nCount = DCount;
Q 995             if (res == pDoc->MyKLink1.KL_OK)
996             {
997                 nThisSuccessCount++;
998             }
999             else
1000             {
1001                 nThisFailCount++;
1002                 s1.Format(_T("R:= %d %s  \r\n"), res, pDoc->MyKLink1.m_resultStr);
1003                 SysLog(s1);
1004             }
1005
1006         }
1007         //*/
1008
1009         ///*
1010         //WY
326d3e 1011         if (nStep == 0)
0ed438 1012         {
Q 1013             DataType = pDoc->MyKLink1.KLDataTypeWY;
1014             DCount = 16;
65f713 1015             res = pDoc->MyKLink1.ReadDataByte(DstAddr, DataType, DAddr, DCount, &pDoc->MyKLink1.MEM.WYB[DAddr]);
0ed438 1016             nCount = DCount;
Q 1017             if (res == pDoc->MyKLink1.KL_OK)
1018             {
1019                 nThisSuccessCount++;
1020             }
1021             else
1022             {
1023                 nThisFailCount++;
1024                 s1.Format(_T("R:= %d %s  \r\n"), res, pDoc->MyKLink1.m_resultStr);
1025                 SysLog(s1);
1026             }
1027             //*/
1028         }
1029         ///*
1030         //WR
326d3e 1031         if (nStep==0)
0ed438 1032         {
Q 1033             DataType = pDoc->MyKLink1.KLDataTypeWR;
1034             DCount = 32;
65f713 1035             res = pDoc->MyKLink1.ReadDataByte(DstAddr,  DataType, DAddr, DCount, &pDoc->MyKLink1.MEM.WRB[DAddr]);
0ed438 1036             nCount = DCount;
Q 1037             if (res == pDoc->MyKLink1.KL_OK)
1038             {
1039                 nThisSuccessCount++;
1040             }
1041             else
1042             {
1043                 nThisFailCount++;
1044                 s1.Format(_T("R:= %d %s  \r\n"), res, pDoc->MyKLink1.m_resultStr);
1045                 SysLog(s1);
1046             }
1047         }
1048         //*/
1049         //DT
326d3e 1050         if (nStep == 1)
0ed438 1051         {
Q 1052             DataType = pDoc->MyKLink1.KLDataTypeDT;
1053             DCount = 96;
65f713 1054             res = pDoc->MyKLink1.ReadDataByte(DstAddr,  DataType, DAddr, DCount, &pDoc->MyKLink1.MEM.DTB[DAddr]);
0ed438 1055             nCount = DCount;
Q 1056             if (res == pDoc->MyKLink1.KL_OK)
1057             {
1058                 nThisSuccessCount++;
1059             }
1060             else
1061             {
1062                 nThisFailCount++;
1063                 s1.Format(_T("R:= %d %s  \r\n"), res, pDoc->MyKLink1.m_resultStr);
1064                 SysLog(s1);
1065             }
1066
1067         }
1068         int ByteAddr = 0;
1069         //SDT
326d3e 1070         if (nStep >= 2 && nStep <= 4)
0ed438 1071         {
326d3e 1072             int nBlock = nStep - 2;
0ed438 1073             DataType = pDoc->MyKLink1.KLDataTypeSDT;
Q 1074             ByteAddr = nBlock * 128;
1075             DCount = 128;
65f713 1076             res = pDoc->MyKLink1.ReadDataByte(DstAddr,  DataType, ByteAddr, DCount, &pDoc->MyKLink1.MEM.SDB[ByteAddr]);
0ed438 1077             nCount = DCount;
Q 1078             if (res == pDoc->MyKLink1.KL_OK)
1079             {
1080                 for (int i = 0; i < DCount; i++) { SDTbuf[ByteAddr + i] = pDoc->MyKLink1.MEM.SDB[ByteAddr + i]; }
1081                 nThisSuccessCount++;
1082             }
1083             else
1084             {
1085                 nThisFailCount++;
1086                 s1.Format(_T("R:= %d %s  \r\n"), res, pDoc->MyKLink1.m_resultStr);
1087                 SysLog(s1);
1088             }
1089         }
1090
1091         nStep++;
1092 //        if (nStep == 2) { nStep = 3; }
326d3e 1093         if (nStep > 4) { nStep = 0; }
fc8a81 1094         MonitorSuccessCount += nThisSuccessCount;
Q 1095         MonitorFailCount += nThisFailCount;
0ed438 1096         if (nThisFailCount == 0)
Q 1097         {
fc8a81 1098
0ed438 1099
Q 1100         }
1101         else
1102         {
fc8a81 1103
0ed438 1104         }
Q 1105     }
1106     return 0;
1107 }
1108 void CMTerm2CommDevView::OnClose()
1109 {
1110     // TODO:  在此添加消息处理程序代码和/或调用默认值
1111 //    if (pHvCamera1 != nullptr) { delete pHvCamera1; pHvCamera1 = nullptr; }
1112     MyThreadProc1ToRun = 0;
1113     CloseResource();
1114     GetParams();
1115     SaveMyConfig();
1116     Sleep(100);
1117
1118     CFormView::OnClose();
1119 }
1120
1121 int DrawCross(HWND hWnd1, int handx, int handy)
1122 {
1123     ///*
1124     using namespace Gdiplus;
1125     CRect rect1;
1126     GetClientRect(hWnd1, &rect1);
1127
1128     int ClientWidth = rect1.Width();
1129     int ClientHeight = rect1.Height();
1130     int CenterX = ClientWidth / 2;
1131     int CenterY = ClientHeight / 2;
1132
1133
1134     int    ZeroRage = 14;
1135     int rZeroRage = ZeroRage * ClientWidth / 256;
1136     Bitmap bmp1(ClientWidth, ClientHeight);
1137     Graphics gr1(&bmp1);
1138
1139     gr1.Clear(Gdiplus::Color::White);
1140
1141     Pen pen1(Color::Gray, 1);
1142     Pen pen2(Color::Black, 2);
1143     //画大十字线
1144     gr1.DrawLine(&pen1, 0, CenterY, ClientWidth, CenterY);
1145     gr1.DrawLine(&pen1, CenterX, 0, CenterX, ClientHeight);
1146
1147     //画中心零点的范围
1148     gr1.DrawRectangle(&pen1, CenterX - rZeroRage, CenterY - rZeroRage, rZeroRage * 2, rZeroRage * 2);
1149
1150     //画允许框的范围
1151     gr1.DrawRectangle(&pen1, ClientWidth * 10 / 100, ClientHeight * 10 / 100, ClientWidth * 80 / 100, ClientHeight * 80 / 100);
1152
1153     //画小十字线
1154     int curx = handx * ClientWidth / 256;
1155     int cury = (255 - handy) *ClientHeight / 256;
1156
1157     if (curx < 0) { curx = 0; }
1158     if (curx > ClientWidth) { curx = ClientWidth; }
1159     if (cury < 0) { cury = 0; }
1160     if (cury > ClientHeight) { cury = ClientHeight; }
1161
1162     gr1.DrawLine(&pen2, curx - 8, cury, curx + 8, cury);
1163     gr1.DrawLine(&pen2, curx, cury - 8, curx, cury + 8);
1164
1165     HDC hdc1 = GetDC(hWnd1);
1166     SetTextColor(hdc1, 0x00c0c0c0);
1167     SetBkColor(hdc1, 0x00000000);
1168
1169     Graphics gr2(hdc1);
1170     gr2.DrawImage(&bmp1, 0, 0);
1171     ReleaseDC(hWnd1, hdc1);
1172
1173     return 0;
1174 }
1175
1176 DWORD WINAPI CMTerm2CommDevView::MyThreadProc1(LPVOID pParam)
1177 {
1178     CString s1, s2;
1179     SysLog(_T("线程开始运行\r\n"));
1180     MyThreadProc1Running = 1;
1181     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
1182
1183
1184     /*
1185         static OVERLAPPED ovlap1, ovlap2;
1186         COMMTIMEOUTS ctimeout1;
1187
1188
1189         ovlap1.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
1190         ovlap2.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
1191         memset(&ctimeout1, 0, sizeof(ctimeout1));
1192         ctimeout1.ReadIntervalTimeout = 1;
1193         ctimeout1.ReadTotalTimeoutMultiplier = 0;
1194         ctimeout1.ReadTotalTimeoutConstant = 1;
1195         ctimeout1.WriteTotalTimeoutConstant = 0;
1196         ctimeout1.WriteTotalTimeoutMultiplier = 0;
1197     */
1198
1199     //s2.GetLength();
1200     //    memcpy(send1,s2,bytetosend1);
1201
1202     pDoc->MyAnsiParser1.AttachWnd(m_edit_display.GetSafeHwnd());
1203     pDoc->MyAnsiParser1.SetScreenWH(150, 40);
1204
1205     //    CClientDC hcurDC(this);
1206     HWND hDrawXY = GetDlgItem(IDC_STATIC_DRAW_XY)->m_hWnd;
1207
1208     int handx = 0, handy = 0;
1209     int oldhandx = 0, oldhandy = 0;
1210
1211
1212     SysLog(_T("准备接收\r\n"));
1213     DWORD    dNumtoRead = 1000;
1214     dNumtoRead = 64;
1215     nDataToSend = 0;
1216     DWORD wCount2 = 0;
1217     DWORD dwSent = 0;
1218     int nRunCount = 0;
1219     int nTotalRecv = 0;
1220     //计算接收速度;
1221
1222     int LastSpeedTime = (int)GetTickCountmS();
1223     int nThisRecv = 0;
1224     double AvgSpeed = 0;
1225     double CurSpeed = 0;
1226     long nCount1 = 0;
1227     int LastSendLength = 0;
1228     unsigned char databuf1[256];
1229     for (; MyThreadProc1ToRun == 1;)
1230     {
1231         //        AppendText("H");
1232         nCount1++;
1233         if (BulkSendTest == 1)
1234         {
1235             //nDataToSend += 400;
1236             nDataToSend = LastSendLength;
1237             //            s1.Format(_T("BulkToSend %d Bytes"), nDataToSend);
1238             //            SysLog(s1);
1239             dwSent = pDoc->myHvSerialPort1.Send((char *)send1, nDataToSend);
1240             s1.Format(_T("S %d ->"), nDataToSend);
1241             for (int i = 0; i < nDataToSend; i++)
1242             {
1243                 s1.AppendFormat(_T("%02X "), send1[i]);
1244             }
1245             //            SysLog(s1);
1246                         //WriteFile(hCom, send1, nDataToSend, &dwSent, NULL);
1247             nDataToSend = 0;
1248             //continue;
1249         }
1250         int SendAndRead = 0;
1251         if (nDataToSend > 0)
1252         {
1253             s1.Format(_T("ToSend %d Bytes"), nDataToSend);
1254             SysLog(s1);
1255             dwSent = pDoc->myHvSerialPort1.Send((char *)send1, nDataToSend);
1256             s1.Format(_T("S %d ->"), nDataToSend);
1257             for (int i = 0; i < nDataToSend; i++)
1258             {
1259                 s1.AppendFormat(_T("%02X "), send1[i]);
1260             }
1261             SysLog(s1);
1262             SendAndRead = 1;
1263             //WriteFile(hCom, send1, nDataToSend, &dwSent, NULL);
1264             LastSendLength = nDataToSend;
1265             nDataToSend = 0;
1266         }
1267         //        ResetEvent(ovlap2.hEvent);
1268         if (SendAndRead == 1)
1269         {
1270             s1.Format(_T("Start to Read %d "), dNumtoRead);
1271             SysLog(s1);
1272         }
1273         //ReadFile(hCom, recv1, dNumtoRead, &wCount2, &ovlap2);
1274         wCount2 = pDoc->myHvSerialPort1.Recv((char *)recv1, dNumtoRead);
1275         //        WaitForSingleObject(ovlap2.hEvent,800);
1276         //        GetOverlappedResult(hCom,&ovlap2,&wCount2,TRUE);
1277         if (wCount2 == 0) continue;
1278         //        continue;
1279         int ThisTime = static_cast <int> (GetTickCountmS());
1280         //    s3.Format("%d %d ",recv2length,wCount2);AppendText(s3);
1281         nTotalRecv += wCount2;
1282         nThisRecv += wCount2;
1283         s1.Format(_T("R %d ->"), wCount2);
1284         for (DWORD i = 0; i < wCount2; i++)
1285         {
1286             s1.AppendFormat(_T("%02X "), recv1[i]);
1287         }
1288         unsigned char nCmd, nStatus;
1289         unsigned short nCount;
1290
1291         s1.Append(_T("\r\n"));
1292         // SysLog(s1);
1293         //continue;
1294         pDoc->MyKLink1.ParseRplyPacket(recv1, wCount2, &nCmd, &nStatus, &nCount, databuf1);
1295
1296         s1.Format(_T("R-> Cmd:%02X  Status:%04X  Count:%02d  \r\nData: "), nCmd, nStatus, nCount);
1297         s2.Empty();
1298         for (int i = 0; i < nCount; i++)
1299         {
1300             s2.AppendFormat(_T("%02X "), databuf1[i]);
1301         }
1302         //        SetDlgItemText(IDC_EDIT_DATA2, s2);
1303         s1.Append(s2);
1304         s1.Append(_T("\r\n"));
1305         SysLog(s1);
1306         int HasData = pDoc->MyDataParser1.PutIn(recv1, wCount2);
1307         CStringA sA1;
1308         TToAnsi(s1, sA1);
1309         //        MyAnsiParser1.PutIn((unsigned char *)sA1.GetBuffer(), sA1.GetLength()); sA1.ReleaseBuffer();
1310         //        MyAnsiParser1.PutIn(recv1, wCount2);
1311         if (HasData)
1312         {
1313             pDoc->MyDataParser1.GetOutput(&handx, &handy);
1314             if (oldhandx != handx || oldhandy != handy)
1315             {
1316                 DrawCross(hDrawXY, handx, handy);
1317                 oldhandx = handx;
1318                 oldhandy = handy;
1319             }
1320
1321             //        m_edit2.SetSel(currenty*82+currentx,currenty*82+currentx+1,FALSE);
1322             s1.Format(_T("X=%3d(%2d%%) Y=%3d(%2d%%)"), handx, handx * 100 / 256, handy, handy * 100 / 256);
1323             SetDlgItemText(IDC_STATIC_STAT_XY, s1);
1324             //        GetWindowDlg(IDC_STATIC5)->SetWindowText("X: Y:");
1325         }
1326         nRunCount++;
1327
1328         if (ThisTime - LastSpeedTime > 500)
1329         {
1330             CurSpeed = (double)nThisRecv / (ThisTime - LastSpeedTime);
1331             nThisRecv = 0;
1332             LastSpeedTime = ThisTime;
1333         }
1334         s1.Format(_T("Runing %d  \r %.3fkBps"), nRunCount, CurSpeed);
1335         SetDlgItemText(IDC_STATIC_STATUS_CON, s1);
1336         //SysLog(_T("."));
1337
1338     }
1339     SysLog(_T("跳出接收循环\r\n"));
1340     //    hcurDC.SelectObject(def_font); 
1341 //    CloseHandle(hCom);
1342     SysLog(_T("线程结束运行\r\n\r\n"));
1343     MyThreadProc1Running = 0;
1344     return 0;
1345 }
1346
1347 UINT CMTerm2CommDevView::MyJumper1(LPVOID pParam)        //线程跳板
1348 {
1349     CMTerm2CommDevView *pInput = (CMTerm2CommDevView *)pParam;    //反跳到真正的执行程序
1350     return pInput->MyThreadProc1(0);
1351 }
1352
1353 void CMTerm2CommDevView::OnBnClickedButtonConnect()
1354 {
1355     OnMenuOnline();
1356     if (!m_bResourceOpened)
1357     {
1358         return;
1359     }
1360     m_bMonitoring = false;
1361     // TODO: 在此添加控件通知处理程序代码
1362 }
1363
1364 void CMTerm2CommDevView::OnBnClickedButtonDisconnect()
1365 {
1366     OnMenuOffline();
1367     m_bMonitoring = false;
1368     if (!m_bResourceOpened)
1369     {
1370         return;
1371     }
1372     // TODO: 在此添加控件通知处理程序代码
1373 }
1374
1375 void CMTerm2CommDevView::OnBnClickedButtonStart()
1376 {
1377     // TODO: 在此添加控件通知处理程序代码
1378     OnMenuOnline();
1379     if (!m_bResourceOpened)
1380     {
1381         return;
1382     }
1383     m_bMonitoring = false;
1384     OnMenuMonitor();
1385     return;
1386     if (MyThreadProc1ToRun == 1 || MyThreadProc1Running == 1)
1387     {
1388         SysLog(_T("线程在运行中,不能再次运行\r\n"));
1389     }
1390     else
1391     {
1392         MyThreadProc1ToRun = 1;
1393         AfxBeginThread(MyJumper1, (LPVOID)this);
1394     }
1395
1396 }
1397
1398 void CMTerm2CommDevView::OnBnClickedButtonStop()
1399 {
1400     // TODO: 在此添加控件通知处理程序代码
1401     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
1402
1403     m_bMonitoring = true;
1404     OnMenuMonitor();
1405     //    OnMenuOffline();
1406
1407     return;
1408     if (MyThreadProc1Running)
1409     {
1410         if (MyThreadProc1ToRun)
1411         {
1412             SysLog(_T("停止线程运行\r\n"));
1413             MyThreadProc1ToRun = 0;
1414         }
1415         else
1416         {
1417             SysLog(_T("线程停止中\r\n"));
1418         }
1419     }
1420     else
1421     {
1422         SysLog(_T("线程未运行\r\n"));
1423     }
1424     pDoc->myHvSerialPort1.Close();
1425 }
1426
1427
1428 void CMTerm2CommDevView::OnBnClickedButtonClrscr()
1429 {
1430     // TODO: 在此添加控件通知处理程序代码
1431     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
1432     CString s1;
1433     s1.Format(_T("Clear Screen \r\n"));
1434     SysLog(s1);
1435     pDoc->MyAnsiParser1.ClrScreen();
1436 }
1437
1438
1439 void CMTerm2CommDevView::OnBnClickedButtonSend()
1440 {
1441     // TODO: 在此添加控件通知处理程序代码
1442
1443     CString s1, sInput;
1444     //get text
1445     m_combo_input.GetWindowText(sInput);
1446     int j = m_combo_input.SelectString(0, sInput);
1447     if (j == -1)
1448     {
1449         m_combo_input.InsertString(-1, sInput);
1450         int k = m_combo_input.GetCount();
1451         m_combo_input.SetCurSel(k - 1);
1452     }
1453     else
1454     {
1455         m_combo_input.GetWindowText(s1);
1456         if (s1 != sInput)
1457         {
1458             m_combo_input.InsertString(-1, sInput);
1459             int k = m_combo_input.GetCount();
1460             m_combo_input.SetCurSel(k - 1);
1461         }
1462     }
1463     int res = 0;
1464
1465     // send text;
1466
1467     if (nDataToSend == 0)
1468     {
1469         CStringA sA1;
1470         TToAnsi(sInput, sA1);
1471         int k = sA1.GetLength();
1472         memcpy(send1, sA1.GetBuffer(), k);
1473         sA1.ReleaseBuffer();
1474         nDataToSend = k;
1475         res = 1;
1476     }
1477     else
1478     {
1479
1480     }
1481     s1.Format(_T("Send Cmd %s %d %d\r\n"), sInput, sInput.GetLength(), res);
1482     SysLog(s1);
1483
1484 }
1485
1486 void CMTerm2CommDevView::OnCbnSelchangeComboRes()
1487 {
1488     // TODO: 在此添加控件通知处理程序代码
1489 }
1490
1491 void CMTerm2CommDevView::OnCbnEditchangeComboInput()
1492 {
1493     // TODO: 在此添加控件通知处理程序代码
1494     CString s1;
1495     //    s1.Format(_T("Combo_Input Edit Changed \r\n"));
1496     //    SysLog(s1);
1497 }
1498
1499 void CMTerm2CommDevView::OnBnClickedButtonDo()
1500 {
1501     // TODO: 在此添加控件通知处理程序代码
1502     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
1503
1504     unsigned char buf1[256];
1505     unsigned char buf2[256];
1506     unsigned char Data1[256];
1507     unsigned char Data2[256];
1508     CString s1, sInput;
1509     CString MAddrStr;
1510     CString CMDstr;
1511     CString TypeStr;
1512     CString DAddrStr;
1513     CString DCountStr;
1514     CString Data1Str;
1515
1516     GetDlgItemText(IDC_COMBO_MADDR, MAddrStr);
1517     GetDlgItemText(IDC_COMBO_CMD, CMDstr);
1518     GetDlgItemText(IDC_COMBO_CMD_TYPE, TypeStr);
1519     GetDlgItemText(IDC_COMBO_DADDR, DAddrStr);
1520     GetDlgItemText(IDC_COMBO_DCOUNT, DCountStr);
1521     GetDlgItemText(IDC_EDIT_DATA1, Data1Str);
1522
1523     int DstAddr = _tstoi(MAddrStr);
1524     int Cmd = _tstoi(CMDstr);
1525     int DataType = _tstoi(TypeStr);
1526     int DAddr = _tstoi(DAddrStr);
1527     int DCount = _tstoi(DCountStr);
1528
1529     CString Resultstrs[100];
1530     int j = Split(Data1Str, _T(" "), Resultstrs);
1531     for (int i = 0; i < j; i++)
1532     {
1533         Data1[i] = Xtoi(Resultstrs[i]);
1534     }
1535
1536
1537     int bExtData = ((CButton *)GetDlgItem(IDC_CHECK_EXT_DATA))->GetCheck();
1538     CString ExtDataDstStr;
1539     CString ExtDataTypeStr;
1540     CString ExtDataLenStr;
1541     CString ExtDataStr;
1542     GetDlgItemText(IDC_COMBO_EXT_DST, ExtDataDstStr);
1543     GetDlgItemText(IDC_COMBO_EXT_TYPE, ExtDataTypeStr);
1544     GetDlgItemText(IDC_COMBO_EXT_DATA_LEN, ExtDataLenStr);
1545     GetDlgItemText(IDC_EDIT_EXT_DATA1, ExtDataStr);
1546
1547     int ExtDataDst = _tstoi(ExtDataDstStr);
1548     int ExtDataType = _tstoi(ExtDataTypeStr);
1549     int ExtDataLen = _tstoi(ExtDataLenStr);
1550
1551     j = Split(ExtDataStr, _T(" "), Resultstrs);
1552     for (int i = 0; i < j; i++)
1553     {
1554         Data2[i] = Xtoi(Resultstrs[i]);
1555     }
1556
1557     int ExtFrameLen = pDoc->MyKLink1.MakeExtDataFrame(buf2, ExtDataDst, ExtDataType, ExtDataLen, Data2);
1558
1559     KLink::unKLStat nStat1 = { 0 };
1560     nStat1.HasExt = bExtData;
1561     nStat1.nSEQ = pDoc->MyKLink1.GetNextSeq();
1562     //    Cmd += 0x30;    //KLink::cmdRead
1563     int len1 = pDoc->MyKLink1.MakeReqPacketEx(buf1, DstAddr, nStat1.StatByte, Cmd, DataType, DAddr, DCount, Data1, ExtFrameLen, buf2);
1564     s1.Format(_T("S %d ->"), len1);
1565     int res = 0;
1566     int SendType = 1;
1567     if (SendType == 1)
1568     {
1569         res = pDoc->myHvSerialPort1.Send((char *)buf1, len1);
1570         for (int i = 0; i < len1; i++)
1571         {
1572             s1.AppendFormat(_T("%02X "), buf1[i]);
1573         }
1574
1575     }
1576     else if (SendType == 2)
1577     {
1578         if (nDataToSend == 0)
1579         {
1580             int k = len1;
1581             memcpy(send1, buf1, k);
1582             nDataToSend = k;
1583             res = 1;
1584         }
1585     }
1586     s1.AppendFormat(_T(" = %d\r\n"), res);
1587     SysLog(s1);
1588
1589     DWORD wCount2;
1590     DWORD dNumtoRead = DCount + 6;;
1591     int numToRead = dNumtoRead;
1592     int len2 = 0;
1593     int nTryCount = 0;
1594     int nTryCount2 = 0;
1595     // 在没有收到数据的情况向,连续重试10次,在收到数据后,又没有数据,再重试3次。
1596     for (int i = 0; i < 10; i++)
1597     {
1598         nTryCount++;
1599         int len = pDoc->myHvSerialPort1.Recv((char *)recv1 + len2, numToRead - len2);
1600         len2 += len;
1601         if (len2 >= numToRead) break;
1602         if (len2 > 0) {
1603             nTryCount2++;
1604             if (len > 0) { nTryCount2 = 0; }
1605             if (nTryCount2 >= 1) break;
1606         }
1607     }
1608
1609     //wCount2 = MySerialCom1.Read((char *)recv1, dNumtoRead);
1610     wCount2 = len2;
1611     //        WaitForSingleObject(ovlap2.hEvent,800);
1612     //        GetOverlappedResult(hCom,&ovlap2,&wCount2,TRUE);
1613     //if (wCount2 == 0) continue;
1614     //        continue;
1615     int ThisTime = static_cast <int> (GetTickCountmS());
1616     //    s3.Format("%d %d ",recv2length,wCount2);AppendText(s3);
1617
1618     s1.Format(_T("R %d(Try %d %d)=%d->"), dNumtoRead, nTryCount, nTryCount2, wCount2);
65f713 1619     for (DWORD i = 0; i < 16 && i < wCount2; i++)
0ed438 1620     {
Q 1621         s1.AppendFormat(_T("%02X "), recv1[i]);
1622     }
1623     s1.Append(_T("... \r\n"));
1624     SysLog(s1);
1625     unsigned char nCmd = 0, nStatus = 0;
1626     unsigned short nCount = 0;
1627
1628
1629     //continue;
1630     unsigned short databuf1[256];
1631     pDoc->MyKLink1.ParseRplyPacket(recv1, wCount2, &nCmd, &nStatus, &nCount, databuf1);
1632
1633     s1.Format(_T("R: Cmd:%02X  St:%02X  N:%02d  D:\r\n"), nCmd, nStatus, nCount);
1634     CString s2;
1635     s2.Empty();
1636
1637     for (int i = 0; i < (nCount + 15) / 16; i++)
1638     {
1639         s2.AppendFormat(_T("%02X: "), i * 16);
1640         for (int j = 0; j < 8 && i * 8 + j < nCount / 2; j++)
1641         {
1642             s2.AppendFormat(_T("%04X"), databuf1[i * 8 + j]);
1643             if (j == 3) { s2.Append(_T("  ")); }
1644             else { s2.Append(_T(" ")); }
1645         }
1646         s2.Append(_T("\r\n"));
1647     }
1648
1649     //    for (int i = 0; i < nCount; i++)
1650     //    {
1651     //        s2.AppendFormat(_T("%02X "), databuf1[i]);
1652     //    }
1653         //        SetDlgItemText(IDC_EDIT_DATA2, s2);
1654     s1.Append(s2);
1655     //    s1.Append(_T("\r\n"));
1656     SysLog(s1);
1657
1658 }
1659
1660 void CMTerm2CommDevView::OnCbnSelchangeComboCmdType()
1661 {
1662     // TODO: 在此添加控件通知处理程序代码
1663 }
1664
1665
1666 void CMTerm2CommDevView::OnCbnSelchangeComboDcount()
1667 {
1668     // TODO: 在此添加控件通知处理程序代码
1669 }
1670
1671
1672 void CMTerm2CommDevView::OnBnClickedButtonStartBulkTest()
1673 {
1674     // TODO: 在此添加控件通知处理程序代码
1675     BulkSendTest = 1;
1676
1677 }
1678
1679
1680 void CMTerm2CommDevView::OnBnClickedButtonStopBulkTest()
1681 {
1682     // TODO: 在此添加控件通知处理程序代码
1683     BulkSendTest = 0;
1684 }
1685
1686 void CMTerm2CommDevView::OnMenuCommset()
1687 {
1688     // TODO: 在此添加命令处理程序代码
1689     CDialogCommSet1 dialog1;
1690     dialog1.DoModal();
1691
1692 }
1693
1694 void CMTerm2CommDevView::OnMenuDownload()
1695 {
1696     // TODO: 在此添加命令处理程序代码
1697 }
1698
1699
1700 void CMTerm2CommDevView::OnMenuUpload()
1701 {
1702     // TODO: 在此添加命令处理程序代码
1703 }
1704
1705
1706 void CMTerm2CommDevView::OnMenuOnline()
1707 {
1708     // TODO: 在此添加命令处理程序代码
1709     CString s1;
1710     s1.Format(_T("切换在线"));
1711     SysLog(s1);
1712     if (m_bOnline)
1713     {
1714         SysLog(_T("已经在线"));
1715         return;
1716     }
1717     int r = OpenResource("");
1718     if (r) {
1719         m_bOnline = true;
1720         //        m_wndToolBar.GetToolBarCtrl().CheckDlgButton(ID_MENU_ONLINE, m_bOnline);
1721                 //    ((CButton *)m_wndToolBar.GetDlgItem(ID_MENU_ONLINE))->SetCheck(m_bOnline);
1722
1723         if (m_bOnline) {
1724 //            m_wndToolBar.SetButtonStyle(17, TBBS_CHECKBOX);
1725 //            m_wndToolBar.SetButtonStyle(18, TBBS_CHECKED);
1726         }
1727
1728     }
1729     else {
1730 //        m_wndToolBar.SetButtonStyle(17, TBBS_CHECKED);
1731 //        m_wndToolBar.SetButtonStyle(18, TBBS_CHECKBOX);
1732     }
1733
1734     return;
1735 }
1736
1737 void CMTerm2CommDevView::OnUpdateMenuOnline(CCmdUI *pCmdUI)
1738 {
1739     // TODO: 在此添加命令更新用户界面处理程序代码
1740     pCmdUI->SetCheck(m_bOnline);
1741     //    m_wndToolBar.GetToolBarCtrl().CheckDlgButton(ID_MENU_ONLINE, m_bOnline);
1742
1743 }
1744
1745
1746 void CMTerm2CommDevView::OnMenuOffline()
1747 {
1748     // TODO: 在此添加命令处理程序代码
1749     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
1750
1751     CString s1;
1752     m_bOnline = false;
1753     //    m_wndToolBar.CheckDlgButton(ID_MENU_ONLINE, m_bOnline);
1754     s1.Format(_T("切换离线"));
1755     SysLog(s1);
1756     CloseResource();
1757     return;
1758
1759     if (MyThreadProc1Running)
1760     {
1761         if (MyThreadProc1ToRun)
1762         {
1763             SysLog(_T("停止线程运行\r\n"));
1764             MyThreadProc1ToRun = 0;
1765         }
1766         else
1767         {
1768             SysLog(_T("线程停止中\r\n"));
1769         }
1770     }
1771     else
1772     {
1773         SysLog(_T("线程未运行\r\n"));
1774     }
1775     pDoc->myHvSerialPort1.Close();
1776 }
1777
1778 void CMTerm2CommDevView::OnUpdateMenuOffline(CCmdUI *pCmdUI)
1779 {
1780     // TODO: 在此添加命令更新用户界面处理程序代码
1781     pCmdUI->SetCheck(!m_bOnline);
1782 }
1783
1784 void CMTerm2CommDevView::OnMenuMonitor()
1785 {
1786     // TODO: 在此添加命令处理程序代码
1787     CString s1;
1788     m_bMonitoring = !m_bMonitoring;
1789     s1.Format(_T("切换监控 -> %d"), m_bMonitoring);
1790     SysLog(s1);
1791 }
1792
1793 void CMTerm2CommDevView::OnUpdateMenuMonitor(CCmdUI *pCmdUI)
1794 {
1795     // TODO: 在此添加命令更新用户界面处理程序代码
1796     CString s1;
1797     pCmdUI->SetCheck(m_bMonitoring);
1798 }
1799
1800 void CMTerm2CommDevView::OnMenuRun()
1801 {
1802     // TODO: 在此添加命令处理程序代码
1803     CString s1;
1804     m_bRunning = !m_bRunning;
1805     s1.Format(_T("切换运行 -> %d "), m_bRunning);
1806     SysLog(s1);
1807 }
1808
1809
1810 void CMTerm2CommDevView::OnUpdateMenuRun(CCmdUI *pCmdUI)
1811 {
1812     // TODO: 在此添加命令更新用户界面处理程序代码
1813     pCmdUI->SetCheck(m_bRunning);
1814 }
1815
1816
1817
1818 void CMTerm2CommDevView::OnMenuSysregSet()
1819 {
1820     // TODO: 在此添加命令处理程序代码
1821     CDialogSysRegSet dialog1;
1822
1823     INT_PTR r = dialog1.DoModal();
1824
1825
1826 }
1827
1828
1829 void CMTerm2CommDevView::OnMenuStatusShow()
1830 {
1831     // TODO: 在此添加命令处理程序代码
1832     CDialogStatusShow dialog1;
1833     INT_PTR r = dialog1.DoModal();
1834
1835
1836 }
1837
1838
1839 void CMTerm2CommDevView::OnMenuInfoDisplay()
1840 {
1841     // TODO: 在此添加命令处理程序代码
1842     CDialogInfoDisplay dialog1;
1843     INT_PTR r = dialog1.DoModal();
1844 }
1845
1846
1847 void CMTerm2CommDevView::OnMenuCoilMon()
1848 {
1849     // TODO: 在此添加命令处理程序代码
1850     CDialogCoilMon dialog1;
1851     INT_PTR r = dialog1.DoModal();
1852 }
1853
1854
1855 void CMTerm2CommDevView::OnMenuDataMon()
1856 {
1857     // TODO: 在此添加命令处理程序代码
1858     CDialogDataMon dialog1;
1859     INT_PTR r = dialog1.DoModal();
1860
1861 }
1862
1863
1864 void CMTerm2CommDevView::OnMenuCommTool()
1865 {
1866     // TODO: 在此添加命令处理程序代码
1867 //    CDialogCommTest dialog1;
1868 //    INT_PTR r = dialog1.DoModal();
1869
1870 }
1871
1872
1873 BOOL CMTerm2CommDevView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
1874 {
1875     // TODO: 在此添加消息处理程序代码和/或调用默认值
1876
1877     return CFormView::OnMouseWheel(nFlags, zDelta, pt);
1878 }
1879
1880
1881 void CMTerm2CommDevView::OnBnClickedButtonClearStat()
1882 {
1883     // TODO: 在此添加控件通知处理程序代码
1884     Clear_COM_Stats();
1885 }
1886
1887 void CMTerm2CommDevView::OnBnClickedButtonRead()
1888 {
1889     //CDialogProgress dialog1;
1890     //INT_PTR r = dialog1.DoModal();
1891
1892     CDialogProgress * pdialog1 = new CDialogProgress();
1893     pdialog1->Create(IDD_DIALOG_PROGRESS, this);
1894     pdialog1->ShowWindow(SW_SHOW);
1895     pdialog1->UpdateWindow();
1896     for (int i = 0; i <= 200; i++)
1897     {
1898         pdialog1->SetPos(i / 2);
1899         //        pdialog1->UpdateWindow();
1900         //        DoEvents();
1901         Sleep(50);
1902
1903     }
1904     //    pdialog1->SetPos(99);
1905     //    pdialog1->UpdateWindow();
1906     for (int i = 0; i < 10; i++)
1907     {
1908         DoEvents();
1909         Sleep(10);
1910     }
1911
1912     pdialog1->DestroyWindow();
1913     delete pdialog1; pdialog1 = NULL;
1914
1915
1916     // TODO: 在此添加控件通知处理程序代码
1917 }
1918
1919
1920
1921
1922 void CMTerm2CommDevView::OnMenuEventLog()
1923 {
1924     // TODO: 在此添加命令处理程序代码
1925     CDialogEventLog dialog1;
1926     INT_PTR r = dialog1.DoModal();
1927
1928 }
1929
1930
1931 void CMTerm2CommDevView::OnMenuCommTest()
1932 {
1933     // TODO: 在此添加命令处理程序代码
1934 //    CDialogCommTest dialog1;
1935 //    INT_PTR r = dialog1.DoModal();
1936 }
1937
1938
1939 void CMTerm2CommDevView::OnMenuForceIo()
1940 {
1941     // TODO: 在此添加命令处理程序代码
1942     CDialogForceIO dialog1;
1943     INT_PTR r = dialog1.DoModal();
1944 }
1945
1946
1947 void CMTerm2CommDevView::OnMenuDatetime()
1948 {
1949     // TODO: 在此添加命令处理程序代码
1950     CDialogDateTime dialog1;
1951     INT_PTR r = dialog1.DoModal();
1952 }
1953
1954 typedef unsigned char uint8_t;
1955 typedef unsigned short uint16_t;
1956 typedef unsigned int uint32_t;
1957 typedef int int32_t;
1958
1959 const uint16_t polynom = 0xA001;
1960
1961 uint16_t crc16bitbybit(uint8_t *ptr, uint16_t len)
1962 {
1963     uint8_t i;
1964     uint16_t crc = 0xffff;
1965
1966     if (len == 0) {
1967         len = 1;
1968     }
1969     while (len--) {
1970         crc ^= *ptr;
1971         for (i = 0; i < 8; i++)
1972         {
1973             if (crc & 1) {
1974                 crc >>= 1;
1975                 crc ^= polynom;
1976             }
1977             else {
1978                 crc >>= 1;
1979             }
1980         }
1981         ptr++;
1982     }
1983     return(crc);
1984 }
1985
1986 /* Table of CRC values for high–order byte */
1987 const uint8_t crctablehi[] = {
1988     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
1989     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
1990     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
1991     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
1992     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
1993     0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
1994     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
1995     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
1996     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
1997     0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
1998     0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
1999     0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
2000     0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
2001     0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
2002     0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
2003     0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
2004     0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
2005     0x40
2006 };
2007 /* Table of CRC values for low–order byte */
2008 const uint8_t crctablelo[] = {
2009     0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
2010     0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
2011     0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
2012     0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
2013     0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
2014     0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
2015     0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
2016     0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
2017     0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
2018     0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
2019     0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
2020     0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
2021     0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
2022     0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
2023     0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
2024     0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
2025     0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
2026     0x40
2027 };
2028
2029 uint16_t crc16table(uint8_t *ptr, uint16_t len)
2030 {
2031     uint8_t crchi = 0xff;
2032     uint8_t crclo = 0xff;
2033     uint16_t index;
2034     while (len--)
2035     {
2036         index = crclo ^ *ptr++;
2037         crclo = crchi ^ crctablehi[index];
2038         crchi = crctablelo[index];
2039     }
2040     return (crchi << 8 | crclo);
2041 }
2042
2043 const uint16_t crctalbeabs[] = {
2044     0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
2045     0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
2046 };
2047
2048 uint16_t crc16tablefast(uint8_t *ptr, uint16_t len)
2049 {
2050     uint16_t crc = 0xffff;
2051     uint16_t i;
2052     uint8_t ch;
2053
2054     for (i = 0; i < len; i++) {
2055         ch = *ptr++;
2056         crc = crctalbeabs[(ch ^ crc) & 15] ^ (crc >> 4);
2057         crc = crctalbeabs[((ch >> 4) ^ crc) & 15] ^ (crc >> 4);
2058     }
2059
2060     return crc;
2061 }
2062
2063 void modbuscrc16test()
2064 {
2065     printf("\n");
2066     printf(" Modbus CRC16 tester\n");
2067     printf("-----------------------------------------------------------------------\n");
2068     uint8_t crc16_data[] = { 0x01, 0x04, 0x04, 0x43, 0x6b, 0x58, 0x0e };    // expected crc value 0xD825.
2069     printf(" modbus crc16table test, expected value : 0xd825, calculate value : 0x%x\n", crc16table(crc16_data, sizeof(crc16_data)));
2070     printf(" modbus crc16tablefast test, expected value : 0xd825, calculate value : 0x%x\n", crc16tablefast(crc16_data, sizeof(crc16_data)));
2071     printf(" modbus crc16bitbybit test, expected value : 0xd825, calculate value : 0x%x\n", crc16bitbybit(crc16_data, sizeof(crc16_data)));
2072 }
2073
2074
2075 void CMTerm2CommDevView::OnBnClickedButton11()
2076 {
2077     // TODO: 在此添加控件通知处理程序代码
2078     uint8_t crc16_data[] = { 0x01, 0x04, 0x04, 0x43, 0x6b, 0x58, 0x0e };    // expected crc value 0xD825.
2079
2080     uint16_t crc1, crc2, crc3;
2081     double time1 = GetTimemS();
2082     for (int i = 0; i < 10000; i++)
2083         crc1 = crc16table(crc16_data, sizeof(crc16_data));
2084     double time2 = GetTimemS();
2085     for (int i = 0; i < 10000; i++)
2086         crc2 = crc16tablefast(crc16_data, sizeof(crc16_data));
2087     double time3 = GetTimemS();
2088     for (int i = 0; i < 10000; i++)
2089         crc3 = crc16bitbybit(crc16_data, sizeof(crc16_data));
2090     double time4 = GetTimemS();
2091     CString s1;
2092     s1.Format(_T("crc results \r\n"));
2093     s1.AppendFormat(_T("crc result1 %x time %f \r\n"), crc1, time2 - time1);
2094     s1.AppendFormat(_T("crc result2 %x time %f \r\n"), crc2, time3 - time2);
2095     s1.AppendFormat(_T("crc result3 %x time %f \r\n"), crc3, time4 - time3);
2096     SysLog(s1);
2097 }
2098
2099
2100 void CMTerm2CommDevView::OnBnClickedButton12()
2101 {
2102     // TODO: 在此添加控件通知处理程序代码
2103     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
2104
2105     CString s1;
2106     pDoc->myHvSerialPort1.SetParams(1, 115200, _T("8-N-1"));
2107     int r = pDoc->myHvSerialPort1.Open();
2108     s1.Format(_T("%d %s"), r, pDoc->myHvSerialPort1.m_strResult);
2109     SysLog(s1);
2110 }
2111
2112
2113 void CMTerm2CommDevView::OnBnClickedButton13()
2114 {
2115     // TODO: 在此添加控件通知处理程序代码
2116     CMTerm2Doc *pDoc = (CMTerm2Doc *)GetDocument();
2117
2118     CString s1;
2119     int r = pDoc->myHvSerialPort1.Close();
2120     s1.Format(_T("%d %s"), r, pDoc->myHvSerialPort1.m_strResult);
2121     SysLog(s1);
326d3e 2122
Q 2123     double REPO_RATE(0.0);
2124     REPO_RATE = _tstof(_T(""));
2125     s1.Format(_T("RAPO_RATE = %f \n"), REPO_RATE);
2126     SysLog(s1);
2127
2128
0ed438 2129 }
65f713 2130 enum enStat
Q 2131 {
2132     normal=0,
2133     setchn=1,
2134     setvalue=2,
2135     setonoff=3,
2136
2137 };
2138 int nStat = 0;
2139 int ntimecount = 0;
2140 #define MaxTimeOut 50
2141
2142 int nCurChn = 0;
2143 int nValue[4] = { 100,200,300,400 };
2144 int LedOn[4] = { 0 };
2145 int flickTimer = 0;
2146 int CMTerm2CommDevView::UpdateLEDDisplay()
2147 {
2148     // TODO: 在此处添加实现代码.
2149     flickTimer++;
2150     int bHide = 0;
2151     if ((flickTimer & 0x7) > 3) { bHide = 1; }
2152
2153     CString s1;
2154     s1 = _T("0000");
2155
2156     s1.Format(_T("%d%03d"), nCurChn, nValue[nCurChn]);
2157     if (nStat == setchn && bHide)
2158     {
2159         s1.Format(_T(" %03d"), nValue[nCurChn]);
2160     }
2161     if (nStat == setvalue && bHide)
2162     {
2163         s1.Format(_T("%d   "),nCurChn);
2164     }
2165     if (nStat == setonoff && bHide)
2166     {
2167         s1.Format(_T("    "), nCurChn);
2168     }
2169
2170     SetDlgItemText(IDC_EDIT31, s1);
2171
2172     s1.Format(_T("%d %d %d %d"), LedOn[0], LedOn[1], LedOn[2], LedOn[3]);
2173     SetDlgItemText(IDC_EDIT32, s1);
2174
2175     ntimecount++;
2176     if (ntimecount >= MaxTimeOut) { nStat = normal; }
2177     return 0;
2178 }
2179
2180 void CMTerm2CommDevView::OnBnClickedButton31()
2181 {
2182     // TODO: 在此添加控件通知处理程序代码
2183     ntimecount = 0;
2184     if (nStat == setchn)
2185     {
2186         nCurChn++;
2187         if (nCurChn >= 4) { nCurChn = 0; }
2188     }
2189     if (nStat == setvalue)
2190     {
2191         nValue[nCurChn] ++;
2192         if (nValue[nCurChn] > 999) { nValue[nCurChn] = 999; }
2193     }
2194     if (nStat == setonoff)
2195     {
2196         LedOn[nCurChn] =1;
2197     }
2198 }
2199
2200
2201 void CMTerm2CommDevView::OnBnClickedButton2()
2202 {
2203     // TODO: 在此添加控件通知处理程序代码
2204     ntimecount = 0;
2205     if (nStat == setchn)
2206     {
2207         nCurChn--;
2208         if (nCurChn <0) { nCurChn = 3; }
2209     }
2210     if (nStat == setvalue)
2211     {
2212         nValue[nCurChn] --;
2213         if (nValue[nCurChn] <= 0) { nValue[nCurChn] = 0; }
2214     }
2215     if (nStat == setonoff)
2216     {
2217         LedOn[nCurChn] = 0;
2218     }
2219 }
2220
2221
2222 void CMTerm2CommDevView::OnBnClickedButton3()
2223 {
2224     // TODO: 在此添加控件通知处理程序代码
2225     ntimecount = 0;
2226     if (nStat == normal)
2227     {
2228         nStat = setchn;
2229     } else     if (nStat == setchn)
2230     {
2231         nStat = setvalue;
2232     } else     if (nStat == setvalue)
2233     {
2234         nStat = setonoff;
2235     }
2236     else if (nStat == setonoff)
2237     {
2238         nStat = setchn;
2239     }
2240
2241 }
2242
2243
0ed438 2244