/**************************************************************************//** * @brief Initializes the capacative touch system with LESENSE. * * @param[in] sensitivity * An array of floats, indication of threshold level, in percent, * of nominal count value. * *****************************************************************************/ void LETOUCH_Init(float sensitivity[]){ uint8_t i; channels_used_mask = 0; num_channels_used = 0; /* Initialize channels used mask and threshold array for each channel */ /* Uses the sensitivity array to deduce which channels to enable and how */ /* many channels that are enabled */ for(i = 0; i < NUM_LESENSE_CHANNELS; i++){ /* Init min and max values for each channel */ channel_max_value[i] = 0; channel_min_value[i] = 0xffff; /* Add to channels used mask if sensitivity is not zero */ if(sensitivity[i] != 0.0){ channel_threshold_percent[i] = sensitivity[i]; channels_used_mask |= (1 << i); num_channels_used++; } } /* Disable interrupts while initializing */ INT_Disable(); /* Setup CMU. */ LETOUCH_setupCMU(); /* Setup GPIO. */ LETOUCH_setupGPIO(); /* Setup ACMP. */ LETOUCH_setupACMP(); /* Setup LESENSE. */ LETOUCH_setupLESENSE(); /* Do initial calibration "N_calibration_values * 10" times to make sure */ /* it settles on values after potential startup transients */ for(i = 0; i < NUMBER_OF_CALIBRATION_VALUES * 10; i++){ LESENSE_ScanStart(); LETOUCH_Calibration(); } /* Setup RTC for calibration interrupt */ LETOUCH_setupRTC(); /* Initialization done, enable interrupts globally. */ INT_Enable(); }
/***************************************************************************//** * @brief * Set scan mode of the LESENSE channels. * * @details * This function configures how the scan start is being triggered. It can be * used for re-configuring the scan mode while running the application but it * is also used by LESENSE_Init() for initialization. * * @note * Users can configure the scan mode by LESENSE_Init() function, but only with * a significant overhead. This simple function serves the purpose of * controlling this parameter after the channel has been configured. * Please be aware the effects of the non-atomic Read-Modify-Write cycle! * * @param[in] scanMode * Select where to map LESENSE alternate excitation channels. * @li lesenseScanStartPeriodic - New scan is started each time the period * counter overflows. * @li lesenseScanStartOneShot - Single scan is performed when * LESENSE_ScanStart() is called. * @li lesenseScanStartPRS - New scan is triggered by pulse on PRS channel. * * @param[in] start * If true, LESENSE_ScanStart() is immediately issued after configuration. ******************************************************************************/ void LESENSE_ScanModeSet(LESENSE_ScanMode_TypeDef const scanMode, bool const start) { uint32_t tmp; /* temporary storage of the CTRL register value */ /* Save the CTRL register value to tmp. * Please be aware the effects of the non-atomic Read-Modify-Write cycle! */ tmp = LESENSE->CTRL & ~(_LESENSE_CTRL_SCANMODE_MASK); /* Setting the requested scanMode to the CTRL register. Casting signed int * (enum) to unsigned long (uint32_t). */ tmp |= (uint32_t)scanMode; /* Write the new value to the CTRL register. */ LESENSE->CTRL = tmp; /* Start sensor scanning if requested. */ if (start) { LESENSE_ScanStart(); } }