kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Growing circles - runs at 30FPS
rodzic
5f8e7556f0
commit
9acc270418
|
@ -93,12 +93,16 @@ namespace pimoroni {
|
||||||
pio_offset = pio_add_program(pio, &sram_program);
|
pio_offset = pio_add_program(pio, &sram_program);
|
||||||
aps6404_program_init(pio, pio_sm, pio_offset, pin_csn, pin_d0, false, false, false);
|
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) {
|
void APS6404::write(uint32_t addr, uint32_t* data, uint32_t len_in_bytes) {
|
||||||
wait_for_finish_blocking();
|
if (!last_cmd_was_write) {
|
||||||
|
wait_for_finish_blocking();
|
||||||
setup_cmd_buffer_dma(true);
|
setup_cmd_buffer_dma(true);
|
||||||
|
last_cmd_was_write = true;
|
||||||
|
}
|
||||||
|
|
||||||
for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len);
|
for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len);
|
||||||
len > 0;
|
len > 0;
|
||||||
|
@ -128,16 +132,18 @@ namespace pimoroni {
|
||||||
}
|
}
|
||||||
|
|
||||||
void APS6404::write_repeat(uint32_t addr, uint32_t data, uint32_t len_in_bytes) {
|
void APS6404::write_repeat(uint32_t addr, uint32_t data, uint32_t len_in_bytes) {
|
||||||
repeat_data = data;
|
if (!last_cmd_was_write) {
|
||||||
wait_for_finish_blocking();
|
wait_for_finish_blocking();
|
||||||
|
setup_cmd_buffer_dma(true);
|
||||||
setup_cmd_buffer_dma(true);
|
last_cmd_was_write = true;
|
||||||
|
}
|
||||||
|
|
||||||
for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len);
|
for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len);
|
||||||
len > 0;
|
len > 0;
|
||||||
addr += page_len, len -= page_len, page_len = std::min(PAGE_SIZE, len))
|
addr += page_len, len -= page_len, page_len = std::min(PAGE_SIZE, len))
|
||||||
{
|
{
|
||||||
wait_for_finish_blocking();
|
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, (page_len << 1) - 1);
|
||||||
pio_sm_put_blocking(pio, pio_sm, 0x38000000u | addr);
|
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) {
|
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();
|
wait_for_finish_blocking();
|
||||||
|
|
||||||
dma_channel_config c = dma_channel_get_default_config(dma_channel);
|
dma_channel_config c = dma_channel_get_default_config(dma_channel);
|
||||||
|
|
|
@ -57,6 +57,7 @@ namespace pimoroni {
|
||||||
|
|
||||||
uint dma_channel;
|
uint dma_channel;
|
||||||
uint read_cmd_dma_channel;
|
uint read_cmd_dma_channel;
|
||||||
|
bool last_cmd_was_write = false;
|
||||||
|
|
||||||
static constexpr int MULTI_READ_MAX_PAGES = 128;
|
static constexpr int MULTI_READ_MAX_PAGES = 128;
|
||||||
uint32_t multi_read_cmd_buffer[3 * MULTI_READ_MAX_PAGES];
|
uint32_t multi_read_cmd_buffer[3 * MULTI_READ_MAX_PAGES];
|
||||||
|
|
|
@ -12,6 +12,8 @@ using namespace pimoroni;
|
||||||
#define FRAME_HEIGHT 480
|
#define FRAME_HEIGHT 480
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
set_sys_clock_khz(200000, true);
|
||||||
|
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
|
|
||||||
constexpr uint BUTTON_A = 9;
|
constexpr uint BUTTON_A = 9;
|
||||||
|
@ -37,26 +39,47 @@ int main() {
|
||||||
|
|
||||||
printf("Starting\n");
|
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 (true) {
|
||||||
while(gpio_get(BUTTON_A) == 1) {
|
//while(gpio_get(BUTTON_A) == 1) {
|
||||||
sleep_ms(10);
|
// sleep_ms(10);
|
||||||
}
|
//}
|
||||||
uint32_t render_start_time = time_us_32();
|
uint32_t render_start_time = time_us_32();
|
||||||
|
|
||||||
graphics.set_pen(0xFFFF);
|
graphics.set_pen(0xFFFF);
|
||||||
graphics.clear();
|
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.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.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
|
#if 0
|
||||||
|
|
Ładowanie…
Reference in New Issue