From 9acc2704184dbb04bf8b34e880df945b7a4e8b56 Mon Sep 17 00:00:00 2001 From: Mike Bell Date: Tue, 9 May 2023 23:29:01 +0100 Subject: [PATCH] Growing circles - runs at 30FPS --- drivers/aps6404/aps6404.cpp | 21 +++++++++----- drivers/aps6404/aps6404.hpp | 1 + examples/dv_stick/dv_stick_test.cpp | 43 ++++++++++++++++++++++------- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/drivers/aps6404/aps6404.cpp b/drivers/aps6404/aps6404.cpp index e06be353..165612e4 100644 --- a/drivers/aps6404/aps6404.cpp +++ b/drivers/aps6404/aps6404.cpp @@ -93,12 +93,16 @@ namespace pimoroni { pio_offset = pio_add_program(pio, &sram_program); aps6404_program_init(pio, pio_sm, pio_offset, pin_csn, pin_d0, false, false, false); } + + last_cmd_was_write = false; } void APS6404::write(uint32_t addr, uint32_t* data, uint32_t len_in_bytes) { - wait_for_finish_blocking(); - - setup_cmd_buffer_dma(true); + if (!last_cmd_was_write) { + wait_for_finish_blocking(); + setup_cmd_buffer_dma(true); + last_cmd_was_write = true; + } for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len); len > 0; @@ -128,16 +132,18 @@ namespace pimoroni { } void APS6404::write_repeat(uint32_t addr, uint32_t data, uint32_t len_in_bytes) { - repeat_data = data; - wait_for_finish_blocking(); - - setup_cmd_buffer_dma(true); + if (!last_cmd_was_write) { + wait_for_finish_blocking(); + setup_cmd_buffer_dma(true); + last_cmd_was_write = true; + } for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len); len > 0; addr += page_len, len -= page_len, page_len = std::min(PAGE_SIZE, len)) { wait_for_finish_blocking(); + repeat_data = data; pio_sm_put_blocking(pio, pio_sm, (page_len << 1) - 1); pio_sm_put_blocking(pio, pio_sm, 0x38000000u | addr); @@ -193,6 +199,7 @@ namespace pimoroni { } void APS6404::start_read(uint32_t* read_buf, uint32_t total_len_in_words, int chain_channel) { + last_cmd_was_write = false; wait_for_finish_blocking(); dma_channel_config c = dma_channel_get_default_config(dma_channel); diff --git a/drivers/aps6404/aps6404.hpp b/drivers/aps6404/aps6404.hpp index 0d881bc8..aa1ddbc0 100644 --- a/drivers/aps6404/aps6404.hpp +++ b/drivers/aps6404/aps6404.hpp @@ -57,6 +57,7 @@ namespace pimoroni { uint dma_channel; uint read_cmd_dma_channel; + bool last_cmd_was_write = false; static constexpr int MULTI_READ_MAX_PAGES = 128; uint32_t multi_read_cmd_buffer[3 * MULTI_READ_MAX_PAGES]; diff --git a/examples/dv_stick/dv_stick_test.cpp b/examples/dv_stick/dv_stick_test.cpp index f3be0650..6e8e4ce4 100644 --- a/examples/dv_stick/dv_stick_test.cpp +++ b/examples/dv_stick/dv_stick_test.cpp @@ -12,6 +12,8 @@ using namespace pimoroni; #define FRAME_HEIGHT 480 int main() { + set_sys_clock_khz(200000, true); + stdio_init_all(); constexpr uint BUTTON_A = 9; @@ -37,26 +39,47 @@ int main() { printf("Starting\n"); + constexpr int NUM_CIRCLES = 50; + struct Circle { + uint16_t x, y, size, grow; + } circles[NUM_CIRCLES]; + + for(int i =0 ; i < 50 ; i++) + { + circles[i].size = (rand() % 50) + 1; + circles[i].grow = std::max(0, (rand() % 50) - 25); + circles[i].x = rand() % graphics.bounds.w; + circles[i].y = rand() % graphics.bounds.h; + } + while (true) { - while(gpio_get(BUTTON_A) == 1) { - sleep_ms(10); - } + //while(gpio_get(BUTTON_A) == 1) { + // sleep_ms(10); + //} uint32_t render_start_time = time_us_32(); graphics.set_pen(0xFFFF); graphics.clear(); - for(int i =0 ; i < 50 ; i++) + for(int i =0 ; i < NUM_CIRCLES ; i++) { - uint size = 25 + (rand() % 50); - uint x = rand() % graphics.bounds.w; - uint y = rand() % graphics.bounds.h; - graphics.set_pen(0); - graphics.circle(Point(x, y), size); + graphics.circle(Point(circles[i].x, circles[i].y), circles[i].size); graphics.set_pen(RGB::from_hsv(i * 0.02f, 1.0f, 1.0f).to_rgb555()); - graphics.circle(Point(x, y), size-2); + graphics.circle(Point(circles[i].x, circles[i].y), circles[i].size-2); + if (circles[i].grow) { + circles[i].size++; + circles[i].grow--; + } else { + circles[i].size--; + if (circles[i].size == 0) { + circles[i].size = 1; + circles[i].grow = rand() % 75; + circles[i].x = rand() % graphics.bounds.w; + circles[i].y = rand() % graphics.bounds.h; + } + } } #if 0