Elements used in the Balls and Things games for the RETRO.

Dependents:   RETRO_BallsAndPaddle RETRO_BallAndHoles

Committer:
maxint
Date:
Fri Feb 06 09:51:06 2015 +0000
Revision:
0:3d0db4e183ee
Child:
1:71185a0aadfc
Put Balls and Things objects into a library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxint 0:3d0db4e183ee 1 #include "Accelerometer.h"
maxint 0:3d0db4e183ee 2
maxint 0:3d0db4e183ee 3 Accelerometer::Accelerometer(int nI2cAddress, LCD_ST7735* pDisp) : i2cAddress(nI2cAddress), i2c(P0_5, P0_4)
maxint 0:3d0db4e183ee 4 { // constructor
maxint 0:3d0db4e183ee 5 this->i2c.frequency(400000); // fast I2C is 400 KHz, not 400 Hz. Default frequency is 100 KHz
maxint 0:3d0db4e183ee 6 this->writeRegister(0x2A, 0x01); // initialize accelerometer (set CTRL_REG1 bit ACTIVE)
maxint 0:3d0db4e183ee 7 this->pDisp=pDisp;
maxint 0:3d0db4e183ee 8
maxint 0:3d0db4e183ee 9 this->colors[0] = Color565::Red;
maxint 0:3d0db4e183ee 10 this->colors[1] = Color565::Green;
maxint 0:3d0db4e183ee 11 this->colors[2] = Color565::Blue;
maxint 0:3d0db4e183ee 12 }
maxint 0:3d0db4e183ee 13
maxint 0:3d0db4e183ee 14 void Accelerometer::readRegisters(char address, char* buffer, int len) {
maxint 0:3d0db4e183ee 15 // int nStart=this->tWait.read_ms();
maxint 0:3d0db4e183ee 16 this->i2c.write(i2cAddress, &address, 1, true);
maxint 0:3d0db4e183ee 17 this->i2c.read(i2cAddress | 1, buffer, len);
maxint 0:3d0db4e183ee 18 // printDouble((double)this->tWait.read_ms()-nStart, 10, 10);
maxint 0:3d0db4e183ee 19 }
maxint 0:3d0db4e183ee 20
maxint 0:3d0db4e183ee 21 int Accelerometer::writeRegister(char address, char value) {
maxint 0:3d0db4e183ee 22 char buffer[2] = { address, value };
maxint 0:3d0db4e183ee 23
maxint 0:3d0db4e183ee 24 return this->i2c.write(i2cAddress, buffer, 2);
maxint 0:3d0db4e183ee 25 }
maxint 0:3d0db4e183ee 26
maxint 0:3d0db4e183ee 27 double Accelerometer::convert(char* buffer) {
maxint 0:3d0db4e183ee 28 double val = ((buffer[0] << 2) | (buffer[1] >> 6));
maxint 0:3d0db4e183ee 29
maxint 0:3d0db4e183ee 30 if (val > 511.0)
maxint 0:3d0db4e183ee 31 val -= 1024.0;
maxint 0:3d0db4e183ee 32
maxint 0:3d0db4e183ee 33 return val / 512.0;
maxint 0:3d0db4e183ee 34 }
maxint 0:3d0db4e183ee 35
maxint 0:3d0db4e183ee 36 void Accelerometer::getXYZ(double& x, double& y, double& z) {
maxint 0:3d0db4e183ee 37 char buffer[6];
maxint 0:3d0db4e183ee 38
maxint 0:3d0db4e183ee 39 this->readRegisters(0x01, buffer, 6);
maxint 0:3d0db4e183ee 40
maxint 0:3d0db4e183ee 41 x = this->convert(buffer);
maxint 0:3d0db4e183ee 42 y = this->convert(buffer + 2);
maxint 0:3d0db4e183ee 43 z = this->convert(buffer + 4);
maxint 0:3d0db4e183ee 44 }
maxint 0:3d0db4e183ee 45
maxint 0:3d0db4e183ee 46 //
maxint 0:3d0db4e183ee 47 // Accellerator graph for debug purposes
maxint 0:3d0db4e183ee 48 //
maxint 0:3d0db4e183ee 49
maxint 0:3d0db4e183ee 50 void Accelerometer::drawAxes()
maxint 0:3d0db4e183ee 51 {
maxint 0:3d0db4e183ee 52 for (int i = 0; i < 3; i++) {
maxint 0:3d0db4e183ee 53 this->pDisp->fillRect(0, i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING), this->pDisp->getWidth(), i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING) + Accelerometer::GRAPH_HEIGHT, Color565::fromRGB(i==0?0x22:0, i==1?0x22:0, i==2?0x22:0));
maxint 0:3d0db4e183ee 54 this->pDisp->drawLine(0, i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING), 0, i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING) + Accelerometer::GRAPH_HEIGHT, Color565::White);
maxint 0:3d0db4e183ee 55 this->pDisp->drawLine(0, i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING) + Accelerometer::GRAPH_HEIGHT / 2, this->pDisp->getWidth(), i * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING) + Accelerometer::GRAPH_HEIGHT / 2, Color565::White);
maxint 0:3d0db4e183ee 56 }
maxint 0:3d0db4e183ee 57 }
maxint 0:3d0db4e183ee 58
maxint 0:3d0db4e183ee 59 void Accelerometer::drawPoint(int axis, double value)
maxint 0:3d0db4e183ee 60 {
maxint 0:3d0db4e183ee 61 if (value < -1.0)
maxint 0:3d0db4e183ee 62 value = -1.0;
maxint 0:3d0db4e183ee 63
maxint 0:3d0db4e183ee 64 if (value > 1.0)
maxint 0:3d0db4e183ee 65 value = 1.0;
maxint 0:3d0db4e183ee 66
maxint 0:3d0db4e183ee 67 value += 1.0;
maxint 0:3d0db4e183ee 68 value /= 2.0;
maxint 0:3d0db4e183ee 69 value = 1.0 - value;
maxint 0:3d0db4e183ee 70 value *= Accelerometer::GRAPH_HEIGHT;
maxint 0:3d0db4e183ee 71
maxint 0:3d0db4e183ee 72 this->pDisp->setPixel(this->graphX, axis * (Accelerometer::GRAPH_HEIGHT + Accelerometer::GRAPH_SPACING) + (int)value, this->colors[axis]);
maxint 0:3d0db4e183ee 73 }
maxint 0:3d0db4e183ee 74
maxint 0:3d0db4e183ee 75 void Accelerometer::resetGraph()
maxint 0:3d0db4e183ee 76 {
maxint 0:3d0db4e183ee 77 this->graphX = 0;
maxint 0:3d0db4e183ee 78 this->pDisp->clearScreen();
maxint 0:3d0db4e183ee 79 //this->pDisp->fillRect(0, 0, this->pDisp->getWidth(), this->pDisp->getHeight(), Color565::fromRGB(0x11, 0x33, 0x22));
maxint 0:3d0db4e183ee 80 this->drawAxes();
maxint 0:3d0db4e183ee 81 }
maxint 0:3d0db4e183ee 82
maxint 0:3d0db4e183ee 83 void Accelerometer::checkGraphReset()
maxint 0:3d0db4e183ee 84 {
maxint 0:3d0db4e183ee 85 if (this->graphX > this->pDisp->getWidth())
maxint 0:3d0db4e183ee 86 {
maxint 0:3d0db4e183ee 87 this->resetGraph();
maxint 0:3d0db4e183ee 88 }
maxint 0:3d0db4e183ee 89 }
maxint 0:3d0db4e183ee 90
maxint 0:3d0db4e183ee 91 void Accelerometer::updateGraph()
maxint 0:3d0db4e183ee 92 {
maxint 0:3d0db4e183ee 93 double x, y, z;
maxint 0:3d0db4e183ee 94 this->getXYZ(x, y, z);
maxint 0:3d0db4e183ee 95
maxint 0:3d0db4e183ee 96 this->checkGraphReset();
maxint 0:3d0db4e183ee 97 this->drawPoint(0, x);
maxint 0:3d0db4e183ee 98 this->drawPoint(1, y);
maxint 0:3d0db4e183ee 99 this->drawPoint(2, z);
maxint 0:3d0db4e183ee 100 this->graphX++;
maxint 0:3d0db4e183ee 101 }
maxint 0:3d0db4e183ee 102