SAIT ARIS / LRAT-example-lorawan-REFACTOR-and-CLEAN-Branch

Dependencies:   Custom_LSM303 Custom_UBloxGPS LRAT-mbed-os USBDevice mbed-lora-radio-drv stm32EEPROM

Fork of LRAT-example-lorawan by SAIT ARIS

Committer:
lpeters
Date:
Wed Aug 15 22:16:56 2018 +0000
Revision:
33:e47306c32791
Parent:
31:f03c183e2bf6
Child:
34:341fb423e74b
Rough implementation of sensor input, packet generation, blinkenlights. Initial attempt at implementing USBSerial virtual com port.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:7037ed05f54f 1 /**
mbed_official 0:7037ed05f54f 2 * Copyright (c) 2017, Arm Limited and affiliates.
mbed_official 0:7037ed05f54f 3 * SPDX-License-Identifier: Apache-2.0
mbed_official 0:7037ed05f54f 4 *
mbed_official 0:7037ed05f54f 5 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:7037ed05f54f 6 * you may not use this file except in compliance with the License.
mbed_official 0:7037ed05f54f 7 * You may obtain a copy of the License at
mbed_official 0:7037ed05f54f 8 *
mbed_official 0:7037ed05f54f 9 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:7037ed05f54f 10 *
mbed_official 0:7037ed05f54f 11 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:7037ed05f54f 12 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:7037ed05f54f 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:7037ed05f54f 14 * See the License for the specific language governing permissions and
mbed_official 0:7037ed05f54f 15 * limitations under the License.
mbed_official 0:7037ed05f54f 16 */
mbed_official 0:7037ed05f54f 17 #include <stdio.h>
tchari 30:ff249a9156dc 18 #include "mbed.h"
lpeters 33:e47306c32791 19 //#include "unsupported/USBDevice/USBSerial/USBSerial.h"
lpeters 33:e47306c32791 20 #include "USBSerial.h"
mbed_official 3:8c7198d1a2a1 21
mbed_official 0:7037ed05f54f 22 #include "lorawan/LoRaWANInterface.h"
mbed_official 0:7037ed05f54f 23 #include "lorawan/system/lorawan_data_structures.h"
mbed_official 0:7037ed05f54f 24 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 25
mbed_official 0:7037ed05f54f 26 // Application helpers
mbed_official 0:7037ed05f54f 27 #include "DummySensor.h"
mbed_official 0:7037ed05f54f 28 #include "trace_helper.h"
mbed_official 0:7037ed05f54f 29 #include "lora_radio_helper.h"
mbed_official 0:7037ed05f54f 30
tchari 30:ff249a9156dc 31 #include "mbed-trace/mbed_trace.h"
tchari 30:ff249a9156dc 32 #define TRACE_GROUP "MAIN"
tchari 30:ff249a9156dc 33
mbed_official 0:7037ed05f54f 34 using namespace events;
mbed_official 0:7037ed05f54f 35
mbed_official 12:5015dfead3f2 36 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
mbed_official 12:5015dfead3f2 37 // This example only communicates with much shorter messages (<30 bytes).
mbed_official 12:5015dfead3f2 38 // If longer messages are used, these buffers must be changed accordingly.
mbed_official 12:5015dfead3f2 39 uint8_t tx_buffer[30];
mbed_official 12:5015dfead3f2 40 uint8_t rx_buffer[30];
mbed_official 0:7037ed05f54f 41
mbed_official 0:7037ed05f54f 42 /*
mbed_official 0:7037ed05f54f 43 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
mbed_official 0:7037ed05f54f 44 */
mbed_official 0:7037ed05f54f 45 #define TX_TIMER 10000
mbed_official 0:7037ed05f54f 46
mbed_official 0:7037ed05f54f 47 /**
mbed_official 0:7037ed05f54f 48 * Maximum number of events for the event queue.
mbed_official 12:5015dfead3f2 49 * 10 is the safe number for the stack events, however, if application
mbed_official 0:7037ed05f54f 50 * also uses the queue for whatever purposes, this number should be increased.
mbed_official 0:7037ed05f54f 51 */
mbed_official 12:5015dfead3f2 52 #define MAX_NUMBER_OF_EVENTS 10
mbed_official 0:7037ed05f54f 53
mbed_official 0:7037ed05f54f 54 /**
mbed_official 0:7037ed05f54f 55 * Maximum number of retries for CONFIRMED messages before giving up
mbed_official 0:7037ed05f54f 56 */
tchari 30:ff249a9156dc 57 #define CONFIRMED_MSG_RETRY_COUNTER 15
mbed_official 0:7037ed05f54f 58
mbed_official 0:7037ed05f54f 59 /**
mbed_official 0:7037ed05f54f 60 * Dummy pin for dummy sensor
mbed_official 0:7037ed05f54f 61 */
mbed_official 0:7037ed05f54f 62 #define PC_9 0
mbed_official 0:7037ed05f54f 63
mbed_official 0:7037ed05f54f 64 /**
mbed_official 0:7037ed05f54f 65 * Dummy sensor class object
mbed_official 0:7037ed05f54f 66 */
mbed_official 0:7037ed05f54f 67 DS1820 ds1820(PC_9);
mbed_official 0:7037ed05f54f 68
mbed_official 0:7037ed05f54f 69 /**
mbed_official 0:7037ed05f54f 70 * This event queue is the global event queue for both the
mbed_official 0:7037ed05f54f 71 * application and stack. To conserve memory, the stack is designed to run
mbed_official 0:7037ed05f54f 72 * in the same thread as the application and the application is responsible for
mbed_official 0:7037ed05f54f 73 * providing an event queue to the stack that will be used for ISR deferment as
mbed_official 0:7037ed05f54f 74 * well as application information event queuing.
mbed_official 0:7037ed05f54f 75 */
mbed_official 0:7037ed05f54f 76 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS * EVENTS_EVENT_SIZE);
mbed_official 0:7037ed05f54f 77
mbed_official 0:7037ed05f54f 78 /**
mbed_official 0:7037ed05f54f 79 * Event handler.
mbed_official 0:7037ed05f54f 80 *
mbed_official 0:7037ed05f54f 81 * This will be passed to the LoRaWAN stack to queue events for the
mbed_official 0:7037ed05f54f 82 * application which in turn drive the application.
mbed_official 0:7037ed05f54f 83 */
mbed_official 0:7037ed05f54f 84 static void lora_event_handler(lorawan_event_t event);
mbed_official 0:7037ed05f54f 85
mbed_official 0:7037ed05f54f 86 /**
mbed_official 2:dc95ac6d6d4e 87 * Constructing Mbed LoRaWANInterface and passing it down the radio object.
mbed_official 0:7037ed05f54f 88 */
mbed_official 2:dc95ac6d6d4e 89 static LoRaWANInterface lorawan(radio);
mbed_official 0:7037ed05f54f 90
mbed_official 0:7037ed05f54f 91 /**
mbed_official 0:7037ed05f54f 92 * Application specific callbacks
mbed_official 0:7037ed05f54f 93 */
mbed_official 0:7037ed05f54f 94 static lorawan_app_callbacks_t callbacks;
mbed_official 0:7037ed05f54f 95
lpeters 33:e47306c32791 96 int mytime = 0;
lpeters 33:e47306c32791 97 int mybatt = 0;
lpeters 33:e47306c32791 98 double mylat = 0;
lpeters 33:e47306c32791 99 double mylon = 0;
lpeters 33:e47306c32791 100
lpeters 33:e47306c32791 101 int16_t myAccX = 0;
lpeters 33:e47306c32791 102 int16_t myAccY = 0;
lpeters 33:e47306c32791 103 int16_t myAccZ = 0;
lpeters 33:e47306c32791 104 int16_t myMagX = 0;
lpeters 33:e47306c32791 105 int16_t myMagY = 0;
lpeters 33:e47306c32791 106 int16_t myMagZ = 0;
lpeters 33:e47306c32791 107 int16_t myOffX = 0;
lpeters 33:e47306c32791 108 int16_t myOffY = 0;
lpeters 33:e47306c32791 109 int16_t myOffZ = 0;
lpeters 33:e47306c32791 110 int16_t myTemp = 0;
lpeters 33:e47306c32791 111
lpeters 33:e47306c32791 112 int16_t accMinX = 0;
lpeters 33:e47306c32791 113 int16_t accMinY = 0;
lpeters 33:e47306c32791 114 int16_t accMinZ = 0;
lpeters 33:e47306c32791 115 int16_t accMaxX = 0;
lpeters 33:e47306c32791 116 int16_t accMaxY = 0;
lpeters 33:e47306c32791 117 int16_t accMaxZ = 0;
lpeters 33:e47306c32791 118
lpeters 33:e47306c32791 119 int16_t magMinX = 0;
lpeters 33:e47306c32791 120 int16_t magMinY = 0;
lpeters 33:e47306c32791 121 int16_t magMinZ = 0;
lpeters 33:e47306c32791 122 int16_t magMaxX = 0;
lpeters 33:e47306c32791 123 int16_t magMaxY = 0;
lpeters 33:e47306c32791 124 int16_t magMaxZ = 0;
lpeters 33:e47306c32791 125
lpeters 33:e47306c32791 126 #define NEOM8M_ADR_GPS 0x84
lpeters 33:e47306c32791 127 #define LSM303_ADR_ACC 0x32
lpeters 33:e47306c32791 128 #define LSM303_ADR_MAG 0x3C
tchari 30:ff249a9156dc 129
lpeters 33:e47306c32791 130 #define NEOM8M_REG_GPS_LENH 0xFD
lpeters 33:e47306c32791 131 #define NEOM8M_REG_GPS_LENL 0xFE
lpeters 33:e47306c32791 132 #define NEOM8M_REG_GPS_DATA 0xFE
lpeters 33:e47306c32791 133 #define LSM303_REG_ACC_STATUS_REG_AUX_A 0x07
lpeters 33:e47306c32791 134 #define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C
lpeters 33:e47306c32791 135 #define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D
lpeters 33:e47306c32791 136 #define LSM303_REG_ACC_WHO_AM_I_A 0x0F
lpeters 33:e47306c32791 137 #define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F
lpeters 33:e47306c32791 138 #define LSM303_REG_ACC_CTRL_REG1_A 0x20
lpeters 33:e47306c32791 139 #define LSM303_REG_ACC_CTRL_REG2_A 0x21
lpeters 33:e47306c32791 140 #define LSM303_REG_ACC_CTRL_REG3_A 0x22
lpeters 33:e47306c32791 141 #define LSM303_REG_ACC_CTRL_REG4_A 0x23
lpeters 33:e47306c32791 142 #define LSM303_REG_ACC_CTRL_REG5_A 0x24
lpeters 33:e47306c32791 143 #define LSM303_REG_ACC_STATUS_REG_A 0x27
lpeters 33:e47306c32791 144 #define LSM303_REG_ACC_OUT_X_L_A 0x28
lpeters 33:e47306c32791 145 #define LSM303_REG_ACC_OUT_X_H_A 0x29
lpeters 33:e47306c32791 146 #define LSM303_REG_ACC_OUT_Y_L_A 0x2A
lpeters 33:e47306c32791 147 #define LSM303_REG_ACC_OUT_Y_H_A 0x2B
lpeters 33:e47306c32791 148 #define LSM303_REG_ACC_OUT_Z_L_A 0x2C
lpeters 33:e47306c32791 149 #define LSM303_REG_ACC_OUT_Z_H_A 0x2D
lpeters 33:e47306c32791 150 #define LSM303_REG_ACC_INT1_CFG_A 0x30
lpeters 33:e47306c32791 151 #define LSM303_REG_ACC_INT1_SRC_A 0x31
lpeters 33:e47306c32791 152 #define LSM303_REG_ACC_INT1_THS_A 0x32
lpeters 33:e47306c32791 153 #define LSM303_REG_ACC_INT1_DURATION_A 0x33
lpeters 33:e47306c32791 154 //#define LSM303_REG_MAG_CRA_REG_M 0x00
lpeters 33:e47306c32791 155 //#define LSM303_REG_MAG_MR_REG_M 0x02
lpeters 33:e47306c32791 156 #define LSM303_REG_MAG_OFFSET_X_REG_L_M 0x45
lpeters 33:e47306c32791 157 #define LSM303_REG_MAG_OFFSET_X_REG_H_M 0x46
lpeters 33:e47306c32791 158 #define LSM303_REG_MAG_OFFSET_Y_REG_L_M 0x47
lpeters 33:e47306c32791 159 #define LSM303_REG_MAG_OFFSET_Y_REG_H_M 0x48
lpeters 33:e47306c32791 160 #define LSM303_REG_MAG_OFFSET_Z_REG_L_M 0x49
lpeters 33:e47306c32791 161 #define LSM303_REG_MAG_OFFSET_Z_REG_H_M 0x4A
lpeters 33:e47306c32791 162 #define LSM303_REG_MAG_WHO_AM_I_M 0x4F
lpeters 33:e47306c32791 163 #define LSM303_REG_MAG_CFG_REG_A_M 0x60
lpeters 33:e47306c32791 164 #define LSM303_REG_MAG_CFG_REG_C_M 0x62
lpeters 33:e47306c32791 165 #define LSM303_REG_MAG_INT_CTRL_REG_M 0x63
lpeters 33:e47306c32791 166 #define LSM303_REG_MAG_INT_SOURCE_REG_M 0x64
lpeters 33:e47306c32791 167 #define LSM303_REG_MAG_INT_THS_L_REG_M 0x65
lpeters 33:e47306c32791 168 #define LSM303_REG_MAG_INT_THS_H_REG_M 0x66
lpeters 33:e47306c32791 169 #define LSM303_REG_MAG_STATUS_REG_M 0x67
lpeters 33:e47306c32791 170 #define LSM303_REG_MAG_OUTX_L_REG_M 0x68
lpeters 33:e47306c32791 171 #define LSM303_REG_MAG_OUTX_H_REG_M 0x69
lpeters 33:e47306c32791 172 #define LSM303_REG_MAG_OUTY_L_REG_M 0x6A
lpeters 33:e47306c32791 173 #define LSM303_REG_MAG_OUTY_H_REG_M 0x6B
lpeters 33:e47306c32791 174 #define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C
lpeters 33:e47306c32791 175 #define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D
lpeters 33:e47306c32791 176
tchari 30:ff249a9156dc 177
tchari 30:ff249a9156dc 178 I2C i2c(PB_9, PB_8);
lpeters 33:e47306c32791 179 InterruptIn accPin(PB_14);
lpeters 33:e47306c32791 180 InterruptIn magPin(PA_10);
lpeters 33:e47306c32791 181
lpeters 33:e47306c32791 182 char cfg;
lpeters 33:e47306c32791 183 char ret;
lpeters 33:e47306c32791 184 char rda = '\0';
lpeters 33:e47306c32791 185 char cmd[2];
lpeters 33:e47306c32791 186 char buf[83];
lpeters 33:e47306c32791 187 int pos = 0;
lpeters 33:e47306c32791 188 char *res;
lpeters 33:e47306c32791 189 char sPass[26] = "[\u001b[32mPASS\u001b[0m]";
lpeters 33:e47306c32791 190 char sFail[26] = "[\u001b[31mFAIL\u001b[0m]";
lpeters 33:e47306c32791 191 int accShift = 0;
lpeters 33:e47306c32791 192 int accScale = 0;
lpeters 33:e47306c32791 193 int accEvent = 0;
lpeters 33:e47306c32791 194 uint16_t accSFire = 0;
lpeters 33:e47306c32791 195 uint16_t accHFire = 0;
lpeters 33:e47306c32791 196 uint16_t accSLIRQ = 0;
lpeters 33:e47306c32791 197 uint16_t accSHIRQ = 0;
lpeters 33:e47306c32791 198 int magEvent = 0;
lpeters 33:e47306c32791 199 uint16_t magSFire = 0;
lpeters 33:e47306c32791 200 uint16_t magHFire = 0;
lpeters 33:e47306c32791 201 uint16_t magSLIRQ = 0;
lpeters 33:e47306c32791 202 uint16_t magSHIRQ = 0;
lpeters 33:e47306c32791 203
lpeters 33:e47306c32791 204 char cmdSendLoop[9] = "SendLoop";
lpeters 33:e47306c32791 205
lpeters 33:e47306c32791 206 void onAccIrq()
lpeters 33:e47306c32791 207 {
lpeters 33:e47306c32791 208 accHFire++;
lpeters 33:e47306c32791 209 }
lpeters 33:e47306c32791 210
lpeters 33:e47306c32791 211 void onMagIrq()
lpeters 33:e47306c32791 212 {
lpeters 33:e47306c32791 213 magHFire++;
lpeters 33:e47306c32791 214 }
lpeters 33:e47306c32791 215
lpeters 33:e47306c32791 216 void accDumpCfg()
lpeters 33:e47306c32791 217 {
lpeters 33:e47306c32791 218 char start = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 219 int i;
lpeters 33:e47306c32791 220 for (i = 0; i < 6; i++)
lpeters 33:e47306c32791 221 {
lpeters 33:e47306c32791 222 cmd[0] = start + i;
lpeters 33:e47306c32791 223 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 224 i2c.read(LSM303_ADR_ACC, &buf[i], 1);
lpeters 33:e47306c32791 225 }
lpeters 33:e47306c32791 226 printf("CFGACC: |%02X %02X %02X %02X %02X %02X|\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
lpeters 33:e47306c32791 227 }
lpeters 33:e47306c32791 228
lpeters 33:e47306c32791 229 void magDumpCfg()
lpeters 33:e47306c32791 230 {
lpeters 33:e47306c32791 231 char start = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 33:e47306c32791 232 int i;
lpeters 33:e47306c32791 233 for (i = 0; i < 3; i++)
lpeters 33:e47306c32791 234 {
lpeters 33:e47306c32791 235 cmd[0] = start + i;
lpeters 33:e47306c32791 236 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 237 i2c.read(LSM303_ADR_MAG, &buf[i], 1);
lpeters 33:e47306c32791 238 }
lpeters 33:e47306c32791 239 printf("CFGMAG: |%02X %02X %02X|\r\n", buf[0], buf[1], buf[2]);
lpeters 33:e47306c32791 240 }
lpeters 33:e47306c32791 241
lpeters 33:e47306c32791 242 #define LEDR PB_7
lpeters 33:e47306c32791 243 #define LEDG PB_5
lpeters 33:e47306c32791 244 #define LEDB PB_6
lpeters 33:e47306c32791 245 //#define LEDW PB_2
lpeters 33:e47306c32791 246
lpeters 33:e47306c32791 247 DigitalOut myLedR(LEDR);
lpeters 33:e47306c32791 248 DigitalOut myLedG(LEDG);
lpeters 33:e47306c32791 249 DigitalOut myLedB(LEDB);
lpeters 33:e47306c32791 250 //DigitalOut myLedW(LEDW);
lpeters 33:e47306c32791 251
lpeters 33:e47306c32791 252 /*int myLedR = 0;
lpeters 33:e47306c32791 253 int myLedG = 0;
lpeters 33:e47306c32791 254 int myLedB = 0;
lpeters 33:e47306c32791 255 int myLedW = 0;*/
lpeters 33:e47306c32791 256 //uint8_t myFoo;
tchari 30:ff249a9156dc 257
mbed_official 0:7037ed05f54f 258 /**
mbed_official 0:7037ed05f54f 259 * Entry point for application
mbed_official 0:7037ed05f54f 260 */
mbed_official 0:7037ed05f54f 261 int main (void)
mbed_official 0:7037ed05f54f 262 {
lpeters 33:e47306c32791 263 wait(4);
lpeters 33:e47306c32791 264 printf("\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n");
lpeters 33:e47306c32791 265 USBSerial serial;
lpeters 33:e47306c32791 266 /* printf("Turning the lights on...\r\n");
lpeters 33:e47306c32791 267 myLedR = 1;
lpeters 33:e47306c32791 268 myLedG = 1;
lpeters 33:e47306c32791 269 myLedB = 1;
lpeters 33:e47306c32791 270 myLedW = 1;
lpeters 33:e47306c32791 271 printf("The lights are on.\r\n");
lpeters 33:e47306c32791 272 wait(0.5);
lpeters 33:e47306c32791 273 printf("Turning the lights off...\r\n");
lpeters 33:e47306c32791 274 myLedR = 0;
lpeters 33:e47306c32791 275 myLedG = 0;
lpeters 33:e47306c32791 276 myLedB = 0;
lpeters 33:e47306c32791 277 myLedW = 0;
lpeters 33:e47306c32791 278 printf("The lights are off.\r\n");
lpeters 33:e47306c32791 279 wait(0.5);
lpeters 33:e47306c32791 280 printf("Turning the lights on...\r\n");
lpeters 33:e47306c32791 281 myLedR = 1;
lpeters 33:e47306c32791 282 myLedG = 1;
lpeters 33:e47306c32791 283 myLedB = 1;
lpeters 33:e47306c32791 284 myLedW = 1;
lpeters 33:e47306c32791 285 printf("The lights are on.\r\n");
lpeters 33:e47306c32791 286 wait(0.5);
lpeters 33:e47306c32791 287 printf("Turning the lights off...\r\n");
lpeters 33:e47306c32791 288 myLedR = 0;
lpeters 33:e47306c32791 289 myLedG = 0;
lpeters 33:e47306c32791 290 myLedB = 0;
lpeters 33:e47306c32791 291 myLedW = 0;
lpeters 33:e47306c32791 292 printf("The lights are off.\r\n");
lpeters 33:e47306c32791 293 printf("Initializing USBSerial.\r\n");
lpeters 33:e47306c32791 294 USBSerial serial;
lpeters 33:e47306c32791 295 printf("USBSerial initialized.\r\n");*/
lpeters 33:e47306c32791 296 int myFoo = 1;
lpeters 33:e47306c32791 297 while(1)
lpeters 33:e47306c32791 298 {
lpeters 33:e47306c32791 299 myLedR = 1;
lpeters 33:e47306c32791 300 //serial.printf("LED = Red\r\n");
lpeters 33:e47306c32791 301 wait(0.5);
lpeters 33:e47306c32791 302 myLedR = 0;
lpeters 33:e47306c32791 303 myLedG = 1;
lpeters 33:e47306c32791 304 //serial.printf("LED = Green\r\n");
lpeters 33:e47306c32791 305 wait(0.5);
lpeters 33:e47306c32791 306 myLedG = 0;
lpeters 33:e47306c32791 307 myLedB = 1;
lpeters 33:e47306c32791 308 //serial.printf("LED = Blue\r\n");
lpeters 33:e47306c32791 309 wait(0.5);
lpeters 33:e47306c32791 310 myLedB = 0;
lpeters 33:e47306c32791 311 //myLedW = 1;
lpeters 33:e47306c32791 312 //serial.printf("LED = White\r\n");
lpeters 33:e47306c32791 313 //wait(0.5);
lpeters 33:e47306c32791 314 //myLedW = 0;
lpeters 33:e47306c32791 315 if (myFoo % 6 == 0)
lpeters 33:e47306c32791 316 {
lpeters 33:e47306c32791 317 myLedR = 1;
lpeters 33:e47306c32791 318 myLedG = 1;
lpeters 33:e47306c32791 319 myLedB = 1;
lpeters 33:e47306c32791 320 //myLedW = 1;
lpeters 33:e47306c32791 321 }
lpeters 33:e47306c32791 322 myFoo++;
lpeters 33:e47306c32791 323 }
lpeters 33:e47306c32791 324
lpeters 33:e47306c32791 325
lpeters 33:e47306c32791 326
mbed_official 0:7037ed05f54f 327 // setup tracing
mbed_official 0:7037ed05f54f 328 setup_trace();
mbed_official 0:7037ed05f54f 329
mbed_official 0:7037ed05f54f 330 // stores the status of a call to LoRaWAN protocol
mbed_official 0:7037ed05f54f 331 lorawan_status_t retcode;
lpeters 33:e47306c32791 332
lpeters 33:e47306c32791 333 wait(4);
mbed_official 0:7037ed05f54f 334
tchari 30:ff249a9156dc 335 printf("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n");
tchari 30:ff249a9156dc 336
lpeters 33:e47306c32791 337 magDumpCfg();
lpeters 33:e47306c32791 338 accDumpCfg();
lpeters 33:e47306c32791 339
lpeters 33:e47306c32791 340 /* I2C init */
lpeters 33:e47306c32791 341 ret = 0x00;
lpeters 33:e47306c32791 342
lpeters 33:e47306c32791 343 cmd[0] = LSM303_REG_MAG_WHO_AM_I_M;
lpeters 33:e47306c32791 344 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 345 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 33:e47306c32791 346 res = (ret == 0x40 ? sPass : sFail);
lpeters 33:e47306c32791 347 printf("MAG WhoAmI: %02x %s\r\n", ret, res);
lpeters 33:e47306c32791 348
lpeters 33:e47306c32791 349 cmd[0] = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 33:e47306c32791 350 cmd[1] = 0x00; // Mag = 10 Hz (high-resolution and continuous mode)
lpeters 33:e47306c32791 351 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 33:e47306c32791 352 cmd[0] = LSM303_REG_MAG_CFG_REG_C_M;
lpeters 33:e47306c32791 353 //cmd[1] = 0x01; // Mag data-ready interrupt enable
lpeters 33:e47306c32791 354 cmd[1] = 0x40; // Mag enable interrupt on pin
lpeters 33:e47306c32791 355 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 33:e47306c32791 356 cmd[0] = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 33:e47306c32791 357 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 358 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 33:e47306c32791 359 printf("MAG RetVal: %02x\r\n", ret);
lpeters 33:e47306c32791 360
lpeters 33:e47306c32791 361 cmd[0] = LSM303_REG_ACC_WHO_AM_I_A;
lpeters 33:e47306c32791 362 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 363 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 364 res = (ret == 0x33 ? sPass : sFail);
lpeters 33:e47306c32791 365 printf("ACC WhoAmI: %02x %s\r\n", ret, res);
lpeters 33:e47306c32791 366
lpeters 33:e47306c32791 367 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 368 cmd[1] = 0x57; // Accel = 100 Hz (normal mode)
lpeters 33:e47306c32791 369 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 370 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 371 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 372 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 373 printf("ACC RetVal: %02x\r\n", ret);
lpeters 33:e47306c32791 374
lpeters 33:e47306c32791 375 // Enable High Resolution Mode
lpeters 33:e47306c32791 376 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 377 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 378 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 379 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 380 cmd[1] = ret | 0x08;
lpeters 33:e47306c32791 381 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 382
lpeters 33:e47306c32791 383 // Enable Temp Sensor
lpeters 33:e47306c32791 384 cmd[0] = LSM303_REG_ACC_TEMP_CFG_REG_A;
lpeters 33:e47306c32791 385 cmd[1] = 0xC0;
lpeters 33:e47306c32791 386 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 387 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 388 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 389 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 390 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 391 cmd[1] = ret | 0x80;
lpeters 33:e47306c32791 392 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 393
lpeters 33:e47306c32791 394 // Set Full Scale to 4g
lpeters 33:e47306c32791 395 /*
lpeters 33:e47306c32791 396 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 397 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 398 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 399 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 400 //cmd[1] = ret | 0x30; // 16g
lpeters 33:e47306c32791 401 //cmd[1] = (ret & ~0x10) | 0x20; // 8g
lpeters 33:e47306c32791 402 cmd[1] = (ret & ~0x20) | 0x10; // 4g
lpeters 33:e47306c32791 403 //cmd[1] = ret & ~0x30; // 2g
lpeters 33:e47306c32791 404 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 405 */
lpeters 33:e47306c32791 406 /*
lpeters 33:e47306c32791 407 // IRQ Init from Datasheet.
lpeters 33:e47306c32791 408 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 409 cmd[1] = 0xA7;
lpeters 33:e47306c32791 410 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 411 cmd[0] = LSM303_REG_ACC_CTRL_REG2_A;
lpeters 33:e47306c32791 412 cmd[1] = 0x00;
lpeters 33:e47306c32791 413 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 414 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 33:e47306c32791 415 cmd[1] = 0x40;
lpeters 33:e47306c32791 416 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 417 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 418 cmd[1] = 0x00;
lpeters 33:e47306c32791 419 //cmd[1] = 0x10;
lpeters 33:e47306c32791 420 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 421 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 33:e47306c32791 422 cmd[1] = 0x08;
lpeters 33:e47306c32791 423 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 424 */
lpeters 33:e47306c32791 425
lpeters 33:e47306c32791 426 magDumpCfg();
lpeters 33:e47306c32791 427 accDumpCfg();
lpeters 33:e47306c32791 428
lpeters 33:e47306c32791 429 /*
lpeters 33:e47306c32791 430 // ACC INTERRUPT SETUP
lpeters 33:e47306c32791 431 // Enable Interrupt Pin
lpeters 33:e47306c32791 432 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 33:e47306c32791 433 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 434 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 435 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 33:e47306c32791 436 cmd[1] = ret | 0x40;
lpeters 33:e47306c32791 437 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 438 // Enable Interrupt Latch
lpeters 33:e47306c32791 439 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 33:e47306c32791 440 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 441 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 442 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 33:e47306c32791 443 cmd[1] = ret | 0x08;
lpeters 33:e47306c32791 444 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 445
lpeters 33:e47306c32791 446 // Set Threshold/Duration/Config
lpeters 33:e47306c32791 447 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 33:e47306c32791 448 //cmd[1] = 0x10;
lpeters 33:e47306c32791 449 //cmd[1] = 0x40;
lpeters 33:e47306c32791 450 //cmd[1] = 0x60;
lpeters 33:e47306c32791 451 cmd[1] = 0x7D;
lpeters 33:e47306c32791 452 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 453 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 33:e47306c32791 454 cmd[1] = 0x00;
lpeters 33:e47306c32791 455 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 456 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 33:e47306c32791 457 cmd[1] = 0x2A;
lpeters 33:e47306c32791 458 //cmd[1] = 0x0A;
lpeters 33:e47306c32791 459 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 460 //accPin.rise(&onAccIrq);
lpeters 33:e47306c32791 461 */
lpeters 33:e47306c32791 462
tchari 30:ff249a9156dc 463
lpeters 33:e47306c32791 464 /*
lpeters 33:e47306c32791 465 // MAG INTERRUPT SETUP
lpeters 33:e47306c32791 466 cmd[0] = LSM303_REG_MAG_INT_THS_L_REG_M;
lpeters 33:e47306c32791 467 cmd[1] = 0xF4;
lpeters 33:e47306c32791 468 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 33:e47306c32791 469 cmd[0] = LSM303_REG_MAG_INT_THS_H_REG_M;
lpeters 33:e47306c32791 470 cmd[1] = 0x01;
lpeters 33:e47306c32791 471 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 33:e47306c32791 472 cmd[0] = LSM303_REG_MAG_INT_CTRL_REG_M;
lpeters 33:e47306c32791 473 cmd[1] = 0xE7;
lpeters 33:e47306c32791 474 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 33:e47306c32791 475 magPin.rise(&onMagIrq);
lpeters 33:e47306c32791 476 */
lpeters 33:e47306c32791 477
lpeters 33:e47306c32791 478
lpeters 33:e47306c32791 479 /*while(1)
lpeters 33:e47306c32791 480 {
lpeters 33:e47306c32791 481 time_t tNow = time(NULL);
lpeters 33:e47306c32791 482 cmd[0] = LSM303_REG_ACC_INT1_SRC_A;
lpeters 33:e47306c32791 483 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 484 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 485 printf("%08X - %02X - IRQ: %d\r\n", tNow, ret, irqFired);
lpeters 33:e47306c32791 486 wait(1);
lpeters 33:e47306c32791 487 }*/
lpeters 33:e47306c32791 488
lpeters 33:e47306c32791 489 cfg = 0x00;
lpeters 33:e47306c32791 490 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 491 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 492 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 493 cfg |= (ret & 0x08) >> 3;
lpeters 33:e47306c32791 494 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 495 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 496 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 497 cfg |= (ret & 0x08) >> 2;
lpeters 33:e47306c32791 498 accScale = 1 << ((ret & 0x30) >> 4);
lpeters 33:e47306c32791 499 cmd[0] = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 33:e47306c32791 500 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 501 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 33:e47306c32791 502 cfg |= (ret & 0x10);
lpeters 33:e47306c32791 503 if (cfg & 0x01)
lpeters 33:e47306c32791 504 accShift = 8;
lpeters 33:e47306c32791 505 else if (cfg & 0x02)
lpeters 33:e47306c32791 506 accShift = 4;
lpeters 33:e47306c32791 507 else
lpeters 33:e47306c32791 508 accShift = 6;
lpeters 33:e47306c32791 509 printf("Quality: %02x AccShift: %d AccScale: %d\r\n", cfg, accShift, accScale);
lpeters 33:e47306c32791 510
lpeters 33:e47306c32791 511 /*
lpeters 33:e47306c32791 512 while(1)
lpeters 33:e47306c32791 513 {
lpeters 33:e47306c32791 514 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 33:e47306c32791 515 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 516 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 517 if (rda & 0x04)
lpeters 33:e47306c32791 518 {
lpeters 33:e47306c32791 519 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A;
lpeters 33:e47306c32791 520 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 521 i2c.read(LSM303_ADR_ACC, &buf[0], 1);
lpeters 33:e47306c32791 522 cmd[0] = LSM303_REG_ACC_OUT_TEMP_H_A;
lpeters 33:e47306c32791 523 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 524 i2c.read(LSM303_ADR_ACC, &buf[1], 1);
lpeters 33:e47306c32791 525 myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6;
lpeters 33:e47306c32791 526 printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 33:e47306c32791 527 }
lpeters 33:e47306c32791 528 }
lpeters 33:e47306c32791 529 */
lpeters 33:e47306c32791 530
lpeters 33:e47306c32791 531 /*
lpeters 33:e47306c32791 532 while(1)
lpeters 33:e47306c32791 533 {
lpeters 33:e47306c32791 534 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A | 0x80;
lpeters 33:e47306c32791 535 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 536 i2c.read(LSM303_ADR_ACC, &buf[0], 7);
lpeters 33:e47306c32791 537 if (buf[0] & 0x04)
lpeters 33:e47306c32791 538 {
lpeters 33:e47306c32791 539 myTemp = (int16_t)(buf[5] | (buf[6] << 8)) >> 6;
lpeters 33:e47306c32791 540 printf("TMP: |%02X %02X %02X| (%d)\r\n", buf[0], buf[5], buf[6], myTemp);
lpeters 33:e47306c32791 541 }
lpeters 33:e47306c32791 542 }
lpeters 33:e47306c32791 543 */
lpeters 33:e47306c32791 544
lpeters 33:e47306c32791 545 /*
lpeters 33:e47306c32791 546 while(1)
lpeters 33:e47306c32791 547 {
lpeters 33:e47306c32791 548 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 33:e47306c32791 549 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 550 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 551 if (rda & 0x04)
lpeters 33:e47306c32791 552 {
lpeters 33:e47306c32791 553 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80;
lpeters 33:e47306c32791 554 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 555 i2c.read(LSM303_ADR_ACC, &buf[0], 2);
lpeters 33:e47306c32791 556 myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6;
lpeters 33:e47306c32791 557 printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 33:e47306c32791 558 }
lpeters 33:e47306c32791 559 }
lpeters 33:e47306c32791 560 */
lpeters 33:e47306c32791 561
lpeters 33:e47306c32791 562 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 33:e47306c32791 563 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 564 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 565 if (rda & 0x04)
lpeters 33:e47306c32791 566 {
lpeters 33:e47306c32791 567 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80;
lpeters 33:e47306c32791 568 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 569 i2c.read(LSM303_ADR_ACC, &buf[0], 2);
lpeters 33:e47306c32791 570 myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6;
lpeters 33:e47306c32791 571 printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 33:e47306c32791 572 }
lpeters 33:e47306c32791 573
lpeters 33:e47306c32791 574 /*
lpeters 33:e47306c32791 575 //wait(8);
lpeters 33:e47306c32791 576
lpeters 33:e47306c32791 577 while(1) {
lpeters 33:e47306c32791 578 cmd[0] = LSM303_REG_MAG_STATUS_REG_M;
lpeters 33:e47306c32791 579 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 580 i2c.read(LSM303_ADR_MAG, &rda, 1);
lpeters 33:e47306c32791 581 if (rda)
lpeters 33:e47306c32791 582 {
lpeters 33:e47306c32791 583 cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M;
lpeters 33:e47306c32791 584 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 585 i2c.read(LSM303_ADR_MAG, &buf[0], 1);
lpeters 33:e47306c32791 586 cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M;
lpeters 33:e47306c32791 587 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 588 i2c.read(LSM303_ADR_MAG, &buf[1], 1);
lpeters 33:e47306c32791 589 cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M;
lpeters 33:e47306c32791 590 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 591 i2c.read(LSM303_ADR_MAG, &buf[2], 1);
lpeters 33:e47306c32791 592 cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M;
lpeters 33:e47306c32791 593 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 594 i2c.read(LSM303_ADR_MAG, &buf[3], 1);
lpeters 33:e47306c32791 595 cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M;
lpeters 33:e47306c32791 596 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 597 i2c.read(LSM303_ADR_MAG, &buf[4], 1);
lpeters 33:e47306c32791 598 cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M;
lpeters 33:e47306c32791 599 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 600 i2c.read(LSM303_ADR_MAG, &buf[5], 1);
lpeters 33:e47306c32791 601 myMagX = (buf[0] | (buf[1] << 8));
lpeters 33:e47306c32791 602 myMagY = (buf[2] | (buf[3] << 8));
lpeters 33:e47306c32791 603 myMagZ = (buf[4] | (buf[5] << 8));
lpeters 33:e47306c32791 604 if (myMagX < magMinX)
lpeters 33:e47306c32791 605 magMinX = myMagX;
lpeters 33:e47306c32791 606 if (myMagY < magMinY)
lpeters 33:e47306c32791 607 magMinY = myMagY;
lpeters 33:e47306c32791 608 if (myMagZ < magMinZ)
lpeters 33:e47306c32791 609 magMinZ = myMagZ;
lpeters 33:e47306c32791 610 if (myMagX > magMaxX)
lpeters 33:e47306c32791 611 magMaxX = myMagX;
lpeters 33:e47306c32791 612 if (myMagY > magMaxY)
lpeters 33:e47306c32791 613 magMaxY = myMagY;
lpeters 33:e47306c32791 614 if (myMagZ > magMaxZ)
lpeters 33:e47306c32791 615 magMaxZ = myMagZ;
lpeters 33:e47306c32791 616 //printf("MAG: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myMagX, myMagY, myMagZ);
lpeters 33:e47306c32791 617 cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M;
lpeters 33:e47306c32791 618 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 619 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 33:e47306c32791 620 if (ret & 0x01 && magEvent == 0 && ret & 0xFC)
lpeters 33:e47306c32791 621 {
lpeters 33:e47306c32791 622 magSFire++;
lpeters 33:e47306c32791 623 magEvent = 1;
lpeters 33:e47306c32791 624 magSHIRQ++;
lpeters 33:e47306c32791 625 }
lpeters 33:e47306c32791 626 else if (!(ret & 0x01) && magEvent == 1 && !(ret & 0xFC))
lpeters 33:e47306c32791 627 {
lpeters 33:e47306c32791 628 magSFire++;
lpeters 33:e47306c32791 629 magEvent = 0;
lpeters 33:e47306c32791 630 magSLIRQ++;
lpeters 33:e47306c32791 631 }
lpeters 33:e47306c32791 632 printf("M|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%02X/%02X %02X/%02X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 6, myMagX, 6, myMagY, 6, myMagZ, 6, magMinX, 6, magMinY, 6, magMinZ, 6, magMaxX, 6, magMaxY, 6, magMaxZ, ret, magSHIRQ, magSLIRQ, magSFire, magHFire);
lpeters 33:e47306c32791 633 }
lpeters 33:e47306c32791 634
lpeters 33:e47306c32791 635 cmd[0] = LSM303_REG_ACC_STATUS_REG_A;
lpeters 33:e47306c32791 636 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 637 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 638 if (rda)
lpeters 33:e47306c32791 639 {
lpeters 33:e47306c32791 640 cmd[0] = LSM303_REG_ACC_OUT_X_L_A;
lpeters 33:e47306c32791 641 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 642 i2c.read(LSM303_ADR_ACC, &buf[0], 1);
lpeters 33:e47306c32791 643 cmd[0] = LSM303_REG_ACC_OUT_X_H_A;
lpeters 33:e47306c32791 644 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 645 i2c.read(LSM303_ADR_ACC, &buf[1], 1);
lpeters 33:e47306c32791 646 cmd[0] = LSM303_REG_ACC_OUT_Y_L_A;
lpeters 33:e47306c32791 647 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 648 i2c.read(LSM303_ADR_ACC, &buf[2], 1);
lpeters 33:e47306c32791 649 cmd[0] = LSM303_REG_ACC_OUT_Y_H_A;
lpeters 33:e47306c32791 650 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 651 i2c.read(LSM303_ADR_ACC, &buf[3], 1);
lpeters 33:e47306c32791 652 cmd[0] = LSM303_REG_ACC_OUT_Z_L_A;
lpeters 33:e47306c32791 653 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 654 i2c.read(LSM303_ADR_ACC, &buf[4], 1);
lpeters 33:e47306c32791 655 cmd[0] = LSM303_REG_ACC_OUT_Z_H_A;
lpeters 33:e47306c32791 656 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 657 i2c.read(LSM303_ADR_ACC, &buf[5], 1);
lpeters 33:e47306c32791 658 myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift);
lpeters 33:e47306c32791 659 myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift);
lpeters 33:e47306c32791 660 myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift);
lpeters 33:e47306c32791 661 if (myAccX < accMinX)
lpeters 33:e47306c32791 662 accMinX = myAccX;
lpeters 33:e47306c32791 663 if (myAccY < accMinY)
lpeters 33:e47306c32791 664 accMinY = myAccY;
lpeters 33:e47306c32791 665 if (myAccZ < accMinZ)
lpeters 33:e47306c32791 666 accMinZ = myAccZ;
lpeters 33:e47306c32791 667 if (myAccX > accMaxX)
lpeters 33:e47306c32791 668 accMaxX = myAccX;
lpeters 33:e47306c32791 669 if (myAccY > accMaxY)
lpeters 33:e47306c32791 670 accMaxY = myAccY;
lpeters 33:e47306c32791 671 if (myAccZ > accMaxZ)
lpeters 33:e47306c32791 672 accMaxZ = myAccZ;
lpeters 33:e47306c32791 673 //printf("ACC: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myAccX, myAccY, myAccZ);
lpeters 33:e47306c32791 674 cmd[0] = LSM303_REG_ACC_INT1_SRC_A;
lpeters 33:e47306c32791 675 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 676 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 677 if (ret & 0x40)
lpeters 33:e47306c32791 678 {
lpeters 33:e47306c32791 679 accSFire++;
lpeters 33:e47306c32791 680 if (accEvent == 1)
lpeters 33:e47306c32791 681 {
lpeters 33:e47306c32791 682 accEvent = 0;
lpeters 33:e47306c32791 683 accSLIRQ++;
lpeters 33:e47306c32791 684 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 33:e47306c32791 685 cmd[1] = 0x7D;
lpeters 33:e47306c32791 686 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 687 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 33:e47306c32791 688 cmd[1] = 0x00;
lpeters 33:e47306c32791 689 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 690 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 33:e47306c32791 691 cmd[1] = 0x2A;
lpeters 33:e47306c32791 692 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 693 }
lpeters 33:e47306c32791 694 else
lpeters 33:e47306c32791 695 {
lpeters 33:e47306c32791 696 accEvent = 1;
lpeters 33:e47306c32791 697 accSHIRQ++;
lpeters 33:e47306c32791 698 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 33:e47306c32791 699 cmd[1] = 0x50;
lpeters 33:e47306c32791 700 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 701 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 33:e47306c32791 702 //cmd[1] = 0x7D;
lpeters 33:e47306c32791 703 cmd[1] = 0x03;
lpeters 33:e47306c32791 704 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 705 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 33:e47306c32791 706 cmd[1] = 0x95;
lpeters 33:e47306c32791 707 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 33:e47306c32791 708 }
lpeters 33:e47306c32791 709 }
lpeters 33:e47306c32791 710 printf("A|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%04X/%04X %04X/%04X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 5, myAccX, 5, myAccY, 5, myAccZ, 5, accMinX, 5, accMinY, 5, accMinZ, 5, accMaxX, 5, accMaxY, 5, accMaxZ, ret, accSHIRQ, accSLIRQ, accSFire, accHFire);
lpeters 33:e47306c32791 711 }
lpeters 33:e47306c32791 712 }*/
lpeters 33:e47306c32791 713
mbed_official 0:7037ed05f54f 714 // Initialize LoRaWAN stack
mbed_official 2:dc95ac6d6d4e 715 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 716 printf("\r\n LoRa initialization failed! \r\n");
mbed_official 0:7037ed05f54f 717 return -1;
mbed_official 0:7037ed05f54f 718 }
mbed_official 0:7037ed05f54f 719
mbed_official 0:7037ed05f54f 720 printf("\r\n Mbed LoRaWANStack initialized \r\n");
lpeters 33:e47306c32791 721 printf("MBED_CONF_LORA_APP_PORT: %d", MBED_CONF_LORA_APP_PORT);
mbed_official 0:7037ed05f54f 722
mbed_official 0:7037ed05f54f 723 // prepare application callbacks
mbed_official 0:7037ed05f54f 724 callbacks.events = mbed::callback(lora_event_handler);
mbed_official 2:dc95ac6d6d4e 725 lorawan.add_app_callbacks(&callbacks);
mbed_official 0:7037ed05f54f 726
mbed_official 0:7037ed05f54f 727 // Set number of retries in case of CONFIRMED messages
mbed_official 2:dc95ac6d6d4e 728 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
mbed_official 0:7037ed05f54f 729 != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 730 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
mbed_official 0:7037ed05f54f 731 return -1;
mbed_official 0:7037ed05f54f 732 }
mbed_official 0:7037ed05f54f 733
mbed_official 0:7037ed05f54f 734 printf("\r\n CONFIRMED message retries : %d \r\n",
mbed_official 0:7037ed05f54f 735 CONFIRMED_MSG_RETRY_COUNTER);
mbed_official 0:7037ed05f54f 736
mbed_official 0:7037ed05f54f 737 // Enable adaptive data rate
mbed_official 2:dc95ac6d6d4e 738 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 739 printf("\r\n enable_adaptive_datarate failed! \r\n");
mbed_official 0:7037ed05f54f 740 return -1;
mbed_official 0:7037ed05f54f 741 }
mbed_official 0:7037ed05f54f 742
mbed_official 0:7037ed05f54f 743 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
mbed_official 0:7037ed05f54f 744
mbed_official 2:dc95ac6d6d4e 745 retcode = lorawan.connect();
lpeters 33:e47306c32791 746
mbed_official 0:7037ed05f54f 747 if (retcode == LORAWAN_STATUS_OK ||
mbed_official 0:7037ed05f54f 748 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
mbed_official 0:7037ed05f54f 749 } else {
mbed_official 0:7037ed05f54f 750 printf("\r\n Connection error, code = %d \r\n", retcode);
mbed_official 0:7037ed05f54f 751 return -1;
mbed_official 0:7037ed05f54f 752 }
mbed_official 0:7037ed05f54f 753
mbed_official 0:7037ed05f54f 754 printf("\r\n Connection - In Progress ...\r\n");
mbed_official 0:7037ed05f54f 755
mbed_official 0:7037ed05f54f 756 // make your event queue dispatching events forever
mbed_official 0:7037ed05f54f 757 ev_queue.dispatch_forever();
mbed_official 3:8c7198d1a2a1 758
mbed_official 3:8c7198d1a2a1 759 return 0;
mbed_official 0:7037ed05f54f 760 }
mbed_official 0:7037ed05f54f 761
mbed_official 0:7037ed05f54f 762 /**
mbed_official 0:7037ed05f54f 763 * Sends a message to the Network Server
mbed_official 0:7037ed05f54f 764 */
mbed_official 0:7037ed05f54f 765 static void send_message()
mbed_official 0:7037ed05f54f 766 {
mbed_official 0:7037ed05f54f 767 uint16_t packet_len;
mbed_official 0:7037ed05f54f 768 int16_t retcode;
mbed_official 0:7037ed05f54f 769 float sensor_value;
lpeters 33:e47306c32791 770 bool gpsDone = false;
mbed_official 0:7037ed05f54f 771
mbed_official 0:7037ed05f54f 772 if (ds1820.begin()) {
mbed_official 0:7037ed05f54f 773 ds1820.startConversion();
mbed_official 0:7037ed05f54f 774 sensor_value = ds1820.read();
mbed_official 0:7037ed05f54f 775 printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value);
mbed_official 0:7037ed05f54f 776 ds1820.startConversion();
mbed_official 0:7037ed05f54f 777 } else {
mbed_official 0:7037ed05f54f 778 printf("\r\n No sensor found \r\n");
mbed_official 0:7037ed05f54f 779 return;
mbed_official 0:7037ed05f54f 780 }
mbed_official 0:7037ed05f54f 781
tchari 30:ff249a9156dc 782 time_t tNow = time(NULL);
tchari 30:ff249a9156dc 783 printf("Clock: %d\r\n", tNow);
lpeters 33:e47306c32791 784
lpeters 33:e47306c32791 785 ret = 0xFF;
lpeters 33:e47306c32791 786 cmd[0] = 0xFF;
lpeters 33:e47306c32791 787 i2c.write(NEOM8M_ADR_GPS, cmd, 1);
lpeters 33:e47306c32791 788 while(!gpsDone)
lpeters 33:e47306c32791 789 {
lpeters 33:e47306c32791 790 while (ret == 0xFF)
lpeters 33:e47306c32791 791 {
lpeters 33:e47306c32791 792 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 793 }
lpeters 33:e47306c32791 794 while (ret != 0xFF)
lpeters 33:e47306c32791 795 {
lpeters 33:e47306c32791 796 buf[pos++] = ret;
lpeters 33:e47306c32791 797 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 798 if (ret == '\r')
lpeters 33:e47306c32791 799 {
lpeters 33:e47306c32791 800 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 801 if (ret == '\n')
lpeters 33:e47306c32791 802 {
lpeters 33:e47306c32791 803 buf[pos] = 0x00;
lpeters 33:e47306c32791 804 /* NMEA Validation */
lpeters 33:e47306c32791 805 uint16_t crc = 0;
lpeters 33:e47306c32791 806 char clr;
lpeters 33:e47306c32791 807 if (buf[0] == '$' && buf[pos-3] == '*')
lpeters 33:e47306c32791 808 {
lpeters 33:e47306c32791 809 int i;
lpeters 33:e47306c32791 810 for (i = 1; i < pos-3; i++)
lpeters 33:e47306c32791 811 {
lpeters 33:e47306c32791 812 crc ^= buf[i];
lpeters 33:e47306c32791 813 }
lpeters 33:e47306c32791 814 }
lpeters 33:e47306c32791 815 if (crc == ((buf[pos-2] < 'A' ? buf[pos-2] - '0' : buf[pos-2] - '7') << 4 | (buf[pos-1] < 'A' ? buf[pos-1] - '0' : buf[pos-1] - '7')))
lpeters 33:e47306c32791 816 clr = '2'; // 2 = Green
lpeters 33:e47306c32791 817 else
lpeters 33:e47306c32791 818 clr = '1'; // 1 = Red
lpeters 33:e47306c32791 819 printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf);
lpeters 33:e47306c32791 820 // Global Positioning System Fix Data
lpeters 33:e47306c32791 821 if(strncmp(buf, "$GNGGA", 6) == 0)
lpeters 33:e47306c32791 822 {
lpeters 33:e47306c32791 823 printf("GNGGA> ");
lpeters 33:e47306c32791 824 //sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
lpeters 33:e47306c32791 825 //pc.printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude);
lpeters 33:e47306c32791 826 float fldTim, fldAlt;
lpeters 33:e47306c32791 827 double fldLat, fldLon;
lpeters 33:e47306c32791 828 char fldN_S, fldE_W;
lpeters 33:e47306c32791 829 int fldFix, fldSat;
lpeters 33:e47306c32791 830 sscanf(buf, "$GNGGA,%f,%lf,%c,%lf,%c,%d,%d,%*f,%f", &fldTim, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldFix, &fldSat, &fldAlt);
lpeters 33:e47306c32791 831 printf("Sec: %.2f, Lat: %.5f %c, Lon: %.5f %c, Fix: %d, Sat: %d, Alt: %.1f M\r\n", fldTim, fldLat, fldN_S, fldLon, fldE_W, fldFix, fldSat, fldAlt);
lpeters 33:e47306c32791 832 if (clr == '2')
lpeters 33:e47306c32791 833 {
lpeters 33:e47306c32791 834 mylat = fldLat / (fldN_S == 'S' ? -100 : 100);
lpeters 33:e47306c32791 835 mylon = fldLon / (fldE_W == 'W' ? -100 : 100);
lpeters 33:e47306c32791 836 mytime = (uint32_t)fldTim;
lpeters 33:e47306c32791 837 mybatt = (fldSat & 0xF0 ? 0x0F : fldSat & 0x0F);
lpeters 33:e47306c32791 838 }
lpeters 33:e47306c32791 839 }
lpeters 33:e47306c32791 840 // Satellite status
lpeters 33:e47306c32791 841 if(strncmp(buf, "$GNGSA", 6) == 0)
lpeters 33:e47306c32791 842 {
lpeters 33:e47306c32791 843 printf("GNGSA> ");
lpeters 33:e47306c32791 844 //sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
lpeters 33:e47306c32791 845 //pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
lpeters 33:e47306c32791 846 char fldTyp;
lpeters 33:e47306c32791 847 int fldDim, fldSat;
lpeters 33:e47306c32791 848 sscanf(buf, "$GNGSA,%c,%d,%d", &fldTyp, &fldDim, &fldSat);
lpeters 33:e47306c32791 849 printf("Typ: %c, Pos: %d, Sat: %d\r\n", fldTyp, fldDim, fldSat);
lpeters 33:e47306c32791 850 }
lpeters 33:e47306c32791 851 // Geographic position, Latitude and Longitude
lpeters 33:e47306c32791 852 if(strncmp(buf, "$GNGLL", 6) == 0)
lpeters 33:e47306c32791 853 {
lpeters 33:e47306c32791 854 printf("GNGLL> ");
lpeters 33:e47306c32791 855 //sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
lpeters 33:e47306c32791 856 //pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
lpeters 33:e47306c32791 857 float fldTim;
lpeters 33:e47306c32791 858 double fldLat, fldLon;
lpeters 33:e47306c32791 859 char fldN_S, fldE_W;
lpeters 33:e47306c32791 860 sscanf(buf, "$GNGLL,%lf,%c,%lf,%c,%f", &fldLat, &fldN_S, &fldLon, &fldE_W, &fldTim);
lpeters 33:e47306c32791 861 printf("Lat: %.5f %c, Lon: %.5f %c, Sec: %.2f\r\n", fldLat, fldN_S, fldLon, fldE_W, fldTim);
lpeters 33:e47306c32791 862 }
lpeters 33:e47306c32791 863 // Geographic position, Latitude and Longitude
lpeters 33:e47306c32791 864 if(strncmp(buf, "$GNRMC", 6) == 0)
lpeters 33:e47306c32791 865 {
lpeters 33:e47306c32791 866 printf("GNRMC> ");
lpeters 33:e47306c32791 867 //sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
lpeters 33:e47306c32791 868 //pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date);
lpeters 33:e47306c32791 869 float fldTim, fldSpd;
lpeters 33:e47306c32791 870 double fldLat, fldLon;
lpeters 33:e47306c32791 871 char fldSts, fldN_S, fldE_W;
lpeters 33:e47306c32791 872 int fldDat;
lpeters 33:e47306c32791 873 sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,,%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, &fldDat);
lpeters 33:e47306c32791 874 printf("Sec: %.2f, Sts: %c, Lat: %.5f %c, Lon: %.5f %c, Spd: %.3f, Dat: %06d\r\n", fldTim, fldSts, fldLat, fldN_S, fldLon, fldE_W, fldSpd, fldDat);
lpeters 33:e47306c32791 875 }
lpeters 33:e47306c32791 876 pos = 0;
lpeters 33:e47306c32791 877 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 878 }
lpeters 33:e47306c32791 879 else
lpeters 33:e47306c32791 880 {
lpeters 33:e47306c32791 881 printf("WARN: Expected '\n', received '%02x'.\r\n", ret);
lpeters 33:e47306c32791 882 }
lpeters 33:e47306c32791 883 }
lpeters 33:e47306c32791 884 else if (pos == 82)
lpeters 33:e47306c32791 885 {
lpeters 33:e47306c32791 886 buf[pos] = 0x00;
lpeters 33:e47306c32791 887 printf("GPS: |%s| ...\r\n", buf);
lpeters 33:e47306c32791 888 pos = 0;
lpeters 33:e47306c32791 889 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 890 }
lpeters 33:e47306c32791 891 }
lpeters 33:e47306c32791 892 buf[pos] = 0x00;
lpeters 33:e47306c32791 893 gpsDone = true;
lpeters 33:e47306c32791 894 }
lpeters 33:e47306c32791 895 if (pos > 0)
lpeters 33:e47306c32791 896 printf("GPS: |%s|\r\n", buf);
lpeters 33:e47306c32791 897
lpeters 31:f03c183e2bf6 898 /*
lpeters 33:e47306c32791 899 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 33:e47306c32791 900 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 901 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 902 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A;
lpeters 33:e47306c32791 903 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 904 i2c.read(LSM303_ADR_ACC, &buf[0], 1);
lpeters 33:e47306c32791 905 cmd[0] = LSM303_REG_ACC_OUT_TEMP_H_A;
lpeters 33:e47306c32791 906 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 907 i2c.read(LSM303_ADR_ACC, &buf[1], 1);
lpeters 33:e47306c32791 908 myTemp = (buf[0] | (buf[1] << 8));
lpeters 33:e47306c32791 909 printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 31:f03c183e2bf6 910 */
lpeters 33:e47306c32791 911
lpeters 33:e47306c32791 912 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 31:f03c183e2bf6 913 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 914 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 915 if (rda & 0x04)
lpeters 33:e47306c32791 916 {
lpeters 33:e47306c32791 917 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80;
lpeters 33:e47306c32791 918 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 919 i2c.read(LSM303_ADR_ACC, &buf[0], 2);
lpeters 33:e47306c32791 920 myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6;
lpeters 33:e47306c32791 921 printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 33:e47306c32791 922 }
lpeters 33:e47306c32791 923
lpeters 33:e47306c32791 924 cmd[0] = LSM303_REG_MAG_STATUS_REG_M;
lpeters 33:e47306c32791 925 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 926 i2c.read(LSM303_ADR_MAG, &rda, 1);
lpeters 33:e47306c32791 927
lpeters 33:e47306c32791 928 cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M;
lpeters 33:e47306c32791 929 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 930 i2c.read(LSM303_ADR_MAG, &buf[0], 1);
lpeters 33:e47306c32791 931 cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M;
lpeters 33:e47306c32791 932 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 933 i2c.read(LSM303_ADR_MAG, &buf[1], 1);
lpeters 33:e47306c32791 934 cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M;
lpeters 33:e47306c32791 935 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 936 i2c.read(LSM303_ADR_MAG, &buf[2], 1);
lpeters 33:e47306c32791 937 cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M;
lpeters 33:e47306c32791 938 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 939 i2c.read(LSM303_ADR_MAG, &buf[3], 1);
lpeters 33:e47306c32791 940 cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M;
lpeters 33:e47306c32791 941 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 942 i2c.read(LSM303_ADR_MAG, &buf[4], 1);
lpeters 33:e47306c32791 943 cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M;
lpeters 33:e47306c32791 944 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 945 i2c.read(LSM303_ADR_MAG, &buf[5], 1);
lpeters 33:e47306c32791 946 myMagX = (buf[0] | (buf[1] << 8));
lpeters 33:e47306c32791 947 myMagY = (buf[2] | (buf[3] << 8));
lpeters 33:e47306c32791 948 myMagZ = (buf[4] | (buf[5] << 8));
lpeters 33:e47306c32791 949 printf("MAG: |%02X %02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myMagX, myMagY, myMagZ);
lpeters 33:e47306c32791 950
lpeters 33:e47306c32791 951 /*
lpeters 33:e47306c32791 952 cmd[0] = LSM303_REG_MAG_OFFSET_X_REG_L_M;
lpeters 33:e47306c32791 953 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 954 i2c.read(LSM303_ADR_MAG, &buf[0], 1);
lpeters 33:e47306c32791 955 cmd[0] = LSM303_REG_MAG_OFFSET_X_REG_H_M;
lpeters 33:e47306c32791 956 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 957 i2c.read(LSM303_ADR_MAG, &buf[1], 1);
lpeters 33:e47306c32791 958 cmd[0] = LSM303_REG_MAG_OFFSET_Y_REG_L_M;
lpeters 33:e47306c32791 959 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 960 i2c.read(LSM303_ADR_MAG, &buf[2], 1);
lpeters 33:e47306c32791 961 cmd[0] = LSM303_REG_MAG_OFFSET_Y_REG_H_M;
lpeters 33:e47306c32791 962 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 963 i2c.read(LSM303_ADR_MAG, &buf[3], 1);
lpeters 33:e47306c32791 964 cmd[0] = LSM303_REG_MAG_OFFSET_Z_REG_L_M;
lpeters 33:e47306c32791 965 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 966 i2c.read(LSM303_ADR_MAG, &buf[4], 1);
lpeters 33:e47306c32791 967 cmd[0] = LSM303_REG_MAG_OFFSET_Z_REG_H_M;
lpeters 33:e47306c32791 968 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 969 i2c.read(LSM303_ADR_MAG, &buf[5], 1);
lpeters 33:e47306c32791 970 myOffX = (buf[0] | (buf[1] << 8));
lpeters 33:e47306c32791 971 myOffY = (buf[2] | (buf[3] << 8));
lpeters 33:e47306c32791 972 myOffZ = (buf[4] | (buf[5] << 8));
lpeters 33:e47306c32791 973 printf("OFF: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myOffX, myOffY, myOffZ);
lpeters 33:e47306c32791 974 */
lpeters 33:e47306c32791 975
lpeters 33:e47306c32791 976 cmd[0] = LSM303_REG_ACC_STATUS_REG_A;
lpeters 33:e47306c32791 977 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 978 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 33:e47306c32791 979
lpeters 33:e47306c32791 980 cmd[0] = LSM303_REG_ACC_OUT_X_L_A;
lpeters 33:e47306c32791 981 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 982 i2c.read(LSM303_ADR_ACC, &buf[0], 1);
lpeters 33:e47306c32791 983 cmd[0] = LSM303_REG_ACC_OUT_X_H_A;
lpeters 33:e47306c32791 984 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 985 i2c.read(LSM303_ADR_ACC, &buf[1], 1);
lpeters 33:e47306c32791 986 cmd[0] = LSM303_REG_ACC_OUT_Y_L_A;
lpeters 33:e47306c32791 987 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 988 i2c.read(LSM303_ADR_ACC, &buf[2], 1);
lpeters 33:e47306c32791 989 cmd[0] = LSM303_REG_ACC_OUT_Y_H_A;
lpeters 33:e47306c32791 990 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 991 i2c.read(LSM303_ADR_ACC, &buf[3], 1);
lpeters 33:e47306c32791 992 cmd[0] = LSM303_REG_ACC_OUT_Z_L_A;
lpeters 33:e47306c32791 993 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 994 i2c.read(LSM303_ADR_ACC, &buf[4], 1);
lpeters 33:e47306c32791 995 cmd[0] = LSM303_REG_ACC_OUT_Z_H_A;
lpeters 33:e47306c32791 996 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 997 i2c.read(LSM303_ADR_ACC, &buf[5], 1);
lpeters 33:e47306c32791 998 myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift);
lpeters 33:e47306c32791 999 myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift);
lpeters 33:e47306c32791 1000 myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift);
lpeters 33:e47306c32791 1001 printf("ACC: |%02X %02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myAccX, myAccY, myAccZ);
lpeters 33:e47306c32791 1002
tchari 30:ff249a9156dc 1003 int ilat = (int)(mylat * 100000);
tchari 30:ff249a9156dc 1004 int ilon = (int)(mylon * 100000);
lpeters 33:e47306c32791 1005 printf("TIM: %d, SAT: %d, LAT: %d, LON: %d\r\n", mytime, mybatt, ilat, ilon);
tchari 30:ff249a9156dc 1006 packet_len = 11;
tchari 30:ff249a9156dc 1007 tx_buffer[0] = (mytime >> 24) & 0xFF;
tchari 30:ff249a9156dc 1008 tx_buffer[1] = (mytime >> 16) & 0xFF;
tchari 30:ff249a9156dc 1009 tx_buffer[2] = (mytime >> 8) & 0xFF;
tchari 30:ff249a9156dc 1010 tx_buffer[3] = (mytime >> 0) & 0xFF;
tchari 30:ff249a9156dc 1011 tx_buffer[4] = ((mybatt << 4) & 0xF0) | ((ilat >> 22) & 0x0F);
tchari 30:ff249a9156dc 1012 tx_buffer[5] = (ilat >> 14) & 0xFF;
tchari 30:ff249a9156dc 1013 tx_buffer[6] = (ilat >> 6) & 0xFF;
tchari 30:ff249a9156dc 1014 tx_buffer[7] = ((ilat << 2) & 0xFC) | ((ilon >> 24) & 0x03);
tchari 30:ff249a9156dc 1015 tx_buffer[8] = (ilon >> 16) & 0xFF;
tchari 30:ff249a9156dc 1016 tx_buffer[9] = (ilon >> 8) & 0xFF;
tchari 30:ff249a9156dc 1017 tx_buffer[10] = (ilon >> 0) & 0xFF;
tchari 30:ff249a9156dc 1018 printf("\r\nBUF: |");
tchari 30:ff249a9156dc 1019 int i;
tchari 30:ff249a9156dc 1020 for (i = 0; i < packet_len; i++) { printf("%02x", tx_buffer[i]); }
tchari 30:ff249a9156dc 1021 printf("|\r\n");
mbed_official 2:dc95ac6d6d4e 1022 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len,
mbed_official 0:7037ed05f54f 1023 MSG_CONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 1024
mbed_official 0:7037ed05f54f 1025 if (retcode < 0) {
mbed_official 0:7037ed05f54f 1026 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
mbed_official 0:7037ed05f54f 1027 : printf("\r\n send() - Error code %d \r\n", retcode);
mbed_official 26:f07f5febf97f 1028
mbed_official 26:f07f5febf97f 1029 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
mbed_official 26:f07f5febf97f 1030 //retry in 3 seconds
mbed_official 26:f07f5febf97f 1031 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 1032 ev_queue.call_in(3000, send_message);
mbed_official 26:f07f5febf97f 1033 }
mbed_official 26:f07f5febf97f 1034 }
mbed_official 0:7037ed05f54f 1035 return;
mbed_official 0:7037ed05f54f 1036 }
mbed_official 0:7037ed05f54f 1037
mbed_official 0:7037ed05f54f 1038 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
mbed_official 12:5015dfead3f2 1039 memset(tx_buffer, 0, sizeof(tx_buffer));
mbed_official 0:7037ed05f54f 1040 }
mbed_official 0:7037ed05f54f 1041
mbed_official 0:7037ed05f54f 1042 /**
mbed_official 0:7037ed05f54f 1043 * Receive a message from the Network Server
mbed_official 0:7037ed05f54f 1044 */
mbed_official 0:7037ed05f54f 1045 static void receive_message()
mbed_official 0:7037ed05f54f 1046 {
mbed_official 0:7037ed05f54f 1047 int16_t retcode;
mbed_official 2:dc95ac6d6d4e 1048 retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer,
mbed_official 12:5015dfead3f2 1049 sizeof(rx_buffer),
mbed_official 0:7037ed05f54f 1050 MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 1051
mbed_official 0:7037ed05f54f 1052 if (retcode < 0) {
mbed_official 0:7037ed05f54f 1053 printf("\r\n receive() - Error code %d \r\n", retcode);
mbed_official 0:7037ed05f54f 1054 return;
mbed_official 0:7037ed05f54f 1055 }
mbed_official 0:7037ed05f54f 1056
mbed_official 0:7037ed05f54f 1057 printf(" Data:");
mbed_official 0:7037ed05f54f 1058
mbed_official 0:7037ed05f54f 1059 for (uint8_t i = 0; i < retcode; i++) {
mbed_official 0:7037ed05f54f 1060 printf("%x", rx_buffer[i]);
mbed_official 0:7037ed05f54f 1061 }
mbed_official 0:7037ed05f54f 1062
mbed_official 0:7037ed05f54f 1063 printf("\r\n Data Length: %d\r\n", retcode);
mbed_official 0:7037ed05f54f 1064
lpeters 33:e47306c32791 1065 int startLoop = 0;
lpeters 33:e47306c32791 1066 if (strncmp((char *)rx_buffer, cmdSendLoop, 8) == 0)
lpeters 33:e47306c32791 1067 {
lpeters 33:e47306c32791 1068 printf("SendLoop Command Received!\r\n");
lpeters 33:e47306c32791 1069 startLoop = 1;
lpeters 33:e47306c32791 1070 }
lpeters 33:e47306c32791 1071
mbed_official 12:5015dfead3f2 1072 memset(rx_buffer, 0, sizeof(rx_buffer));
lpeters 33:e47306c32791 1073
lpeters 33:e47306c32791 1074 if (startLoop)
lpeters 33:e47306c32791 1075 send_message();
mbed_official 0:7037ed05f54f 1076 }
mbed_official 0:7037ed05f54f 1077
mbed_official 0:7037ed05f54f 1078 /**
mbed_official 0:7037ed05f54f 1079 * Event handler
mbed_official 0:7037ed05f54f 1080 */
mbed_official 0:7037ed05f54f 1081 static void lora_event_handler(lorawan_event_t event)
mbed_official 0:7037ed05f54f 1082 {
tchari 30:ff249a9156dc 1083 tr_debug("In lora_event_handler(%d)...", event);
mbed_official 0:7037ed05f54f 1084 switch (event) {
mbed_official 0:7037ed05f54f 1085 case CONNECTED:
mbed_official 0:7037ed05f54f 1086 printf("\r\n Connection - Successful \r\n");
mbed_official 0:7037ed05f54f 1087 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 1088 send_message();
mbed_official 0:7037ed05f54f 1089 } else {
mbed_official 0:7037ed05f54f 1090 ev_queue.call_every(TX_TIMER, send_message);
mbed_official 0:7037ed05f54f 1091 }
mbed_official 0:7037ed05f54f 1092
mbed_official 0:7037ed05f54f 1093 break;
mbed_official 0:7037ed05f54f 1094 case DISCONNECTED:
mbed_official 0:7037ed05f54f 1095 ev_queue.break_dispatch();
mbed_official 0:7037ed05f54f 1096 printf("\r\n Disconnected Successfully \r\n");
mbed_official 0:7037ed05f54f 1097 break;
mbed_official 0:7037ed05f54f 1098 case TX_DONE:
mbed_official 0:7037ed05f54f 1099 printf("\r\n Message Sent to Network Server \r\n");
mbed_official 0:7037ed05f54f 1100 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 1101 send_message();
mbed_official 0:7037ed05f54f 1102 }
mbed_official 0:7037ed05f54f 1103 break;
mbed_official 0:7037ed05f54f 1104 case TX_TIMEOUT:
mbed_official 0:7037ed05f54f 1105 case TX_ERROR:
mbed_official 0:7037ed05f54f 1106 case TX_CRYPTO_ERROR:
mbed_official 0:7037ed05f54f 1107 case TX_SCHEDULING_ERROR:
mbed_official 0:7037ed05f54f 1108 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
mbed_official 0:7037ed05f54f 1109 // try again
mbed_official 0:7037ed05f54f 1110 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 1111 send_message();
mbed_official 0:7037ed05f54f 1112 }
mbed_official 0:7037ed05f54f 1113 break;
mbed_official 0:7037ed05f54f 1114 case RX_DONE:
mbed_official 0:7037ed05f54f 1115 printf("\r\n Received message from Network Server \r\n");
mbed_official 0:7037ed05f54f 1116 receive_message();
mbed_official 0:7037ed05f54f 1117 break;
mbed_official 0:7037ed05f54f 1118 case RX_TIMEOUT:
mbed_official 0:7037ed05f54f 1119 case RX_ERROR:
mbed_official 0:7037ed05f54f 1120 printf("\r\n Error in reception - Code = %d \r\n", event);
mbed_official 0:7037ed05f54f 1121 break;
mbed_official 0:7037ed05f54f 1122 case JOIN_FAILURE:
mbed_official 0:7037ed05f54f 1123 printf("\r\n OTAA Failed - Check Keys \r\n");
mbed_official 0:7037ed05f54f 1124 break;
mbed_official 26:f07f5febf97f 1125 case UPLINK_REQUIRED:
mbed_official 26:f07f5febf97f 1126 printf("\r\n Uplink required by NS \r\n");
mbed_official 26:f07f5febf97f 1127 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 1128 send_message();
mbed_official 26:f07f5febf97f 1129 }
mbed_official 26:f07f5febf97f 1130 break;
mbed_official 0:7037ed05f54f 1131 default:
mbed_official 0:7037ed05f54f 1132 MBED_ASSERT("Unknown Event");
mbed_official 0:7037ed05f54f 1133 }
mbed_official 0:7037ed05f54f 1134 }
mbed_official 0:7037ed05f54f 1135
mbed_official 0:7037ed05f54f 1136 // EOF