Xbee-Smart-Home-Inside RX Test

Dependencies:   Si7021 mbed-rtos JPEGCamera mbed

Fork of Xbee-Smart-Home-Inside by prana koirala

Committer:
pkoirala3
Date:
Tue May 02 21:41:59 2017 +0000
Revision:
7:fdfe30cea3c2
Parent:
3:415ccd1f7ae1
Final Version

Who changed what in which revision?

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