229
uint8_t off_state(EventPtr event, uint16_t arg);
220
uint8_t off_state(Event event, uint16_t arg);
230
221
// simple numeric entry config menu
231
uint8_t config_state_base(EventPtr event, uint16_t arg,
222
uint8_t config_state_base(Event event, uint16_t arg,
232
223
uint8_t num_config_steps,
233
224
void (*savefunc)());
234
225
#define MAX_CONFIG_VALUES 3
235
226
uint8_t config_state_values[MAX_CONFIG_VALUES];
236
227
// ramping mode and its related config mode
237
uint8_t steady_state(EventPtr event, uint16_t arg);
238
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);
239
230
// party and tactical strobes
240
231
#ifdef USE_STROBE_STATE
241
uint8_t strobe_state(EventPtr event, uint16_t arg);
232
uint8_t strobe_state(Event event, uint16_t arg);
243
234
#ifdef USE_BATTCHECK
244
uint8_t battcheck_state(EventPtr event, uint16_t arg);
235
uint8_t battcheck_state(Event event, uint16_t arg);
246
237
#ifdef USE_THERMAL_REGULATION
247
uint8_t tempcheck_state(EventPtr event, uint16_t arg);
248
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);
250
241
// 1-hour ramp down from low, then automatic off
251
uint8_t goodnight_state(EventPtr event, uint16_t arg);
242
uint8_t goodnight_state(Event event, uint16_t arg);
252
243
// beacon mode and its related config mode
253
uint8_t beacon_state(EventPtr event, uint16_t arg);
254
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);
256
247
#define MOON_DURING_LOCKOUT_MODE
257
uint8_t lockout_state(EventPtr event, uint16_t arg);
248
uint8_t lockout_state(Event event, uint16_t arg);
258
249
// momentary / signalling mode
259
uint8_t momentary_state(EventPtr event, uint16_t arg);
250
uint8_t momentary_state(Event event, uint16_t arg);
260
251
#ifdef USE_MUGGLE_MODE
261
252
// muggle mode, super-simple, hard to exit
262
uint8_t muggle_state(EventPtr event, uint16_t arg);
253
uint8_t muggle_state(Event event, uint16_t arg);
263
254
uint8_t muggle_mode_active = 0;
266
257
// general helper function for config modes
267
uint8_t number_entry_state(EventPtr event, uint16_t arg);
258
uint8_t number_entry_state(Event event, uint16_t arg);
268
259
// return value from number_entry_state()
269
260
volatile uint8_t number_entry_value;
1166
uint8_t lockout_state(EventPtr event, uint16_t arg) {
1157
uint8_t lockout_state(Event event, uint16_t arg) {
1167
1158
#ifdef MOON_DURING_LOCKOUT_MODE
1168
1159
// momentary(ish) moon mode during lockout
1169
// not all presses will be counted;
1170
// it depends on what is in the master event_sequences table
1172
for(uint8_t i=0; pgm_read_byte(event + i) && (i<EV_MAX_LEN); i++)
1173
last = pgm_read_byte(event + i);
1174
if (arg == 0) { // Only turn on/off when button state changes
1175
if ((last == A_PRESS) || (last == A_HOLD)) {
1176
#ifdef LOCKOUT_MOON_LOWEST
1177
// Use lowest moon configured
1178
uint8_t lvl = ramp_smooth_floor;
1179
if (ramp_discrete_floor < lvl) lvl = ramp_discrete_floor;
1182
// Use moon from current ramp
1183
set_level(nearest_level(1));
1186
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)) {
1281
uint8_t momentary_state(EventPtr event, uint16_t arg) {
1267
uint8_t momentary_state(Event event, uint16_t arg) {
1282
1268
// TODO: momentary strobe here? (for light painting)
1283
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)) {
1284
1273
set_level(memorized_level);
1285
empty_event_sequence(); // don't attempt to parse multiple clicks
1286
1274
return MISCHIEF_MANAGED;
1289
else if (event == EV_release) {
1276
// button was released
1277
else if ((event & (B_CLICK | B_PRESS)) == (B_CLICK)) {
1291
empty_event_sequence(); // don't attempt to parse multiple clicks
1292
1279
//go_to_standby = 1; // sleep while light is off
1293
// TODO: lighted button should use lockout config?
1294
1280
return MISCHIEF_MANAGED;
1566
uint8_t beacon_config_state(EventPtr event, uint16_t arg) {
1553
uint8_t beacon_config_state(Event event, uint16_t arg) {
1567
1554
return config_state_base(event, arg,
1568
1555
1, beacon_config_save);
1572
uint8_t number_entry_state(EventPtr event, uint16_t arg) {
1559
uint8_t number_entry_state(Event event, uint16_t arg) {
1573
1560
static uint8_t value;
1574
1561
static uint8_t blinks_left;
1575
1562
static uint8_t entry_step;