Karl Nicolaus
/
4180_Lab1_P6
t
mpr121.cpp@0:2e5b82508aea, 2011-02-28 (annotated)
- Committer:
- abuckton
- Date:
- Mon Feb 28 12:07:17 2011 +0000
- Revision:
- 0:2e5b82508aea
- Child:
- 1:d1837531c318
First cut to get things moving
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
abuckton | 0:2e5b82508aea | 1 | #include <mbed.h> |
abuckton | 0:2e5b82508aea | 2 | #include <sstream> |
abuckton | 0:2e5b82508aea | 3 | #include <string> |
abuckton | 0:2e5b82508aea | 4 | #include <list> |
abuckton | 0:2e5b82508aea | 5 | |
abuckton | 0:2e5b82508aea | 6 | #include <mpr121.h> |
abuckton | 0:2e5b82508aea | 7 | |
abuckton | 0:2e5b82508aea | 8 | using namespace std; |
abuckton | 0:2e5b82508aea | 9 | |
abuckton | 0:2e5b82508aea | 10 | Mpr121::Mpr121(I2C *i2c, Address i2cAddress) |
abuckton | 0:2e5b82508aea | 11 | { |
abuckton | 0:2e5b82508aea | 12 | this->i2c = i2c; |
abuckton | 0:2e5b82508aea | 13 | |
abuckton | 0:2e5b82508aea | 14 | address = i2cAddress; |
abuckton | 0:2e5b82508aea | 15 | |
abuckton | 0:2e5b82508aea | 16 | // Configure the MPR121 settings to default |
abuckton | 0:2e5b82508aea | 17 | this->configureSettings(); |
abuckton | 0:2e5b82508aea | 18 | } |
abuckton | 0:2e5b82508aea | 19 | |
abuckton | 0:2e5b82508aea | 20 | |
abuckton | 0:2e5b82508aea | 21 | void Mpr121::configureSettings() |
abuckton | 0:2e5b82508aea | 22 | { |
abuckton | 0:2e5b82508aea | 23 | // Put the MPR into setup mode |
abuckton | 0:2e5b82508aea | 24 | this->write(ELE_CFG,0x00); |
abuckton | 0:2e5b82508aea | 25 | |
abuckton | 0:2e5b82508aea | 26 | // Electrode filters for when data is > baseline |
abuckton | 0:2e5b82508aea | 27 | unsigned char gtBaseline[] = { |
abuckton | 0:2e5b82508aea | 28 | 0x01, //MHD_R |
abuckton | 0:2e5b82508aea | 29 | 0x01, //NHD_R |
abuckton | 0:2e5b82508aea | 30 | 0x00, //NCL_R |
abuckton | 0:2e5b82508aea | 31 | 0x00 //FDL_R |
abuckton | 0:2e5b82508aea | 32 | }; |
abuckton | 0:2e5b82508aea | 33 | |
abuckton | 0:2e5b82508aea | 34 | writeMany(MHD_R,gtBaseline,4); |
abuckton | 0:2e5b82508aea | 35 | |
abuckton | 0:2e5b82508aea | 36 | // Electrode filters for when data is < baseline |
abuckton | 0:2e5b82508aea | 37 | unsigned char ltBaseline[] = { |
abuckton | 0:2e5b82508aea | 38 | 0x01, //MHD_F |
abuckton | 0:2e5b82508aea | 39 | 0x01, //NHD_F |
abuckton | 0:2e5b82508aea | 40 | 0xFF, //NCL_F |
abuckton | 0:2e5b82508aea | 41 | 0x02 //FDL_F |
abuckton | 0:2e5b82508aea | 42 | }; |
abuckton | 0:2e5b82508aea | 43 | |
abuckton | 0:2e5b82508aea | 44 | writeMany(MHD_F,ltBaseline,4); |
abuckton | 0:2e5b82508aea | 45 | |
abuckton | 0:2e5b82508aea | 46 | // Electrode touch and release thresholds |
abuckton | 0:2e5b82508aea | 47 | unsigned char electrodeThresholds[] = { |
abuckton | 0:2e5b82508aea | 48 | E_THR_T, // Touch Threshhold |
abuckton | 0:2e5b82508aea | 49 | E_THR_R // Release Threshold |
abuckton | 0:2e5b82508aea | 50 | }; |
abuckton | 0:2e5b82508aea | 51 | |
abuckton | 0:2e5b82508aea | 52 | for(int i=0; i<12; i++){ |
abuckton | 0:2e5b82508aea | 53 | int result = writeMany((ELE0_T+(i*2)),electrodeThresholds,2); |
abuckton | 0:2e5b82508aea | 54 | } |
abuckton | 0:2e5b82508aea | 55 | |
abuckton | 0:2e5b82508aea | 56 | // Proximity Settings |
abuckton | 0:2e5b82508aea | 57 | unsigned char proximitySettings[] = { |
abuckton | 0:2e5b82508aea | 58 | 0xff, //MHD_Prox_R |
abuckton | 0:2e5b82508aea | 59 | 0xff, //NHD_Prox_R |
abuckton | 0:2e5b82508aea | 60 | 0x00, //NCL_Prox_R |
abuckton | 0:2e5b82508aea | 61 | 0x00, //FDL_Prox_R |
abuckton | 0:2e5b82508aea | 62 | 0x01, //MHD_Prox_F |
abuckton | 0:2e5b82508aea | 63 | 0x01, //NHD_Prox_F |
abuckton | 0:2e5b82508aea | 64 | 0xFF, //NCL_Prox_F |
abuckton | 0:2e5b82508aea | 65 | 0xff, //FDL_Prox_F |
abuckton | 0:2e5b82508aea | 66 | 0x00, //NHD_Prox_T |
abuckton | 0:2e5b82508aea | 67 | 0x00, //NCL_Prox_T |
abuckton | 0:2e5b82508aea | 68 | 0x00 //NFD_Prox_T |
abuckton | 0:2e5b82508aea | 69 | }; |
abuckton | 0:2e5b82508aea | 70 | writeMany(MHDPROXR,proximitySettings,11); |
abuckton | 0:2e5b82508aea | 71 | |
abuckton | 0:2e5b82508aea | 72 | unsigned char proxThresh[] = { |
abuckton | 0:2e5b82508aea | 73 | PROX_THR_T, // Touch Threshold |
abuckton | 0:2e5b82508aea | 74 | PROX_THR_R // Release Threshold |
abuckton | 0:2e5b82508aea | 75 | }; |
abuckton | 0:2e5b82508aea | 76 | writeMany(EPROXTTH,proxThresh,2); |
abuckton | 0:2e5b82508aea | 77 | |
abuckton | 0:2e5b82508aea | 78 | this->write(FIL_CFG,0x04); |
abuckton | 0:2e5b82508aea | 79 | |
abuckton | 0:2e5b82508aea | 80 | // Set the electrode config to transition to active mode |
abuckton | 0:2e5b82508aea | 81 | this->write(ELE_CFG,0x0c); |
abuckton | 0:2e5b82508aea | 82 | } |
abuckton | 0:2e5b82508aea | 83 | |
abuckton | 0:2e5b82508aea | 84 | void Mpr121::setElectrodeThreshold(int electrode, unsigned char touch, unsigned char release){ |
abuckton | 0:2e5b82508aea | 85 | |
abuckton | 0:2e5b82508aea | 86 | if(electrode > 11) return; |
abuckton | 0:2e5b82508aea | 87 | |
abuckton | 0:2e5b82508aea | 88 | // Get the current mode |
abuckton | 0:2e5b82508aea | 89 | unsigned char mode = this->read(ELE_CFG); |
abuckton | 0:2e5b82508aea | 90 | |
abuckton | 0:2e5b82508aea | 91 | // Put the MPR into setup mode |
abuckton | 0:2e5b82508aea | 92 | this->write(ELE_CFG,0x00); |
abuckton | 0:2e5b82508aea | 93 | |
abuckton | 0:2e5b82508aea | 94 | // Write the new threshold |
abuckton | 0:2e5b82508aea | 95 | this->write((ELE0_T+(electrode*2)), touch); |
abuckton | 0:2e5b82508aea | 96 | this->write((ELE0_T+(electrode*2)+1), release); |
abuckton | 0:2e5b82508aea | 97 | |
abuckton | 0:2e5b82508aea | 98 | //Restore the operating mode |
abuckton | 0:2e5b82508aea | 99 | this->write(ELE_CFG, mode); |
abuckton | 0:2e5b82508aea | 100 | } |
abuckton | 0:2e5b82508aea | 101 | |
abuckton | 0:2e5b82508aea | 102 | |
abuckton | 0:2e5b82508aea | 103 | unsigned char Mpr121::read(int key){ |
abuckton | 0:2e5b82508aea | 104 | |
abuckton | 0:2e5b82508aea | 105 | unsigned char data[2]; |
abuckton | 0:2e5b82508aea | 106 | |
abuckton | 0:2e5b82508aea | 107 | //Start the command |
abuckton | 0:2e5b82508aea | 108 | i2c->start(); |
abuckton | 0:2e5b82508aea | 109 | |
abuckton | 0:2e5b82508aea | 110 | // Address the target (Write mode) |
abuckton | 0:2e5b82508aea | 111 | int ack1= i2c->write(address); |
abuckton | 0:2e5b82508aea | 112 | |
abuckton | 0:2e5b82508aea | 113 | // Set the register key to read |
abuckton | 0:2e5b82508aea | 114 | int ack2 = i2c->write(key); |
abuckton | 0:2e5b82508aea | 115 | |
abuckton | 0:2e5b82508aea | 116 | // Re-start for read of data |
abuckton | 0:2e5b82508aea | 117 | i2c->start(); |
abuckton | 0:2e5b82508aea | 118 | |
abuckton | 0:2e5b82508aea | 119 | // Re-send the target address in read mode |
abuckton | 0:2e5b82508aea | 120 | int ack3 = i2c->write(address+1); |
abuckton | 0:2e5b82508aea | 121 | |
abuckton | 0:2e5b82508aea | 122 | // Read in the result |
abuckton | 0:2e5b82508aea | 123 | data[0] = i2c->read(0); |
abuckton | 0:2e5b82508aea | 124 | |
abuckton | 0:2e5b82508aea | 125 | // Reset the bus |
abuckton | 0:2e5b82508aea | 126 | i2c->stop(); |
abuckton | 0:2e5b82508aea | 127 | |
abuckton | 0:2e5b82508aea | 128 | return data[0]; |
abuckton | 0:2e5b82508aea | 129 | } |
abuckton | 0:2e5b82508aea | 130 | |
abuckton | 0:2e5b82508aea | 131 | |
abuckton | 0:2e5b82508aea | 132 | int Mpr121::write(int key, unsigned char value){ |
abuckton | 0:2e5b82508aea | 133 | |
abuckton | 0:2e5b82508aea | 134 | //Start the command |
abuckton | 0:2e5b82508aea | 135 | i2c->start(); |
abuckton | 0:2e5b82508aea | 136 | |
abuckton | 0:2e5b82508aea | 137 | // Address the target (Write mode) |
abuckton | 0:2e5b82508aea | 138 | int ack1= i2c->write(address); |
abuckton | 0:2e5b82508aea | 139 | |
abuckton | 0:2e5b82508aea | 140 | // Set the register key to write |
abuckton | 0:2e5b82508aea | 141 | int ack2 = i2c->write(key); |
abuckton | 0:2e5b82508aea | 142 | |
abuckton | 0:2e5b82508aea | 143 | // Read in the result |
abuckton | 0:2e5b82508aea | 144 | int ack3 = i2c->write(value); |
abuckton | 0:2e5b82508aea | 145 | |
abuckton | 0:2e5b82508aea | 146 | // Reset the bus |
abuckton | 0:2e5b82508aea | 147 | i2c->stop(); |
abuckton | 0:2e5b82508aea | 148 | |
abuckton | 0:2e5b82508aea | 149 | return (ack1+ack2+ack3)-3; |
abuckton | 0:2e5b82508aea | 150 | } |
abuckton | 0:2e5b82508aea | 151 | |
abuckton | 0:2e5b82508aea | 152 | |
abuckton | 0:2e5b82508aea | 153 | int Mpr121::writeMany(int start, unsigned char* dataSet, int length){ |
abuckton | 0:2e5b82508aea | 154 | //Start the command |
abuckton | 0:2e5b82508aea | 155 | i2c->start(); |
abuckton | 0:2e5b82508aea | 156 | |
abuckton | 0:2e5b82508aea | 157 | // Address the target (Write mode) |
abuckton | 0:2e5b82508aea | 158 | int ack= i2c->write(address); |
abuckton | 0:2e5b82508aea | 159 | if(ack!=1){ |
abuckton | 0:2e5b82508aea | 160 | return -1; |
abuckton | 0:2e5b82508aea | 161 | } |
abuckton | 0:2e5b82508aea | 162 | |
abuckton | 0:2e5b82508aea | 163 | // Set the register key to write |
abuckton | 0:2e5b82508aea | 164 | ack = i2c->write(start); |
abuckton | 0:2e5b82508aea | 165 | if(ack!=1){ |
abuckton | 0:2e5b82508aea | 166 | return -1; |
abuckton | 0:2e5b82508aea | 167 | } |
abuckton | 0:2e5b82508aea | 168 | |
abuckton | 0:2e5b82508aea | 169 | // Write the date set |
abuckton | 0:2e5b82508aea | 170 | int count = 0; |
abuckton | 0:2e5b82508aea | 171 | while(ack==1 && (count < length)){ |
abuckton | 0:2e5b82508aea | 172 | ack = i2c->write(dataSet[count]); |
abuckton | 0:2e5b82508aea | 173 | count++; |
abuckton | 0:2e5b82508aea | 174 | } |
abuckton | 0:2e5b82508aea | 175 | // Stop the cmd |
abuckton | 0:2e5b82508aea | 176 | i2c->stop(); |
abuckton | 0:2e5b82508aea | 177 | |
abuckton | 0:2e5b82508aea | 178 | return count; |
abuckton | 0:2e5b82508aea | 179 | } |
abuckton | 0:2e5b82508aea | 180 | |
abuckton | 0:2e5b82508aea | 181 | |
abuckton | 0:2e5b82508aea | 182 | bool Mpr121::getProximityMode(){ |
abuckton | 0:2e5b82508aea | 183 | if(this->read(ELE_CFG) > 0x0c) |
abuckton | 0:2e5b82508aea | 184 | return true; |
abuckton | 0:2e5b82508aea | 185 | else |
abuckton | 0:2e5b82508aea | 186 | return false; |
abuckton | 0:2e5b82508aea | 187 | } |
abuckton | 0:2e5b82508aea | 188 | |
abuckton | 0:2e5b82508aea | 189 | void Mpr121::setProximityMode(bool mode){ |
abuckton | 0:2e5b82508aea | 190 | this->write(ELE_CFG,0x00); |
abuckton | 0:2e5b82508aea | 191 | if(mode){ |
abuckton | 0:2e5b82508aea | 192 | this->write(ELE_CFG,0x30); //Sense proximity from ALL pads |
abuckton | 0:2e5b82508aea | 193 | } else { |
abuckton | 0:2e5b82508aea | 194 | this->write(ELE_CFG,0x0c); //Sense touch, all 12 pads active. |
abuckton | 0:2e5b82508aea | 195 | } |
abuckton | 0:2e5b82508aea | 196 | } |
abuckton | 0:2e5b82508aea | 197 | |
abuckton | 0:2e5b82508aea | 198 | |
abuckton | 0:2e5b82508aea | 199 | int Mpr121::readTouchData(){ |
abuckton | 0:2e5b82508aea | 200 | return this->read(0x00); |
abuckton | 0:2e5b82508aea | 201 | } |