comments about original version

pull/881/head
Nicolau Leal Werneck 2023-12-10 13:38:09 +01:00
rodzic 0e772f06cd
commit 7bf03d9242
3 zmienionych plików z 126 dodań i 110 usunięć

Wyświetl plik

@ -1,15 +1,15 @@
/* /*
Pico Unicorn Plasma Example Pico Unicorn Plasma Example
Written by Tim Kerby https://github.com/tkerby Written by Tim Kerby https://github.com/tkerby
Hardware: Raspberry Pi Pico with Pimoroni Unicorn Pico Display Hardware: Raspberry Pi Pico with Pimoroni Unicorn Pico Display
Printf over USB 9600 8N1 (see makefile) Printf over USB 9600 8N1 (see makefile)
Based on Adafruit Arduino Example for 32x32 panel Based on Adafruit Arduino Example for 32x32 panel
Originally written by Limor Fried/Ladyada & Phil Burgess/PaintYourDragon for Adafruit Industries. Originally written by Limor Fried/Ladyada & Phil Burgess/PaintYourDragon for Adafruit Industries.
https://github.com/adafruit/RGB-matrix-Panel/blob/master/examples/plasma_32x32/plasma_32x32.ino https://github.com/adafruit/RGB-matrix-Panel/blob/master/examples/plasma_32x32/plasma_32x32.ino
BSD License BSD License
*/ */
#include <stdio.h> #include <stdio.h>
@ -24,121 +24,129 @@ using namespace pimoroni;
PicoUnicorn pico_unicorn; PicoUnicorn pico_unicorn;
template<typename T> // Sine table to speed up execution
T cb(T x){return x*x*x;} static const int8_t sinetab[256] = {
0, 2, 5, 8, 11, 15, 18, 21,
24, 27, 30, 33, 36, 39, 42, 45,
48, 51, 54, 56, 59, 62, 65, 67,
70, 72, 75, 77, 80, 82, 85, 87,
89, 91, 93, 96, 98, 100, 101, 103,
105, 107, 108, 110, 111, 113, 114, 116,
117, 118, 119, 120, 121, 122, 123, 123,
124, 125, 125, 126, 126, 126, 126, 126,
127, 126, 126, 126, 126, 126, 125, 125,
124, 123, 123, 122, 121, 120, 119, 118,
117, 116, 114, 113, 111, 110, 108, 107,
105, 103, 101, 100, 98, 96, 93, 91,
89, 87, 85, 82, 80, 77, 75, 72,
70, 67, 65, 62, 59, 56, 54, 51,
48, 45, 42, 39, 36, 33, 30, 27,
24, 21, 18, 15, 11, 8, 5, 2,
0, -3, -6, -9, -12, -16, -19, -22,
-25, -28, -31, -34, -37, -40, -43, -46,
-49, -52, -55, -57, -60, -63, -66, -68,
-71, -73, -76, -78, -81, -83, -86, -88,
-90, -92, -94, -97, -99,-101,-102,-104,
-106,-108,-109,-111,-112,-114,-115,-117,
-118,-119,-120,-121,-122,-123,-124,-124,
-125,-126,-126,-127,-127,-127,-127,-127,
-128,-127,-127,-127,-127,-127,-126,-126,
-125,-124,-124,-123,-122,-121,-120,-119,
-118,-117,-115,-114,-112,-111,-109,-108,
-106,-104,-102,-101, -99, -97, -94, -92,
-90, -88, -86, -83, -81, -78, -76, -73,
-71, -68, -66, -63, -60, -57, -55, -52,
-49, -46, -43, -40, -37, -34, -31, -28,
-25, -22, -19, -16, -12, -9, -6, -3
};
// We have four objects with radius and centre points as configured for the 16x7 display
const float radius1 =8.2, radius2 =11.5, radius3 =20.4, radius4 =22.1,
centerx1=8.0, centerx2=5.8, centerx3=12.7, centerx4= 2.0,
centery1= 2.1, centery2= 1.5, centery3=3.2, centery4=-0.5;
float angle1 = 0.0, angle2 = 0.0, angle3 = 0.0, angle4 = 0.0;
long hueShift= 0;
#define FPS 30 // Maximum frames-per-second
// HSV Conversion expects float inputs in the range of 0.00-1.00 for each channel
// Outputs are rgb in the range 0-255 for each channel
void from_hsv(float h, float s, float v, uint8_t &r, uint8_t &g, uint8_t &b) {
float i = floor(h * 6.0f);
float f = h * 6.0f - i;
v *= 255.0f;
uint8_t p = v * (1.0f - s);
uint8_t q = v * (1.0f - f * s);
uint8_t t = v * (1.0f - (1.0f - f) * s);
switch (int(i) % 6) {
case 0: r = v; g = t; b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
}
int main() { int main() {
stdio_init_all(); stdio_init_all();
pico_unicorn.init(); pico_unicorn.init();
pico_unicorn.clear(); pico_unicorn.clear();
sleep_ms(1e3);
printf("\nHi\n");
int state=0; while(true) {
int x1, x2, x3, x4, y1, y2, y3, y4, sx1, sx2, sx3, sx4;
// const int Tperiod=60000;
// const int Tperiod=600;
// const int Tperiod=20000;
// const int Tperiod=10000;
// const int Tperiod=8000;
// const int Tperiod=800;
// const int Tperiod=80;
// const float Tperiod=8;
// const float Tperiod=100;
const float Tperiod=10;
// const float Tperiod=1;
// const float Tperiod=2;
// const float Tperiod=2;
// const float Tperiod=1;
// const float Tperiod=0.5;
// const int Tperiod=4000;
// const int Tperiod=2000;
// const int Tperiod=1000;
// const int period=128;
// const int period=64;
// const int period=32;
const int period=16;
// const int period=8;
uint ms = to_us_since_boot(get_absolute_time());
float looptime = Tperiod/period;
uint mycount=0;
float periodfilter=0.0;
float alpha=0.1;
for(;;) {
unsigned char x, y; unsigned char x, y;
int8_t value;
uint8_t r = 0, g = 0, b = 0;
uint8_t j, k, l, m;
state = (state + 1) % period; // Setup a delay to slow the framerate.
// Would be better to read from a timer as some math operations take variable time
sleep_ms(1000 / FPS);
uint16_t xx = std::min(state,period-state); // triangle wave from 0 to period/2 sx1 = (int)(cos(angle1) * radius1 + centerx1);
uint16_t ii = xx*xx*xx; sx2 = (int)(cos(angle2) * radius2 + centerx2);
sx3 = (int)(cos(angle3) * radius3 + centerx3);
sx4 = (int)(cos(angle4) * radius4 + centerx4);
y1 = (int)(sin(angle1) * radius1 + centery1);
y2 = (int)(sin(angle2) * radius2 + centery2);
y3 = (int)(sin(angle3) * radius3 + centery3);
y4 = (int)(sin(angle4) * radius4 + centery4);
// printf("t=%d xx=%d ii=%d\n", state, xx, ii);
uint mytime = to_us_since_boot(get_absolute_time());
periodfilter += alpha*(mytime-ms-periodfilter);
if (mycount==10) {
printf("t=%d xx=%d ii=%d looptime=%f time=%f\n", state, xx, ii,looptime, 1e-6*periodfilter);
mycount=0;
}
mycount++;
ms=mytime;
for(y=0; y<7; y++) { for(y=0; y<7; y++) {
x1 = sx1; x2 = sx2; x3 = sx3; x4 = sx4;
for(x=0; x<16; x++) { for(x=0; x<16; x++) {
uint16_t ar = (y+state+x)%16; // triangle wave from 0 to period/2 j = (x1 * x1 + y1 * y1) >> 2;
// uint8_t ar = (y+(state>>1)+x+1)%16; // triangle wave from 0 to period/2 k = (x2 * x2 + y2 * y2) >> 2;
uint16_t br = std::min(ar,uint16_t(16-ar)); // triangle wave from 0 to period/2-1 l = (x3 * x3 + y3 * y3) >> 3;
// uint16_t br = x*7+y; m = (x4 * x4 + y4 * y4) >> 3;
// uint16_t br = x+y*16; //printf("X: %i, Y: %i, \t%i, %i, %i, %i\n",x,y,j,k,l,m);
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+cb(12*float(br)/float(period-1)))), uint8_t(0), uint8_t(0)); value = (int8_t)(hueShift
// pico_unicorn.set_pixel_(x, y, br, uint8_t(0), uint8_t(0)); + (int8_t)*(sinetab + j)
// pico_unicorn.set_pixel_(x, y, std::round(cb(float(br)/(7*16-1))*(1<<10)), uint8_t(0), uint8_t(0)); + (int8_t)*(sinetab + k)
// pico_unicorn.set_pixel_(x, y, 1+br, uint8_t(0), uint8_t(0)); + (int8_t)*(sinetab + l)
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+cb(10*float(br)/float(period-1)))), uint8_t(0), uint8_t(0)); + (int8_t)*(sinetab + m));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+cb(12*float(br)/float(period-1)))), uint8_t(0), uint8_t(0)); //printf("X: %i, Y: %i, H: %i\n",x,y,value);
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+cb(16*float(br)/float(period-1)))), uint8_t(0), uint8_t(0)); from_hsv(((value+128.0f)/256.0f), 1, 1, r, g, b);
pico_unicorn.set_pixel(x, y, uint8_t(std::round(1+254*float(br)/float(period-1))), uint8_t(0), uint8_t(0)); pico_unicorn.set_pixel(x, y, r, g, b);
x1--; x2--; x3--; x4--;
// pico_unicorn.set_pixel_(x, y, br, uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(cb(10*float(br)/float(period-1)))), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(cb(12*float(br)/float(period-1)))), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+((1<<10)-1)*cb(float(br)/float(period-1)))), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t((1<<8)-1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t((1<<12)-1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t((1<<14)-1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t((1<<16)-1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(1+((1<<11)-1.0)*cb(float(br)/float(period/2-1)))), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint16_t(std::round(0+1022*cb(float(br)/float(period-1)))), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint8_t(std::round(1+254*cb(float(br)/float(period-1)))), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel_(x, y, uint8_t(255), uint8_t(0), uint8_t(0));
// uint16_t ag = (7-y+31-state+x+1)%16; // triangle wave from 0 to period/2
// uint16_t bg = 1+std::min(ag,uint16_t(16-ag)); // triangle wave from 0 to period/2
// pico_unicorn.set_pixel(x, y, ii, uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint8_t(1+((1<<2)-1)*br*br*br/((period-1)*(period-1)*(period-1)) ), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(1+br*br*br/8), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t((1<<16)-1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel_(x, y, uint8_t((1<<16)-1), uint8_t(0), uint8_t(0));
// pico_unicorn.set_pixel(x, y, br, bg, uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(br*br*br/4), uint16_t(bg*bg*bg/16), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(0), uint16_t(bg*bg*bg/4), uint16_t(0));
// pico_unicorn.set_pixel(x, y, br,uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(0), bg, uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(x), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(xx+y+1), uint16_t(0), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(x), uint16_t(y), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(x), uint16_t(y), uint16_t(0));
// pico_unicorn.set_pixel(x, y, uint16_t(x), uint16_t(0), uint16_t(y));
// pico_unicorn.set_pixel(x, y, uint8_t(xx), uint8_t(0), uint8_t(0));
} }
y1--; y2--; y3--; y4--;
} }
sleep_ms(1000*looptime);
angle1 += 0.03;
angle2 -= 0.07;
angle3 += 0.13;
angle4 -= 0.15;
hueShift += 2;
} }
return 0; return 0;
} }

Wyświetl plik

@ -240,6 +240,15 @@ namespace pimoroni {
set_pixel_(x, y, gr, gg, gb); set_pixel_(x, y, gr, gg, gb);
} }
// // Original version
// void PicoUnicorn::set_pixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b) {
// uint16_t gr = pimoroni::GAMMA_14BIT[r];
// uint16_t gg = pimoroni::GAMMA_14BIT[g];
// uint16_t gb = pimoroni::GAMMA_14BIT[b];
// set_pixel_(x, y, gr, gg, gb);
// }
void PicoUnicorn::set_pixel_(uint8_t x, uint8_t y, uint16_t gr, uint16_t gg, uint16_t gb) { void PicoUnicorn::set_pixel_(uint8_t x, uint8_t y, uint16_t gr, uint16_t gg, uint16_t gb) {
if(x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) return; if(x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) return;

Wyświetl plik

@ -16,12 +16,11 @@ namespace pimoroni {
static const uint32_t ROW_COUNT = 7; static const uint32_t ROW_COUNT = 7;
static const uint32_t ROW_BYTES = 12; static const uint32_t ROW_BYTES = 12;
// static const uint32_t BCD_FRAMES = 15; // includes fet discharge frame // static const uint32_t BCD_FRAMES = 14; // Original version
// static const uint32_t BCD_FRAMES = 14;
static const uint32_t BCD_FRAMES = 12; static const uint32_t BCD_FRAMES = 12;
static const uint32_t DISCHARGE_FRAMES = 1; static const uint32_t DISCHARGE_FRAMES = 1;
// static const uint32_t DISCHARGE_FRAMES = 6;
static const uint32_t DISCHARGE_TICKS = 65535; // how long to run the discharge frame static const uint32_t DISCHARGE_TICKS = 65535; // how long to run the discharge frame
// static const uint16_t FRAME_DELAY = 0; // Original version
static const uint16_t FRAME_DELAY = 4; static const uint16_t FRAME_DELAY = 4;
static const uint16_t TOTAL_FRAMES = BCD_FRAMES + DISCHARGE_FRAMES; static const uint16_t TOTAL_FRAMES = BCD_FRAMES + DISCHARGE_FRAMES;
static const uint32_t BITSTREAM_LENGTH = (ROW_COUNT * ROW_BYTES * TOTAL_FRAMES); static const uint32_t BITSTREAM_LENGTH = (ROW_COUNT * ROW_BYTES * TOTAL_FRAMES);