aboutsummaryrefslogtreecommitdiff
path: root/fsm/standby.h
diff options
context:
space:
mode:
Diffstat (limited to 'fsm/standby.h')
-rw-r--r--fsm/standby.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/fsm/standby.h b/fsm/standby.h
new file mode 100644
index 0000000..957e2e1
--- /dev/null
+++ b/fsm/standby.h
@@ -0,0 +1,68 @@
+// fsm-standby.h: standby mode functions for SpaghettiMonster.
+// Copyright (C) 2017-2023 Selene ToyKeeper
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+// deferred "off" so we won't suspend in a weird state
+// (like... during the middle of a strobe pulse)
+// set this to nonzero to enter standby mode next time the system is idle
+volatile uint8_t go_to_standby = 0;
+
+#ifdef TICK_DURING_STANDBY
+#ifndef STANDBY_TICK_SPEED
+#define STANDBY_TICK_SPEED 3 // every 0.128 s
+/*
+ * From the Attiny85 manual:
+ * 0: 16 ms
+ * 1: 32 ms
+ * 2: 64 ms
+ * 3: 0.128 s
+ * 4: 0.256 s
+ * 5: 0.512 s
+ * 6: 1.0 s
+ * 7: 2.0 s
+ * 32: 4.0 s
+ * 33: 8.0 s
+ * (other values may have unexpected effects; not sure why the final bit is
+ * separated from the others, in the "32" position instead of "8", but that's
+ * how it is)
+ */
+#endif
+
+#if (STANDBY_TICK_SPEED == 1)
+#define SLEEP_TICKS_PER_SECOND 31
+#define SLEEP_TICKS_PER_MINUTE 1800
+
+#elif (STANDBY_TICK_SPEED == 2)
+#define SLEEP_TICKS_PER_SECOND 16
+#define SLEEP_TICKS_PER_MINUTE 900
+
+#elif (STANDBY_TICK_SPEED == 3)
+#define SLEEP_TICKS_PER_SECOND 8
+#define SLEEP_TICKS_PER_MINUTE 450
+
+#elif (STANDBY_TICK_SPEED == 4)
+#define SLEEP_TICKS_PER_SECOND 4
+#define SLEEP_TICKS_PER_MINUTE 225
+
+#elif (STANDBY_TICK_SPEED == 5)
+#define SLEEP_TICKS_PER_SECOND 2
+#define SLEEP_TICKS_PER_MINUTE 113
+
+#elif (STANDBY_TICK_SPEED == 6)
+#define SLEEP_TICKS_PER_SECOND 1
+#define SLEEP_TICKS_PER_MINUTE 57
+
+#endif
+#endif
+
+#define standby_mode sleep_until_eswitch_pressed
+void sleep_until_eswitch_pressed();
+
+#ifdef USE_IDLE_MODE
+// stops processing until next click or timer tick
+// (I think)
+void idle_mode();
+#endif
+