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
main.cpp@4:ff76ddd28ee2, 2017-12-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |