summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2020-11-25 15:07:57 -0500
committerDan Halbert <halbert@halwitz.org>2020-11-25 15:09:27 -0500
commit9dbea36eac9a78cf324bba8d32a5cb2c9940d411 (patch)
tree7d54888455af9db4599a9928b709859296924a01 /ports
parentf868cc5dd02319957500180541281f41ec0d0573 (diff)
changed alarm.time API
Diffstat (limited to 'ports')
-rw-r--r--ports/esp32s2/common-hal/alarm/__init__.c33
-rw-r--r--ports/esp32s2/common-hal/alarm/pin/PinAlarm.c3
-rw-r--r--ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.c (renamed from ports/esp32s2/common-hal/alarm/time/DurationAlarm.c)22
-rw-r--r--ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.h (renamed from ports/esp32s2/common-hal/alarm/time/DurationAlarm.h)5
4 files changed, 31 insertions, 32 deletions
diff --git a/ports/esp32s2/common-hal/alarm/__init__.c b/ports/esp32s2/common-hal/alarm/__init__.c
index 87276bdaf..37d74c0be 100644
--- a/ports/esp32s2/common-hal/alarm/__init__.c
+++ b/ports/esp32s2/common-hal/alarm/__init__.c
@@ -25,13 +25,15 @@
* THE SOFTWARE.
*/
+#include "py/obj.h"
#include "py/objtuple.h"
#include "py/runtime.h"
#include "shared-bindings/alarm/__init__.h"
#include "shared-bindings/alarm/pin/PinAlarm.h"
-#include "shared-bindings/alarm/time/DurationAlarm.h"
+#include "shared-bindings/alarm/time/MonotonicTimeAlarm.h"
#include "shared-bindings/microcontroller/__init__.h"
+#include "shared-bindings/time/__init__.h"
#include "esp_sleep.h"
@@ -49,8 +51,8 @@ mp_obj_t common_hal_alarm_get_wake_alarm(void) {
switch (esp_sleep_get_wakeup_cause()) {
case ESP_SLEEP_WAKEUP_TIMER: {
// Wake up from timer.
- alarm_time_duration_alarm_obj_t *timer = m_new_obj(alarm_time_duration_alarm_obj_t);
- timer->base.type = &alarm_time_duration_alarm_type;
+ alarm_time_monotonic_time_alarm_obj_t *timer = m_new_obj(alarm_time_monotonic_time_alarm_obj_t);
+ timer->base.type = &alarm_time_monotonic_time_alarm_type;
return timer;
}
@@ -84,7 +86,7 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala
if (MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
mp_raise_NotImplementedError(translate("PinAlarm deep sleep not yet implemented"));
}
- if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_duration_alarm_type)) {
+ else if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_monotonic_time_alarm_type)) {
if (time_alarm_set) {
mp_raise_ValueError(translate("Only one alarm.time alarm can be set."));
}
@@ -95,14 +97,25 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala
_deep_sleep_alarms = mp_obj_new_tuple(n_alarms, alarms);
}
-void common_hal_alarm_enable_deep_sleep_alarms(void) {
+// Return false if we should wake up immediately because a time alarm is in the past
+// or otherwise already triggered.
+bool common_hal_alarm_enable_deep_sleep_alarms(void) {
for (size_t i = 0; i < _deep_sleep_alarms->len; i++) {
mp_obj_t alarm = _deep_sleep_alarms->items[i];
- if (MP_OBJ_IS_TYPE(alarm, &alarm_time_duration_alarm_type)) {
- alarm_time_duration_alarm_obj_t *duration_alarm = MP_OBJ_TO_PTR(alarm);
- esp_sleep_enable_timer_wakeup(
- (uint64_t) (duration_alarm->duration * 1000000.0f));
+ if (MP_OBJ_IS_TYPE(alarm, &alarm_pin_pin_alarm_type)) {
+ // TODO: handle pin alarms
+ mp_raise_NotImplementedError(translate("PinAlarm deep sleep not yet implemented"));
+ }
+ else if (MP_OBJ_IS_TYPE(alarm, &alarm_time_monotonic_time_alarm_type)) {
+ alarm_time_monotonic_time_alarm_obj_t *monotonic_time_alarm = MP_OBJ_TO_PTR(alarm);
+ mp_float_t now = uint64_to_float(common_hal_time_monotonic());
+ // Compute a relative time in the future from now.
+ mp_float_t duration_secs = now - monotonic_time_alarm->monotonic_time;
+ if (duration_secs <= 0.0f) {
+ return false;
+ }
+ esp_sleep_enable_timer_wakeup((uint64_t) (duration_secs * 1000000));
}
- // TODO: handle pin alarms
}
+ return true;
}
diff --git a/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
index f26c8a179..438d6885d 100644
--- a/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
+++ b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
@@ -3,7 +3,6 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2020 @microDev1 (GitHub)
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -38,7 +37,7 @@ void common_hal_alarm_pin_pin_alarm_construct(alarm_pin_pin_alarm_obj_t *self, c
self->pull = pull;
}
-const mp_obj_tuple_t *common_hal_alarm_pin_pin_alarm_get_pins(alarm_pin_pin_alarm_obj_t *self) {
+mp_obj_tuple_t *common_hal_alarm_pin_pin_alarm_get_pins(alarm_pin_pin_alarm_obj_t *self) {
return self->pins;
}
diff --git a/ports/esp32s2/common-hal/alarm/time/DurationAlarm.c b/ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.c
index 80bf4244e..81864d99e 100644
--- a/ports/esp32s2/common-hal/alarm/time/DurationAlarm.c
+++ b/ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.c
@@ -3,7 +3,6 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2020 @microDev1 (GitHub)
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -29,23 +28,12 @@
#include "py/runtime.h"
-#include "shared-bindings/alarm/time/DurationAlarm.h"
+#include "shared-bindings/alarm/time/MonotonicTimeAlarm.h"
-void common_hal_alarm_time_duration_alarm_construct(alarm_time_duration_alarm_obj_t *self, mp_float_t duration) {
- self->duration = duration;
+void common_hal_alarm_time_monotonic_time_alarm_construct(alarm_time_monotonic_time_alarm_obj_t *self, mp_float_t monotonic_time) {
+ self->monotonic_time = monotonic_time;
}
-mp_float_t common_hal_alarm_time_duration_alarm_get_duration(alarm_time_duration_alarm_obj_t *self) {
- return self->duration;
-}
-
-void common_hal_alarm_time_duration_alarm_enable(alarm_time_duration_alarm_obj_t *self) {
- if (esp_sleep_enable_timer_wakeup((uint64_t) (self->duration * 1000000)) == ESP_ERR_INVALID_ARG) {
- mp_raise_ValueError(translate("duration out of range"));
- }
-}
-
-void common_hal_alarm_time_duration_alarm_disable (alarm_time_duration_alarm_obj_t *self) {
- (void) self;
- esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);
+mp_float_t common_hal_alarm_time_monotonic_time_alarm_get_monotonic_time(alarm_time_monotonic_time_alarm_obj_t *self) {
+ return self->monotonic_time;
}
diff --git a/ports/esp32s2/common-hal/alarm/time/DurationAlarm.h b/ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.h
index 3e81cbac2..5ff829450 100644
--- a/ports/esp32s2/common-hal/alarm/time/DurationAlarm.h
+++ b/ports/esp32s2/common-hal/alarm/time/MonotonicTimeAlarm.h
@@ -3,7 +3,6 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2020 @microDev1 (GitHub)
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -30,5 +29,5 @@
typedef struct {
mp_obj_base_t base;
- mp_float_t duration; // seconds
-} alarm_time_duration_alarm_obj_t;
+ mp_float_t monotonic_time; // values compatible with time.monotonic_time()
+} alarm_time_monotonic_time_alarm_obj_t;