Add snippet illustrating how to use time left
This commit is contained in:
parent
f462ab4647
commit
2e361e5893
1 changed files with 36 additions and 0 deletions
36
docs/snippet_timeleft.cpp
Normal file
36
docs/snippet_timeleft.cpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
|
||||
This is a code snippet for how to use the time remaining on the timer in your puzzle module.
|
||||
|
||||
To avoid the time left getting stale and inaccurate, we instead calculate when the timer will run
|
||||
out and store this deadline. When we need to get the time left, we can then calculate it.
|
||||
|
||||
This does not handle some edgecases:
|
||||
- times and timedeltas are stored in a 32-bit unsigned int, this can overflow after ~50 days, causing all sorts of weirdness
|
||||
=> avoid having modules powered on for a long time
|
||||
- the get_millis_remaining() getting called before receiving the first state update
|
||||
=> try to only call this function after human input
|
||||
=> alternatively, keep track of whether you can call the `get_millis_remaining` function already in a boolean
|
||||
*/
|
||||
|
||||
uint32_t deadline;
|
||||
|
||||
|
||||
void callback_state(uint32_t time_left, uint8_t strikes, uint8_t max_strikes, uint8_t puzzle_modules_left) {
|
||||
// Mark arguments as not used
|
||||
(void)strikes;
|
||||
(void)max_strikes;
|
||||
(void)puzzle_modules_left;
|
||||
|
||||
deadline = millis() + time_left;
|
||||
}
|
||||
|
||||
uint32_t get_millis_remaining() {
|
||||
return deadline - millis();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
/* ... */
|
||||
bool is_message_valid = obus_module::loopPuzzle(&message, callback_game_start, callback_game_stop, empty_callback_info, callback_state);
|
||||
/* ... */
|
||||
}
|
Loading…
Reference in a new issue