Basic example showing how to drive the LCD and use double frame buffering.

Dependencies:   BSP_DISCO_F746NG mbed

Fork of DISCO-F746NG_LCDTS_demo by ST

Committer:
lbanaszak
Date:
Fri Dec 29 09:58:05 2017 +0000
Revision:
3:75b616b18184
Parent:
0:9933f7db9a9b
Child:
4:ff76ddd28ee2
Basic example showing how to drive the LCD and use double frame buffering.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bcostm 0:9933f7db9a9b 1 #include "mbed.h"
lbanaszak 3:75b616b18184 2 #include <math.h>
bcostm 0:9933f7db9a9b 3 #include "LCD_DISCO_F746NG.h"
bcostm 0:9933f7db9a9b 4
lbanaszak 3:75b616b18184 5 #define MAKE_RGB_VALUE( R,G,B ) (uint32_t)(0xff000000 | ((uint32_t)(R*255.0f)<<16) | ((uint32_t)(G*255.0f)<<8) | ((uint32_t)(B*255.0f)) );
lbanaszak 3:75b616b18184 6
lbanaszak 3:75b616b18184 7 #define BOXES_NUM (1024)
lbanaszak 3:75b616b18184 8 #define X_MIN (10)
lbanaszak 3:75b616b18184 9 #define X_MAX (480-30)
lbanaszak 3:75b616b18184 10 #define Y_MIN (10)
lbanaszak 3:75b616b18184 11 #define Y_MAX (272-30)
lbanaszak 3:75b616b18184 12
bcostm 0:9933f7db9a9b 13 LCD_DISCO_F746NG lcd;
lbanaszak 3:75b616b18184 14
lbanaszak 3:75b616b18184 15 /* Code - heatmaps and color gradients */
lbanaszak 3:75b616b18184 16 /* http://www.andrewnoske.com/wiki/Code_-_heatmaps_and_color_gradients */
lbanaszak 3:75b616b18184 17 uint32_t getHeatMapColor( float value );
lbanaszak 3:75b616b18184 18
lbanaszak 3:75b616b18184 19 struct box {
lbanaszak 3:75b616b18184 20 float color;
lbanaszak 3:75b616b18184 21 uint32_t color_dir;
lbanaszak 3:75b616b18184 22 int32_t x;
lbanaszak 3:75b616b18184 23 int32_t y;
lbanaszak 3:75b616b18184 24 int32_t dx;
lbanaszak 3:75b616b18184 25 int32_t dy;
lbanaszak 3:75b616b18184 26 uint32_t x_dir;
lbanaszak 3:75b616b18184 27 uint32_t y_dir;
lbanaszak 3:75b616b18184 28 };
bcostm 0:9933f7db9a9b 29
bcostm 0:9933f7db9a9b 30 int main()
bcostm 0:9933f7db9a9b 31 {
lbanaszak 3:75b616b18184 32 struct box boxes[BOXES_NUM];
bcostm 0:9933f7db9a9b 33
lbanaszak 3:75b616b18184 34 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"FLYING BOXES DEMO", CENTER_MODE);
bcostm 0:9933f7db9a9b 35 wait(1);
lbanaszak 3:75b616b18184 36
lbanaszak 3:75b616b18184 37 lcd.SetLayerVisible( 0, DISABLE );
lbanaszak 3:75b616b18184 38 lcd.SetLayerVisible( 1, DISABLE );
bcostm 0:9933f7db9a9b 39
lbanaszak 3:75b616b18184 40 lcd.SelectLayer(0);
lbanaszak 3:75b616b18184 41 lcd.SetFont(&Font12);
lbanaszak 3:75b616b18184 42 lcd.SetBackColor(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 43 lcd.SetTextColor(LCD_COLOR_WHITE);
lbanaszak 3:75b616b18184 44 lcd.Clear(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 45
lbanaszak 3:75b616b18184 46 lcd.SelectLayer(1);
lbanaszak 3:75b616b18184 47 lcd.SetFont(&Font12);
lbanaszak 3:75b616b18184 48 lcd.SetBackColor(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 49 lcd.SetTextColor(LCD_COLOR_WHITE);
lbanaszak 3:75b616b18184 50 lcd.Clear(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 51
lbanaszak 3:75b616b18184 52 /* BOXES array initialise */
lbanaszak 3:75b616b18184 53 srand( time(NULL));
lbanaszak 3:75b616b18184 54 for( uint32_t idx=0; idx<BOXES_NUM; idx++ ) {
lbanaszak 3:75b616b18184 55 boxes[idx].color = ((float)(rand()%256))/255.0f;
lbanaszak 3:75b616b18184 56 boxes[idx].color_dir = rand()%2;
lbanaszak 3:75b616b18184 57 boxes[idx].x = X_MIN + rand()%(X_MAX-X_MIN);
lbanaszak 3:75b616b18184 58 boxes[idx].y = Y_MIN + rand()%(Y_MAX-Y_MIN);
lbanaszak 3:75b616b18184 59 boxes[idx].dx = 1+ rand()%3;
lbanaszak 3:75b616b18184 60 boxes[idx].dy = 1+ rand()%3;
lbanaszak 3:75b616b18184 61 boxes[idx].x_dir = rand()%2;
lbanaszak 3:75b616b18184 62 boxes[idx].y_dir = rand()%2;
lbanaszak 3:75b616b18184 63 };
lbanaszak 3:75b616b18184 64
lbanaszak 3:75b616b18184 65 uint32_t visible_layer = 0;
lbanaszak 3:75b616b18184 66
lbanaszak 3:75b616b18184 67 /* MAIN loop */
lbanaszak 3:75b616b18184 68 while(1) {
lbanaszak 3:75b616b18184 69
lbanaszak 3:75b616b18184 70 while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS)); /* Wait for VSYNC */
lbanaszak 3:75b616b18184 71 lcd.LayerVisibleSwap( visible_layer, visible_layer^1 ); /* Swap visible layer */
lbanaszak 3:75b616b18184 72
lbanaszak 3:75b616b18184 73 lcd.SelectLayer(visible_layer^1); lcd.Clear(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 74 for( uint32_t idx=0; idx<BOXES_NUM; idx++ ) {
lbanaszak 3:75b616b18184 75
lbanaszak 3:75b616b18184 76 if( boxes[idx].x_dir ) boxes[idx].x += boxes[idx].dx;
lbanaszak 3:75b616b18184 77 else boxes[idx].x -= boxes[idx].dx;
lbanaszak 3:75b616b18184 78
lbanaszak 3:75b616b18184 79 if( boxes[idx].y_dir ) boxes[idx].y += boxes[idx].dy;
lbanaszak 3:75b616b18184 80 else boxes[idx].y -= boxes[idx].dy;
lbanaszak 3:75b616b18184 81
lbanaszak 3:75b616b18184 82 if( (boxes[idx].x < X_MIN) || (boxes[idx].x > X_MAX) ){ boxes[idx].x_dir = !boxes[idx].x_dir; boxes[idx].dx = 1+ rand()%3; };
lbanaszak 3:75b616b18184 83 if( (boxes[idx].y < Y_MIN) || (boxes[idx].y > Y_MAX) ){ boxes[idx].y_dir = !boxes[idx].y_dir; boxes[idx].dy = 1+ rand()%3; };
lbanaszak 3:75b616b18184 84
lbanaszak 3:75b616b18184 85 if( boxes[idx].x < X_MIN ) boxes[idx].x = X_MIN;
lbanaszak 3:75b616b18184 86 if( boxes[idx].x > X_MAX ) boxes[idx].x = X_MAX;
lbanaszak 3:75b616b18184 87
lbanaszak 3:75b616b18184 88 if( boxes[idx].y < Y_MIN ) boxes[idx].y = Y_MIN;
lbanaszak 3:75b616b18184 89 if( boxes[idx].y > Y_MAX ) boxes[idx].y = Y_MAX;
lbanaszak 3:75b616b18184 90
lbanaszak 3:75b616b18184 91 lcd.SetTextColor( getHeatMapColor(boxes[idx].color) ); lcd.FillRect( boxes[idx].x, boxes[idx].y, 20, 20 );
lbanaszak 3:75b616b18184 92
lbanaszak 3:75b616b18184 93 if( boxes[idx].color_dir ) boxes[idx].color += 0.01f;
lbanaszak 3:75b616b18184 94 else boxes[idx].color -= 0.01f;
lbanaszak 3:75b616b18184 95
lbanaszak 3:75b616b18184 96 if( (boxes[idx].color<0.0f) || (boxes[idx].color>1.0f) ) boxes[idx].color_dir = !boxes[idx].color_dir;
lbanaszak 3:75b616b18184 97 };
lbanaszak 3:75b616b18184 98
lbanaszak 3:75b616b18184 99 visible_layer ^= 1;
lbanaszak 3:75b616b18184 100 };
lbanaszak 3:75b616b18184 101 };
bcostm 0:9933f7db9a9b 102
lbanaszak 3:75b616b18184 103 /* Code - heatmaps and color gradients */
lbanaszak 3:75b616b18184 104 /* http://www.andrewnoske.com/wiki/Code_-_heatmaps_and_color_gradients */
lbanaszak 3:75b616b18184 105 uint32_t getHeatMapColor( float value )
lbanaszak 3:75b616b18184 106 {
lbanaszak 3:75b616b18184 107 const int NUM_COLORS = 4;
lbanaszak 3:75b616b18184 108 static float color[NUM_COLORS][3] = { {0,0,1}, {0,1,0}, {1,1,0}, {1,0,0} };
lbanaszak 3:75b616b18184 109 float R,G,B;
lbanaszak 3:75b616b18184 110 // A static array of 4 colors: (blue, green, yellow, red) using {r,g,b} for each.
lbanaszak 3:75b616b18184 111
lbanaszak 3:75b616b18184 112 int idx1; // |-- Our desired color will be between these two indexes in "color".
lbanaszak 3:75b616b18184 113 int idx2; // |
lbanaszak 3:75b616b18184 114 float fractBetween = 0.0f; // Fraction between "idx1" and "idx2" where our value is.
lbanaszak 3:75b616b18184 115
lbanaszak 3:75b616b18184 116 if(value <= 0) { idx1 = idx2 = 0; } // accounts for an input <=0
lbanaszak 3:75b616b18184 117 else if(value >= 1) { idx1 = idx2 = NUM_COLORS-1; } // accounts for an input >=0
lbanaszak 3:75b616b18184 118 else
lbanaszak 3:75b616b18184 119 {
lbanaszak 3:75b616b18184 120 value = value * (NUM_COLORS-1); // Will multiply value by 3.
lbanaszak 3:75b616b18184 121 idx1 = floor(value); // Our desired color will be after this index.
lbanaszak 3:75b616b18184 122 idx2 = idx1+1; // ... and before this index (inclusive).
lbanaszak 3:75b616b18184 123 fractBetween = value - float(idx1); // Distance between the two indexes (0-1).
lbanaszak 3:75b616b18184 124 }
lbanaszak 3:75b616b18184 125
lbanaszak 3:75b616b18184 126 R = (color[idx2][0] - color[idx1][0])*fractBetween + color[idx1][0];
lbanaszak 3:75b616b18184 127 G = (color[idx2][1] - color[idx1][1])*fractBetween + color[idx1][1];
lbanaszak 3:75b616b18184 128 B = (color[idx2][2] - color[idx1][2])*fractBetween + color[idx1][2];
lbanaszak 3:75b616b18184 129
lbanaszak 3:75b616b18184 130 return MAKE_RGB_VALUE( R,G,B )
bcostm 0:9933f7db9a9b 131 }