Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00058 #include "mTouch.h"
00059
00060 #if defined(MTOUCH_PROXIMITY_ENABLED)
00061 typedef struct
00062 {
00063 uint8_t currentTime;
00064 uint16_t deviation;
00065
00066 uint16_t sortBuffer [MTOUCH_PROX_BUFFER_SIZE];
00067 uint8_t timeIndex [MTOUCH_PROX_BUFFER_SIZE];
00068 } mTouch_Prox_Variables;
00069
00070
00071
00072
00073 mTouch_Prox_Variables mTouch_proxVariables[MTOUCH_NUMBER_PROXIMITY];
00074
00075
00076 void mTouch_ProxInit (void);
00077 void mTouch_ProxUpdateBaseline (void);
00078 uint8_t mTouch_ProxStateMachine (void);
00079
00080
00081 #if MTOUCH_NUMBER_PROXIMITY > 1
00082 const uint8_t mTouch_proxIndex [MTOUCH_NUMBER_SENSORS] = MTOUCH_PROXINDEX_ARRAY_INIT;
00083 #endif
00084
00085 void mTouch_ProxInit(void)
00086 {
00087 #if MTOUCH_NUMBER_PROXIMITY > 1
00088 for (int8_t j = MTOUCH_NUMBER_PROXIMITY-1; j >= 0; j--)
00089 {
00090 #define MTOUCH_PROX_tempIndex j
00091 #else
00092 #define MTOUCH_PROX_tempIndex 0
00093 #endif
00094
00095 mTouch_proxVariables[MTOUCH_PROX_tempIndex].currentTime = 0;
00096 mTouch_proxVariables[MTOUCH_PROX_tempIndex].deviation = 0;
00097
00098 for (int8_t i = MTOUCH_PROX_BUFFER_SIZE-1; i >= 0; i--)
00099 {
00100 mTouch_proxVariables[MTOUCH_PROX_tempIndex].sortBuffer[i] = 0;
00101 mTouch_proxVariables[MTOUCH_PROX_tempIndex].timeIndex[i] = i;
00102 }
00103
00104 #if MTOUCH_NUMBER_PROXIMITY > 1
00105 }
00106 #endif
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 uint8_t mTouch_ProxStateMachine(void)
00121 {
00122
00123 #if MTOUCH_NUMBER_PROXIMITY == 1
00124
00125 #define MTOUCH_PROX_time mTouch_proxVariables[0].timeIndex
00126 #define MTOUCH_PROX_value mTouch_proxVariables[0].sortBuffer
00127 #define MTOUCH_PROX_currentTime mTouch_proxVariables[0].currentTime
00128 #define MTOUCH_PROX_deviation mTouch_proxVariables[0].deviation
00129 #define MTOUCH_PROX_state mTouch_stateVars.sensor[MTOUCH_CURRENTSCAN_VALUE].state
00130 #define MTOUCH_PROX_timer mTouch_stateVars.sensor[MTOUCH_CURRENTSCAN_VALUE].timer
00131 #define MTOUCH_PROX_debounce mTouch_stateVars.sensor[MTOUCH_CURRENTSCAN_VALUE].debounce
00132 #define MTOUCH_PROX_timeout mTouch_stateVars.sensor[MTOUCH_CURRENTSCAN_VALUE].timeout
00133
00134 #else
00135
00136 #define MTOUCH_PROX_time (*prox).timeIndex
00137 #define MTOUCH_PROX_value (*prox).sortBuffer
00138 #define MTOUCH_PROX_currentTime (*prox).currentTime
00139 #define MTOUCH_PROX_deviation (*prox).deviation
00140 #define MTOUCH_PROX_state (*sensor).state
00141 #define MTOUCH_PROX_timer (*sensor).timer
00142 #define MTOUCH_PROX_debounce (*sensor).debounce
00143 #define MTOUCH_PROX_timeout (*sensor).timeout
00144
00145 mTouch_Prox_Variables* prox = &mTouch_proxVariables[mTouch_proxIndex[MTOUCH_CURRENTSCAN_VALUE]];
00146 mTouch_SensorVariables* sensor = &mTouch_stateVars.sensor[MTOUCH_CURRENTSCAN_VALUE];
00147
00148 #endif
00149
00150 #if defined(MTOUCH_PROX_USE_32BIT_ACCUM)
00151 uint32_t mean = 0;
00152 #else
00153 uint16_t mean = 0;
00154 #endif
00155
00156
00157 do
00158 {
00159 uint16_t newValue = mTouch_GetSensor(MTOUCH_CURRENTSCAN_VALUE);
00160 uint8_t newTime = MTOUCH_PROX_currentTime;
00161 uint8_t i = 0;
00162
00163 while (MTOUCH_PROX_time[i] != MTOUCH_PROX_currentTime)
00164 {
00165 if (MTOUCH_PROX_value[i] > newValue)
00166 {
00167 uint16_t tempValue = MTOUCH_PROX_value[i];
00168 uint8_t tempTime = MTOUCH_PROX_time[i];
00169
00170 MTOUCH_PROX_value[i] = newValue;
00171 MTOUCH_PROX_time [i] = newTime;
00172
00173 newValue = tempValue;
00174 newTime = tempTime;
00175 }
00176 i++;
00177 }
00178
00179 MTOUCH_PROX_value[i] = newValue;
00180 MTOUCH_PROX_time[i] = newTime;
00181
00182 for (i++; i < MTOUCH_PROX_BUFFER_SIZE; i++)
00183 {
00184 if (newValue > MTOUCH_PROX_value[i])
00185 {
00186 MTOUCH_PROX_value[i-1] = MTOUCH_PROX_value[i];
00187 MTOUCH_PROX_time [i-1] = MTOUCH_PROX_time[i];
00188
00189 MTOUCH_PROX_value[i] = newValue;
00190 MTOUCH_PROX_time[i] = newTime;
00191 }
00192 else break;
00193 }
00194
00195 if (++MTOUCH_PROX_currentTime >= MTOUCH_PROX_BUFFER_SIZE)
00196 {
00197 MTOUCH_PROX_currentTime = 0;
00198 }
00199
00200 } while(0);
00201
00202
00203 do
00204 {
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 #if (MTOUCH_PROX_BUFFER_SIZE == 15)
00218 #if (MTOUCH_PROX_REMOVE_EXTREME == 1)
00219 #define MTOUCH_MEAN_SCALE 13
00220 #elif (MTOUCH_PROX_REMOVE_EXTREME == 2)
00221 #define MTOUCH_MEAN_SCALE 11
00222 #elif (MTOUCH_PROX_REMOVE_EXTREME == 3)
00223 #define MTOUCH_MEAN_SCALE 9
00224 #elif (MTOUCH_PROX_REMOVE_EXTREME == 4)
00225 #define MTOUCH_MEAN_SCALE 7
00226 #elif (MTOUCH_PROX_REMOVE_EXTREME == 5)
00227 #define MTOUCH_MEAN_SCALE 5
00228 #elif (MTOUCH_PROX_REMOVE_EXTREME == 6)
00229 #define MTOUCH_MEAN_SCALE 3
00230 #elif (MTOUCH_PROX_REMOVE_EXTREME == 7)
00231 #define MTOUCH_MEAN_SCALE 1
00232 #endif
00233 #elif (MTOUCH_PROX_BUFFER_SIZE == 9)
00234 #if (MTOUCH_PROX_REMOVE_EXTREME == 1)
00235 #define MTOUCH_MEAN_SCALE 7
00236 #elif (MTOUCH_PROX_REMOVE_EXTREME == 2)
00237 #define MTOUCH_MEAN_SCALE 5
00238 #elif (MTOUCH_PROX_REMOVE_EXTREME == 3)
00239 #define MTOUCH_MEAN_SCALE 3
00240 #elif (MTOUCH_PROX_REMOVE_EXTREME == 4)
00241 #define MTOUCH_MEAN_SCALE 1
00242 #endif
00243 #elif (MTOUCH_PROX_BUFFER_SIZE == 5)
00244 #if (MTOUCH_PROX_REMOVE_EXTREME == 1)
00245 #define MTOUCH_MEAN_SCALE 3
00246 #elif (MTOUCH_PROX_REMOVE_EXTREME == 2)
00247 #define MTOUCH_MEAN_SCALE 1
00248 #endif
00249 #endif
00250
00251 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 2)) || \
00252 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 2)) || \
00253 ((MTOUCH_PROX_BUFFER_SIZE == 5) && (MTOUCH_PROX_REMOVE_EXTREME < 2))
00254 mean += MTOUCH_PROX_value[1];
00255 #endif
00256 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 3)) || \
00257 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 3)) || \
00258 (MTOUCH_PROX_BUFFER_SIZE == 5)
00259 mean += MTOUCH_PROX_value[2];
00260 #endif
00261 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 4)) || \
00262 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 4)) || \
00263 ((MTOUCH_PROX_BUFFER_SIZE == 5) && (MTOUCH_PROX_REMOVE_EXTREME < 2))
00264 mean += MTOUCH_PROX_value[3];
00265 #endif
00266 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 5)) || \
00267 (MTOUCH_PROX_BUFFER_SIZE == 9)
00268 mean += MTOUCH_PROX_value[4];
00269 #endif
00270 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 6)) || \
00271 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 4))
00272 mean += MTOUCH_PROX_value[5];
00273 #endif
00274 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 7)) || \
00275 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 3))
00276 mean += MTOUCH_PROX_value[6];
00277 #endif
00278 #if (MTOUCH_PROX_BUFFER_SIZE == 15) || \
00279 ((MTOUCH_PROX_BUFFER_SIZE == 9) && (MTOUCH_PROX_REMOVE_EXTREME < 2))
00280 mean += MTOUCH_PROX_value[7];
00281 #endif
00282 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 7))
00283 mean += MTOUCH_PROX_value[8];
00284 #endif
00285 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 6))
00286 mean += MTOUCH_PROX_value[9];
00287 #endif
00288 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 5))
00289 mean += MTOUCH_PROX_value[10];
00290 #endif
00291 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 4))
00292 mean += MTOUCH_PROX_value[11];
00293 #endif
00294 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 3))
00295 mean += MTOUCH_PROX_value[12];
00296 #endif
00297 #if ((MTOUCH_PROX_BUFFER_SIZE == 15) && (MTOUCH_PROX_REMOVE_EXTREME < 2))
00298 mean += MTOUCH_PROX_value[13];
00299 #endif
00300
00301
00302
00303
00304
00305
00306
00307 do
00308 {
00309 #if defined(MTOUCH_PROX_USE_32BIT_ACCUM)
00310 uint32_t tempCopy = 0;
00311 #else
00312 uint16_t tempCopy = 0;
00313 #endif
00314 #if (MTOUCH_MEAN_SCALE == 13) // Actual Divisor for this snippet: 12.96
00315 mean >>= 4;
00316 tempCopy += mean;
00317 mean >>= 3;
00318 tempCopy += mean;
00319 mean >>= 1;
00320 tempCopy += mean;
00321 mean >>= 1;
00322 tempCopy += mean;
00323 mean >>= 1;
00324 mean += tempCopy;
00325 #elif (MTOUCH_MEAN_SCALE == 11) // Actual Divisor for this snippet: 11.01
00326 mean >>= 4;
00327 tempCopy += mean;
00328 mean >>= 2;
00329 tempCopy += mean;
00330 mean >>= 1;
00331 tempCopy += mean;
00332 mean >>= 1;
00333 tempCopy += mean;
00334 mean >>= 2;
00335 mean += tempCopy;
00336 #elif (MTOUCH_MEAN_SCALE == 9) // Actual Divisor for this snippet: 8.98
00337 mean >>= 4;
00338 tempCopy += mean;
00339 mean >>= 1;
00340 tempCopy += mean;
00341 mean >>= 1;
00342 tempCopy += mean;
00343 mean >>= 3;
00344 mean += tempCopy;
00345 #elif (MTOUCH_MEAN_SCALE == 7) // Actual Divisor for this snippet: 7.01
00346 mean >>= 3;
00347 tempCopy += mean;
00348 mean >>= 3;
00349 tempCopy += mean;
00350 mean >>= 3;
00351 mean += tempCopy;
00352 #elif (MTOUCH_MEAN_SCALE == 5) // Actual Divisor for this snippet: 4.995
00353 mean >>= 3;
00354 tempCopy += mean;
00355 mean >>= 1;
00356 tempCopy += mean;
00357 mean >>= 3;
00358 tempCopy += mean;
00359 mean >>= 1;
00360 tempCopy += mean;
00361 mean >>= 2;
00362 mean += tempCopy;
00363 #elif (MTOUCH_MEAN_SCALE == 3) // Actual Divisor for this snippet: 3.003
00364 mean >>= 2;
00365 tempCopy += mean;
00366 mean >>= 2;
00367 tempCopy += mean;
00368 mean >>= 2;
00369 tempCopy += mean;
00370 mean >>= 2;
00371 tempCopy += mean;
00372 mean >>= 2;
00373 mean += tempCopy;
00374 #endif
00375 } while (0);
00376 } while (0);
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396 MTOUCH_PROX_deviation = mean - mTouch_GetAverage(MTOUCH_CURRENTSCAN_VALUE);
00397 if ((int16_t)MTOUCH_PROX_deviation < 0)
00398 {
00399 MTOUCH_PROX_deviation = 0;
00400 }
00401
00402
00403 mTouch_sensorData[MTOUCH_CURRENTSCAN_VALUE] = mean;
00404
00405
00406
00407
00408
00409
00410 switch(MTOUCH_PROX_state)
00411 {
00412 case MTOUCH_PROX_INITIALIZING:
00413 if (--(MTOUCH_PROX_timer) <= 0)
00414 {
00415
00416
00417
00418
00419 MTOUCH_PROX_state = MTOUCH_PROX_NOT_ACTIVATED;
00420 #if defined(MTOUCH_STATE_DEBOUNCE) // Initialize sensor's debounce counter
00421 MTOUCH_PROX_debounce = MTOUCH_pDEBOUNCE_VALUE;
00422 #endif
00423
00424 MTOUCH_PROX_deviation = 0;
00425
00426 mTouch_average[MTOUCH_CURRENTSCAN_VALUE] = mean;
00427 }
00428 else
00429 {
00430 mTouch_state.areInitialized = 0;
00431
00432 #if MTOUCH_NUM_MODES > 1
00433 mTouch_state.allReleased = 0;
00434 #endif
00435 }
00436 return 0;
00437
00438 case MTOUCH_PROX_NOT_ACTIVATED:
00439
00440
00441 if(MTOUCH_PROX_deviation > (int16_t)mTouch_GetPressThreshold(MTOUCH_CURRENTSCAN_VALUE))
00442 {
00443 #if defined(MTOUCH_STATE_DEBOUNCE)
00444 if (MTOUCH_PROX_debounce == 0)
00445 {
00446 MTOUCH_PROX_debounce = MTOUCH_rDEBOUNCE_VALUE;
00447 #endif
00448
00449
00450
00451
00452 MTOUCH_PROX_state = MTOUCH_PROX_ACTIVATED;
00453
00454 #if defined(MTOUCH_BUTTON_TIMEOUT) // If the press timer is enabled
00455 #if MTOUCH_BUTTON_TIMEOUT > 0
00456 MTOUCH_PROX_timer = MTOUCH_pTIMEOUT_VALUE;
00457 #endif // NOTE: This delay determined by
00458 #endif // MTOUCH_BUTTON_TIMEOUT
00459
00460 #if MTOUCH_NUM_MODES > 1
00461 mTouch_state.allReleased = 0;
00462 #endif
00463
00464 mTouch_state.buttonStateChange = 1;
00465
00466
00467 #if defined(MTOUCH_STATE_DEBOUNCE)
00468 }
00469 else
00470 {
00471 MTOUCH_PROX_debounce--;
00472 }
00473 #endif
00474 }
00475 else
00476 {
00477 #if defined(MTOUCH_STATE_DEBOUNCE)
00478 MTOUCH_PROX_debounce = MTOUCH_pDEBOUNCE_VALUE;
00479 #endif
00480
00481
00482
00483
00484
00485
00486 return 1;
00487 }
00488 return 0;
00489
00490 case MTOUCH_PROX_ACTIVATED:
00491 #if defined(MTOUCH_BUTTON_TIMEOUT) // (Only if the press timer has been enabled)
00492 #if MTOUCH_BUTTON_TIMEOUT > 0
00493
00494 if (--MTOUCH_PROX_timer <= 0)
00495 {
00496
00497
00498
00499 MTOUCH_PROX_state = MTOUCH_PROX_NOT_ACTIVATED;
00500 MTOUCH_PROX_timeout = 1;
00501
00502 mTouch_average[MTOUCH_CURRENTSCAN_VALUE] = mTouch_GetSensor(MTOUCH_CURRENTSCAN_VALUE);
00503
00504 #if defined(MTOUCH_STATE_DEBOUNCE)
00505 MTOUCH_PROX_debounce = MTOUCH_pDEBOUNCE_VALUE;
00506 #endif // and check if it has reached 0.
00507
00508 mTouch_state.buttonStateChange = 1;
00509
00510 break;
00511 }
00512
00513 #endif
00514 #endif
00515
00516
00517 if(MTOUCH_PROX_deviation < (int16_t)mTouch_GetReleaseThreshold(MTOUCH_CURRENTSCAN_VALUE))
00518 {
00519
00520 #if defined(MTOUCH_STATE_DEBOUNCE)
00521 if (MTOUCH_PROX_debounce == 0)
00522 {
00523 MTOUCH_PROX_debounce = MTOUCH_pDEBOUNCE_VALUE;
00524 #endif
00525
00526
00527
00528
00529 MTOUCH_PROX_state = MTOUCH_PROX_NOT_ACTIVATED;
00530
00531 mTouch_state.buttonStateChange = 1;
00532
00533
00534 #if defined(MTOUCH_STATE_DEBOUNCE)
00535 } else {
00536
00537 MTOUCH_PROX_debounce--;
00538
00539 #if MTOUCH_NUM_MODES > 1
00540 mTouch_state.allReleased = 0;
00541 #endif
00542
00543 }
00544 #endif
00545
00546 }
00547 else
00548 {
00549
00550 #if defined(MTOUCH_STATE_DEBOUNCE)
00551 MTOUCH_PROX_debounce = MTOUCH_rDEBOUNCE_VALUE;
00552 #endif
00553 #if MTOUCH_NUM_MODES > 1
00554 mTouch_state.allReleased = 0;
00555 #endif
00556
00557 }
00558 return 0;
00559 }
00560 return 0;
00561 }
00562
00563
00564 #endif