Example #1
0
File: gui.c Project: InSoonPark/asf
void gui_exec(uint32_t tick) {

    int i;
        static int pressed_button;
        static enum { INPUT, RUN } state = INPUT;

        switch (state)
        {
        case INPUT:
        {
                i = poll_button(tick);
                if ( i < 0 ) { // No action required
                        break;
                }
                else {
                        if (button_contents.cbs[i]) {
                                pressed_button = i;
                                state = RUN;
                        }
                }
        }
        break;

        case RUN:
        {
#ifdef GUI_COMPAT
                if (button_contents.cbs[pressed_button]() == CMD_INPROGRESS)
                        return;
#else
                button_contents.cbs[pressed_button]();
#endif
                state = INPUT;
                pressed_button = -1;
        }
        } /* case */
        // Poll gui_getstring
        gui_getstring(NULL, NULL);
        gui_draw(1);
}
Example #2
0
int main(void)
{
	uint8_t button;
	mode_t mode = MODE_OFF;
	mode_t next_mode = MODE_OFF;
	
	uint8_t up_time = 0;
	uint8_t down_time = 0;
	uint8_t time = 0;

	init_hardware();

	leds[GREEN_LED].state = LED_OFF;
	leds[GREEN_LED].on_time = 31;
	leds[GREEN_LED].off_time = 31;

	leds[RED_LED].state = LED_HIZ;


	while (1) {
		button = poll_button();

		if (button & 2) {
			if (down_time < 255) {
				down_time++;
			}
			up_time = 0;
		} else {
			if (up_time < 255) {
				up_time++;
			}
			down_time = 0;
		}

		if (time < 255) {
			time++;
		}

		// Button pressed
		if (button == 1) {
			if (mode != MODE_OFF && up_time >= 62) {
				next_mode = MODE_OFF;
			} else if (mode < MODE_CYCLE_END) {
				next_mode = mode + 1;
				if (next_mode == MODE_CYCLE_END) {
					next_mode = MODE_OFF;
				}
			} else {
				next_mode = MODE_OFF;
			}
		}

		// Button held
		if (down_time >= 37) {
			switch (mode) {
			case MODE_CYCLE_LEVEL1:
				next_mode = MODE_HOLD_BLINKY;
				break;
			case MODE_CYCLE_LEVEL2:
				next_mode = MODE_PERSIST_BLINKY;
				break;
			default:
				break;
			}
		}

		// Button released
		if (button == 2 && mode > MODE_PERSIST_END) {
			next_mode = MODE_OFF;
		}

		if (poll_temp() >= OVERTEMP) {
			if (mode > MODE_CYCLE_LEVEL2) {
				next_mode = MODE_CYCLE_LEVEL2;
			} else if (next_mode > MODE_CYCLE_LEVEL2) {
				next_mode = MODE_OFF;
			}
		}

		if (next_mode != mode) {
			mode = next_mode;

			set_power(mode);

			switch (mode) {
			case MODE_OFF:
				set_light(0);
				break;
			case MODE_CYCLE_LEVEL1:
				set_light(50);
				break;
			case MODE_CYCLE_LEVEL2:
				set_light(250);
				break;
			case MODE_CYCLE_LEVEL3:
				set_light(1000);
				break;
			case MODE_CYCLE_LEVEL4:
				set_light(1500);
				break;
			case MODE_CYCLE_LEVEL5:
				set_light(2000);
				break;
			case MODE_PERSIST_BLINKY:
			case MODE_HOLD_BLINKY:
				time = 0;
				set_light(2000);
				break;
			default:
				mode = MODE_OFF;
				break;
			}
		}

		switch (mode) {
		case MODE_PERSIST_BLINKY:
		case MODE_HOLD_BLINKY:
			if (time >= 24) {
				set_light(2000);
				time = 0;
			} else if (time >= 8) {
				set_light(0);
			}
			break;
		default:
			break;
		}

		switch (poll_charger()) {
		case CHARGE_SHUTDOWN:
			leds[GREEN_LED].state = LED_OFF;
			break;
		case CHARGE_CHARGING:
			leds[GREEN_LED].state |= LED_FLASH;
			break;
		case CHARGE_FINISHED:
			leds[GREEN_LED].state = LED_ON;
			break;
		}

		update_leds();
		sleep();
	}

	return 0;
}