188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
1 |
/*
|
2 |
* fsm-events.h: Event-handling functions for SpaghettiMonster.
|
|
3 |
*
|
|
4 |
* Copyright (C) 2017 Selene Scriven
|
|
5 |
*
|
|
6 |
* This program is free software: you can redistribute it and/or modify
|
|
7 |
* it under the terms of the GNU General Public License as published by
|
|
8 |
* the Free Software Foundation, either version 3 of the License, or
|
|
9 |
* (at your option) any later version.
|
|
10 |
*
|
|
11 |
* This program is distributed in the hope that it will be useful,
|
|
12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14 |
* GNU General Public License for more details.
|
|
15 |
*
|
|
16 |
* You should have received a copy of the GNU General Public License
|
|
17 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18 |
*/
|
|
19 |
||
20 |
#ifndef FSM_EVENTS_H
|
|
21 |
#define FSM_EVENTS_H
|
|
22 |
||
23 |
#include <avr/pgmspace.h> |
|
24 |
||
25 |
// typedefs
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
26 |
typedef uint8_t Event; |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
27 |
typedef struct Emission { |
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
28 |
Event event; |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
29 |
uint16_t arg; |
30 |
} Emission; |
|
31 |
||
188.1.23
by Selene Scriven
Started on some documentation, spaghetti-monster.txt. |
32 |
#define EVENT_HANDLED 0
|
33 |
#define EVENT_NOT_HANDLED 1
|
|
34 |
#define MISCHIEF_MANAGED EVENT_HANDLED
|
|
35 |
#define MISCHIEF_NOT_MANAGED EVENT_NOT_HANDLED
|
|
36 |
||
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
37 |
Event current_event; |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
38 |
// at 0.016 ms per tick, 255 ticks = 4.08 s
|
39 |
static volatile uint16_t ticks_since_last_event = 0; |
|
40 |
||
188.1.147
by Selene Scriven
Changed halfsleep mode to TICK_DURING_STANDBY. Added blinking indicator LED support to Anduril. |
41 |
// timeout durations in ticks (each tick 1/62th s)
|
188.1.108
by Selene Scriven
Made HOLD_TIMEOUT and RELEASE_TIMEOUT define-able in the UI code. |
42 |
#ifndef HOLD_TIMEOUT
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
43 |
#define HOLD_TIMEOUT 24
|
188.1.108
by Selene Scriven
Made HOLD_TIMEOUT and RELEASE_TIMEOUT define-able in the UI code. |
44 |
#endif
|
45 |
#ifndef RELEASE_TIMEOUT
|
|
188.1.238
by Selene Scriven
made button release timeout faster (384ms -> 288ms) to make light shut off sooner after 1 click |
46 |
#define RELEASE_TIMEOUT 18
|
188.1.108
by Selene Scriven
Made HOLD_TIMEOUT and RELEASE_TIMEOUT define-able in the UI code. |
47 |
#endif
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
48 |
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
49 |
/* Event structure
|
50 |
* Bit 7: 1 for a button input event, 0 for all others.
|
|
51 |
* If bit 7 is 1:
|
|
52 |
* Bits 0,1,2,3: Click counter. Up to 15 clicks.
|
|
53 |
* Bit 4: 1 for a "press" event, 0 for a "release" event.
|
|
54 |
* Bit 5: 1 for a "hold" event, 0 otherwise.
|
|
55 |
* Bit 6: 1 for a "timeout" event, 0 otherwise.
|
|
56 |
* If bit 7 is 0:
|
|
188.6.4
by Selene Scriven
Fixed the sleep tick counter wrapping around to 0 instead of 32768. |
57 |
* Sort of ad-hoc, shown in #defines below.
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
58 |
*/
|
59 |
||
60 |
// event masks / bits
|
|
188.6.2
by Selene Scriven
Several fixes... |
61 |
#define B_SYSTEM 0b00000000
|
62 |
#define B_CLICK 0b10000000
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
63 |
#define B_TIMEOUT 0b01000000
|
64 |
#define B_HOLD 0b00100000
|
|
65 |
#define B_PRESS 0b00010000
|
|
66 |
#define B_RELEASE 0b00000000
|
|
67 |
#define B_COUNT 0b00001111
|
|
68 |
#define B_FLAGS 0b11110000
|
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
69 |
|
70 |
// Event types
|
|
188.6.4
by Selene Scriven
Fixed the sleep tick counter wrapping around to 0 instead of 32768. |
71 |
#define EV_none 0
|
72 |
||
73 |
// Events which aren't button presses
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
74 |
#define EV_debug (B_SYSTEM|0b01111111)
|
75 |
#define EV_enter_state (B_SYSTEM|0b00001000)
|
|
76 |
#define EV_leave_state (B_SYSTEM|0b00001001)
|
|
77 |
#define EV_reenter_state (B_SYSTEM|0b00001010)
|
|
78 |
#define EV_tick (B_SYSTEM|0b00000001)
|
|
188.1.147
by Selene Scriven
Changed halfsleep mode to TICK_DURING_STANDBY. Added blinking indicator LED support to Anduril. |
79 |
#ifdef TICK_DURING_STANDBY
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
80 |
#define EV_sleep_tick (B_SYSTEM|0b00000011)
|
188.1.146
by Selene Scriven
Implemented halfsleep mode. |
81 |
#endif
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
82 |
#ifdef USE_LVP
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
83 |
#define EV_voltage_low (B_SYSTEM|0b00000100)
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
84 |
#endif
|
85 |
#ifdef USE_THERMAL_REGULATION
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
86 |
#define EV_temperature_high (B_SYSTEM|0b00000101)
|
87 |
#define EV_temperature_low (B_SYSTEM|0b00000110)
|
|
188.15.5
by Selene Scriven
saving state of ADC / WDT refactoring before doing more changes... what changed so far: |
88 |
#define EV_temperature_okay (B_SYSTEM|0b00000111)
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
89 |
#endif
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
90 |
|
188.6.4
by Selene Scriven
Fixed the sleep tick counter wrapping around to 0 instead of 32768. |
91 |
// Button press events
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
92 |
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
93 |
// shouldn't normally happen, but UI might empty_event_sequence() while button
|
94 |
// is down so a release with no recorded prior hold could be possible
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
95 |
#define EV_release (B_CLICK|B_RELEASE|0)
|
96 |
||
97 |
#define EV_click1_press (B_CLICK|B_PRESS|1)
|
|
98 |
#define EV_click1_release (B_CLICK|B_RELEASE|1)
|
|
99 |
#define EV_click1_complete (B_CLICK|B_TIMEOUT|1)
|
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
100 |
#define EV_1click EV_click1_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
101 |
#define EV_click1_hold (B_CLICK|B_HOLD|B_PRESS|1)
|
102 |
#define EV_click1_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|1)
|
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
103 |
#define EV_hold EV_click1_hold
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
104 |
|
105 |
#define EV_click2_press (B_CLICK|B_PRESS|2)
|
|
106 |
#define EV_click2_release (B_CLICK|B_RELEASE|2)
|
|
107 |
#define EV_click2_complete (B_CLICK|B_TIMEOUT|2)
|
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
108 |
#define EV_2clicks EV_click2_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
109 |
#define EV_click2_hold (B_CLICK|B_HOLD|B_PRESS|2)
|
110 |
#define EV_click2_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|2)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
111 |
|
112 |
#define EV_click3_press (B_CLICK|B_PRESS|3)
|
|
113 |
#define EV_click3_release (B_CLICK|B_RELEASE|3)
|
|
114 |
#define EV_click3_complete (B_CLICK|B_TIMEOUT|3)
|
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
115 |
#define EV_3clicks EV_click3_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
116 |
#define EV_click3_hold (B_CLICK|B_HOLD|B_PRESS|3)
|
117 |
#define EV_click3_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|3)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
118 |
|
119 |
#define EV_click4_press (B_CLICK|B_PRESS|4)
|
|
120 |
#define EV_click4_release (B_CLICK|B_RELEASE|4)
|
|
121 |
#define EV_click4_complete (B_CLICK|B_TIMEOUT|4)
|
|
188.1.18
by Selene Scriven
Made ramping UI able to toggle between smooth and discrete ramping with 4 clicks. |
122 |
#define EV_4clicks EV_click4_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
123 |
#define EV_click4_hold (B_CLICK|B_HOLD|B_PRESS|4)
|
124 |
#define EV_click4_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|4)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
125 |
|
126 |
#define EV_click5_press (B_CLICK|B_PRESS|5)
|
|
127 |
#define EV_click5_release (B_CLICK|B_RELEASE|5)
|
|
128 |
#define EV_click5_complete (B_CLICK|B_TIMEOUT|5)
|
|
188.1.39
by Selene Scriven
Made it easier to configure the maximum number of clicks it'll try to count in one sequence. |
129 |
#define EV_5clicks EV_click5_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
130 |
#define EV_click5_hold (B_CLICK|B_HOLD|B_PRESS|5)
|
131 |
#define EV_click5_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|5)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
132 |
|
133 |
#define EV_click6_press (B_CLICK|B_PRESS|6)
|
|
134 |
#define EV_click6_release (B_CLICK|B_RELEASE|6)
|
|
135 |
#define EV_click6_complete (B_CLICK|B_TIMEOUT|6)
|
|
188.1.39
by Selene Scriven
Made it easier to configure the maximum number of clicks it'll try to count in one sequence. |
136 |
#define EV_6clicks EV_click6_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
137 |
#define EV_click6_hold (B_CLICK|B_HOLD|B_PRESS|6)
|
138 |
#define EV_click6_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|6)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
139 |
|
140 |
#define EV_click7_press (B_CLICK|B_PRESS|7)
|
|
141 |
#define EV_click7_release (B_CLICK|B_RELEASE|7)
|
|
142 |
#define EV_click7_complete (B_CLICK|B_TIMEOUT|7)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
143 |
#define EV_7clicks EV_click7_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
144 |
#define EV_click7_hold (B_CLICK|B_HOLD|B_PRESS|7)
|
145 |
#define EV_click7_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|7)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
146 |
|
147 |
#define EV_click8_press (B_CLICK|B_PRESS|8)
|
|
148 |
#define EV_click8_release (B_CLICK|B_RELEASE|8)
|
|
149 |
#define EV_click8_complete (B_CLICK|B_TIMEOUT|8)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
150 |
#define EV_8clicks EV_click8_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
151 |
#define EV_click8_hold (B_CLICK|B_HOLD|B_PRESS|8)
|
152 |
#define EV_click8_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|8)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
153 |
|
154 |
#define EV_click9_press (B_CLICK|B_PRESS|9)
|
|
155 |
#define EV_click9_release (B_CLICK|B_RELEASE|9)
|
|
156 |
#define EV_click9_complete (B_CLICK|B_TIMEOUT|9)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
157 |
#define EV_9clicks EV_click9_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
158 |
#define EV_click9_hold (B_CLICK|B_HOLD|B_PRESS|9)
|
159 |
#define EV_click9_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|9)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
160 |
|
161 |
#define EV_click10_press (B_CLICK|B_PRESS|10)
|
|
162 |
#define EV_click10_release (B_CLICK|B_RELEASE|10)
|
|
163 |
#define EV_click10_complete (B_CLICK|B_TIMEOUT|10)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
164 |
#define EV_10clicks EV_click10_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
165 |
#define EV_click10_hold (B_CLICK|B_HOLD|B_PRESS|10)
|
166 |
#define EV_click10_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|10)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
167 |
|
168 |
#define EV_click11_press (B_CLICK|B_PRESS|11)
|
|
169 |
#define EV_click11_release (B_CLICK|B_RELEASE|11)
|
|
170 |
#define EV_click11_complete (B_CLICK|B_TIMEOUT|11)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
171 |
#define EV_11clicks EV_click11_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
172 |
#define EV_click11_hold (B_CLICK|B_HOLD|B_PRESS|11)
|
173 |
#define EV_click11_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|11)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
174 |
|
175 |
#define EV_click12_press (B_CLICK|B_PRESS|12)
|
|
176 |
#define EV_click12_release (B_CLICK|B_RELEASE|12)
|
|
177 |
#define EV_click12_complete (B_CLICK|B_TIMEOUT|12)
|
|
188.1.67
by Selene Scriven
Started a Meteor M43 clone UI. |
178 |
#define EV_12clicks EV_click12_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
179 |
#define EV_click12_hold (B_CLICK|B_HOLD|B_PRESS|12)
|
180 |
#define EV_click12_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|12)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
181 |
|
182 |
#define EV_click13_press (B_CLICK|B_PRESS|13)
|
|
183 |
#define EV_click13_release (B_CLICK|B_RELEASE|13)
|
|
184 |
#define EV_click13_complete (B_CLICK|B_TIMEOUT|13)
|
|
188.3.7
by Selene Scriven
Mostly got Emisar UI working... I think. Not yet tested. |
185 |
#define EV_13clicks EV_click13_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
186 |
#define EV_click13_hold (B_CLICK|B_HOLD|B_PRESS|13)
|
187 |
#define EV_click13_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|13)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
188 |
|
189 |
#define EV_click14_press (B_CLICK|B_PRESS|14)
|
|
190 |
#define EV_click14_release (B_CLICK|B_RELEASE|14)
|
|
191 |
#define EV_click14_complete (B_CLICK|B_TIMEOUT|14)
|
|
188.3.7
by Selene Scriven
Mostly got Emisar UI working... I think. Not yet tested. |
192 |
#define EV_14clicks EV_click14_complete
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
193 |
#define EV_click14_hold (B_CLICK|B_HOLD|B_PRESS|14)
|
194 |
#define EV_click14_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|14)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
195 |
|
196 |
#define EV_click15_press (B_CLICK|B_PRESS|15)
|
|
197 |
#define EV_click15_release (B_CLICK|B_RELEASE|15)
|
|
198 |
#define EV_click15_complete (B_CLICK|B_TIMEOUT|15)
|
|
199 |
#define EV_15clicks EV_click15_complete
|
|
188.1.202
by Selene Scriven
Made event definitions a little cleaner. |
200 |
#define EV_click15_hold (B_CLICK|B_HOLD|B_PRESS|15)
|
201 |
#define EV_click15_hold_release (B_CLICK|B_HOLD|B_RELEASE|B_TIMEOUT|15)
|
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
202 |
|
203 |
||
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
204 |
void empty_event_sequence(); |
205 |
uint8_t push_event(uint8_t ev_type); |
|
206 |
||
207 |
||
208 |
#define EMISSION_QUEUE_LEN 16
|
|
209 |
// no comment about "volatile emissions"
|
|
210 |
volatile Emission emissions[EMISSION_QUEUE_LEN]; |
|
211 |
||
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
212 |
void append_emission(Event event, uint16_t arg); |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
213 |
void delete_first_emission(); |
188.1.22
by Selene Scriven
Added loop() to API, executes constantly. |
214 |
void process_emissions(); |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
215 |
//#define emit_now emit
|
188.6.1
by Selene Scriven
Rewrote the event system to use a single byte for each event instead of an array of actions. |
216 |
uint8_t emit_now(Event event, uint16_t arg); |
217 |
void emit(Event event, uint16_t arg); |
|
188.6.2
by Selene Scriven
Several fixes... |
218 |
void emit_current_event(uint16_t arg); |
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
219 |
|
188.1.22
by Selene Scriven
Added loop() to API, executes constantly. |
220 |
uint8_t nice_delay_ms(uint16_t ms); |
188.1.24
by Selene Scriven
Added battcheck mode to ramping-ui. It's bigger than I had hoped. :( |
221 |
//uint8_t nice_delay_s();
|
188.1.30
by Selene Scriven
Added beacons/strobes to DarkHorse. |
222 |
inline void interrupt_nice_delays(); |
188.1.287
by Selene Scriven
fixed build of "momentary" example UI |
223 |
void delay_4ms(uint8_t ms); |
188.1.22
by Selene Scriven
Added loop() to API, executes constantly. |
224 |
|
188.1.11
by Selene Scriven
Completely reorganized SpaghettiMonster code into smaller logical pieces: fsm-*.c and fsm-*.h. |
225 |
#endif
|