Example for the LPC4088 QSB Base Board

Dependencies:   EALib mbed

Committer:
embeddedartists
Date:
Wed Apr 09 09:43:40 2014 +0000
Revision:
1:aafddd9761a3
Parent:
0:7546db568365
Updated to latest version of EALib

Who changed what in which revision?

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