Do not expose buffer to the client

This commit is contained in:
2018-04-15 22:44:48 +02:00
parent 19e56ff23e
commit 2b23b391b4
3 changed files with 73 additions and 27 deletions

View File

@@ -269,7 +269,7 @@ void FrameBufferSwitch(void) {
#endif
}
Frame *FrameBufferGetFront(void) {
static Frame *FrameBufferGetFront(void) {
#if FRAMEBUFFER_POINTERS
return FrameBuffer.front;
#else
@@ -277,7 +277,7 @@ Frame *FrameBufferGetFront(void) {
#endif
}
Frame *FrameBufferGetBack(void) {
static Frame *FrameBufferGetBack(void) {
#if FRAMEBUFFER_POINTERS
return FrameBuffer.back;
#else
@@ -285,10 +285,31 @@ Frame *FrameBufferGetBack(void) {
#endif
}
void FrameBufferReadFront(char x, char y, char z, unsigned char *val) {
*val = FrameBufferGetFront()->data[x][y][z];
}
void FrameBufferReadBack(char x, char y, char z, unsigned char *val) {
*val = FrameBufferGetBack()->data[x][y][z];
}
void FrameBufferCopy(char x1, char y1, char z1, char x2, char y2, char z2) {
FrameBufferGetBack()->data[x1][y1][z1] =
FrameBufferGetFront()->data[x2][y2][z2];
}
void FrameBufferWrite(char x, char y, char z, unsigned char val) {
FrameBufferGetBack()->data[x][y][z] = val;
}
void FrameBufferSet(unsigned char val) {
memset(FrameBufferGetBack(), val, FRAME_SIZE());
}
void FrameBufferBlank() {
FrameBufferSet(0);
}
static void letter(char l, char brightness) {
memset(FrameBufferGetBack(), 0, FRAME_SIZE());
for (char x = 0; x < MAX_X; x++) {

View File

@@ -68,30 +68,53 @@ extern struct FrameBuffer FrameBuffer;
void FrameBufferSwitch(void);
/**
* Returns the current front (visible) frame buffer
* Read the brightness ``val'' of the led at position (x,y,z), in the front
* buffer.
*/
Frame *FrameBufferGetFront(void);
void FrameBufferReadFront(char x, char y, char z, unsigned char *val);
/**
* Returns the current back (invisible) frame buffer
* Read the brightness ``val'' of the led at position (x,y,z), in the back
* buffer.
*/
Frame *FrameBufferGetBack(void);
void FrameBufferReadBack(char x, char y, char z, unsigned char *val);
/**
* Copy the value from (x2, y2, z2) in the front buffer, to (x1,y1,z1) in
* the back buffer.
*/
void FrameBufferCopy(char x1, char y1, char z1, char x2, char y2, char z2);
/**
* Write the brightness ``val'' to the led at position (x,y,z), in the back
* buffer.
*
*
* In order to make the value visible, a call to FrameBufferSwitch is needed,
* once the drawing of the frame is complete.
*/
void FrameBufferWrite(char x, char y, char z, unsigned char val);
/**
* Print the string, a letter at a time, showing each for delayPerLetter time,
* Write the brightness ``val'' to the whole back buffer.
*
* In order to make the value visible, a call to FrameBufferSwitch is needed,
* once the drawing of the frame is complete.
*/
void FrameBufferSet(unsigned char val);
/**
* Blank the Back Buffer.
*
* In order to make the value visible, a call to FrameBufferSwitch is needed,
* once the drawing of the frame is complete.
*/
void FrameBufferBlank();
/**
* Print the string, a letter at a time, showing each for delayPerLetter time,
* with the associated brightness.
*
* This has minimal checks, only lowercase font, space and zero to terminate
*
* This has minimal checks, only lowercase font, space and zero to terminate
* the string.
*/
void FrameBufferWriteStr(char * str, const short delayPerLetter,

View File

@@ -86,13 +86,13 @@ unsigned char sinewave[] = {
*/
void levels(void) {
for(int i = 0; i < BRIGHTNESS_MAX; i++) {
memset(FrameBufferGetBack(), i, FRAME_SIZE());
FrameBufferSet(i);
FrameBufferSwitch();
delay(100);
}
for(int i = BRIGHTNESS_MAX; i >= 0; i--) {
memset(FrameBufferGetBack(), i, FRAME_SIZE());
FrameBufferSet(i);
FrameBufferSwitch();
delay(100);
}
@@ -104,11 +104,11 @@ void levels(void) {
* Mainly useful as a test of the led cube.
*/
void testfreq(void) {
memset(FrameBufferGetBack(), 255, FRAME_SIZE());
FrameBufferSet(255);
FrameBufferSwitch();
delay(200);
memset(FrameBufferGetBack(), 1, FRAME_SIZE());
FrameBufferSet(1);
FrameBufferSwitch();
delay(200);
}
@@ -117,11 +117,11 @@ void testfreq(void) {
* Blinks the whole cube on and off with a period `period`.
*/
void blinkWholeCube(int period /* [ms] */) {
memset(FrameBufferGetBack(), 255, FRAME_SIZE());
FrameBufferSet(255);
FrameBufferSwitch();
delay(period >> 1);
memset(FrameBufferGetBack(), 0, FRAME_SIZE());
FrameBufferBlank();
FrameBufferSwitch();
delay(period >> 1);
}
@@ -131,7 +131,7 @@ void blinkWholeCube(int period /* [ms] */) {
*/
void sine(int period /* [ms] */) {
for(short int i = 0; i < BRIGHTNESS_MAX; i++) {
memset(FrameBufferGetBack()->data, sinewave[i], FRAME_SIZE());
FrameBufferSet(sinewave[i]);
FrameBufferSwitch();
delay(period / BRIGHTNESS_MAX);
}
@@ -143,12 +143,12 @@ void sine(int period /* [ms] */) {
*/
void sine2(int period /* [ms] */) {
for(short int i = 0; i < BRIGHTNESS_MAX; i++) {
memset(FrameBufferGetBack(), 0, FRAME_SIZE());
FrameBufferBlank();
for (char x = 1; x < 3; x++) {
for (char y = 1; y < 3; y++) {
for (char z = 1; z < 3; z++) {
FrameBufferGetBack()->data[x][y][z] = sinewave[i];
FrameBufferWrite(x, y, z, sinewave[i]);
}
}
}
@@ -164,11 +164,11 @@ void sine2(int period /* [ms] */) {
*/
void sine3(int period /* [ms] */) {
for(int i = 0; i < 256; i++) {
memset(FrameBufferGetBack()->data, 0, FRAME_SIZE());
FrameBufferBlank();;
for (char x = 1; x < 3; x++) {
for (char y = 1; y < 3; y++) {
for (char z = 1; z < 3; z++) {
FrameBufferGetBack()->data[x][y][z] = sinewave[i];
FrameBufferWrite(x, y, z, sinewave[i]);
}
}
}
@@ -179,7 +179,7 @@ void sine3(int period /* [ms] */) {
if ( ((x == 0) || (x == 3))
||((y == 0) || (y == 3))
||((z == 0) || (z == 3))) {
FrameBufferGetBack()->data[x][y][z] = sinewave[(i+128)%256];
FrameBufferWrite(x, y, z, sinewave[(i+128)%256]);
}
}
}
@@ -194,14 +194,16 @@ void sine3(int period /* [ms] */) {
* Random rain drpos fall to the bottom of the cube
*/
void randomRain() {
unsigned char val;
for (char a = MAX_Z; a > 0; a--) {
// animation of 4 steps, requiring computing 4 full frames
for (char x = 0; x < MAX_X; x++) {
for (char y = 0; y < MAX_Y; y++) {
FrameBufferGetBack()->data[x][y][3] = (random(0, 4) == 0) ? 1 : random(0, BRIGHTNESS_MAX);
FrameBufferGetBack()->data[x][y][2] = FrameBufferGetFront()->data[x][y][3];
FrameBufferGetBack()->data[x][y][1] = FrameBufferGetFront()->data[x][y][2];
FrameBufferGetBack()->data[x][y][0] = FrameBufferGetFront()->data[x][y][1];
FrameBufferWrite(x, y, 3,
(random(0, 4) == 0) ? 1 : random(0, BRIGHTNESS_MAX));
FrameBufferCopy(x, y, 2, x, y, 3);
FrameBufferCopy(x, y, 1, x, y, 2);
FrameBufferCopy(x, y, 0, x, y, 1);
}
}