Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Committer:
ssrivastav31
Date:
Fri Mar 10 16:21:23 2017 +0000
Revision:
0:77d5499f98f3
Build Your Burger Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ssrivastav31 0:77d5499f98f3 1 /*
ssrivastav31 0:77d5499f98f3 2 Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au)
ssrivastav31 0:77d5499f98f3 3
ssrivastav31 0:77d5499f98f3 4 Permission is hereby granted, free of charge, to any person obtaining a copy
ssrivastav31 0:77d5499f98f3 5 of this software and associated documentation files (the "Software"), to deal
ssrivastav31 0:77d5499f98f3 6 in the Software without restriction, including without limitation the rights
ssrivastav31 0:77d5499f98f3 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ssrivastav31 0:77d5499f98f3 8 copies of the Software, and to permit persons to whom the Software is
ssrivastav31 0:77d5499f98f3 9 furnished to do so, subject to the following conditions:
ssrivastav31 0:77d5499f98f3 10
ssrivastav31 0:77d5499f98f3 11 The above copyright notice and this permission notice shall be included in
ssrivastav31 0:77d5499f98f3 12 all copies or substantial portions of the Software.
ssrivastav31 0:77d5499f98f3 13
ssrivastav31 0:77d5499f98f3 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ssrivastav31 0:77d5499f98f3 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ssrivastav31 0:77d5499f98f3 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ssrivastav31 0:77d5499f98f3 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ssrivastav31 0:77d5499f98f3 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ssrivastav31 0:77d5499f98f3 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ssrivastav31 0:77d5499f98f3 20 THE SOFTWARE.
ssrivastav31 0:77d5499f98f3 21 */
ssrivastav31 0:77d5499f98f3 22
ssrivastav31 0:77d5499f98f3 23 #include <mbed.h>
ssrivastav31 0:77d5499f98f3 24 #include <sstream>
ssrivastav31 0:77d5499f98f3 25 #include <string>
ssrivastav31 0:77d5499f98f3 26 #include <list>
ssrivastav31 0:77d5499f98f3 27
ssrivastav31 0:77d5499f98f3 28 #include <mpr121.h>
ssrivastav31 0:77d5499f98f3 29
ssrivastav31 0:77d5499f98f3 30 Mpr121::Mpr121(I2C *i2c, Address i2cAddress)
ssrivastav31 0:77d5499f98f3 31 {
ssrivastav31 0:77d5499f98f3 32 this->i2c = i2c;
ssrivastav31 0:77d5499f98f3 33
ssrivastav31 0:77d5499f98f3 34 address = i2cAddress;
ssrivastav31 0:77d5499f98f3 35
ssrivastav31 0:77d5499f98f3 36 // Configure the MPR121 settings to default
ssrivastav31 0:77d5499f98f3 37 this->configureSettings();
ssrivastav31 0:77d5499f98f3 38 }
ssrivastav31 0:77d5499f98f3 39
ssrivastav31 0:77d5499f98f3 40
ssrivastav31 0:77d5499f98f3 41 void Mpr121::configureSettings()
ssrivastav31 0:77d5499f98f3 42 {
ssrivastav31 0:77d5499f98f3 43 // Put the MPR into setup mode
ssrivastav31 0:77d5499f98f3 44 this->write(ELE_CFG,0x00);
ssrivastav31 0:77d5499f98f3 45
ssrivastav31 0:77d5499f98f3 46 // Electrode filters for when data is > baseline
ssrivastav31 0:77d5499f98f3 47 unsigned char gtBaseline[] = {
ssrivastav31 0:77d5499f98f3 48 0x01, //MHD_R
ssrivastav31 0:77d5499f98f3 49 0x01, //NHD_R
ssrivastav31 0:77d5499f98f3 50 0x00, //NCL_R
ssrivastav31 0:77d5499f98f3 51 0x00 //FDL_R
ssrivastav31 0:77d5499f98f3 52 };
ssrivastav31 0:77d5499f98f3 53
ssrivastav31 0:77d5499f98f3 54 writeMany(MHD_R,gtBaseline,4);
ssrivastav31 0:77d5499f98f3 55
ssrivastav31 0:77d5499f98f3 56 // Electrode filters for when data is < baseline
ssrivastav31 0:77d5499f98f3 57 unsigned char ltBaseline[] = {
ssrivastav31 0:77d5499f98f3 58 0x01, //MHD_F
ssrivastav31 0:77d5499f98f3 59 0x01, //NHD_F
ssrivastav31 0:77d5499f98f3 60 0xFF, //NCL_F
ssrivastav31 0:77d5499f98f3 61 0x02 //FDL_F
ssrivastav31 0:77d5499f98f3 62 };
ssrivastav31 0:77d5499f98f3 63
ssrivastav31 0:77d5499f98f3 64 writeMany(MHD_F,ltBaseline,4);
ssrivastav31 0:77d5499f98f3 65
ssrivastav31 0:77d5499f98f3 66 // Electrode touch and release thresholds
ssrivastav31 0:77d5499f98f3 67 unsigned char electrodeThresholds[] = {
ssrivastav31 0:77d5499f98f3 68 E_THR_T, // Touch Threshhold
ssrivastav31 0:77d5499f98f3 69 E_THR_R // Release Threshold
ssrivastav31 0:77d5499f98f3 70 };
ssrivastav31 0:77d5499f98f3 71
ssrivastav31 0:77d5499f98f3 72 for(int i=0; i<12; i++){
ssrivastav31 0:77d5499f98f3 73 int result = writeMany((ELE0_T+(i*2)),electrodeThresholds,2);
ssrivastav31 0:77d5499f98f3 74 }
ssrivastav31 0:77d5499f98f3 75
ssrivastav31 0:77d5499f98f3 76 // Proximity Settings
ssrivastav31 0:77d5499f98f3 77 unsigned char proximitySettings[] = {
ssrivastav31 0:77d5499f98f3 78 0xff, //MHD_Prox_R
ssrivastav31 0:77d5499f98f3 79 0xff, //NHD_Prox_R
ssrivastav31 0:77d5499f98f3 80 0x00, //NCL_Prox_R
ssrivastav31 0:77d5499f98f3 81 0x00, //FDL_Prox_R
ssrivastav31 0:77d5499f98f3 82 0x01, //MHD_Prox_F
ssrivastav31 0:77d5499f98f3 83 0x01, //NHD_Prox_F
ssrivastav31 0:77d5499f98f3 84 0xFF, //NCL_Prox_F
ssrivastav31 0:77d5499f98f3 85 0xff, //FDL_Prox_F
ssrivastav31 0:77d5499f98f3 86 0x00, //NHD_Prox_T
ssrivastav31 0:77d5499f98f3 87 0x00, //NCL_Prox_T
ssrivastav31 0:77d5499f98f3 88 0x00 //NFD_Prox_T
ssrivastav31 0:77d5499f98f3 89 };
ssrivastav31 0:77d5499f98f3 90 writeMany(MHDPROXR,proximitySettings,11);
ssrivastav31 0:77d5499f98f3 91
ssrivastav31 0:77d5499f98f3 92 unsigned char proxThresh[] = {
ssrivastav31 0:77d5499f98f3 93 PROX_THR_T, // Touch Threshold
ssrivastav31 0:77d5499f98f3 94 PROX_THR_R // Release Threshold
ssrivastav31 0:77d5499f98f3 95 };
ssrivastav31 0:77d5499f98f3 96 writeMany(EPROXTTH,proxThresh,2);
ssrivastav31 0:77d5499f98f3 97
ssrivastav31 0:77d5499f98f3 98 this->write(FIL_CFG,0x04);
ssrivastav31 0:77d5499f98f3 99
ssrivastav31 0:77d5499f98f3 100 // Set the electrode config to transition to active mode
ssrivastav31 0:77d5499f98f3 101 this->write(ELE_CFG,0x0c);
ssrivastav31 0:77d5499f98f3 102 }
ssrivastav31 0:77d5499f98f3 103
ssrivastav31 0:77d5499f98f3 104 void Mpr121::setElectrodeThreshold(int electrode, unsigned char touch, unsigned char release){
ssrivastav31 0:77d5499f98f3 105
ssrivastav31 0:77d5499f98f3 106 if(electrode > 11) return;
ssrivastav31 0:77d5499f98f3 107
ssrivastav31 0:77d5499f98f3 108 // Get the current mode
ssrivastav31 0:77d5499f98f3 109 unsigned char mode = this->read(ELE_CFG);
ssrivastav31 0:77d5499f98f3 110
ssrivastav31 0:77d5499f98f3 111 // Put the MPR into setup mode
ssrivastav31 0:77d5499f98f3 112 this->write(ELE_CFG,0x00);
ssrivastav31 0:77d5499f98f3 113
ssrivastav31 0:77d5499f98f3 114 // Write the new threshold
ssrivastav31 0:77d5499f98f3 115 this->write((ELE0_T+(electrode*2)), touch);
ssrivastav31 0:77d5499f98f3 116 this->write((ELE0_T+(electrode*2)+1), release);
ssrivastav31 0:77d5499f98f3 117
ssrivastav31 0:77d5499f98f3 118 //Restore the operating mode
ssrivastav31 0:77d5499f98f3 119 this->write(ELE_CFG, mode);
ssrivastav31 0:77d5499f98f3 120 }
ssrivastav31 0:77d5499f98f3 121
ssrivastav31 0:77d5499f98f3 122
ssrivastav31 0:77d5499f98f3 123 unsigned char Mpr121::read(int key){
ssrivastav31 0:77d5499f98f3 124
ssrivastav31 0:77d5499f98f3 125 unsigned char data[2];
ssrivastav31 0:77d5499f98f3 126
ssrivastav31 0:77d5499f98f3 127 //Start the command
ssrivastav31 0:77d5499f98f3 128 i2c->start();
ssrivastav31 0:77d5499f98f3 129
ssrivastav31 0:77d5499f98f3 130 // Address the target (Write mode)
ssrivastav31 0:77d5499f98f3 131 int ack1= i2c->write(address);
ssrivastav31 0:77d5499f98f3 132
ssrivastav31 0:77d5499f98f3 133 // Set the register key to read
ssrivastav31 0:77d5499f98f3 134 int ack2 = i2c->write(key);
ssrivastav31 0:77d5499f98f3 135
ssrivastav31 0:77d5499f98f3 136 // Re-start for read of data
ssrivastav31 0:77d5499f98f3 137 i2c->start();
ssrivastav31 0:77d5499f98f3 138
ssrivastav31 0:77d5499f98f3 139 // Re-send the target address in read mode
ssrivastav31 0:77d5499f98f3 140 int ack3 = i2c->write(address+1);
ssrivastav31 0:77d5499f98f3 141
ssrivastav31 0:77d5499f98f3 142 // Read in the result
ssrivastav31 0:77d5499f98f3 143 data[0] = i2c->read(0);
ssrivastav31 0:77d5499f98f3 144
ssrivastav31 0:77d5499f98f3 145 // Reset the bus
ssrivastav31 0:77d5499f98f3 146 i2c->stop();
ssrivastav31 0:77d5499f98f3 147
ssrivastav31 0:77d5499f98f3 148 return data[0];
ssrivastav31 0:77d5499f98f3 149 }
ssrivastav31 0:77d5499f98f3 150
ssrivastav31 0:77d5499f98f3 151
ssrivastav31 0:77d5499f98f3 152 int Mpr121::write(int key, unsigned char value){
ssrivastav31 0:77d5499f98f3 153
ssrivastav31 0:77d5499f98f3 154 //Start the command
ssrivastav31 0:77d5499f98f3 155 i2c->start();
ssrivastav31 0:77d5499f98f3 156
ssrivastav31 0:77d5499f98f3 157 // Address the target (Write mode)
ssrivastav31 0:77d5499f98f3 158 int ack1= i2c->write(address);
ssrivastav31 0:77d5499f98f3 159
ssrivastav31 0:77d5499f98f3 160 // Set the register key to write
ssrivastav31 0:77d5499f98f3 161 int ack2 = i2c->write(key);
ssrivastav31 0:77d5499f98f3 162
ssrivastav31 0:77d5499f98f3 163 // Read in the result
ssrivastav31 0:77d5499f98f3 164 int ack3 = i2c->write(value);
ssrivastav31 0:77d5499f98f3 165
ssrivastav31 0:77d5499f98f3 166 // Reset the bus
ssrivastav31 0:77d5499f98f3 167 i2c->stop();
ssrivastav31 0:77d5499f98f3 168
ssrivastav31 0:77d5499f98f3 169 return (ack1+ack2+ack3)-3;
ssrivastav31 0:77d5499f98f3 170 }
ssrivastav31 0:77d5499f98f3 171
ssrivastav31 0:77d5499f98f3 172
ssrivastav31 0:77d5499f98f3 173 int Mpr121::writeMany(int start, unsigned char* dataSet, int length){
ssrivastav31 0:77d5499f98f3 174 //Start the command
ssrivastav31 0:77d5499f98f3 175 i2c->start();
ssrivastav31 0:77d5499f98f3 176
ssrivastav31 0:77d5499f98f3 177 // Address the target (Write mode)
ssrivastav31 0:77d5499f98f3 178 int ack= i2c->write(address);
ssrivastav31 0:77d5499f98f3 179 if(ack!=1){
ssrivastav31 0:77d5499f98f3 180 return -1;
ssrivastav31 0:77d5499f98f3 181 }
ssrivastav31 0:77d5499f98f3 182
ssrivastav31 0:77d5499f98f3 183 // Set the register key to write
ssrivastav31 0:77d5499f98f3 184 ack = i2c->write(start);
ssrivastav31 0:77d5499f98f3 185 if(ack!=1){
ssrivastav31 0:77d5499f98f3 186 return -1;
ssrivastav31 0:77d5499f98f3 187 }
ssrivastav31 0:77d5499f98f3 188
ssrivastav31 0:77d5499f98f3 189 // Write the date set
ssrivastav31 0:77d5499f98f3 190 int count = 0;
ssrivastav31 0:77d5499f98f3 191 while(ack==1 && (count < length)){
ssrivastav31 0:77d5499f98f3 192 ack = i2c->write(dataSet[count]);
ssrivastav31 0:77d5499f98f3 193 count++;
ssrivastav31 0:77d5499f98f3 194 }
ssrivastav31 0:77d5499f98f3 195 // Stop the cmd
ssrivastav31 0:77d5499f98f3 196 i2c->stop();
ssrivastav31 0:77d5499f98f3 197
ssrivastav31 0:77d5499f98f3 198 return count;
ssrivastav31 0:77d5499f98f3 199 }
ssrivastav31 0:77d5499f98f3 200
ssrivastav31 0:77d5499f98f3 201
ssrivastav31 0:77d5499f98f3 202 bool Mpr121::getProximityMode(){
ssrivastav31 0:77d5499f98f3 203 if(this->read(ELE_CFG) > 0x0c)
ssrivastav31 0:77d5499f98f3 204 return true;
ssrivastav31 0:77d5499f98f3 205 else
ssrivastav31 0:77d5499f98f3 206 return false;
ssrivastav31 0:77d5499f98f3 207 }
ssrivastav31 0:77d5499f98f3 208
ssrivastav31 0:77d5499f98f3 209 void Mpr121::setProximityMode(bool mode){
ssrivastav31 0:77d5499f98f3 210 this->write(ELE_CFG,0x00);
ssrivastav31 0:77d5499f98f3 211 if(mode){
ssrivastav31 0:77d5499f98f3 212 this->write(ELE_CFG,0x30); //Sense proximity from ALL pads
ssrivastav31 0:77d5499f98f3 213 } else {
ssrivastav31 0:77d5499f98f3 214 this->write(ELE_CFG,0x0c); //Sense touch, all 12 pads active.
ssrivastav31 0:77d5499f98f3 215 }
ssrivastav31 0:77d5499f98f3 216 }
ssrivastav31 0:77d5499f98f3 217
ssrivastav31 0:77d5499f98f3 218
ssrivastav31 0:77d5499f98f3 219 int Mpr121::readTouchData(){
ssrivastav31 0:77d5499f98f3 220 return this->read(0x00);
ssrivastav31 0:77d5499f98f3 221 }