From c1d5513578a809a2a2d8e68471964190d4d81073 Mon Sep 17 00:00:00 2001 From: Henrik Ekblad Date: Thu, 12 Mar 2015 23:59:36 +0100 Subject: [PATCH] Remove LowPower dependency --- libraries/MySensors/MyHwATMega328.cpp | 70 +- libraries/MySensors/MyHwATMega328.h | 18 +- libraries/MySensors/utility/LowPower.cpp | 856 ----------------------- libraries/MySensors/utility/LowPower.h | 137 ---- 4 files changed, 73 insertions(+), 1008 deletions(-) delete mode 100644 libraries/MySensors/utility/LowPower.cpp delete mode 100644 libraries/MySensors/utility/LowPower.h diff --git a/libraries/MySensors/MyHwATMega328.cpp b/libraries/MySensors/MyHwATMega328.cpp index 3f42fc9..e5710cc 100644 --- a/libraries/MySensors/MyHwATMega328.cpp +++ b/libraries/MySensors/MyHwATMega328.cpp @@ -34,26 +34,69 @@ unsigned long MyHwATMega328::millisec() { } + +#define bodOn(mode) \ +do { \ + set_sleep_mode(mode); \ + cli(); \ + sleep_enable(); \ + sei(); \ + sleep_cpu(); \ + sleep_disable(); \ + sei(); \ +} while (0); + +#if defined __AVR_ATmega328P__ +#define bodOff(mode)\ +do { \ + set_sleep_mode(mode); \ + cli(); \ + sleep_enable(); \ + sleep_bod_disable(); \ + sei(); \ + sleep_cpu(); \ + sleep_disable(); \ + sei(); \ +} while (0); +#endif + +void powerDown(period_t period) { + + ADCSRA &= ~(1 << ADEN); + + if (period != SLEEP_FOREVER) + { + wdt_enable(period); + WDTCSR |= (1 << WDIE); + } + #if defined __AVR_ATmega328P__ + bodOff(SLEEP_MODE_PWR_DOWN); + #else + bodOn(SLEEP_MODE_PWR_DOWN); + #endif + + ADCSRA |= (1 << ADEN); +} + void MyHwATMega328::sleep(unsigned long ms) { // Let serial prints finish (debug, log etc) Serial.flush(); pinIntTrigger = 0; - while (!pinIntTrigger && ms >= 8000) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); ms -= 8000; } - if (!pinIntTrigger && ms >= 4000) { LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); ms -= 4000; } - if (!pinIntTrigger && ms >= 2000) { LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF); ms -= 2000; } - if (!pinIntTrigger && ms >= 1000) { LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); ms -= 1000; } - if (!pinIntTrigger && ms >= 500) { LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); ms -= 500; } - if (!pinIntTrigger && ms >= 250) { LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); ms -= 250; } - if (!pinIntTrigger && ms >= 125) { LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF); ms -= 120; } - if (!pinIntTrigger && ms >= 64) { LowPower.powerDown(SLEEP_60MS, ADC_OFF, BOD_OFF); ms -= 60; } - if (!pinIntTrigger && ms >= 32) { LowPower.powerDown(SLEEP_30MS, ADC_OFF, BOD_OFF); ms -= 30; } - if (!pinIntTrigger && ms >= 16) { LowPower.powerDown(SLEEP_15Ms, ADC_OFF, BOD_OFF); ms -= 15; } + while (!pinIntTrigger && ms >= 8000) { powerDown(SLEEP_8S); ms -= 8000; } + if (!pinIntTrigger && ms >= 4000) { powerDown(SLEEP_4S); ms -= 4000; } + if (!pinIntTrigger && ms >= 2000) { powerDown(SLEEP_2S); ms -= 2000; } + if (!pinIntTrigger && ms >= 1000) { powerDown(SLEEP_1S); ms -= 1000; } + if (!pinIntTrigger && ms >= 500) { powerDown(SLEEP_500MS); ms -= 500; } + if (!pinIntTrigger && ms >= 250) { powerDown(SLEEP_250MS); ms -= 250; } + if (!pinIntTrigger && ms >= 125) { powerDown(SLEEP_120MS); ms -= 120; } + if (!pinIntTrigger && ms >= 64) { powerDown(SLEEP_60MS); ms -= 60; } + if (!pinIntTrigger && ms >= 32) { powerDown(SLEEP_30MS); ms -= 30; } + if (!pinIntTrigger && ms >= 16) { powerDown(SLEEP_15Ms); ms -= 15; } } bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { // Let serial prints finish (debug, log etc) bool pinTriggeredWakeup = true; - Serial.flush(); attachInterrupt(interrupt, wakeUp, mode); if (ms>0) { pinIntTrigger = 0; @@ -63,7 +106,7 @@ bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { } } else { Serial.flush(); - LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); + powerDown(SLEEP_FOREVER); } detachInterrupt(interrupt); return pinTriggeredWakeup; @@ -71,7 +114,6 @@ bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { uint8_t MyHwATMega328::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { int8_t retVal = 1; - Serial.flush(); // Let serial prints finish (debug, log etc) attachInterrupt(interrupt1, wakeUp, mode1); attachInterrupt(interrupt2, wakeUp2, mode2); if (ms>0) { @@ -82,7 +124,7 @@ uint8_t MyHwATMega328::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrup } } else { Serial.flush(); - LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); + powerDown(SLEEP_FOREVER); } detachInterrupt(interrupt1); detachInterrupt(interrupt2); diff --git a/libraries/MySensors/MyHwATMega328.h b/libraries/MySensors/MyHwATMega328.h index 90e6e82..bd197c7 100644 --- a/libraries/MySensors/MyHwATMega328.h +++ b/libraries/MySensors/MyHwATMega328.h @@ -5,8 +5,10 @@ #include "MyMessage.h" #include #include +#include +#include +#include #include -#include "utility/LowPower.h" #include "MyHw.h" @@ -15,6 +17,20 @@ #include #endif +enum period_t +{ + SLEEP_15Ms, + SLEEP_30MS, + SLEEP_60MS, + SLEEP_120MS, + SLEEP_250MS, + SLEEP_500MS, + SLEEP_1S, + SLEEP_2S, + SLEEP_4S, + SLEEP_8S, + SLEEP_FOREVER +}; class MyHwATMega328 : public MyHw { diff --git a/libraries/MySensors/utility/LowPower.cpp b/libraries/MySensors/utility/LowPower.cpp deleted file mode 100644 index a72cc31..0000000 --- a/libraries/MySensors/utility/LowPower.cpp +++ /dev/null @@ -1,856 +0,0 @@ -/******************************************************************************* -* LowPower Library -* Version: 1.30 -* Date: 22-05-2013 -* Company: Rocket Scream Electronics -* Website: www.rocketscream.com -* -* This is a lightweight low power library for Arduino. Please check our wiki -* (www.rocketscream.com/wiki) for more information on using this piece of -* library. -* -* This library is licensed under Creative Commons Attribution-ShareAlike 3.0 -* Unported License. -* -* Revision Description -* ======== =========== -* 1.30 Added support for ATMega168, ATMega2560, ATMega1280 & ATMega32U4. -* Tested to work with Arduino IDE 1.0.1 - 1.0.4. -* 1.20 Remove typo error in idle method for checking whether Timer 0 was -* turned off. -* Remove dependecy on WProgram.h which is not required. -* Tested to work with Arduino IDE 1.0. -* 1.10 Added #ifndef for sleep_bod_disable() for compatibility with future -* Arduino IDE release. -* 1.00 Initial public release. -*******************************************************************************/ -#include -#include -#include -#include -#include "LowPower.h" - -// Only Pico Power devices can change BOD settings through software -#if defined __AVR_ATmega328P__ -#ifndef sleep_bod_disable -#define sleep_bod_disable() \ -do { \ - unsigned char tempreg; \ - __asm__ __volatile__("in %[tempreg], %[mcucr]" "\n\t" \ - "ori %[tempreg], %[bods_bodse]" "\n\t" \ - "out %[mcucr], %[tempreg]" "\n\t" \ - "andi %[tempreg], %[not_bodse]" "\n\t" \ - "out %[mcucr], %[tempreg]" \ - : [tempreg] "=&d" (tempreg) \ - : [mcucr] "I" _SFR_IO_ADDR(MCUCR), \ - [bods_bodse] "i" (_BV(BODS) | _BV(BODSE)), \ - [not_bodse] "i" (~_BV(BODSE))); \ -} while (0) -#endif -#endif - -#define lowPowerBodOn(mode) \ -do { \ - set_sleep_mode(mode); \ - cli(); \ - sleep_enable(); \ - sei(); \ - sleep_cpu(); \ - sleep_disable(); \ - sei(); \ -} while (0); - -// Only Pico Power devices can change BOD settings through software -#if defined __AVR_ATmega328P__ -#define lowPowerBodOff(mode)\ -do { \ - set_sleep_mode(mode); \ - cli(); \ - sleep_enable(); \ - sleep_bod_disable(); \ - sei(); \ - sleep_cpu(); \ - sleep_disable(); \ - sei(); \ -} while (0); -#endif - -// Some macros is still missing from AVR GCC distribution for ATmega32U4 -#if defined __AVR_ATmega32U4__ - // Timer 4 PRR bit is currently not defined in iom32u4.h - #ifndef PRTIM4 - #define PRTIM4 4 - #endif - - // Timer 4 power reduction macro is not defined currently in power.h - #ifndef power_timer4_disable - #define power_timer4_disable() (PRR1 |= (uint8_t)(1 << PRTIM4)) - #endif - - #ifndef power_timer4_enable - #define power_timer4_enable() (PRR1 &= (uint8_t)~(1 << PRTIM4)) - #endif -#endif - -/******************************************************************************* -* Name: idle -* Description: Putting ATmega328P/168 into idle state. Please make sure you -* understand the implication and result of disabling module. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control: -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. timer2 Timer 2 module disable control: -* (a) TIMER2_OFF - Turn off Timer 2 module -* (b) TIMER2_ON - Leave Timer 2 module in its default state -* -* 4. timer1 Timer 1 module disable control: -* (a) TIMER1_OFF - Turn off Timer 1 module -* (b) TIMER1_ON - Leave Timer 1 module in its default state -* -* 5. timer0 Timer 0 module disable control: -* (a) TIMER0_OFF - Turn off Timer 0 module -* (b) TIMER0_ON - Leave Timer 0 module in its default state -* -* 6. spi SPI module disable control: -* (a) SPI_OFF - Turn off SPI module -* (b) SPI_ON - Leave SPI module in its default state -* -* 7. usart0 USART0 module disable control: -* (a) USART0_OFF - Turn off USART0 module -* (b) USART0_ON - Leave USART0 module in its default state -* -* 8. twi TWI module disable control: -* (a) TWI_OFF - Turn off TWI module -* (b) TWI_ON - Leave TWI module in its default state -* -*******************************************************************************/ -#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__) -void LowPowerClass::idle(period_t period, adc_t adc, timer2_t timer2, - timer1_t timer1, timer0_t timer0, - spi_t spi, usart0_t usart0, twi_t twi) -{ - // Temporary clock source variable - unsigned char clockSource = 0; - - if (timer2 == TIMER2_OFF) - { - if (TCCR2B & CS22) clockSource |= (1 << CS22); - if (TCCR2B & CS21) clockSource |= (1 << CS21); - if (TCCR2B & CS20) clockSource |= (1 << CS20); - - // Remove the clock source to shutdown Timer2 - TCCR2B &= ~(1 << CS22); - TCCR2B &= ~(1 << CS21); - TCCR2B &= ~(1 << CS20); - - power_timer2_disable(); - } - - if (adc == ADC_OFF) - { - ADCSRA &= ~(1 << ADEN); - power_adc_disable(); - } - - if (timer1 == TIMER1_OFF) power_timer1_disable(); - if (timer0 == TIMER0_OFF) power_timer0_disable(); - if (spi == SPI_OFF) power_spi_disable(); - if (usart0 == USART0_OFF) power_usart0_disable(); - if (twi == TWI_OFF) power_twi_disable(); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - lowPowerBodOn(SLEEP_MODE_IDLE); - - if (adc == ADC_OFF) - { - power_adc_enable(); - ADCSRA |= (1 << ADEN); - } - - if (timer2 == TIMER2_OFF) - { - if (clockSource & CS22) TCCR2B |= (1 << CS22); - if (clockSource & CS21) TCCR2B |= (1 << CS21); - if (clockSource & CS20) TCCR2B |= (1 << CS20); - - power_timer2_enable(); - } - - if (timer1 == TIMER1_OFF) power_timer1_enable(); - if (timer0 == TIMER0_OFF) power_timer0_enable(); - if (spi == SPI_OFF) power_spi_enable(); - if (usart0 == USART0_OFF) power_usart0_enable(); - if (twi == TWI_OFF) power_twi_enable(); -} -#endif - -/******************************************************************************* -* Name: idle -* Description: Putting ATmega32U4 into idle state. Please make sure you -* understand the implication and result of disabling module. -* Take note that Timer 2 is not available and USART0 -* is replaced with USART1 on ATmega32U4. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control: -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. timer4 Timer 4 module disable control: -* (a) TIMER4_OFF - Turn off Timer 4 module -* (b) TIMER4_ON - Leave Timer 4 module in its default state -* -* 4. timer3 Timer 3 module disable control: -* (a) TIMER3_OFF - Turn off Timer 3 module -* (b) TIMER3_ON - Leave Timer 3 module in its default state -* -* 5. timer1 Timer 1 module disable control: -* (a) TIMER1_OFF - Turn off Timer 1 module -* (b) TIMER1_ON - Leave Timer 1 module in its default state -* -* 6. timer0 Timer 0 module disable control: -* (a) TIMER0_OFF - Turn off Timer 0 module -* (b) TIMER0_ON - Leave Timer 0 module in its default state -* -* 7. spi SPI module disable control: -* (a) SPI_OFF - Turn off SPI module -* (b) SPI_ON - Leave SPI module in its default state -* -* 8. usart1 USART1 module disable control: -* (a) USART1_OFF - Turn off USART1 module -* (b) USART1_ON - Leave USART1 module in its default state -* -* 9. twi TWI module disable control: -* (a) TWI_OFF - Turn off TWI module -* (b) TWI_ON - Leave TWI module in its default state -* -* 10.usb USB module disable control: -* (a) USB_OFF - Turn off USB module -* (b) USB_ON - Leave USB module in its default state -*******************************************************************************/ -#if defined __AVR_ATmega32U4__ -void LowPowerClass::idle(period_t period, adc_t adc, - timer4_t timer4, timer3_t timer3, - timer1_t timer1, timer0_t timer0, - spi_t spi, usart1_t usart1, twi_t twi, usb_t usb) -{ - if (adc == ADC_OFF) - { - ADCSRA &= ~(1 << ADEN); - power_adc_disable(); - } - - if (timer4 == TIMER4_OFF) power_timer4_disable(); - if (timer3 == TIMER3_OFF) power_timer3_disable(); - if (timer1 == TIMER1_OFF) power_timer1_disable(); - if (timer0 == TIMER0_OFF) power_timer0_disable(); - if (spi == SPI_OFF) power_spi_disable(); - if (usart1 == USART1_OFF) power_usart1_disable(); - if (twi == TWI_OFF) power_twi_disable(); - if (usb == USB_OFF) power_usb_disable(); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - lowPowerBodOn(SLEEP_MODE_IDLE); - - if (adc == ADC_OFF) - { - power_adc_enable(); - ADCSRA |= (1 << ADEN); - } - - if (timer4 == TIMER4_OFF) power_timer4_enable(); - if (timer3 == TIMER3_OFF) power_timer3_enable(); - if (timer1 == TIMER1_OFF) power_timer1_enable(); - if (timer0 == TIMER0_OFF) power_timer0_enable(); - if (spi == SPI_OFF) power_spi_enable(); - if (usart1 == USART1_OFF) power_usart1_enable(); - if (twi == TWI_OFF) power_twi_enable(); - if (usb == USB_OFF) power_usb_enable(); -} -#endif - -/******************************************************************************* -* Name: idle -* Description: Putting ATmega2560 & ATmega1280 into idle state. Please make sure -* you understand the implication and result of disabling module. -* Take note that extra Timer 5, 4, 3 compared to an ATmega328P/168. -* Also take note that extra USART 3, 2, 1 compared to an -* ATmega328P/168. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control: -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. timer5 Timer 5 module disable control: -* (a) TIMER5_OFF - Turn off Timer 5 module -* (b) TIMER5_ON - Leave Timer 5 module in its default state -* -* 4. timer4 Timer 4 module disable control: -* (a) TIMER4_OFF - Turn off Timer 4 module -* (b) TIMER4_ON - Leave Timer 4 module in its default state -* -* 5. timer3 Timer 3 module disable control: -* (a) TIMER3_OFF - Turn off Timer 3 module -* (b) TIMER3_ON - Leave Timer 3 module in its default state -* -* 6. timer2 Timer 2 module disable control: -* (a) TIMER2_OFF - Turn off Timer 2 module -* (b) TIMER2_ON - Leave Timer 2 module in its default state -* -* 7. timer1 Timer 1 module disable control: -* (a) TIMER1_OFF - Turn off Timer 1 module -* (b) TIMER1_ON - Leave Timer 1 module in its default state -* -* 8. timer0 Timer 0 module disable control: -* (a) TIMER0_OFF - Turn off Timer 0 module -* (b) TIMER0_ON - Leave Timer 0 module in its default state -* -* 9. spi SPI module disable control: -* (a) SPI_OFF - Turn off SPI module -* (b) SPI_ON - Leave SPI module in its default state -* -* 10.usart3 USART3 module disable control: -* (a) USART3_OFF - Turn off USART3 module -* (b) USART3_ON - Leave USART3 module in its default state -* -* 11.usart2 USART2 module disable control: -* (a) USART2_OFF - Turn off USART2 module -* (b) USART2_ON - Leave USART2 module in its default state -* -* 12.usart1 USART1 module disable control: -* (a) USART1_OFF - Turn off USART1 module -* (b) USART1_ON - Leave USART1 module in its default state -* -* 13.usart0 USART0 module disable control: -* (a) USART0_OFF - Turn off USART0 module -* (b) USART0_ON - Leave USART0 module in its default state -* -* 14.twi TWI module disable control: -* (a) TWI_OFF - Turn off TWI module -* (b) TWI_ON - Leave TWI module in its default state -* -*******************************************************************************/ -#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) -void LowPowerClass::idle(period_t period, adc_t adc, timer5_t timer5, - timer4_t timer4, timer3_t timer3, timer2_t timer2, - timer1_t timer1, timer0_t timer0, spi_t spi, - usart3_t usart3, usart2_t usart2, usart1_t usart1, - usart0_t usart0, twi_t twi) -{ - // Temporary clock source variable - unsigned char clockSource = 0; - - if (timer2 == TIMER2_OFF) - { - if (TCCR2B & CS22) clockSource |= (1 << CS22); - if (TCCR2B & CS21) clockSource |= (1 << CS21); - if (TCCR2B & CS20) clockSource |= (1 << CS20); - - // Remove the clock source to shutdown Timer2 - TCCR2B &= ~(1 << CS22); - TCCR2B &= ~(1 << CS21); - TCCR2B &= ~(1 << CS20); - - power_timer2_disable(); - } - - if (adc == ADC_OFF) - { - ADCSRA &= ~(1 << ADEN); - power_adc_disable(); - } - - if (timer5 == TIMER5_OFF) power_timer5_disable(); - if (timer4 == TIMER4_OFF) power_timer4_disable(); - if (timer3 == TIMER3_OFF) power_timer3_disable(); - if (timer1 == TIMER1_OFF) power_timer1_disable(); - if (timer0 == TIMER0_OFF) power_timer0_disable(); - if (spi == SPI_OFF) power_spi_disable(); - if (usart3 == USART3_OFF) power_usart3_disable(); - if (usart2 == USART2_OFF) power_usart2_disable(); - if (usart1 == USART1_OFF) power_usart1_disable(); - if (usart0 == USART0_OFF) power_usart0_disable(); - if (twi == TWI_OFF) power_twi_disable(); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - lowPowerBodOn(SLEEP_MODE_IDLE); - - if (adc == ADC_OFF) - { - power_adc_enable(); - ADCSRA |= (1 << ADEN); - } - - if (timer2 == TIMER2_OFF) - { - if (clockSource & CS22) TCCR2B |= (1 << CS22); - if (clockSource & CS21) TCCR2B |= (1 << CS21); - if (clockSource & CS20) TCCR2B |= (1 << CS20); - - power_timer2_enable(); - } - - if (timer5 == TIMER5_OFF) power_timer5_enable(); - if (timer4 == TIMER4_OFF) power_timer4_enable(); - if (timer3 == TIMER3_OFF) power_timer3_enable(); - if (timer1 == TIMER1_OFF) power_timer1_enable(); - if (timer0 == TIMER0_OFF) power_timer0_enable(); - if (spi == SPI_OFF) power_spi_enable(); - if (usart3 == USART3_OFF) power_usart3_enable(); - if (usart2 == USART2_OFF) power_usart2_enable(); - if (usart1 == USART1_OFF) power_usart1_enable(); - if (usart0 == USART0_OFF) power_usart0_enable(); - if (twi == TWI_OFF) power_twi_enable(); -} -#endif - -/******************************************************************************* -* Name: adcNoiseReduction -* Description: Putting microcontroller into ADC noise reduction state. This is -* a very useful state when using the ADC to achieve best and low -* noise signal. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control. Turning off the ADC module is -* basically removing the purpose of this low power mode. -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. timer2 Timer 2 module disable control: -* (a) TIMER2_OFF - Turn off Timer 2 module -* (b) TIMER2_ON - Leave Timer 2 module in its default state -* -*******************************************************************************/ -void LowPowerClass::adcNoiseReduction(period_t period, adc_t adc, - timer2_t timer2) -{ - // Temporary clock source variable - unsigned char clockSource = 0; - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (TCCR2B & CS22) clockSource |= (1 << CS22); - if (TCCR2B & CS21) clockSource |= (1 << CS21); - if (TCCR2B & CS20) clockSource |= (1 << CS20); - - // Remove the clock source to shutdown Timer2 - TCCR2B &= ~(1 << CS22); - TCCR2B &= ~(1 << CS21); - TCCR2B &= ~(1 << CS20); - } - #endif - - if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - lowPowerBodOn(SLEEP_MODE_ADC); - - if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (clockSource & CS22) TCCR2B |= (1 << CS22); - if (clockSource & CS21) TCCR2B |= (1 << CS21); - if (clockSource & CS20) TCCR2B |= (1 << CS20); - - } - #endif -} - -/******************************************************************************* -* Name: powerDown -* Description: Putting microcontroller into power down state. This is -* the lowest current consumption state. Use this together with -* external pin interrupt to wake up through external event -* triggering (example: RTC clockout pin, SD card detect pin). -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control. Turning off the ADC module is -* basically removing the purpose of this low power mode. -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. bod Brown Out Detector (BOD) module disable control: -* (a) BOD_OFF - Turn off BOD module -* (b) BOD_ON - Leave BOD module in its default state -* -*******************************************************************************/ -void LowPowerClass::powerDown(period_t period, adc_t adc, bod_t bod) -{ - if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - if (bod == BOD_OFF) - { - #if defined __AVR_ATmega328P__ - lowPowerBodOff(SLEEP_MODE_PWR_DOWN); - #else - lowPowerBodOn(SLEEP_MODE_PWR_DOWN); - #endif - } - else - { - lowPowerBodOn(SLEEP_MODE_PWR_DOWN); - } - - if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); -} - -/******************************************************************************* -* Name: powerSave -* Description: Putting microcontroller into power save state. This is -* the lowest current consumption state after power down. -* Use this state together with an external 32.768 kHz crystal (but -* 8/16 MHz crystal/resonator need to be removed) to provide an -* asynchronous clock source to Timer 2. Please take note that -* Timer 2 is also used by the Arduino core for PWM operation. -* Please refer to wiring.c for explanation. Removal of the external -* 8/16 MHz crystal/resonator requires the microcontroller to run -* on its internal RC oscillator which is not so accurate for time -* critical operation. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control. Turning off the ADC module is -* basically removing the purpose of this low power mode. -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. bod Brown Out Detector (BOD) module disable control: -* (a) BOD_OFF - Turn off BOD module -* (b) BOD_ON - Leave BOD module in its default state -* -* 4. timer2 Timer 2 module disable control: -* (a) TIMER2_OFF - Turn off Timer 2 module -* (b) TIMER2_ON - Leave Timer 2 module in its default state -* -*******************************************************************************/ -void LowPowerClass::powerSave(period_t period, adc_t adc, bod_t bod, - timer2_t timer2) -{ - // Temporary clock source variable - unsigned char clockSource = 0; - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (TCCR2B & CS22) clockSource |= (1 << CS22); - if (TCCR2B & CS21) clockSource |= (1 << CS21); - if (TCCR2B & CS20) clockSource |= (1 << CS20); - - // Remove the clock source to shutdown Timer2 - TCCR2B &= ~(1 << CS22); - TCCR2B &= ~(1 << CS21); - TCCR2B &= ~(1 << CS20); - } - #endif - - if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - if (bod == BOD_OFF) - { - #if defined __AVR_ATmega328P__ - lowPowerBodOff(SLEEP_MODE_PWR_SAVE); - #else - lowPowerBodOn(SLEEP_MODE_PWR_SAVE); - #endif - } - else - { - lowPowerBodOn(SLEEP_MODE_PWR_SAVE); - } - - if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (clockSource & CS22) TCCR2B |= (1 << CS22); - if (clockSource & CS21) TCCR2B |= (1 << CS21); - if (clockSource & CS20) TCCR2B |= (1 << CS20); - } - #endif -} - -/******************************************************************************* -* Name: powerStandby -* Description: Putting microcontroller into power standby state. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control. Turning off the ADC module is -* basically removing the purpose of this low power mode. -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. bod Brown Out Detector (BOD) module disable control: -* (a) BOD_OFF - Turn off BOD module -* (b) BOD_ON - Leave BOD module in its default state -* -*******************************************************************************/ -void LowPowerClass::powerStandby(period_t period, adc_t adc, bod_t bod) -{ - if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - - if (bod == BOD_OFF) - { - #if defined __AVR_ATmega328P__ - lowPowerBodOff(SLEEP_MODE_STANDBY); - #else - lowPowerBodOn(SLEEP_MODE_STANDBY); - #endif - } - else - { - lowPowerBodOn(SLEEP_MODE_STANDBY); - } - - if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); -} - -/******************************************************************************* -* Name: powerExtStandby -* Description: Putting microcontroller into power extended standby state. This -* is different from the power standby state as it has the -* capability to run Timer 2 asynchronously. -* -* Argument Description -* ========= =========== -* 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake -* up resource: -* (a) SLEEP_15MS - 15 ms sleep -* (b) SLEEP_30MS - 30 ms sleep -* (c) SLEEP_60MS - 60 ms sleep -* (d) SLEEP_120MS - 120 ms sleep -* (e) SLEEP_250MS - 250 ms sleep -* (f) SLEEP_500MS - 500 ms sleep -* (g) SLEEP_1S - 1 s sleep -* (h) SLEEP_2S - 2 s sleep -* (i) SLEEP_4S - 4 s sleep -* (j) SLEEP_8S - 8 s sleep -* (k) SLEEP_FOREVER - Sleep without waking up through WDT -* -* 2. adc ADC module disable control. -* (a) ADC_OFF - Turn off ADC module -* (b) ADC_ON - Leave ADC module in its default state -* -* 3. bod Brown Out Detector (BOD) module disable control: -* (a) BOD_OFF - Turn off BOD module -* (b) BOD_ON - Leave BOD module in its default state -* -* 4. timer2 Timer 2 module disable control: -* (a) TIMER2_OFF - Turn off Timer 2 module -* (b) TIMER2_ON - Leave Timer 2 module in its default state -* -*******************************************************************************/ -void LowPowerClass::powerExtStandby(period_t period, adc_t adc, bod_t bod, - timer2_t timer2) -{ - // Temporary clock source variable - unsigned char clockSource = 0; - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (TCCR2B & CS22) clockSource |= (1 << CS22); - if (TCCR2B & CS21) clockSource |= (1 << CS21); - if (TCCR2B & CS20) clockSource |= (1 << CS20); - - // Remove the clock source to shutdown Timer2 - TCCR2B &= ~(1 << CS22); - TCCR2B &= ~(1 << CS21); - TCCR2B &= ~(1 << CS20); - } - #endif - - if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); - - if (period != SLEEP_FOREVER) - { - wdt_enable(period); - WDTCSR |= (1 << WDIE); - } - if (bod == BOD_OFF) - { - #if defined __AVR_ATmega328P__ - lowPowerBodOff(SLEEP_MODE_EXT_STANDBY); - #else - lowPowerBodOn(SLEEP_MODE_EXT_STANDBY); - #endif - } - else - { - lowPowerBodOn(SLEEP_MODE_EXT_STANDBY); - } - - if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); - - #if !defined(__AVR_ATmega32U4__) - if (timer2 == TIMER2_OFF) - { - if (clockSource & CS22) TCCR2B |= (1 << CS22); - if (clockSource & CS21) TCCR2B |= (1 << CS21); - if (clockSource & CS20) TCCR2B |= (1 << CS20); - } - #endif -} - -/******************************************************************************* -* Name: ISR (WDT_vect) -* Description: Watchdog Timer interrupt service routine. This routine is -* required to allow automatic WDIF and WDIE bit clearance in -* hardware. -* -*******************************************************************************/ -ISR (WDT_vect) -{ - // WDIE & WDIF is cleared in hardware upon entering this ISR - wdt_disable(); -} - -LowPowerClass LowPower; \ No newline at end of file diff --git a/libraries/MySensors/utility/LowPower.h b/libraries/MySensors/utility/LowPower.h deleted file mode 100644 index ef05901..0000000 --- a/libraries/MySensors/utility/LowPower.h +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef LowPower_h -#define LowPower_h - -enum period_t -{ - SLEEP_15Ms, - SLEEP_30MS, - SLEEP_60MS, - SLEEP_120MS, - SLEEP_250MS, - SLEEP_500MS, - SLEEP_1S, - SLEEP_2S, - SLEEP_4S, - SLEEP_8S, - SLEEP_FOREVER -}; - -enum bod_t -{ - BOD_OFF, - BOD_ON -}; - -enum adc_t -{ - ADC_OFF, - ADC_ON -}; - -enum timer5_t -{ - TIMER5_OFF, - TIMER5_ON -}; - -enum timer4_t -{ - TIMER4_OFF, - TIMER4_ON -}; - -enum timer3_t -{ - TIMER3_OFF, - TIMER3_ON -}; - -enum timer2_t -{ - TIMER2_OFF, - TIMER2_ON -}; - -enum timer1_t -{ - TIMER1_OFF, - TIMER1_ON -}; - -enum timer0_t -{ - TIMER0_OFF, - TIMER0_ON -}; - -enum spi_t -{ - SPI_OFF, - SPI_ON -}; - -enum usart0_t -{ - USART0_OFF, - USART0_ON -}; - -enum usart1_t -{ - USART1_OFF, - USART1_ON -}; - -enum usart2_t -{ - USART2_OFF, - USART2_ON -}; - -enum usart3_t -{ - USART3_OFF, - USART3_ON -}; - -enum twi_t -{ - TWI_OFF, - TWI_ON -}; - -enum usb_t -{ - USB_OFF, - USB_ON -}; - -class LowPowerClass -{ - public: - #if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__) - void idle(period_t period, adc_t adc, timer2_t timer2, - timer1_t timer1, timer0_t timer0, spi_t spi, - usart0_t usart0, twi_t twi); - #elif defined __AVR_ATmega2560__ - void idle(period_t period, adc_t adc, timer5_t timer5, - timer4_t timer4, timer3_t timer3, timer2_t timer2, - timer1_t timer1, timer0_t timer0, spi_t spi, - usart3_t usart3, usart2_t usart2, usart1_t usart1, - usart0_t usart0, twi_t twi); - #elif defined __AVR_ATmega32U4__ - void idle(period_t period, adc_t adc, timer4_t timer4, timer3_t timer3, - timer1_t timer1, timer0_t timer0, spi_t spi, - usart1_t usart1, twi_t twi, usb_t usb); - #else - #error "Please ensure chosen MCU is either 328P, 32U4 or 2560." - #endif - void adcNoiseReduction(period_t period, adc_t adc, timer2_t timer2); - void powerDown(period_t period, adc_t adc, bod_t bod); - void powerSave(period_t period, adc_t adc, bod_t bod, timer2_t timer2); - void powerStandby(period_t period, adc_t adc, bod_t bod); - void powerExtStandby(period_t period, adc_t adc, bod_t bod, timer2_t timer2); -}; - -extern LowPowerClass LowPower; -#endif \ No newline at end of file