3-D snake game for the mbed application board.

Dependencies:   C12832 MMA7660 mbed

Committer:
pbhatnagar3
Date:
Mon Mar 24 17:48:19 2014 +0000
Revision:
0:8b08136c5edd
3-D snake game for the mbed application board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pbhatnagar3 0:8b08136c5edd 1 #include "MMA7660.h"
pbhatnagar3 0:8b08136c5edd 2
pbhatnagar3 0:8b08136c5edd 3 MMA7660::MMA7660(PinName sda, PinName scl, bool active) : _i2c(sda, scl)
pbhatnagar3 0:8b08136c5edd 4 {
pbhatnagar3 0:8b08136c5edd 5 setActive(active);
pbhatnagar3 0:8b08136c5edd 6 samplerate = 64;
pbhatnagar3 0:8b08136c5edd 7
pbhatnagar3 0:8b08136c5edd 8 }
pbhatnagar3 0:8b08136c5edd 9
pbhatnagar3 0:8b08136c5edd 10 //Since the MMA lacks a WHO_AM_I register, we can only check if there is a device that answers to the I2C address
pbhatnagar3 0:8b08136c5edd 11 bool MMA7660::testConnection( void )
pbhatnagar3 0:8b08136c5edd 12 {
pbhatnagar3 0:8b08136c5edd 13 if (_i2c.write(MMA7660_ADDRESS, NULL, 0) == 0 )
pbhatnagar3 0:8b08136c5edd 14 return true;
pbhatnagar3 0:8b08136c5edd 15 else
pbhatnagar3 0:8b08136c5edd 16 return false;
pbhatnagar3 0:8b08136c5edd 17 }
pbhatnagar3 0:8b08136c5edd 18
pbhatnagar3 0:8b08136c5edd 19 void MMA7660::setActive(bool state)
pbhatnagar3 0:8b08136c5edd 20 {
pbhatnagar3 0:8b08136c5edd 21 char modereg = read(MMA7660_MODE_R);
pbhatnagar3 0:8b08136c5edd 22 modereg &= ~(1<<0);
pbhatnagar3 0:8b08136c5edd 23
pbhatnagar3 0:8b08136c5edd 24 //If it somehow was in testmode, disable that
pbhatnagar3 0:8b08136c5edd 25 if (modereg && (1<<2)) {
pbhatnagar3 0:8b08136c5edd 26 modereg &= ~(1<<2);
pbhatnagar3 0:8b08136c5edd 27 write(MMA7660_MODE_R, modereg);
pbhatnagar3 0:8b08136c5edd 28 }
pbhatnagar3 0:8b08136c5edd 29
pbhatnagar3 0:8b08136c5edd 30 modereg += state;
pbhatnagar3 0:8b08136c5edd 31 write(MMA7660_MODE_R, modereg);
pbhatnagar3 0:8b08136c5edd 32 }
pbhatnagar3 0:8b08136c5edd 33
pbhatnagar3 0:8b08136c5edd 34 void MMA7660::readData(int *data)
pbhatnagar3 0:8b08136c5edd 35 {
pbhatnagar3 0:8b08136c5edd 36 if (!active) {
pbhatnagar3 0:8b08136c5edd 37 setActive(true);
pbhatnagar3 0:8b08136c5edd 38 active = true;
pbhatnagar3 0:8b08136c5edd 39 wait(0.012 + 1/samplerate); //Wait until new sample is ready, my experience is that 1/samplerate isnt needed, but datasheet says so
pbhatnagar3 0:8b08136c5edd 40 }
pbhatnagar3 0:8b08136c5edd 41
pbhatnagar3 0:8b08136c5edd 42 char temp[3];
pbhatnagar3 0:8b08136c5edd 43 bool alert;
pbhatnagar3 0:8b08136c5edd 44
pbhatnagar3 0:8b08136c5edd 45 do {
pbhatnagar3 0:8b08136c5edd 46 alert = false;
pbhatnagar3 0:8b08136c5edd 47 read(MMA7660_XOUT_R, temp, 3);
pbhatnagar3 0:8b08136c5edd 48 for (int i = 0; i<3; i++) {
pbhatnagar3 0:8b08136c5edd 49 if (temp[i] > 63)
pbhatnagar3 0:8b08136c5edd 50 alert = true;
pbhatnagar3 0:8b08136c5edd 51 if (temp[i] > 31)
pbhatnagar3 0:8b08136c5edd 52 temp[i] += 128+64;
pbhatnagar3 0:8b08136c5edd 53 data[i] = (signed char)temp[i];
pbhatnagar3 0:8b08136c5edd 54 }
pbhatnagar3 0:8b08136c5edd 55 } while (alert);
pbhatnagar3 0:8b08136c5edd 56
pbhatnagar3 0:8b08136c5edd 57 if (!active)
pbhatnagar3 0:8b08136c5edd 58 setActive(false);
pbhatnagar3 0:8b08136c5edd 59 }
pbhatnagar3 0:8b08136c5edd 60
pbhatnagar3 0:8b08136c5edd 61
pbhatnagar3 0:8b08136c5edd 62 void MMA7660::readData(float *data)
pbhatnagar3 0:8b08136c5edd 63 {
pbhatnagar3 0:8b08136c5edd 64 int intdata[3];
pbhatnagar3 0:8b08136c5edd 65 readData(intdata);
pbhatnagar3 0:8b08136c5edd 66 for (int i = 0; i<3; i++)
pbhatnagar3 0:8b08136c5edd 67 data[i] = intdata[i]/MMA7660_SENSITIVITY;
pbhatnagar3 0:8b08136c5edd 68 }
pbhatnagar3 0:8b08136c5edd 69
pbhatnagar3 0:8b08136c5edd 70 float MMA7660::x( void )
pbhatnagar3 0:8b08136c5edd 71 {
pbhatnagar3 0:8b08136c5edd 72 return getSingle(0);
pbhatnagar3 0:8b08136c5edd 73 }
pbhatnagar3 0:8b08136c5edd 74
pbhatnagar3 0:8b08136c5edd 75 float MMA7660::y( void )
pbhatnagar3 0:8b08136c5edd 76 {
pbhatnagar3 0:8b08136c5edd 77 return getSingle(1);
pbhatnagar3 0:8b08136c5edd 78 }
pbhatnagar3 0:8b08136c5edd 79
pbhatnagar3 0:8b08136c5edd 80 float MMA7660::z( void )
pbhatnagar3 0:8b08136c5edd 81 {
pbhatnagar3 0:8b08136c5edd 82 return getSingle(2);
pbhatnagar3 0:8b08136c5edd 83 }
pbhatnagar3 0:8b08136c5edd 84
pbhatnagar3 0:8b08136c5edd 85
pbhatnagar3 0:8b08136c5edd 86 void MMA7660::setSampleRate(int samplerate)
pbhatnagar3 0:8b08136c5edd 87 {
pbhatnagar3 0:8b08136c5edd 88 setActive(false); //Not allowed to be active to change anything
pbhatnagar3 0:8b08136c5edd 89 int rates[] = {120, 64, 32, 16, 8, 4, 2, 1}; //Alowed samplerates (and their number in array is also number required for MMA)
pbhatnagar3 0:8b08136c5edd 90 int sampleLoc = 0, sampleError = 10000, temp;
pbhatnagar3 0:8b08136c5edd 91 for (int i = 0; i<8; i++) {
pbhatnagar3 0:8b08136c5edd 92 temp = abs( rates[i] - samplerate );
pbhatnagar3 0:8b08136c5edd 93 if (temp<sampleError) {
pbhatnagar3 0:8b08136c5edd 94 sampleLoc = i;
pbhatnagar3 0:8b08136c5edd 95 sampleError=temp;
pbhatnagar3 0:8b08136c5edd 96 }
pbhatnagar3 0:8b08136c5edd 97 }
pbhatnagar3 0:8b08136c5edd 98
pbhatnagar3 0:8b08136c5edd 99 //Update the samplerate reg
pbhatnagar3 0:8b08136c5edd 100 temp = read(MMA7660_SR_R);
pbhatnagar3 0:8b08136c5edd 101 temp &= ~0x07; //Awake sample rate are lowest 3 bit
pbhatnagar3 0:8b08136c5edd 102 temp |= sampleLoc;
pbhatnagar3 0:8b08136c5edd 103 write(MMA7660_SR_R, temp);
pbhatnagar3 0:8b08136c5edd 104 this->samplerate = rates[sampleLoc];
pbhatnagar3 0:8b08136c5edd 105 setActive(active); //Restore previous active state
pbhatnagar3 0:8b08136c5edd 106 }
pbhatnagar3 0:8b08136c5edd 107
pbhatnagar3 0:8b08136c5edd 108
pbhatnagar3 0:8b08136c5edd 109 MMA7660::Orientation MMA7660::getSide( void )
pbhatnagar3 0:8b08136c5edd 110 {
pbhatnagar3 0:8b08136c5edd 111 char tiltreg = read(MMA7660_TILT_R);
pbhatnagar3 0:8b08136c5edd 112
pbhatnagar3 0:8b08136c5edd 113 //We care about 2 LSBs
pbhatnagar3 0:8b08136c5edd 114 tiltreg &= 0x03;
pbhatnagar3 0:8b08136c5edd 115 if (tiltreg == 0x01)
pbhatnagar3 0:8b08136c5edd 116 return MMA7660::Front;
pbhatnagar3 0:8b08136c5edd 117 if (tiltreg == 0x02)
pbhatnagar3 0:8b08136c5edd 118 return MMA7660::Back;
pbhatnagar3 0:8b08136c5edd 119 return MMA7660::Unknown;
pbhatnagar3 0:8b08136c5edd 120 }
pbhatnagar3 0:8b08136c5edd 121
pbhatnagar3 0:8b08136c5edd 122 MMA7660::Orientation MMA7660::getOrientation( void )
pbhatnagar3 0:8b08136c5edd 123 {
pbhatnagar3 0:8b08136c5edd 124 char tiltreg = read(MMA7660_TILT_R);
pbhatnagar3 0:8b08136c5edd 125
pbhatnagar3 0:8b08136c5edd 126 //We care about bit 2, 3 and 4 (counting from zero)
pbhatnagar3 0:8b08136c5edd 127 tiltreg &= 0x07<<2;
pbhatnagar3 0:8b08136c5edd 128 tiltreg >>= 2;
pbhatnagar3 0:8b08136c5edd 129 if (tiltreg == 0x01)
pbhatnagar3 0:8b08136c5edd 130 return MMA7660::Left;
pbhatnagar3 0:8b08136c5edd 131 if (tiltreg == 0x02)
pbhatnagar3 0:8b08136c5edd 132 return MMA7660::Right;
pbhatnagar3 0:8b08136c5edd 133 if (tiltreg == 0x05)
pbhatnagar3 0:8b08136c5edd 134 return MMA7660::Down;
pbhatnagar3 0:8b08136c5edd 135 if (tiltreg == 0x06)
pbhatnagar3 0:8b08136c5edd 136 return MMA7660::Up;
pbhatnagar3 0:8b08136c5edd 137 return MMA7660::Unknown;
pbhatnagar3 0:8b08136c5edd 138 }
pbhatnagar3 0:8b08136c5edd 139
pbhatnagar3 0:8b08136c5edd 140
pbhatnagar3 0:8b08136c5edd 141
pbhatnagar3 0:8b08136c5edd 142 //////////////////////////////////////////////
pbhatnagar3 0:8b08136c5edd 143 ///////////////PRIVATE////////////////////////
pbhatnagar3 0:8b08136c5edd 144 //////////////////////////////////////////////
pbhatnagar3 0:8b08136c5edd 145
pbhatnagar3 0:8b08136c5edd 146
pbhatnagar3 0:8b08136c5edd 147 void MMA7660::write(char address, char data)
pbhatnagar3 0:8b08136c5edd 148 {
pbhatnagar3 0:8b08136c5edd 149 char temp[2];
pbhatnagar3 0:8b08136c5edd 150 temp[0]=address;
pbhatnagar3 0:8b08136c5edd 151 temp[1]=data;
pbhatnagar3 0:8b08136c5edd 152
pbhatnagar3 0:8b08136c5edd 153 _i2c.write(MMA7660_ADDRESS, temp, 2);
pbhatnagar3 0:8b08136c5edd 154 }
pbhatnagar3 0:8b08136c5edd 155
pbhatnagar3 0:8b08136c5edd 156 char MMA7660::read(char address)
pbhatnagar3 0:8b08136c5edd 157 {
pbhatnagar3 0:8b08136c5edd 158 char retval;
pbhatnagar3 0:8b08136c5edd 159 _i2c.write(MMA7660_ADDRESS, &address, 1, true);
pbhatnagar3 0:8b08136c5edd 160 _i2c.read(MMA7660_ADDRESS, &retval, 1);
pbhatnagar3 0:8b08136c5edd 161 return retval;
pbhatnagar3 0:8b08136c5edd 162 }
pbhatnagar3 0:8b08136c5edd 163
pbhatnagar3 0:8b08136c5edd 164 void MMA7660::read(char address, char *data, int length)
pbhatnagar3 0:8b08136c5edd 165 {
pbhatnagar3 0:8b08136c5edd 166 _i2c.write(MMA7660_ADDRESS, &address, 1, true);
pbhatnagar3 0:8b08136c5edd 167 _i2c.read(MMA7660_ADDRESS, data, length);
pbhatnagar3 0:8b08136c5edd 168 }
pbhatnagar3 0:8b08136c5edd 169
pbhatnagar3 0:8b08136c5edd 170 float MMA7660::getSingle( int number )
pbhatnagar3 0:8b08136c5edd 171 {
pbhatnagar3 0:8b08136c5edd 172 if (!active) {
pbhatnagar3 0:8b08136c5edd 173 setActive(true);
pbhatnagar3 0:8b08136c5edd 174 wait(0.012 + 1/samplerate); //Wait until new sample is ready
pbhatnagar3 0:8b08136c5edd 175 }
pbhatnagar3 0:8b08136c5edd 176
pbhatnagar3 0:8b08136c5edd 177 signed char temp;
pbhatnagar3 0:8b08136c5edd 178 bool alert;
pbhatnagar3 0:8b08136c5edd 179
pbhatnagar3 0:8b08136c5edd 180 do {
pbhatnagar3 0:8b08136c5edd 181 alert = false;
pbhatnagar3 0:8b08136c5edd 182 temp = read(MMA7660_XOUT_R + number);
pbhatnagar3 0:8b08136c5edd 183 if (temp > 63)
pbhatnagar3 0:8b08136c5edd 184 alert = true;
pbhatnagar3 0:8b08136c5edd 185 if (temp > 31)
pbhatnagar3 0:8b08136c5edd 186 temp += 128+64;
pbhatnagar3 0:8b08136c5edd 187 } while (alert);
pbhatnagar3 0:8b08136c5edd 188
pbhatnagar3 0:8b08136c5edd 189 if (!active)
pbhatnagar3 0:8b08136c5edd 190 setActive(false);
pbhatnagar3 0:8b08136c5edd 191
pbhatnagar3 0:8b08136c5edd 192 return temp / MMA7660_SENSITIVITY;
pbhatnagar3 0:8b08136c5edd 193 }