212
uint8_t off_state(EventPtr event, uint16_t arg);
220
uint8_t off_state(Event event, uint16_t arg);
213
221
// simple numeric entry config menu
214
uint8_t config_state_base(EventPtr event, uint16_t arg,
222
uint8_t config_state_base(Event event, uint16_t arg,
215
223
uint8_t num_config_steps,
216
224
void (*savefunc)());
217
225
#define MAX_CONFIG_VALUES 3
218
226
uint8_t config_state_values[MAX_CONFIG_VALUES];
219
227
// ramping mode and its related config mode
220
uint8_t steady_state(EventPtr event, uint16_t arg);
221
uint8_t ramp_config_state(EventPtr event, uint16_t arg);
228
uint8_t steady_state(Event event, uint16_t arg);
229
uint8_t ramp_config_state(Event event, uint16_t arg);
222
230
// party and tactical strobes
223
231
#ifdef USE_STROBE_STATE
224
uint8_t strobe_state(EventPtr event, uint16_t arg);
232
uint8_t strobe_state(Event event, uint16_t arg);
226
234
#ifdef USE_BATTCHECK
227
uint8_t battcheck_state(EventPtr event, uint16_t arg);
235
uint8_t battcheck_state(Event event, uint16_t arg);
229
237
#ifdef USE_THERMAL_REGULATION
230
uint8_t tempcheck_state(EventPtr event, uint16_t arg);
231
uint8_t thermal_config_state(EventPtr event, uint16_t arg);
238
uint8_t tempcheck_state(Event event, uint16_t arg);
239
uint8_t thermal_config_state(Event event, uint16_t arg);
233
241
// 1-hour ramp down from low, then automatic off
234
uint8_t goodnight_state(EventPtr event, uint16_t arg);
242
uint8_t goodnight_state(Event event, uint16_t arg);
235
243
// beacon mode and its related config mode
236
uint8_t beacon_state(EventPtr event, uint16_t arg);
237
uint8_t beacon_config_state(EventPtr event, uint16_t arg);
244
uint8_t beacon_state(Event event, uint16_t arg);
245
uint8_t beacon_config_state(Event event, uint16_t arg);
239
247
#define MOON_DURING_LOCKOUT_MODE
240
uint8_t lockout_state(EventPtr event, uint16_t arg);
248
uint8_t lockout_state(Event event, uint16_t arg);
241
249
// momentary / signalling mode
242
uint8_t momentary_state(EventPtr event, uint16_t arg);
250
uint8_t momentary_state(Event event, uint16_t arg);
243
251
#ifdef USE_MUGGLE_MODE
244
252
// muggle mode, super-simple, hard to exit
245
uint8_t muggle_state(EventPtr event, uint16_t arg);
253
uint8_t muggle_state(Event event, uint16_t arg);
246
254
uint8_t muggle_mode_active = 0;
249
257
// general helper function for config modes
250
uint8_t number_entry_state(EventPtr event, uint16_t arg);
258
uint8_t number_entry_state(Event event, uint16_t arg);
251
259
// return value from number_entry_state()
252
260
volatile uint8_t number_entry_value;
488
496
return MISCHIEF_MANAGED;
499
#ifdef USE_INDICATOR_LED
500
// 7 clicks: change indicator LED mode
501
else if (event == EV_7clicks) {
502
uint8_t mode = (indicator_led_mode & 3) + 1;
503
#ifdef TICK_DURING_STANDBY
508
#ifdef INDICATOR_LED_SKIP_LOW
509
if (mode == 1) { mode ++; }
511
indicator_led_mode = (indicator_led_mode & 0b11111100) | mode;
514
return MISCHIEF_MANAGED;
491
517
return EVENT_NOT_HANDLED;
495
uint8_t steady_state(EventPtr event, uint16_t arg) {
521
uint8_t steady_state(Event event, uint16_t arg) {
496
522
uint8_t mode_min = ramp_smooth_floor;
497
523
uint8_t mode_max = ramp_smooth_ceil;
498
524
uint8_t ramp_step_size = 1;
1131
uint8_t lockout_state(EventPtr event, uint16_t arg) {
1157
uint8_t lockout_state(Event event, uint16_t arg) {
1132
1158
#ifdef MOON_DURING_LOCKOUT_MODE
1133
1159
// momentary(ish) moon mode during lockout
1134
// not all presses will be counted;
1135
// it depends on what is in the master event_sequences table
1137
for(uint8_t i=0; pgm_read_byte(event + i) && (i<EV_MAX_LEN); i++)
1138
last = pgm_read_byte(event + i);
1139
if (arg == 0) { // Only turn on/off when button state changes
1140
if ((last == A_PRESS) || (last == A_HOLD)) {
1141
#ifdef LOCKOUT_MOON_LOWEST
1142
// Use lowest moon configured
1143
uint8_t lvl = ramp_smooth_floor;
1144
if (ramp_discrete_floor < lvl) lvl = ramp_discrete_floor;
1147
// Use moon from current ramp
1148
set_level(nearest_level(1));
1151
else if ((last == A_RELEASE) || (last == A_RELEASE_TIMEOUT)) {
1160
// button is being held
1161
if ((event & (B_CLICK | B_PRESS)) == (B_CLICK | B_PRESS)) {
1162
#ifdef LOCKOUT_MOON_LOWEST
1163
// Use lowest moon configured
1164
uint8_t lvl = ramp_smooth_floor;
1165
if (ramp_discrete_floor < lvl) lvl = ramp_discrete_floor;
1168
// Use moon from current ramp
1169
set_level(nearest_level(1));
1172
// button was released
1173
else if ((event & (B_CLICK | B_PRESS)) == (B_CLICK)) {
1244
uint8_t momentary_state(EventPtr event, uint16_t arg) {
1267
uint8_t momentary_state(Event event, uint16_t arg) {
1245
1268
// TODO: momentary strobe here? (for light painting)
1246
if (event == EV_click1_press) {
1270
// light up when the button is pressed; go dark otherwise
1271
// button is being held
1272
if ((event & (B_CLICK | B_PRESS)) == (B_CLICK | B_PRESS)) {
1247
1273
set_level(memorized_level);
1248
empty_event_sequence(); // don't attempt to parse multiple clicks
1249
1274
return MISCHIEF_MANAGED;
1252
else if (event == EV_release) {
1276
// button was released
1277
else if ((event & (B_CLICK | B_PRESS)) == (B_CLICK)) {
1254
empty_event_sequence(); // don't attempt to parse multiple clicks
1255
1279
//go_to_standby = 1; // sleep while light is off
1256
// TODO: lighted button should use lockout config?
1257
1280
return MISCHIEF_MANAGED;
1529
uint8_t beacon_config_state(EventPtr event, uint16_t arg) {
1553
uint8_t beacon_config_state(Event event, uint16_t arg) {
1530
1554
return config_state_base(event, arg,
1531
1555
1, beacon_config_save);
1535
uint8_t number_entry_state(EventPtr event, uint16_t arg) {
1559
uint8_t number_entry_state(Event event, uint16_t arg) {
1536
1560
static uint8_t value;
1537
1561
static uint8_t blinks_left;
1538
1562
static uint8_t entry_step;