Skip to content

State Machine

Stefan Bormann edited this page Oct 25, 2025 · 1 revision

There is a main state maschine that covers wifi and server connection, shutdown and boot up options:

stateDiagram-v2
	classDef NominalPath stroke-width:1px,stroke-dasharray:none,stroke:#254336,fill:#27654A,color:#FFFFFF;
	[*] --> STARTUP
	class STARTUP NominalPath
	state InitialKeys <<choice>>
	class InitialKeys NominalPath
	STARTUP --> InitialKeys
	
	InitialKeys --> WAIT_ON_RED_KEY: [ESTOP]
	WAIT_ON_RED_KEY --> CONNECTING: [!ESTOP]
	WAIT_ON_RED_KEY --> wait_release_red_key: after 5s
	wait_release_red_key: wait_release_red_key
	wait_release_red_key: entry/deleteAllConfig
	wait_release_red_key: exit/ESP.restart
	wait_release_red_key --> [*]: [!ESTOP]
	
	InitialKeys --> WAIT_ON_YELLOW_KEY: [SHIFT]
	WAIT_ON_YELLOW_KEY --> CONNECTING: [!SHIFT]

	WAIT_ON_YELLOW_KEY --> CONFIG_AP: after 5s
	CONNECTING --> CONFIG_AP: after 60s
	CONFIG_AP: CONFIG_AP
	CONFIG_AP: entry/initWiFiAP
	
	InitialKeys --> CONNECTING: else
	CONNECTING: CONNECTING
	CONNECTING: entry/initWifiSTA
	class CONNECTING NominalPath

	state CheckF0 <<choice>>
	class CheckF0 NominalPath
	CONNECTING --> CheckF0: [Wifi connected]

	CheckF0 --> WAIT_ON_F0_KEY: [F0]
	WAIT_ON_F0_KEY --> CONNECTED: [!F0]
	WAIT_ON_F0_KEY --> CONFIG_STATION: after 5s
	
	CheckF0 --> CONNECTED: [!F0]
	CONNECTED: CONNECTED
	CONNECTED: entry/broadcastUDP
	CONNECTED: do/locoConnect
	class CONNECTED NominalPath
	CONNECTED --> STARTUP: [wifi_disconnected]
	CONNECTED --> CONFIG_STATION_WAITING: after 60s
	
	CONNECTED --> LOCO_CONNECTING: Server_connected
	LOCO_CONNECTING: LOCO_CONNECTING
	LOCO_CONNECTING: do/locoRegister
	class LOCO_CONNECTING NominalPath
	LOCO_CONNECTING --> STARTUP: [wifi_disconnected]
	LOCO_CONNECTING --> CONNECTED: [server_disconnected]
	LOCO_CONNECTING --> CONFIG_STATION_WAITING: after 10s
	
	LOCO_CONNECTING --> STATE_LOCO_WAITFORTIMEOUT: received "VN2.0"
	STATE_LOCO_WAITFORTIMEOUT: STATE_LOCO_WAITFORTIMEOUT
	STATE_LOCO_WAITFORTIMEOUT: do/timeoutReceived
	class STATE_LOCO_WAITFORTIMEOUT NominalPath
	STATE_LOCO_WAITFORTIMEOUT --> STARTUP: [wifi_disconnected]
	
	STATE_LOCO_WAITFORTIMEOUT --> LOCO_ONLINE: received "*"
	STATE_LOCO_WAITFORTIMEOUT --> LOCO_ONLINE: after 1s
	STATE_LOCO_WAITFORTIMEOUT --> STARTUP: [wifi_disconnected]
	
	CONFIG_STATION_WAITING: CONFIG_STATION_WAITING
	CONFIG_STATION_WAITING: entry/initWiFiConfigSTA
	CONFIG_STATION_WAITING: exit/shutdownWiFiConfigSTA
	CONFIG_STATION_WAITING --> LOCO_ONLINE: after 120s
	CONFIG_STATION_WAITING --> STARTUP: [wifi_disconnected]/initWifiAP
	
	LOCO_ONLINE: LOCO_ONLINE
	LOCO_ONLINE: do/locoHandler
	class LOCO_ONLINE NominalPath
	LOCO_ONLINE --> LOCOS_OFF: [allLocosInactive]
	LOCO_ONLINE --> CONNECTED: [server_disconnected && !emptyBattery]
	LOCO_ONLINE --> LOWPOWER_WAITING: [emptyBattery || now - lastActivity > 3min]
	
	LOCOS_OFF: LOCOS_OFF
	class LOCOS_OFF NominalPath
	LOCOS_OFF --> LOWPOWER_WAITING: after 6s/locoDisconnect
	LOCOS_OFF --> LOCO_ONLINE: [!allLocosInactive]
	
	LOWPOWER_WAITING --> LOCO_ONLINE: [!allLocosInactive && !lowBattery && !emptyBattery]
	LOWPOWER_WAITING --> LOWPOWER: after 100ms/shutdownWiFiSTA
	
	LOWPOWER: LOWPOWER
	LOWPOWER: do/ESP.deepSleep(0)
	LOWPOWER: exit/ESP.restart
	LOWPOWER --> [*]: [!allLocosInactive]
	
	CONFIG_STATION --> STARTUP: [wifi_disconnected]
Loading

Clone this wiki locally