#include "../config.h" #include #include "../random/prng.h" #include "../pixel.h" #include "../util.h" #ifndef MATRIX_CYCLES #define MATRIX_CYCLES 500 #endif #ifndef MATRIX_STREAMER_NUM #define MATRIX_STREAMER_NUM 30 #endif #ifndef MATRIX_DELAY #define MATRIX_STREAMER_NUM 60 #endif typedef struct{ pixel start; unsigned char len; unsigned char decay; unsigned char index; unsigned char speed; } streamer; typedef uint8_t pixel_matrix_t[NUM_COLS][NUM_ROWS/4]; inline static uint8_t get_bright(pixel_matrix_t *matrix, uint8_t x, uint8_t y){ uint8_t ret; ret = (*matrix)[x][y/4]; return 0x3&(ret>>(2*(y%4))); } inline static void set_bright(pixel_matrix_t *matrix, uint8_t x, uint8_t y, uint8_t value){ uint8_t t; t = (*matrix)[x][y/4]; t &= ~(0x3<<(2*(y%4))); t |= value<<(2*(y%4)); (*matrix)[x][y/4] = t; } void matrix() { unsigned int counter = MATRIX_CYCLES; streamer streamers[MATRIX_STREAMER_NUM]; pixel_matrix_t matrix_bright; unsigned char x, y; unsigned char index = 0; unsigned char draw; unsigned char streamer_num = 0; while(counter--){ unsigned char i, j; /* initialise matrix-buffer */ for(x=0;x>6) /* bright>>6 */ draw = 1; if(bright > (get_bright(&matrix_bright, str.start.x, str.start.y+j)<<6) ){ set_bright(&matrix_bright, str.start.x, str.start.y+j, bright>>6); } } bright-=((bright>>5)*str.decay); } str.len+=str.speed/2; streamers[i] = str; if(!draw){ for(j=i;jNUM_ROWS-1) sy=0; streamers[streamer_num] = (streamer){{random8()%NUM_COLS, sy}, 0, (random8()%8)+12, index++,(random8()%16)+3}; streamer_num++; } } wait(60); } }