EmbeddedArtists AB / Mbed 2 deprecated lpc4088_ebb_gui_bubbles

Dependencies:   EALib mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BubbleDemo.cpp Source File

BubbleDemo.cpp

00001 /******************************************************************************
00002  * Includes
00003  *****************************************************************************/
00004 
00005 #include "mbed.h"
00006 
00007 #include "LcdController.h"
00008 #include "EaLcdBoard.h"
00009 #include "BubbleDemo.h"
00010 
00011 #include "wchar.h"
00012 
00013 /******************************************************************************
00014  * Typedefs and defines
00015  *****************************************************************************/
00016 
00017 #define PI 3.1415926535897932384626433832795
00018 
00019 /* Red color mask, 565 mode */
00020 #define REDMASK       0xF800
00021 /* Red shift value, 565 mode */
00022 #define REDSHIFT      11
00023 /* Green color mask, 565 mode */
00024 #define GREENMASK     0x07E0
00025 /* Green shift value, 565 mode */
00026 #define GREENSHIFT    5
00027 /* Blue color mask, 565 mode */
00028 #define BLUEMASK      0x001F
00029 /* Blue shift value, 565 mode */
00030 #define BLUESHIFT     0
00031 
00032 /* Number of colors in 565 mode */
00033 #define NUM_COLORS    65536
00034 /* Number of red colors in 565 mode */
00035 #define RED_COLORS    0x20
00036 /* Number of green colors in 565 mode */
00037 #define GREEN_COLORS  0x40
00038 /* Number of blue colors in 565 mode */
00039 #define BLUE_COLORS   0x20
00040 
00041 /******************************************************************************
00042  * Local variables
00043  *****************************************************************************/
00044 
00045 
00046 /******************************************************************************
00047  * External variables
00048  *****************************************************************************/
00049 
00050 /******************************************************************************
00051  * Local functions
00052  *****************************************************************************/
00053 
00054 
00055 void BubbleDemo::initialize() {
00056  float radian;
00057  const float phase1 = 2 * PI / 3;
00058  const float phase2 = 4 * PI / 3;
00059 
00060  for(i = 0; i < NumBalls; i++) {
00061   x[i] = this->windowX / 2;
00062   y[i] = this->windowY / 2;
00063   r[i] = i * 2 + 10;
00064 
00065   oldX[i] = x[i];
00066   oldY[i] = y[i];
00067 
00068   velX[i] = 1;
00069   velY[i] = 1;
00070 
00071   radian = i * 2 * PI / NumBalls;
00072   red[i] = cos(radian) * RED_COLORS / 2 + (RED_COLORS / 2 - 1);
00073   green[i] = cos(radian + phase2) * GREEN_COLORS / 2 + (GREEN_COLORS / 2 - 1);
00074   blue[i] = cos(radian + phase1) * BLUE_COLORS / 2 + (BLUE_COLORS / 2 - 1);
00075  }
00076 }
00077 
00078 void BubbleDemo::collision() {
00079  float disX = x[j] - x[i];
00080  float disY = y[j] - y[i];
00081  float d2 = disX * disX + disY * disY;
00082 
00083  if(d2 != 0) {
00084   float rij = r[i] + r[j];
00085   float rij2 = rij * rij;
00086 
00087   if(d2 < rij2) {
00088    float ii = (disX * velX[i] + disY * velY[i]) / d2;
00089    float ji = (disX * velY[i] - disY * velX[i]) / d2;
00090    float ij = (disX * velX[j] + disY * velY[j]) / d2;
00091    float jj = (disX * velY[j] - disY * velX[j]) / d2;
00092    float ratio = rij / sqrt(d2);
00093 
00094    velX[i] = ij * disX - ii * disY;
00095    velY[i] = ij * disY + ii * disX;
00096    velX[j] = ji * disX - jj * disY;
00097    velY[j] = ji * disY + jj * disX;
00098 
00099    disX *= (ratio - 1) / 2;
00100    disY *= (ratio - 1) / 2;
00101 
00102    x[j] += disX;
00103    y[j] += disY;
00104    x[i] -= disX;
00105    y[i] -= disY;
00106   }
00107  }
00108 }
00109 
00110 void BubbleDemo::borders() {
00111  if(x[i] >= this->windowX - r[i] - 1) {
00112   x[i] = this->windowX - r[i] - 1;
00113   velX[i] = -velX[i];
00114  } else if(x[i] <= r[i]) {
00115   x[i] = r[i];
00116   velX[i] = -velX[i];
00117  }
00118 
00119  if(y[i] >= this->windowY - r[i] - 1) {
00120   y[i] = this->windowY - r[i] - 1;
00121   velY[i] = -velY[i];
00122  } else if(y[i] <= r[i]) {
00123   y[i] = r[i];
00124   velY[i] = -velY[i];
00125  }
00126 }
00127 
00128 void BubbleDemo::draw() {
00129  graphics.put_circle( oldX[i], oldY[i], 0, r[i], 0 );
00130  graphics.put_circle( x[i], y[i], (red[i] << REDSHIFT) + (green[i] << GREENSHIFT) + (blue[i] << BLUESHIFT), r[i], 0);
00131 
00132  oldX[i] = x[i];
00133  oldY[i] = y[i];
00134 }
00135 
00136 
00137 /******************************************************************************
00138  * Public functions
00139  *****************************************************************************/
00140  
00141 BubbleDemo::BubbleDemo(uint8_t *pFrameBuf, uint16_t dispWidth, uint16_t dispHeight) 
00142     : graphics((uint16_t *)pFrameBuf, dispWidth, dispHeight) {
00143 
00144     this->windowX = dispWidth;
00145     this->windowY = dispHeight;
00146     this->pFrmBuf  = (uint16_t *)pFrameBuf;
00147     this->pFrmBuf1 = (uint16_t *)pFrameBuf;
00148     this->pFrmBuf2 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*2);
00149     this->pFrmBuf3 = (uint16_t *)((uint32_t)pFrameBuf + dispWidth*dispHeight*4);
00150 
00151     initialize();
00152 }
00153 
00154 void BubbleDemo::run(EaLcdBoardGPIO& lcdBoard, uint32_t loops, uint32_t delayMs) {
00155   
00156   printf("BubbleDemo, %d loops, %dms delay\n", loops, delayMs);
00157 
00158     //update framebuffer
00159     graphics.setFrameBuffer(this->pFrmBuf);
00160     lcdBoard.setFrameBuffer((uint32_t)this->pFrmBuf);
00161     memset((void*)(pFrmBuf), 0, this->windowX * this->windowY * 2);
00162 
00163     for(int32_t n=0;n<loops;n++) {
00164 
00165         for(i = 0; i < NumBalls; i++) {
00166             x[i] += velX[i];
00167             y[i] += velY[i];
00168             
00169             for(j = i + 1; j < NumBalls; j++)
00170                 collision();
00171                 
00172             borders();
00173             
00174             if((int)x[i] != (int)oldX[i] || (int)y[i] != (int)oldY[i])
00175                 draw();
00176         }
00177 
00178         wait_ms(delayMs);
00179     }
00180     memset((void*)(pFrmBuf), 0, this->windowX * this->windowY * 2);
00181 }
00182