#ifndef GAME_TIMER_HPP #define GAME_TIMER_HPP #include "game_timer.h" static bool is_module_playing; static bool is_game_playing; // in ms static uint32_t game_time_left; static uint32_t module_time_left; static void game_timer_task(void *arg); static uint32_t sat_sub(uint32_t x, uint32_t y); void init_game_module_timer(void) { xTaskCreate(game_timer_task, "game_module_timer", 4096, NULL, 10, NULL); } void start_game_timer(void) { is_game_playing = true; } void stop_game_timer(void) { is_game_playing = false; } void start_module_timer(void) { is_module_playing = true; } void stop_module_timer(void) { is_module_playing = false; } void set_game_time(uint32_t new_time) { game_time_left = new_time; } uint32_t get_game_time() { return game_time_left; } void set_module_time(uint32_t new_time) { module_time_left = new_time; } uint32_t get_module_time() { return module_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 (is_game_playing) { game_time_left = sat_sub(game_time_left, frequency); if (game_time_left > 60'000) { int disp_time = (game_time_left / 60'000) * 100; disp_time = disp_time + ((game_time_left % 60'000) / 1'000); set_game_sseg_num(disp_time, 2); } else { set_game_sseg_num(game_time_left / 100, 1); } } if (is_module_playing) { module_time_left = sat_sub(module_time_left, frequency); if (module_time_left > 60'000) { int disp_time = (module_time_left / 60'000) * 100; disp_time = disp_time + ((module_time_left % 60'000) / 1'000); set_module_sseg_num(disp_time, 2); } else { set_module_sseg_num(module_time_left / 100, 1); } } } vTaskDelete(NULL); } static uint32_t sat_sub(uint32_t x, uint32_t y) { uint32_t res = x - y; res &= -(res <= x); return res; } #endif /* GAME_TIMER_HPP */