79 lines
1.6 KiB
C++
79 lines
1.6 KiB
C++
#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);
|
|
set_game_sseg_num(game_time_left / 100, 1);
|
|
}
|
|
if (is_module_playing) {
|
|
module_time_left = sat_sub(module_time_left, frequency);
|
|
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 */ |