Denwis La / Mbed OS mDot_Send_Data

Dependencies:   libmDot-dev-mbed5-deprecated ISL29011

Fork of mdot-examples by 3mdeb

Committer:
SDesign2018
Date:
Wed Jan 10 17:05:29 2018 +0000
Revision:
23:9c95ba021bdc
Parent:
22:388f97cf422a
Child:
24:88c7bebf0b05
Ticker now works, performing periodic readings based on a single trigger variable-periodicReadingTrigger;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SDesign2018 20:dba07b7d9675 1 #include <stdlib.h>
SDesign2018 20:dba07b7d9675 2 #include <iostream>
SDesign2018 20:dba07b7d9675 3 #include <string.h>
SDesign2018 20:dba07b7d9675 4 #include <mbed.h>
SDesign2018 20:dba07b7d9675 5 #include "dot_util.h"
SDesign2018 20:dba07b7d9675 6 #include "RadioEvent.h"
SDesign2018 20:dba07b7d9675 7 #include "itoa.h"
SDesign2018 20:dba07b7d9675 8
SDesign2018 20:dba07b7d9675 9 #define BUFFER_SIZE 10
SDesign2018 20:dba07b7d9675 10
SDesign2018 20:dba07b7d9675 11
SDesign2018 20:dba07b7d9675 12 /////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 13 // -------------------- DOT LIBRARY REQUIRED ------------------------------//
SDesign2018 20:dba07b7d9675 14 // * Because these example programs can be used for both mDot and xDot //
SDesign2018 20:dba07b7d9675 15 // devices, the LoRa stack is not included. The libmDot library should //
SDesign2018 20:dba07b7d9675 16 // be imported if building for mDot devices. The libxDot library //
SDesign2018 20:dba07b7d9675 17 // should be imported if building for xDot devices. //
SDesign2018 20:dba07b7d9675 18 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ //
SDesign2018 20:dba07b7d9675 19 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ //
SDesign2018 20:dba07b7d9675 20 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ //
SDesign2018 20:dba07b7d9675 21 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ //
SDesign2018 20:dba07b7d9675 22 /////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 23
SDesign2018 20:dba07b7d9675 24
SDesign2018 20:dba07b7d9675 25 /////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 26 // * these options must match between the two devices in //
SDesign2018 20:dba07b7d9675 27 // order for communication to be successful
SDesign2018 20:dba07b7d9675 28 //-------------------MDOT variables------------------------//
SDesign2018 20:dba07b7d9675 29 /////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 30 static uint8_t network_address[] = { 0x00, 0x11, 0x22, 0x33 };
SDesign2018 20:dba07b7d9675 31 static uint8_t network_session_key[] = { 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33 };
SDesign2018 20:dba07b7d9675 32 static uint8_t data_session_key[] = { 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00 };
SDesign2018 20:dba07b7d9675 33
SDesign2018 20:dba07b7d9675 34 mDot* dot = NULL;
SDesign2018 20:dba07b7d9675 35 lora::ChannelPlan* plan = NULL;
SDesign2018 20:dba07b7d9675 36 //--------------End of MDOT variables-------------------//
SDesign2018 20:dba07b7d9675 37
SDesign2018 20:dba07b7d9675 38 Serial pc(USBTX, USBRX);
SDesign2018 20:dba07b7d9675 39 Ticker Periodic;
SDesign2018 20:dba07b7d9675 40
SDesign2018 20:dba07b7d9675 41 // ADXL372 Slave I2C
SDesign2018 20:dba07b7d9675 42 I2C ADXL372(I2C_SDA, I2C_SCL); // (D14,D15) (MISO, CS)
SDesign2018 20:dba07b7d9675 43
SDesign2018 20:dba07b7d9675 44 // ADT7410 Temperature
SDesign2018 20:dba07b7d9675 45 I2C ADT7410(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 20:dba07b7d9675 46 InterruptIn ADT7410_Int(D2); // Allow this pin for ADT7410 Interrupt critical temperature notice
SDesign2018 20:dba07b7d9675 47
SDesign2018 20:dba07b7d9675 48 // DS7505s Temperature
SDesign2018 20:dba07b7d9675 49 I2C DS7505(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 20:dba07b7d9675 50
SDesign2018 20:dba07b7d9675 51 // Create reocurring interrupt function that could be used to periodically take temperatures
SDesign2018 20:dba07b7d9675 52 // Not working right now due to some mutex initialize error
SDesign2018 20:dba07b7d9675 53 // Suspect that it is due to it having be a RTOS task thing
SDesign2018 20:dba07b7d9675 54 // Should probably go back to using an in processor timer interrupt instead of mbed
SDesign2018 20:dba07b7d9675 55
SDesign2018 20:dba07b7d9675 56 const int ADT7410_Address_7BIT = 0x49; // A0 set HIGH and A1 set LOW
SDesign2018 20:dba07b7d9675 57 const int ADT7410_Address_8BIT = ADT7410_Address_7BIT << 1; // Shift 1 bit to left for R/~W bit, and basic I2C format
SDesign2018 20:dba07b7d9675 58
SDesign2018 20:dba07b7d9675 59 const int ADXL372_Address_7bit = 0x1D; // Address for the I2C if MISO pulled low, 0x53 if pulled high
SDesign2018 20:dba07b7d9675 60 const int ADXL372_Address_8bit = ADXL372_Address_7bit << 1; // Same
SDesign2018 20:dba07b7d9675 61
SDesign2018 20:dba07b7d9675 62 const int DS7505s_Address_7bit = 0x48; // A0 set LOR, A1 set LOW, A2 set LOW
SDesign2018 20:dba07b7d9675 63 const int DS7505s_Address_8bit = DS7505s_Address_7bit << 1; // Same
SDesign2018 20:dba07b7d9675 64
SDesign2018 20:dba07b7d9675 65
SDesign2018 20:dba07b7d9675 66 int regAddress; // Used by all sensors
SDesign2018 20:dba07b7d9675 67
SDesign2018 20:dba07b7d9675 68 /*
SDesign2018 20:dba07b7d9675 69 * Variables used for ADT7410 Temperature
SDesign2018 20:dba07b7d9675 70 */
SDesign2018 20:dba07b7d9675 71 // Points to the returned char pointer from called functions
SDesign2018 20:dba07b7d9675 72 char * rawTempValues; // Could change to uint8_t, same for other char pointers
SDesign2018 20:dba07b7d9675 73 uint16_t convertedTempValue; // Data values must be uint16_t for conversion and send prep
SDesign2018 20:dba07b7d9675 74 uint16_t temperatureBuffer[BUFFER_SIZE];
SDesign2018 20:dba07b7d9675 75
SDesign2018 20:dba07b7d9675 76
SDesign2018 20:dba07b7d9675 77 /*
SDesign2018 20:dba07b7d9675 78 * Variables used for mDot
SDesign2018 20:dba07b7d9675 79 */
SDesign2018 20:dba07b7d9675 80
SDesign2018 20:dba07b7d9675 81
SDesign2018 20:dba07b7d9675 82 uint32_t tx_frequency;
SDesign2018 20:dba07b7d9675 83 uint8_t tx_datarate;
SDesign2018 20:dba07b7d9675 84 uint8_t tx_power;
SDesign2018 20:dba07b7d9675 85 uint8_t frequency_band;
SDesign2018 20:dba07b7d9675 86
SDesign2018 20:dba07b7d9675 87
SDesign2018 21:d96ef380a5d3 88
SDesign2018 20:dba07b7d9675 89 /*
SDesign2018 20:dba07b7d9675 90 * Variables used for ADXL372 Accelerometer
SDesign2018 20:dba07b7d9675 91 */
SDesign2018 20:dba07b7d9675 92 char *accelValues;
SDesign2018 20:dba07b7d9675 93 char Xmsb; // Gets most significant byte
SDesign2018 20:dba07b7d9675 94 char Xlsb; // Gets least significant byte
SDesign2018 20:dba07b7d9675 95 char Ymsb;
SDesign2018 20:dba07b7d9675 96 char Ylsb;
SDesign2018 20:dba07b7d9675 97 char Zmsb;
SDesign2018 20:dba07b7d9675 98 char Zlsb;
SDesign2018 20:dba07b7d9675 99 uint16_t XData;
SDesign2018 20:dba07b7d9675 100 uint16_t YData;
SDesign2018 20:dba07b7d9675 101 uint16_t ZData;
SDesign2018 20:dba07b7d9675 102
SDesign2018 20:dba07b7d9675 103 uint16_t XDataInterrupt[BUFFER_SIZE];
SDesign2018 20:dba07b7d9675 104 uint16_t YDataInterrupt[BUFFER_SIZE];
SDesign2018 20:dba07b7d9675 105 uint16_t ZDataInterrupt[BUFFER_SIZE];
SDesign2018 20:dba07b7d9675 106
SDesign2018 20:dba07b7d9675 107
SDesign2018 20:dba07b7d9675 108
SDesign2018 20:dba07b7d9675 109 /*
SDesign2018 20:dba07b7d9675 110 * Variables used for interrupt triggers
SDesign2018 20:dba07b7d9675 111 */
SDesign2018 20:dba07b7d9675 112 bool takeTemperature = false; // Trigger temperature reading
SDesign2018 20:dba07b7d9675 113 bool takeAccelerometer = false; // Trigger accelerometer reading
SDesign2018 22:388f97cf422a 114 bool periodicReadingTrigger = false; // Trigger reading both accelerometer and temperature
SDesign2018 20:dba07b7d9675 115
SDesign2018 20:dba07b7d9675 116 /*
SDesign2018 20:dba07b7d9675 117 * Prototype functions
SDesign2018 20:dba07b7d9675 118 */
SDesign2018 20:dba07b7d9675 119
SDesign2018 20:dba07b7d9675 120 char twosComplementConversion(char value);
SDesign2018 20:dba07b7d9675 121
SDesign2018 20:dba07b7d9675 122 void ADXL372Initialize(void);
SDesign2018 20:dba07b7d9675 123 void ADXL372Reset(void);
SDesign2018 20:dba07b7d9675 124 void I2CSelfTest(void);
SDesign2018 20:dba07b7d9675 125 void accelerometerI2CWrite(int hexAddress, int hexData);
SDesign2018 20:dba07b7d9675 126 char * accelerometerI2CRead(int hexAddress);
SDesign2018 20:dba07b7d9675 127
SDesign2018 20:dba07b7d9675 128 void ADT7410Initialize(void);
SDesign2018 20:dba07b7d9675 129 void ADT7410Write(unsigned char registerAddress, unsigned char data);
SDesign2018 20:dba07b7d9675 130 char * ADT7410Read(int hex);
SDesign2018 20:dba07b7d9675 131
SDesign2018 20:dba07b7d9675 132
SDesign2018 20:dba07b7d9675 133 /*
SDesign2018 20:dba07b7d9675 134 * Interrupt functions
SDesign2018 20:dba07b7d9675 135 */
SDesign2018 20:dba07b7d9675 136 void CriticalTemperatureInterrupt(void){
SDesign2018 20:dba07b7d9675 137 takeTemperature = true; // Take temperature because something happened
SDesign2018 20:dba07b7d9675 138 }
SDesign2018 20:dba07b7d9675 139
SDesign2018 20:dba07b7d9675 140 void CriticalAccelerometerInterrupt(void){
SDesign2018 20:dba07b7d9675 141 takeAccelerometer = true; // Take accelerometer because something happened
SDesign2018 20:dba07b7d9675 142 }
SDesign2018 20:dba07b7d9675 143
SDesign2018 23:9c95ba021bdc 144 void takePeriodicReading(void){
SDesign2018 20:dba07b7d9675 145 pc.printf("Periodic Reading\n\r");
SDesign2018 20:dba07b7d9675 146 /*
SDesign2018 20:dba07b7d9675 147 * Taking accelerometer data
SDesign2018 20:dba07b7d9675 148 */
SDesign2018 20:dba07b7d9675 149 regAddress = 0x08; // This is the register address for XData
SDesign2018 20:dba07b7d9675 150 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 20:dba07b7d9675 151 Xmsb = *(accelValues + 0);
SDesign2018 20:dba07b7d9675 152 Xlsb = *(accelValues + 1);
SDesign2018 20:dba07b7d9675 153 Ymsb = *(accelValues + 2);
SDesign2018 20:dba07b7d9675 154 Ylsb = *(accelValues + 3);
SDesign2018 20:dba07b7d9675 155 Zmsb = *(accelValues + 4);
SDesign2018 20:dba07b7d9675 156 Zlsb = *(accelValues + 5);
SDesign2018 20:dba07b7d9675 157
SDesign2018 20:dba07b7d9675 158 XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 20:dba07b7d9675 159 YData = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 20:dba07b7d9675 160 ZData = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 20:dba07b7d9675 161
SDesign2018 20:dba07b7d9675 162 XData = twosComplementConversion(XData);
SDesign2018 20:dba07b7d9675 163 YData = twosComplementConversion(YData);
SDesign2018 20:dba07b7d9675 164 ZData = twosComplementConversion(ZData);
SDesign2018 20:dba07b7d9675 165
SDesign2018 20:dba07b7d9675 166 /*
SDesign2018 20:dba07b7d9675 167 * Taking temperature data
SDesign2018 20:dba07b7d9675 168 */
SDesign2018 20:dba07b7d9675 169 regAddress = 0x00;
SDesign2018 20:dba07b7d9675 170 rawTempValues = ADT7410Read(regAddress);
SDesign2018 20:dba07b7d9675 171 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 20:dba07b7d9675 172 // a short int variable(16 bits), remove last 3 bits
SDesign2018 20:dba07b7d9675 173 if(convertedTempValue & 0x8000){
SDesign2018 20:dba07b7d9675 174
SDesign2018 20:dba07b7d9675 175 }
SDesign2018 20:dba07b7d9675 176 pc.printf("Accelerometer::: ");
SDesign2018 20:dba07b7d9675 177 pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData);
SDesign2018 20:dba07b7d9675 178 pc.printf("Temperature::: ");
SDesign2018 20:dba07b7d9675 179 pc.printf("Celsius: 0x%x\n\r", convertedTempValue);
SDesign2018 20:dba07b7d9675 180 }
SDesign2018 20:dba07b7d9675 181
SDesign2018 23:9c95ba021bdc 182 void takePeriodicReadingTicker(void){
SDesign2018 22:388f97cf422a 183 periodicReadingTrigger = true;
SDesign2018 22:388f97cf422a 184 }
SDesign2018 22:388f97cf422a 185
SDesign2018 20:dba07b7d9675 186 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 187 /* _
SDesign2018 20:dba07b7d9675 188 ____ ___ ____ _(_)___
SDesign2018 20:dba07b7d9675 189 / __ `__ \/ __ `/ / __ \
SDesign2018 20:dba07b7d9675 190 / / / / / / /_/ / / / / /
SDesign2018 20:dba07b7d9675 191 /_/ /_/ /_/\__,_/_/_/ /_/
SDesign2018 20:dba07b7d9675 192
SDesign2018 20:dba07b7d9675 193 *//////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 194 int main(void)
SDesign2018 20:dba07b7d9675 195 {
SDesign2018 20:dba07b7d9675 196 // Custom event handler for automatically displaying RX data
SDesign2018 20:dba07b7d9675 197 //interruptEverything.attach(&interruptReadTemperature, 7.0);
SDesign2018 20:dba07b7d9675 198 RadioEvent events;
SDesign2018 20:dba07b7d9675 199 // Change baud rate in serial terminal to this value
SDesign2018 20:dba07b7d9675 200 pc.baud(115200);
SDesign2018 20:dba07b7d9675 201 ADXL372.frequency(300000); // I2C devices are connected to the same clock
SDesign2018 20:dba07b7d9675 202 ADT7410.frequency(300000); // Redundant but whatever
SDesign2018 21:d96ef380a5d3 203 ADT7410_Int.fall(&CriticalTemperatureInterrupt);
SDesign2018 20:dba07b7d9675 204
SDesign2018 20:dba07b7d9675 205
SDesign2018 20:dba07b7d9675 206 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
SDesign2018 20:dba07b7d9675 207
SDesign2018 20:dba07b7d9675 208 // Sometimes when calling this, it creates error: type specifier expected
SDesign2018 20:dba07b7d9675 209 // Even with identical include files I would get this in another workspace.
SDesign2018 20:dba07b7d9675 210 plan = new lora::ChannelPlan_US915();
SDesign2018 20:dba07b7d9675 211
SDesign2018 20:dba07b7d9675 212 logInfo("Now asserting");
SDesign2018 20:dba07b7d9675 213 assert(plan);
SDesign2018 20:dba07b7d9675 214
SDesign2018 20:dba07b7d9675 215 // Careful when using this. The production ready libmdot-mbed5 has a void constructor
SDesign2018 20:dba07b7d9675 216 // Therefore, can only use the libmDot-dev-mbed5 version, for now.
SDesign2018 20:dba07b7d9675 217 dot = mDot::getInstance(plan);
SDesign2018 20:dba07b7d9675 218 assert(dot);
SDesign2018 20:dba07b7d9675 219
SDesign2018 20:dba07b7d9675 220 logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
SDesign2018 20:dba07b7d9675 221
SDesign2018 20:dba07b7d9675 222 // start from a well-known state
SDesign2018 20:dba07b7d9675 223 logInfo("defaulting Dot configuration");
SDesign2018 20:dba07b7d9675 224 dot->resetConfig();
SDesign2018 20:dba07b7d9675 225
SDesign2018 20:dba07b7d9675 226 // make sure library logging is turned on
SDesign2018 20:dba07b7d9675 227 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
SDesign2018 20:dba07b7d9675 228
SDesign2018 20:dba07b7d9675 229 // attach the custom events handler
SDesign2018 20:dba07b7d9675 230 dot->setEvents(&events);
SDesign2018 20:dba07b7d9675 231
SDesign2018 20:dba07b7d9675 232 // update configuration if necessary
SDesign2018 20:dba07b7d9675 233 if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
SDesign2018 20:dba07b7d9675 234 logInfo("changing network join mode to PEER_TO_PEER");
SDesign2018 20:dba07b7d9675 235 if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
SDesign2018 20:dba07b7d9675 236 logError("failed to set network join mode to PEER_TO_PEER");
SDesign2018 20:dba07b7d9675 237 }
SDesign2018 20:dba07b7d9675 238 }
SDesign2018 20:dba07b7d9675 239
SDesign2018 20:dba07b7d9675 240 /*
SDesign2018 20:dba07b7d9675 241 * Get the Frequency and then choose transfer frequency, datarate, and power accordingly
SDesign2018 20:dba07b7d9675 242 *
SDesign2018 20:dba07b7d9675 243 */
SDesign2018 20:dba07b7d9675 244 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 245 frequency_band = dot->getFrequencyBand();
SDesign2018 20:dba07b7d9675 246 switch (frequency_band) {
SDesign2018 20:dba07b7d9675 247 case lora::ChannelPlan::EU868_OLD:
SDesign2018 20:dba07b7d9675 248 case lora::ChannelPlan::EU868:
SDesign2018 20:dba07b7d9675 249 // 250kHz channels achieve higher throughput
SDesign2018 20:dba07b7d9675 250 // DR_6 : SF7 @ 250kHz
SDesign2018 20:dba07b7d9675 251 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 20:dba07b7d9675 252 tx_frequency = 869850000;
SDesign2018 20:dba07b7d9675 253 tx_datarate = lora::DR_6;
SDesign2018 20:dba07b7d9675 254 // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7
SDesign2018 20:dba07b7d9675 255 tx_power = 4;
SDesign2018 20:dba07b7d9675 256 break;
SDesign2018 20:dba07b7d9675 257
SDesign2018 20:dba07b7d9675 258 case lora::ChannelPlan::US915_OLD:
SDesign2018 20:dba07b7d9675 259 case lora::ChannelPlan::US915:
SDesign2018 20:dba07b7d9675 260 case lora::ChannelPlan::AU915_OLD:
SDesign2018 20:dba07b7d9675 261 case lora::ChannelPlan::AU915:
SDesign2018 20:dba07b7d9675 262 // 500kHz channels achieve highest throughput
SDesign2018 20:dba07b7d9675 263 // DR_8 : SF12 @ 500kHz
SDesign2018 20:dba07b7d9675 264 // DR_9 : SF11 @ 500kHz
SDesign2018 20:dba07b7d9675 265 // DR_10 : SF10 @ 500kHz
SDesign2018 20:dba07b7d9675 266 // DR_11 : SF9 @ 500kHz
SDesign2018 20:dba07b7d9675 267 // DR_12 : SF8 @ 500kHz
SDesign2018 20:dba07b7d9675 268 // DR_13 : SF7 @ 500kHz
SDesign2018 20:dba07b7d9675 269 // DR_0 - DR_3 (125kHz channels) available but much slower
SDesign2018 20:dba07b7d9675 270 tx_frequency = 915500000;
SDesign2018 20:dba07b7d9675 271 tx_datarate = lora::DR_13;
SDesign2018 20:dba07b7d9675 272 // 915 bands have no duty cycle restrictions, set tx power to max
SDesign2018 20:dba07b7d9675 273 tx_power = 20;
SDesign2018 20:dba07b7d9675 274 break;
SDesign2018 20:dba07b7d9675 275
SDesign2018 20:dba07b7d9675 276 case lora::ChannelPlan::AS923:
SDesign2018 20:dba07b7d9675 277 case lora::ChannelPlan::AS923_JAPAN:
SDesign2018 20:dba07b7d9675 278 // 250kHz channels achieve higher throughput
SDesign2018 20:dba07b7d9675 279 // DR_6 : SF7 @ 250kHz
SDesign2018 20:dba07b7d9675 280 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 20:dba07b7d9675 281 tx_frequency = 924800000;
SDesign2018 20:dba07b7d9675 282 tx_datarate = lora::DR_6;
SDesign2018 20:dba07b7d9675 283 tx_power = 16;
SDesign2018 20:dba07b7d9675 284 break;
SDesign2018 20:dba07b7d9675 285
SDesign2018 20:dba07b7d9675 286 case lora::ChannelPlan::KR920:
SDesign2018 20:dba07b7d9675 287 // DR_5 : SF7 @ 125kHz
SDesign2018 20:dba07b7d9675 288 tx_frequency = 922700000;
SDesign2018 20:dba07b7d9675 289 tx_datarate = lora::DR_5;
SDesign2018 20:dba07b7d9675 290 tx_power = 14;
SDesign2018 20:dba07b7d9675 291 break;
SDesign2018 20:dba07b7d9675 292
SDesign2018 20:dba07b7d9675 293 default:
SDesign2018 20:dba07b7d9675 294 while (true) {
SDesign2018 20:dba07b7d9675 295 logFatal("no known channel plan in use - extra configuration is needed!");
SDesign2018 20:dba07b7d9675 296 wait(5);
SDesign2018 20:dba07b7d9675 297 }
SDesign2018 20:dba07b7d9675 298 break;
SDesign2018 20:dba07b7d9675 299 }
SDesign2018 20:dba07b7d9675 300 /////////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 301
SDesign2018 20:dba07b7d9675 302 // in PEER_TO_PEER mode there is no join request/response transaction
SDesign2018 20:dba07b7d9675 303 // as long as both Dots are configured correctly, they should be able to communicate
SDesign2018 20:dba07b7d9675 304 update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power);
SDesign2018 20:dba07b7d9675 305
SDesign2018 20:dba07b7d9675 306 // save changes to configuration
SDesign2018 20:dba07b7d9675 307 logInfo("saving configuration");
SDesign2018 20:dba07b7d9675 308 if (!dot->saveConfig()) {
SDesign2018 20:dba07b7d9675 309 logError("failed to save configuration");
SDesign2018 20:dba07b7d9675 310 }
SDesign2018 20:dba07b7d9675 311
SDesign2018 20:dba07b7d9675 312 // Display configuration
SDesign2018 20:dba07b7d9675 313 // It's gonna output a lot of information onto the Serial Terminal
SDesign2018 20:dba07b7d9675 314 display_config();
SDesign2018 20:dba07b7d9675 315
SDesign2018 20:dba07b7d9675 316
SDesign2018 20:dba07b7d9675 317 ADT7410Initialize();
SDesign2018 20:dba07b7d9675 318 ADXL372Initialize();
SDesign2018 20:dba07b7d9675 319
SDesign2018 22:388f97cf422a 320 Periodic.attach(&takePeriodicReadingTicker,1);
SDesign2018 20:dba07b7d9675 321
SDesign2018 20:dba07b7d9675 322 while(1){
SDesign2018 21:d96ef380a5d3 323 // Create a vector of uint8_t elements to be sent later
SDesign2018 22:388f97cf422a 324
SDesign2018 21:d96ef380a5d3 325 std::vector<uint8_t> tx_data;
SDesign2018 20:dba07b7d9675 326
SDesign2018 21:d96ef380a5d3 327
SDesign2018 23:9c95ba021bdc 328 if(periodicReadingTrigger)
SDesign2018 22:388f97cf422a 329 {
SDesign2018 22:388f97cf422a 330 pc.printf("Regular periodic reading ");
SDesign2018 22:388f97cf422a 331 /*
SDesign2018 22:388f97cf422a 332 * Taking accelerometer data
SDesign2018 22:388f97cf422a 333 */
SDesign2018 22:388f97cf422a 334 regAddress = 0x08; // This is the register address for XData
SDesign2018 22:388f97cf422a 335 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 22:388f97cf422a 336 Xmsb = *(accelValues + 0);
SDesign2018 22:388f97cf422a 337 Xlsb = *(accelValues + 1);
SDesign2018 22:388f97cf422a 338 Ymsb = *(accelValues + 2);
SDesign2018 22:388f97cf422a 339 Ylsb = *(accelValues + 3);
SDesign2018 22:388f97cf422a 340 Zmsb = *(accelValues + 4);
SDesign2018 22:388f97cf422a 341 Zlsb = *(accelValues + 5);
SDesign2018 22:388f97cf422a 342
SDesign2018 22:388f97cf422a 343 XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 22:388f97cf422a 344 YData = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 22:388f97cf422a 345 ZData = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 22:388f97cf422a 346
SDesign2018 22:388f97cf422a 347 XData = twosComplementConversion(XData);
SDesign2018 22:388f97cf422a 348 YData = twosComplementConversion(YData);
SDesign2018 22:388f97cf422a 349 ZData = twosComplementConversion(ZData);
SDesign2018 22:388f97cf422a 350
SDesign2018 22:388f97cf422a 351 /*
SDesign2018 22:388f97cf422a 352 * Taking temperature data
SDesign2018 22:388f97cf422a 353 */
SDesign2018 22:388f97cf422a 354 regAddress = 0x00;
SDesign2018 22:388f97cf422a 355 rawTempValues = ADT7410Read(regAddress);
SDesign2018 22:388f97cf422a 356 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 22:388f97cf422a 357 // a short int variable(16 bits), remove last 3 bits
SDesign2018 22:388f97cf422a 358 pc.printf("Accelerometer::: ");
SDesign2018 22:388f97cf422a 359 pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData);
SDesign2018 22:388f97cf422a 360 pc.printf("Temperature::: ");
SDesign2018 22:388f97cf422a 361 pc.printf("Celsius: 0x%x\n\r", convertedTempValue);
SDesign2018 22:388f97cf422a 362
SDesign2018 22:388f97cf422a 363
SDesign2018 22:388f97cf422a 364
SDesign2018 22:388f97cf422a 365 tx_data.push_back((convertedTempValue >> 8) & 0xFF);
SDesign2018 22:388f97cf422a 366 tx_data.push_back(convertedTempValue & 0xFF);
SDesign2018 22:388f97cf422a 367 logInfo("Temperautre: %lu [0x%04X]", convertedTempValue, convertedTempValue);
SDesign2018 22:388f97cf422a 368 send_data(tx_data);
SDesign2018 23:9c95ba021bdc 369 periodicReadingTrigger = false; // Flip back to no trigger
SDesign2018 22:388f97cf422a 370 }
SDesign2018 21:d96ef380a5d3 371
SDesign2018 20:dba07b7d9675 372 if(takeAccelerometer || takeAccelerometer){
SDesign2018 20:dba07b7d9675 373 pc.printf("INTERRUPTEDDDDDDDD: ");
SDesign2018 22:388f97cf422a 374 if(takeAccelerometer) pc.printf("Temperature triggered!!!!!!!!!!!!\n\r");
SDesign2018 22:388f97cf422a 375 else if(takeAccelerometer) pc.printf("AccelerometerTriggered!!!!!!!!!!!!!\n\r");
SDesign2018 20:dba07b7d9675 376
SDesign2018 20:dba07b7d9675 377 for(int i = 0; i < BUFFER_SIZE; ++i){
SDesign2018 20:dba07b7d9675 378 /*
SDesign2018 20:dba07b7d9675 379 * Taking accelerometer data
SDesign2018 20:dba07b7d9675 380 */
SDesign2018 20:dba07b7d9675 381 regAddress = 0x08; // This is the register address for XData
SDesign2018 20:dba07b7d9675 382 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 20:dba07b7d9675 383 Xmsb = *(accelValues + 0);
SDesign2018 20:dba07b7d9675 384 Xlsb = *(accelValues + 1);
SDesign2018 20:dba07b7d9675 385 Ymsb = *(accelValues + 2);
SDesign2018 20:dba07b7d9675 386 Ylsb = *(accelValues + 3);
SDesign2018 20:dba07b7d9675 387 Zmsb = *(accelValues + 4);
SDesign2018 20:dba07b7d9675 388 Zlsb = *(accelValues + 5);
SDesign2018 20:dba07b7d9675 389
SDesign2018 20:dba07b7d9675 390 XDataInterrupt[i] = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 20:dba07b7d9675 391 YDataInterrupt[i] = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 20:dba07b7d9675 392 ZDataInterrupt[i] = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 20:dba07b7d9675 393
SDesign2018 20:dba07b7d9675 394 XDataInterrupt[i] = twosComplementConversion(XDataInterrupt[i]);
SDesign2018 20:dba07b7d9675 395 YDataInterrupt[i] = twosComplementConversion(YDataInterrupt[i]);
SDesign2018 20:dba07b7d9675 396 ZDataInterrupt[i] = twosComplementConversion(ZDataInterrupt[i]);
SDesign2018 20:dba07b7d9675 397
SDesign2018 20:dba07b7d9675 398 /*
SDesign2018 20:dba07b7d9675 399 * Taking temperature data
SDesign2018 20:dba07b7d9675 400 */
SDesign2018 20:dba07b7d9675 401 regAddress = 0x00;
SDesign2018 20:dba07b7d9675 402 rawTempValues = ADT7410Read(regAddress);
SDesign2018 20:dba07b7d9675 403 temperatureBuffer[i] = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 20:dba07b7d9675 404 // a short int variable(16 bits), remove last 3 bits
SDesign2018 20:dba07b7d9675 405 }
SDesign2018 20:dba07b7d9675 406
SDesign2018 20:dba07b7d9675 407 for(int i = 0; i < BUFFER_SIZE; ++i){
SDesign2018 20:dba07b7d9675 408 pc.printf("Accelerometer::: ");
SDesign2018 20:dba07b7d9675 409 pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XDataInterrupt[i], YDataInterrupt[i], ZDataInterrupt[i]);
SDesign2018 20:dba07b7d9675 410 pc.printf("Temperature::: ");
SDesign2018 20:dba07b7d9675 411 pc.printf("Celsius: 0x%x\n\r", temperatureBuffer[i]);
SDesign2018 20:dba07b7d9675 412 }
SDesign2018 22:388f97cf422a 413 //wait(0.2);
SDesign2018 20:dba07b7d9675 414 takeAccelerometer = false; // Flip back to no trigger
SDesign2018 20:dba07b7d9675 415 takeTemperature = false; // Flip back to no trigger
SDesign2018 23:9c95ba021bdc 416
SDesign2018 20:dba07b7d9675 417 }
SDesign2018 20:dba07b7d9675 418
SDesign2018 20:dba07b7d9675 419
SDesign2018 22:388f97cf422a 420
SDesign2018 22:388f97cf422a 421
SDesign2018 22:388f97cf422a 422 //wait(1);
SDesign2018 20:dba07b7d9675 423 }
SDesign2018 20:dba07b7d9675 424
SDesign2018 20:dba07b7d9675 425 return 0;
SDesign2018 20:dba07b7d9675 426 }
SDesign2018 20:dba07b7d9675 427
SDesign2018 20:dba07b7d9675 428 /*******************************************************************************
SDesign2018 20:dba07b7d9675 429 * Not really used at the moment
SDesign2018 20:dba07b7d9675 430 * Not really needed. But keep just in case because I don't want to rewrite it
SDesign2018 20:dba07b7d9675 431 ******************************************************************************/
SDesign2018 20:dba07b7d9675 432 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 433 char twosComplementConversion(char value)
SDesign2018 20:dba07b7d9675 434 {
SDesign2018 20:dba07b7d9675 435 /*
SDesign2018 20:dba07b7d9675 436 * Go from bit 0 to bit 7 and invert them
SDesign2018 20:dba07b7d9675 437 * Then finally add 1
SDesign2018 20:dba07b7d9675 438 */
SDesign2018 20:dba07b7d9675 439 char mask = value & 0x80;
SDesign2018 20:dba07b7d9675 440 if(mask == 0x80){ // Check for sign
SDesign2018 20:dba07b7d9675 441 value = ~value + 1;
SDesign2018 20:dba07b7d9675 442 return value;
SDesign2018 20:dba07b7d9675 443 }
SDesign2018 20:dba07b7d9675 444 return value;
SDesign2018 20:dba07b7d9675 445 }
SDesign2018 20:dba07b7d9675 446 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 447
SDesign2018 20:dba07b7d9675 448 /*******************************************************************************
SDesign2018 20:dba07b7d9675 449 * Initializes whatever settings you want for the accelerometer
SDesign2018 20:dba07b7d9675 450 * Can change it to use the previous I2C write function instead of all this mess
SDesign2018 20:dba07b7d9675 451 *
SDesign2018 20:dba07b7d9675 452 ******************************************************************************/
SDesign2018 20:dba07b7d9675 453 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 454 void ADXL372Initialize(void){
SDesign2018 20:dba07b7d9675 455 pc.printf("Initializing ADXL372 accelerometer\n\r");
SDesign2018 20:dba07b7d9675 456 accelerometerI2CWrite(0x3F, 0x0F); // Enable I2C highspeed,Low Pass, High pass and full bandwidth measurement mode
SDesign2018 20:dba07b7d9675 457 accelerometerI2CWrite(0x38, 0x01); // Enable the High pass filter corner 1 at register 0x38
SDesign2018 20:dba07b7d9675 458 /* accelerometerI2CWrite(0x24, 0x01); // X used for activity threshold
SDesign2018 20:dba07b7d9675 459 accelerometerI2CWrite(0x26, 0x01); // Y used for activity threshold
SDesign2018 20:dba07b7d9675 460 accelerometerI2CWrite(0x28, 0x01); // Z used for activity threshold */
SDesign2018 20:dba07b7d9675 461 pc.printf("\n\n\r");
SDesign2018 20:dba07b7d9675 462 }
SDesign2018 20:dba07b7d9675 463 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 464
SDesign2018 20:dba07b7d9675 465
SDesign2018 20:dba07b7d9675 466 /*******************************************************************************
SDesign2018 20:dba07b7d9675 467 * ADT7410 Initializing function
SDesign2018 20:dba07b7d9675 468 * Make critical temperature 24 celsius
SDesign2018 20:dba07b7d9675 469 * Make CRIT pin active high
SDesign2018 20:dba07b7d9675 470 ******************************************************************************/
SDesign2018 20:dba07b7d9675 471 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 472 void ADT7410Initialize(void){
SDesign2018 20:dba07b7d9675 473 pc.printf("Initializing ADT7410 Temperature\n\r");
SDesign2018 20:dba07b7d9675 474 // Make critical temperature be 24 celsius
SDesign2018 20:dba07b7d9675 475 ADT7410Write(0x08, 0x01); // MSB of Temperature Crit value
SDesign2018 20:dba07b7d9675 476 ADT7410Write(0x09, 0x80); // LSB of Temperature Crit value
SDesign2018 20:dba07b7d9675 477
SDesign2018 20:dba07b7d9675 478 // Make CRIT pin active high
SDesign2018 20:dba07b7d9675 479 ADT7410Write(0x03, 0x08); // Turn INT HIGH, works for the interrupt pin
SDesign2018 20:dba07b7d9675 480 pc.printf("\n\n\r");
SDesign2018 20:dba07b7d9675 481 }
SDesign2018 20:dba07b7d9675 482 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 483
SDesign2018 20:dba07b7d9675 484 /*******************************************************************************
SDesign2018 20:dba07b7d9675 485 * ADXL372 reset function
SDesign2018 20:dba07b7d9675 486 * Resets all registers and settings back to default
SDesign2018 20:dba07b7d9675 487 * Basically the same as the previous ADXL372 I2C write function
SDesign2018 20:dba07b7d9675 488 *
SDesign2018 20:dba07b7d9675 489 ******************************************************************************/
SDesign2018 20:dba07b7d9675 490 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 491 void ADXL372Reset(void){
SDesign2018 20:dba07b7d9675 492 int flag;
SDesign2018 20:dba07b7d9675 493 //--------- One full writing cycle for ADXL372 for Z Enable ------------------//
SDesign2018 20:dba07b7d9675 494 /* '0' - NAK was received
SDesign2018 20:dba07b7d9675 495 * '1' - ACK was received, <---- This good
SDesign2018 20:dba07b7d9675 496 * '2' - timeout
SDesign2018 20:dba07b7d9675 497 */
SDesign2018 20:dba07b7d9675 498 ADXL372.start();
SDesign2018 20:dba07b7d9675 499 flag = ADXL372.write(ADXL372_Address_8bit | 0);
SDesign2018 20:dba07b7d9675 500 if(flag == 1)
SDesign2018 20:dba07b7d9675 501 {
SDesign2018 20:dba07b7d9675 502 //pc.printf("Write to I2C address success\n\r");
SDesign2018 20:dba07b7d9675 503
SDesign2018 20:dba07b7d9675 504 flag = ADXL372.write(0x41);
SDesign2018 20:dba07b7d9675 505 if(flag == 1)
SDesign2018 20:dba07b7d9675 506 {
SDesign2018 20:dba07b7d9675 507 //pc.printf("Write to 0x41 register address success\n\r");
SDesign2018 20:dba07b7d9675 508 flag = ADXL372.write(0x52); // Set bit 0
SDesign2018 20:dba07b7d9675 509 if(flag == 1)
SDesign2018 20:dba07b7d9675 510 {
SDesign2018 20:dba07b7d9675 511 pc.printf("Everything has been reset\n\r");
SDesign2018 20:dba07b7d9675 512 ADXL372.stop();
SDesign2018 20:dba07b7d9675 513 }
SDesign2018 20:dba07b7d9675 514 }
SDesign2018 20:dba07b7d9675 515 }
SDesign2018 20:dba07b7d9675 516 else ADXL372.stop();
SDesign2018 20:dba07b7d9675 517 // ---------------- End of writing cycle --------------------------//
SDesign2018 20:dba07b7d9675 518 }
SDesign2018 20:dba07b7d9675 519 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 520
SDesign2018 20:dba07b7d9675 521 /*
SDesign2018 20:dba07b7d9675 522 *
SDesign2018 20:dba07b7d9675 523 * Self-test to see if the accelerometer is working as intended
SDesign2018 20:dba07b7d9675 524 * Wait 300 ms.
SDesign2018 20:dba07b7d9675 525 * Check bit 2 for a 1 for success. Bit 1 for completion of self-test.
SDesign2018 20:dba07b7d9675 526 * Returns whole register
SDesign2018 20:dba07b7d9675 527 */
SDesign2018 20:dba07b7d9675 528 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 529 void I2CSelfTest(void){
SDesign2018 20:dba07b7d9675 530 char *result;
SDesign2018 20:dba07b7d9675 531 uint8_t check;
SDesign2018 20:dba07b7d9675 532 accelerometerI2CWrite(0x3F, 0x0F);
SDesign2018 20:dba07b7d9675 533 accelerometerI2CWrite(0x40, 0x01);
SDesign2018 20:dba07b7d9675 534 wait(0.3);
SDesign2018 20:dba07b7d9675 535 result = accelerometerI2CRead(0x40);
SDesign2018 20:dba07b7d9675 536 check = result[0];
SDesign2018 20:dba07b7d9675 537 if(check & 0x04){
SDesign2018 20:dba07b7d9675 538 pc.printf("Passed\n\r");
SDesign2018 20:dba07b7d9675 539 }else {pc.printf("FAILED\n\r");}
SDesign2018 20:dba07b7d9675 540 }
SDesign2018 20:dba07b7d9675 541 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 542
SDesign2018 20:dba07b7d9675 543 /*******************************************************************************
SDesign2018 20:dba07b7d9675 544 *
SDesign2018 20:dba07b7d9675 545 * I2C function for the the ADXL372 accelerometer for a write sequence
SDesign2018 20:dba07b7d9675 546 * Param:
SDesign2018 20:dba07b7d9675 547 * hexAddress: Pass the hexadecimal value for what register you want
SDesign2018 20:dba07b7d9675 548 * hexData: Pass the hexadecimal value for what data you want to send
SDesign2018 20:dba07b7d9675 549 * i.e. hexadecimal represenatation of certain bits
SDesign2018 20:dba07b7d9675 550 * Returns from mbed library write function
SDesign2018 20:dba07b7d9675 551 * 0: NAK was reveived
SDesign2018 20:dba07b7d9675 552 * 1: ACK was received <---- Good for us
SDesign2018 20:dba07b7d9675 553 * 2: Timeout
SDesign2018 20:dba07b7d9675 554 ******************************************************************************/
SDesign2018 20:dba07b7d9675 555 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 556 void accelerometerI2CWrite(int hexAddress, int hexData){
SDesign2018 20:dba07b7d9675 557
SDesign2018 20:dba07b7d9675 558 int flag;
SDesign2018 20:dba07b7d9675 559 int registerAddress = hexAddress;
SDesign2018 20:dba07b7d9675 560 int data = hexData;
SDesign2018 20:dba07b7d9675 561
SDesign2018 20:dba07b7d9675 562 ADXL372.start();
SDesign2018 20:dba07b7d9675 563 flag = ADXL372.write(ADXL372_Address_8bit);
SDesign2018 20:dba07b7d9675 564 if(flag == 1)
SDesign2018 20:dba07b7d9675 565 {
SDesign2018 20:dba07b7d9675 566 //pc.printf("Write to I2C address success\n\r");
SDesign2018 20:dba07b7d9675 567 wait(0.1);
SDesign2018 20:dba07b7d9675 568 flag = ADXL372.write(registerAddress);
SDesign2018 20:dba07b7d9675 569 if(flag == 1)
SDesign2018 20:dba07b7d9675 570 {
SDesign2018 20:dba07b7d9675 571 //pc.printf("Write to register 0x%x address success\n\r", registerAddress);
SDesign2018 20:dba07b7d9675 572 flag = ADXL372.write(data);
SDesign2018 20:dba07b7d9675 573 if(flag == 1)
SDesign2018 20:dba07b7d9675 574 {
SDesign2018 20:dba07b7d9675 575 pc.printf("Writing data 0x%x to register address 0x%d success\n\r", data, registerAddress);
SDesign2018 20:dba07b7d9675 576 ADXL372.stop();
SDesign2018 20:dba07b7d9675 577 return;
SDesign2018 20:dba07b7d9675 578 }else {ADXL372.stop();}
SDesign2018 20:dba07b7d9675 579 }else {ADXL372.stop();}
SDesign2018 20:dba07b7d9675 580 }else ADXL372.stop();
SDesign2018 20:dba07b7d9675 581
SDesign2018 20:dba07b7d9675 582 }
SDesign2018 20:dba07b7d9675 583 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 584
SDesign2018 20:dba07b7d9675 585 /*******************************************************************************
SDesign2018 20:dba07b7d9675 586 * I2C read sequence for the accelerometer
SDesign2018 20:dba07b7d9675 587 * Param:
SDesign2018 20:dba07b7d9675 588 * hexAddress: pass the hexadecimal representation of desired Register address
SDesign2018 20:dba07b7d9675 589 * Return:
SDesign2018 20:dba07b7d9675 590 * Char pointer to the array of read data.
SDesign2018 20:dba07b7d9675 591 *
SDesign2018 20:dba07b7d9675 592 * Right now it works only for the XData, YData, ZData because I wrote it to read
SDesign2018 20:dba07b7d9675 593 * 6 bytes(6 registers).
SDesign2018 20:dba07b7d9675 594 * Should change it to be 1 byte at a time
SDesign2018 20:dba07b7d9675 595 ******************************************************************************/
SDesign2018 20:dba07b7d9675 596 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 597 char * accelerometerI2CRead(int hexAddress){
SDesign2018 20:dba07b7d9675 598 char accelData[6];
SDesign2018 20:dba07b7d9675 599 char registerAddress[1];
SDesign2018 20:dba07b7d9675 600 registerAddress[0] = hexAddress;
SDesign2018 20:dba07b7d9675 601
SDesign2018 20:dba07b7d9675 602 // Perform mbed's way sending a start bit, then device address[r/~w], and then the register address
SDesign2018 20:dba07b7d9675 603 // Also if it succeeds, continue to the next operation
SDesign2018 20:dba07b7d9675 604 if(ADXL372.write(ADXL372_Address_8bit, registerAddress, 1) == 0){
SDesign2018 20:dba07b7d9675 605
SDesign2018 20:dba07b7d9675 606 // If previous sequence works, get 6 bytes into char array accelData
SDesign2018 20:dba07b7d9675 607 // Char array because it uses 1 byte(8bits)
SDesign2018 20:dba07b7d9675 608 // Should probably change it to uint8_t type
SDesign2018 20:dba07b7d9675 609 if(ADXL372.read(ADXL372_Address_8bit, accelData, 6) == 0){
SDesign2018 20:dba07b7d9675 610 return accelData;
SDesign2018 20:dba07b7d9675 611 }else pc.printf("Failed to read\n\r");
SDesign2018 20:dba07b7d9675 612 }else pc.printf("Failed to write\n\r");
SDesign2018 20:dba07b7d9675 613 return 0; // Only if it fails completely
SDesign2018 20:dba07b7d9675 614 }
SDesign2018 20:dba07b7d9675 615 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 616
SDesign2018 20:dba07b7d9675 617
SDesign2018 20:dba07b7d9675 618
SDesign2018 20:dba07b7d9675 619
SDesign2018 20:dba07b7d9675 620 /*******************************************************************************
SDesign2018 20:dba07b7d9675 621 * Performs one byte write I2C protocol
SDesign2018 20:dba07b7d9675 622 * PARAM:
SDesign2018 20:dba07b7d9675 623 * registerAddress: register you want access to in device, one byte char hex format
SDesign2018 20:dba07b7d9675 624 * data: one byte data that you want to write to device register
SDesign2018 20:dba07b7d9675 625 * Return results from mbed library function:
SDesign2018 20:dba07b7d9675 626 * 0: failure at writing i2c address
SDesign2018 20:dba07b7d9675 627 * 1: successful write
SDesign2018 20:dba07b7d9675 628 * 2: failure at writing data
SDesign2018 20:dba07b7d9675 629 *
SDesign2018 20:dba07b7d9675 630 ******************************************************************************/
SDesign2018 20:dba07b7d9675 631 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 632 void ADT7410Write(unsigned char registerAddress, unsigned char data){
SDesign2018 20:dba07b7d9675 633 int flag;
SDesign2018 20:dba07b7d9675 634 ADT7410.start();
SDesign2018 20:dba07b7d9675 635 flag = ADT7410.write(ADT7410_Address_8BIT);
SDesign2018 20:dba07b7d9675 636 if(flag == 1)
SDesign2018 20:dba07b7d9675 637 {
SDesign2018 20:dba07b7d9675 638
SDesign2018 20:dba07b7d9675 639 wait(0.1);
SDesign2018 20:dba07b7d9675 640 flag = ADT7410.write(registerAddress);
SDesign2018 20:dba07b7d9675 641 if(flag == 1)
SDesign2018 20:dba07b7d9675 642 {
SDesign2018 20:dba07b7d9675 643
SDesign2018 20:dba07b7d9675 644 flag = ADT7410.write(data);
SDesign2018 20:dba07b7d9675 645 if(flag == 1)
SDesign2018 20:dba07b7d9675 646 {
SDesign2018 20:dba07b7d9675 647 pc.printf("Writing data 0x%x to register address 0x%x success\n\r", data, registerAddress);
SDesign2018 20:dba07b7d9675 648 ADT7410.stop();
SDesign2018 20:dba07b7d9675 649
SDesign2018 20:dba07b7d9675 650 }else {ADT7410.stop();}
SDesign2018 20:dba07b7d9675 651 }else {ADT7410.stop();}
SDesign2018 20:dba07b7d9675 652 }else ADT7410.stop();
SDesign2018 20:dba07b7d9675 653
SDesign2018 20:dba07b7d9675 654
SDesign2018 20:dba07b7d9675 655 }
SDesign2018 20:dba07b7d9675 656 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 657
SDesign2018 20:dba07b7d9675 658
SDesign2018 20:dba07b7d9675 659 /*******************************************************************************
SDesign2018 20:dba07b7d9675 660 * I2C Read function for ADT7410 Temperature sensor
SDesign2018 20:dba07b7d9675 661 * Param:
SDesign2018 20:dba07b7d9675 662 * hex: hexadecimal representation for desired register
SDesign2018 20:dba07b7d9675 663 * Return:
SDesign2018 20:dba07b7d9675 664 * Char pointer to the array of data values.
SDesign2018 20:dba07b7d9675 665 * Could also change from a char pointer to a uint8_t pointer.
SDesign2018 20:dba07b7d9675 666 *
SDesign2018 20:dba07b7d9675 667 ******************************************************************************/
SDesign2018 20:dba07b7d9675 668 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 669 char * ADT7410Read(int hex){
SDesign2018 20:dba07b7d9675 670 //short int convertedVal;
SDesign2018 20:dba07b7d9675 671 char data[2] = {0, 0};
SDesign2018 20:dba07b7d9675 672 char cmd[1];
SDesign2018 20:dba07b7d9675 673 cmd[0] = hex;
SDesign2018 20:dba07b7d9675 674 //pc.printf("Register Addres is: %x \n\r", cmd[0]);
SDesign2018 20:dba07b7d9675 675 if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){
SDesign2018 20:dba07b7d9675 676 if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){
SDesign2018 20:dba07b7d9675 677
SDesign2018 20:dba07b7d9675 678 return data;
SDesign2018 20:dba07b7d9675 679 //return (data[0] << 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GREAT
SDesign2018 20:dba07b7d9675 680
SDesign2018 20:dba07b7d9675 681 }else {pc.printf("Failed to read \n\r"); return data;}
SDesign2018 20:dba07b7d9675 682 }else {pc.printf("Failed to write \n\r"); return data;}
SDesign2018 20:dba07b7d9675 683
SDesign2018 20:dba07b7d9675 684 }
SDesign2018 20:dba07b7d9675 685 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 20:dba07b7d9675 686