/***************************************************************************//*! * * @brief Initializes the modules for the sensing of the electrodes * * @param Nothing * * @return Status Code * * @remarks * ****************************************************************************/ uint8_t TSS_SensorInit(uint8_t u8Command) { uint8_t u8result = TSS_INIT_STATUS_OK; if ((u8Command == TSS_INIT_COMMAND_INIT_MODULES) || (u8Command == TSS_INIT_COMMAND_ENABLE_ELECTRODES) || (u8Command == TSS_INIT_COMMAND_RECALIBRATE)) { /* Global Timer Initialization */ #if TSS_HW_TIMER_USED TSS_HW_TIMER_STOP(); /* Stops the timer */ TSS_HW_TIMER_RESET(); /* Resets the timer */ #ifdef TSS_ONPROXIMITY_CALLBACK if (tss_CSSys.SystemConfig.ProximityEn) { TSS_HW_TIMER_SET_PRESCALE(TSS_SENSOR_PROX_PRESCALER); /* Sets a preescaler value */ TSS_HW_TIMER_SET_MOD(TSS_SENSOR_PROX_TIMEOUT); /* Sets the timeout value */ } else { TSS_HW_TIMER_SET_PRESCALE(TSS_SENSOR_PRESCALER); /* Sets a preescaler value */ TSS_HW_TIMER_SET_MOD(TSS_SENSOR_TIMEOUT); /* Sets the timeout value */ } #else TSS_HW_TIMER_SET_PRESCALE(TSS_SENSOR_PRESCALER); /* Sets a preescaler value */ TSS_HW_TIMER_SET_MOD(TSS_SENSOR_TIMEOUT); /* Sets the timeout value */ #endif TSS_HW_TIMER_ENABLE_INT(); /* Enable Timer interrupt */ #endif /* GPIO Method Initialization */ #if TSS_DETECT_METHOD(GPIO) (void) GPIO_SensorInit(); #endif } /* TSIL Initialization */ #if TSS_DETECT_METHOD(TSIL) u8result = TSIL_SensorInit(u8Command); #endif return u8result; }
UINT8 UNI_SampleElectrode(UINT8 u8ElecNum, UINT8 u8Command) { UINT8 u8NSamp; UINT8 u8ElectrodeStatus; UINT16 u16CapSubSample; UINT8 u8FaultCnt; #if TSS_USE_NOISE_AMPLITUDE_FILTER INT8 i8AmplitudeFilterDeltaLimitTemp; UINT16 *pu16AmplitudeFilterBaseTemp; #endif if (u8Command == TSS_SAMPLE_COMMAND_RESTART) { u8ElectrodeStatus = TSS_SAMPLE_STATUS_PROCESSING; } else if (u8Command == TSS_SAMPLE_COMMAND_PROCESS) { /* Initialization of variables */ tss_u8HWTimerFlag = 0u; tss_u16CapSample = 0u; u8ElectrodeStatus = TSS_SAMPLE_STATUS_OK; /* Sets status */ u8FaultCnt = 0u; u8NSamp = tss_CSSys.NSamples; #if TSS_USE_NOISE_AMPLITUDE_FILTER pu16AmplitudeFilterBaseTemp = &(((TSS_GENERIC_ELECTRODE_RAMDATA *) (tss_acp8ElectrodeRAMData[u8ElecNum]))->gen_u16AmplitudeFilterBase); if (*pu16AmplitudeFilterBaseTemp == 0u) { i8AmplitudeFilterDeltaLimitTemp = 127; } else { i8AmplitudeFilterDeltaLimitTemp = ((TSS_GENERIC_ELECTRODE_ROMDATA *) (tss_acp8ElectrodeROMData[u8ElecNum]))->gen_ci8AmplitudeFilterDeltaLimit; } #endif /* Main oversampling measurement loop */ while(u8NSamp) { #if TSS_HW_TIMER_USED TSS_HW_TIMER_STOP(); /* Stops the HW Timer */ TSS_HW_TIMER_RESET(); /* Resets the HW Timer */ #endif TSS_CLEAR_SAMPLE_INTERRUPTED_FLAG(); /* Clears the interrupt sample flag */ u16CapSubSample = tss_faSampleElectrodeLow[u8ElecNum](); /* Samples one electrode */ if(!TSS_FAULT_DETECTED) /* Verifies that no fault has occurred */ { if(!TSS_SAMPLE_INTERRUPTED) /* Verifies that the sample has not been inturrupted*/ { #if TSS_USE_NOISE_AMPLITUDE_FILTER if (TSS_u16NoiseAmplitudeFilter(u16CapSubSample, pu16AmplitudeFilterBaseTemp, i8AmplitudeFilterDeltaLimitTemp)) { u8FaultCnt++; } else { tss_u16CapSample += u16CapSubSample; u8NSamp--; u8FaultCnt = 0u; /* Restart Fault counter due long cyclic interrupts */ } #else tss_u16CapSample += u16CapSubSample; u8NSamp--; u8FaultCnt = 0u; /* Restart Fault counter due long cyclic interrupts */ #endif } else { /* Do nothing if interrupt occured and do sample again in next loop*/ u8FaultCnt++; } } else { TSS_SET_ELECTRODE_OUTPUT_LOW(); /* Sets the electrode to OUTPUT LOW default value bacause short was detected there */ u8ElectrodeStatus = TSS_SAMPLE_ERROR_CHARGE_TIMEOUT; /* If a fault has occurred sets the return status code error */ u8NSamp = 0u; } if(u8FaultCnt >= TSS_FAULT_TIMEOUT) { u8ElectrodeStatus = TSS_SAMPLE_ERROR_CHARGE_TIMEOUT; /* If a fault has occurred sets the return status code error */ u8NSamp = 0u; } } if ((tss_u16CapSample < TSS_KEYDETECT_CAP_LOWER_LIMIT) && (u8ElectrodeStatus != TSS_SAMPLE_ERROR_CHARGE_TIMEOUT)) { u8ElectrodeStatus = TSS_SAMPLE_ERROR_SMALL_CAP; } #if TSS_USE_NOISE_AMPLITUDE_FILTER if (u8ElectrodeStatus == TSS_SAMPLE_STATUS_OK) { if (*pu16AmplitudeFilterBaseTemp == 0u) { *pu16AmplitudeFilterBaseTemp = (UINT16) (tss_u16CapSample / tss_CSSys.NSamples); } } else { *pu16AmplitudeFilterBaseTemp = 0u; /* Initiate Amplitude Filter Base refresh */ } #endif } else if (u8Command == TSS_SAMPLE_COMMAND_GET_NEXT_ELECTRODE) { /* Return the same electrode number because there is no more electrodes in the module */ u8ElectrodeStatus = u8ElecNum; } else if (u8Command == TSS_SAMPLE_COMMAND_RECALIB) { /* Do Nothing because the Command is no relevant for GPIO Method */ u8ElectrodeStatus = TSS_SAMPLE_STATUS_OK; } return u8ElectrodeStatus; /* Return status code */ }