more demo stuff

master
Ondřej Hruška 2 years ago
parent ab4119a1a9
commit 21a04135b6
  1. 155
      main.c
  2. 2
      ufb/framebuffer.c
  3. 10
      ufb/framebuffer.h

155
main.c

@ -1,7 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/binary_info.h"
#include "hardware/regs/rosc.h"
#include "hardware/spi.h"
@ -65,9 +68,51 @@ static const fb_bitmap_t zir = {
.data = zir_data
};
void seed_random_from_rosc()
{
uint32_t random = 0x811c9dc5;
uint8_t next_byte = 0;
volatile uint32_t *rnd_reg = (uint32_t *)(ROSC_BASE + ROSC_RANDOMBIT_OFFSET);
for (int i = 0; i < 16; i++) {
for (int k = 0; k < 8; k++) {
next_byte = (next_byte << 1) | (*rnd_reg & 1);
}
random ^= next_byte;
random *= 0x01000193;
}
srand(random);
}
void freeline(float x1, float y1, float x2, float y2, fbcolor_t color)
{
float dx = ((float) x2 - (float) x1);
float dy = (float) y2 - (float) y1;
float dxa = dx > 0 ? dx : -dx;
float dya = dy > 0 ? dy : -dy;
float maxdist = MAX(dxa, dya);
dx /= maxdist;
dy /= maxdist;
fb_px((fbpos_t) roundf(x1), (fbpos_t) roundf(y1), color);
//fb_px((fbpos_t) x2, (fbpos_t) y2, color);
for (uint d = 0; d <= (uint) maxdist; d++) {
x1 += dx;
y1 += dy;
fb_px((fbpos_t) roundf(x1), (fbpos_t) roundf(y1), color);
}
}
int main() {
stdio_init_all();
seed_random_from_rosc();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
@ -75,27 +120,111 @@ int main() {
fb_clear();
fb_bitmap(5, 5, &zir);
fb_bitmap(20, 5, &zir);
fb_text(40, 35, "MEOW", FONT_DOUBLE, 1);
fb_text(50, 20, "meow", FONT_DOUBLE, 1);
fb_blit();
fb_frame(0, 0, 128, 64, 2, 1);
#define NUMBALLS 50
#define BALLW 2
struct ball {
float x;
float y;
float sx;
float sy;
};
struct ball balls[NUMBALLS];
for (uint i = 0; i < NUMBALLS; i++) {
balls[i].x = (float) (random() % FBW);
balls[i].y = (float) (random() % FBH);
balls[i].sx = ((float) (random() % 100) - 50.0f) / 50.0f;
balls[i].sy = ((float) (random() % 100) - 50.0f) / 50.0f;
}
fb_blit();
float fi = 0;
while (1) {
oled_invert(true);
//gpio_put(LED_PIN, 0);
//oled_invert(true);
fi += M_PI / 180.0f;
for (uint i = 0; i < NUMBALLS; i++) {
struct ball *ball = &balls[i];
ball->x += ball->sx;
ball->y += ball->sy;
if (ball->sx < 0 && ball->x <= 0) {
ball->sx *= -1;
ball->x = 0;
}
if (ball->sx > 0 && ball->x >= FBW - BALLW) {
ball->sx *= -1;
ball->x = FBW - BALLW;
}
if (ball->sy < 0 && ball->y <= 0) {
ball->sy *= -1;
ball->y = 0;
}
if (ball->sy > 0 && ball->y >= FBH - BALLW) {
ball->sy *= -1;
ball->y = FBH - BALLW;
}
}
// rotating hexagon
const float CW = 15;
const float AA = M_PI / 3.0f;
const float HEXX = 30;
const float HEXY = 32;
float ar[] = {
sinf(0 + fi) * CW,
cosf(0 + fi) * CW,
sinf(AA + fi) * CW,
cosf(AA + fi) * CW,
sinf(AA*2 + fi) * CW,
cosf(AA*2 + fi) * CW,
sinf(AA*3 + fi) * CW,
cosf(AA*3 + fi) * CW,
sinf(AA*4 + fi) * CW,
cosf(AA*4 + fi) * CW,
sinf(AA*5 + fi) * CW,
cosf(AA*5 + fi) * CW,
sinf(AA*6 + fi) * CW,
cosf(AA*6 + fi) * CW,
};
fb_clear();
fb_text(70, 30, "MEOW", FONT_DOUBLE, 1);
fb_text(80, 15, "meow", FONT_DOUBLE, 1);
for (uint i = 3; i <= 13; i += 2) {
freeline(HEXX + ar[i-3], HEXY + ar[i-2], HEXX + ar[i-1], HEXY + ar[i], 1);
if (i == 3 || i == 7 || i == 11) {
fb_text(HEXX + ar[i-3] -5, HEXY + ar[i-2] - 3, "Miau!", FONT_5X7, 1);
}
}
for (uint i = 0; i < NUMBALLS; i++) {
struct ball *ball = &balls[i];
fb_rect((fbpos_t) roundf(ball->x), (fbpos_t) roundf(ball->y), BALLW, BALLW, 1);
}
fb_blit();
gpio_put(LED_PIN, 0);
sleep_ms(1000);
sleep_ms(10);
oled_invert(false);
//oled_invert(false);
gpio_put(LED_PIN, 1);
//gpio_put(LED_PIN, 1);
//puts("Hello World\n");
sleep_ms(1000);
//sleep_ms(1000);
}
}

@ -48,7 +48,7 @@ void fb_invert()
void fb_px(fbpos_t x, fbpos_t y, fbcolor_t color)
{
if (x >= FBW || y >= FBH) { return; }
if (x >= FBW || y >= FBH || x < 0 || y < 0) { return; }
const fbpos_t row = y / 8;
const fbpos_t rowrem = y % 8;
const fbsize_t cell = (fbsize_t) x + (fbsize_t) row * FBW;

@ -16,7 +16,7 @@
/// Width/height type
typedef uint16_t fbsize_t;
/// Position type (X/Y)
typedef uint8_t fbpos_t;
typedef int16_t fbpos_t;
/// Color type
typedef uint8_t fbcolor_t;
@ -88,12 +88,12 @@ void fb_frame(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, fbpos_t thickness, fbc
/// Draw a bitmap using the bitmap struct
#if IS_AVR
static inline void fb_bitmap_P(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap) {
fb_bitmap_ex_P(x, y, bitmap->width, bitmap->height, bitmap->data, 1);
static inline void fb_bitmap_P(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap, fbcolor_t color) {
fb_bitmap_ex_P(x, y, bitmap->width, bitmap->height, bitmap->data, color);
}
#else
static inline void fb_bitmap(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap) {
fb_bitmap_ex(x, y, bitmap->width, bitmap->height, bitmap->data, 1);
static inline void fb_bitmap(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap, fbcolor_t color) {
fb_bitmap_ex(x, y, bitmap->width, bitmap->height, bitmap->data, color);
}
#endif

Loading…
Cancel
Save