Graphical demo for the LPC4088 Experiment Base Board with one of the Display Expansion Kits. This demo shows a number of bubbles bouncing around.

Dependencies:   EALib mbed

Committer:
embeddedartists
Date:
Fri Oct 03 13:09:11 2014 +0000
Revision:
0:4839ec6c350d
First version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:4839ec6c350d 1 /******************************************************************************
embeddedartists 0:4839ec6c350d 2 * Includes
embeddedartists 0:4839ec6c350d 3 *****************************************************************************/
embeddedartists 0:4839ec6c350d 4
embeddedartists 0:4839ec6c350d 5 #include "mbed.h"
embeddedartists 0:4839ec6c350d 6
embeddedartists 0:4839ec6c350d 7 #include "LcdController.h"
embeddedartists 0:4839ec6c350d 8 #include "EaLcdBoard.h"
embeddedartists 0:4839ec6c350d 9 #include "BubbleDemo.h"
embeddedartists 0:4839ec6c350d 10
embeddedartists 0:4839ec6c350d 11 #include "wchar.h"
embeddedartists 0:4839ec6c350d 12
embeddedartists 0:4839ec6c350d 13 /******************************************************************************
embeddedartists 0:4839ec6c350d 14 * Typedefs and defines
embeddedartists 0:4839ec6c350d 15 *****************************************************************************/
embeddedartists 0:4839ec6c350d 16
embeddedartists 0:4839ec6c350d 17 #define PI 3.1415926535897932384626433832795
embeddedartists 0:4839ec6c350d 18
embeddedartists 0:4839ec6c350d 19 /* Red color mask, 565 mode */
embeddedartists 0:4839ec6c350d 20 #define REDMASK 0xF800
embeddedartists 0:4839ec6c350d 21 /* Red shift value, 565 mode */
embeddedartists 0:4839ec6c350d 22 #define REDSHIFT 11
embeddedartists 0:4839ec6c350d 23 /* Green color mask, 565 mode */
embeddedartists 0:4839ec6c350d 24 #define GREENMASK 0x07E0
embeddedartists 0:4839ec6c350d 25 /* Green shift value, 565 mode */
embeddedartists 0:4839ec6c350d 26 #define GREENSHIFT 5
embeddedartists 0:4839ec6c350d 27 /* Blue color mask, 565 mode */
embeddedartists 0:4839ec6c350d 28 #define BLUEMASK 0x001F
embeddedartists 0:4839ec6c350d 29 /* Blue shift value, 565 mode */
embeddedartists 0:4839ec6c350d 30 #define BLUESHIFT 0
embeddedartists 0:4839ec6c350d 31
embeddedartists 0:4839ec6c350d 32 /* Number of colors in 565 mode */
embeddedartists 0:4839ec6c350d 33 #define NUM_COLORS 65536
embeddedartists 0:4839ec6c350d 34 /* Number of red colors in 565 mode */
embeddedartists 0:4839ec6c350d 35 #define RED_COLORS 0x20
embeddedartists 0:4839ec6c350d 36 /* Number of green colors in 565 mode */
embeddedartists 0:4839ec6c350d 37 #define GREEN_COLORS 0x40
embeddedartists 0:4839ec6c350d 38 /* Number of blue colors in 565 mode */
embeddedartists 0:4839ec6c350d 39 #define BLUE_COLORS 0x20
embeddedartists 0:4839ec6c350d 40
embeddedartists 0:4839ec6c350d 41 /******************************************************************************
embeddedartists 0:4839ec6c350d 42 * Local variables
embeddedartists 0:4839ec6c350d 43 *****************************************************************************/
embeddedartists 0:4839ec6c350d 44
embeddedartists 0:4839ec6c350d 45
embeddedartists 0:4839ec6c350d 46 /******************************************************************************
embeddedartists 0:4839ec6c350d 47 * External variables
embeddedartists 0:4839ec6c350d 48 *****************************************************************************/
embeddedartists 0:4839ec6c350d 49
embeddedartists 0:4839ec6c350d 50 /******************************************************************************
embeddedartists 0:4839ec6c350d 51 * Local functions
embeddedartists 0:4839ec6c350d 52 *****************************************************************************/
embeddedartists 0:4839ec6c350d 53
embeddedartists 0:4839ec6c350d 54
embeddedartists 0:4839ec6c350d 55 void BubbleDemo::initialize() {
embeddedartists 0:4839ec6c350d 56 float radian;
embeddedartists 0:4839ec6c350d 57 const float phase1 = 2 * PI / 3;
embeddedartists 0:4839ec6c350d 58 const float phase2 = 4 * PI / 3;
embeddedartists 0:4839ec6c350d 59
embeddedartists 0:4839ec6c350d 60 for(i = 0; i < NumBalls; i++) {
embeddedartists 0:4839ec6c350d 61 x[i] = this->windowX / 2;
embeddedartists 0:4839ec6c350d 62 y[i] = this->windowY / 2;
embeddedartists 0:4839ec6c350d 63 r[i] = i * 2 + 10;
embeddedartists 0:4839ec6c350d 64
embeddedartists 0:4839ec6c350d 65 oldX[i] = x[i];
embeddedartists 0:4839ec6c350d 66 oldY[i] = y[i];
embeddedartists 0:4839ec6c350d 67
embeddedartists 0:4839ec6c350d 68 velX[i] = 1;
embeddedartists 0:4839ec6c350d 69 velY[i] = 1;
embeddedartists 0:4839ec6c350d 70
embeddedartists 0:4839ec6c350d 71 radian = i * 2 * PI / NumBalls;
embeddedartists 0:4839ec6c350d 72 red[i] = cos(radian) * RED_COLORS / 2 + (RED_COLORS / 2 - 1);
embeddedartists 0:4839ec6c350d 73 green[i] = cos(radian + phase2) * GREEN_COLORS / 2 + (GREEN_COLORS / 2 - 1);
embeddedartists 0:4839ec6c350d 74 blue[i] = cos(radian + phase1) * BLUE_COLORS / 2 + (BLUE_COLORS / 2 - 1);
embeddedartists 0:4839ec6c350d 75 }
embeddedartists 0:4839ec6c350d 76 }
embeddedartists 0:4839ec6c350d 77
embeddedartists 0:4839ec6c350d 78 void BubbleDemo::collision() {
embeddedartists 0:4839ec6c350d 79 float disX = x[j] - x[i];
embeddedartists 0:4839ec6c350d 80 float disY = y[j] - y[i];
embeddedartists 0:4839ec6c350d 81 float d2 = disX * disX + disY * disY;
embeddedartists 0:4839ec6c350d 82
embeddedartists 0:4839ec6c350d 83 if(d2 != 0) {
embeddedartists 0:4839ec6c350d 84 float rij = r[i] + r[j];
embeddedartists 0:4839ec6c350d 85 float rij2 = rij * rij;
embeddedartists 0:4839ec6c350d 86
embeddedartists 0:4839ec6c350d 87 if(d2 < rij2) {
embeddedartists 0:4839ec6c350d 88 float ii = (disX * velX[i] + disY * velY[i]) / d2;
embeddedartists 0:4839ec6c350d 89 float ji = (disX * velY[i] - disY * velX[i]) / d2;
embeddedartists 0:4839ec6c350d 90 float ij = (disX * velX[j] + disY * velY[j]) / d2;
embeddedartists 0:4839ec6c350d 91 float jj = (disX * velY[j] - disY * velX[j]) / d2;
embeddedartists 0:4839ec6c350d 92 float ratio = rij / sqrt(d2);
embeddedartists 0:4839ec6c350d 93
embeddedartists 0:4839ec6c350d 94 velX[i] = ij * disX - ii * disY;
embeddedartists 0:4839ec6c350d 95 velY[i] = ij * disY + ii * disX;
embeddedartists 0:4839ec6c350d 96 velX[j] = ji * disX - jj * disY;
embeddedartists 0:4839ec6c350d 97 velY[j] = ji * disY + jj * disX;
embeddedartists 0:4839ec6c350d 98
embeddedartists 0:4839ec6c350d 99 disX *= (ratio - 1) / 2;
embeddedartists 0:4839ec6c350d 100 disY *= (ratio - 1) / 2;
embeddedartists 0:4839ec6c350d 101
embeddedartists 0:4839ec6c350d 102 x[j] += disX;
embeddedartists 0:4839ec6c350d 103 y[j] += disY;
embeddedartists 0:4839ec6c350d 104 x[i] -= disX;
embeddedartists 0:4839ec6c350d 105 y[i] -= disY;
embeddedartists 0:4839ec6c350d 106 }
embeddedartists 0:4839ec6c350d 107 }
embeddedartists 0:4839ec6c350d 108 }
embeddedartists 0:4839ec6c350d 109
embeddedartists 0:4839ec6c350d 110 void BubbleDemo::borders() {
embeddedartists 0:4839ec6c350d 111 if(x[i] >= this->windowX - r[i] - 1) {
embeddedartists 0:4839ec6c350d 112 x[i] = this->windowX - r[i] - 1;
embeddedartists 0:4839ec6c350d 113 velX[i] = -velX[i];
embeddedartists 0:4839ec6c350d 114 } else if(x[i] <= r[i]) {
embeddedartists 0:4839ec6c350d 115 x[i] = r[i];
embeddedartists 0:4839ec6c350d 116 velX[i] = -velX[i];
embeddedartists 0:4839ec6c350d 117 }
embeddedartists 0:4839ec6c350d 118
embeddedartists 0:4839ec6c350d 119 if(y[i] >= this->windowY - r[i] - 1) {
embeddedartists 0:4839ec6c350d 120 y[i] = this->windowY - r[i] - 1;
embeddedartists 0:4839ec6c350d 121 velY[i] = -velY[i];
embeddedartists 0:4839ec6c350d 122 } else if(y[i] <= r[i]) {
embeddedartists 0:4839ec6c350d 123 y[i] = r[i];
embeddedartists 0:4839ec6c350d 124 velY[i] = -velY[i];
embeddedartists 0:4839ec6c350d 125 }
embeddedartists 0:4839ec6c350d 126 }
embeddedartists 0:4839ec6c350d 127
embeddedartists 0:4839ec6c350d 128 void BubbleDemo::draw() {
embeddedartists 0:4839ec6c350d 129 graphics.put_circle( oldX[i], oldY[i], 0, r[i], 0 );
embeddedartists 0:4839ec6c350d 130 graphics.put_circle( x[i], y[i], (red[i] << REDSHIFT) + (green[i] << GREENSHIFT) + (blue[i] << BLUESHIFT), r[i], 0);
embeddedartists 0:4839ec6c350d 131
embeddedartists 0:4839ec6c350d 132 oldX[i] = x[i];
embeddedartists 0:4839ec6c350d 133 oldY[i] = y[i];
embeddedartists 0:4839ec6c350d 134 }
embeddedartists 0:4839ec6c350d 135
embeddedartists 0:4839ec6c350d 136
embeddedartists 0:4839ec6c350d 137 /******************************************************************************
embeddedartists 0:4839ec6c350d 138 * Public functions
embeddedartists 0:4839ec6c350d 139 *****************************************************************************/
embeddedartists 0:4839ec6c350d 140
embeddedartists 0:4839ec6c350d 141 BubbleDemo::BubbleDemo(uint8_t *pFrameBuf, uint16_t dispWidth, uint16_t dispHeight)
embeddedartists 0:4839ec6c350d 142 : graphics((uint16_t *)pFrameBuf, dispWidth, dispHeight) {
embeddedartists 0:4839ec6c350d 143
embeddedartists 0:4839ec6c350d 144 this->windowX = dispWidth;
embeddedartists 0:4839ec6c350d 145 this->windowY = dispHeight;
embeddedartists 0:4839ec6c350d 146 this->pFrmBuf = (uint16_t *)pFrameBuf;
embeddedartists 0:4839ec6c350d 147 this->pFrmBuf1 = (uint16_t *)pFrameBuf;
embeddedartists 0:4839ec6c350d 148 this->pFrmBuf2 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*2);
embeddedartists 0:4839ec6c350d 149 this->pFrmBuf3 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*4);
embeddedartists 0:4839ec6c350d 150
embeddedartists 0:4839ec6c350d 151 initialize();
embeddedartists 0:4839ec6c350d 152 }
embeddedartists 0:4839ec6c350d 153
embeddedartists 0:4839ec6c350d 154 void BubbleDemo::run(EaLcdBoardGPIO& lcdBoard, uint32_t loops, uint32_t delayMs) {
embeddedartists 0:4839ec6c350d 155
embeddedartists 0:4839ec6c350d 156 printf("BubbleDemo, %d loops, %dms delay\n", loops, delayMs);
embeddedartists 0:4839ec6c350d 157
embeddedartists 0:4839ec6c350d 158 //update framebuffer
embeddedartists 0:4839ec6c350d 159 graphics.setFrameBuffer(this->pFrmBuf);
embeddedartists 0:4839ec6c350d 160 lcdBoard.setFrameBuffer((uint32_t)this->pFrmBuf);
embeddedartists 0:4839ec6c350d 161 memset((void*)(pFrmBuf), 0, this->windowX * this->windowY * 2);
embeddedartists 0:4839ec6c350d 162
embeddedartists 0:4839ec6c350d 163 for(int32_t n=0;n<loops;n++) {
embeddedartists 0:4839ec6c350d 164
embeddedartists 0:4839ec6c350d 165 for(i = 0; i < NumBalls; i++) {
embeddedartists 0:4839ec6c350d 166 x[i] += velX[i];
embeddedartists 0:4839ec6c350d 167 y[i] += velY[i];
embeddedartists 0:4839ec6c350d 168
embeddedartists 0:4839ec6c350d 169 for(j = i + 1; j < NumBalls; j++)
embeddedartists 0:4839ec6c350d 170 collision();
embeddedartists 0:4839ec6c350d 171
embeddedartists 0:4839ec6c350d 172 borders();
embeddedartists 0:4839ec6c350d 173
embeddedartists 0:4839ec6c350d 174 if((int)x[i] != (int)oldX[i] || (int)y[i] != (int)oldY[i])
embeddedartists 0:4839ec6c350d 175 draw();
embeddedartists 0:4839ec6c350d 176 }
embeddedartists 0:4839ec6c350d 177
embeddedartists 0:4839ec6c350d 178 wait_ms(delayMs);
embeddedartists 0:4839ec6c350d 179 }
embeddedartists 0:4839ec6c350d 180 memset((void*)(pFrmBuf), 0, this->windowX * this->windowY * 2);
embeddedartists 0:4839ec6c350d 181 }
embeddedartists 0:4839ec6c350d 182