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 10:10:28 2017 +0000
Revision:
4:ff76ddd28ee2
Parent:
3:75b616b18184
Restore LCD_DISCO_F746NG library to original state from ST.

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 4:ff76ddd28ee2 71 /* Swap visible layer */
lbanaszak 4:ff76ddd28ee2 72 lcd.SetLayerVisible( visible_layer^1, DISABLE );
lbanaszak 4:ff76ddd28ee2 73 lcd.SetLayerVisible( visible_layer, ENABLE );
lbanaszak 3:75b616b18184 74
lbanaszak 3:75b616b18184 75 lcd.SelectLayer(visible_layer^1); lcd.Clear(LCD_COLOR_BLACK);
lbanaszak 3:75b616b18184 76 for( uint32_t idx=0; idx<BOXES_NUM; idx++ ) {
lbanaszak 3:75b616b18184 77
lbanaszak 3:75b616b18184 78 if( boxes[idx].x_dir ) boxes[idx].x += boxes[idx].dx;
lbanaszak 3:75b616b18184 79 else boxes[idx].x -= boxes[idx].dx;
lbanaszak 3:75b616b18184 80
lbanaszak 3:75b616b18184 81 if( boxes[idx].y_dir ) boxes[idx].y += boxes[idx].dy;
lbanaszak 3:75b616b18184 82 else boxes[idx].y -= boxes[idx].dy;
lbanaszak 3:75b616b18184 83
lbanaszak 3:75b616b18184 84 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 85 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 86
lbanaszak 3:75b616b18184 87 if( boxes[idx].x < X_MIN ) boxes[idx].x = X_MIN;
lbanaszak 3:75b616b18184 88 if( boxes[idx].x > X_MAX ) boxes[idx].x = X_MAX;
lbanaszak 3:75b616b18184 89
lbanaszak 3:75b616b18184 90 if( boxes[idx].y < Y_MIN ) boxes[idx].y = Y_MIN;
lbanaszak 3:75b616b18184 91 if( boxes[idx].y > Y_MAX ) boxes[idx].y = Y_MAX;
lbanaszak 3:75b616b18184 92
lbanaszak 3:75b616b18184 93 lcd.SetTextColor( getHeatMapColor(boxes[idx].color) ); lcd.FillRect( boxes[idx].x, boxes[idx].y, 20, 20 );
lbanaszak 3:75b616b18184 94
lbanaszak 3:75b616b18184 95 if( boxes[idx].color_dir ) boxes[idx].color += 0.01f;
lbanaszak 3:75b616b18184 96 else boxes[idx].color -= 0.01f;
lbanaszak 3:75b616b18184 97
lbanaszak 3:75b616b18184 98 if( (boxes[idx].color<0.0f) || (boxes[idx].color>1.0f) ) boxes[idx].color_dir = !boxes[idx].color_dir;
lbanaszak 3:75b616b18184 99 };
lbanaszak 3:75b616b18184 100
lbanaszak 3:75b616b18184 101 visible_layer ^= 1;
lbanaszak 3:75b616b18184 102 };
lbanaszak 3:75b616b18184 103 };
bcostm 0:9933f7db9a9b 104
lbanaszak 3:75b616b18184 105 /* Code - heatmaps and color gradients */
lbanaszak 3:75b616b18184 106 /* http://www.andrewnoske.com/wiki/Code_-_heatmaps_and_color_gradients */
lbanaszak 3:75b616b18184 107 uint32_t getHeatMapColor( float value )
lbanaszak 3:75b616b18184 108 {
lbanaszak 3:75b616b18184 109 const int NUM_COLORS = 4;
lbanaszak 3:75b616b18184 110 static float color[NUM_COLORS][3] = { {0,0,1}, {0,1,0}, {1,1,0}, {1,0,0} };
lbanaszak 3:75b616b18184 111 float R,G,B;
lbanaszak 3:75b616b18184 112 // A static array of 4 colors: (blue, green, yellow, red) using {r,g,b} for each.
lbanaszak 3:75b616b18184 113
lbanaszak 3:75b616b18184 114 int idx1; // |-- Our desired color will be between these two indexes in "color".
lbanaszak 3:75b616b18184 115 int idx2; // |
lbanaszak 3:75b616b18184 116 float fractBetween = 0.0f; // Fraction between "idx1" and "idx2" where our value is.
lbanaszak 3:75b616b18184 117
lbanaszak 3:75b616b18184 118 if(value <= 0) { idx1 = idx2 = 0; } // accounts for an input <=0
lbanaszak 3:75b616b18184 119 else if(value >= 1) { idx1 = idx2 = NUM_COLORS-1; } // accounts for an input >=0
lbanaszak 3:75b616b18184 120 else
lbanaszak 3:75b616b18184 121 {
lbanaszak 3:75b616b18184 122 value = value * (NUM_COLORS-1); // Will multiply value by 3.
lbanaszak 3:75b616b18184 123 idx1 = floor(value); // Our desired color will be after this index.
lbanaszak 3:75b616b18184 124 idx2 = idx1+1; // ... and before this index (inclusive).
lbanaszak 3:75b616b18184 125 fractBetween = value - float(idx1); // Distance between the two indexes (0-1).
lbanaszak 3:75b616b18184 126 }
lbanaszak 3:75b616b18184 127
lbanaszak 3:75b616b18184 128 R = (color[idx2][0] - color[idx1][0])*fractBetween + color[idx1][0];
lbanaszak 3:75b616b18184 129 G = (color[idx2][1] - color[idx1][1])*fractBetween + color[idx1][1];
lbanaszak 3:75b616b18184 130 B = (color[idx2][2] - color[idx1][2])*fractBetween + color[idx1][2];
lbanaszak 3:75b616b18184 131
lbanaszak 3:75b616b18184 132 return MAKE_RGB_VALUE( R,G,B )
bcostm 0:9933f7db9a9b 133 }