]> git.earman.xyz Git - sensor-watch.git/commitdiff
Add new function to disable certain RTC periodic callbacks
authorAlexsander Akers <me@a2.io>
Thu, 27 Jan 2022 16:23:14 +0000 (11:23 -0500)
committerAlexsander Akers <me@a2.io>
Thu, 27 Jan 2022 17:06:06 +0000 (12:06 -0500)
movement/movement.c
watch-library/hardware/watch/watch_rtc.c
watch-library/shared/watch/watch_rtc.h
watch-library/simulator/watch/watch_rtc.c

index d15c349f0370c9a6f52b8858ede45649ce6059fa..1c8e641ca06087fa4d419312715e0c578f022980 100644 (file)
@@ -155,13 +155,7 @@ void movement_request_tick_frequency(uint8_t freq) {
     if (freq == 128) return; // Movement uses the 128 Hz tick internally
 
     // disable all callbacks except the 128 Hz one
-#if __EMSCRIPTEN__
-    for (int i = 1; i < 128; i = i << 1) {
-        watch_rtc_disable_periodic_callback(i);
-    }
-#else
-    RTC->MODE2.INTENCLR.reg = 0xFE;
-#endif
+    watch_rtc_disable_matching_periodic_callbacks(0b01111111);
 
     movement_state.subsecond = 0;
     movement_state.tick_frequency = freq;
index 14a968c4e5180b936d0a239fc754602877bd7088..283605236d53714db12ab571f01bd9c4f52f09d9 100644 (file)
@@ -102,8 +102,12 @@ void watch_rtc_disable_periodic_callback(uint8_t frequency) {
     RTC->MODE2.INTENCLR.reg = 1 << per_n;
 }
 
+void watch_rtc_disable_matching_periodic_callbacks(uint8_t mask) {
+    RTC->MODE2.INTENCLR.reg = mask;
+}
+
 void watch_rtc_disable_all_periodic_callbacks(void) {
-    RTC->MODE2.INTENCLR.reg = 0xFF;
+    watch_rtc_disable_matching_periodic_callbacks(0xFF);
 }
 
 void watch_rtc_register_alarm_callback(ext_irq_cb_t callback, watch_date_time alarm_time, watch_rtc_alarm_match mask) {
index 6dac63f5a5e5687bc031e274a29832ff04344b32..b51d6c48b64e1eda481f4de1bcee8a5f28fd6575 100644 (file)
@@ -137,6 +137,11 @@ void watch_rtc_register_periodic_callback(ext_irq_cb_t callback, uint8_t frequen
   */
 void watch_rtc_disable_periodic_callback(uint8_t frequency);
 
+/** @brief Disables tick callbacks for the given periods (as a bitmask).
+  * @param mask The frequencies of tick callbacks you wish to disable, in Hz. To disable the 2 and 4 Hz callbacks, pass 0b00000110;
+  */
+void watch_rtc_disable_matching_periodic_callbacks(uint8_t mask);
+
 /** @brief Disables all periodic callbacks, including the once-per-second tick callback.
   */
 void watch_rtc_disable_all_periodic_callbacks(void);
index 1fe6a78bab9c4192e45a07a213c6ccd73d68b586..2cae701daee1fb434bfeab27ce22049a6ae6c43e 100644 (file)
@@ -113,15 +113,19 @@ void watch_rtc_disable_periodic_callback(uint8_t frequency) {
     }
 }
 
-void watch_rtc_disable_all_periodic_callbacks(void) {
+void watch_rtc_disable_matching_periodic_callbacks(uint8_t mask) {
     for (int i = 0; i < 8; i++) {
-        if (tick_callbacks[i] != -1) {
+        if (tick_callbacks[i] != -1 && (mask & (1 << i)) != 0) {
             emscripten_clear_interval(tick_callbacks[i]);
             tick_callbacks[i] = -1;
         }
     }
 }
 
+void watch_rtc_disable_all_periodic_callbacks(void) {
+    watch_rtc_disable_matching_periodic_callbacks(0xFF);
+}
+
 static void watch_invoke_alarm_interval_callback(void *userData) {
     if (alarm_callback) alarm_callback();
 }