* re-boot every time we fiddle with the power supply -- this trick
* allows us to "continue" measureing.
*/
- command error_t startMeasurement(uint32_t delay, uint32_t duration);
+ command error_t start(uint32_t delay, uint32_t duration);
/** Stop a measurement, returns FAIL if there is no ongoing measurement */
- command error_t stopMeasurement();
+ command error_t stop();
/** notification: a fixed portion of energy has been consumed */
async event void portionConsumed();
+
+ /** notification that the measurement will be soon over */
+ event void soonOver();
}
}
}
implementation {
-#define MIN_DELAY 30
+#define MIN_DELAY 60
uint16_t timerHighBits = 0;
uint32_t dur = 0;
-
+ bool warned = FALSE;
+
void resetBoard() {
call ResetBoard.set();
__asm__("NOP");
}
}
- command error_t CoulombCounter.startMeasurement(uint32_t delay, uint32_t duration) {
+ command error_t CoulombCounter.start(uint32_t delay, uint32_t duration) {
error_t result = SUCCESS;
timerHighBits = duration >> 22;
dur = duration * (uint32_t)1024;
-
+ warned = FALSE;
if(call CoulombCounter.isMeasureing()) {
startLongTimer();
call EnergyInterrupt.enableFallingEdge();
}
/** Stop a measurement, returns FAIL if there is no ongoing measurement */
- command error_t CoulombCounter.stopMeasurement() {
+ command error_t CoulombCounter.stop() {
error_t result = FAIL;
call Timer.stop();
timerHighBits = 0;
startLongTimer();
}
else {
- // measurement finished
- call CoulombCounter.stopMeasurement();
+ if(warned == TRUE) {
+ call CoulombCounter.stop();
+ }
+ else {
+ signal CoulombCounter.soonOver();
+ call Timer.startOneShot((uint32_t)MIN_DELAY*1024);
+ warned = TRUE;
+ }
}
}
else {