diff --git a/gfx2d/CMakeLists.txt b/gfx2d/CMakeLists.txt new file mode 100644 index 0000000..67d885e --- /dev/null +++ b/gfx2d/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.13) + +add_executable(gfx2d + src/main.cpp +) + +target_link_libraries(gfx2d common picoled hardware_pwm) + +pico_enable_stdio_uart(gfx2d 0) +pico_enable_stdio_usb(gfx2d 1) + +pico_add_extra_outputs(gfx2d) diff --git a/gfx2d/src/main.cpp b/gfx2d/src/main.cpp new file mode 100644 index 0000000..fc5d424 --- /dev/null +++ b/gfx2d/src/main.cpp @@ -0,0 +1,100 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +using namespace picoled; + +namespace +{ + +float get_random() +{ + return rand() / static_cast(RAND_MAX); +} + +int32_t get_encoder_delta(i2c_inst* i2c, uint8_t address) +{ + // SEESAW_ENCODER_BASE and SEESAW_ENCODER_DELTA values + // https://github.com/adafruit/Adafruit_Seesaw/blob/master/Adafruit_seesaw.h + uint8_t buf[4] = { 0x11, 0x40, 0x00, 0x00 }; + i2c_write_blocking(i2c, address, buf, 2, false); + sleep_us(250); + i2c_read_blocking(i2c, address, buf, 4, false); + return + (static_cast(buf[0]) << 24) | + (static_cast(buf[1]) << 16) | + (static_cast(buf[2]) << 8 ) | + (static_cast(buf[3]) << 0 ); +} + +constexpr uint8_t LEFT_ENCODER_ADDRESS = 0x36; +constexpr uint8_t RIGHT_ENCODER_ADDRESS = 0x37; +constexpr uint8_t OLED_ADDRESS = 0x3C; + +} + +int main() +{ + stdio_usb_init(); + srand(time_us_64()); + + i2c_init(i2c0, 1000 * 1000); + gpio_set_function(0, GPIO_FUNC_I2C); + gpio_set_function(1, GPIO_FUNC_I2C); + gpio_pull_up(0); + gpio_pull_up(1); + + ssd1306 oled(i2c0, OLED_ADDRESS); + gfx::gfx2d gfx(oled); + + float angle; + int64_t time = time_us_32(); + + buffer tex(16, 16); + for (int x = 0; x < 16; x++) + { + for (int y = 0; y < 16; y++) + { + tex.write(x, y, x * y); + } + } + + while (true) + { + oled.clear(); + + int64_t current = time_us_32(); + const float dt = std::abs(current - time) / 1000000.0f; + time = current; + + angle -= get_encoder_delta(i2c0, RIGHT_ENCODER_ADDRESS) / 12.0f * 3.1415926f; + + const float angle2 = angle + (2 * 3.1415926f) / 3; + const float angle3 = angle + 2 * (2 * 3.1415926f) / 3; + + const gfx::vec2 ap = { 30.0f + 20 * cosf(angle), 30.0f + 20 * sinf(angle) }; + const gfx::vec2 bp = { 30.0f + 20 * cosf(angle2), 30.0f + 20 * sinf(angle2) }; + const gfx::vec2 cp = { 30.0f + 20 * cosf(angle3), 30.0f + 20 * sinf(angle3) }; + + const gfx::vec2 at = { 0.0f, 0.0f }; + const gfx::vec2 bt = { 0.0f, 0.0f }; + const gfx::vec2 ct = { 1.0f, 1.0f }; + + gfx.draw_triangle({ + { ap, at }, + { bp, bt }, + { cp, ct } + }, tex); + + oled.swap_buffers(); + oled.update(); + } +} diff --git a/picoled b/picoled index 10e9176..dfeccd5 160000 --- a/picoled +++ b/picoled @@ -1 +1 @@ -Subproject commit 10e9176d13b249e2705745a441aa333d8a2c1823 +Subproject commit dfeccd50b9d2e3583675b80cd4225cb98215356c diff --git a/pong/src/main.cpp b/pong/src/main.cpp index 9bb3907..6a5b059 100644 --- a/pong/src/main.cpp +++ b/pong/src/main.cpp @@ -231,7 +231,7 @@ int main() ai.draw(oled); ball.draw(oled); - oled.update(); oled.swap_buffers(); + oled.update(); } }