~toykeeper/flashlight-firmware/trunk

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