]> git.earman.xyz Git - sensor-watch.git/commitdiff
Added fast cycle
authorDavid Volovskiy <devolov@gmail.com>
Thu, 15 Aug 2024 12:56:49 +0000 (08:56 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Tue, 3 Sep 2024 20:08:12 +0000 (16:08 -0400)
movement/watch_faces/complication/wordle_face.c

index 62141cba20f89676e61b560e88fd7b4b0abb7e60..4fa6720b32e4005359d49e59ea7aa9f1725535a3 100644 (file)
@@ -29,6 +29,9 @@
 #include "watch_utility.h"
 #endif
 
+#define FREQ_FAST 4
+#define FREQ 2
+
 /*
 TODO:
 * Add quick iteration (8x freq to get to the letter we want)
@@ -104,6 +107,17 @@ static uint32_t get_random(uint32_t max) {
     #endif
 }
 
+static bool _quick_ticks_running;
+static void start_quick_cyc(void){
+    _quick_ticks_running = true;
+    movement_request_tick_frequency(FREQ_FAST);
+}
+
+static void stop_quick_cyc(void){
+    _quick_ticks_running = false;
+    movement_request_tick_frequency(FREQ);
+}
+
 static void display_letter(wordle_state_t *state, bool display_dash) {
     char buf[1 + 1];
     if (state->word_elements[state->position] >= _num_valid_letters) {
@@ -145,19 +159,11 @@ static bool check_word(wordle_state_t *state) {
         for (size_t j = 0; j < WORDLE_LENGTH; j++) {
             if (checked_letter_in_answer[j] != WORDLE_LETTER_WRONG) continue;
             if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) {
-                printf("me: %c them: %c\r\n", _valid_letters[state->word_elements[i]], _legal_words[state->curr_answer][j]);
                 state->word_elements_result[i] = checked_letter_in_answer[j] = WORDLE_LETTER_WRONG_LOC;
                 break;
             }
         }
     }
-
-    for (size_t i = 0; i < WORDLE_LENGTH; i++) {
-        printf("%d : %d\r\n", i, state->word_elements_result[i]);
-    }
-
-
-
     return is_exact_match;
 }
 
@@ -181,7 +187,9 @@ static void reset_board(wordle_state_t *state) {
     display_attempt(state->attempt);
     display_all_letters(state);
     watch_display_string("-", 5);
-    printf("rand: %s\r\n", _legal_words[state->curr_answer]);
+#if __EMSCRIPTEN__
+    printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]);
+#endif
 }
 
 static void display_title(wordle_state_t *state) {
@@ -253,6 +261,16 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_
     return curr_pos;
 }
 
+static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) {
+    if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0;
+    else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters;
+}
+
+static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) {
+    if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1;
+    else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters;
+}
+
 #if USE_DAILY_STREAK
 static uint32_t get_day_unix_time(void) {
     watch_date_time now = watch_rtc_get_date_time();
@@ -340,7 +358,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index,
 void wordle_face_activate(movement_settings_t *settings, void *context) {
     (void) settings;
     wordle_state_t *state = (wordle_state_t *)context;
-    movement_request_tick_frequency(2);
+    movement_request_tick_frequency(FREQ);
 #if USE_DAILY_STREAK
     if (state->prev_day <= (get_day_unix_time() + (60 *60 * 24))) state->streak = 0;
 #endif
@@ -360,10 +378,19 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi
             switch (state->curr_screen)
             {
             case SCREEN_PLAYING:
-                if (event.subsecond % 2) {
-                    display_letter(state, true);
-                } else {
-                    watch_display_string(" ", state->position + 5);
+                if (_quick_ticks_running) {
+                    if (watch_get_pin_level(BTN_ALARM)){
+                        get_next_letter(state->position, state->word_elements);
+                        display_letter(state, true);
+                    }
+                    else stop_quick_cyc();
+                }
+                else {
+                    if (event.subsecond % 2) {
+                        display_letter(state, true);
+                    } else {
+                        watch_display_string(" ", state->position + 5);
+                    }
                 }
                 break;
             case SCREEN_RESULT:
@@ -379,18 +406,23 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi
                 break;
             }
             break;
-        case EVENT_LIGHT_BUTTON_UP:
+        case EVENT_ALARM_BUTTON_UP:
             if (act_on_btn(state)) break;
-            if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = 0;
-            else state->word_elements[state->position] = (state->word_elements[state->position] + 1) % _num_valid_letters;
+            get_next_letter(state->position, state->word_elements);
             display_letter(state, true);
             break;
-        case EVENT_LIGHT_LONG_PRESS:
-            if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = _num_valid_letters - 1;
-            else state->word_elements[state->position] = (state->word_elements[state->position] + _num_valid_letters - 1) % _num_valid_letters;
+        case EVENT_ALARM_LONG_PRESS:
+            if (state->curr_screen != SCREEN_PLAYING) break;
+            get_prev_letter(state->position, state->word_elements);
             display_letter(state, true);
+            break;
+        case EVENT_ALARM_LONGER_PRESS:
+            if (state->curr_screen != SCREEN_PLAYING) break;
+            get_next_letter(state->position, state->word_elements);
+            display_letter(state, true);
+            start_quick_cyc();
             break; 
-        case EVENT_ALARM_BUTTON_UP:
+        case EVENT_LIGHT_BUTTON_UP:
             if (act_on_btn(state)) break;
             display_letter(state, true);
             if (state->word_elements[state->position] == _num_valid_letters) break;
@@ -414,7 +446,8 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi
                 break;
             }
             break;
-        case EVENT_ALARM_LONG_PRESS:
+        case EVENT_LIGHT_LONG_PRESS:
+            if (state->curr_screen != SCREEN_PLAYING) break;
             display_letter(state, true);
             state->position = get_prev_pos(state->position, state->word_elements_result);
             break;