diff --git a/jackalope/jackalope.ino b/jackalope/jackalope.ino new file mode 100644 index 0000000000000000000000000000000000000000..2139a92feec12f0c4a5e878c0c30897176d73983 --- /dev/null +++ b/jackalope/jackalope.ino @@ -0,0 +1,309 @@ +#include <math.h> +#include <Wire.h> +#include <hexbright.h> + +// Modes +#define MODE_OFF_PREVIEW 0 +#define MODE_OFF 1 +#define MODE_STATIC_PREVIEW 2 +#define MODE_STATIC 3 +#define MODE_DYNAMIC_PREVIEW 4 +#define MODE_FADE 5 +#define MODE_BLINKING 6 +#define MODE_STROBE 7 +#define MODE_DAZZLE 8 +#define MODE_TAPS_PREVIEW 9 +#define MODE_TAPS_RECORD 10 +#define MODE_TAPS_PLAYBACK 11 + +// State +byte mode; +hexbright hb; +char fade_direction = -1; + +/*** + * + * Edit these 4 parameters for your own brightness levels, + * which level to use first and wether to increase or + * decrease from that level to the next + * + ***/ + +#define BRIGHTNESS_COUNT 5 +int brightness[BRIGHTNESS_COUNT] = {10, 250, 500, 750, 1000}; +int current_brightness = 0; +int increase_brightness = 1; + +/*** + * + * Define the time (in milliseconds) for switching between + * static/non-static mode and until switching off + * + ***/ + +int DOUBLECLICK = 100; +int HOLD_SHORT = 500; +int HOLD_LONG = 2000; + +void setup() +{ + /// Set DEBUG to a non-zero value in hexbright.h to enable printing + hb.init_hardware(); + mode = MODE_OFF; +} + +void loop() +{ + hb.update(); + hb.print_charge(GLED); + + boolean button_just_pressed = hb.button_just_pressed(); + boolean button_just_released = hb.button_just_released(); + boolean button_pressed = hb.button_pressed(); + int button_pressed_time = hb.button_pressed_time(); + int button_released_time = hb.button_released_time(); + + byte newMode = mode; + + switch (mode) { + case MODE_OFF_PREVIEW: + if (button_just_released) { + newMode = MODE_OFF; + } + break; + case MODE_OFF: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_TAPS_PREVIEW; + } else if (button_just_released && button_pressed_time > HOLD_SHORT) { + newMode = MODE_DYNAMIC_PREVIEW; + } else if (button_just_released) { + newMode = MODE_STATIC; + } + break; + case MODE_STATIC_PREVIEW: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_just_released) { + newMode = MODE_STATIC; + } + break; + case MODE_STATIC: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_pressed && button_pressed_time > HOLD_SHORT) { + newMode = MODE_DYNAMIC_PREVIEW; + } else if (button_pressed && button_released_time < DOUBLECLICK) { + current_brightness = BRIGHTNESS_COUNT-1; + hb.set_light(CURRENT_LEVEL, brightness[current_brightness], NOW); + newMode = MODE_STATIC_PREVIEW; + } else if (button_just_released) { + cycleBrightness(); + } + break; + case MODE_DYNAMIC_PREVIEW: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_just_released) { + /*** + * + * Edit this for the first non-static mode to use + * + ***/ + //newMode = MODE_FADE; + newMode = MODE_BLINKING; + //newMode = MODE_STROBE; + //newMode = MODE_DAZZLE; + } + break; + case MODE_FADE: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_pressed && button_pressed_time > HOLD_SHORT) { + newMode = MODE_STATIC_PREVIEW; + } else if (button_just_released) { + newMode = MODE_BLINKING; + } + break; + case MODE_BLINKING: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_pressed && button_pressed_time > HOLD_SHORT) { + newMode = MODE_STATIC_PREVIEW; + } else if (button_just_released) { + newMode = MODE_STROBE; + } + break; + case MODE_STROBE: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_pressed && button_pressed_time > HOLD_SHORT) { + newMode = MODE_STATIC_PREVIEW; + } else if (button_just_released) { + newMode = MODE_DAZZLE; + } + break; + case MODE_DAZZLE: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_pressed && button_pressed_time > HOLD_SHORT) { + newMode = MODE_STATIC_PREVIEW; + } else if (button_just_released) { + newMode = MODE_FADE; + } + break; + case MODE_TAPS_PREVIEW: + if (button_just_released) { + newMode = MODE_TAPS_RECORD; + } + break; + case MODE_TAPS_RECORD: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_just_released) { + newMode = MODE_TAPS_PLAYBACK; + } + break; + case MODE_TAPS_PLAYBACK: + if (button_pressed && button_pressed_time > HOLD_LONG) { + newMode = MODE_OFF_PREVIEW; + } else if (button_just_released) { + newMode = MODE_TAPS_RECORD; + } + break; + } + + // Do the mode transitions + if (newMode != mode) { + switch (newMode) { + case MODE_OFF_PREVIEW: + Serial.println("Mode = off_preview"); + hb.set_light(0, OFF_LEVEL, NOW); + break; + case MODE_OFF: + Serial.println("Mode = off"); + current_brightness = 0; + hb.set_light(0, OFF_LEVEL, NOW); + break; + case MODE_STATIC_PREVIEW: + Serial.println("Mode = static_preview"); + /*** + * + * Comment the following line out if you don't want static mode + * when switching off from non-static mode + * + ***/ + hb.set_light(CURRENT_LEVEL, brightness[current_brightness], NOW); + break; + case MODE_STATIC: + Serial.println("Mode = static"); + increase_brightness = 1; + hb.set_light(CURRENT_LEVEL, brightness[current_brightness], NOW); + break; + case MODE_DYNAMIC_PREVIEW: + Serial.println("Mode = dynamic_preview"); + break; + case MODE_FADE: + Serial.println("Mode = fade"); + break; + case MODE_BLINKING: + Serial.println("Mode = blinking"); + break; + case MODE_STROBE: + Serial.println("Mode = strobe"); + break; + case MODE_DAZZLE: + Serial.println("Mode = dazzle"); + break; + case MODE_TAPS_PREVIEW: + Serial.println("Mode = taps_preview"); + break; + case MODE_TAPS_RECORD: + Serial.println("Mode = taps_record"); + break; + case MODE_TAPS_PLAYBACK: + Serial.println("Mode = taps_playback"); + break; + } + mode = newMode; + } + + /*** + * + * Change the conditional check of the non-static mode + * you have set as your first to already use it while + * the button is still pressed (>500 to <2000 ms) + * + ***/ + + //if (mode == MODE_DYNAMIC_PREVIEW || mode == MODE_BLINKING) { + if (mode == MODE_BLINKING) { + static int i = 0; + i = (i+1)%40; + if(i==0) { + hb.set_light(MAX_LEVEL, 0, 50); + } + } + + //if (mode == MODE_DYNAMIC_PREVIEW || mode == MODE_STROBE) { + if (mode == MODE_STROBE) { + static unsigned long flash_time = millis(); + if(flash_time+70<millis()) { + flash_time = millis(); + hb.set_light(MAX_LEVEL, 0, 20); + } + } + + //if (mode == MODE_DYNAMIC_PREVIEW || mode == MODE_DAZZLE) { + if (mode == MODE_DAZZLE) { + hb.set_light(0, (random(4)<1)*1000, NOW); + } + + //if (mode == MODE_DYNAMIC_PREVIEW || mode == MODE_FADE) { + if (mode == MODE_FADE) { + if (!hb.light_change_remaining()) { + if (fade_direction<0) { + hb.set_light(CURRENT_LEVEL, 1000, 1000-(hb.get_light_level())); + fade_direction = 1; + } else { + hb.set_light(CURRENT_LEVEL, 1, hb.get_light_level()); + fade_direction = -1; + } + } + } + + if (mode == MODE_TAPS_PREVIEW) { + if (hb.get_led_state(GLED) == LED_OFF) { + hb.set_led(GLED, 50, 100, 255); + } + } + + if (mode == MODE_TAPS_RECORD) { + if (hb.get_led_state(RLED) == LED_OFF) { + hb.set_led(RLED, 50, 250, 255); + } + } + + if (mode == MODE_TAPS_PLAYBACK) { + if (hb.get_led_state(GLED) == LED_OFF) { + hb.set_led(GLED, 50, 250, 255); + } + } + +} + +void cycleBrightness() { + Serial.println("Cycle Brightness!"); + + if(current_brightness == BRIGHTNESS_COUNT-1 && increase_brightness == 1) { + increase_brightness = 0; + } else if(current_brightness == 0 && increase_brightness == 0) { + increase_brightness = 1; + } + + if(increase_brightness == 1) { + current_brightness = (current_brightness+1)%BRIGHTNESS_COUNT; + } else { + current_brightness = (current_brightness-1)%BRIGHTNESS_COUNT; + } + hb.set_light(CURRENT_LEVEL, brightness[current_brightness], NOW); +}