From 7cb4fe0944b839f28dfd96a88a772cd6a8b58019 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 2 Nov 2023 17:16:25 -0600 Subject: reorganized project files (part 1) (just moved files, didn't change the contents yet, and nothing will work without updating #includes and build scripts and stuff) --- fsm/states.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 fsm/states.h (limited to 'fsm/states.h') diff --git a/fsm/states.h b/fsm/states.h new file mode 100644 index 0000000..156e6cf --- /dev/null +++ b/fsm/states.h @@ -0,0 +1,37 @@ +// fsm-states.h: State-handling functions for SpaghettiMonster. +// Copyright (C) 2017-2023 Selene ToyKeeper +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "fsm-adc.h" + +// typedefs +typedef uint8_t State(Event event, uint16_t arg); +typedef State * StatePtr; + +// top of the stack +volatile StatePtr current_state; + +// stack for states, to allow shared utility states like "input a number" +// and such, which return to the previous state after finishing +#define STATE_STACK_SIZE 8 +StatePtr state_stack[STATE_STACK_SIZE]; +uint8_t state_stack_len = 0; + +void _set_state(StatePtr new_state, uint16_t arg, + Event exit_event, Event enter_event); +int8_t push_state(StatePtr new_state, uint16_t arg); +StatePtr pop_state(); +uint8_t set_state(StatePtr new_state, uint16_t arg); + +// if loop() needs to change state, use this instead of set_state() +// (because this avoids race conditions) +volatile StatePtr deferred_state; +volatile uint16_t deferred_state_arg; +void set_state_deferred(StatePtr new_state, uint16_t arg); + +#ifndef DONT_USE_DEFAULT_STATE +uint8_t default_state(Event event, uint16_t arg); +#endif + -- cgit v1.2.3