Skip to content

Commit aea6e74

Browse files
committed
Merge pull request arduino#299 from tekka007/smartsleepfix
Fixing smartsleep, define return value for sleep()
2 parents b4e2fb4 + 1c54409 commit aea6e74

File tree

6 files changed

+81
-55
lines changed

6 files changed

+81
-55
lines changed

libraries/MySensors/core/MyHw.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void hwWriteConfig(int adr, uint8_t value);
4242
uint8_t hwReadConfig(int adr);
4343
*/
4444

45-
void hwSleep(unsigned long ms);
45+
int8_t hwSleep(unsigned long ms);
4646
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms);
4747
int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms);
4848
#ifdef MY_DEBUG

libraries/MySensors/core/MyHwATMega328.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ void hwInternalSleep(unsigned long ms) {
9494
if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15Ms); ms -= 15; }
9595
}
9696

97-
void hwSleep(unsigned long ms) {
97+
int8_t hwSleep(unsigned long ms) {
9898
hwInternalSleep(ms);
99+
return -1;
99100
}
100101

101102
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -120,7 +121,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
120121
detachInterrupt(interrupt1);
121122
if (interrupt2!=0xFF) detachInterrupt(interrupt2);
122123

123-
// default: no interrupt triggered
124+
// default: no interrupt triggered, timer wake up
124125
int8_t retVal = -1;
125126

126127
if (pinIntTrigger == 1) {

libraries/MySensors/core/MyHwESP8266.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,19 @@ void hwWriteConfig(int adr, uint8_t value)
9292

9393

9494

95-
void hwSleep(unsigned long ms) {
96-
// TODO: Not supported!
95+
int8_t hwSleep(unsigned long ms) {
96+
// TODO: Not supported!
97+
return -2;
9798
}
9899

99100
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
100-
// TODO: Not supported!
101-
return false;
101+
// TODO: Not supported!
102+
return -2;
102103
}
103104

104105
int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
105106
// TODO: Not supported!
106-
return 0;
107+
return -2;
107108
}
108109

109110
#ifdef MY_DEBUG

libraries/MySensors/core/MyHwSAMD.cpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -111,27 +111,28 @@ void hwReboot() {
111111
// TODO: Not supported!
112112
}
113113

114-
void hwSleep(unsigned long ms) {
114+
int8_t hwSleep(unsigned long ms) {
115115
// TODO: Not supported!
116-
ms = ms + 1;
116+
(void)ms;
117+
return -2;
117118
}
118119

119120
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
120121
// TODO: Not supported!
121-
interrupt = interrupt;
122-
mode = mode;
123-
ms = ms;
124-
return false;
122+
(void)interrupt;
123+
(void)mode;
124+
(void)ms;
125+
return -2;
125126
}
126127

127128
int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
128129
// TODO: Not supported!
129-
interrupt1 = interrupt1;
130-
mode1 = mode1;
131-
interrupt2 = interrupt2;
132-
mode2 = mode2;
133-
ms = ms;
134-
return 0;
130+
(void)interrupt1;
131+
(void)mode1;
132+
(void)interrupt2;
133+
(void)mode2;
134+
(void)ms;
135+
return -2;
135136
}
136137

137138
#ifdef MY_DEBUG

libraries/MySensors/core/MySensorCore.cpp

+51-29
Original file line numberDiff line numberDiff line change
@@ -315,72 +315,94 @@ void wait(unsigned long ms) {
315315
}
316316
}
317317

318-
void sleep(unsigned long ms) {
318+
int8_t sleep(unsigned long ms) {
319319
#if defined(MY_OTA_FIRMWARE_FEATURE)
320-
if (_fwUpdateOngoing) {
321-
// Do not sleep node while fw update is ongoing
322-
_process();
323-
return;
324-
} else {
320+
if (_fwUpdateOngoing) {
321+
// Do not sleep node while fw update is ongoing
322+
wait(ms);
323+
return -1;
324+
}
325325
#endif
326+
// if repeater, do not sleep
327+
#if defined(MY_REPEATER_FEATURE)
328+
wait(ms);
329+
return -1;
330+
#else
326331
#if defined(MY_RADIO_FEATURE)
327332
transportPowerDown();
328333
#endif
329-
hwSleep(ms);
330-
#if defined(MY_OTA_FIRMWARE_FEATURE)
331-
}
334+
return hwSleep(ms);
332335
#endif
333336
}
334337

335-
void smartSleep(unsigned long ms) {
336-
wait(MY_SMART_SLEEP_WAIT_DURATION);
337-
sleep(ms);
338+
int8_t smartSleep(unsigned long ms) {
339+
int8_t ret = sleep(ms);
340+
// notifiy controller about wake up
338341
sendHeartbeat();
342+
// listen for incoming messages
343+
wait(MY_SMART_SLEEP_WAIT_DURATION);
344+
return ret;
339345
}
340346

341-
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
347+
int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
342348
#if defined(MY_OTA_FIRMWARE_FEATURE)
343349
if (_fwUpdateOngoing) {
344-
// Do not sleep node while fw update is ongoing
345-
return false;
346-
} else {
350+
// not supported
351+
return -2;
352+
}
347353
#endif
354+
#if defined(MY_REPEATER_FEATURE)
355+
// not supported
356+
(void)interrupt;
357+
(void)mode;
358+
(void)ms;
359+
return -2;
360+
#else
348361
#if defined(MY_RADIO_FEATURE)
349362
transportPowerDown();
350363
#endif
351-
return hwSleep(interrupt, mode, ms) ;
352-
#if defined(MY_OTA_FIRMWARE_FEATURE)
353-
}
364+
return hwSleep(interrupt, mode, ms);
354365
#endif
355366
}
356367

357-
bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
358-
wait(MY_SMART_SLEEP_WAIT_DURATION);
359-
bool ret = sleep(interrupt, mode, ms);
368+
int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
369+
int8_t ret = sleep(interrupt, mode, ms);
370+
// notifiy controller about wake up
360371
sendHeartbeat();
372+
// listen for incoming messages
373+
wait(MY_SMART_SLEEP_WAIT_DURATION);
361374
return ret;
362375
}
363376

364377
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
365378
#if defined(MY_OTA_FIRMWARE_FEATURE)
366379
if (_fwUpdateOngoing) {
367-
// Do not sleep node while fw update is ongoing
368-
return -1;
369-
} else {
380+
// not supported
381+
return -2;
382+
}
370383
#endif
384+
#if defined(MY_REPEATER_FEATURE)
385+
// not supported
386+
(void)interrupt1;
387+
(void)mode1;
388+
(void)interrupt2;
389+
(void)mode2;
390+
(void)ms;
391+
return -2;
392+
#else
371393
#if defined(MY_RADIO_FEATURE)
372394
transportPowerDown();
373395
#endif
374-
return hwSleep(interrupt1, mode1, interrupt2, mode2, ms) ;
375-
#if defined(MY_OTA_FIRMWARE_FEATURE)
376-
}
396+
return hwSleep(interrupt1, mode1, interrupt2, mode2, ms);
377397
#endif
378398
}
379399

380400
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
381-
wait(MY_SMART_SLEEP_WAIT_DURATION);
382401
int8_t ret = sleep(interrupt1, mode1, interrupt2, mode2, ms);
402+
// notifiy controller about wake up
383403
sendHeartbeat();
404+
// listen for incoming messages
405+
wait(MY_SMART_SLEEP_WAIT_DURATION);
384406
return ret;
385407
}
386408

libraries/MySensors/core/MySensorCore.h

+7-6
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,10 @@ void wait(unsigned long ms);
178178
/**
179179
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer.
180180
* @param ms Number of milliseconds to sleep.
181+
* @return -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
181182
*/
182-
void sleep(unsigned long ms);
183-
void smartSleep(unsigned long ms);
183+
int8_t sleep(unsigned long ms);
184+
int8_t smartSleep(unsigned long ms);
184185

185186
/**
186187
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change.
@@ -189,10 +190,10 @@ void smartSleep(unsigned long ms);
189190
* @param interrupt Interrupt that should trigger the wakeup
190191
* @param mode RISING, FALLING, CHANGE
191192
* @param ms Number of milliseconds to sleep or 0 to sleep forever
192-
* @return true if wake up was triggered by pin change and false means timer woke it up.
193+
* @return Interrupt number wake up was triggered by pin change, -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
193194
*/
194-
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
195-
bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
195+
int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
196+
int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
196197

197198
/**
198199
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts.
@@ -203,7 +204,7 @@ bool smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
203204
* @param interrupt2 Second interrupt that should trigger the wakeup
204205
* @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE)
205206
* @param ms Number of milliseconds to sleep or 0 to sleep forever
206-
* @return Interrupt number wake up was triggered by pin change and negative if timer woke it up.
207+
* @return Interrupt number wake up was triggered by pin change, -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
207208
*/
208209
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0);
209210
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0);

0 commit comments

Comments
 (0)