diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2014-09-23 17:24:57 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2014-09-30 15:15:01 +0200 |
commit | 6708da2661d693f855b6f56d69af1e2fb8502463 (patch) | |
tree | 5b8eac0f6f40932417519cbdcd229caeabd8eee8 /accel.c | |
parent | 69cb10f51321a2443a3314c40fb2b8556aa804c0 (diff) | |
download | hourglass-6708da2661d693f855b6f56d69af1e2fb8502463.tar.gz hourglass-6708da2661d693f855b6f56d69af1e2fb8502463.tar.bz2 hourglass-6708da2661d693f855b6f56d69af1e2fb8502463.zip |
Add wakeup source mechanism
Should reduce amount of cpu wakeups with expensive computations.
Diffstat (limited to 'accel.c')
-rw-r--r-- | accel.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -51,7 +51,13 @@ static bool reading = false; /* data ready interrupt */ ISR(PCINT1_vect) { - /* empty */ + const bool interrupt = (PINC >> PINC1) & 0x1; + /* low-active */ + if (!interrupt) { + enableWakeup (WAKE_ACCEL); + } else { + disableWakeup (WAKE_ACCEL); + } } void accelInit () { @@ -79,6 +85,7 @@ void accelStart () { } sleepwhile (twr.status == TWST_WAIT); puts ("accelStart done"); + disableWakeup (WAKE_I2C); } /* register shake gesture @@ -154,25 +161,26 @@ static void accelProcessHorizon () { } bool accelProcess () { - if (reading) { + if (reading && shouldWakeup (WAKE_I2C)) { + disableWakeup (WAKE_I2C); + reading = false; if (twr.status == TWST_OK) { accelProcessHorizon (); accelProcessShake (); /* new data transfered */ - reading = false; return true; } else if (twr.status == TWST_ERR) { puts ("accel i2c error: "); fwrite ((void *) &twr.error, sizeof (twr.error), 1, stdout); - reading = false; } } else { - if (!((PINC >> PINC1) & 0x1) && twr.status == TWST_OK) { + if (shouldWakeup (WAKE_ACCEL) && twr.status == TWST_OK) { /* new data available in device buffer and bus is free */ if (!twRequest (TWM_READ, LIS302DL, LIS302DL_OUTZ, (uint8_t *) &zval, sizeof (zval))) { puts ("cannot start read"); } else { + /* wakeup source is disabled by isr to prevent race condition */ reading = true; } } |