觸控設備手勢喚醒的設計思路及其實現(xiàn)
// example interrupt function where this might be implemented
__interrupt void TimedInterrupt( void )
{
uint8 proximity_counts;
uint8 filtered_counts;
....
....
if ( device_status == SLEEP_MODE )
{
// read one byte from register 0x16
proximity_counts = read_i2c_register(MAX44000_ADDR,0x16,1);
// weights[QUEUE_SIZE] contains the filter weights for the FIR filter
// data_queue[QUEUE_SIZE] is a FIFO queue meant to be the input to the filter
filtered_counts = fir_filter(proximity_counts,weights,data_queue);
if (filtered_counts 》 WAKEUP_THRESHOLD)
{
device_status = WAKE_MODE;
...
}
else
{
// do whatever it is you need to in sleep mode
...
...
}
}
...
...
}
/**
* fir_filter()
*
* Implements an FIR filter in the form
* y = w[0]*x[0] + w[1]*x[1] + 。。.+ w[QUEUE_SIZE]*x[QUEUE_SIZE]
*
* Arguments:
* uint8 input - newest datapoint taken (that is, x[0])
* uint8 *weights - w[0]。。.w[QUEUE_SIZE]
* uint8 *queue - the discrete sequence x[0]。。.x[QUEUE_SIZE]
*
* Returns:
* The FIR-filtered output, y
*/
uint8 fir_filter(uint8 input, uint8 *weights, uint8 *queue)
{
uint8 i;
int sum = 0;
// pop first entry in the queue, then
// push new data into the last position
push_into_queue(queue,input);
// input is now x[0]
for (i=0; i {
sum += weights[i]*queue[i];
}
return (sum/QUEUE_SIZE);
}
評論