Elements used in the Balls and Things games for the RETRO.
Dependents: RETRO_BallsAndPaddle RETRO_BallAndHoles
Accelerometer.cpp@1:71185a0aadfc, 2015-02-06 (annotated)
- Committer:
- maxint
- Date:
- Fri Feb 06 10:18:02 2015 +0000
- Revision:
- 1:71185a0aadfc
- Parent:
- 0:3d0db4e183ee
tiny bit of cleanup
Who changed what in which revision?
User | Revision | Line number | New 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 | } |