// Control the hud timer by various mouse clicks: // Shift+click changed mode Countdown / Stopwatch // For Countdown, mouse wheel up/down decrease/increase start time. // Defaul step 5, +ctrl 1, +alt 30 // Left-click start/stop timer // Mouse wheel click - reset timer. // int Hud_Timer::mouse_click(Uint32 flags) { // change countdown start if (flags & (ELW_WHEEL_DOWN|ELW_WHEEL_UP)) { int step = 5; if (!mode_coundown) return 1; if (flags & ELW_CTRL) step = 1; else if (flags & ELW_ALT) step = 30; if ((flags & ELW_WHEEL_UP)!=0) step *= -1; set_start(start_value + step); } // control mode else if (flags & ELW_SHIFT) { toggle_mode(); do_window_close_sound(); } else { // reset if (flags & ELW_MID_MOUSE) reset(); // start / stop else if (flags & ELW_LEFT_MOUSE) toggle_running(); do_click_sound(); } return 1; }
// handle context menu options // int Hud_Timer::cm_handler(window_info *win, int option) { switch (option) { case CMHT_MODE: toggle_mode(); break; case CMHT_RUNSTATE: toggle_running(); break; case CMHT_SETTIME: { if (!input) input = new INPUT_POPUP; else close_ipu(input); init_ipu(input, win->window_id, 220, -1, 4, 1, 0, set_timer_time); input->x = -230; input->y = last_base_y_start; display_popup_win(input, hud_timer_popup_title_str); } break; case CMHT_RESET: reset(); break; case CMHT_HELP: { const char *desc = get_option_description("view_hud_timer", INI_FILE_VAR); if (desc && (strlen(desc) > 0)) LOG_TO_CONSOLE(c_green1, desc); } break; case CMHT_KEEPSTATE: break; default: return 0; } return 1; }
/* Read one file, creating the buffer if necessary. */ static bool readone(char *bname, char *path) { int rc; zbuff_t *was = Curbuff; if (cfindbuff(bname)) return true; if (!cmakebuff(bname, path)) return false; putpaw("Reading %s", lastpart(path)); rc = zreadfile(path); if (rc < 0) { cdelbuff(Curbuff); zswitchto(was); putpaw("Read Error %s", lastpart(path)); return false; } toggle_mode(0); if (rc > 0) putpaw("New File"); #ifdef R_OK else if (access(path, R_OK | W_OK) == EOF) Curbuff->bmode |= VIEW; #endif set_last_bufname(was); return true; }
int main(int argc, char *argv[]) { /* Process command line options. */ process_opts(argc, argv); /* Verify that the scoreboard file is useable. */ verify_scoreboard_file(); /* Install signal handlers. */ signal(SIGINT, finish); signal(SIGTERM, finish); #if defined(PR_USE_NLS) && defined(HAVE_LOCALE_H) (void) setlocale(LC_ALL, ""); #endif /* Initialize the display. */ initscr(); cbreak(); noecho(); #ifndef HAVE_NCURSES nodelay(stdscr, TRUE); #endif curs_set(0); /* Paint the initial display. */ show_sessions(); /* Loop endlessly. */ for (;;) { int c = -1; #ifdef HAVE_NCURSES if (halfdelay(delay * 10) != ERR) c = getch(); #else sleep(delay); c = getch(); #endif if (c != -1) { if (tolower(c) == 'q') { break; } if (tolower(c) == 't') { toggle_mode(); } } show_sessions(); } /* done */ finish(0); return 0; }
// Set the desired message and then show the OSD void OSDPretty::ShowMessage(const QString& summary, const QString& message, const QImage& image) { SetMessage(summary, message, image); if (isVisible() && mode_ == Mode_Popup) { // The OSD is already visible, toggle or restart the timer if (toggle_mode()) { set_toggle_mode(false); // If timeout is disabled, timer hadn't been started if (!disable_duration()) timeout_->stop(); hide(); } else { if (!disable_duration()) timeout_->start(); // Restart the timer } } else { if (toggle_mode()) set_toggle_mode(false); // The OSD is not visible, show it show(); } }
bool route(int ch) { /* Keys available in both ESCAPE and REPLACE modes. */ switch (ch) { case CTRL('c'): case CTRL('q'): return false; break; case KEY_SUSPEND: case CTRL('z'): suspend(); break; case CTRL('w'): buf_write(); break; case CTRL('r'): buf_revert(); break; case CTRL('['): set_state(ESCAPE); break; case KEY_LEFT: move_col(-1); break; case KEY_UP: move_line(-1); break; case KEY_RIGHT: move_col(+1); break; case KEY_DOWN: move_line(+1); break; case '\t': toggle_mode(); break; default: if (buf.state == REPLACE) { replace_char(ch); return true; } break; } /* Keys available in only ESCAPE mode. */ switch (ch) { case 'R': set_state(REPLACE); break; case 'h': move_col(-1); break; case 'k': move_line(-1); break; case 'l': move_col(+1); break; case 'j': move_line(+1); break; case 'w': goto_grp_next(); break; case 'b': goto_grp_prev(); break; case 'g': goto_buffer_beg(); break; case 'G': goto_buffer_end(); break; case '^': goto_line_beg(); break; case '$': goto_line_end(); break; case 'd': goto_half_next(); break; case 'u': goto_half_prev(); break; case '?': view.help = !view.help; break; default: break; } return true; }
/* * Remove everything currently in `inbuf' and stick it up on the * in-memory display. There's a big state machine in here to * process escape sequences... */ void term_out(void) { int c; int must_update = FALSE; while ( (c = inbuf_getc()) != -1) { #ifdef LOG { static FILE *fp = NULL; if (!fp) fp = fopen("putty.log", "wb"); if (fp) fputc (c, fp); } #endif switch (termstate) { case TOPLEVEL: do_toplevel: switch (c) { case '\005': /* terminal type query */ ldisc->send ("\033[?1;2c", 7); break; case '\007': beep(); disptop = scrtop; must_update = TRUE; break; case '\b': if (curs_x == 0 && curs_y > 0) curs_x = cols-1, curs_y--; else if (wrapnext) wrapnext = FALSE; else curs_x--; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\016': cset = 1; break; case '\017': cset = 0; break; case '\033': termstate = SEEN_ESC; break; case 0233: termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case 0235: termstate = SEEN_OSC; esc_args[0] = 0; break; case '\r': curs_x = 0; wrapnext = FALSE; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\013': case '\014': case '\n': if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; if (cfg.lfhascr) curs_x = 0; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case '\t': do { curs_x++; } while (curs_x < cols-1 && !tabs[curs_x]); if (curs_x >= cols) curs_x = cols-1; { unsigned long *old_cpos = cpos; fix_cpos; check_selection (old_cpos, cpos); } disptop = scrtop; must_update = TRUE; break; default: if (c >= ' ' && c != 0234) { if (wrapnext) { cpos[1] = ATTR_WRAPPED; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; curs_x = 0; fix_cpos; wrapnext = FALSE; nl_count++; } if (insert) insch (1); check_selection (cpos, cpos+1); *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); curs_x++; if (curs_x == cols) { cpos--; curs_x--; wrapnext = wrap; } disptop = scrtop; } } break; case IGNORE_NEXT: termstate = TOPLEVEL; break; case OSC_MAYBE_ST: /* * This state is virtually identical to SEEN_ESC, with the * exception that we have an OSC sequence in the pipeline, * and _if_ we see a backslash, we process it. */ if (c == '\\') { do_osc(); termstate = TOPLEVEL; break; } /* else fall through */ case SEEN_ESC: termstate = TOPLEVEL; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case ' ': /* some weird sequence? */ termstate = IGNORE_NEXT; break; case '[': /* enter CSI mode */ termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case ']': /* xterm escape sequences */ termstate = SEEN_OSC; esc_args[0] = 0; break; case '(': /* should set GL */ termstate = SET_GL; break; case ')': /* should set GR */ termstate = SET_GR; break; case '7': /* save cursor */ save_cursor (TRUE); break; case '8': /* restore cursor */ save_cursor (FALSE); disptop = scrtop; must_update = TRUE; break; case '=': app_keypad_keys = TRUE; break; case '>': app_keypad_keys = FALSE; break; case 'D': /* exactly equivalent to LF */ if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case 'E': /* exactly equivalent to CR-LF */ curs_x = 0; wrapnext = FALSE; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; nl_count++; disptop = scrtop; break; case 'M': /* reverse index - backwards LF */ if (curs_y == marg_t) scroll (marg_t, marg_b, -1, TRUE); else if (curs_y > 0) curs_y--; fix_cpos; wrapnext = FALSE; disptop = scrtop; must_update = TRUE; break; case 'Z': /* terminal type query */ ldisc->send ("\033[?6c", 5); break; case 'c': /* restore power-on settings */ power_on(); fix_cpos; disptop = scrtop; must_update = TRUE; break; case '#': /* ESC # 8 fills screen with Es :-) */ termstate = SEEN_ESCHASH; break; case 'H': /* set a tab */ tabs[curs_x] = TRUE; break; } break; case SEEN_CSI: termstate = TOPLEVEL; /* default */ switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (esc_nargs <= ARGS_MAX) { if (esc_args[esc_nargs-1] == ARG_DEFAULT) esc_args[esc_nargs-1] = 0; esc_args[esc_nargs-1] = 10 * esc_args[esc_nargs-1] + c - '0'; } termstate = SEEN_CSI; break; case ';': if (++esc_nargs <= ARGS_MAX) esc_args[esc_nargs-1] = ARG_DEFAULT; termstate = SEEN_CSI; break; case '?': esc_query = TRUE; termstate = SEEN_CSI; break; case 'A': /* move up N lines */ move (curs_x, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'B': case 'e': /* move down N lines */ move (curs_x, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'C': case 'a': /* move right N cols */ move (curs_x + def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'D': /* move left N cols */ move (curs_x - def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'E': /* move down N lines and CR */ move (0, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'F': /* move up N lines and CR */ move (0, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'G': case '`': /* set horizontal posn */ move (def(esc_args[0], 1) - 1, curs_y, 0); disptop = scrtop; must_update = TRUE; break; case 'd': /* set vertical posn */ move (curs_x, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'H': case 'f': /* set horz and vert posns at once */ if (esc_nargs < 2) esc_args[1] = ARG_DEFAULT; move (def(esc_args[1], 1) - 1, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'J': /* erase screen or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(FALSE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'K': /* erase line or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(TRUE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'L': /* insert lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, -def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case 'M': /* delete lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case '@': /* insert chars */ insch (def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'P': /* delete chars */ insch (-def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'c': /* terminal type query */ ldisc->send ("\033[?6c", 5); break; case 'n': /* cursor position query */ if (esc_args[0] == 6) { char buf[32]; sprintf (buf, "\033[%d;%dR", curs_y + 1, curs_x + 1); ldisc->send (buf, strlen(buf)); } break; case 'h': /* toggle a mode to high */ toggle_mode (esc_args[0], esc_query, TRUE); break; case 'l': /* toggle a mode to low */ toggle_mode (esc_args[0], esc_query, FALSE); break; case 'g': /* clear tabs */ if (esc_nargs == 1) { if (esc_args[0] == 0) { tabs[curs_x] = FALSE; } else if (esc_args[0] == 3) { int i; for (i = 0; i < cols; i++) tabs[i] = FALSE; } } break; case 'r': /* set scroll margins */ if (!esc_query && esc_nargs <= 2) { int top, bot; top = def(esc_args[0], 1) - 1; if (top < 0) top = 0; bot = (esc_nargs <= 1 || esc_args[1] == 0 ? rows : def(esc_args[1], rows)) - 1; if (bot >= rows) bot = rows-1; if (top <= bot) { marg_t = top; marg_b = bot; curs_x = 0; /* * I used to think the cursor should be * placed at the top of the newly marginned * area. Apparently not: VMS TPU falls over * if so. */ curs_y = 0; fix_cpos; disptop = scrtop; must_update = TRUE; } } break; case 'm': /* set graphics rendition */ { int i; for (i=0; i<esc_nargs; i++) { switch (def(esc_args[i], 0)) { case 0: /* restore defaults */ curr_attr = ATTR_DEFAULT; break; case 1: /* enable bold */ curr_attr |= ATTR_BOLD; break; case 4: /* enable underline */ case 21: /* (enable double underline) */ curr_attr |= ATTR_UNDER; break; case 7: /* enable reverse video */ curr_attr |= ATTR_REVERSE; break; case 22: /* disable bold */ curr_attr &= ~ATTR_BOLD; break; case 24: /* disable underline */ curr_attr &= ~ATTR_UNDER; break; case 27: /* disable reverse video */ curr_attr &= ~ATTR_REVERSE; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: /* foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= (esc_args[i] - 30) << ATTR_FGSHIFT; break; case 39: /* default-foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= ATTR_DEFFG; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: /* background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= (esc_args[i] - 40) << ATTR_BGSHIFT; break; case 49: /* default-background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= ATTR_DEFBG; break; } } } break; case 's': /* save cursor */ save_cursor (TRUE); break; case 'u': /* restore cursor */ save_cursor (FALSE); disptop = scrtop; must_update = TRUE; break; case 't': /* set page size - ie window height */ request_resize (cols, def(esc_args[0], 24)); deselect(); break; case 'X': /* write N spaces w/o moving cursor */ { int n = def(esc_args[0], 1); unsigned long *p = cpos; if (n > cols - curs_x) n = cols - curs_x; check_selection (cpos, cpos+n); while (n--) *p++ = ERASE_CHAR; disptop = scrtop; must_update = TRUE; } break; case 'x': /* report terminal characteristics */ { char buf[32]; int i = def(esc_args[0], 0); if (i == 0 || i == 1) { strcpy (buf, "\033[2;1;1;112;112;1;0x"); buf[2] += i; ldisc->send (buf, 20); } } break; } break; case SET_GL: case SET_GR: switch (c) { case 'A': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_GBCHR; break; case '0': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_LINEDRW; break; default: /* specifically, 'B' */ cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_ASCII; break; } termstate = TOPLEVEL; break; case SEEN_OSC: osc_w = FALSE; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case 'P': /* Linux palette sequence */ termstate = SEEN_OSC_P; osc_strlen = 0; break; case 'R': /* Linux palette reset */ palette_reset(); term_invalidate(); termstate = TOPLEVEL; break; case 'W': /* word-set */ termstate = SEEN_OSC_W; osc_w = TRUE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; case 'L': /* * Grotty hack to support xterm and DECterm title * sequences concurrently. */ if (esc_args[0] == 2) { esc_args[0] = 1; break; } /* else fall through */ default: termstate = OSC_STRING; osc_strlen = 0; } break; case OSC_STRING: if (c == 0234 || c == '\007') { /* * These characters terminate the string; ST and BEL * terminate the sequence and trigger instant * processing of it, whereas ESC goes back to SEEN_ESC * mode unless it is followed by \, in which case it is * synonymous with ST in the first place. */ do_osc(); termstate = TOPLEVEL; } else if (c == '\033') termstate = OSC_MAYBE_ST; else if (osc_strlen < OSC_STR_MAX) osc_string[osc_strlen++] = c; break; case SEEN_OSC_P: { int max = (osc_strlen == 0 ? 21 : 16); int val; if (c >= '0' && c <= '9') val = c - '0'; else if (c >= 'A' && c <= 'A'+max-10) val = c - 'A' + 10; else if (c >= 'a' && c <= 'a'+max-10) val = c - 'a' + 10; else termstate = TOPLEVEL; osc_string[osc_strlen++] = val; if (osc_strlen >= 7) { palette_set (osc_string[0], osc_string[1] * 16 + osc_string[2], osc_string[3] * 16 + osc_string[4], osc_string[5] * 16 + osc_string[6]); term_invalidate(); termstate = TOPLEVEL; } } break; case SEEN_OSC_W: switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; default: termstate = OSC_STRING; osc_strlen = 0; } break; case SEEN_ESCHASH: if (c == '8') { unsigned long *p = scrtop; int n = rows * (cols+1); while (n--) *p++ = ATTR_DEFAULT | 'E'; disptop = scrtop; must_update = TRUE; check_selection (scrtop, scrtop + rows * (cols+1)); } termstate = TOPLEVEL; break; } check_selection (cpos, cpos+1); } if (must_update || nl_count > MAXNL) term_update(); }
int main(void) { DDRB |= (1 << PWM_PIN); // Set PWM pin to output, enable main channel TCCR0A = FAST; // Set timer to do PWM for correct output pin and set prescaler timing TCCR0B = 0x01; // Set timer to do PWM for correct output pin and set prescaler timing restore_state(); // Read config values and saved state count_modes(); // Enable the current mode group // check button press time, unless we're in group selection mode if (mode_idx != GROUP_SELECT_MODE) { if ( we_did_a_fast_press() ) { // sram hasn't decayed yet, must have been a short press increment_fast_presses(); next_mode(); // Will handle wrap arounds } else { // Long press, keep the same mode reset_fast_presses(); if( !memory_is_enabled() ) {mode_idx = 0;} // if memory is turned off, set mode_idx to 0 } } save_mode(); // Turn features on or off as needed #ifdef VOLTAGE_MON ADC_on(); #else ADC_off(); #endif uint8_t output; uint8_t i = 0; uint16_t ticks = 0; #ifdef TURBO_RAMP_DOWN uint8_t adj_output = 255; #endif #ifdef VOLTAGE_MON uint8_t lowbatt_cnt = 0; uint8_t voltage; ADCSRA |= (1 << ADSC); // Make sure voltage reading is running for later #endif if(mode_idx > num_modes) { output = mode_idx; } // special modes, override output else { output = modes[mode_idx]; } while(1) { if (fast_presses[0] >= 12) { // Config mode if 12 or more fast presses _delay_s(); // wait for user to stop fast-pressing button reset_fast_presses(); // exit this mode after one use toggle_mode(GROUP_SELECT_MODE, 1); // Enter the mode group selection mode? toggle_options((options ^ 0b00010000), 2); // memory toggle_options((options ^ 0b00100000), 3); // hidden blinkies toggle_options((options ^ 0b01000000), 4); // hidden battcheck toggle_options((options ^ 0b10000000), 5); // turbo timer toggle_options(DEFAULTS, 6); // reset to defaults } else if (output == STROBE) { // 10Hz tactical strobe for(i=0;i<8;i++) { set_level(RAMP_SIZE); _delay_ms(33); set_output(0); _delay_ms(67); } } else if (output == BEACON) { set_level(RAMP_SIZE); _delay_ms(10); set_output(0); _delay_s(); _delay_s(); } else if (output == SOS) { // dot = 1 unit, dash = 3 units, space betwen parts of a letter = 1 unit, space between letters = 3 units #define SOS_SPEED 200 // these speeds aren't perfect, but they'll work for the [never] times they'll actually get used blink(3, SOS_SPEED); // 200 on, 400 off, 200 on, 400 off, 200 on, 400 off _delay_ms(SOS_SPEED); // wait for 200 blink(3, SOS_SPEED*5/2); // 500 on, 1000 off, 500 on, 1000 off, 500 on, 1000 off (techically too long on that last off beat, but oh well) blink(3, SOS_SPEED); // 200 on, 400 off, 200 on, 400 off, 200 on, 400 off _delay_s(); _delay_s(); } else if (output == BATT_CHECK) { blink(battcheck(), BLINK_SPEED/4); _delay_s(); _delay_s(); } else if (output == GROUP_SELECT_MODE) { mode_idx = 0; // exit this mode after one use for(i=0; i<NUM_MODEGROUPS; i++) { toggle_options(((options & 0b11110000) | i), i+1); } _delay_s(); } else { if ((output == TURBO) && ( ttimer_is_enabled() ) && (ticks > (TURBO_MINUTES * TICKS_PER_MINUTE))) { #ifdef TURBO_RAMP_DOWN if (adj_output > TURBO_LOWER) { adj_output = adj_output - 2; } set_output(adj_output); #else set_output(TURBO_LOWER); #endif } else { ticks ++; // count ticks for turbo timer set_level(output); } _delay_ms(500); // Otherwise, just sleep. } reset_fast_presses(); #ifdef VOLTAGE_MON if (ADCSRA & (1 << ADIF)) { // if a voltage reading is ready voltage = ADCH; // get the waiting value if (voltage < ADC_LOW) { // See if voltage is lower than what we were looking for lowbatt_cnt ++; } else { lowbatt_cnt = 0; } if (lowbatt_cnt >= 8) { // See if it's been low for a while, and maybe step down //set_output(0); _delay_ms(100); // blink on step-down: if (output > RAMP_SIZE) { // blinky modes output = RAMP_SIZE / 2; // step down from blinky modes to medium } else if (output > 1) { // regular solid mode output = output - 1; // step down from solid modes somewhat gradually } else { // Already at the lowest mode set_output(0); // Turn off the light set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power down as many components as possible sleep_mode(); } set_level(output); lowbatt_cnt = 0; _delay_s(); // Wait before lowering the level again } ADCSRA |= (1 << ADSC); // Make sure conversion is running for next time through } #endif // ifdef VOLTAGE_MON } }