]> git.earman.xyz Git - sensor-watch.git/commitdiff
Fix missing documentation for many clock faces:
authorAlex Utter <ooterness@gmail.com>
Tue, 28 Nov 2023 04:06:19 +0000 (20:06 -0800)
committerGitHub <noreply@github.com>
Tue, 28 Nov 2023 04:06:19 +0000 (23:06 -0500)
* Move from .c to .h as needed for consistency.
* When missing from both, copy from pull request or wiki.
* When missing entirely, infer functionality from source code.

91 files changed:
movement/watch_faces/clock/beats_face.c
movement/watch_faces/clock/beats_face.h
movement/watch_faces/clock/decimal_time_face.h
movement/watch_faces/clock/mars_time_face.h
movement/watch_faces/clock/repetition_minute_face.h
movement/watch_faces/clock/simple_clock_bin_led_face.h
movement/watch_faces/clock/simple_clock_face.h
movement/watch_faces/clock/weeknumber_clock_face.h
movement/watch_faces/clock/world_clock2_face.c
movement/watch_faces/clock/world_clock2_face.h
movement/watch_faces/clock/world_clock_face.h
movement/watch_faces/clock/wyoscan_face.h
movement/watch_faces/complication/activity_face.h
movement/watch_faces/complication/alarm_face.c
movement/watch_faces/complication/alarm_face.h
movement/watch_faces/complication/astronomy_face.h
movement/watch_faces/complication/blinky_face.h
movement/watch_faces/complication/breathing_face.h
movement/watch_faces/complication/countdown_face.c
movement/watch_faces/complication/countdown_face.h
movement/watch_faces/complication/counter_face.h
movement/watch_faces/complication/databank_face.c
movement/watch_faces/complication/databank_face.h
movement/watch_faces/complication/day_one_face.h
movement/watch_faces/complication/discgolf_face.c
movement/watch_faces/complication/discgolf_face.h
movement/watch_faces/complication/dual_timer_face.h
movement/watch_faces/complication/flashlight_face.h
movement/watch_faces/complication/geomancy_face.h
movement/watch_faces/complication/habit_face.h
movement/watch_faces/complication/interval_face.c
movement/watch_faces/complication/interval_face.h
movement/watch_faces/complication/invaders_face.h
movement/watch_faces/complication/moon_phase_face.h
movement/watch_faces/complication/morsecalc_face.c
movement/watch_faces/complication/morsecalc_face.h
movement/watch_faces/complication/orrery_face.c
movement/watch_faces/complication/orrery_face.h
movement/watch_faces/complication/planetary_hours_face.h
movement/watch_faces/complication/planetary_time_face.h
movement/watch_faces/complication/probability_face.h
movement/watch_faces/complication/pulsometer_face.h
movement/watch_faces/complication/randonaut_face.h
movement/watch_faces/complication/ratemeter_face.h
movement/watch_faces/complication/rpn_calculator_alt_face.c
movement/watch_faces/complication/rpn_calculator_alt_face.h
movement/watch_faces/complication/rpn_calculator_face.h
movement/watch_faces/complication/sailing_face.c
movement/watch_faces/complication/sailing_face.h
movement/watch_faces/complication/ships_bell_face.h
movement/watch_faces/complication/stock_stopwatch_face.h
movement/watch_faces/complication/stopwatch_face.h
movement/watch_faces/complication/sunrise_sunset_face.h
movement/watch_faces/complication/tachymeter_face.h
movement/watch_faces/complication/tally_face.h
movement/watch_faces/complication/tarot_face.h
movement/watch_faces/complication/tempchart_face.c
movement/watch_faces/complication/tempchart_face.h
movement/watch_faces/complication/time_left_face.h
movement/watch_faces/complication/timer_face.c
movement/watch_faces/complication/timer_face.h
movement/watch_faces/complication/tomato_face.h
movement/watch_faces/complication/toss_up_face.h
movement/watch_faces/complication/totp_face.c
movement/watch_faces/complication/totp_face.h
movement/watch_faces/complication/totp_face_lfs.c
movement/watch_faces/complication/totp_face_lfs.h
movement/watch_faces/complication/wake_face.c
movement/watch_faces/complication/wake_face.h
movement/watch_faces/demo/character_set_face.h
movement/watch_faces/demo/chirpy_demo_face.h
movement/watch_faces/demo/demo_face.h
movement/watch_faces/demo/frequency_correction_face.h
movement/watch_faces/demo/hello_there_face.h
movement/watch_faces/demo/lis2dw_logging_face.h
movement/watch_faces/demo/voltage_face.h
movement/watch_faces/sensor/accelerometer_data_acquisition_face.h
movement/watch_faces/sensor/lightmeter_face.c
movement/watch_faces/sensor/lightmeter_face.h
movement/watch_faces/sensor/thermistor_logging_face.h
movement/watch_faces/sensor/thermistor_readout_face.h
movement/watch_faces/sensor/thermistor_testing_face.c
movement/watch_faces/sensor/thermistor_testing_face.h
movement/watch_faces/settings/finetune_face.c
movement/watch_faces/settings/finetune_face.h
movement/watch_faces/settings/nanosec_face.c
movement/watch_faces/settings/nanosec_face.h
movement/watch_faces/settings/preferences_face.h
movement/watch_faces/settings/set_time_face.h
movement/watch_faces/settings/set_time_hackwatch_face.c
movement/watch_faces/settings/set_time_hackwatch_face.h

index 50c3284dbaf856edda2b766bd4913b972462e560..85bcbe08ae34379c9b386af09b44f0e40179e5bc 100644 (file)
@@ -1,3 +1,27 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2023 Wesley Ellis <https://github.com/tahnok>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #include <stdlib.h>
 #include <string.h>
 #include "beats_face.h"
index 2bbbc26d599b5b3e95a9833a2a64b9835dddeeff..4a066241f2677c054062cd3d53a3426426f91eb6 100644 (file)
@@ -1,6 +1,41 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2023 Wesley Ellis <https://github.com/tahnok>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #ifndef BEATS_FACE_H_
 #define BEATS_FACE_H_
 
+/*
+ * BEATS TIME face
+ *
+ * The Beat Time face displays the current Swatch Internet Time, or .beat time.
+ * This is a decimal time system that divides the day into 1000 beats.
+ *
+ * The three large digits in the bottom row indicate the current beat, and the
+ * two smaller digits (normally the seconds in Simple Clock) indicate the
+ * fractional beat; so for example you can read “67214” as “beat 672.14”.
+ */
+
 #include "movement.h"
 
 typedef struct {
index b9f14f334610a3069c8d1e5363c5a1565e6e9182..3d3a9138e94fa39fe238a095b6b548b4206a3605 100644 (file)
 #ifndef DECIMAL_TIME_FACE_H_
 #define DECIMAL_TIME_FACE_H_
 
-#include "movement.h"
-
 /*
- * DECIMAL TIME FACE
+ * DECIMAL TIME face
  * 
  * This face presents the current time as hours and hundredths of an hour. Every hundreth of an hour, or "centihour", 
  * occurs every 36 seconds. Because they range from 0 to 99, centihours, in the seventies range, will be displayed with a lowercase 7.
  * https://hr.colostate.edu/minute-to-decimal-conversion-chart/
  * 
  * Many thanks go to Joey Castillo for making this project happen.
- * 
  */
 
+#include "movement.h"
+
 typedef struct {
     bool chime_enabled;            // did the user enable hourly chime for this face? 
     uint8_t features_to_show : 2 ; // what features are to be displayed?
index d34792e98c8a58988888555e04e629da71249c79..04917686e12ea3814b0abf79516fd4ac044cebc4 100644 (file)
 #ifndef MARS_TIME_FACE_H_
 #define MARS_TIME_FACE_H_
 
+/*
+ * MARS TIME face
+ *
+ * This watch face is dedicated to Martian timekeeping.
+ * It has several modes, and can display either a time or a date.
+ *
+ * Pressing the ALARM button cycles through different time zones on Mars:
+ *   MC - Mars Coordinated Time, the time at Airy-0 Crater on the Martian prime meridian
+ *   ZH - Local mean solar time for the Zhurong rover
+ *   PE - LMST for the Perseverance rover
+ *   IN - LMST for the Insight lander
+ *   CU - LMST for the Curiosity rover
+ *
+ * Press the LIGHT button to toggle between displaying time and date:
+ *   MC S - the Mars Sol Date, Martian days since December 29, 1873
+ *   ZH Sol - Mission sol for the Zhurong rover
+ *   PE Sol - Mission sol for the Perseverance rover
+ *   IN S - Mission sol for the InSight lander
+ *   CU S - Mission sol for the Curiosity rover
+ *
+ * Note that where the mission sol is below 1000, this watch face displays
+ * the word “Sol” on the bottom line. When the mission sol is over 1000, the
+ * word “Sol” will not fit and so it displays a stylized letter S at the top
+ * right.
+ */
+
 #include "movement.h"
 
 typedef enum {
index 5a897bc1905bad703935163a89d1d486fe0a5e4c..8c3100ddcbde2f6269a33eb5b5b7f9a7a1f36f07 100644 (file)
@@ -25,9 +25,9 @@
 #ifndef REPETITION_MINUTE_FACE_H_
 #define REPETITION_MINUTE_FACE_H_
 
-#include "movement.h"
-
 /*
+ * REPETITION MINUTE face
+ *
  * A hopefully useful complication for friendly neighbors in the dark
  *
  * Originating from 1676 from reverend and mechanician Edward Barlow, and
@@ -40,7 +40,6 @@
  * before widespread artificial illumination, to allow the time to be determined
  * in the dark, and were also used by the visually impaired. 
  *
- *
  * How to use it :
  * 
  * Long press the light button to get an auditive reading of the time like so :
  * Prerequisite : a watch with a working buzzer
  * 
  * ~ Only in the darkness can you see the stars. - Martin Luther King ~
- *
  */
 
+#include "movement.h"
+
 typedef struct {
     uint32_t previous_date_time;
     uint8_t last_battery_check;
index 918b82a452d4fd7087d4087604be0797f755f76b..79c7c146302d53ab204153866b5420ca722a76f7 100644 (file)
@@ -25,9 +25,9 @@
 #ifndef SIIMPLE_CLOCK_BIN_LED_FACE_H_
 #define SIIMPLE_CLOCK_BIN_LED_FACE_H_
 
-#include "movement.h"
-
 /*
+ * BINARY LED CLOCK FACE
+ *
  * A "fork" of the simple clock face, which provides the functionality of showing 
  * the current time by flashing the LED using binary representation.
  *
@@ -49,6 +49,8 @@
  *   represents 1.
  */
 
+#include "movement.h"
+
 typedef struct {
     uint32_t previous_date_time;
     uint8_t last_battery_check;
index 1e9babad0b24543ce8e90a24d04e3a4d20d9cb06..e74a6e864e501d2911626048f54f5aa4aa29e690 100644 (file)
 #ifndef SIMPLE_CLOCK_FACE_H_
 #define SIMPLE_CLOCK_FACE_H_
 
+/*
+ * SIMPLE CLOCK FACE
+ *
+ * Displays the current time, matching the original operation of the watch.
+ * This is the default display mode in most watch configurations.
+ *
+ * Long-press ALARM to toggle the hourly chime.
+ */
+
 #include "movement.h"
 
 typedef struct {
index f0298ea8c860e1b7197b6ae6872213cb00b30a6c..ec619427febc37c3dc47ace22af36935541d4c1b 100644 (file)
 #ifndef WEEKNUMBER_CLOCK_FACE_H_
 #define WEEKNUMBER_CLOCK_FACE_H_
 
+/*
+ * WEEK-NUMBER WATCH FACE
+ *
+ * Same as simple clock, but has iso 8601 week number instead of seconds counter.
+ *
+ * Long-press ALARM to toggle the hourly chime.
+ */
+
 #include "movement.h"
 
 typedef struct {
index 0077f6394d0944335a326e5d7a2280fd69fc1685..2e1e96950fa6d1666c845a637553f4856fe3186b 100644 (file)
  * SOFTWARE.
  */
 
-/*
- * World Clock 2
- * =============
- *
- * This is an alternative world clock face that allows the user to cycle
- * through a list of selected time zones. It extends the original
- * implementation by Joey Castillo. The face has two modes *display mode*
- * and *settings mode*.
- *
- * ### Settings mode
- *
- * When the clock face is activated for the first time, it enters
- * *settings mode*. Here, the user can select the time zones they want to
- * display. The face shows a summary of the current time zone:
- *
- * - The top of the face displays the first two letters of the time zone
- *   abbreviation, such as "PS" for Pacific Standard Time or CE for
- * "Central European Time".
- *
- * - The upper-right corner shows the index number of the time zone. This
- *   helps avoid confusion when multiple time zones have the same
- *   two-letter abbreviation.
- *
- * - The main display shows the offset from UTC, with a "+" indicating a
- *   positive offset and a "-" indicating a negative offset. For example,
- *   the offset for Japanese Standard Time is displayed as "+9:00".
- *
- * The user can navigate through the time zones and select them using the
- * following buttons:
- *
- * - The *alarm button* moves forward to the next time zone, while the
- *   *light button* moves backward to the previous zone. This way, the
- *   user can cycle through all 41 supported time zones.
- *
- * - A *long press* on the *light button* selects the current time zone,
- *   and the signal indicator appears at the top left. Another *long
- *   press* of the *light button* deselects the time zone.
- *
- * - A *long press* on the *alarm button* exits settings mode and returns
- *   to display mode.
- *
- * ### Display mode
- *
- * In the display mode, the face shows the time of the currently selected
- * time zone. The face includes the following components:
- *
- * - The top of the face displays the first two letters of the time zone
- *   abbreviation, such as "PS" for Pacific Standard Time or "CE" for
- *   Central European Time.
- *
- * - The upper-right corner shows the current day of the month, which
- *   helps indicate time zones that cross the international date line
- *   with respect to the local time.
- *
- * - The main display shows the time in the selected time zone in either
- *   12-hour or 24-hour form. There is no timeout, allowing users to keep
- *   the chosen time zone displayed for as long as they wish.
- *
- * The user can navigate through the selected time zones using the
- * following buttons:
- *
- * - The *alarm button* moves to the next selected time zone, while the
- *   light button moves to the *previous zone*. If no time zone is
- *   selected, the face simply shows UTC.
- *
- * - A *long press* on the *alarm button* enters settings mode and
- *   enables the user to re-configure the selected time zones.
- *
- * - A *long press* on the *light button* activates the LED illumination
- *   of the watch.
- *
- */
-
 #include <stdlib.h>
 #include <string.h>
 #include "world_clock2_face.h"
index f70dca1fabbfe908cdca88745491804feb9ebec7..0baac2123b17c453f4c1150d24d37a82cb8abbc8 100644 (file)
 #ifndef WORLD_CLOCK2_FACE_H_
 #define WORLD_CLOCK2_FACE_H_
 
+/*
+ * WORLD CLOCK 2
+ *
+ * This is an alternative world clock face that allows the user to cycle
+ * through a list of selected time zones. It extends the original
+ * implementation by Joey Castillo. The face has two modes: display mode
+ * and settings mode.
+ *
+ * Settings mode
+ *
+ * When the clock face is activated for the first time, it enters settings
+ * mode. Here, the user can select the time zones they want to display. The
+ * face shows a summary of the current time zone:
+ *  * The top of the face displays the first two letters of the time zone
+ *    abbreviation, such as "PS" for Pacific Standard Time or CE for
+ *    "Central European Time".
+ *  * The upper-right corner shows the index number of the time zone. This
+ *    helps avoid confusion when multiple time zones have the same two-letter
+ *    abbreviation.
+ *  * The main display shows the offset from UTC, with a "+" indicating a
+ *    positive offset and a "-" indicating a negative offset. For example,
+ *    the offset for Japanese Standard Time is displayed as "+9:00".
+ *
+ * The user can navigate through the time zones and select them using the
+ * following buttons:
+ *  * The ALARM button moves forward to the next time zone, while the LIGHT
+ *    button moves backward to the previous zone. This way, the user can
+ *    cycle through all 41 supported time zones.
+ *  * A long press on the LIGHT button selects the current time zone, and
+ *    the signal indicator appears at the top left. Another long press of
+ *    the LIGHT button deselects the time zone.
+ *  * A long press on the ALARM button exits settings mode and returns to
+ *    display mode.
+ *
+ * Display mode
+ *
+ * In the display mode, the face shows the time of the currently selected
+ * time zone. The face includes the following components:
+ *  * The top of the face displays the first two letters of the time zone
+ *    abbreviation, such as "PS" for Pacific Standard Time or "CE" for
+ *    Central European Time.
+ *  * The upper-right corner shows the current day of the month, which helps
+ *    indicate time zones that cross the international date line with respect
+ *    to the local time.
+ *  * The main display shows the time in the selected time zone in either
+ *    12-hour or 24-hour form. There is no timeout, allowing users to keep
+ *    the chosen time zone displayed for as long as they wish.
+ *
+ * The user can navigate through the selected time zones using the following
+ * buttons:
+ *  * The ALARM button moves to the next selected time zone, while the LIGHT
+ *    button moves to the previous zone. If no time zone is selected, the
+ *    face simply shows UTC.
+ *  * A long press on the ALARM button enters settings mode and enables the
+ *    user to re-configure the selected time zones.
+ *  * A long press on the LIGHT button activates the LED illumination of the
+ *    watch.
+ */
+
 /* Number of zones. See movement_timezone_offsets. */
 #define NUM_TIME_ZONES  41
 
index 669dcaa8212047454b7141e5918d1697a2be7679..92e91a6ff28bc63f71f0457ecc466c2045bf2bfa 100644 (file)
 #ifndef WORLD_CLOCK_FACE_H_
 #define WORLD_CLOCK_FACE_H_
 
+/*
+ * WORLD CLOCK FACE
+ *
+ * The World Clock watch face looks similar to the Simple Clock watch face,
+ * but you’ll notice that at first launch the day of week indicators are blank.
+ * That’s because this watch face does not display the day of the week.
+ * Instead, you may customize these letters to display the name of a time zone
+ * of your choosing.
+ *
+ * To customize this watch face, press and hold the ALARM button. The first
+ * letter in the top row will begin flashing. Press the ALARM button repeatedly
+ * to advance through the available letters in the first slot, then press the
+ * LIGHT button to move to the second letter. Finally, press LIGHT again to move
+ * to the time zone setting, and press ALARM to cycle through the available time
+ * zones. Press LIGHT one last time to return to the world clock display.
+ *
+ * Note that the second slot cannot display all letters or numbers. Also note
+ * that at this time, time zones do not automatically update for daylight saving
+ * time; you will need to manually adjust this field each spring and fall.
+ */
+
 #include "movement.h"
+
 typedef union {
     struct {
         uint8_t char_0;
index 68db9eedc24df71ea3f30163c7d1704ae572a9be..d20e7636ba96260a33968045863b092bfbfeb58b 100644 (file)
 #ifndef WYOSCAN_FACE_H_
 #define WYOSCAN_FACE_H_
 
-#include "movement.h"
-
 /*
- * A DESCRIPTION OF YOUR WATCH FACE
+ * WYOSCAN .5 hz watchface
+ *
+ * This is a recreation of the Wyoscan watch, which was a $175 watch in 2014.
+ * It was an f-91w pcb replacement.
+ * 
+ * Video: https://user-images.githubusercontent.com/1795778/252550124-e07f0ed1-e328-4337-a654-fa1ee65d883f.mp4
+ * Background information: https://artmetropole.com/shop/11460
+ * Demo of what it looks like: https://www.o-r-g.com/apps/wyoscan
+ *
+ * 8 frames per number * 6 numbers + the trailing 16 frames = 64 frames
+ * at 32 frames per second, this is a 2-second cycle time or 0.5 Hz.
  *
- * and a description of how use it
+ * It is giving me a stack overflow after about 2.5 cycles of the time display
+ * in the emulator, but it works fine on the watch.
+ *
+ * I'd like to make something for the low energy mode, but I haven't thought
+ * about how that might work, right now it just freezes in low energy mode
+ * until you press the 12-24HR button.
+ *
+ * There are no controls; it simply animates as long as the page is active.
  *
  */
 
+#include "movement.h"
+
 #define MAX_ILLUMINATED_SEGMENTS 16
 
 typedef struct {
index c72f709927ab10d591ca5e8a8d7c730279038eba..552ef4d861ec5b412bf6880cc9fb434988241c9f 100644 (file)
 #ifndef ACTIVITY_FACE_H_
 #define ACTIVITY_FACE_H_
 
-#include "movement.h"
-
 /*
- * ACTIVITY WATCH FACE
+ * ACTIVITY watch face
  *
  * The Activity face lets you record activities like you would do with a fitness watch.
  * It supports different activities like running, biking, rowing etc., and for each recorded activity
  * 
  * See the top of activity_face.c for some customization options. What you most likely want to do
  * is reduce the list of activities shown on the first screen to the ones you are regularly doing.
- * 
  */
 
+#include "movement.h"
+
 void activity_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
 void activity_face_activate(movement_settings_t *settings, void *context);
 bool activity_face_loop(movement_event_t event, movement_settings_t *settings, void *context);
index 3b7d1e35ee6602e60b2dec2c7f8d117687b35673..3cacc983b8e297f10cf38c3ed7e4688290b7151e 100644 (file)
@@ -22,8 +22,6 @@
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
 
 #include "watch_utility.h"
 #include "watch_private_display.h"
 
-/*
-    Implements 16 alarm slots on the sensor watch
-
-    Usage:
-    - In normal mode, the alarm button cycles through all 16 alarms. 
-    - Pressing the alarm button long in normal mode toggles the corresponding alarm on or off.
-      (Whereas pressing the alarm button extra long brings you back to alarm no. 1.)
-    - Pressing the light button enters setting mode and cycles through the settings of each alarm.
-      (Long pressing the light button enters setting mode without illuminating the led.)
-    - In setting mode an alarm slot is selected by pressing the alarm button when the slot number 
-      in the upper right corner is blinking.
-    - For each alarm slot, you can select the day. These are the day modes:
-        - ED = the alarm rings every day
-        - 1t = the alarm fires only one time and is erased afterwards
-        - MF = the alarm fires Mondays to Fridays
-        - WN = the alarm fires on weekends (Sa/Su)
-        - MO to SU = the alarm fires only on the given day of week
-    - You can fast cycle through hour or minute setting via long press of the alarm button.
-    - You can select the tone in which the alarm is played. (Three pitch levels available.)
-    - You can select how many "beep rounds" are played for each alarm. 1 to 9 rounds, plus extra 
-      long ('L') and extra short ('o') alarms.
-    - The simple watch face indicates if any alarm is set within the next 24h by showing the signal
-      indicator.
-*/
-
 typedef enum {
     alarm_setting_idx_alarm,
     alarm_setting_idx_day,
index dafbee5e2f623189ad33442f7fe077e3f3bf92d8..1c22948e75fe46f449ed10f7d83946eb3b59616e 100644 (file)
 #ifndef ALARM_FACE_H_
 #define ALARM_FACE_H_
 
-#include "movement.h"
-
 /*
-A face for setting various alarms
-*/
+ * ALARM face
+ *
+ * Implements up to 16 alarm slots on the sensor watch
+ *
+ * Usage:
+ *    - In normal mode, the alarm button cycles through all 16 alarms. 
+ *    - Pressing the alarm button long in normal mode toggles the corresponding alarm on or off.
+ *      (Whereas pressing the alarm button extra long brings you back to alarm no. 1.)
+ *    - Pressing the light button enters setting mode and cycles through the settings of each alarm.
+ *      (Long pressing the light button enters setting mode without illuminating the led.)
+ *    - In setting mode an alarm slot is selected by pressing the alarm button when the slot number 
+ *      in the upper right corner is blinking.
+ *    - For each alarm slot, you can select the day. These are the day modes:
+ *        - ED = the alarm rings every day
+ *        - 1t = the alarm fires only one time and is erased afterwards
+ *        - MF = the alarm fires Mondays to Fridays
+ *        - WN = the alarm fires on weekends (Sa/Su)
+ *        - MO to SU = the alarm fires only on the given day of week
+ *    - You can fast cycle through hour or minute setting via long press of the alarm button.
+ *    - You can select the tone in which the alarm is played. (Three pitch levels available.)
+ *    - You can select how many "beep rounds" are played for each alarm. 1 to 9 rounds, plus extra 
+ *      long ('L') and extra short ('o') alarms.
+ *    - The simple watch face indicates if any alarm is set within the next 24h by showing the signal
+ *      indicator.
+ */
+
+#include "movement.h"
 
 #define ALARM_ALARMS 16     // no of available alarm slots (be aware: only 4 bits reserved for this value in struct below)
 #define ALARM_DAY_STATES 11 // no of different day settings
index f956955bd101c5158aa2a7d502edf235a860d882..6ab22113105f6654455fa263753c87bc087df4ee 100644 (file)
 #ifndef ASTRONOMY_FACE_H_
 #define ASTRONOMY_FACE_H_
 
+/*
+ * ASTRONOMY face
+ *
+ * The Astronomy watch face is among the most complex watch faces in the
+ * Movement collection. It allows you to calculate the locations of celestial
+ * bodies in the sky, as well as distance in astronomical units (or, in the
+ * case of the Moon, distance in kilometers).
+ * 
+ * When you arrive at the Astronomy watch face, you’ll see its name (“Astro”)
+ * and an animation of two objects orbiting each other. You will also see “SO”
+ * (for Sol) flashing in the top left. The flashing letters indicate the
+ * currently selected celestial body. Short press Alarm to advance through
+ * the available celestial bodies:
+ * 
+ *     SO - Sol, the sun
+ *     ME - Mercury
+ *     VE - Venus
+ *     LU - Luna, the Earth’s moon
+ *     MA - Mars
+ *     JU - Jupiter
+ *     SA - Saturn
+ *     UR - Uranus
+ *     NE - Neptune
+ * 
+ * Once you’ve selected the celestial body whose parameters you wish to
+ * calculate, long press the Alarm button and release it. The letter “C” will
+ * flash while the calculation is performed.
+ * 
+ * When the calculation is complete, the screen will display the altitude
+ * (“aL”) of the celestial body. You can cycle through the available parameters
+ * with repeated short presses on the Alarm button:
+ * 
+ *     aL - Altitude (in degrees), the elevation over the horizon. If negative, it is below the horizon.
+ *     aZ - Azimuth (in degrees), the cardinal direction relative to true north.
+ *     rA - Right Ascension (in hours/minutes/seconds)
+ *     dE - Declination (in degrees/minutes/seconds)
+ *     di - Distance (the digits in the top right will display either aU for astronomical units, or K for kilometers)
+ * 
+ * Long press on the Alarm button to select another celestial body.
+ */
+
 #include "movement.h"
 #include "astrolib.h"
 
index e966ab1d6014c7aa2ffea199b04e03fef2b5f7ba..f453de646bcf29c4691ff2e70c194055524aefdf 100644 (file)
 #ifndef BLINKY_FACE_H_
 #define BLINKY_FACE_H_
 
+/*
+ * BLINKY LIGHT face
+ *
+ * The blinky light watch face was designed as a tutorial for making a watch
+ * face in Movement, but it actually might be useful to have a blinking light
+ * in a pinch.
+ *
+ * The screen displays the name of the watch face (”BL”), as well as an S at
+ * the top right for slow blink or an F for fast blink. The bottom line selects
+ * the color: green, red or yellow. You can change the speed of the blinking
+ * light by pressing the Alarm button, and change the color with the Light
+ * button. A long press on the Alarm button starts the blinking light, and
+ * another long press stops it.
+ *
+ * Note that this will chew through your battery! The green LED uses about
+ * 450µA at full brightness, which is 45 times the normal power consumption of
+ * the watch. The red LED is an order of magnitude less efficient (4500 µA),
+ * and the yellow setting lights both LEDs, which chews through nearly
+ * 5 milliamperes. This means that one hour of yellow blinking is likely to
+ * eat up between 2 and 3 percent of the battery’s usable life!
+ *
+ * Still, if you need to signal your location to someone in a dark forest,
+ * this watch face could come in handy. Just try to use the green LED as much
+ * as you can.
+ */
+
 #include "movement.h"
 
 typedef struct {
index 2ff947a2c6e392059e8d624e6127192b83087fbb..fd603f19dccebc4d8ae5fad75a5c59bad9b1c434 100644 (file)
 #ifndef BREATHING_FACE_H_
 #define BREATHING_FACE_H_
 
+/*
+ * BOXED BREATHING face
+ *
+ * Breathing is a complication for guiding boxed breathing sessions.
+ * Boxed breathing is a technique to help you stay calm and improve
+ * concentration in stressful situations.
+ *
+ * Usage: Timed messages will cycle as long as this face is active.
+ * Press ALARM to toggle sound.
+ */
+
 #include "movement.h"
 
 void breathing_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index aa23ddc6b23a05ef2946321789867579ba3ee83b..be04040e33b7584a3079652ec08bf17249294274 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
 #include "countdown_face.h"
 #include "watch.h"
 #include "watch_utility.h"
 
-/*
-    Slight extension of the original countdown face by Wesley Ellis.
-
-    - Press the light button to enter setting mode and adjust the
-      countdown timer.
-
-    - Start and pause the countdown using the alarm button, similar to the
-      stopwatch face.
-
-    - When paused or terminated, press the light button to restore the
-      last entered countdown.
-*/
-
 #define CD_SELECTIONS 3
 #define DEFAULT_MINUTES 3
 
index 12bb1d1e6b5ab37bf4161988b52c6c98d9a78323..1fe7c37e7592b2325ae4f4a57059f37b3d869d16 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #ifndef COUNTDOWN_FACE_H_
 #define COUNTDOWN_FACE_H_
 
-#include "movement.h"
-
 /*
-A countdown/timer face
-
-Max countdown is 23 hours, 59 minutes and 59 seconds.
-
-Note: we have to prevent the watch from going to deep sleep using
-movement_schedule_background_task() while the timer is running.
-*/
+ * COUNTDOWN TIMER face
+ *
+ * Slight extension of the original countdown face by Wesley Ellis.
+ *   - Press the light button to enter setting mode and adjust the
+ *     countdown timer.
+ *   - Start and pause the countdown using the alarm button, similar
+ *     to the stopwatch face.
+ *   - When paused or terminated, press the light button to restore the
+ *     last entered countdown.
+ *
+ * Max countdown is 23 hours, 59 minutes and 59 seconds.
+ *
+ * Note: we have to prevent the watch from going to deep sleep using
+ * movement_schedule_background_task() while the timer is running.
+ */
 
+#include "movement.h"
 
 typedef enum {
     cd_paused,
index 85f203e959950d51eb454efd9b9517e08aa9e1a8..3ac6a9b670bc2731e88651e853b5df4b4b0f441e 100644 (file)
 #ifndef COUNTER_FACE_H_
 #define COUNTER_FACE_H_
 
+/*
+ * COUNTER face
+ *
+ * Counter face is designed to count the number of running laps during exercises.
+ *
+ * Usage:
+ * Short-press ALARM to increment the counter (loops at 99)
+ * Long-press ALARM to reset the counter.
+ * Long-press LIGHT to toggle sound.
+ */
+
 #include "movement.h"
 
-// Counter face is designed to count the number of running laps during excercises.
 typedef struct {
     uint8_t counter_idx;
     bool beep_on;
index 9bc22da91646b53fea50fb445bb535e29179849a..8be54a66a85a18f788db93ee7e5c02a8230fadc1 100644 (file)
@@ -20,8 +20,6 @@
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- *
- * Displays some pre-defined data that you might want to remember. Math constants, birthdays, phone numbers...
  */
 
 #include <stdlib.h>
@@ -96,12 +94,8 @@ bool databank_face_loop(movement_event_t event, movement_settings_t *settings, v
         case EVENT_ACTIVATE:
              display();
         case EVENT_TICK:
-            // on activate and tick, if we are animating,
             break;
         case EVENT_LIGHT_BUTTON_UP:
-            // when the user presses 'light', we illuminate the LED. We could override this if
-            // our UI needed an additional button for input, consuming the light button press
-            // but not illuminating the LED.
             databank_state.current_word = (databank_state.current_word + max_words - 1) % max_words;
             display();
             break;
@@ -116,8 +110,6 @@ bool databank_face_loop(movement_event_t event, movement_settings_t *settings, v
             display();
             break;
         case EVENT_ALARM_BUTTON_UP:
-            // when the user presses 'alarm', we toggle the state of the animation. If animating,
-            // we stop; if stopped, we resume.
             databank_state.current_word = (databank_state.current_word + 1) % max_words;
             display();
             break;
index 1f204b2203cc1d3bb58eacba525ee6caa53931e4..3376cefaf0224ea265a455085b604e3ea11d1560 100644 (file)
 #ifndef DATABANK_FACE_H_
 #define DATABANK_FACE_H_
 
+/*
+ * DATABANK face
+ *
+ * Displays some pre-defined data that you might want to remember
+ * Math constants, birthdays, phone numbers...
+ *
+ * Usage: Edit the global variable `pi_data` in "databank_face.c"
+ * to the define the data that will be displayed. Each "item" contains
+ * a two-letter label (using the day-of-week display), then a longer
+ * string that will be displayed one "word" (six characters) at a time.
+ *
+ * Short-press ALARM to display the next word.
+ * Short-press LIGHT to display the previous word.
+ * Long-press ALARM to display the next item.
+ * Long-press LIGHT to display the previous item.
+ */
+
 #include "movement.h"
 
 void databank_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index ab8372bf995966ddc9c3a306d8d1587e8c943bb0..0beebd4b4f4bd8e4b8460600c50d2002856c23b5 100644 (file)
 #ifndef DAY_ONE_FACE_H_
 #define DAY_ONE_FACE_H_
 
-#include "movement.h"
+/*
+ * DAY ONE face
+ *
+ * This watch face displays the number of days since a given date.
+ * It was originally designed to display the number of days you’ve been alive,
+ * but technically it can count up from any date in the 20th century or the
+ * 21st century, so far.
+ *
+ * Long press on the Alarm button to enter customization mode. The text “YR”
+ * will appear, and will allow you to set the year starting from 1959. Press
+ * Alarm repeatedly to advance the year. If your birthday is before 1959,
+ * advance beyond the current year and it will wrap around to 1900.
+ *
+ * Once you have set the year, press Light to set the month (“MO”) and
+ * day (“DA”), advancing the value by pressing Alarm repeatedly.
+ *
+ * Note that at this time, the Day One face does not display the sleep
+ * indicator in sleep mode, which may make the watch appear to be
+ * unresponsive in sleep mode. You can still press the Alarm button to
+ * wake the watch. This UI quirk will be addressed in a future update.
+ */
 
-// The Day One face is designed to count upwards from the wearer's date of birth. It also functions as an
-// interface for setting the birth date register, which other watch faces can use for various purposes.
+#include "movement.h"
 
 typedef struct {
     uint8_t current_page;
index 0852bf1fd712466c311d52c4ca4508683ce92bea..7b5142ab4297bc9688cad2f11132c14f676a38e4 100644 (file)
@@ -1,7 +1,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "discgolf_face.h"
-#include "watch.h"                                              // Remember to change number of courses in this file
+#include "watch.h"          // Remember to change number of courses in this file
 #include "watch_utility.h"
 
 /* 
index 5e8068e036b330b9ce2ce809252208df7b5a0248..d168958ccbed04efc6340c597195038b8f5d3e18 100644 (file)
  * SOFTWARE.
  */
 
-/////////////////////////////////////////////////////////////////////////////////////
+#ifndef DISCGOLF_FACE_H_
+#define DISCGOLF_FACE_H_
 
-/* 
+/*
+ * DISC GOLF face
+ *
  * Keep track of scores in discgolf or golf!
  * The watch face operates in three different modes:
  *
  *  - dg_setting: Select a course
  *      Enter this mode by holding down the light button. The screen will display
- *      the label for the hole and the lowest score since last boot. 
- *      Press alarm to loop through the holes. Press the light button to make a 
+ *      the label for the hole and the lowest score since last boot.
+ *      Press alarm to loop through the holes. Press the light button to make a
  *      selection. This will reset all scores and start a new game in dg_idle mode.
  *
  *  -dg_idle: We're playing a hole
  *      This either shows your current score relative to par, or the score for a
- *      particular hole. 
+ *      particular hole.
  *      At the start of a game, press alarm to loop through the holes and leave it
  *      your starting hole. For optimal experience, play the course linearly after that
  *      If you're viewing the hole you're supposed to be playing, the watch face will
  *  -dg_scoring: Input score for a hole
  *      In this mode, if the score is 0 (hasn't been entered during this round),
  *      it will blink, indicating we're in scoring mode. Press the alarm button
- *      to increment the score up until 15, in which case it loops back to 0. 
+ *      to increment the score up until 15, in which case it loops back to 0.
  *      Press the light button to save the score for that hole, advance one hole
  *      if you're not editing an already input score, and returning to idle mode.
  *
- *  When all scores have been entered, the LAP indicator turns on. At that point, if we enter 
- *  dg_setting to select a course, the score for that round is evaluated against the current 
+ *  When all scores have been entered, the LAP indicator turns on. At that point, if we enter
+ *  dg_setting to select a course, the score for that round is evaluated against the current
  *  lowest score for that course, and saved if it is better.
 */
 
-
-#ifndef DISCGOLF_FACE_H_
-#define DISCGOLF_FACE_H_
-
 #include "movement.h"
 #define courses 11
 
@@ -75,7 +74,7 @@ typedef struct {
     uint8_t course;             // Index for course selection, from 0
     uint8_t hole;               // Index for current hole, from 1
     uint8_t playing;            // Current hole
-    int scores[18];             // Scores for each played hole    
+    int scores[18];             // Scores for each played hole
     discgolf_mode_t mode;       // Watch face mode
 } discgolf_state_t;
 
index d7c6cfa04b18e0f923713e0863d39260411092de..d1ac79359d885c86bd43e0f1c1a0331002c870d4 100644 (file)
 #ifndef DUAL_TIMER_FACE_H_
 #define DUAL_TIMER_FACE_H_
 
-#include "movement.h"
-
-/*
- * IMPORTANT: This watch face uses the same TC2 callback counter as the Stock Stopwatch
- * watch-face. It works through calling a global handler function. The two watch-faces
- * therefore can't coexist within the same firmware. If you want to compile this watch-face
- * then you need to remove the line <../watch_faces/complication/stock_stopwatch_face.c \>
- * from the Makefile.
- */
-
 /*
  * DUAL TIMER
  * ==========
  * the timers. In this case LONG PRESSING MODE will move to the next face instead of moving
  * back to the default watch face.
  *
+ * IMPORTANT: This watch face uses the same TC2 callback counter as the Stock Stopwatch
+ * watch-face. It works through calling a global handler function. The two watch-faces
+ * therefore can't coexist within the same firmware. If you want to compile this watch-face
+ * then you need to remove the line <../watch_faces/complication/stock_stopwatch_face.c \>
+ * from the Makefile.
  */
 
+#include "movement.h"
+
 typedef struct {
     uint8_t centiseconds : 7;  // 0-59
     uint8_t seconds : 6;  // 0-59
index 267501559f0292329bfacb6ac11685b187511307..8c0ef8d539665d2b6cdca7890535ba202c814b2b 100644 (file)
@@ -25,9 +25,9 @@
 #ifndef FLASHLIGHT_FACE_H_
 #define FLASHLIGHT_FACE_H_
 
-#include "movement.h"
-
 /*
+ * FLASHLIGHT face
+ *
  * A flashlight for use with the Flashlight sensor board.
  *
  * When the watch face appears, the display will show "FL" in the top two positions.
@@ -35,6 +35,8 @@
  *
  */
 
+#include "movement.h"
+
 typedef struct {
     // Anything you need to keep track of, put it here!
     uint8_t unused;
index 4a19ba856c2b84c02b0763180753bacabf8c6114..4710ae7ece5d4a9cc00acd580fb4427b1e64ee12 100644 (file)
 #ifndef GEOMANCY_FACE_H_
 #define GEOMANCY_FACE_H_
 
-#include "movement.h"
-
 /*
- * GEOMANCY WATCH FACE
+ * GEOMANCY watch face
  *
  * A simple and straightforward watch face for the ancient Eastern geomantic divination system
  * of I Ching and the western system of "Geomancy". It is an optional addition to the Toss Up
@@ -65,6 +63,8 @@
  * 
  */
 
+#include "movement.h"
+
 typedef struct {
     uint8_t bits : 4;
 } nibble_t;
index 80a4884f999d64cfbc43804d46914a214610ee1a..d4f43cf4cae420b536ec0cdf81b23e76303efd7a 100644 (file)
@@ -25,8 +25,6 @@
 #ifndef HABIT_FACE_H_
 #define HABIT_FACE_H_
 
-#include "movement.h"
-
 /*
  * Habit tracking face
  *
@@ -36,6 +34,8 @@
  *
  */
 
+#include "movement.h"
+
 void habit_face_setup(movement_settings_t *settings, uint8_t watch_face_index,
                       void **context_ptr);
 void habit_face_activate(movement_settings_t *settings, void *context);
index dabc6b1eefcdb0ad3f34d589d2e07ef63fa3921c..f4983236fc6ebf83a838f47b211674c5b51c283e 100644 (file)
@@ -22,8 +22,6 @@
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
 
 #include "watch_private_display.h"
 #include "watch_buzzer.h"
 
-/*
-    This face brings 9 customizable interval timers to the sensor watch,
-    to be used as hiit training device and/or for time management techniques.
-
-    - There are 9 interval timer slots, you can cycle through these with the
-      alarm button (short press). For each timer slot, a short "slideshow"
-      displaying the relevant details (like length of each phase - see below)
-      is shown.
-
-    - To start an interval timer, press and hold the alarm button.
-
-    - To pause a running timer, press the alarm button (short press).
-
-    - To completely abort a running timer, press and hold the alarm button.
-
-    - Press and hold the light button to enter settings mode for each interval
-      timer slot.
-
-    - Each interval timer has 1 to 4 phases of customizable length like so:
-      (1) prepare/warum up --> (2) work --> (3) break --> (4) cool down.
-      When setting up or running a timer, each of these phases is displayed by
-      the letters "PR" (prepare), "WO" (work), "BR" (break), "CD" (cool down).
-
-    - Each of these phases is optional, you can set the corresponding
-      minutes and seconds to zero. But at least one phase needs to be set, if
-      you want to use the timer.
-
-    - You can define the number of rounds either only for the work
-      phase and/or for the combination of work + break phase. Let's say you
-      want an interval timer that counts 3 rounds of 30 seconds work, 
-      followed by 20 seconds rest:
-            work 30s --> work 30s --> work 30s --> break 20s
-      You can do this by setting 30s for the "WO"rk phase and setting a 3
-      in the lower right hand corner of the work page. The "LAP" indicator
-      lights up at this position, to explain that we are setting laps here.
-      After that, set the "BR"eak phase to 20s and leave the rest as it is.
-
-    - If you want to set up a certain number of "full rounds", consisting
-      of work phase(s) plus breaks, you can do so at the "BR"eak page. The
-      number in the lower right hand corner determines the number of full
-      rounds to be counted. A "-" means, that there is no limit and the 
-      timer keeps alternating between work and break phases.
-
-    - This watch face comes with several pre-defined interval timers,
-      suitable for hiit training (timer slots 1 to 4) as well as doing
-      work according to the pomodoro principle (timer slots 5 to 6).
-      Feel free to adjust the timer slots to your own needs (or completely 
-      wipe them ;-)
-
-*/
-
 typedef enum {
     interval_setting_0_timer_idx,
     interval_setting_1_clear_yn,
index fa0a4280b0f3f05e59c2f73ffb37aabfe69821d2..7997585527be73bc01c6fcbcce252cfa89c0a206 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #ifndef INTERVAL_FACE_H_
 #define INTERVAL_FACE_H_
 
-#include "movement.h"
-
 /*
-A face for customizable interval timers
-*/
+ * INTERVAL TIMER face
+ *
+ * This face brings 9 customizable interval timers to the sensor watch,
+ * to be used as hiit training device and/or for time management techniques.
+ *
+ * - There are 9 interval timer slots, you can cycle through these with the
+ *   alarm button (short press). For each timer slot, a short "slideshow"
+ *   displaying the relevant details (like length of each phase - see below)
+ *   is shown.
+ *
+ * - To start an interval timer, press and hold the alarm button.
+ *
+ * - To pause a running timer, press the alarm button (short press).
+ *
+ * - To completely abort a running timer, press and hold the alarm button.
+ *
+ * - Press and hold the light button to enter settings mode for each interval
+ *   timer slot.
+ *
+ * - Each interval timer has 1 to 4 phases of customizable length like so:
+ *   (1) prepare/warum up --> (2) work --> (3) break --> (4) cool down.
+ *   When setting up or running a timer, each of these phases is displayed by
+ *   the letters "PR" (prepare), "WO" (work), "BR" (break), "CD" (cool down).
+ *
+ * - Each of these phases is optional, you can set the corresponding
+ *   minutes and seconds to zero. But at least one phase needs to be set, if
+ *   you want to use the timer.
+ *
+ * - You can define the number of rounds either only for the work
+ *   phase and/or for the combination of work + break phase. Let's say you
+ *   want an interval timer that counts 3 rounds of 30 seconds work, 
+ *   followed by 20 seconds rest:
+ *         work 30s --> work 30s --> work 30s --> break 20s
+ *   You can do this by setting 30s for the "WO"rk phase and setting a 3
+ *   in the lower right hand corner of the work page. The "LAP" indicator
+ *   lights up at this position, to explain that we are setting laps here.
+ *   After that, set the "BR"eak phase to 20s and leave the rest as it is.
+ *
+ * - If you want to set up a certain number of "full rounds", consisting
+ *   of work phase(s) plus breaks, you can do so at the "BR"eak page. The
+ *   number in the lower right hand corner determines the number of full
+ *   rounds to be counted. A "-" means, that there is no limit and the 
+ *   timer keeps alternating between work and break phases.
+ *
+ * - This watch face comes with several pre-defined interval timers,
+ *   suitable for hiit training (timer slots 1 to 4) as well as doing
+ *   work according to the pomodoro principle (timer slots 5 to 6).
+ *   Feel free to adjust the timer slots to your own needs (or completely 
+ *   wipe them ;-)
+ */
+
+#include "movement.h"
 
 #define INTERVAL_TIMERS 9     // no of available customizable timers (be aware: only 4 bits reserved for this value in struct below)
 
index 59126dd516d1e3c976dcce138580118f09ce7395..37e9188444a50a3e0fcd29c83385a258ce8d6421 100644 (file)
@@ -25,8 +25,6 @@
 #ifndef INVADERS_FACE_H_
 #define INVADERS_FACE_H_
 
-#include "movement.h"
-
 /*
  * Remake of the "famous" Casio Number Invaders Game
  *
@@ -60,6 +58,8 @@
  * 
  */
 
+#include "movement.h"
+
 typedef struct {
     uint16_t highscore;
     bool sound_on;
index 35d63183fa19015440fe15d6199095c59531e74c..9a64fcc7533d0443a227896488098a0e1c9413a1 100644 (file)
 #ifndef MOON_PHASE_FACE_H_
 #define MOON_PHASE_FACE_H_
 
+/*
+ * MOON PHASE face
+ *
+ * The Moon Phase face is similar to the Sunrise/Sunset face: it displays the
+ * current phase of the moon, along with the day of the month and a graphical
+ * representation of the moon on the top row.
+ * 
+ * This graphical representation is a bit abstract. The segments that turn on
+ * represent the shape of the moon, waxing from the bottom right and waning at
+ * the top left. A small crescent at the bottom right will grow into a larger
+ * crescent, then add lines in the center for a quarter and half moon. All
+ * segments are on during a full moon. Then gradually the segments at the
+ * bottom right will turn off, until all that remains is a small waning
+ * crescent at the top left.
+ * 
+ * All segments turn off during a new moon.
+ * 
+ * On this screen you may press the Alarm button repeatedly to move forward
+ * in time: the day of the month at the top right will advance by one day for
+ * each button press, and both the text and the graphical representation will
+ * display the moon phase for that day. Try pressing the Alarm button 27 times
+ * now, just to visualize what the moon will look like over the next month.
+ */
+
 #include "movement.h"
 
 typedef struct {
index ca03a1a9e688fefa925f86596068ff17456c0bcd..30118e2e8d366acc1095572a30c352b5bd4fc433 100644 (file)
  * SOFTWARE.
  */
 
-/*
-## Morse-code-based RPN calculator 
-
-The calculator is operated by first composing a **token** in Morse code, then submitting it to the calculator. A token specifies either a calculator operation or a float value.
-These two parts of the codebase are totally independent:
-
- 1. The Morse-code reader (`mc.h`, `mc.c`) 
- 2. The RPN calculator (`calc.h`, `calc.c`, `calc_fn.h`, `calc_fn.c`, `small_strtod.c`)
-
-The user interface (`morsecalc_face.h`, `morsecalc_face.c`) lets you talk to the RPN calculator through Morse code.
-
-## Controls
-
- - `light` is dash
- - `alarm` is dot
- - `mode` is "finish character"
- - long-press `mode` or submit a blank token to switch faces
- - long-press `alarm` to show stack
- - long-press `light` to toggle the light
-   
-## Morse code token entry
-As you enter `.`s and `-`s, the morse code char you've entered will appear in the top center digit.
-At the top right is the # of morse code `.`/`-` you've input so far. The character resets at the 6th `.`/`-`.
-Once you have the character you want to enter, push `mode` to enter it. 
-The character will be appended to the current token, whose 6 trailing chars are shown on the main display.
-Once you've typed in the token you want, enter a blank Morse code character and then push `mode`.
-This submits it to the calculator.
-   
-Special characters:
-
- - Backspace is `(` (`-.--.`). 
- - Clear token input without submitting to calculator is `Start transmission` (`-.-.-`).
-    
-## Writing commands
-First the calculator will try to interpret the token as a command/stack operation. 
-Commands are defined in `calc_dict[]` in `movement/lib/morsecalc/calc_fns.h`.
-If the command doesn't appear in the dictionary, the calculator tries to interpret the token as a number.
-## Writing numbers
-Numbers are written like floating point strings. 
-Entering a number pushes it to the top of the stack if there's room.
-This can get long, so for convenience numerals can also be written in binary with .- = 01.
-
-    0   1    2    3    4    5    6    7    8    9
-    .   -    -.   --   -..  -.-  --.  ---  -... -..-
-    e   t    n    m    d    k    g    o    b    x
-
- - Exponent signs must be entered as "p".
- - Decimal place "." can be entered as "h" (code ....)
- - Sign "-" can be entered as "Ch digraph" (code ----)
-For example: "4.2e-3" can be entered directly, or as "4h2pC3"
-  similarly, "0.0042" can also be entered as "eheedn"
-Once you submit a number to the watch face, it pushes it to the top of the stack if there's room.
-        
-## Number display
-After a command runs, the top of the stack is displayed in this format:
-   
-  - Main 4 digits = leading 4 digits
-  - Last 2 digits = exponent
-  - Top middle = [Stack location, Sign of number]
-  - Top right = [Stack exponent, Sign of exponent]
-  
-Blank sign digit means positive.
-So for example, the watch face might look like this:
-
-    [   0 -5]
-    [4200 03]
-
-... representing `+4.200e-3` is in stack location 0 (the top) and it's one of five items in the stack.
-
-## Looking at the stack
-To show the top of the stack, push and hold `light`/`alarm` or submit a blank token by pushing `mode` a bunch of times.
-To show the N-th stack item (0 through 9):
-
- - Put in the Morse code for N without pushing the mode button.
- - Push and hold `alarm`.
-    
-To show the memory register, use `m` instead of a number. 
-   
-To see all the calculator operations and their token aliases, see the `calc_dict[]` struct in `calc_fns.h` 
-*/
-
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
index 2ee186220d6d6f3bfaef65d82b86d740224c5855..4768cce762a6f56c5a3c8b0fa6715e593372857e 100644 (file)
 #ifndef MORSECALC_FACE_H_
 #define MORSECALC_FACE_H_
 
+/*
+ * MORSECALC face
+ * Morse-code-based RPN calculator
+ *
+ * The calculator is operated by first composing a **token** in Morse code,
+ * then submitting it to the calculator. A token specifies either a calculator
+ * operation or a float value.
+ *
+ * These two parts of the codebase are totally independent:
+ *  1. The Morse-code reader (`mc.h`, `mc.c`)
+ *  2. The RPN calculator (`calc.h`, `calc.c`, `calc_fn.h`, `calc_fn.c`, `small_strtod.c`)
+ *
+ * The user interface (`morsecalc_face.h`, `morsecalc_face.c`) lets you talk
+ * to the RPN calculator through Morse code.
+ *
+ * ## Controls
+ *  - `light` is dash
+ *  - `alarm` is dot
+ *  - `mode` is "finish character"
+ *  - long-press `mode` or submit a blank token to switch faces
+ *  - long-press `alarm` to show stack
+ *  - long-press `light` to toggle the light
+ *
+ * ## Morse code token entry
+ * As you enter `.`s and `-`s, the morse code char you've entered will
+ * appear in the top center digit. At the top right is the # of morse code
+ * `.`/`-` you've input so far. The character resets at the 6th `.`/`-`.
+ *
+ * Once you have the character you want to enter, push `mode` to enter it.
+ *
+ * The character will be appended to the current token, whose 6 trailing
+ * chars are shown on the main display. Once you've typed in the token you
+ * want, enter a blank Morse code character and then push `mode`.
+ * This submits it to the calculator.
+ *
+ * Special characters:
+ *  - Backspace is `(` (`-.--.`).
+ *  - Clear token input without submitting to calculator is `Start
+ *    transmission` (`-.-.-`).
+ *
+ * ## Writing commands
+ * First the calculator will try to interpret the token as a command/stack operation.
+ * Commands are defined in `calc_dict[]` in `movement/lib/morsecalc/calc_fns.h`.
+ * If the command doesn't appear in the dictionary, the calculator tries to interpret the token as a number.
+ *
+ * ## Writing numbers
+ * Numbers are written like floating point strings.
+ * Entering a number pushes it to the top of the stack if there's room.
+ * This can get long, so for convenience numerals can also be written in binary with .- = 01.
+ *
+ *     0   1    2    3    4    5    6    7    8    9
+ *     .   -    -.   --   -..  -.-  --.  ---  -... -..-
+ *     e   t    n    m    d    k    g    o    b    x
+ *
+ *  - Exponent signs must be entered as "p".
+ *  - Decimal place "." can be entered as "h" (code ....)
+ *  - Sign "-" can be entered as "Ch digraph" (code ----)
+ *
+ * For example: "4.2e-3" can be entered directly, or as "4h2pC3"
+ *   similarly, "0.0042" can also be entered as "eheedn"
+ * Once you submit a number to the watch face, it pushes it to the top of the stack if there's room.
+ *
+ * ## Number display
+ * After a command runs, the top of the stack is displayed in this format:
+ *
+ *   - Main 4 digits = leading 4 digits
+ *   - Last 2 digits = exponent
+ *   - Top middle = [Stack location, Sign of number]
+ *   - Top right = [Stack exponent, Sign of exponent]
+ *
+ * Blank sign digit means positive.
+ * So for example, the watch face might look like this:
+ *
+ *     [   0 -5]
+ *     [4200 03]
+ *
+ * ... representing `+4.200e-3` is in stack location 0 (the top) and it's one of five items in the stack.
+ *
+ * ## Looking at the stack
+ * To show the top of the stack, push and hold `light`/`alarm` or submit a blank token by pushing `mode` a bunch of times.
+ * To show the N-th stack item (0 through 9):
+ *
+ *  - Put in the Morse code for N without pushing the mode button.
+ *  - Push and hold `alarm`.
+ *
+ * To show the memory register, use `m` instead of a number.
+ *
+ * To see all the calculator operations and their token aliases, see the `calc_dict[]` struct in `calc_fns.h`
+ */
+
 #define MORSECALC_TOKEN_LEN 32
 #define MORSECODE_LEN 5
 
 /*
  * MC International Morse Code binary tree
  * Levels of the tree are concatenated.
- * '.' = 0 and '-' = 1. 
+ * '.' = 0 and '-' = 1.
  *
  * Capitals denote special characters:
  * C = Ch digraph
index b533960cf060146de85d9c5fc79b7acdac513531..42fdf81f56e01a4d3444eda3ed69537051b24779 100644 (file)
@@ -20,7 +20,6 @@
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- *
  */
 
 #include <stdlib.h>
index 98060d9703c9cf640ea914eb3549e257768ae405..a416afd09c8dd3ba565c5ab427d4074548e02f11 100644 (file)
 #ifndef ORRERY_FACE_H_
 #define ORRERY_FACE_H_
 
+/*
+ * ORRERY face
+ *
+ * The Orrery watch face is similar to the Astronomy watch face in that it
+ * calculates properties of the planets, but instead of calculating their
+ * positions in the sky, this watch face calculates their absolute locations
+ * in the solar system. This is only useful if you want to plot the planets
+ * on graph paper, but hey, you never know!
+ * 
+ * The controls are identical to the Astronomy watch face: while the title
+ * screen (“Orrery”) is displayed, you can advance through the available
+ * planets with repeated short presses on the Alarm button. The available
+ * planets:
+ * 
+ *     ME - Mercury
+ *     VE - Venus
+ *     EA - Earth
+ *     LU - Luna, the Earth’s moon
+ *     MA - Mars
+ *     JU - Jupiter
+ *     SA - Saturn
+ *     UR - Uranus
+ *     NE - Neptune
+ * 
+ * Note that the sun is not available in this menu, as the sun is always at
+ * (0,0,0) in this calculation.
+ * 
+ * Long press on the Alarm button to calculate the planet’s location, and
+ * after a flashing “C” (for Calculating), you will be presented with the
+ * planet’s X coordinate in astronomical units. Short press Alarm to cycle
+ * through the X, Y and Z coordinates, and then long press Alarm to return
+ * to planet selection.
+ * 
+ * The large numbers represent the whole number part, and the two smaller
+ * numbers (in the seconds place) represent the decimal portion. So if you
+ * see “SA X 736” and “SA Y -662”, you can read that as an X coordinate of
+ * 7.36 AU and a Y coordinate of -6.62 AU. You can literally draw a dot at
+ * (0, 0) to represent the sun, and a dot at (7.36, -6.62) to represent
+ * Saturn. (The Z coordinates tend to be pretty close to zero, as the
+ * planets largely orbit on a single plane, the ecliptic.)
+ */
+
 #include "movement.h"
 
 typedef enum {
index 53237df2e5c6b220781caf57c4ffdbf47f9ebd47..dfa6801e9388315edd66e2140fafb03532aa187b 100644 (file)
 #ifndef planetary_hours_face_H_
 #define planetary_hours_face_H_
 
-#include "movement.h"
-#include "sunrise_sunset_face.h"
-
 /*
- * BACKGROUND
-
+ * PLANETARY HOURS face
+ * 
+ * Background
+ *
  * Both the 24 hour day and the order of our weekdays have quite esoteric roots.
  * The ancient Egyptians divided the day up into 12 hours of sunlight and 12 hours
  * of night time. Obviously the length of these hours varied throughout the year.
@@ -74,6 +73,9 @@
  * watch face to work properly!)
  */
 
+#include "movement.h"
+#include "sunrise_sunset_face.h"
+
 typedef struct {
     // Anything you need to keep track of, put it here!
     uint32_t planetary_hours[24];
index 0ecc11afb17ae4e32c36ac39ae2f900f99f44f8b..b7e8e807851aebf433c9f2daeb7f244728be88f6 100644 (file)
 #ifndef planetary_time_face_H_
 #define planetary_time_face_H_
 
-#include "movement.h"
-#include "sunrise_sunset_face.h"
-
 /*
+ * PLANETARY TIME face
+ *
  * BACKGROUND
-
+ *
  * Both the 24 hour day and the order of our weekdays have quite esoteric roots.
  * The ancient Egyptians divided the day up into 12 hours of sunlight and 12 hours
  * of night time. Obviously the length of these hours varied throughout the year.
@@ -77,6 +76,9 @@
  * watch face to work properly!)
  */
 
+#include "movement.h"
+#include "sunrise_sunset_face.h"
+
 typedef struct {
     // Anything you need to keep track of, put it here!
     uint32_t phase_start;
index c6d3638f7bf251f5785ab89f64a8b166109993c7..b2530640efd5df91ca7bf81c5c7fea9cbe5f1775 100644 (file)
 #ifndef PROBABILITY_FACE_H_
 #define PROBABILITY_FACE_H_
 
+/*
+ * PROBABILITY face
+ *
+ * This face is a dice-rolling random number generator.
+ * Supports dice with 2, 4, 6, 8, 10, 12, 20, or 100 sides.
+ *
+ * Press LIGHT to cycle through die type.
+ * The current die size is indicated on the left ("C" for 100)
+ *
+ * Press ALARM to roll the selected die.
+ */
+
 #include "movement.h"
 
 typedef struct {
index 600201e9cb633c77a0f1f8d658cd1051fd802c5b..288b62c47d0274ad80ad24f88a434e39b79f9985 100644 (file)
 #ifndef PULSOMETER_FACE_H_
 #define PULSOMETER_FACE_H_
 
+/*
+ * PULSOMETER face
+ *
+ * The Pulsometer is an implementation of a sort of a classic mechanical
+ * watch complication. A classic pulsometer complication involves a
+ * chronograph with a scale calibrated for counting a certain number of
+ * heartbeats (often 30). You start it and begin counting heartbeats, and
+ * stop it after counting the specified number of beats. Once stopped,
+ * the needle will point to your heart rate.
+ * 
+ * The pulsometer on Sensor Watch flashes its instructions at launch:
+ * “Hold Alarm + count 30 beats.” Using the hand on the side where you wear
+ * your watch, touch your carotid artery (in your neck) and feel for your
+ * pulse. Once you find it, use your other hand to press and hold the Alarm
+ * button, and count your heartbeats. When you reach 30 beats, release the
+ * Alarm button. The display will show a number such as “60 bpm”; this is
+ * your heart rate in beats per minute.
+ * 
+ * Two notes:
+ *  o For the first few seconds of a measurement, the display will read “Hi”.
+ *    This indicates that it’s too early for the measured value to be a valid
+ *    heart rate. Once the measurement is below 240 bpm, the display will update.
+ *  o If you hold the button down for more than 45 seconds, the display will
+ *    read “Lo”. If it took this long for you to count 30 heartbeats, this
+ *    indicates that your heart rate is below 40 beats per minute.
+ */
+
 #include "movement.h"
 
 typedef struct {
index fabde798994f29ab89059e3397ad75c598a29f6f..2f18d45a79aeb6a41591114fd0b415ae6a58271b 100644 (file)
 #ifndef RANDONAUT_FACE_H_
 #define RANDONAUT_FACE_H_
 
-#include "movement.h"
-#include "place_face.h"
-
 /*
- * RANDONAUT FACE
+ * RANDONAUT face
  * ==============
  *
  * Randonauting is a way to turn the world around you into an adventure and get the user outside 
@@ -71,6 +68,9 @@
  * 
  */
 
+#include "movement.h"
+#include "place_face.h"
+
 typedef struct {
     uint8_t mode :3;
     uint8_t location_format :3;
index a1f184990f51a4449ac5fd0002e458b83a7e047c..4b10c0f92d1f91a5f2d13391e415ef45ddaf34fa 100644 (file)
 #ifndef RATEMETER_FACE_H_
 #define RATEMETER_FACE_H_
 
+/*
+ * RATE METER face
+ *
+ * The rate meter shows the rate per minute at which the ALARM button is
+ * being pressed. This is particularly useful in sports where cadence
+ * tracking is useful. For instance, rowing coaches often use a dedicated
+ * rate meter - clicking the rate button each time the crew puts their oars
+ * in the water to see the rate (strokes per minute) on the rate meter.
+ */
+
 #include "movement.h"
 
 typedef struct {
index e48efe834c76959fe342657867a59bf4a32c512f..4a191b7e7f7b11aa4ef025c795dec14ca31c0f95 100644 (file)
  * SOFTWARE.
  */
 
-/* RPN Calculator alternate face.
- *
- * Operations appear in the 'day' section; ALARM changes between operations when operation is flashing.
- * LIGHT executes current operation.
- *
- * This is the alternate face because it has a non-traditional number entry system which
- * I call 'guess a number'. In number entry mode, the watch tries to guess which number you
- * want, and you respond with 'smaller' (left - MODE) or larger (right - ALARM). This means
- * that when you _are_ entering a number, MODE will no longer move between faces!
- *
- * Example of entering the number 27
- *  - select the NO operation (probably unnecessary, as this is the default),
- *    and execute it by hitting LIGHT.
- *  - you are now in number entry mode; you know this because nothing is flashing.
- *  - Watch displays 10; you hit ALARM to say you want a larger number.
- *  - Watch displays 100; you hit MODE to say you want a smaller number.
- *  - Continuing: 50 -> MODE -> 30 -> MODE -> 20 -> ALARM -> 27
- *  - Hit LIGHT to add the number to the stack (and now 'NO' is flashing
- *    again, indicating you're back in operation selection mode).
- *
- * One other thing to watch out for is how quickly it will switch into scientific notation
- * due to the limitations of the display when you have large numbers or non-integer values.
- * In this mode, the 'colon' serves at the decimal point, and the numbers in the top right
- * are the exponent.
- *
- * As with the main movement firmware, this has the concept of 'secondary' functions which
- * you can jump to by a long hold of ALARM on NO. These are functions to do with stack
- * manipulation (pop, swap, dupe, clear, size (le)). If you're _not_ on NO, a long
- * hold will take you back to it.
- *
- * See 'functions' below for names of all operations.
- */
-
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
index 2a964675287e56adaf855f42fff4ce432d272c3d..bb4fd7d0a1c6153797afea0eee6e199f11e6d998 100644 (file)
 #ifndef CALCULATOR_FACE_H_
 #define CALCULATOR_FACE_H_
 
+/* 
+ * RPN Calculator alternate face.
+ *
+ * Operations appear in the 'day' section; ALARM changes between operations when
+ * operation is flashing. LIGHT executes current operation.
+ *
+ * This is the alternate face because it has a non-traditional number entry system which
+ * I call 'guess a number'. In number entry mode, the watch tries to guess which number you
+ * want, and you respond with 'smaller' (left - MODE) or larger (right - ALARM). This means
+ * that when you _are_ entering a number, MODE will no longer move between faces!
+ *
+ * Example of entering the number 27
+ *  - select the NO operation (probably unnecessary, as this is the default),
+ *    and execute it by hitting LIGHT.
+ *  - you are now in number entry mode; you know this because nothing is flashing.
+ *  - Watch displays 10; you hit ALARM to say you want a larger number.
+ *  - Watch displays 100; you hit MODE to say you want a smaller number.
+ *  - Continuing: 50 -> MODE -> 30 -> MODE -> 20 -> ALARM -> 27
+ *  - Hit LIGHT to add the number to the stack (and now 'NO' is flashing
+ *    again, indicating you're back in operation selection mode).
+ *
+ * One other thing to watch out for is how quickly it will switch into scientific notation
+ * due to the limitations of the display when you have large numbers or non-integer values.
+ * In this mode, the 'colon' serves at the decimal point, and the numbers in the top right
+ * are the exponent.
+ *
+ * As with the main movement firmware, this has the concept of 'secondary' functions which
+ * you can jump to by a long hold of ALARM on NO. These are functions to do with stack
+ * manipulation (pop, swap, dupe, clear, size (le)). If you're _not_ on NO, a long
+ * hold will take you back to it.
+ *
+ * See 'functions' in "rpn_calculator_alt_face.c" for names of all operations.
+ */
+
 #include "movement.h"
 
 #define CALC_MAX_STACK_SIZE 20
index b47eeea20ba9a88e6d1eec8418c020a94dc3e649..57b59a27decd5bb39c1c09ee383796eafd05966a 100644 (file)
 #ifndef RPN_CALCULATOR_FACE_H_
 #define RPN_CALCULATOR_FACE_H_
 
+/*
+ * RPN CALCULATOR face
+ *
+ * A calculator face using reverse polish notation (RPN).
+ *
+ * For usage instructions, please refer to the wiki:
+ * https://www.sensorwatch.net/docs/watchfaces/complication/#rpn-calculator
+ */
+
 #include "movement.h"
 
 #define RPN_CALCULATOR_STACK_SIZE 4
index 748c4f551e51d758312eb447de287ad945c4fc55..a6c13fe8621357b711c06859cd647f90031accac 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
 #include "sailing_face.h"
 #include "watch.h"
 #include "watch_utility.h"
 
-/*
-
-Implements a sailing timer.
-
-Usage:
-
-Waiting mode: Light button enters settings, alarm button starts the timer (sailing mode).
-
-Sailing mode:
-Alarm button switches to next programmed start signal, long press on light button
-resets timer and enters waiting mode. Countdown to zero, then switch to counting mode.
-
-Counting mode:
-After the start signal (0s), the duration of the race is counted (like a stopwatch timer).
-Alarm button increases the lap counter, alarm long press resets lap counter.
-Long press on light button resets timer and enters waiting mode.
-
-Setting mode:
-Alarm button increases active (blinking) signal. Goes to 0 if upper boundary
-(11 or whatever the signal left to the active one is set to) is met.
-10 is printed vertically (letter o plus top segment).
-Alarm button long press resets to default minutes (5-4-1-0).
-Light button cycles through the signals.
-Long press on light button cycles through sound modes:
-- Bell indicator: Sound at start (0s) only.
-- Signal indicator: Sound at each programmed signal and at start.
-- Bell+Signal: Sound at each minute, at 30s and at 10s countdown.
-- No indicator: No sound.
-
-*/
-
 #define sl_SELECTIONS 6
 #define DEFAULT_MINUTES { 5,4,1,0,0,0 }
 
index 0f9fd9daa38ba8582f3d7ca67078e295c732b626..5546f27550d4db8c53753ec8e3f55e6c00618f8c 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #ifndef SAILING_FACE_H_
 #define SAILING_FACE_H_
 
-#include "movement.h"
-
 /*
-A sailing sailing/timer face
-*/
+ * SAILING face
+ * Implements a sailing timer.
+ *
+ * Usage:
+ *
+ * Waiting mode:
+ * LIGHT button enters settings
+ * ALARM button starts the timer (sailing mode).
+ *
+ * Sailing mode:
+ * ALARM button switches to next programmed start signal.
+ * Long press on LIGHT button resets timer and enters waiting mode.
+ * Countdown to zero, then switch to counting mode.
+ *
+ * Counting mode:
+ * After the start signal (0s), the duration of the race is counted (like a stopwatch timer).
+ * ALARM button increases the lap counter, ALARM long press resets lap counter.
+ * Long press on LIGHT button resets timer and enters waiting mode.
+ *
+ * Setting mode:
+ * ALARM button increases active (blinking) signal. Goes to 0 if upper boundary
+ * (11 or whatever the signal left to the active one is set to) is met.
+ * 10 is printed vertically (letter o plus top segment).
+ * ALARM button long press resets to default minutes (5-4-1-0).
+ * LIGHT button cycles through the signals.
+ * Long press on LIGHT button cycles through sound modes:
+ * - Bell indicator: Sound at start (0s) only.
+ * - Signal indicator: Sound at each programmed signal and at start.
+ * - Bell+Signal: Sound at each minute, at 30s and at 10s countdown.
+ * - No indicator: No sound.
+ */
 
+#include "movement.h"
 
 typedef enum {
     sl_waiting,
index dd37731700a31525b05e0a5f62d65e3ecc3792b3..3a04b9384d2c1d823396bded952de48e683d16c8 100644 (file)
@@ -25,9 +25,8 @@
 #ifndef SHIPS_BELL_FACE_H_
 #define SHIPS_BELL_FACE_H_
 
-#include "movement.h"
-
 /*
+ * SHIP'S BELL face
  * A ship's bell complication.
  *
  * See: https://en.wikipedia.org/wiki/Ship%27s_bell#Simpler_system
@@ -45,6 +44,8 @@
  *   - long press Alarm button: Cycle through the watches (All/1/2/3)
  */
 
+#include "movement.h"
+
 typedef struct {
     bool bell_enabled;
     uint8_t on_watch;
index d8880df7c0c13647cee7e005582a29bd98ded7c6..6796a8499a4328ae738785df150c0bc5cad4a6ca 100644 (file)
 #ifndef STOCK_STOPWATCH_FACE_H_
 #define STOCK_STOPWATCH_FACE_H_
 
-#include "movement.h"
+/*
+ * STOCK STOPWATCH face
+ *
+ * The Stock Stopwatch face implements the original F-91W stopwatch
+ * functionality, including counting hundredths of seconds and lap timing.
+ *
+ * Use the ALARM button to start and stop the stopwatch.
+ * Press the LIGHT button while the stopwatch is running to view the lap time.
+ *  (The stopwatch continues running in the background, indicated by a blinking colon.)
+ * Press the LIGHT button again to switch back to the running stopwatch.
+ * Press the LIGHT button when the timekeeping is stopped to reset the stopwatch.
+ *
+ * There are two improvements compared to the original F-91W:
+ *  o When the stopwatch reaches 59:59, the counter does not simply jump back
+ *    to zero but keeps track of hours in the upper right-hand corner
+ *    (up to 24 hours).
+ *  o Long-press the light button to toggle the LED behavior.
+ *    It either turns on with each button press or remains off.
+ *
+ * NOTE:
+ * This watch face relies heavily on static vars in stock_stopwatch.c.
+ * The disadvantage is that you cannot use more than one instance of this
+ * watch face on your custom firmware - but then again, who would want that?
+ * The advantage is that accessing vars is more direct and faster, and we
+ * can save some precious cpu cycles.  :-)
+ */
 
-// This watch face relies heavily on static vars in stock_stopwatch.c.
-// The disadvantage is that you cannot use more than one instance of this watch face on
-// your custom firmware - but then again, who would want that? The advantage is that accessing
-// vars is more direct and faster, and we can save some precious cpu cycles  :-) 
+#include "movement.h"
 
 typedef struct {
     bool light_on_button;   // determines whether the light button actually triggers the led
index a30c7fb65a3f1d55f1e4629a4684222e2a68561f..7bdf19c6528264b4b636b848c5a7cd9bc3d42dc4 100644 (file)
 #ifndef STOPWATCH_FACE_H_
 #define STOPWATCH_FACE_H_
 
+/*
+ * STOPWATCH FACE
+ *
+ * The Stopwatch face provides basic stopwatch functionality: you can start
+ * and stop the stopwatch with the alarm button. Pressing the light button
+ * when the timer is stopped resets it.
+ *
+ * This face does not count sub-seconds.
+ * See also: "stock_stopwatch_face.h"
+ */
+
 #include "movement.h"
 
 typedef struct {
index d3f287923780efbbec89d2f26921193b75a5856e..16e65b73e207967cf15fd06777a04eece63235f1 100644 (file)
 #ifndef SUNRISE_SUNSET_FACE_H_
 #define SUNRISE_SUNSET_FACE_H_
 
-#include "movement.h"
+/*
+ * SUNRISE & SUNSET FACE
+ *
+ * The Sunrise/Sunset face is designed to display the next sunrise or sunset
+ * for a given location. It also functions as an interface for setting the
+ * location register, which other watch faces can use for various purposes.
+ *
+ * Refer to the wiki for usage instructions:
+ *  https://www.sensorwatch.net/docs/watchfaces/complication/#sunrisesunset
+ */
 
-// The Sunrise/Sunset face is designed to display the next sunrise or sunset for a given location.
-// TODO: It also functions as an interface for setting the location register, which other watch faces can use for various purposes.
+#include "movement.h"
 
 typedef struct {
     uint8_t sign: 1;    // 0-1
index 1889b40ecac9f927e19ff1d4023e556d03c4fba0..3b23525f9a3e7b0c34c694b8f6dd2f529a76499a 100644 (file)
 #ifndef TACHYMETER_FACE_H_
 #define TACHYMETER_FACE_H_
 
+/*
+ * TACHYMETER face
+ *
+ * The Tachymeter complication emulates the tachymeter function often
+ * present in watches, that computes the average speed in [units per hour]
+ * for a given distance given in [units].
+ *
+ * Use case:
+ *     User sets the distance
+ *     User starts the tachymeter when the trip begins
+ *     User stops the tachymeter when the trip ends
+ *     The watch presents the average speed and trip duration in seconds
+ * 
+ * Usage:
+ *     Go to tachymeter face, TC is shown in the Weekday Digits
+ *     A steady d in the Day Digits indicates the distance to be used.
+ *         To edit the distance:
+ *         Long-press the Alarm button, the distance edition page (d will blink)
+ *         Use the Light button to change the editing (blinking) digit, and press Alarm to increase its value
+ *         Once done, long-press the Alarm button to exit the distance edition page
+ *     Press the Alarm button to start the tachymeter.
+ *         A running animation will appear in the Day Digits
+ *     Press the Alarm button to stop the tachymeter
+ *     The average speed and total time information will alternate.
+ *         The average speed will be shown alongside /h in the Day Digits;
+ *         and the total time will be shown alongside t in the Day Digits.
+ *     Long press the Light button to return to the distance d page,
+ *         and restart the tachymeter from there.
+ *     Long-press the light button in the steady distance page to reset
+ *         the distance to 1.00
+ * 
+ * Pending design points
+ * o movement_request_tick_frequency(4) is used to obtain a 4Hz ticking, thus
+ *   having a time resolution of 250 ms. Not sure if using event.subsecond`
+ *   is the proper way to get the fractions of second for the start and
+ *   final times.
+ * o For distance and average speed, the Second Digits (position 8 and 9)
+ *   can be seen as decimals, thus possible to show distances as short as
+ *   0.01 km (or miles) and speeds as low as 0.01 km/h (or mph). However,
+ *   if the same idea is used for the total time (showing hundredths),
+ *   this limits the display to 9999.99 seconds (~2h:45m).
+ */
+
 #include "movement.h"
 
 typedef struct {
index 6584e87d61279c35c7487c8390b19481fa82f603..8096592ae334b41e773c7ebf529f8278aaf7dbc4 100644 (file)
 #ifndef TALLY_FACE_H_
 #define TALLY_FACE_H_
 
-#include "movement.h"
+/*
+ * TALLY face
+ *
+ * Tally face is designed to act as a tally counter.
+ * Based on the counter_face watch face by Shogo Okamoto.
+ *
+ * To advance the counter, press the ALARM button.
+ * To reset, long press the ALARM button.
+ */
 
-// Tally face is designed to act as a tally counter.
-// Based on the counter_face watch face by Shogo Okamoto.
-// To advance the counter, press the Alarm button. To reset, long press the Alarm button.
+#include "movement.h"
 
 typedef struct {
     uint32_t tally_idx;
index 9dfe8b3dac5f1e0a2c84e7cbd6b88ad51ba988d0..b48a7ae969fef57051138a963a337a2b4e6d4224 100644 (file)
 #ifndef TAROT_FACE_H_
 #define TAROT_FACE_H_
 
-#include "movement.h"
-
 /*
- * Tarot card watch face
+ * TAROT CARD watch face
  *
  * Draw from a deck of tarot cards. Can choose between major arcana only or
  * entire deck.
@@ -62,6 +60,8 @@
  * - Light button (long press): go back to Draw screen, for choosing different draw parameters.
  */
 
+#include "movement.h"
+
 #define MAX_CARDS_TO_DRAW 10
 
 typedef struct {
index 53b027d9677fe78065e81dcd0b3feff2df80af6b..6c6d1bd90623817b0c19554e967e8feba440597a 100644 (file)
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- *
- * Gathers temperature statistics in a chart form. Statistics bins are per hour / per 0.5°C.
- * Saved to file every day at 00:00. Can help improve watch precision in the future. 
- * If you can gather statistics over few months, and then send tempchart.ini to 3@14.by - it 
- * will help future generations of precision quartz watches. 
  */
 
 #include <stdlib.h>
index ce870c8fe3f685fb3fd950cead3435aaffcdf55f..3c9a389fbfe44d1b7066873751330a8b7d32580a 100644 (file)
 #ifndef TEMPCHART_FACE_H_
 #define TEMPCHART_FACE_H_
 
+/*
+ * TEMPERATURE CHART face
+ *
+ * Gathers temperature statistics in a chart form.
+ * Statistics bins are per hour / per 0.5°C.
+ *
+ * Saved to file every day at 00:00.
+ * Can help improve watch precision in the future. 
+ *
+ * If you can gather statistics over few months, and then send "tempchart.ini"
+ * to "3@14.by", it will help future generations of precision quartz watches.
+ */
+
 #include "movement.h"
 
 void tempchart_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 0ed7fd2864d2a101194ba06d6955de360fa3f46c..805fd198e9af87d85856dbd4eb6d2e24bd92f624 100644 (file)
@@ -25,9 +25,9 @@
 #ifndef TIME_LEFT_FACE_H_
 #define TIME_LEFT_FACE_H_
 
-#include "movement.h"
-
 /*
+ * TIME LEFT face
+ *
  * The Time Left Face helps you to visualize how far you have proceeded in a certain
  * time span. Much like the Day One Face, you can set your beginning date. In addition
  * to that, you also set your target or destination date. You can then use the face
@@ -65,6 +65,8 @@
  * 
  */
 
+#include "movement.h"
+
 typedef struct {
     uint8_t current_page;
     uint16_t current_year;
index 8bf7cf99e0646c00ea9cd93903f38c454913a693..29392d694152e9f4845a949252ffb8d971730fe7 100644 (file)
@@ -22,8 +22,6 @@
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
 #include "timer_face.h"
index 5f035cb3c2eb2685af951f12e8843c3ee2b3ced9..3302f125dcee69ec499f8aff0f769b7c1ebdef31 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #ifndef TIMER_FACE_H_
 #define TIMER_FACE_H_
 
-#include "movement.h"
-
 /*
+ * TIMER face
  * Advanced timer/countdown face with pre-set timer lengths
  * 
  * This watch face provides the functionality of starting a countdown by choosing 
@@ -53,6 +50,8 @@
  * 
  */
 
+#include "movement.h"
+
 #define TIMER_SLOTS 9           // offer 9 timer slots
 
 typedef enum {
index 5404ad115a8015e52741b56bc4c09e42407daed3..33a086c6c59a9d2b0e11ae90a25da30555e513d3 100644 (file)
 #ifndef TOMATO_FACE_H_
 #define TOMATO_FACE_H_
 
+/*
+ * TOMATO TIMER face
+ *
+ * Add a "tomato" timer watch face that alternates between 25 and 5 minute
+ * timers as in the Pomodoro Technique.
+ *  https://en.wikipedia.org/wiki/Pomodoro_Technique
+ *
+ * The top right letter shows mode (f for focus or b for break).
+ * The bottom right shows how many focus sessions you've completed.
+ * (You can reset the count with a long press of alarm)
+ *
+ * When you show up and it says 25 minutes, you can start it (alarm),
+ *  switch to 5 minute (light) mode or leave (mode).
+ *
+ * When it's running you can reset (alarm), or leave (mode).
+ *
+ * When it's done, we beep and go back to step 1, changing switching
+ *  mode from focus to break (or break to focus)
+ */
+
 #include "movement.h"
 
 typedef enum {
index ca6136a75c0f805b534ab6574c947e0eff4286ac..cff340965f9a1f4c34afb56a1a9cc1f8f14345ca 100644 (file)
 #ifndef TOSS_UP_FACE_H_
 #define TOSS_UP_FACE_H_
 
-#include "movement.h"
-
 /*
- * TOSS UP FACE
+ * TOSS UP face
  * ============
  *
  * Playful watch face for games of chance or divination using coins or dice.
@@ -75,6 +73,8 @@
  *
  */
 
+#include "movement.h"
+
 typedef struct {
     // Anything you need to keep track of, put it here!
     uint32_t entropy;
index a65501872946344d8df45907c7daa744f22dc1dd..242820d79a07dcc6420b34c326fac87d17174231 100644 (file)
@@ -1,3 +1,27 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2022 Wesley Ellis (https://github.com/tahnok)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #include <stdlib.h>
 #include <string.h>
 #include "totp_face.h"
@@ -5,15 +29,6 @@
 #include "watch_utility.h"
 #include "TOTP.h"
 
-// Use https://cryptii.com/pipes/base32-to-hex to convert base32 to hex
-// Use https://github.com/susam/mintotp to generate test codes for verification
-// Available algorothms:
-// SHA1 (most TOTP codes use this)
-// SHA224
-// SHA256
-// SHA384
-// SHA512
-
 ////////////////////////////////////////////////////////////////////////////////
 // Enter your TOTP key data below
 static const uint8_t num_keys = 2;
index cff519191436882e9f6afca67c01c0abc863493f..1248f716ed844df28075c457c16eab34277f5cd4 100644 (file)
@@ -1,6 +1,58 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2022 Wesley Ellis (https://github.com/tahnok)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #ifndef TOTP_FACE_H_
 #define TOTP_FACE_H_
 
+/*
+ * TOTP face
+ * Time-based one-time password (TOTP) generator
+ *
+ * Generate one-time passwords often used for two-factor authentication.
+ * The secret key must be set by hand, by editing "totp_face.c".
+ *
+ * Available algorithms:
+ *  o SHA1 (most TOTP codes use this)
+ *  o SHA224
+ *  o SHA256
+ *  o SHA384
+ *  o SHA512
+ *
+ * Instructions:
+ *  o Find your secret key(s) and convert them to the required format.
+ *      o Use https://cryptii.com/pipes/base32-to-hex to convert base32 to hex
+ *      o Use https://github.com/susam/mintotp to generate test codes for verification
+ *  o Edit global variables in "totp_face.c" to configure your stored keys:
+ *      o "keys", "key_sizes", "timesteps", and "algorithms" set the
+ *        cryptographic parameters for each secret key.
+ *      o "labels" sets the two-letter label for each key
+ *        (This replaces the day-of-week indicator)
+ *      o Once finished, remove the two provided examples.
+ *
+ * If you have more than one secret key, press ALARM to cycle through them.
+ */
+
 #include "movement.h"
 
 typedef struct {
index d52d8629fed61cdb8ba478c7a74acbf4c6a4a07d..4066ac48f366ffe6d465fbd5a4abc142d20f6430 100644 (file)
@@ -1,3 +1,27 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2022 Wesley Ellis (https://github.com/tahnok)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
 
 #include "totp_face_lfs.h"
 
-/* Reads from a file totp_uris.txt where each line is what's in a QR code:
- * e.g.
- *   otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
- *   otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30
- * This is also the same as what Aegis exports in plain-text format.
- *
- * Minimal sanitisation of input, however.
- *
- * At the moment, to get the records onto the filesystem, start a serial connection and do:
- *   echo otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example > totp_uris.txt
- *   echo otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30 >> totp_uris.txt
- * (note the double >> in the second one)
- *
- * You may want to customise the characters that appear to identify the 2FA code. These are just the first two characters of the issuer,
- * and it's fine to modify the URI.
- */
-
-
 #define MAX_TOTP_RECORDS 20
 #define MAX_TOTP_SECRET_SIZE 48
 #define TOTP_FILE "totp_uris.txt"
index 0f388bc3da826f6ca2e7b5d13a3fe3b40a904558..64c6ce1545ae21c1b902feb59482e32283152982 100644 (file)
@@ -1,6 +1,54 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2022 Wesley Ellis (https://github.com/tahnok)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
 #ifndef TOTP_FACE_LFS_H_
 #define TOTP_FACE_LFS_H_
 
+/*
+ * TOTP-LFS face
+ * Time-based one-time password (TOTP) generator using LFS
+ *
+ * Reads from a file "totp_uris.txt", containing a single secret key in a
+ * series of URLs. Each line is what's in a QR code, e.g.:
+ *   otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
+ *   otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30
+ *
+ * This is also the same as what Aegis exports in plain-text format.
+ * This face performs minimal sanitisation of input, however.
+ *
+ * At the moment, to get the records onto the filesystem, start a serial connection and do:
+ *   echo otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example > totp_uris.txt
+ *   echo otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30 >> totp_uris.txt
+ * (note the double >> in the second one)
+ *
+ * You may want to customise the characters that appear to identify the 2FA
+ * code. These are just the first two characters of the issuer, and it's fine
+ * to modify the URI.
+ *
+ * If you have more than one secret key, press ALARM to cycle through them.
+ */
+
 #include "movement.h"
 
 typedef struct {
index 5c5f86be5aac01fad5364df405fd922856c5a802..6fa801fa9cc09c618d7b48c9ef3d2898e6a3a8fd 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #include <stdlib.h>
 #include <string.h>
-// #include <threads.h>
-
 #include "wake_face.h"
 #include "watch.h"
 #include "watch_utility.h"
 
-/*
-    UI Notes
-    º Light advances hour by 1
-    º Light long press advances hour by 6
-    º Alarm advances minute by 10
-    º Alarm long press cycles through signal modes (just one at the moment)
-*/
-
 //
 // Private
 //
index c091c8f385ea27818ef415e5da28a27bcceb8669..b4a25a9cc3ce752bffa03a4f2f2ad162dc35575e 100644 (file)
  * SOFTWARE.
  */
 
-//-----------------------------------------------------------------------------
-
 #ifndef WAKE_FACE_H_
 #define WAKE_FACE_H_
 
+/*
+ * WAKE daily alarm face
+ *
+ * Basic daily alarm clock face. Seems useful if nothing else in the interest
+ * of feature parity with the F-91W’s OEM module, 593.
+ *
+ * Also experiments with caret-free UI: One button cycles hours, the other
+ * minutes, so there’s no toggling between display and adjust modes and no
+ * cycling the caret through the UI.
+ *   º LIGHT advances hour by 1
+ *   º LIGHT long press advances hour by 6
+ *   º ALARM advances minute by 10
+ *   º ALARM long press cycles through signal modes (just one at the moment)
+ */
+
 #include "movement.h"
 
 typedef struct {
index 82627aed497ce47ad18d792a6e551c7f57383f57..2fac26ad52cfd4f3ed34060229aad8a9d8613336 100644 (file)
 #ifndef CHARACTER_SET_FACE_H_
 #define CHARACTER_SET_FACE_H_
 
+/*
+ * CHARACTER SET FACE
+ *
+ * This watch face displays all of the characters in the Sensor Watch character
+ * set. You can advance from one character to the next with a short press of the
+ * ALARM button.
+ *
+ * This watch face may be useful to watch face developers, in that it can help
+ * them to understand which characters will work in different positions.
+ */
+
 #include "movement.h"
 
 void character_set_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 2d34107a3e94f6ae60c088e1b1f1f04621125a0b..90a6133b17b1340e3b082f2470348f2ee6cf2a9f 100644 (file)
@@ -25,8 +25,6 @@
 #ifndef CHIRPY_DEMO_FACE_H_
 #define CHIRPY_DEMO_FACE_H_
 
-#include "movement.h"
-
 /*
  * CHIRPY DEMO FACE
  * 
  * 
  * To record and decode a chirpy transmission on your computer, you can use the web app here:
  * https://jealousmarkup.xyz/off/chirpy/rx/
- * 
  */
 
+#include "movement.h"
+
 void chirpy_demo_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
 void chirpy_demo_face_activate(movement_settings_t *settings, void *context);
 bool chirpy_demo_face_loop(movement_event_t event, movement_settings_t *settings, void *context);
index 026e0d10caafa4c6a96814a7a8b7065996a76c95..669f3872f4de05d8b1c3f3842520b7d2731a12cc 100644 (file)
 #ifndef DEMO_FACE_H_
 #define DEMO_FACE_H_
 
+/*
+ * DEMO FACE
+ *
+ * This watch was designed for the Crowd Supply marketing team, so they could
+ * photograph the various functions of Sensor Watch. The Alarm button advances
+ * through static screens that simulate different watch faces.
+ *
+ * This watch face may only be useful to you if you need to photograph Sensor
+ * Watch, i.e. for a blog post.
+ */
+
 #include "movement.h"
 
 void demo_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 52c4e621809939ac46703bdeeebe4d189a26e7dd..0b9c435d909d5e4078c4edfe6ba14380bdc4e23e 100644 (file)
 #ifndef FREQUENCY_CORRECTION_FACE_H_
 #define FREQUENCY_CORRECTION_FACE_H_
 
+/*
+ * FREQUENCY CORRECTION FACE
+ *
+ * While active, this face generates a square-wave on pin A1 of the 9-pin
+ * connector. The output frequency is adjustable from 64 Hz to 0.5 Hz.
+ * Long-press ALARM to cycle through available frequencies.
+ *
+ * This face also displays the value of the watch's frequency-correction
+ * register. This setting varies from -127 to +127. Press LIGHT to increment
+ * or ALARM to decrement the setting.
+ */
+
 #include "movement.h"
 
 typedef struct {
index 1140bb20069bd648ff9d7a681f8a06f714cab1a1..dc76f5f5298af8b9d5a579fd71d7bf53036d37c6 100644 (file)
 #ifndef HELLO_THERE_FACE_H_
 #define HELLO_THERE_FACE_H_
 
+/*
+ * HELLO THERE FACE
+ *
+ * A simple demo that displays the word "Hello" and then the word "there",
+ * on an endless loop. Press ALARM to pause or resume the animation.
+ */
+
 #include "movement.h"
 
 typedef struct {
index f6ea85e758d8afe64ef54f8cf2c8a50f029c61e7..ad3251843f1e3ad5ec064a2d41a4deff43541aea 100644 (file)
 #ifndef LIS2DW_LOGGING_FACE_H_
 #define LIS2DW_LOGGING_FACE_H_
 
+/*
+ * LIS2DW Accelerometer Data Logger
+ *
+ * This is an experimental watch face for logging data on the “Sensor Watch
+ * Motion Express” board. I will add more documentation for this watch face
+ * once this sensor board is more widely available.
+ */
+
 #include "movement.h"
 #include "watch.h"
 
index dc5e631b89dd207ec3007366d5c50eff7192bcb3..59d0f9ead624d553480cf42f918458ddc23428b9 100644 (file)
 #ifndef VOLTAGE_FACE_H_
 #define VOLTAGE_FACE_H_
 
+/*
+ * VOLTAGE face
+ *
+ * This watch face is very simple and has no controls to speak of. It displays
+ * the battery voltage as measured by the SAM L22’s ADC.
+ *
+ * Note that the Simple Clock watch face includes a low battery warning, so you
+ * don’t technically need to this watch face unless you want to track the
+ * battery level.
+ */
+
 #include "movement.h"
 
 void voltage_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 9cea8095fc04421a08ad1fa6ae2932cd28d47afa..946639daf0d2ee51f51a2c630f8cced9855c8425 100644 (file)
 #ifndef ACCELEROMETER_DATA_ACQUISITION_FACE_H_
 #define ACCELEROMETER_DATA_ACQUISITION_FACE_H_
 
+/*
+ * ACCELEROMETER DATA ACQUISITION
+ *
+ * TODO: Add description here, including controls.
+ */
+
 #include "movement.h"
 
 #define ACCELEROMETER_DATA_ACQUISITION_INVALID ((uint64_t)(0b11))   // all bits are 1 when the flash is erased
index 861e28d843d6f81e37b5a9c6b8fa776566c67936..9fb489a280ad452205d57d663b21ae520f15f337 100644 (file)
  * SOFTWARE.
  */
 
-/* Aperture-priority Light Meter Face
- *
- * Tested with the "Q3Q-SWAB-A1-00 Temperature + Test Points + OPT3001" flexboard.
- * This flexboard could use a revision: 
- *
- *  - The thermistor components should be moved west a mm or flipped to the backside
- *    to avoid stressing the flexboard against the processor so much.
- *  - The 'no connect' pad falls off easily.
- *
- * Controls:
- *
- *  - Trigger a measurement by long-pressing Alarm.
- *    Sensor integration is happening when the Signal indicator is on.
- *
- *  - ISO setting can be cycled by long-pressing Light.
- *    During integration the current ISO setting will be displayed. 
- *
- *  - EV measurement in the top right: "LAP" indicates "half stop". 
- *    So "LAP -1" means EV = -1.5. Likewise "LAP 13" means EV = +13.5  
- *
- *  - Aperture in the bottom right: the last 3 main digits are the f-stop. 
- *    Adjust this number in half-stop increments using Alarm = +1/2 and Light = -1/2. 
- *
- *  - Best shutter speed in the bottom left: the first 3 digits are the shutter speed. 
- *    Some special chars are needed here: "-" = seconds, "h" = extra half second, "K" = thousands.
- *    "HI" or "LO" if there's no shutter in the dictionary within 0.5 stops of correct exposure.
- *
- *  - Mode long-press changes the main digits to show raw sensor lux measurements.
- *
- */
-
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
index 2f8813f415cbf4c821255c123a4583b0d9d8edae..affae2e431566e08b227531fe2101a3704e56d4d 100644 (file)
 #ifndef LIGHTMETER_FACE_H_
 #define LIGHTMETER_FACE_H_
 
+/*
+ * Aperture-priority Light Meter Face
+ *
+ * Tested with the "Q3Q-SWAB-A1-00 Temperature + Test Points + OPT3001" flexboard.
+ * This flexboard could use a revision: 
+ *
+ *  - The thermistor components should be moved west a mm or flipped to the backside
+ *    to avoid stressing the flexboard against the processor so much.
+ *  - The 'no connect' pad falls off easily.
+ *
+ * Controls:
+ *
+ *  - Trigger a measurement by long-pressing Alarm.
+ *    Sensor integration is happening when the Signal indicator is on.
+ *
+ *  - ISO setting can be cycled by long-pressing Light.
+ *    During integration the current ISO setting will be displayed. 
+ *
+ *  - EV measurement in the top right: "LAP" indicates "half stop". 
+ *    So "LAP -1" means EV = -1.5. Likewise "LAP 13" means EV = +13.5  
+ *
+ *  - Aperture in the bottom right: the last 3 main digits are the f-stop. 
+ *    Adjust this number in half-stop increments using Alarm = +1/2 and Light = -1/2. 
+ *
+ *  - Best shutter speed in the bottom left: the first 3 digits are the shutter speed. 
+ *    Some special chars are needed here: "-" = seconds, "h" = extra half second, "K" = thousands.
+ *    "HI" or "LO" if there's no shutter in the dictionary within 0.5 stops of correct exposure.
+ *
+ *  - Mode long-press changes the main digits to show raw sensor lux measurements.
+ */
+
 #include "movement.h"
 #include "opt3001.h"
 
index 4ba593ec30fbacf74ce0b0bd04d2cc03c9dc482e..0debfbf43bd77094085698c584dfef34a136d1ac 100644 (file)
 #ifndef THERMISTOR_LOGGING_FACE_H_
 #define THERMISTOR_LOGGING_FACE_H_
 
+/*
+ * THERMISTOR LOGGING (aka Temperature Log)
+ *
+ * This watch face automatically logs the temperature once an hour, and
+ * maintains a 36-hour log of readings. This watch face is admittedly rather
+ * complex, and bears some explanation.
+ *
+ * The main display shows the letters “TL” in the top left, indicating the
+ * name of the watch face. At the top right, it displays the index of the
+ * reading; 0 represents the most recent reading taken, 1 represents one
+ * hour earlier, etc. The bottom line in this mode displays the logged
+ * temperature.
+ *
+ * A short press of the “Alarm” button advances to the next oldest reading;
+ * you will see the number at the top right advance from 0 to 1 to 2, all
+ * the way to 35, the oldest reading available.
+ *
+ * A short press of the “Light” button will briefly display the timestamp
+ * of the reading. The letters at the top left will display the word “At”,
+ * and the main line will display the timestamp of the currently displayed
+ * data point. The number in the top right will display the day of the month
+ * for the given data point; for example, you can read “At 22 3:00 PM” as
+ * ”At 3:00 PM on the 22nd”.
+ *
+ * If you need to illuminate the LED to read the data point, long press the
+ * Light button and release it.
+ */
+
 #include "movement.h"
 #include "watch.h"
 
index 7361164e0cf309da7358f1f089d4d14b2bf33970..10cdcc1940dde2a71691427580715f7cf843e617 100644 (file)
 #ifndef THERMISTOR_READOUT_FACE_H_
 #define THERMISTOR_READOUT_FACE_H_
 
+/*
+ * THERMISTOR READOUT (aka Temperature Display)
+ *
+ * This watch face is designed to work with either the Temperature + GPIO
+ * sensor board or the Temperature + Light sensor board. It reads the current
+ * temperature from the thermistor voltage divider on the sensor board, and
+ * displays the current temperature in degrees Celsius.
+ *
+ * When the watch is on your wrist, your body heat interferes with an ambient
+ * temperature reading, but if you set it on a bedside table, strap it to your
+ * bike handlebars or place it outside of your tent while camping, this watch
+ * face can act as a digital thermometer for displaying ambient conditions.
+ *
+ * The temperature sensor watch face automatically samples the temperature
+ * once every five seconds, and it illuminates the Signal indicator just
+ * before taking a reading.
+ *
+ * Pressing the ALARM button toggles the unit display from Celsius to
+ * Fahrenheit. Technically this sets the global “Metric / Imperial” flag, so
+ * any other watch face that displays localizable units will display them in
+ * the system selected here.
+ */
+
 #include "movement.h"
 
 void thermistor_readout_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 2910fbd9a367193169d7519a6776bc4b92a5c2dc..10addc0493836f68066e378fc8968aff0c8cc6c3 100644 (file)
 #include "thermistor_driver.h"
 #include "watch.h"
 
-// This watch face is designed for testing temperature sensor boards.
-// It displays temperature readings at a relatively fast rate of 8 Hz,
-// and disables low energy mode so my testing device doesn't sleep.
-// You more than likely want to use thermistor_readout_face instead.
-
 static void _thermistor_testing_face_update_display(bool in_fahrenheit) {
     thermistor_driver_enable();
     float temperature_c = thermistor_driver_get_temperature();
index 656f58d55c23b654f32a2bc03e2d80d054ecd547..9721484a11ef6463525269807b8aa8ab0a1e515d 100644 (file)
 #ifndef THERMISTOR_TESTING_FACE_H_
 #define THERMISTOR_TESTING_FACE_H_
 
+/*
+ * THERMISTOR TESTING FACE
+ *
+ * This watch face is designed for testing temperature sensor boards.
+ * It displays temperature readings at a relatively fast rate of 8 Hz,
+ * and disables low energy mode so my testing device doesn't sleep.
+ * You more than likely want to use thermistor_readout_face instead.
+ *
+ * Press ALARM to toggle display of metric vs. imperial units.
+ */
+
 #include "movement.h"
 
 void thermistor_testing_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index 3b326b931c650c3a29ec22c0c36e42742af3afbe..67680ed95ad97d3e1c53e1a2f404f59543ffbcd7 100644 (file)
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- *
- * FineTune face allows to align watch with sub-second precision in 25/250ms accuracy.
- * Counts time since previous finetune, and allows to calculate & apply ppm correction for nanosec.
- *
- * Main screen - adjust delay (light/alarm)
- * Long mode press - show hours since previous finetune
- * Long mode press - show calculated ppm correction. You can apply it with long light, or just reset finetune timer with long alarm.
- *
- * Finetune will apply crystal aging correction on every finetune save (as aging is calculated since "last finetune" timestamp) - but you should worry
- * about aging only on second/third years of watch calibration (if you are really looking at less than 10 seconds per year of error).
- *
- * Warning, do not use at the first second of a month, as you might stay at the same month and it will surprise you.
- * Just wait 1 second...We are not fully replicating RTC timer behavior when RTC is off.
- * Simulating months and years is... too much complexity.
- *
  */
 
 #include <stdlib.h>
index 6a80bf2b900cd29c6785af51647e376c4082e3ce..95ac570521ae838a1074d0948b55b683a2014b13 100644 (file)
 #ifndef FINETUNE_FACE_H_
 #define FINETUNE_FACE_H_
 
+/*
+ * FINETUNE face
+ *
+ * FineTune face allows to align watch with sub-second precision in 25/250ms
+ * accuracy. Counts time since previous finetune, and allows to calculate &
+ * apply ppm correction for nanosec.
+ *
+ * Best used in conjunction with the NANOSEC face.
+ *
+ * Main screen - adjust delay (light/alarm)
+ * Long MODE press - show hours since previous finetune
+ * Long MODE press - show calculated ppm correction.
+ *  You can apply it with long LIGHT, or just reset finetune timer with long ALARM.
+ *
+ * Finetune will apply crystal aging correction on every finetune save
+ * (as aging is calculated since "last finetune" timestamp); but you should
+ * worry about aging only on second/third years of watch calibration (if you
+ * are really looking at less than 10 seconds per year of error).
+ *
+ * Warning, do not use at the first second of a month, as you might stay at
+ * the same month and it will surprise you. Just wait 1 second...We are not
+ * fully replicating RTC timer behavior when RTC is off.
+ * Simulating months and years is... too much complexity.
+ *
+ * For full usage instructions, please refer to the wiki:
+ *  https://www.sensorwatch.net/docs/watchfaces/nanosec/
+ */
+
 #include "movement.h"
 
 typedef struct {
index b9655c1d0a8cfd1243a421b0023b868becf226ed..72fdb7292c601ee327a9c22ee8e26be749689aa3 100644 (file)
  * SOFTWARE.
  */
 
-/*
- * The goal of nanosec face is dramatic improvement of SensorWatch accuracy.
- * Minimum goal is <60 seconds of error per year. Full success is if we can reach <15 seconds per year (<0.47ppm error).
- *
- * It implements temperature correction using tempco from datasheet (and allows to adjust these)
- * and allows to introduce offset fix. Therefore requires temperature sensor board.
- *
- * Most users will need to apply profile 3 ("default") or 2("conservative datasheet"), and tune first parameter -
- * static offset (as it's different for every crystal sample).
- *
- * Frequency correction is dithered over 31 correction intervals (31x10 minutes or ~5 hours), to allow <0.1ppm correction resolution.
- * 1ppm is 0.0864 sec per day.
- * 0.1ppm is 0.00864 sec per day.
- *
- * To stay under 1ppm error you would need calibration of your specific instance of quartz crystal after some "burn-in" (ideally 1 year).
- *
- * Should improve TOTP experience.
- *
- * Default funing fork tempco: -0.034 ppm/°C², centered around 25°C
- * We add optional cubic coefficient, which was measured in practice on my sample.
- *
- * Cadence (CD) - how many minutes between corrections. Default 10 minutes.
- * Every minute might be too much. Every hour - slightly less power consumption but also less precision.
- *
- * Can compensate crystal aging (ppm/year) - but you really should be worrying about it on second/third years of watch calibration. *
- */
-
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
index 044275afb0528f08afe591afee4a7254713cbfbe..545eed29fd58fc2c906708acf35ca3d4858166c9 100644 (file)
 #ifndef NANOSEC_FACE_H_
 #define NANOSEC_FACE_H_
 
+/*
+ * NANOSEC face
+ *
+ * The goal of nanosec face is dramatic improvement of SensorWatch accuracy.
+ * Minimum goal is <60 seconds of error per year. Full success is if we can
+ * reach <15 seconds per year (<0.47ppm error).
+ *
+ * Best used in conjunction with the FINETUNE face.
+ *
+ * It implements temperature correction using tempco from datasheet (and
+ * allows to adjust these) and allows to introduce offset fix. Therefore
+ * requires temperature sensor board.
+ *
+ * Most users will need to apply profile 3 ("default") or 2 ("conservative
+ * datasheet"), and tune first parameter "static offset" (as it's different
+ * for every crystal sample).
+ *
+ * Frequency correction is dithered over 31 correction intervals (31x10
+ * minutes or ~5 hours), to allow <0.1ppm correction resolution.
+ *  * 1ppm is 0.0864 sec per day.
+ *  * 0.1ppm is 0.00864 sec per day.
+ *
+ * To stay under 1ppm error you would need calibration of your specific
+ * instance of quartz crystal after some "burn-in" (ideally 1 year).
+ *
+ * Should improve TOTP experience.
+ *
+ * Default funing fork tempco: -0.034 ppm/°C², centered around 25°C
+ * We add optional cubic coefficient, which was measured in practice on my sample.
+ *
+ * Cadence (CD) - how many minutes between corrections. Default 10 minutes.
+ * Every minute might be too much. Every hour - slightly less power
+ * consumption but also less precision.
+ *
+ * Can compensate crystal aging (ppm/year) - but you really should be worrying
+ * about it on second/third years of watch calibration.
+ *
+ * For full usage instructions, please refer to the wiki:
+ *  https://www.sensorwatch.net/docs/watchfaces/nanosec/
+ */
+
 #include "movement.h"
 
 #define nanosec_profile_count 5
index b178bfd26c0a4e9072152159617c3bbd9c33025c..c8f36d75ea0245638592519b3ba295eb99dd4ca6 100644 (file)
 #ifndef PREFERENCES_FACE_H_
 #define PREFERENCES_FACE_H_
 
+/*
+ * PREFERENCES face
+ *
+ * The Preferences watch face allows you to configure various options on your
+ * Sensor Watch. Like all other screens, you advance the field you’re setting
+ * with the Light button, and advance its value with the Alarm button. The
+ * Preferences watch face labels each setting with a two-letter code on the
+ * top row; the following list describes each setting and their options:
+ *
+ *  CL - Clock mode.
+ *      This setting allows you to select a 12-or 24-hour clock display. All
+ *      watch faces that support displaying the time will respect this setting;
+ *      for example, both Simple Clock, World Clock and Sunrise/Sunset will
+ *      display the time in 24 hour format if the 24 hour clock is selected here.
+ *
+ *  BT - Button tone.
+ *      This setting is only relevant if you installed the buzzer connector,
+ *      and it toggles the beep when changing modes. If Y, the buzzer will
+ *      sound a tone when Mode is pressed. Change to N to make the Mode
+ *      button silent.
+ *
+ *  TO - Timeout.
+ *      Sets the time until screens that time out (like Settings and Time Set)
+ *      snap back to the first screen. 60 seconds is a good default for the
+ *      stock firmware, but if you choose a custom firmware with faces that
+ *      you’d like to keep on screen for longer, you can set that here.
+ *
+ *  LE - Low Energy mode.
+ *      Sets the time until the watch enters its low energy sleep mode.
+ *      Options range from 1 hour to 7 days, or Never. The more often Sensor
+ *      Watch goes to sleep, the longer its battery will last — but you will
+ *      lose the seconds indicator while it is asleep. This setting allows
+ *      you to make a tradeoff between the device’s responsiveness and its
+ *      longevity.
+ *
+ *  LT - Light.
+ *      This setting has three screens.
+ *      The first lets you choose how long the LED should stay lit when the
+ *       LIGHT button is pressed. Options are 1 second, 3 seconds and 5
+ *       seconds, or “No LED” to disable the LED entirely.
+ *      The second screen, titled “blu” or “grn”, sets the intensity of the
+ *       blue or green LED depending on the target Sensor Board hardware.
+ *       Values range from 0 (off) to 15 (full intensity).
+ *      The third screen, “red”, sets the intensity of the red LED, again
+ *       from 0 to 15.
+ *      On the last two screens, the LED remains on so that you can see the
+ *      effect of mixing the two LED colors. On the Special Edition boards,
+ *      you’ll have red, blue and a variety of shades of pink and purple to
+ *      experiment with!
+ */
+
 #include "movement.h"
 
 void preferences_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index c86b6376827a396fdaf8b925ff597fb58c3e9770..f66dc9e42a14a3635c04ae5982aab73c4e9f62b7 100644 (file)
 #ifndef SET_TIME_FACE_H_
 #define SET_TIME_FACE_H_
 
+/*
+ * SET TIME face
+ *
+ * The default method for adjusting Sensor Watch time.
+ *
+ * The Time Set watch face allows you to set the time on Sensor Watch. Use
+ * the LIGHT button to advance through the field you are setting, and the
+ * ALARM button to change the value in that field. The fields are, in order:
+ * Hour, Minute, Second, Year, Month, Day and Time Zone.
+ *
+ * For features like World Clock and Sunrise/Sunset to work correctly, you
+ * must set the time to your local time, and the time zone to your local time
+ * zone. This allows Sensor Watch to correctly offset the time. This also
+ * means that when daylight savings time starts or ends, you must update
+ * both the time and the time zone on this screen.
+ */
+
 #include "movement.h"
 
 void set_time_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);
index c65e2ffc0fe47fcbabc07e810aa2d63a66735c22..fbe8cbb14ac1638b6d8fd4aa84f2b6e877064fa5 100644 (file)
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
- * 
- * 
- * 
- * This is an extended version of set_time face which allow setting seconds precisely.
- * To achieve that - press and hold alarm button few seconds before 00 and release exaclty as reference clock turns 00.
- * All settings can go up, or down (long alarm press).
- * 
- * The challenge is that SensorWatch display is delayed 0.5 seconds vs hardware RTC clock. It is caused by interrupts being generated by raising
- * edge of counter. It means there is no way to precisely trigger at 0.5s, as events at different frequencies slightly mismatch. 
- * This watch face achieves this approximately by triggering at 15th out of 32Hz events.
- * 
- * If you are <30 seconds when setting seconds - you will stay in the same minute. Otherwise - you will go to next minute. 
- * 
- * Note that changing anything will slightly delay subseconds counter. This is why this face sets seconds last 
- * to achiveve best precision. Still, best possible precision is achieved with finetune face. 
  */
 
 #include <stdlib.h>
index 6d82066062c85f8468d872249fcf464b9bca74e2..41b91ac4f98d1565c9fe9934401d27a0c32ed8e5 100644 (file)
 #ifndef SET_TIME_HACKWATCH_FACE_H_
 #define SET_TIME_HACKWATCH_FACE_H_
 
+/*
+ * SET TIME HACKWATCH
+ *
+ * This is an extended version of set_time face which allow setting seconds
+ * precisely. To achieve that - press and hold alarm button few seconds before
+ * 00 and release exaclty as reference clock turns 00.
+ *
+ * All settings can go up, or down (long alarm press).
+ * 
+ * The challenge is that SensorWatch display is delayed 0.5 seconds vs hardware
+ * RTC clock. It is caused by interrupts being generated by raising edge of
+ * counter. It means there is no way to precisely trigger at 0.5s, as events
+ * at different frequencies slightly mismatch. This watch face achieves this
+ * approximately by triggering at 15th out of 32Hz events.
+ * 
+ * If you are <30 seconds when setting seconds - you will stay in the same
+ * minute. Otherwise - you will go to next minute. 
+ * 
+ * Note that changing anything will slightly delay subseconds counter. This
+ * is why this face sets seconds last to achiveve best precision. Still,
+ * best possible precision is achieved with finetune face. 
+ */
+
 #include "movement.h"
 
 void set_time_hackwatch_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);