#ifndef GAME_TIMER_HPP #define GAME_TIMER_HPP #include "freertos/FreeRTOS.h" #include "sseg.hpp" static bool playing; static uint32_t time_left; static void game_timer_task(void *arg); uint32_t sat_sub(uint32_t x, uint32_t y); void start_timer(void) { playing = true; } void stop_timer(void) { playing = false; } void init_game_timer(void) { xTaskCreate(game_timer_task, "game_timer", 4096, NULL, 10, NULL); } void set_game_time(uint32_t new_time) { time_left = new_time; } uint32_t get_game_time() { return time_left; } static void game_timer_task(void *arg) { TickType_t lastWakeTime = xTaskGetTickCount(); const uint32_t frequency = 100; while (1) { vTaskDelayUntil( &lastWakeTime, pdMS_TO_TICKS(frequency)); if (playing) { time_left = sat_sub(time_left, frequency); set_game_timer(time_left / 100, 1); } } vTaskDelete(NULL); } uint32_t sat_sub(uint32_t x, uint32_t y) { uint32_t res = x - y; res &= -(res <= x); return res; } #endif /* GAME_TIMER_HPP */