#ifndef GAME_TIMER_HPP #define GAME_TIMER_HPP #include "freertos/FreeRTOS.h" #include "sseg.hpp" static uint32_t _time_left; static void game_timer_task(void *arg); uint32_t sat_sub(uint32_t x, uint32_t y); 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)); _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 */