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

Dependents:   RETRO_BallsAndPaddle RETRO_BallAndHoles

Committer:
maxint
Date:
Mon Mar 02 09:58:53 2015 +0000
Revision:
8:19dd2a538cbe
Parent:
1:71185a0aadfc
more clean-up

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 1:71185a0aadfc 14 void Accelerometer::readRegisters(char address, char* buffer, int len)
maxint 1:71185a0aadfc 15 {
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 }
maxint 0:3d0db4e183ee 19
maxint 0:3d0db4e183ee 20 int Accelerometer::writeRegister(char address, char value) {
maxint 0:3d0db4e183ee 21 char buffer[2] = { address, value };
maxint 0:3d0db4e183ee 22
maxint 0:3d0db4e183ee 23 return this->i2c.write(i2cAddress, buffer, 2);
maxint 0:3d0db4e183ee 24 }
maxint 0:3d0db4e183ee 25
maxint 1:71185a0aadfc 26 double Accelerometer::convert(char* buffer)
maxint 1:71185a0aadfc 27 {
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->drawAxes();
maxint 0:3d0db4e183ee 80 }
maxint 0:3d0db4e183ee 81
maxint 0:3d0db4e183ee 82 void Accelerometer::checkGraphReset()
maxint 0:3d0db4e183ee 83 {
maxint 0:3d0db4e183ee 84 if (this->graphX > this->pDisp->getWidth())
maxint 0:3d0db4e183ee 85 {
maxint 0:3d0db4e183ee 86 this->resetGraph();
maxint 0:3d0db4e183ee 87 }
maxint 0:3d0db4e183ee 88 }
maxint 0:3d0db4e183ee 89
maxint 0:3d0db4e183ee 90 void Accelerometer::updateGraph()
maxint 0:3d0db4e183ee 91 {
maxint 0:3d0db4e183ee 92 double x, y, z;
maxint 0:3d0db4e183ee 93 this->getXYZ(x, y, z);
maxint 0:3d0db4e183ee 94
maxint 0:3d0db4e183ee 95 this->checkGraphReset();
maxint 0:3d0db4e183ee 96 this->drawPoint(0, x);
maxint 0:3d0db4e183ee 97 this->drawPoint(1, y);
maxint 0:3d0db4e183ee 98 this->drawPoint(2, z);
maxint 0:3d0db4e183ee 99 this->graphX++;
maxint 0:3d0db4e183ee 100 }