DSO138_SourceCodes_v037.rar
[DSO138] / Command.c
1 //////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 //      Filename:       Command.c\r
4 //      Version:                \r
5 //      Data:           \r
6 //\r
7 //      Author:         Liu, Zemin\r
8 //      Company:        JYE Tech\r
9 //\r
10 //-----------------------------------------------------------------------------\r
11 //\r
12 //      Target:                 STM32F103C8 \r
13 //      Tool chain:     CodeSourcery G++\r
14 //\r
15 //-----------------------------------------------------------------------------\r
16 //      Required files:\r
17 //\r
18 //-----------------------------------------------------------------------------\r
19 //      Notes:\r
20 //\r
21 //\r
22 //-----------------------------------------------------------------------------\r
23 //      Revision History:\r
24 //\r
25 ///////////////////////////////////////////////////////////////////////////////\r
26 #include "stm32f10x.h"\r
27 #include "stm32f10x_conf.h"\r
28 \r
29 #include "Common.h"\r
30 #include "Board.h"\r
31 #include "Command.h"\r
32 #include        "libdso138.h"\r
33 #include        "Screen.h"\r
34 #include        "Eeprom.h"\r
35 \r
36 // ===========================================================
37 //      File Scope Global variables
38 // ===========================================================
39 //\r
40 const   KeyScanCode KScanCodeTab[9] = {\r
41 //      scan code       key code                key param\r
42         {0x7FFF,        KC_SW1,         '1'},           // 1\r
43         {0xBFFF,        KC_SW2,         '2'},           // 2\r
44         {0xDFFF,        KC_SW3,         '3'},           // 3\r
45         {0xEFFF,        KC_SW4,         '4'},           // 4\r
46         {0x7FFE,        KC_SW1H,        '5'},           // 5\r
47         {0xBFFE,        KC_SW2H,        '6'},           // 6\r
48         {0xDFFE,        KC_SW3H,        '7'},           // 7\r
49         {0xEFFE,        KC_SW4H,        '8'},           // 8\r
50         {0,                     0,                      0}              \r
51         };\r
52 \r
53 KEYPAD  Keypad;\r
54 U8      VSenPrev, CplPrev;\r
55 U16     Flags;\r
56 \r
57 \r
58 // ===========================================================
59 //      Function Definitions
60 // ===========================================================
61 //\r
62 void    AppInit()
63 {\r
64  U16 tmp0;\r
65 \r
66 // =============================\r
67 // Note: DSO_Init() must be executed for proper capture engine running\r
68  \r
69  DSO_Init();\r
70 \r
71 // =============================\r
72 \r
73  // Check EEPROM for valid settings\r
74  EE_ReadVariable(Addr_SettingStatus, &tmp0);\r
75  if(tmp0 == SettingStatus_Initialized) {\r
76         // Load saved settings\r
77         EE_ReadVariable(VirtAddVarTab[Addr_Vpos], &tmp0);\r
78         SetVPos(tmp0);\r
79         EE_ReadVariable(VirtAddVarTab[Addr_Vsen], &tmp0);\r
80         SetVSen(tmp0);\r
81         EE_ReadVariable(VirtAddVarTab[Addr_Cpl], &tmp0);\r
82         SetCpl(tmp0);\r
83         EE_ReadVariable(VirtAddVarTab[Addr_TimeBase], &tmp0);\r
84         SetTimeBase(tmp0);\r
85         EE_ReadVariable(VirtAddVarTab[Addr_TrigMode], &tmp0);\r
86         SetTrigMode(tmp0);\r
87         EE_ReadVariable(VirtAddVarTab[Addr_TrigEdge], &tmp0);\r
88         SetTrigEdge(tmp0);\r
89         EE_ReadVariable(VirtAddVarTab[Addr_TrigLvl], &tmp0);\r
90         SetTrigLvl(tmp0);\r
91         EE_ReadVariable(VirtAddVarTab[Addr_RecLen], &tmp0);\r
92         SetRecLen(tmp0);\r
93         EE_ReadVariable(VirtAddVarTab[Addr_HPos], &tmp0);\r
94         SetHPos(tmp0);\r
95         EE_ReadVariable(VirtAddVarTab[Addr_VPosOfs], &tmp0);\r
96         SetVPosOfs(tmp0);\r
97         }\r
98  else {\r
99         // Load default settings and initialize EEPROM\r
100         SetVPos(0);\r
101         EE_WriteVariable(VirtAddVarTab[Addr_Vpos], 0);\r
102         SetVSen(VS_05V);\r
103         EE_WriteVariable(VirtAddVarTab[Addr_Vsen], VS_05V);\r
104         SetCpl(CP_DC);\r
105         EE_WriteVariable(VirtAddVarTab[Addr_Cpl], CP_DC);\r
106         SetTimeBase(TB_1ms);\r
107         EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], TB_1ms);\r
108         SetTrigMode(TM_Auto);\r
109         EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], TM_Auto);\r
110         SetTrigEdge(TE_Falling);\r
111         EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], TE_Falling);\r
112         SetTrigLvl(0);\r
113         EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], 0);\r
114         SetRecLen(SampleBufSizeMax);\r
115         EE_WriteVariable(VirtAddVarTab[Addr_RecLen], SampleBufSizeMax);\r
116         SetHPos(GetRecLen()/2 - WDsize/2);\r
117         EE_WriteVariable(VirtAddVarTab[Addr_HPos], GetRecLen()/2 - WDsize/2);\r
118         SetVPosOfs(0);\r
119         EE_WriteVariable(VirtAddVarTab[Addr_VPosOfs], 0);\r
120 \r
121         // Mark down EEPROM has been initialized\r
122         EE_WriteVariable(VirtAddVarTab[Addr_SettingStatus], SettingStatus_Initialized);\r
123 \r
124         }\r
125 \r
126  OutputTLvl();\r
127 \r
128  // Misc initialization
129  TimerKeyScan = 1;\r
130
131  Keypad.KDebounceVal = KD_val;
132  
133 }\r
134 \r
135 void    KeyProc(void)\r
136 {\r
137  switch(Keypad.KeyCode) {\r
138         case KC_SW1:\r
139                 DoKeyOk();\r
140         default:        \r
141                 break;\r
142                 \r
143         case KC_SW2:\r
144                 DoKeyInc();\r
145                 break;\r
146 \r
147         case KC_SW3:\r
148                 DoKeyDec();\r
149                 break;\r
150 \r
151         case KC_SW4:\r
152                 DoKeySel();\r
153                 break;\r
154 \r
155         case KC_SW1H:\r
156                 DoKeyOkH();\r
157                 break;\r
158 \r
159         case KC_SW2H:\r
160                 DoKeyIncH();\r
161                 break;\r
162 \r
163         case KC_SW3H:\r
164                 DoKeyDecH();\r
165                 break;\r
166 \r
167         case KC_SW4H:\r
168                 DoKeySelH();\r
169                 break;\r
170 \r
171         }\r
172 }\r
173 \r
174 \r
175 void KeyScan(void)
176 {
177  U16    tmp1;\r
178  U8     tmp2, tmp3;\r
179
180  Keypad.KScanBuf = NoKey;\r
181  // Read buttons
182  tmp1 = (PB_Port & PB_Bits) | ~PB_Bits;
183  if(tmp1 != NoKey) {
184         Keypad.KScanBuf = tmp1;\r
185         }
186
187  
188  // -- Debouncing
189  if((Keypad.KScanBuf == NoKey) || (Keypad.KScanBuf != Keypad.KScanCode)) {\r
190         Keypad.KScanCode = Keypad.KScanBuf;\r
191         Keypad.KCount = 0;\r
192         Keypad.KHCount = 0;\r
193         Keypad.KTimeChk = KH_val;\r
194         }
195  else {
196         Keypad.KCount++;\r
197         if(Keypad.KCount > Keypad.KDebounceVal) {\r
198                 if(Keypad.KCount == Keypad.KDebounceVal + 3) {\r
199                         Keypad.KCount = Keypad.KDebounceVal;\r
200                         if(++Keypad.KHCount == Keypad.KTimeChk) {\r
201                                 // Key hold detected
202                                 Keypad.KScanCode &= 0xFFFE;\r
203                                 KeyConvert((KeyScanCode *)KScanCodeTab, Keypad.KScanCode);\r
204                                 // Change KTimeChk for key repeat
205                                 Keypad.KTimeChk += KR_Time;\r
206                                 }
207                         }
208                 }
209         else if(Keypad.KCount == Keypad.KDebounceVal) {\r
210                 // Key push detected
211                 KeyConvert((KeyScanCode *)KScanCodeTab, Keypad.KScanCode);\r
212                 }
213         }
214 \r
215 #define Threshold_High          0x0900\r
216 #define Threshold_Low           0x0300\r
217 \r
218  // Read switch SEN1\r
219  tmp1 = ADC_Poll(ADC2, 2);\r
220  tmp2 = 0;\r
221  if(tmp1 > Threshold_High) {\r
222         tmp2 = 2;\r
223         }\r
224  else if(tmp1 > Threshold_Low) {\r
225         tmp2 = 1;\r
226         }\r
227 \r
228  // Read switch SEN2\r
229  tmp1 = ADC_Poll(ADC2, 1);\r
230  tmp3 = 0;\r
231  if(tmp1 > Threshold_High) {\r
232         tmp3 = 2;\r
233         }\r
234  else if(tmp1 > Threshold_Low) {\r
235         tmp3 = 1;\r
236         }\r
237 \r
238  // Determine VSen setting\r
239  tmp2 = 3 * tmp2 + tmp3 + VSenMin;\r
240  if(tmp2 != VSenPrev) {\r
241         SetVSen(tmp2);\r
242         VSenPrev = tmp2;\r
243         UpdateDisp(Disp_Param);\r
244         }\r
245  \r
246  // Read switch Cpl\r
247  tmp1 = ADC_Poll(ADC2, 3);\r
248  tmp2 = 0;\r
249  if(tmp1 > Threshold_High) {\r
250         tmp2 = 2;\r
251         }\r
252  else if(tmp1 > Threshold_Low) {\r
253         tmp2 = 1;\r
254         }\r
255  tmp2 = 2 - tmp2;\r
256  \r
257  // Determine Cpl setting\r
258  if(tmp2 != CplPrev) {\r
259         SetCpl(tmp2);\r
260         CplPrev = tmp2;\r
261         UpdateDisp(Disp_Param);\r
262         }\r
263  }
264
265 void    KeyConvert(KeyScanCode *KSCTab, U16 KSCode)
266 {
267  U16 tmp1;
268  
269  while((tmp1 = *(U16 *)(KSCTab + 0))) {
270         if(tmp1 == KSCode) {
271                 // -- Match found
272                 Keypad.KeyCode = *(U8 *)((U8 *)KSCTab + 2);\r
273                 Keypad.KeyCodeBuf = Keypad.KeyCode;\r
274                 Keypad.KeyParam = *(U8 *)((U8 *)KSCTab + 3);\r
275                 return;
276                 }
277         else {
278                 // -- Proceed to next entry
279                 KSCTab = (KeyScanCode *)((U8 *)KSCTab + sizeof(KeyScanCode));
280                 }
281         
282         }
283 }
284 \r
285 void    DoKeyOk(void)
286 {\r
287  U16 tmp;\r
288  \r
289  tmp = GetDsoStatus();\r
290  // Toggle HOLD state
291  BitXor(tmp, DSO_Hold);\r
292 \r
293  if(BitTest(tmp, DSO_Hold)) {\r
294         // Set HOLD \r
295         SetHold();\r
296         // Stop capture\r
297         StopCapture();\r
298         }\r
299  else {\r
300         // Clear HOLD\r
301         ClrHold();\r
302         // Start capture at exit of HOLD
303         StartCapture();
304         }\r
305  
306  UpdateDisp(Disp_Param);\r
307 }\r
308
309 void    DoKeyInc(void)
310 {
311  S8     tmp0;
312  S16    tmp1;
313  
314  switch(GetFocus()) {\r
315         case FC_Timebase:
316                 tmp0 = GetTimebase();\r
317                 tmp0++;
318                 tmp0 = SetTimeBase(tmp0);\r
319                 EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], tmp0);\r
320                 if(tmp0 >= TB_20ms) {\r
321                         // Restart capture
322                         StartCapture();
323                         }\r
324                 else {
325                         // Change sampling rate only
326                         UpdateTimebase();\r
327                         }
328                 // Make key debounce time shorter for these TB's \r
329                 if((tmp0 < TB_20ms) && (tmp0 > TB_1s)) {\r
330                         Keypad.KDebounceVal = KD_val1;
331                         }
332                 else {
333                         Keypad.KDebounceVal = KD_val;
334                         }
335         default:        
336                 break;
337                 
338         case FC_TrigMode:
339                 tmp0 = GetTrigMode();\r
340                 tmp0++;
341                 tmp0 = SetTrigMode(tmp0);\r
342                 EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], tmp0);\r
343                 // Restart capture. \r
344                 StartCapture();
345                 break;\r
346
347         case FC_TrigEdge:
348                 tmp0 = GetTrigEdge();\r
349                 tmp0++;
350                 tmp0 = SetTrigEdge(tmp0);\r
351                 EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], tmp0);\r
352                 break;
353                 
354         case FC_VPos:
355                 tmp1 = GetVPos();\r
356                 tmp1++;
357                 tmp1 = SetVPos(tmp1);\r
358                 EE_WriteVariable(VirtAddVarTab[Addr_Vpos], tmp1);\r
359                 UpdateDisp(Disp_Trace);\r
360                 break;
361
362         case FC_TrigLvl:
363                 tmp1 = GetTrigLvl();\r
364                 tmp1++;
365                 tmp1 = SetTrigLvl(tmp1);\r
366                 EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], tmp1);\r
367                 OutputTLvl();\r
368                 break;
369                 
370         case FC_HPos:
371                 // Move waveform right
372                 tmp1 = GetHPos();\r
373                 tmp1--;
374                 tmp1 = SetHPos(tmp1);\r
375                 EE_WriteVariable(VirtAddVarTab[Addr_HPos], tmp1);\r
376                 UpdateDisp(Disp_Trace);\r
377                 break;
378                 
379         }
380  
381  UpdateDisp(Disp_Param);\r
382 }
383
384 void    DoKeyDec(void)
385 {
386  S8     tmp0;
387  S16    tmp1;
388  
389  switch(GetFocus()) {\r
390         case FC_Timebase:
391                 tmp0 = GetTimebase();\r
392                 tmp0--;
393                 tmp0 = SetTimeBase(tmp0);\r
394                 EE_WriteVariable(VirtAddVarTab[Addr_TimeBase], tmp0);\r
395                 if(tmp0 >= TB_50ms) {\r
396                         // Restart capture
397 //                      UartPutc('7', USART1);\r
398                         StartCapture();
399 //                      UartPutc('1', USART1);\r
400                         }\r
401                 else {
402                         // Change sampling rate only
403                         UpdateTimebase();\r
404                         \r
405                         }
406 /*              \r
407                 // Make key debounce time shorter for these TB's \r
408                 if((tmp0 < TB_20ms) && (tmp0 > TB_1s)) {\r
409                         Delay(50000);   // To avoid same keypress repeated\r
410                         Keypad.KDebounceVal = KD_val1;
411                         }
412                 else {
413                         Keypad.KDebounceVal = KD_val;
414                         }\r
415 */              \r
416         default:        
417                 break;
418                 
419         case FC_TrigMode:
420                 tmp0 = GetTrigMode();\r
421                 tmp0--;
422                 tmp0 = SetTrigMode(tmp0);\r
423                 EE_WriteVariable(VirtAddVarTab[Addr_TrigMode], tmp0);\r
424                 // Restart capture. \r
425                 StartCapture();
426                 break;\r
427
428         case FC_TrigEdge:
429                 tmp0 = GetTrigEdge();\r
430                 tmp0--;
431                 tmp0 = SetTrigEdge(tmp0);\r
432                 EE_WriteVariable(VirtAddVarTab[Addr_TrigEdge], tmp0);\r
433                 break;
434                 
435         case FC_VPos:
436                 tmp1 = GetVPos();\r
437                 tmp1--;
438                 tmp1 = SetVPos(tmp1);\r
439                 EE_WriteVariable(VirtAddVarTab[Addr_Vpos], tmp1);\r
440                 UpdateDisp(Disp_Trace);\r
441                 break;
442
443         case FC_TrigLvl:
444                 tmp1 = GetTrigLvl();\r
445                 tmp1--;
446                 tmp1 = SetTrigLvl(tmp1);\r
447                 EE_WriteVariable(VirtAddVarTab[Addr_TrigLvl], tmp1);\r
448                 OutputTLvl();\r
449                 break;
450                 
451         case FC_HPos:
452                 // Move waveform left
453                 tmp1 = GetHPos();\r
454                 tmp1++;
455                 tmp1 = SetHPos(tmp1);\r
456                 EE_WriteVariable(VirtAddVarTab[Addr_HPos], tmp1);\r
457                 UpdateDisp(Disp_Trace);\r
458                 break;
459                 
460         }
461  
462  UpdateDisp(Disp_Param);\r
463 }
464
465 void    DoKeySel(void)
466 {\r
467  U8 tmp;\r
468 \r
469  tmp = GetFocus();\r
470  tmp++;\r
471  if(tmp >= FC_Max) {\r
472         tmp = 0;\r
473         }\r
474  SetFocus(tmp);\r
475 \r
476  UpdateDisp(Disp_Param);\r
477 }\r
478
479 void    DoKeyOkH(void)
480 {\r
481  S16 tmp1;\r
482  \r
483  if(GetFocus() == FC_VPos) {\r
484         // Do VPos alignment\r
485         tmp1 = (S16)(GetAverage() - WWindowMidValue);\r
486         SetVPosOfs(tmp1);\r
487         EE_WriteVariable(VirtAddVarTab[Addr_VPosOfs], tmp1);\r
488         }\r
489 }
490
491 void    DoKeyIncH(void)
492 {
493  S16    tmp1;
494  
495  switch(GetFocus()) {\r
496         case FC_VPos:
497                 tmp1 = GetVPos();\r
498                 tmp1 += 10;
499                 SetVPos(tmp1);
500                 break;
501
502         case FC_TrigLvl:
503                 tmp1 = GetTrigLvl();\r
504                 tmp1 += 10;
505                 SetTrigLvl(tmp1);
506                 OutputTLvl();\r
507                 break;
508                 
509         case FC_HPos:
510                 // Move waveform right
511                 tmp1 = GetHPos();\r
512                 tmp1 -= 20;
513                 SetHPos(tmp1);          
514                 break;
515         }
516
517  UpdateDisp(Disp_Param);\r
518 }
519
520 void    DoKeyDecH(void)
521 {
522  S16    tmp1;
523  
524  switch(GetFocus()) {\r
525         case FC_VPos:
526                 tmp1 = GetVPos();\r
527                 tmp1 -= 10;
528                 SetVPos(tmp1);
529                 break;
530
531         case FC_TrigLvl:
532                 tmp1 = GetTrigLvl();\r
533                 tmp1 -= 10;
534                 SetTrigLvl(tmp1);
535                 OutputTLvl();\r
536                 break;
537                 
538         case FC_HPos:
539                 // Move waveform left
540                 tmp1 = GetHPos();\r
541                 tmp1 += 20;
542                 SetHPos(tmp1);
543                 break;
544         }
545
546  UpdateDisp(Disp_Param);\r
547 }
548
549 void    DoKeySelH(void)
550 {\r
551 \r
552 }\r
553 \r
554 void    LedBlink(void)\r
555 {\r
556  U16    tmp;\r
557  \r
558  // Turn on LED\r
559  Port_BitClr(LED_Base, (1 << LED_Bit));\r
560  tmp = 20;\r
561  while(tmp) {\r
562         Delay(65000);\r
563         tmp--;\r
564         }\r
565  \r
566  // Turn off LED\r
567  Port_BitSet(LED_Base, (1 << LED_Bit));\r
568  tmp = 20;\r
569  while(tmp) {\r
570         Delay(65000);\r
571         tmp--;\r
572         }\r
573 \r
574  // Turn on LED\r
575  Port_BitClr(LED_Base, (1 << LED_Bit));\r
576  tmp = 20;\r
577  while(tmp) {\r
578         Delay(65000);\r
579         tmp--;\r
580         }\r
581  \r
582  // Turn off LED\r
583  Port_BitSet(LED_Base, (1 << LED_Bit));\r
584 }\r
585 \r
586 void    TestMode(void)\r
587 {\r
588  U16 tmp;\r
589  \r
590  // Change system clock to HSI\r
591  RCC->CFGR &= ~RCC_CFGR_SW;\r
592  RCC->CFGR |= RCC_CFGR_SW_HSI;\r
593 \r
594  // Disable JTAG and SWD\r
595  AFIO->MAPR &= ~AFIO_MAPR_SWJ_CFG;\r
596  AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_2;\r
597 \r
598  // Remap PD0 & PD1 to make them available as GPIO\r
599  AFIO->MAPR |= AFIO_MAPR_PD01_REMAP;\r
600 \r
601  // Set all ports to output mode\r
602  GPIOA->CRL = 0x33333333;\r
603  GPIOA->CRH = 0x33333333;\r
604 \r
605  GPIOB->CRL = 0x33333333;\r
606  GPIOB->CRH = 0x33333333;\r
607 \r
608  GPIOC->CRL = 0x33333333;\r
609  GPIOC->CRH = 0x33333333;\r
610  \r
611  GPIOD->CRL = 0x33333333;\r
612  GPIOD->CRH = 0x33333333;\r
613 \r
614  // Blink LEDs\r
615  while(1) {\r
616         GPIOA->ODR = 0x5555;\r
617         GPIOB->ODR = 0x5555;\r
618         GPIOC->ODR = 0x5555;\r
619         GPIOD->ODR = 0x5555;\r
620 \r
621         tmp = 5;\r
622         while(tmp) {\r
623                 Delay(60000);\r
624                 tmp--;\r
625                 }\r
626 \r
627         GPIOA->ODR = 0xAAAA;\r
628         GPIOB->ODR = 0xAAAA;\r
629         GPIOC->ODR = 0xAAAA;\r
630         GPIOD->ODR = 0xAAAA;\r
631 \r
632         tmp = 5;\r
633         while(tmp) {\r
634                 Delay(60000);\r
635                 tmp--;\r
636                 }\r
637         }\r
638  \r
639 }\r
640 \r