Пример #1
0
/***************************************************************************//*!
*
* @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;
}
Пример #2
0
   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 */ 
   }