summaryrefslogtreecommitdiff
path: root/AT91SAM7S256/Source/d_button.r
blob: c4783947fd4a6fc6007c7a6103ce2b0f9a1a3a66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
//
// Date init       14.12.2004
//
// Revision date   $Date:: 14-11-07 12:40                                    $
//
// Filename        $Workfile:: d_button.r                                    $
//
// Version         $Revision:: 1                                             $
//
// Archive         $Archive:: /LMS2006/Sys01/Main_V02/Firmware/Source/d_butt $
//
// Platform        C
//

#ifdef    SAM7S256

static    UBYTE PrellCnt[NOS_OF_AVR_BTNS];
static    UWORD OldVal;
static    UBYTE OldState;
static    UBYTE RisingTime;

#define   PRELL_TIME                    (60/TimeTick)
#define   RISING_THRESHOLD              (10/TimeTick)

#define   BUTTONInit                    {\
                                          UBYTE Tmp;\
                                          for (Tmp = 0; Tmp < NOS_OF_AVR_BTNS; Tmp++)\
                                          {\
                                            PrellCnt[Tmp] = 0;\
                                          }\
                                          IoFromAvr.Buttons = 0;\
                                          OldVal            = 0;\
                                          OldState          = 0;\
                                          RisingTime        = 0;\
                                        }

#if       defined (PROTOTYPE_PCB_3) || (PROTOTYPE_PCB_4)

/* Buttons read here are free of prell or jitter          */
/* And because it's an AD value returned from the AVR     */
/* then a peak detector is needed                         */
#define   BUTTONRead(pB)                {\
                                          UBYTE Tmp, BtnPtr;\
                                          UWORD TmpBtn;\
                                          *pB    = OldState;\
                                          BtnPtr = 0x01;\
                                          if (OldVal < IoFromAvr.Buttons)\
                                          {\
                                            OldVal = IoFromAvr.Buttons;\
                                            RisingTime  = 0;\
                                          }\
                                          else\
                                          {\
                                            if (OldVal > (IoFromAvr.Buttons + 20))\
                                            {\
                                              OldVal = IoFromAvr.Buttons;\
                                              RisingTime  = 0;\
                                            }\
                                            else\
                                            {\
                                              if (RisingTime > RISING_THRESHOLD)\
                                              {\
                                                TmpBtn = IoFromAvr.Buttons;\
                                                if (0x40 > TmpBtn)\
                                                {\
                                                  TmpBtn = 0x00;\
                                                }\
                                                else if (0x100 > TmpBtn)\
                                                {\
                                                  TmpBtn = 0x04;\
                                                }\
                                                else if (0x1FF > TmpBtn)\
                                                {\
                                                  TmpBtn = 0x02;\
                                                }\
                                                else if (0x5FF > TmpBtn)\
                                                {\
                                                  TmpBtn = 0x01;\
                                                }\
                                                else\
                                                {\
                                                  TmpBtn = 0x08;\
                                                }\
                                                for (Tmp = 0; Tmp < NOS_OF_AVR_BTNS; Tmp++)\
                                                {\
                                                  if ((TmpBtn) & BtnPtr)\
                                                  {\
                                                    *pB |= BtnPtr;\
                                                    PrellCnt[Tmp]  = PRELL_TIME;\
                                                  }\
                                                  else\
                                                  {\
                                                    /* btn not pressed */\
                                                    if (0 != PrellCnt[Tmp])\
                                                    {\
                                                      PrellCnt[Tmp]--;\
                                                    }\
                                                    else\
                                                    {\
                                                      *pB &= ~BtnPtr;\
                                                    }\
                                                  }\
                                                  BtnPtr <<= 1;\
                                                }\
                                                OldState = *pB;\
                                              }\
                                              else\
                                              {\
                                                RisingTime++;\
                                              }\
                                            }\
                                          }\
                                        }

#else

// Buttons read here are free of prell or jitter
#define   BUTTONRead(pB)                {\
                                          UBYTE Tmp, BtnPtr;\
                                          UWORD TmpBtn;\
                                          *pB    = OldState;\
                                          BtnPtr = 0x01;\
                                          if ((OldVal) < IoFromAvr.Buttons)\
                                          {\
                                            OldVal = IoFromAvr.Buttons;\
                                          }\
                                          else\
                                          {\
                                            if ((OldVal) > IoFromAvr.Buttons)\
                                            {\
                                              OldVal = IoFromAvr.Buttons;\
                                            }\
                                            else\
                                            {\
                                              TmpBtn = IoFromAvr.Buttons;\
                                              if (100 > TmpBtn)\
                                              {\
                                                TmpBtn = 0x00;\
                                              }\
                                              else if (170 > TmpBtn)\
                                              {\
                                                TmpBtn = 0x01;\
                                              }\
                                              else if (255 > TmpBtn)\
                                              {\
                                                TmpBtn = 0x02;\
                                              }\
                                              else if (1000 > TmpBtn)\
                                              {\
                                                TmpBtn = 0x04;\
                                              }\
                                              else if (1024 > TmpBtn)\
                                              {\
                                                TmpBtn = 0x08;\
                                              }\
                                              for (Tmp = 0; Tmp < NOS_OF_AVR_BTNS; Tmp++)\
                                              {\
                                                if ((TmpBtn) & BtnPtr)\
                                                {\
                                                  *pB |= BtnPtr;\
                                                  PrellCnt[Tmp]  = PRELL_TIME;\
                                                }\
                                                else\
                                                {\
                                                  /* btn not pressed */\
                                                  if (0 != PrellCnt[Tmp])\
                                                  {\
                                                    PrellCnt[Tmp]--;\
                                                  }\
                                                  else\
                                                  {\
                                                    *pB &= ~BtnPtr;\
                                                  }\
                                                }\
                                                BtnPtr <<= 1;\
                                              }\
                                              OldState = *pB;\
                                            }\
                                          }\
                                        }
#endif

#define   BUTTONExit

#endif

#ifdef    PCWIN

#endif