- unsigned char pinb = PINB;
- unsigned char i;
- unsigned char port_states[N_BUTTONS] = {
- pinb & _BV(PB6),
- pinb & _BV(PB4),
- };
- for (i = 0; i < N_BUTTONS; i++) {
- if (!port_states[i]) { // is pressed
- if (button_pressed[i] == 0) {
- // begin of button press
- button_pressed[i] = 1;
- button_start[i] = jiffies;
-#if 0
- // log_byte(0xC0);
- // log_word(jiffies);
-#endif
- } else if (button_pressed[i] == 1) {
- // been already pressed
- uint16_t duration = jiffies - button_start[i];
- if (duration > 80) {
- // long button press
- button_pressed[i] = 2;
- long_press(i);
- }
- }
- } else { // is not pressed
- if (button_pressed[i]) { // just depressed
- uint16_t duration = jiffies - button_start[i];
-#if 1
- log_byte(0xC1);
- log_word(duration);
- log_flush();
-#endif
- button_pressed[i] = 0;
- if (duration > 6 && duration < 30)
- short_press(i);
- if (sleep_after_release)
- do_sleep();
- }
+ if (button == 0) {
+ power_down();
+ return;
+ }
+
+ // button 1 - cycle through states
+ user_params_state++;
+
+ if (user_params_state >= MAX_USER_PARAMS)
+ user_params_state = 1;
+
+ set_status_led(0, status_pattern_select(0));
+ set_status_led(1, status_pattern_select(1));
+ user_params_starttime = jiffies;
+}
+
+void init_buttons()
+{
+ DDRA &= ~(_BV(PA3) | _BV(PA4));
+ PORTA |= _BV(PA3) | _BV(PA4);
+
+ button_start[0] = 0;
+ button_start[1] = 0;
+ prev_pin = _BV(PA3) | _BV(PA4);
+ user_params_state = 0;
+}
+
+static void handle_button(unsigned char button, unsigned char cur,
+ unsigned char prev)
+{
+ // BEWARE: pins are at _zero_ when pressed!
+ if (!cur && prev) { // --- just pressed ---
+ button_start[button] = jiffies;
+ set_status_led(button, off_pattern);
+
+ } else if (!cur && !prev) { // --- is still pressed ---
+ uint16_t duration = jiffies - button_start[button];
+
+ if (duration > 80) {
+ set_status_led(button, on_pattern);
+ // acknowledge long press