diff --git a/examples/pico_scroll/demo.cpp b/examples/pico_scroll/demo.cpp index 4eea2082..12dacbe7 100644 --- a/examples/pico_scroll/demo.cpp +++ b/examples/pico_scroll/demo.cpp @@ -13,16 +13,80 @@ int main() { pico_scroll.init(); + + bool a_pressed = false; + bool b_pressed = false; + bool x_pressed = false; + bool y_pressed = false; + uint32_t i = 0; while(true) { i++; + if(pico_scroll.is_pressed(pico_scroll.A)) { a_pressed = true; } + if(pico_scroll.is_pressed(pico_scroll.B)) { b_pressed = true; } + if(pico_scroll.is_pressed(pico_scroll.X)) { x_pressed = true; } + if(pico_scroll.is_pressed(pico_scroll.Y)) { y_pressed = true; } + pico_scroll.clear(); - for(int y = 0; y < 7; y++) { - for(int x = 0; x < 17; x++) { - int v = (x + y + (i / 25)) % 2 == 0 ? 0 : 3; - pico_scroll.set_pixel(x, y, v); + if(a_pressed & b_pressed & x_pressed & y_pressed) { + for(int y = 0; y < 7; y++) { + for(int x = 0; x < 17; x++) { + int v = (x + y + (i / 25)) % 2 == 0 ? 0 : 3; + pico_scroll.set_pixel(x, y, v); + } + } + } else { + // button test phase + float pulse = fmod(float(i) / 5.0f, M_PI * 2.0f); + int v = int((sin(pulse) * 4.0f) + 4.0f); + if(a_pressed) { + }else{ + pico_scroll.set_pixel(0, 0, v); + pico_scroll.set_pixel(0, 1, v); + pico_scroll.set_pixel(1, 0, v); + pico_scroll.set_pixel(1, 1, v); + pico_scroll.set_pixel(1, 2, v / 2); + pico_scroll.set_pixel(0, 2, v / 2); + pico_scroll.set_pixel(2, 0, v / 2); + pico_scroll.set_pixel(2, 1, v / 2); + } + + if(b_pressed) { + }else{ + pico_scroll.set_pixel(0, 6, v); + pico_scroll.set_pixel(0, 5, v); + pico_scroll.set_pixel(1, 6, v); + pico_scroll.set_pixel(1, 5, v); + pico_scroll.set_pixel(1, 4, v / 2); + pico_scroll.set_pixel(0, 4, v / 2); + pico_scroll.set_pixel(2, 6, v / 2); + pico_scroll.set_pixel(2, 5, v / 2); + } + + if(x_pressed) { + }else{ + pico_scroll.set_pixel(16, 0, v); + pico_scroll.set_pixel(16, 1, v); + pico_scroll.set_pixel(15, 0, v); + pico_scroll.set_pixel(15, 1, v); + pico_scroll.set_pixel(15, 2, v / 2); + pico_scroll.set_pixel(16, 2, v / 2); + pico_scroll.set_pixel(14, 0, v / 2); + pico_scroll.set_pixel(14, 1, v / 2); + } + + if(y_pressed) { + }else{ + pico_scroll.set_pixel(16, 6, v); + pico_scroll.set_pixel(16, 5, v); + pico_scroll.set_pixel(15, 6, v); + pico_scroll.set_pixel(15, 5, v); + pico_scroll.set_pixel(15, 4, v / 2); + pico_scroll.set_pixel(16, 4, v / 2); + pico_scroll.set_pixel(14, 6, v / 2); + pico_scroll.set_pixel(14, 5, v / 2); } } diff --git a/examples/pico_unicorn/demo.cpp b/examples/pico_unicorn/demo.cpp index 21d55a70..94a59967 100644 --- a/examples/pico_unicorn/demo.cpp +++ b/examples/pico_unicorn/demo.cpp @@ -32,10 +32,26 @@ int main() { pico_unicorn.init(); + bool a_pressed = false; + bool b_pressed = false; + bool x_pressed = false; + bool y_pressed = false; + uint32_t i = 0; while(true) { i = i + 1; uint8_t j = 0; + + + + + + if(pico_unicorn.is_pressed(pico_unicorn.A)) { a_pressed = true; } + if(pico_unicorn.is_pressed(pico_unicorn.B)) { b_pressed = true; } + if(pico_unicorn.is_pressed(pico_unicorn.X)) { x_pressed = true; } + if(pico_unicorn.is_pressed(pico_unicorn.Y)) { y_pressed = true; } + + /* for(uint8_t y = 0; y < 7; y++) { for(uint8_t x = 0; x < 16; x++) { uint8_t r, g, b; @@ -48,8 +64,71 @@ int main() { pico_unicorn.set_pixel(x, y, r, g, b); j = j + 1; } + }*/ + + pico_unicorn.clear(); + + if(a_pressed & b_pressed & x_pressed & y_pressed) { + for(int y = 0; y < 7; y++) { + for(int x = 0; x < 16; x++) { + int v = (x + y + (i / 100)) % 2 == 0 ? 0 : 100; + pico_unicorn.set_pixel(x, y, v); + } + } + } else { + // button test phase + float pulse = fmod(float(i) / 20.0f, M_PI * 2.0f); + int v = int((sin(pulse) * 50.0f) + 50.0f); + if(a_pressed) { + }else{ + pico_unicorn.set_pixel(0, 0, v); + pico_unicorn.set_pixel(0, 1, v); + pico_unicorn.set_pixel(1, 0, v); + pico_unicorn.set_pixel(1, 1, v); + pico_unicorn.set_pixel(1, 2, v / 2); + pico_unicorn.set_pixel(0, 2, v / 2); + pico_unicorn.set_pixel(2, 0, v / 2); + pico_unicorn.set_pixel(2, 1, v / 2); + } + + if(b_pressed) { + }else{ + pico_unicorn.set_pixel(0, 6, v); + pico_unicorn.set_pixel(0, 5, v); + pico_unicorn.set_pixel(1, 6, v); + pico_unicorn.set_pixel(1, 5, v); + pico_unicorn.set_pixel(1, 4, v / 2); + pico_unicorn.set_pixel(0, 4, v / 2); + pico_unicorn.set_pixel(2, 6, v / 2); + pico_unicorn.set_pixel(2, 5, v / 2); + } + + if(x_pressed) { + }else{ + pico_unicorn.set_pixel(15, 0, v); + pico_unicorn.set_pixel(15, 1, v); + pico_unicorn.set_pixel(14, 0, v); + pico_unicorn.set_pixel(14, 1, v); + pico_unicorn.set_pixel(14, 2, v / 2); + pico_unicorn.set_pixel(15, 2, v / 2); + pico_unicorn.set_pixel(13, 0, v / 2); + pico_unicorn.set_pixel(13, 1, v / 2); + } + + if(y_pressed) { + }else{ + pico_unicorn.set_pixel(15, 6, v); + pico_unicorn.set_pixel(15, 5, v); + pico_unicorn.set_pixel(14, 6, v); + pico_unicorn.set_pixel(14, 5, v); + pico_unicorn.set_pixel(14, 4, v / 2); + pico_unicorn.set_pixel(15, 4, v / 2); + pico_unicorn.set_pixel(13, 6, v / 2); + pico_unicorn.set_pixel(13, 5, v / 2); + } } + pico_unicorn.update(); } diff --git a/libraries/pico_unicorn/pico_unicorn.cpp b/libraries/pico_unicorn/pico_unicorn.cpp index 5f9901c6..82b9e392 100644 --- a/libraries/pico_unicorn/pico_unicorn.cpp +++ b/libraries/pico_unicorn/pico_unicorn.cpp @@ -36,7 +36,11 @@ enum pin { ROW_3 = 19, ROW_4 = 18, ROW_5 = 17, - ROW_6 = 16 + ROW_6 = 16, + A = 12, + B = 13, + X = 14, + Y = 15, }; constexpr uint32_t ROW_COUNT = 7; @@ -152,6 +156,20 @@ namespace pimoroni { sm = 0; uint offset = pio_add_program(bitstream_pio, &unicorn_program); unicorn_jetpack_program_init(bitstream_pio, sm, offset); + + // setup button inputs + gpio_set_function(pin::A, GPIO_FUNC_SIO); gpio_set_dir(pin::A, GPIO_IN); gpio_pull_up(pin::A); + gpio_set_function(pin::B, GPIO_FUNC_SIO); gpio_set_dir(pin::B, GPIO_IN); gpio_pull_up(pin::B); + gpio_set_function(pin::X, GPIO_FUNC_SIO); gpio_set_dir(pin::X, GPIO_IN); gpio_pull_up(pin::X); + gpio_set_function(pin::Y, GPIO_FUNC_SIO); gpio_set_dir(pin::Y, GPIO_IN); gpio_pull_up(pin::Y); + } + + void PicoUnicorn::clear() { + for(uint8_t y = 0; y < 7; y++) { + for(uint8_t x = 0; x < 16; x++) { + set_pixel(x, y, 0); + } + } } void PicoUnicorn::set_pixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b) { @@ -193,6 +211,10 @@ namespace pimoroni { } } + void PicoUnicorn::set_pixel(uint8_t x, uint8_t y, uint8_t v) { + set_pixel(x, y, v, v, v); + } + void PicoUnicorn::update() { // copy data to pio tx fifo 4 bytes at a time uint32_t *p = (uint32_t *)bitstream; @@ -200,4 +222,9 @@ namespace pimoroni { pio_sm_put_blocking(bitstream_pio, sm, *p++); } } + + bool PicoUnicorn::is_pressed(uint8_t button) { + return !gpio_get(button); + } + } \ No newline at end of file diff --git a/libraries/pico_unicorn/pico_unicorn.hpp b/libraries/pico_unicorn/pico_unicorn.hpp index 5085a583..5fe75379 100644 --- a/libraries/pico_unicorn/pico_unicorn.hpp +++ b/libraries/pico_unicorn/pico_unicorn.hpp @@ -12,7 +12,17 @@ namespace pimoroni { public: void init(); void update(); + + void clear(); void set_pixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b); + void set_pixel(uint8_t x, uint8_t y, uint8_t v); + + bool is_pressed(uint8_t button); + + static const uint8_t A = 12; + static const uint8_t B = 13; + static const uint8_t X = 14; + static const uint8_t Y = 15; }; } \ No newline at end of file