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:
Tue Sep 11 20:44:06 2018 +0000
Revision:
44:cf1070af05db
Parent:
43:c900cd8ea072
Child:
45:db9580357bc6
Added rnd/tmp radio self-checks and ACK check.

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 */
lpeters 36:dcc6f89fa39a 17
lpeters 44:cf1070af05db 18 //#define TARGET_LRAT1 1
lpeters 44:cf1070af05db 19 //#define TARGET_LRAT2 1
lpeters 35:73b3963c6dd3 20 #define TARGET_DISCO1 1
lpeters 35:73b3963c6dd3 21 //#define TARGET_DISCO2 1
lpeters 36:dcc6f89fa39a 22
lpeters 44:cf1070af05db 23 //#define ENABLE_TMPSENSOR 1
lpeters 44:cf1070af05db 24 //#define ENABLE_USBSERIAL 1
lpeters 44:cf1070af05db 25
lpeters 44:cf1070af05db 26 #include "stm32EEPROM.h"
Huot87 41:98266e454444 27 #include "foo.h"
lpeters 42:d59e50622292 28 int weGetSignal = 0;
Huot87 41:98266e454444 29
lpeters 37:df69df1bcb1a 30 #define DCHILL 600 // Cycle delay in chill mode.
lpeters 37:df69df1bcb1a 31 #define DPANIC 60 // Cycle delay in panic mode.
lpeters 44:cf1070af05db 32 //#define DGRACE 3 // Sensor timeout in seconds.
lpeters 37:df69df1bcb1a 33 #define NPANIC 5 // Number of unprovoked panic cycles before cooldown.
lpeters 37:df69df1bcb1a 34
lpeters 44:cf1070af05db 35 #if defined(TARGET_LRAT1) or defined(TARGET_LRAT2)
lpeters 44:cf1070af05db 36 #define TARGET_LRAT 1
lpeters 44:cf1070af05db 37 #endif
lpeters 44:cf1070af05db 38 #if defined(TARGET_DISCO1) or defined(TARGET_DISCO2)
lpeters 44:cf1070af05db 39 #define TARGET_DISCO 1
lpeters 44:cf1070af05db 40 #endif
lpeters 44:cf1070af05db 41
lpeters 44:cf1070af05db 42 #if (defined(TARGET_LRAT) or defined(TARGET_DISCO2)) and defined(ENABLE_USBSERIAL)
lpeters 44:cf1070af05db 43 #include "USBSerial.h"
lpeters 44:cf1070af05db 44 USBSerial serial;
lpeters 44:cf1070af05db 45 FileHandle* mbed::mbed_override_console(int) {
lpeters 44:cf1070af05db 46 return &serial;
lpeters 44:cf1070af05db 47 }
lpeters 44:cf1070af05db 48 #endif
lpeters 44:cf1070af05db 49
mbed_official 0:7037ed05f54f 50 #include <stdio.h>
tchari 30:ff249a9156dc 51 #include "mbed.h"
mbed_official 3:8c7198d1a2a1 52
mbed_official 0:7037ed05f54f 53 #include "lorawan/LoRaWANInterface.h"
mbed_official 0:7037ed05f54f 54 #include "lorawan/system/lorawan_data_structures.h"
mbed_official 0:7037ed05f54f 55 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 56
mbed_official 0:7037ed05f54f 57 // Application helpers
mbed_official 0:7037ed05f54f 58 #include "DummySensor.h"
mbed_official 0:7037ed05f54f 59 #include "trace_helper.h"
mbed_official 0:7037ed05f54f 60 #include "lora_radio_helper.h"
mbed_official 0:7037ed05f54f 61
tchari 30:ff249a9156dc 62 #include "mbed-trace/mbed_trace.h"
tchari 30:ff249a9156dc 63 #define TRACE_GROUP "MAIN"
tchari 30:ff249a9156dc 64
mbed_official 0:7037ed05f54f 65 using namespace events;
mbed_official 0:7037ed05f54f 66
mbed_official 12:5015dfead3f2 67 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
mbed_official 12:5015dfead3f2 68 // This example only communicates with much shorter messages (<30 bytes).
mbed_official 12:5015dfead3f2 69 // If longer messages are used, these buffers must be changed accordingly.
mbed_official 12:5015dfead3f2 70 uint8_t tx_buffer[30];
mbed_official 12:5015dfead3f2 71 uint8_t rx_buffer[30];
mbed_official 0:7037ed05f54f 72
mbed_official 0:7037ed05f54f 73 /*
mbed_official 0:7037ed05f54f 74 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
mbed_official 0:7037ed05f54f 75 */
mbed_official 0:7037ed05f54f 76 #define TX_TIMER 10000
mbed_official 0:7037ed05f54f 77
mbed_official 0:7037ed05f54f 78 /**
mbed_official 0:7037ed05f54f 79 * Maximum number of events for the event queue.
mbed_official 12:5015dfead3f2 80 * 10 is the safe number for the stack events, however, if application
mbed_official 0:7037ed05f54f 81 * also uses the queue for whatever purposes, this number should be increased.
mbed_official 0:7037ed05f54f 82 */
mbed_official 12:5015dfead3f2 83 #define MAX_NUMBER_OF_EVENTS 10
mbed_official 0:7037ed05f54f 84
mbed_official 0:7037ed05f54f 85 /**
mbed_official 0:7037ed05f54f 86 * Maximum number of retries for CONFIRMED messages before giving up
mbed_official 0:7037ed05f54f 87 */
Huot87 40:eaf476b94684 88 #define CONFIRMED_MSG_RETRY_COUNTER 3
mbed_official 0:7037ed05f54f 89
Huot87 40:eaf476b94684 90
Huot87 40:eaf476b94684 91 // HUOT NOTE -- THINK THIS CAN BE REMOVED
mbed_official 0:7037ed05f54f 92 /**
mbed_official 0:7037ed05f54f 93 * Dummy pin for dummy sensor
mbed_official 0:7037ed05f54f 94 */
Huot87 40:eaf476b94684 95 //#define PC_9 0
mbed_official 0:7037ed05f54f 96
mbed_official 0:7037ed05f54f 97 /**
mbed_official 0:7037ed05f54f 98 * Dummy sensor class object
mbed_official 0:7037ed05f54f 99 */
Huot87 40:eaf476b94684 100 //DS1820 ds1820(PC_9);
Huot87 40:eaf476b94684 101
Huot87 40:eaf476b94684 102 #define PACKET_LEN 11
mbed_official 0:7037ed05f54f 103
mbed_official 0:7037ed05f54f 104 /**
mbed_official 0:7037ed05f54f 105 * This event queue is the global event queue for both the
mbed_official 0:7037ed05f54f 106 * application and stack. To conserve memory, the stack is designed to run
mbed_official 0:7037ed05f54f 107 * in the same thread as the application and the application is responsible for
mbed_official 0:7037ed05f54f 108 * providing an event queue to the stack that will be used for ISR deferment as
mbed_official 0:7037ed05f54f 109 * well as application information event queuing.
mbed_official 0:7037ed05f54f 110 */
mbed_official 0:7037ed05f54f 111 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS * EVENTS_EVENT_SIZE);
mbed_official 0:7037ed05f54f 112
mbed_official 0:7037ed05f54f 113 /**
mbed_official 0:7037ed05f54f 114 * Event handler.
mbed_official 0:7037ed05f54f 115 *
mbed_official 0:7037ed05f54f 116 * This will be passed to the LoRaWAN stack to queue events for the
mbed_official 0:7037ed05f54f 117 * application which in turn drive the application.
mbed_official 0:7037ed05f54f 118 */
mbed_official 0:7037ed05f54f 119 static void lora_event_handler(lorawan_event_t event);
mbed_official 0:7037ed05f54f 120
mbed_official 0:7037ed05f54f 121 /**
mbed_official 2:dc95ac6d6d4e 122 * Constructing Mbed LoRaWANInterface and passing it down the radio object.
mbed_official 0:7037ed05f54f 123 */
mbed_official 2:dc95ac6d6d4e 124 static LoRaWANInterface lorawan(radio);
mbed_official 0:7037ed05f54f 125
mbed_official 0:7037ed05f54f 126 /**
mbed_official 0:7037ed05f54f 127 * Application specific callbacks
mbed_official 0:7037ed05f54f 128 */
mbed_official 0:7037ed05f54f 129 static lorawan_app_callbacks_t callbacks;
mbed_official 0:7037ed05f54f 130
lpeters 35:73b3963c6dd3 131 uint32_t mytime = 0;
lpeters 35:73b3963c6dd3 132 uint8_t mybatt = 0;
lpeters 35:73b3963c6dd3 133 double mylat = 0;
lpeters 35:73b3963c6dd3 134 double mylon = 0;
lpeters 33:e47306c32791 135
lpeters 33:e47306c32791 136 int16_t myAccX = 0;
lpeters 33:e47306c32791 137 int16_t myAccY = 0;
lpeters 33:e47306c32791 138 int16_t myAccZ = 0;
lpeters 33:e47306c32791 139 int16_t myMagX = 0;
lpeters 33:e47306c32791 140 int16_t myMagY = 0;
lpeters 33:e47306c32791 141 int16_t myMagZ = 0;
lpeters 33:e47306c32791 142 int16_t myOffX = 0;
lpeters 33:e47306c32791 143 int16_t myOffY = 0;
lpeters 33:e47306c32791 144 int16_t myOffZ = 0;
lpeters 33:e47306c32791 145 int16_t myTemp = 0;
lpeters 33:e47306c32791 146
lpeters 33:e47306c32791 147 int16_t accMinX = 0;
lpeters 33:e47306c32791 148 int16_t accMinY = 0;
lpeters 33:e47306c32791 149 int16_t accMinZ = 0;
lpeters 33:e47306c32791 150 int16_t accMaxX = 0;
lpeters 33:e47306c32791 151 int16_t accMaxY = 0;
lpeters 33:e47306c32791 152 int16_t accMaxZ = 0;
lpeters 33:e47306c32791 153
lpeters 33:e47306c32791 154 int16_t magMinX = 0;
lpeters 33:e47306c32791 155 int16_t magMinY = 0;
lpeters 33:e47306c32791 156 int16_t magMinZ = 0;
lpeters 33:e47306c32791 157 int16_t magMaxX = 0;
lpeters 33:e47306c32791 158 int16_t magMaxY = 0;
lpeters 33:e47306c32791 159 int16_t magMaxZ = 0;
lpeters 33:e47306c32791 160
lpeters 33:e47306c32791 161 #define NEOM8M_ADR_GPS 0x84
lpeters 34:341fb423e74b 162 //#define LSM303_ADR_ACC 0x32
lpeters 33:e47306c32791 163 #define LSM303_ADR_MAG 0x3C
tchari 30:ff249a9156dc 164
lpeters 33:e47306c32791 165 #define NEOM8M_REG_GPS_LENH 0xFD
lpeters 33:e47306c32791 166 #define NEOM8M_REG_GPS_LENL 0xFE
lpeters 33:e47306c32791 167 #define NEOM8M_REG_GPS_DATA 0xFE
lpeters 33:e47306c32791 168 #define LSM303_REG_ACC_STATUS_REG_AUX_A 0x07
lpeters 34:341fb423e74b 169 //#define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C
lpeters 34:341fb423e74b 170 //#define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D
lpeters 33:e47306c32791 171 #define LSM303_REG_ACC_WHO_AM_I_A 0x0F
lpeters 34:341fb423e74b 172 //#define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F
lpeters 33:e47306c32791 173 #define LSM303_REG_ACC_CTRL_REG1_A 0x20
lpeters 33:e47306c32791 174 #define LSM303_REG_ACC_CTRL_REG2_A 0x21
lpeters 33:e47306c32791 175 #define LSM303_REG_ACC_CTRL_REG3_A 0x22
lpeters 33:e47306c32791 176 #define LSM303_REG_ACC_CTRL_REG4_A 0x23
lpeters 33:e47306c32791 177 #define LSM303_REG_ACC_CTRL_REG5_A 0x24
lpeters 34:341fb423e74b 178 #define LSM303_REG_ACC_CTRL_REG6_A 0x25
lpeters 33:e47306c32791 179 #define LSM303_REG_ACC_STATUS_REG_A 0x27
lpeters 33:e47306c32791 180 #define LSM303_REG_ACC_OUT_X_L_A 0x28
lpeters 33:e47306c32791 181 #define LSM303_REG_ACC_OUT_X_H_A 0x29
lpeters 33:e47306c32791 182 #define LSM303_REG_ACC_OUT_Y_L_A 0x2A
lpeters 33:e47306c32791 183 #define LSM303_REG_ACC_OUT_Y_H_A 0x2B
lpeters 33:e47306c32791 184 #define LSM303_REG_ACC_OUT_Z_L_A 0x2C
lpeters 33:e47306c32791 185 #define LSM303_REG_ACC_OUT_Z_H_A 0x2D
lpeters 33:e47306c32791 186 #define LSM303_REG_ACC_INT1_CFG_A 0x30
lpeters 33:e47306c32791 187 #define LSM303_REG_ACC_INT1_SRC_A 0x31
lpeters 33:e47306c32791 188 #define LSM303_REG_ACC_INT1_THS_A 0x32
lpeters 33:e47306c32791 189 #define LSM303_REG_ACC_INT1_DURATION_A 0x33
lpeters 35:73b3963c6dd3 190
lpeters 33:e47306c32791 191 #define LSM303_REG_MAG_OFFSET_X_REG_L_M 0x45
lpeters 33:e47306c32791 192 #define LSM303_REG_MAG_OFFSET_X_REG_H_M 0x46
lpeters 33:e47306c32791 193 #define LSM303_REG_MAG_OFFSET_Y_REG_L_M 0x47
lpeters 33:e47306c32791 194 #define LSM303_REG_MAG_OFFSET_Y_REG_H_M 0x48
lpeters 33:e47306c32791 195 #define LSM303_REG_MAG_OFFSET_Z_REG_L_M 0x49
lpeters 33:e47306c32791 196 #define LSM303_REG_MAG_OFFSET_Z_REG_H_M 0x4A
lpeters 34:341fb423e74b 197 //#define LSM303_REG_MAG_WHO_AM_I_M 0x4F
lpeters 34:341fb423e74b 198 //#define LSM303_REG_MAG_CFG_REG_A_M 0x60
lpeters 34:341fb423e74b 199 //#define LSM303_REG_MAG_CFG_REG_B_M 0x61
lpeters 34:341fb423e74b 200 //#define LSM303_REG_MAG_CFG_REG_C_M 0x62
lpeters 33:e47306c32791 201 #define LSM303_REG_MAG_INT_CTRL_REG_M 0x63
lpeters 33:e47306c32791 202 #define LSM303_REG_MAG_INT_SOURCE_REG_M 0x64
lpeters 33:e47306c32791 203 #define LSM303_REG_MAG_INT_THS_L_REG_M 0x65
lpeters 33:e47306c32791 204 #define LSM303_REG_MAG_INT_THS_H_REG_M 0x66
lpeters 34:341fb423e74b 205 //#define LSM303_REG_MAG_STATUS_REG_M 0x67
lpeters 34:341fb423e74b 206 //#define LSM303_REG_MAG_OUTX_L_REG_M 0x68
lpeters 34:341fb423e74b 207 //#define LSM303_REG_MAG_OUTX_H_REG_M 0x69
lpeters 34:341fb423e74b 208 //#define LSM303_REG_MAG_OUTY_L_REG_M 0x6A
lpeters 34:341fb423e74b 209 //#define LSM303_REG_MAG_OUTY_H_REG_M 0x6B
lpeters 34:341fb423e74b 210 //#define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C
lpeters 34:341fb423e74b 211 //#define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D
lpeters 33:e47306c32791 212
lpeters 35:73b3963c6dd3 213 #define EEPROM_MAX 0x17FF
lpeters 35:73b3963c6dd3 214
lpeters 34:341fb423e74b 215 #if defined(TARGET_LRAT)
lpeters 44:cf1070af05db 216 #if defined(TARGET_LRAT2)
lpeters 44:cf1070af05db 217 #define LEDR PB_7
lpeters 44:cf1070af05db 218 #define LEDG PB_6
lpeters 44:cf1070af05db 219 #define LEDB PB_2
lpeters 44:cf1070af05db 220 #define LEDW PB_5
lpeters 44:cf1070af05db 221 #else
lpeters 44:cf1070af05db 222 #define LEDR PB_6
lpeters 44:cf1070af05db 223 #define LEDG PB_7
lpeters 44:cf1070af05db 224 #define LEDB PB_5
lpeters 44:cf1070af05db 225 #define LEDW PB_2
lpeters 44:cf1070af05db 226 #endif
lpeters 35:73b3963c6dd3 227 #define PIN_ACC PB_14
lpeters 35:73b3963c6dd3 228 #define PIN_MAG PB_12
lpeters 35:73b3963c6dd3 229 #define PIN_BTN PA_5
lpeters 35:73b3963c6dd3 230 #define PIN_ALT PA_4
lpeters 34:341fb423e74b 231 #define LSM303_ADR_ACC 0x3A
lpeters 34:341fb423e74b 232 #define LSM303_REG_MAG_WHO_AM_I_M 0x0F
lpeters 34:341fb423e74b 233 #define LSM303_WHO_ACC 0x41
lpeters 34:341fb423e74b 234 #define LSM303_WHO_MAG 0x3D
lpeters 34:341fb423e74b 235 #define LSM303_CTRL_REG7_A 0x26
lpeters 34:341fb423e74b 236 #define LSM303_REG_MAG_CTRL_REG1_M 0x20
lpeters 34:341fb423e74b 237 #define LSM303_REG_MAG_CTRL_REG2_M 0x21
lpeters 34:341fb423e74b 238 #define LSM303_REG_MAG_CTRL_REG3_M 0x22
lpeters 34:341fb423e74b 239 #define LSM303_REG_MAG_CTRL_REG4_M 0x23
lpeters 34:341fb423e74b 240 #define LSM303_REG_MAG_CTRL_REG5_M 0x24
lpeters 34:341fb423e74b 241 #define LSM303_REG_MAG_STATUS_REG_M 0x27
lpeters 34:341fb423e74b 242 #define LSM303_REG_MAG_OUTX_L_REG_M 0x28
lpeters 34:341fb423e74b 243 #define LSM303_REG_MAG_OUTX_H_REG_M 0x29
lpeters 34:341fb423e74b 244 #define LSM303_REG_MAG_OUTY_L_REG_M 0x2A
lpeters 34:341fb423e74b 245 #define LSM303_REG_MAG_OUTY_H_REG_M 0x2B
lpeters 34:341fb423e74b 246 #define LSM303_REG_MAG_OUTZ_L_REG_M 0x2C
lpeters 34:341fb423e74b 247 #define LSM303_REG_MAG_OUTZ_H_REG_M 0x2D
lpeters 34:341fb423e74b 248 #define LSM303_REG_MAG_TEMP_L_M 0x2E
lpeters 34:341fb423e74b 249 #define LSM303_REG_MAG_TEMP_H_M 0x2F
lpeters 34:341fb423e74b 250 #define LSM303_REG_MAG_TEMP_CFG_REG_A 0x1F
lpeters 34:341fb423e74b 251 #define CFG_ACC_ADR LSM303_REG_ACC_CTRL_REG1_A
lpeters 34:341fb423e74b 252 #define CFG_ACC_LEN 7
lpeters 34:341fb423e74b 253 #define CFG_MAG_ADR LSM303_REG_MAG_CTRL_REG1_M
lpeters 34:341fb423e74b 254 #define CFG_MAG_LEN 5
Huot87 39:6da6cb44f22e 255
Huot87 39:6da6cb44f22e 256 // HUOT ADDITIONS -- 08/30/2018 -- Port of LRAT LSM303CTR ACC Register definitions
Huot87 39:6da6cb44f22e 257 // LSM303CTR Specific ACC Register ID's
Huot87 39:6da6cb44f22e 258 #define LSM303_REG_ACC_INT1_THS_X1_A 0x32
Huot87 39:6da6cb44f22e 259 #define LSM303_REG_ACC_INT1_THS_Y1_A 0x33
Huot87 39:6da6cb44f22e 260 #define LSM303_REG_ACC_INT1_THS_Z1_A 0x34
Huot87 39:6da6cb44f22e 261 #define LSM303_REG_ACC_INT1_DURATION_A 0x35
Huot87 39:6da6cb44f22e 262 #define LSM303_REG_ACC_INT2_CFG_A 0x36
Huot87 39:6da6cb44f22e 263 #define LSM303_REG_ACC_INT2_SRC_A 0x37
Huot87 39:6da6cb44f22e 264 #define LSM303_REG_ACC_INT2_THS_A 0x38
Huot87 39:6da6cb44f22e 265 #define LSM303_REG_ACC_INT2_DURATION_A 0x39
Huot87 39:6da6cb44f22e 266 #define LSM303_REG_ACC_XL_REFERENCE 0x3A
Huot87 39:6da6cb44f22e 267 #define LSM303_REG_ACC_XH_REFERENCE 0x3B
Huot87 39:6da6cb44f22e 268 #define LSM303_REG_ACC_YL_REFERENCE 0x3C
Huot87 39:6da6cb44f22e 269 #define LSM303_REG_ACC_YH_REFERENCE 0x3D
Huot87 39:6da6cb44f22e 270 #define LSM303_REG_ACC_ZL_REFERENCE 0x3E
Huot87 39:6da6cb44f22e 271 #define LSM303_REG_ACC_ZH_REFERENCE 0x3F
Huot87 39:6da6cb44f22e 272
lpeters 34:341fb423e74b 273 #else
lpeters 34:341fb423e74b 274 #define LEDR PB_7
lpeters 34:341fb423e74b 275 #define LEDG PB_5
lpeters 34:341fb423e74b 276 #define LEDB PB_6
lpeters 34:341fb423e74b 277 #define LEDW PA_5
lpeters 35:73b3963c6dd3 278 #define PIN_ACC PB_14 // Not really.
lpeters 35:73b3963c6dd3 279 #if defined(TARGET_DISCO2)
lpeters 35:73b3963c6dd3 280 #define PIN_MAG PB_13
lpeters 37:df69df1bcb1a 281 #define PIN_GPS PA_10
lpeters 35:73b3963c6dd3 282 #else
lpeters 35:73b3963c6dd3 283 #define PIN_MAG PA_10
lpeters 37:df69df1bcb1a 284 #define PIN_GPS PB_13
lpeters 35:73b3963c6dd3 285 #endif
lpeters 35:73b3963c6dd3 286 #define PIN_BTN PB_2
lpeters 34:341fb423e74b 287 #define LSM303_ADR_ACC 0x32
lpeters 34:341fb423e74b 288 #define LSM303_REG_MAG_WHO_AM_I_M 0x4F
lpeters 34:341fb423e74b 289 #define LSM303_WHO_ACC 0x33
lpeters 34:341fb423e74b 290 #define LSM303_WHO_MAG 0x40
lpeters 34:341fb423e74b 291 #define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C
lpeters 34:341fb423e74b 292 #define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D
lpeters 34:341fb423e74b 293 #define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F
lpeters 34:341fb423e74b 294 #define LSM303_REG_MAG_CFG_REG_A_M 0x60
lpeters 34:341fb423e74b 295 #define LSM303_REG_MAG_CFG_REG_B_M 0x61
lpeters 34:341fb423e74b 296 #define LSM303_REG_MAG_CFG_REG_C_M 0x62
lpeters 34:341fb423e74b 297 #define LSM303_REG_MAG_STATUS_REG_M 0x67
lpeters 34:341fb423e74b 298 #define LSM303_REG_MAG_OUTX_L_REG_M 0x68
lpeters 34:341fb423e74b 299 #define LSM303_REG_MAG_OUTX_H_REG_M 0x69
lpeters 34:341fb423e74b 300 #define LSM303_REG_MAG_OUTY_L_REG_M 0x6A
lpeters 34:341fb423e74b 301 #define LSM303_REG_MAG_OUTY_H_REG_M 0x6B
lpeters 34:341fb423e74b 302 #define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C
lpeters 34:341fb423e74b 303 #define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D
lpeters 34:341fb423e74b 304 #define CFG_ACC_ADR LSM303_REG_ACC_TEMP_CFG_REG_A // Start Disco at TEMP CFG.
lpeters 34:341fb423e74b 305 #define CFG_ACC_LEN 7
lpeters 34:341fb423e74b 306 #define CFG_MAG_ADR LSM303_REG_MAG_CFG_REG_A_M
lpeters 34:341fb423e74b 307 #define CFG_MAG_LEN 3
lpeters 34:341fb423e74b 308 #endif
tchari 30:ff249a9156dc 309
tchari 30:ff249a9156dc 310 I2C i2c(PB_9, PB_8);
lpeters 35:73b3963c6dd3 311 InterruptIn accPin(PIN_ACC);
lpeters 35:73b3963c6dd3 312 InterruptIn magPin(PIN_MAG);
lpeters 35:73b3963c6dd3 313 InterruptIn btnPin(PIN_BTN);
lpeters 33:e47306c32791 314
lpeters 37:df69df1bcb1a 315 #if defined(TARGET_DISCO1) or defined(TARGET_DISCO2)
lpeters 37:df69df1bcb1a 316 DigitalOut gpsPin(PIN_GPS);
lpeters 37:df69df1bcb1a 317 #endif
lpeters 37:df69df1bcb1a 318
lpeters 35:73b3963c6dd3 319 uint8_t cfg;
lpeters 33:e47306c32791 320 char ret;
lpeters 33:e47306c32791 321 char rda = '\0';
lpeters 33:e47306c32791 322 char cmd[2];
lpeters 37:df69df1bcb1a 323 //char buf[83];
lpeters 37:df69df1bcb1a 324 char buf[192];
lpeters 35:73b3963c6dd3 325 uint8_t pos = 0;
lpeters 35:73b3963c6dd3 326
lpeters 33:e47306c32791 327 int accShift = 0;
lpeters 33:e47306c32791 328 int accScale = 0;
lpeters 33:e47306c32791 329 int accEvent = 0;
lpeters 35:73b3963c6dd3 330 uint8_t accSFire = 0;
lpeters 35:73b3963c6dd3 331 uint8_t accHFire = 0;
lpeters 35:73b3963c6dd3 332 uint8_t accSLIRQ = 0;
lpeters 35:73b3963c6dd3 333 uint8_t accSHIRQ = 0;
lpeters 33:e47306c32791 334 int magEvent = 0;
lpeters 35:73b3963c6dd3 335 uint8_t magSFire = 0;
lpeters 35:73b3963c6dd3 336 uint8_t magHFire = 0;
lpeters 35:73b3963c6dd3 337 uint8_t magSLIRQ = 0;
lpeters 35:73b3963c6dd3 338 uint8_t magSHIRQ = 0;
lpeters 35:73b3963c6dd3 339 uint8_t btnHFire = 0;
lpeters 33:e47306c32791 340
lpeters 35:73b3963c6dd3 341 char *res;
lpeters 35:73b3963c6dd3 342 char sPass[26] = "[\u001b[32mPASS\u001b[0m]";
lpeters 35:73b3963c6dd3 343 char sFail[26] = "[\u001b[31mFAIL\u001b[0m]";
lpeters 33:e47306c32791 344 char cmdSendLoop[9] = "SendLoop";
lpeters 37:df69df1bcb1a 345 //char cmdStopGNSS[14] = {0xB5, 0x62, 0x06, 0x57, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x4F, 0x50};
lpeters 37:df69df1bcb1a 346
lpeters 37:df69df1bcb1a 347 //#define CMDSTOPGNSS {0xFF, 0xB5, 0x62, 0x06, 0x57, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x4F, 0x50}
lpeters 37:df69df1bcb1a 348 //char cmdStopGNSS[16] {0xB5, 0x62, 0x06, 0x57, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // Leave 2 bytes for CRC.
lpeters 37:df69df1bcb1a 349 //char cmdStopGNSS[16] {0xB5, 0x62, 0x06, 0x57, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x54, 0x4F, 0x50}; // Leave 2 bytes for CRC.
Huot87 38:fd7a407bfe3e 350 char cmdStopGNSS[16] {0xB5, 0x62, 0x06, 0x57, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x4F, 0x54, 0x53}; // Leave 2 bytes for CRC. // Note Byte character is Little Endian from what doc says
lpeters 37:df69df1bcb1a 351 char cmdReadGNSS[8] {0xB5, 0x62, 0x06, 0x57, 0x00, 0x00};
lpeters 37:df69df1bcb1a 352 char cmdReadCfgU[8] {0xB5, 0x62, 0x06, 0x1B, 0x00, 0x00}; // Leave 2 bytes for CRC.
lpeters 37:df69df1bcb1a 353 char cmdPollPort[9] {0xB5, 0x62, 0x06, 0x00, 0x01, 0x00, 0x00};
lpeters 33:e47306c32791 354
Huot87 39:6da6cb44f22e 355 // HUOT ADDITIONS - 08/29/18 -- ADDED UBX-CFG CHAR BUFFERS -- BOTTOM TWO WORK!
Huot87 38:fd7a407bfe3e 356 // UBX-CFG-GNSS -- Disable Glonass (also leave 2 bytes)
Huot87 38:fd7a407bfe3e 357 char cmdDisableGLONASS[68] {0xB5, 0x62, 0x06, 0x3E, 0x3C, 0x00, 0x00, 0x20, 0x20, 0x07, 0x00, 0x08, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x08, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x05, 0x06, 0x08, 0x0E, 0x00, 0x01, 0x00, 0x01, 0x01};
Huot87 38:fd7a407bfe3e 358 // UBX-CFG-TP5 -- Disable Timepulse (also leave 2 bytes)
Huot87 38:fd7a407bfe3e 359 char cmdDisableTimePulse[40] {0xB5, 0x62, 0x06, 0x31, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0F, 0x00, 0x40, 0x42, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00};
Huot87 38:fd7a407bfe3e 360 // UBX-CFG-PM2 -- Configure Power Management Setup (also leave 2 bytes)
Huot87 38:fd7a407bfe3e 361 char cmdConfigPMS[52] {0xB5, 0x62, 0x06, 0x3B, 0x2C, 0x00, 0x01, 0x06, 0x00, 0x00, 0x2E, 0x08, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x4F, 0xC1, 0x03, 0x00, 0x86, 0x02, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x64, 0x40, 0x01, 0x00, 0x56, 0xA4};
Huot87 38:fd7a407bfe3e 362 char cmdSaveConfig[21] {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}; // UBX-CFG-CFG -- Save Configuration (also leave 2 bytes)
Huot87 38:fd7a407bfe3e 363 char cmdResetDefaults[21] {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x03}; // UBX-CFG-CFG -- Reset to Defaults (also leave 2 bytes)
Huot87 38:fd7a407bfe3e 364
Huot87 38:fd7a407bfe3e 365 // THIS WORKS
Huot87 40:eaf476b94684 366 char lowPowerMode[10] {0xB5, 0x62, 0x06, 0x11, 0x02, 0x00, 0x48, 0x01};
Huot87 38:fd7a407bfe3e 367 char secondTimeSleep[12] {0xB5, 0x62, 0x06, 0x04, 0x04, 0x00, 0x00, 0x00,0x08, 0x00};
Huot87 38:fd7a407bfe3e 368 char secondTimeAwake[12] {0xB5, 0x62, 0x06, 0x04, 0x04, 0x00, 0x00, 0x00,0x09, 0x00};
Huot87 38:fd7a407bfe3e 369
Huot87 40:eaf476b94684 370
Huot87 40:eaf476b94684 371 // HUOT ADDITIONS -- 08/31/2018 -- EEPROM Variables
Huot87 40:eaf476b94684 372 bool wasEEPROM = false;
Huot87 40:eaf476b94684 373 bool continueSending = true;
Huot87 40:eaf476b94684 374 int eepromCounter = 0;
Huot87 40:eaf476b94684 375 int registerLocation = 0;
Huot87 40:eaf476b94684 376
lpeters 35:73b3963c6dd3 377 time_t tInit = 0;
lpeters 35:73b3963c6dd3 378 time_t tBump = 0;
lpeters 35:73b3963c6dd3 379 time_t tLast = 0;
lpeters 35:73b3963c6dd3 380 time_t tNext = 0;
lpeters 36:dcc6f89fa39a 381 time_t tSend = 0;
lpeters 37:df69df1bcb1a 382 time_t tCalm = 0;
lpeters 35:73b3963c6dd3 383
lpeters 34:341fb423e74b 384 DigitalOut myLedR(LEDR);
lpeters 34:341fb423e74b 385 DigitalOut myLedG(LEDG);
lpeters 34:341fb423e74b 386 DigitalOut myLedB(LEDB);
lpeters 34:341fb423e74b 387 DigitalOut myLedW(LEDW);
lpeters 34:341fb423e74b 388
lpeters 34:341fb423e74b 389 void magInitSequence();
lpeters 34:341fb423e74b 390 void accInitSequence();
lpeters 34:341fb423e74b 391 void gpsInitSequence();
Huot87 40:eaf476b94684 392 // HUOT ADDITION -- 08/30/2018
Huot87 38:fd7a407bfe3e 393 void gpsExecuteCommand(char *command, int length);
lpeters 34:341fb423e74b 394 void tmpRead();
lpeters 34:341fb423e74b 395 void magRead();
lpeters 34:341fb423e74b 396 void accRead();
Huot87 38:fd7a407bfe3e 397 int gpsRead();
lpeters 37:df69df1bcb1a 398 void ubxRead();
lpeters 36:dcc6f89fa39a 399 void send_message();
lpeters 42:d59e50622292 400 void send_backlog();
Huot87 40:eaf476b94684 401 // HUOT ADDITION -- 08/31/2018
Huot87 40:eaf476b94684 402 void backupPacket();
Huot87 40:eaf476b94684 403 void prepBacklogSend();
lpeters 34:341fb423e74b 404
lpeters 35:73b3963c6dd3 405 void onBtnIrq()
lpeters 35:73b3963c6dd3 406 {
lpeters 35:73b3963c6dd3 407 btnHFire++;
lpeters 36:dcc6f89fa39a 408 tSend = 0;
lpeters 35:73b3963c6dd3 409 }
lpeters 35:73b3963c6dd3 410
lpeters 33:e47306c32791 411 void onAccIrq()
lpeters 33:e47306c32791 412 {
lpeters 33:e47306c32791 413 accHFire++;
lpeters 36:dcc6f89fa39a 414 tSend = 0;
lpeters 33:e47306c32791 415 }
lpeters 33:e47306c32791 416
lpeters 33:e47306c32791 417 void onMagIrq()
lpeters 33:e47306c32791 418 {
lpeters 33:e47306c32791 419 magHFire++;
lpeters 36:dcc6f89fa39a 420 tSend = 0;
lpeters 33:e47306c32791 421 }
lpeters 33:e47306c32791 422
lpeters 33:e47306c32791 423 void accDumpCfg()
lpeters 33:e47306c32791 424 {
lpeters 34:341fb423e74b 425 char start = CFG_ACC_ADR;
lpeters 34:341fb423e74b 426 for (int i = 0; i < CFG_ACC_LEN; i++)
lpeters 33:e47306c32791 427 {
lpeters 33:e47306c32791 428 cmd[0] = start + i;
lpeters 33:e47306c32791 429 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 430 i2c.read(LSM303_ADR_ACC, &buf[i], 1);
lpeters 33:e47306c32791 431 }
lpeters 34:341fb423e74b 432 printf("CFGACC: | ");
lpeters 34:341fb423e74b 433 for (int i = 0; i < CFG_ACC_LEN; i++)
lpeters 34:341fb423e74b 434 {
lpeters 34:341fb423e74b 435 printf("%02X ", buf[i]);
lpeters 34:341fb423e74b 436 }
lpeters 34:341fb423e74b 437 printf("|\r\n");
lpeters 33:e47306c32791 438 }
lpeters 33:e47306c32791 439
lpeters 33:e47306c32791 440 void magDumpCfg()
lpeters 33:e47306c32791 441 {
lpeters 34:341fb423e74b 442 char start = CFG_MAG_ADR;
lpeters 34:341fb423e74b 443 for (int i = 0; i < CFG_MAG_LEN; i++)
lpeters 33:e47306c32791 444 {
lpeters 33:e47306c32791 445 cmd[0] = start + i;
lpeters 33:e47306c32791 446 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 447 i2c.read(LSM303_ADR_MAG, &buf[i], 1);
lpeters 33:e47306c32791 448 }
lpeters 34:341fb423e74b 449 printf("CFGMAG: | ");
lpeters 34:341fb423e74b 450 for (int i = 0; i < CFG_MAG_LEN; i++)
lpeters 34:341fb423e74b 451 {
lpeters 34:341fb423e74b 452 printf("%02X ", buf[i]);
lpeters 34:341fb423e74b 453 }
lpeters 34:341fb423e74b 454 printf("|\r\n");
lpeters 33:e47306c32791 455 }
lpeters 33:e47306c32791 456
lpeters 37:df69df1bcb1a 457 // Clear any pending MAG IRQs
lpeters 42:d59e50622292 458 inline void magWipeIrq()
lpeters 42:d59e50622292 459 {
lpeters 37:df69df1bcb1a 460 cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M;
lpeters 37:df69df1bcb1a 461 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 37:df69df1bcb1a 462 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 37:df69df1bcb1a 463 }
lpeters 37:df69df1bcb1a 464
lpeters 44:cf1070af05db 465 void bootFlash()
mbed_official 0:7037ed05f54f 466 {
lpeters 34:341fb423e74b 467 for (int i = 0; i <= 64; i++)
lpeters 33:e47306c32791 468 {
lpeters 34:341fb423e74b 469 myLedR = i & 0x01;
lpeters 34:341fb423e74b 470 myLedG = i & 0x02;
lpeters 34:341fb423e74b 471 myLedB = i & 0x04;
lpeters 34:341fb423e74b 472 myLedW = i & 0x08;
lpeters 34:341fb423e74b 473 wait(0.01);
lpeters 33:e47306c32791 474 }
lpeters 44:cf1070af05db 475 }
lpeters 44:cf1070af05db 476
lpeters 44:cf1070af05db 477 void byteFlash(DigitalOut *scl, DigitalOut *sda, uint8_t dat)
lpeters 44:cf1070af05db 478 {
lpeters 44:cf1070af05db 479 *sda = 0;
lpeters 44:cf1070af05db 480 *scl = 1;
lpeters 44:cf1070af05db 481 for (int i = 0; i < 8; i++)
lpeters 44:cf1070af05db 482 {
lpeters 44:cf1070af05db 483 *sda = (dat >> (7 - i)) & 0x01;
lpeters 44:cf1070af05db 484 wait(0.125);
lpeters 44:cf1070af05db 485 }
lpeters 44:cf1070af05db 486 *sda = 0;
lpeters 44:cf1070af05db 487 *scl = 0;
lpeters 44:cf1070af05db 488 }
lpeters 44:cf1070af05db 489
lpeters 44:cf1070af05db 490 void quadFlash(DigitalOut *scl, DigitalOut *sda, uint32_t dat)
lpeters 44:cf1070af05db 491 {
lpeters 44:cf1070af05db 492 *sda = 0;
lpeters 44:cf1070af05db 493 *scl = 1;
lpeters 44:cf1070af05db 494 for (int i = 0; i < 32; i++)
lpeters 44:cf1070af05db 495 {
lpeters 44:cf1070af05db 496 *sda = (dat >> (31 - i)) & 0x01;
lpeters 44:cf1070af05db 497 wait(0.125);
lpeters 44:cf1070af05db 498 }
lpeters 44:cf1070af05db 499 *sda = 0;
lpeters 44:cf1070af05db 500 *scl = 0;
lpeters 44:cf1070af05db 501 }
lpeters 44:cf1070af05db 502
lpeters 44:cf1070af05db 503 void quadFlash2(DigitalOut *scl, DigitalOut *sdaL, DigitalOut *sdaH, uint32_t dat)
lpeters 44:cf1070af05db 504 {
lpeters 44:cf1070af05db 505 *sdaL = 0;
lpeters 44:cf1070af05db 506 *sdaH = 0;
lpeters 44:cf1070af05db 507 *scl = 1;
lpeters 44:cf1070af05db 508 for (int i = 0; i < 32; i++)
lpeters 44:cf1070af05db 509 {
lpeters 44:cf1070af05db 510 *sdaH = (dat >> (31 - i)) & 0x01;
lpeters 44:cf1070af05db 511 *sdaL = !*sdaH;
lpeters 44:cf1070af05db 512 wait(0.125);
lpeters 44:cf1070af05db 513 }
lpeters 44:cf1070af05db 514 *sdaL = 0;
lpeters 44:cf1070af05db 515 *sdaH = 0;
lpeters 44:cf1070af05db 516 *scl = 0;
lpeters 44:cf1070af05db 517 }
lpeters 44:cf1070af05db 518
lpeters 44:cf1070af05db 519 /**
lpeters 44:cf1070af05db 520 * Entry point for application
lpeters 44:cf1070af05db 521 */
lpeters 44:cf1070af05db 522 int main (void)
lpeters 44:cf1070af05db 523 {
lpeters 44:cf1070af05db 524 //i2c.frequency(400000);
lpeters 44:cf1070af05db 525 for (int i = 0; i < 5; i++)
lpeters 44:cf1070af05db 526 {
lpeters 44:cf1070af05db 527 myLedR = i == 0;
lpeters 44:cf1070af05db 528 myLedG = i == 1;
lpeters 44:cf1070af05db 529 myLedB = i == 2;
lpeters 44:cf1070af05db 530 myLedW = i == 3;
lpeters 44:cf1070af05db 531 wait(0.25);
lpeters 44:cf1070af05db 532 }
lpeters 44:cf1070af05db 533 quadFlash(&myLedW,&myLedB,0xFF0F3355);
lpeters 44:cf1070af05db 534 printf("\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n");
lpeters 44:cf1070af05db 535
lpeters 44:cf1070af05db 536 // Boot Flash
lpeters 44:cf1070af05db 537 bootFlash();
lpeters 44:cf1070af05db 538 wait(1);
lpeters 35:73b3963c6dd3 539 // btnPin.rise(&onBtnIrq);
lpeters 37:df69df1bcb1a 540 printf("Boot flash complete.\r\n");
lpeters 44:cf1070af05db 541
mbed_official 0:7037ed05f54f 542 // setup tracing
mbed_official 0:7037ed05f54f 543 setup_trace();
mbed_official 0:7037ed05f54f 544
lpeters 37:df69df1bcb1a 545 printf("Trace setup complete.\r\n");
lpeters 37:df69df1bcb1a 546
mbed_official 0:7037ed05f54f 547 // stores the status of a call to LoRaWAN protocol
mbed_official 0:7037ed05f54f 548 lorawan_status_t retcode;
lpeters 33:e47306c32791 549
lpeters 37:df69df1bcb1a 550 printf("Pre-sensor init.\r\n");
lpeters 37:df69df1bcb1a 551
lpeters 34:341fb423e74b 552 /* I2C init */
lpeters 34:341fb423e74b 553 ret = 0x00;
lpeters 44:cf1070af05db 554 #ifndef TARGET_LRAT2
lpeters 34:341fb423e74b 555 magDumpCfg();
lpeters 34:341fb423e74b 556 accDumpCfg();
lpeters 34:341fb423e74b 557 magInitSequence();
lpeters 34:341fb423e74b 558 accInitSequence();
Huot87 38:fd7a407bfe3e 559
Huot87 39:6da6cb44f22e 560 // HUOT ADDITION -- 08/30/2018 -- RESET GPS TO DEFAULT BEFORE MOVING FORWARD
lpeters 44:cf1070af05db 561 printf("Resetting GPS config...\r\n");
Huot87 38:fd7a407bfe3e 562 gpsExecuteCommand(cmdResetDefaults, sizeof(cmdResetDefaults));
lpeters 44:cf1070af05db 563 printf("Performing initial read...\r\n");
lpeters 34:341fb423e74b 564 gpsInitSequence();
lpeters 33:e47306c32791 565 magDumpCfg();
lpeters 33:e47306c32791 566 accDumpCfg();
lpeters 37:df69df1bcb1a 567 printf("Post-sensor init.\r\n");
lpeters 44:cf1070af05db 568 #endif
lpeters 33:e47306c32791 569
lpeters 44:cf1070af05db 570 /*
lpeters 34:341fb423e74b 571 cfg = 0x00;
lpeters 34:341fb423e74b 572 #if defined(TARGET_LRAT)
lpeters 33:e47306c32791 573 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 574 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 575 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 576 cfg |= (ret & 0x80) >> 7;
lpeters 33:e47306c32791 577 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 578 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 579 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 580 accScale = 1 << (!(ret & 0x30) ? 0 : ((ret & 0x30) >> 4) - 1);
lpeters 34:341fb423e74b 581 cmd[0] = LSM303_REG_MAG_CTRL_REG2_M;
lpeters 34:341fb423e74b 582 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 583 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 34:341fb423e74b 584 cfg |= (ret & 0x60) >> 1;
lpeters 34:341fb423e74b 585 //accShift = 0; // Full 16-bit resolution
lpeters 34:341fb423e74b 586 accShift = 4;
lpeters 34:341fb423e74b 587 #else
lpeters 33:e47306c32791 588 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 33:e47306c32791 589 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 590 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 591 cfg |= (ret & 0x08) >> 3;
lpeters 33:e47306c32791 592 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 33:e47306c32791 593 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 33:e47306c32791 594 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 33:e47306c32791 595 cfg |= (ret & 0x08) >> 2;
lpeters 33:e47306c32791 596 accScale = 1 << ((ret & 0x30) >> 4);
lpeters 33:e47306c32791 597 cmd[0] = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 33:e47306c32791 598 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 33:e47306c32791 599 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 33:e47306c32791 600 cfg |= (ret & 0x10);
lpeters 33:e47306c32791 601 if (cfg & 0x01)
lpeters 33:e47306c32791 602 accShift = 8;
lpeters 33:e47306c32791 603 else if (cfg & 0x02)
lpeters 33:e47306c32791 604 accShift = 4;
lpeters 33:e47306c32791 605 else
lpeters 33:e47306c32791 606 accShift = 6;
lpeters 34:341fb423e74b 607 #endif
lpeters 33:e47306c32791 608 printf("Quality: %02x AccShift: %d AccScale: %d\r\n", cfg, accShift, accScale);
lpeters 44:cf1070af05db 609 */
lpeters 33:e47306c32791 610
lpeters 35:73b3963c6dd3 611 time_t tNow;
lpeters 35:73b3963c6dd3 612 /*
lpeters 35:73b3963c6dd3 613 // while(1)
lpeters 35:73b3963c6dd3 614 // {
lpeters 35:73b3963c6dd3 615 tNow = time(NULL);
lpeters 35:73b3963c6dd3 616 printf("RTC: %08X\r\n", tNow);
lpeters 44:cf1070af05db 617 #if defined(ENABLE_TMPSENSOR)
lpeters 34:341fb423e74b 618 tmpRead();
lpeters 34:341fb423e74b 619 #endif
lpeters 34:341fb423e74b 620 magRead();
lpeters 34:341fb423e74b 621 accRead();
lpeters 34:341fb423e74b 622 gpsRead();
lpeters 35:73b3963c6dd3 623 printf("TIM: %d, SAT: %d, LAT: %f, LON: %f\r\n", mytime, mybatt, mylat, mylon);
lpeters 35:73b3963c6dd3 624 printf("IRQ: A=%02X M=%02X B=%02X\r\n", accHFire, magHFire, btnHFire);
lpeters 35:73b3963c6dd3 625 wait(1);
lpeters 35:73b3963c6dd3 626 // }
lpeters 35:73b3963c6dd3 627 */
lpeters 35:73b3963c6dd3 628
lpeters 44:cf1070af05db 629 wait(1);
lpeters 44:cf1070af05db 630 bootFlash();
lpeters 33:e47306c32791 631
Huot87 38:fd7a407bfe3e 632 // uint8_t crcA = 0;
Huot87 38:fd7a407bfe3e 633 // uint8_t crcB = 0;
Huot87 38:fd7a407bfe3e 634 // for(int i = 2; i <= 13; i++)
Huot87 38:fd7a407bfe3e 635 // {
Huot87 38:fd7a407bfe3e 636 // crcA = crcA + cmdStopGNSS[i];
Huot87 38:fd7a407bfe3e 637 // crcB = crcB + crcA;
Huot87 38:fd7a407bfe3e 638 // }
Huot87 38:fd7a407bfe3e 639 // cmdStopGNSS[14] = crcA;
Huot87 38:fd7a407bfe3e 640 // cmdStopGNSS[15] = crcB;
Huot87 38:fd7a407bfe3e 641 // printf("UBX CRC: %02X %02X\r\n", crcA, crcB);
Huot87 38:fd7a407bfe3e 642 // i2c.write(NEOM8M_ADR_GPS, cmdStopGNSS, 16);
Huot87 38:fd7a407bfe3e 643 // ubxRead();
Huot87 38:fd7a407bfe3e 644 // ubxRead();
Huot87 38:fd7a407bfe3e 645 // ubxRead();
Huot87 38:fd7a407bfe3e 646 // wait(1);
Huot87 38:fd7a407bfe3e 647 // ubxRead();
Huot87 38:fd7a407bfe3e 648 // return 0;
Huot87 38:fd7a407bfe3e 649
Huot87 39:6da6cb44f22e 650 // HUOT ADDITION -- 08/30/2018 -- MAIN LOOP TO TEST GPS SLEEP/WAKE FUNCTIONALITY -- GOT IT WORKING
Huot87 39:6da6cb44f22e 651 int x = 0;
Huot87 40:eaf476b94684 652
Huot87 40:eaf476b94684 653 // printf("LPM INIT \r\n");
Huot87 40:eaf476b94684 654 // gpsExecuteCommand(lowPowerMode, sizeof(lowPowerMode));
lpeters 44:cf1070af05db 655 //
lpeters 44:cf1070af05db 656 /*
Huot87 38:fd7a407bfe3e 657 printf("Putting to sleep... Good Luck ================ \r\n");
Huot87 38:fd7a407bfe3e 658 gpsExecuteCommand(secondTimeSleep, sizeof(secondTimeSleep));
lpeters 44:cf1070af05db 659 */
Huot87 38:fd7a407bfe3e 660
Huot87 40:eaf476b94684 661 // while(1)
Huot87 40:eaf476b94684 662 // {
Huot87 40:eaf476b94684 663 // if ((x != 0) && (x % 10 == 0))
Huot87 40:eaf476b94684 664 // {
Huot87 40:eaf476b94684 665 // printf("Waking up GPS... Good luck, Huot \r\n");
Huot87 40:eaf476b94684 666 // gpsExecuteCommand(secondTimeAwake, sizeof(secondTimeAwake));
Huot87 40:eaf476b94684 667 //
Huot87 40:eaf476b94684 668 // while (gpsRead() == 1);
Huot87 40:eaf476b94684 669 //
Huot87 40:eaf476b94684 670 // printf("GPS Fix is good! Going to sleep... \r\n");
Huot87 40:eaf476b94684 671 // gpsExecuteCommand(secondTimeSleep, sizeof(secondTimeSleep));
Huot87 40:eaf476b94684 672 // }
Huot87 40:eaf476b94684 673 // printf("Waiting 5 seconds... \r\n");
Huot87 40:eaf476b94684 674 // wait(5);
Huot87 40:eaf476b94684 675 // x++;
Huot87 40:eaf476b94684 676 // printf("=== New loop incoming === \r\n");
Huot87 40:eaf476b94684 677 // }
Huot87 38:fd7a407bfe3e 678
lpeters 44:cf1070af05db 679 wait(1);
lpeters 44:cf1070af05db 680 uint32_t myRand = 0;
lpeters 44:cf1070af05db 681 uint8_t myTemp = 0;
lpeters 44:cf1070af05db 682 while(1)
lpeters 44:cf1070af05db 683 {
lpeters 44:cf1070af05db 684 myRand = radio.random();
lpeters 44:cf1070af05db 685 myTemp = radio.getTemp();
lpeters 44:cf1070af05db 686 printf("RND: %08X\r\n", myRand);
lpeters 44:cf1070af05db 687 printf("TMP: %02X\r\n", myTemp);
lpeters 44:cf1070af05db 688 quadFlash2(&myLedB,&myLedR,&myLedG,myRand);
lpeters 44:cf1070af05db 689 byteFlash(&myLedW,&myLedB,myTemp);
lpeters 44:cf1070af05db 690 wait(1);
lpeters 44:cf1070af05db 691 }
lpeters 44:cf1070af05db 692
lpeters 44:cf1070af05db 693 /*
Huot87 43:c900cd8ea072 694 // TEST SEND -- SPECTRUM ANALYZER
lpeters 44:cf1070af05db 695 printf("Sending in 5 seconds... \r\n");
Huot87 43:c900cd8ea072 696
lpeters 44:cf1070af05db 697 for (int i = 0; i < 5; i++)
Huot87 43:c900cd8ea072 698 {
lpeters 44:cf1070af05db 699 myLedW = 1;
lpeters 44:cf1070af05db 700 wait(0.5);
lpeters 44:cf1070af05db 701 myLedW = 0;
lpeters 44:cf1070af05db 702 wait(0.5);
Huot87 43:c900cd8ea072 703 }
Huot87 43:c900cd8ea072 704
Huot87 43:c900cd8ea072 705 wait(1);
lpeters 44:cf1070af05db 706 */
Huot87 43:c900cd8ea072 707 myLedG = 1;
Huot87 43:c900cd8ea072 708
lpeters 37:df69df1bcb1a 709
mbed_official 0:7037ed05f54f 710 // Initialize LoRaWAN stack
mbed_official 2:dc95ac6d6d4e 711 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 712 printf("\r\n LoRa initialization failed! \r\n");
mbed_official 0:7037ed05f54f 713 return -1;
mbed_official 0:7037ed05f54f 714 }
mbed_official 0:7037ed05f54f 715
Huot87 43:c900cd8ea072 716 myLedG = 0;
Huot87 43:c900cd8ea072 717
mbed_official 0:7037ed05f54f 718 printf("\r\n Mbed LoRaWANStack initialized \r\n");
lpeters 36:dcc6f89fa39a 719 printf("MBED_CONF_LORA_APP_PORT: %d\r\n", MBED_CONF_LORA_APP_PORT);
lpeters 36:dcc6f89fa39a 720 printf("MBED_CONF_LORA_DUTY_CYCLE_ON: %d\r\n", MBED_CONF_LORA_DUTY_CYCLE_ON);
mbed_official 0:7037ed05f54f 721
mbed_official 0:7037ed05f54f 722 // prepare application callbacks
mbed_official 0:7037ed05f54f 723 callbacks.events = mbed::callback(lora_event_handler);
mbed_official 2:dc95ac6d6d4e 724 lorawan.add_app_callbacks(&callbacks);
mbed_official 0:7037ed05f54f 725
mbed_official 0:7037ed05f54f 726 // Set number of retries in case of CONFIRMED messages
mbed_official 2:dc95ac6d6d4e 727 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
mbed_official 0:7037ed05f54f 728 != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 729 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
mbed_official 0:7037ed05f54f 730 return -1;
mbed_official 0:7037ed05f54f 731 }
mbed_official 0:7037ed05f54f 732
mbed_official 0:7037ed05f54f 733 printf("\r\n CONFIRMED message retries : %d \r\n",
mbed_official 0:7037ed05f54f 734 CONFIRMED_MSG_RETRY_COUNTER);
mbed_official 0:7037ed05f54f 735
mbed_official 0:7037ed05f54f 736 // Enable adaptive data rate
mbed_official 2:dc95ac6d6d4e 737 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 738 printf("\r\n enable_adaptive_datarate failed! \r\n");
mbed_official 0:7037ed05f54f 739 return -1;
mbed_official 0:7037ed05f54f 740 }
mbed_official 0:7037ed05f54f 741
mbed_official 0:7037ed05f54f 742 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
mbed_official 0:7037ed05f54f 743
lpeters 44:cf1070af05db 744 myLedB = 1;
lpeters 44:cf1070af05db 745
mbed_official 2:dc95ac6d6d4e 746 retcode = lorawan.connect();
lpeters 33:e47306c32791 747
mbed_official 0:7037ed05f54f 748 if (retcode == LORAWAN_STATUS_OK ||
mbed_official 0:7037ed05f54f 749 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
mbed_official 0:7037ed05f54f 750 } else {
mbed_official 0:7037ed05f54f 751 printf("\r\n Connection error, code = %d \r\n", retcode);
mbed_official 0:7037ed05f54f 752 return -1;
mbed_official 0:7037ed05f54f 753 }
mbed_official 0:7037ed05f54f 754
mbed_official 0:7037ed05f54f 755 printf("\r\n Connection - In Progress ...\r\n");
mbed_official 0:7037ed05f54f 756
mbed_official 0:7037ed05f54f 757 // make your event queue dispatching events forever
lpeters 36:dcc6f89fa39a 758 //ev_queue.dispatch_forever();
lpeters 36:dcc6f89fa39a 759 ev_queue.dispatch();
lpeters 44:cf1070af05db 760
lpeters 44:cf1070af05db 761 myLedB = 0;
lpeters 44:cf1070af05db 762 wait(0.5);
lpeters 44:cf1070af05db 763 for (int i = 0; i <= 64; i++)
lpeters 44:cf1070af05db 764 {
lpeters 44:cf1070af05db 765 myLedR = i & 0x01;
lpeters 44:cf1070af05db 766 myLedG = i & 0x02;
lpeters 44:cf1070af05db 767 myLedB = i & 0x04;
lpeters 44:cf1070af05db 768 myLedW = i & 0x08;
lpeters 44:cf1070af05db 769 wait(0.01);
lpeters 44:cf1070af05db 770 }
lpeters 36:dcc6f89fa39a 771 printf("\r\n- = - = - = - = - = - DISPATCH 1 COMPLETE - = - = - = - = - = -\r\n");
lpeters 36:dcc6f89fa39a 772 /*
lpeters 36:dcc6f89fa39a 773 printf("CONTROL LOOP GOES HERE!\r\n");
lpeters 36:dcc6f89fa39a 774 #if defined(TARGET_LRAT)
lpeters 36:dcc6f89fa39a 775 #else
lpeters 36:dcc6f89fa39a 776 for (int i = 0; i < 6; i++)
lpeters 36:dcc6f89fa39a 777 {
lpeters 36:dcc6f89fa39a 778 tNow = time(NULL);
lpeters 36:dcc6f89fa39a 779 printf("RTC: %08X\r\n", tNow);
lpeters 36:dcc6f89fa39a 780 tNext = tNow + 10;
lpeters 36:dcc6f89fa39a 781 printf("NXT: %08X\r\n", tNext);
lpeters 36:dcc6f89fa39a 782 // Clear any pending IRQs
lpeters 36:dcc6f89fa39a 783 cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M;
lpeters 36:dcc6f89fa39a 784 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 36:dcc6f89fa39a 785 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 36:dcc6f89fa39a 786 while (time(NULL) < tNext)
lpeters 36:dcc6f89fa39a 787 {
lpeters 36:dcc6f89fa39a 788 wait(1);
lpeters 36:dcc6f89fa39a 789 }
lpeters 36:dcc6f89fa39a 790 printf("Timer #%d complete.\r\n", i);
lpeters 36:dcc6f89fa39a 791 }
lpeters 36:dcc6f89fa39a 792 #endif
lpeters 36:dcc6f89fa39a 793 */
lpeters 36:dcc6f89fa39a 794 tSend = time(NULL) + 1;
lpeters 36:dcc6f89fa39a 795 while (1) {
lpeters 42:d59e50622292 796 continueSending = true;
lpeters 36:dcc6f89fa39a 797 while (time(NULL) < tSend)
lpeters 36:dcc6f89fa39a 798 wait(0.1);
lpeters 37:df69df1bcb1a 799 if (tSend == 0)
lpeters 37:df69df1bcb1a 800 tCalm = time(NULL) + (DPANIC * NPANIC);
lpeters 37:df69df1bcb1a 801 tSend = time(NULL) + (time(NULL) < tCalm ? DPANIC : DCHILL);
lpeters 37:df69df1bcb1a 802 magWipeIrq();
lpeters 42:d59e50622292 803 printf("RTC: %08X\r\n", time(NULL));
lpeters 36:dcc6f89fa39a 804 printf("IT'S PACKET TIME!\r\n");
lpeters 42:d59e50622292 805 // HUOT ADDITION -- 08/31/2018 -- Implementation of the packet
lpeters 42:d59e50622292 806 if (eepromCounter != 0)
lpeters 42:d59e50622292 807 {
lpeters 42:d59e50622292 808 int backsize = eepromCounter;
lpeters 42:d59e50622292 809 printf("BACKLOG LOOP, FLUSHING %d ENTRIES\r\n", backsize);
lpeters 42:d59e50622292 810 for (int i = 0; i < backsize && continueSending; i++)
lpeters 42:d59e50622292 811 {
lpeters 42:d59e50622292 812 printf("BACKLOG LOOP %d of %d\r\n", i, backsize);
lpeters 42:d59e50622292 813 wasEEPROM = true;
lpeters 42:d59e50622292 814 ev_queue.call(send_backlog);
lpeters 42:d59e50622292 815 ev_queue.dispatch();
lpeters 42:d59e50622292 816 printf("Backlog sent, waiting 5 secs.\r\n");
lpeters 42:d59e50622292 817 wait(5);
lpeters 42:d59e50622292 818 printf("\r\n EEPROM Backlog Sent out!");
lpeters 42:d59e50622292 819 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
lpeters 42:d59e50622292 820 memset(tx_buffer, 0, sizeof(tx_buffer));
lpeters 42:d59e50622292 821 }
lpeters 42:d59e50622292 822 if (continueSending)
lpeters 42:d59e50622292 823 printf("BACKLOG FLUSH COMPLETE!\r\n");
lpeters 42:d59e50622292 824 else
lpeters 42:d59e50622292 825 printf("BACKLOG FLUSH ABORTED!\r\n");
lpeters 42:d59e50622292 826 }
lpeters 36:dcc6f89fa39a 827 ev_queue.call(send_message);
lpeters 36:dcc6f89fa39a 828 ev_queue.dispatch();
lpeters 36:dcc6f89fa39a 829 printf("\r\n- = - = - = - = - = - DISPATCH 2 COMPLETE - = - = - = - = - = -\r\n");
lpeters 36:dcc6f89fa39a 830 }
mbed_official 3:8c7198d1a2a1 831
mbed_official 3:8c7198d1a2a1 832 return 0;
mbed_official 0:7037ed05f54f 833 }
mbed_official 0:7037ed05f54f 834
lpeters 42:d59e50622292 835 static void send_backlog()
lpeters 42:d59e50622292 836 {
lpeters 42:d59e50622292 837 printf("In send_backlog()...\r\n");
lpeters 42:d59e50622292 838 int16_t retcode;
lpeters 42:d59e50622292 839 //time_t tNow = time(NULL);
lpeters 42:d59e50622292 840 //printf("Clock: %d\r\n", tNow);
lpeters 42:d59e50622292 841 weGetSignal = 0;
lpeters 42:d59e50622292 842 printf("Head Cleared ACK flag: %d\r\n", weGetSignal);
lpeters 42:d59e50622292 843 prepBacklogSend();
lpeters 44:cf1070af05db 844 myLedB = 1;
lpeters 42:d59e50622292 845 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, PACKET_LEN,
lpeters 42:d59e50622292 846 MSG_CONFIRMED_FLAG);
lpeters 42:d59e50622292 847 if (retcode < 0) {
lpeters 42:d59e50622292 848 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
lpeters 42:d59e50622292 849 : printf("\r\n send() - Error code %d \r\n", retcode);
lpeters 42:d59e50622292 850 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
lpeters 42:d59e50622292 851 //retry in 3 seconds
lpeters 42:d59e50622292 852 // HUOT NOTE -- WE SHOULD BE CAREFUL ABOUT THIS AS WITH THE EEPROM BACKLOG WE MAY BLOCK OURSELVES AND OVERFLOW THE STACK WITH SUBSEQUENT CALLS
lpeters 42:d59e50622292 853 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
lpeters 42:d59e50622292 854 ev_queue.call_in(3000, send_message);
lpeters 42:d59e50622292 855 }
lpeters 42:d59e50622292 856 }
lpeters 42:d59e50622292 857 return;
lpeters 42:d59e50622292 858 }
lpeters 42:d59e50622292 859 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
lpeters 42:d59e50622292 860 //memset(tx_buffer, 0, sizeof(tx_buffer));
Huot87 43:c900cd8ea072 861
Huot87 43:c900cd8ea072 862
lpeters 42:d59e50622292 863 //LED Confirmation Output - MESSAGE SENT
Huot87 43:c900cd8ea072 864 // for (int i = 0; i < 10; i++) {
Huot87 43:c900cd8ea072 865 // myLedG = 1;
Huot87 43:c900cd8ea072 866 // wait(0.1);
Huot87 43:c900cd8ea072 867 // myLedG = 0;
Huot87 43:c900cd8ea072 868 // myLedR = 1;
Huot87 43:c900cd8ea072 869 // wait(0.1);
Huot87 43:c900cd8ea072 870 // myLedR = 0;
Huot87 43:c900cd8ea072 871 // //myLedB = 1;
Huot87 43:c900cd8ea072 872 // //wait(0.1);
Huot87 43:c900cd8ea072 873 // //myLedB = 0;
Huot87 43:c900cd8ea072 874 // }
lpeters 42:d59e50622292 875 }
lpeters 42:d59e50622292 876
mbed_official 0:7037ed05f54f 877 /**
mbed_official 0:7037ed05f54f 878 * Sends a message to the Network Server
mbed_official 0:7037ed05f54f 879 */
mbed_official 0:7037ed05f54f 880 static void send_message()
mbed_official 0:7037ed05f54f 881 {
lpeters 36:dcc6f89fa39a 882 printf("In send_message()...\r\n");
mbed_official 0:7037ed05f54f 883 int16_t retcode;
mbed_official 0:7037ed05f54f 884
Huot87 40:eaf476b94684 885 // HUOT NOTE -- 08/31/2018 -- Think this and all references to the "Dummy Sensor" can be removed at this point
Huot87 40:eaf476b94684 886 //
Huot87 40:eaf476b94684 887 // float sensor_value;
Huot87 40:eaf476b94684 888 // if (ds1820.begin()) {
Huot87 40:eaf476b94684 889 // ds1820.startConversion();
Huot87 40:eaf476b94684 890 // sensor_value = ds1820.read();
Huot87 40:eaf476b94684 891 // printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value);
Huot87 40:eaf476b94684 892 // ds1820.startConversion();
Huot87 40:eaf476b94684 893 // } else {
Huot87 40:eaf476b94684 894 // printf("\r\n No sensor found \r\n");
Huot87 40:eaf476b94684 895 // return;
Huot87 40:eaf476b94684 896 // }
mbed_official 0:7037ed05f54f 897
lpeters 42:d59e50622292 898 //time_t tNow = time(NULL);
lpeters 42:d59e50622292 899 //printf("Clock: %d\r\n", tNow);
lpeters 34:341fb423e74b 900
lpeters 42:d59e50622292 901 weGetSignal = 0;
lpeters 42:d59e50622292 902 printf("Head Cleared ACK flag: %d\r\n", weGetSignal);
lpeters 34:341fb423e74b 903
lpeters 44:cf1070af05db 904 #if defined(ENABLE_TMPSENSOR)
Huot87 40:eaf476b94684 905 tmpRead();
Huot87 40:eaf476b94684 906 #endif
Huot87 40:eaf476b94684 907 magRead();
Huot87 40:eaf476b94684 908 accRead();
Huot87 40:eaf476b94684 909
Huot87 40:eaf476b94684 910 // HUOT ALTERATION -- 08/31/2018 -- Implement GPS Read Loop into Send Message
Huot87 40:eaf476b94684 911 // TODO - Implement 3 try counter (or something similar)
Huot87 40:eaf476b94684 912 printf("Waking up GPS... Good luck, Huot \r\n");
Huot87 40:eaf476b94684 913 gpsExecuteCommand(secondTimeAwake, sizeof(secondTimeAwake));
Huot87 40:eaf476b94684 914
Huot87 43:c900cd8ea072 915 //while (gpsRead() == 1);
Huot87 43:c900cd8ea072 916 gpsRead();
Huot87 40:eaf476b94684 917
Huot87 40:eaf476b94684 918 printf("GPS Fix is good! Going to sleep... \r\n");
Huot87 40:eaf476b94684 919 gpsExecuteCommand(secondTimeSleep, sizeof(secondTimeSleep));
Huot87 40:eaf476b94684 920 printf("~~~~~~~~~~~~~ Constructing Packet ~~~~~~~~~~~~~\r\n");
Huot87 40:eaf476b94684 921
Huot87 40:eaf476b94684 922 int ilat = (int)(mylat * 100000);
Huot87 40:eaf476b94684 923 int ilon = (int)(mylon * 100000);
Huot87 40:eaf476b94684 924 printf("TIM: %d, SAT: %d, LAT: %d, LON: %d\r\n", mytime, mybatt, ilat, ilon);
Huot87 40:eaf476b94684 925 // packet_len = 11;
Huot87 40:eaf476b94684 926 tx_buffer[0] = (mytime >> 24) & 0xFF;
Huot87 40:eaf476b94684 927 tx_buffer[1] = (mytime >> 16) & 0xFF;
Huot87 40:eaf476b94684 928 tx_buffer[2] = (mytime >> 8) & 0xFF;
Huot87 40:eaf476b94684 929 tx_buffer[3] = (mytime >> 0) & 0xFF;
Huot87 40:eaf476b94684 930 tx_buffer[4] = ((mybatt << 4) & 0xF0) | ((ilat >> 22) & 0x0F);
Huot87 40:eaf476b94684 931 tx_buffer[5] = (ilat >> 14) & 0xFF;
Huot87 40:eaf476b94684 932 tx_buffer[6] = (ilat >> 6) & 0xFF;
Huot87 40:eaf476b94684 933 tx_buffer[7] = ((ilat << 2) & 0xFC) | ((ilon >> 24) & 0x03);
Huot87 40:eaf476b94684 934 tx_buffer[8] = (ilon >> 16) & 0xFF;
Huot87 40:eaf476b94684 935 tx_buffer[9] = (ilon >> 8) & 0xFF;
Huot87 40:eaf476b94684 936 tx_buffer[10] = (ilon >> 0) & 0xFF;
Huot87 40:eaf476b94684 937 printf("\r\nBUF: |");
Huot87 40:eaf476b94684 938 for (int i = 0; i < PACKET_LEN; i++) { printf("%02X", tx_buffer[i]); }
Huot87 40:eaf476b94684 939 printf("|\r\n");
Huot87 43:c900cd8ea072 940
Huot87 43:c900cd8ea072 941 // TEST SEND -- SPECTRUM ANALYZER
Huot87 43:c900cd8ea072 942 printf("Will send packet in 10 seconds... \r\n");
Huot87 43:c900cd8ea072 943
Huot87 43:c900cd8ea072 944 for (int i = 9; i > 0; i--)
Huot87 43:c900cd8ea072 945 {
Huot87 43:c900cd8ea072 946 wait(1);
Huot87 43:c900cd8ea072 947 printf("%d ... \r\n", i);
Huot87 43:c900cd8ea072 948 }
Huot87 43:c900cd8ea072 949 wait(1);
lpeters 44:cf1070af05db 950 myLedB = 1;
Huot87 43:c900cd8ea072 951
Huot87 40:eaf476b94684 952 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, PACKET_LEN,
Huot87 40:eaf476b94684 953 MSG_CONFIRMED_FLAG);
Huot87 40:eaf476b94684 954
Huot87 40:eaf476b94684 955 if (retcode < 0) {
Huot87 40:eaf476b94684 956 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
Huot87 40:eaf476b94684 957 : printf("\r\n send() - Error code %d \r\n", retcode);
Huot87 40:eaf476b94684 958
Huot87 40:eaf476b94684 959 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
Huot87 40:eaf476b94684 960 //retry in 3 seconds
Huot87 40:eaf476b94684 961 // HUOT NOTE -- WE SHOULD BE CAREFUL ABOUT THIS AS WITH THE EEPROM BACKLOG WE MAY BLOCK OURSELVES AND OVERFLOW THE STACK WITH SUBSEQUENT CALLS
Huot87 40:eaf476b94684 962 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
Huot87 40:eaf476b94684 963 ev_queue.call_in(3000, send_message);
Huot87 40:eaf476b94684 964 }
lpeters 34:341fb423e74b 965 }
Huot87 40:eaf476b94684 966 return;
lpeters 34:341fb423e74b 967 }
lpeters 34:341fb423e74b 968
Huot87 40:eaf476b94684 969 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
lpeters 42:d59e50622292 970 //memset(tx_buffer, 0, sizeof(tx_buffer));
Huot87 40:eaf476b94684 971
Huot87 43:c900cd8ea072 972 // //LED Confirmation Output - MESSAGE SENT
Huot87 43:c900cd8ea072 973 // for (int i = 0; i < 10; i++) {
Huot87 43:c900cd8ea072 974 // myLedG = 1;
Huot87 43:c900cd8ea072 975 // wait(0.1);
Huot87 43:c900cd8ea072 976 // myLedG = 0;
Huot87 43:c900cd8ea072 977 // myLedR = 1;
Huot87 43:c900cd8ea072 978 // wait(0.1);
Huot87 43:c900cd8ea072 979 // myLedR = 0;
Huot87 43:c900cd8ea072 980 // myLedB = 1;
Huot87 43:c900cd8ea072 981 // wait(0.1);
Huot87 43:c900cd8ea072 982 // myLedB = 0;
Huot87 43:c900cd8ea072 983 // }
lpeters 34:341fb423e74b 984 }
lpeters 34:341fb423e74b 985
lpeters 34:341fb423e74b 986 /**
lpeters 34:341fb423e74b 987 * Receive a message from the Network Server
lpeters 34:341fb423e74b 988 */
lpeters 34:341fb423e74b 989 static void receive_message()
lpeters 34:341fb423e74b 990 {
lpeters 36:dcc6f89fa39a 991 printf("In receive_message()...\r\n");
lpeters 34:341fb423e74b 992 int16_t retcode;
lpeters 34:341fb423e74b 993 retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer,
lpeters 34:341fb423e74b 994 sizeof(rx_buffer),
lpeters 34:341fb423e74b 995 MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG);
lpeters 34:341fb423e74b 996
lpeters 34:341fb423e74b 997 if (retcode < 0) {
lpeters 34:341fb423e74b 998 printf("\r\n receive() - Error code %d \r\n", retcode);
lpeters 34:341fb423e74b 999 return;
lpeters 34:341fb423e74b 1000 }
lpeters 34:341fb423e74b 1001
lpeters 34:341fb423e74b 1002 printf(" Data:");
lpeters 34:341fb423e74b 1003
lpeters 34:341fb423e74b 1004 for (uint8_t i = 0; i < retcode; i++) {
lpeters 34:341fb423e74b 1005 printf("%x", rx_buffer[i]);
lpeters 34:341fb423e74b 1006 }
lpeters 34:341fb423e74b 1007
lpeters 34:341fb423e74b 1008 printf("\r\n Data Length: %d\r\n", retcode);
lpeters 34:341fb423e74b 1009
lpeters 34:341fb423e74b 1010 /*
lpeters 34:341fb423e74b 1011 int startLoop = 0;
lpeters 34:341fb423e74b 1012 if (strncmp((char *)rx_buffer, cmdSendLoop, 8) == 0)
lpeters 34:341fb423e74b 1013 {
lpeters 34:341fb423e74b 1014 printf("SendLoop Command Received!\r\n");
lpeters 34:341fb423e74b 1015 startLoop = 1;
lpeters 34:341fb423e74b 1016 }
lpeters 34:341fb423e74b 1017 */
lpeters 34:341fb423e74b 1018
lpeters 34:341fb423e74b 1019 memset(rx_buffer, 0, sizeof(rx_buffer));
lpeters 34:341fb423e74b 1020 /*
lpeters 34:341fb423e74b 1021 if (startLoop)
lpeters 34:341fb423e74b 1022 send_message();
lpeters 34:341fb423e74b 1023 */
lpeters 34:341fb423e74b 1024 }
lpeters 34:341fb423e74b 1025
lpeters 34:341fb423e74b 1026 /**
lpeters 34:341fb423e74b 1027 * Event handler
lpeters 34:341fb423e74b 1028 */
lpeters 34:341fb423e74b 1029 static void lora_event_handler(lorawan_event_t event)
lpeters 34:341fb423e74b 1030 {
lpeters 34:341fb423e74b 1031 tr_debug("In lora_event_handler(%d)...", event);
lpeters 34:341fb423e74b 1032 switch (event) {
lpeters 34:341fb423e74b 1033 case CONNECTED:
lpeters 44:cf1070af05db 1034 myLedB = 0;
lpeters 44:cf1070af05db 1035 myLedG = 1;
lpeters 44:cf1070af05db 1036 myLedW = weGetSignal;
lpeters 34:341fb423e74b 1037 printf("\r\n Connection - Successful \r\n");
lpeters 44:cf1070af05db 1038 wait(1);
lpeters 44:cf1070af05db 1039 myLedG = 0;
lpeters 44:cf1070af05db 1040 myLedW = 0;
lpeters 36:dcc6f89fa39a 1041 ev_queue.break_dispatch();
lpeters 36:dcc6f89fa39a 1042 /*
lpeters 34:341fb423e74b 1043 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
lpeters 34:341fb423e74b 1044 send_message();
lpeters 34:341fb423e74b 1045 } else {
lpeters 34:341fb423e74b 1046 ev_queue.call_every(TX_TIMER, send_message);
lpeters 34:341fb423e74b 1047 }
lpeters 36:dcc6f89fa39a 1048 */
lpeters 34:341fb423e74b 1049 break;
lpeters 34:341fb423e74b 1050 case DISCONNECTED:
lpeters 34:341fb423e74b 1051 ev_queue.break_dispatch();
lpeters 34:341fb423e74b 1052 printf("\r\n Disconnected Successfully \r\n");
lpeters 34:341fb423e74b 1053 break;
lpeters 34:341fb423e74b 1054 case TX_DONE:
lpeters 44:cf1070af05db 1055 myLedB = 0;
lpeters 44:cf1070af05db 1056 myLedG = 1;
lpeters 44:cf1070af05db 1057 myLedW = weGetSignal;
lpeters 34:341fb423e74b 1058 printf("\r\n Message Sent to Network Server \r\n");
lpeters 42:d59e50622292 1059 printf("Dumping ACK Flag: %d\r\n", weGetSignal);
lpeters 42:d59e50622292 1060 if (weGetSignal == 0)
lpeters 42:d59e50622292 1061 {
lpeters 42:d59e50622292 1062 printf("No ACK received.\r\n");
lpeters 42:d59e50622292 1063 if (wasEEPROM)
lpeters 42:d59e50622292 1064 continueSending = false;
lpeters 42:d59e50622292 1065 else
lpeters 42:d59e50622292 1066 backupPacket();
lpeters 42:d59e50622292 1067 }
lpeters 42:d59e50622292 1068 if (wasEEPROM && weGetSignal)
lpeters 42:d59e50622292 1069 {
lpeters 42:d59e50622292 1070 eepromCounter--;
lpeters 42:d59e50622292 1071 }
lpeters 42:d59e50622292 1072 wasEEPROM = false;
lpeters 42:d59e50622292 1073 weGetSignal = 0;
lpeters 42:d59e50622292 1074 printf("Tail Cleared ACK Flag: %d\r\n", weGetSignal);
lpeters 44:cf1070af05db 1075 wait(1);
lpeters 44:cf1070af05db 1076 myLedG = 0;
lpeters 44:cf1070af05db 1077 myLedW = 0;
lpeters 36:dcc6f89fa39a 1078 ev_queue.break_dispatch();
lpeters 36:dcc6f89fa39a 1079 /*
lpeters 34:341fb423e74b 1080 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
lpeters 34:341fb423e74b 1081 send_message();
lpeters 34:341fb423e74b 1082 }
lpeters 36:dcc6f89fa39a 1083 */
lpeters 34:341fb423e74b 1084 break;
lpeters 34:341fb423e74b 1085 case TX_TIMEOUT:
lpeters 34:341fb423e74b 1086 case TX_ERROR:
lpeters 34:341fb423e74b 1087 case TX_CRYPTO_ERROR:
lpeters 34:341fb423e74b 1088 case TX_SCHEDULING_ERROR:
lpeters 44:cf1070af05db 1089 myLedB = 0;
Huot87 43:c900cd8ea072 1090 myLedR = 1;
lpeters 44:cf1070af05db 1091 myLedW = weGetSignal;
lpeters 44:cf1070af05db 1092 //wait(1);
Huot87 43:c900cd8ea072 1093
lpeters 34:341fb423e74b 1094 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
Huot87 40:eaf476b94684 1095
lpeters 34:341fb423e74b 1096 // try again
lpeters 36:dcc6f89fa39a 1097 /*
lpeters 34:341fb423e74b 1098 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
lpeters 34:341fb423e74b 1099 send_message();
lpeters 34:341fb423e74b 1100 }
lpeters 36:dcc6f89fa39a 1101 */
Huot87 40:eaf476b94684 1102 printf("====== Writing to EEPROM Backlog ====== \r\n");
Huot87 40:eaf476b94684 1103 backupPacket();
Huot87 40:eaf476b94684 1104
Huot87 40:eaf476b94684 1105 if (wasEEPROM)
Huot87 40:eaf476b94684 1106 continueSending = false;
Huot87 40:eaf476b94684 1107
lpeters 44:cf1070af05db 1108 //myLedG = 0;
lpeters 44:cf1070af05db 1109 wait(1);
Huot87 43:c900cd8ea072 1110 myLedR = 0;
lpeters 44:cf1070af05db 1111 myLedW = 0;
Huot87 43:c900cd8ea072 1112
lpeters 34:341fb423e74b 1113 break;
lpeters 34:341fb423e74b 1114 case RX_DONE:
lpeters 34:341fb423e74b 1115 printf("\r\n Received message from Network Server \r\n");
lpeters 34:341fb423e74b 1116 receive_message();
lpeters 34:341fb423e74b 1117 break;
lpeters 34:341fb423e74b 1118 case RX_TIMEOUT:
lpeters 34:341fb423e74b 1119 case RX_ERROR:
lpeters 34:341fb423e74b 1120 printf("\r\n Error in reception - Code = %d \r\n", event);
lpeters 34:341fb423e74b 1121 break;
lpeters 34:341fb423e74b 1122 case JOIN_FAILURE:
lpeters 44:cf1070af05db 1123 myLedB = 0;
lpeters 44:cf1070af05db 1124 myLedR = 1;
lpeters 44:cf1070af05db 1125 myLedW = weGetSignal;
lpeters 34:341fb423e74b 1126 printf("\r\n OTAA Failed - Check Keys \r\n");
lpeters 34:341fb423e74b 1127 break;
lpeters 34:341fb423e74b 1128 case UPLINK_REQUIRED:
lpeters 34:341fb423e74b 1129 printf("\r\n Uplink required by NS \r\n");
lpeters 36:dcc6f89fa39a 1130 /*
lpeters 34:341fb423e74b 1131 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
lpeters 34:341fb423e74b 1132 send_message();
lpeters 34:341fb423e74b 1133 }
lpeters 36:dcc6f89fa39a 1134 */
lpeters 34:341fb423e74b 1135 break;
lpeters 34:341fb423e74b 1136 default:
lpeters 34:341fb423e74b 1137 MBED_ASSERT("Unknown Event");
lpeters 34:341fb423e74b 1138 }
lpeters 34:341fb423e74b 1139 }
lpeters 34:341fb423e74b 1140
lpeters 34:341fb423e74b 1141 void magInitSequence()
lpeters 34:341fb423e74b 1142 {
lpeters 35:73b3963c6dd3 1143 printf("In magInitSequence()...\r\n");
lpeters 34:341fb423e74b 1144 myLedR = 0;
lpeters 34:341fb423e74b 1145 myLedG = 0;
lpeters 34:341fb423e74b 1146 cmd[0] = LSM303_REG_MAG_WHO_AM_I_M;
lpeters 34:341fb423e74b 1147 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1148 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 34:341fb423e74b 1149 res = (ret == LSM303_WHO_MAG ? sPass : sFail);
lpeters 34:341fb423e74b 1150 printf("MAG WhoAmI: %02X %s\r\n", ret, res);
lpeters 34:341fb423e74b 1151
lpeters 34:341fb423e74b 1152 if (ret == LSM303_WHO_MAG)
lpeters 34:341fb423e74b 1153 myLedG = 1;
lpeters 34:341fb423e74b 1154 else
lpeters 34:341fb423e74b 1155 myLedR = 1;
lpeters 34:341fb423e74b 1156
lpeters 34:341fb423e74b 1157 for (int i = 0; i < 2; i++) {
lpeters 34:341fb423e74b 1158 myLedB = 1;
lpeters 44:cf1070af05db 1159 wait(0.25);
lpeters 34:341fb423e74b 1160 myLedB = 0;
lpeters 44:cf1070af05db 1161 wait(0.25);
lpeters 34:341fb423e74b 1162 }
lpeters 34:341fb423e74b 1163
lpeters 34:341fb423e74b 1164 #if defined(TARGET_LRAT)
lpeters 34:341fb423e74b 1165 cmd[0] = LSM303_REG_MAG_CTRL_REG1_M;
lpeters 34:341fb423e74b 1166 cmd[1] = 0x70; // Ultra-High Performance Mode on XY axes, ODR=10Hz
lpeters 34:341fb423e74b 1167 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1168 cmd[0] = LSM303_REG_MAG_CTRL_REG3_M;
lpeters 34:341fb423e74b 1169 cmd[1] = 0x00; // High Resolution? (Full-power), Continuous
lpeters 34:341fb423e74b 1170 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1171 cmd[0] = LSM303_REG_MAG_CTRL_REG4_M;
lpeters 34:341fb423e74b 1172 cmd[1] = 0x0C; // Ultra-High Performance Mode on Z axis
lpeters 34:341fb423e74b 1173 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 44:cf1070af05db 1174 #if defined(ENABLE_TMPSENSOR)
lpeters 34:341fb423e74b 1175 // Enable Temp Sensor
lpeters 34:341fb423e74b 1176 cmd[0] = LSM303_REG_MAG_CTRL_REG1_M;
lpeters 34:341fb423e74b 1177 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1178 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 34:341fb423e74b 1179 cmd[0] = LSM303_REG_MAG_CTRL_REG1_M;
lpeters 34:341fb423e74b 1180 cmd[1] = ret | 0x80;
lpeters 34:341fb423e74b 1181 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1182 /*
lpeters 34:341fb423e74b 1183 cmd[0] = LSM303_REG_MAG_CTRL_REG5_M;
lpeters 34:341fb423e74b 1184 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1185 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 34:341fb423e74b 1186 cmd[0] = LSM303_REG_MAG_CTRL_REG5_M;
lpeters 34:341fb423e74b 1187 cmd[1] = ret | 0x40;
lpeters 34:341fb423e74b 1188 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1189 */
lpeters 34:341fb423e74b 1190 #endif
lpeters 34:341fb423e74b 1191 #else
lpeters 34:341fb423e74b 1192 cmd[0] = LSM303_REG_MAG_CFG_REG_A_M;
lpeters 34:341fb423e74b 1193 cmd[1] = 0x00; // Mag = 10 Hz (high-resolution and continuous mode)
lpeters 34:341fb423e74b 1194 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1195 cmd[0] = LSM303_REG_MAG_CFG_REG_C_M;
lpeters 34:341fb423e74b 1196 //cmd[1] = 0x01; // Mag data-ready interrupt enable
lpeters 34:341fb423e74b 1197 cmd[1] = 0x40; // Mag enable interrupt on pin
lpeters 34:341fb423e74b 1198 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1199 #endif
lpeters 44:cf1070af05db 1200 /*
lpeters 34:341fb423e74b 1201 for (int i = 0; i < 2; i++) {
lpeters 34:341fb423e74b 1202 myLedR = 1;
lpeters 34:341fb423e74b 1203 myLedG = 1;
lpeters 34:341fb423e74b 1204 myLedB = 1;
lpeters 34:341fb423e74b 1205 wait(0.5);
lpeters 34:341fb423e74b 1206 myLedR = 0;
lpeters 34:341fb423e74b 1207 myLedG = 0;
lpeters 34:341fb423e74b 1208 myLedB = 0;
lpeters 34:341fb423e74b 1209 wait(0.5);
lpeters 34:341fb423e74b 1210 }
lpeters 44:cf1070af05db 1211 */
lpeters 44:cf1070af05db 1212 myLedG = 0;
lpeters 44:cf1070af05db 1213 myLedR = 0;
lpeters 35:73b3963c6dd3 1214 #if defined(TARGET_LRAT)
lpeters 35:73b3963c6dd3 1215 // LRAT MAG IRQ SETUP GOES HERE
lpeters 35:73b3963c6dd3 1216 #else
lpeters 34:341fb423e74b 1217 // MAG INTERRUPT SETUP
lpeters 34:341fb423e74b 1218 cmd[0] = LSM303_REG_MAG_INT_THS_L_REG_M;
lpeters 35:73b3963c6dd3 1219 cmd[1] = 0xE8;
lpeters 34:341fb423e74b 1220 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1221 cmd[0] = LSM303_REG_MAG_INT_THS_H_REG_M;
lpeters 35:73b3963c6dd3 1222 cmd[1] = 0x03;
lpeters 34:341fb423e74b 1223 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1224 cmd[0] = LSM303_REG_MAG_INT_CTRL_REG_M;
lpeters 34:341fb423e74b 1225 cmd[1] = 0xE7;
lpeters 34:341fb423e74b 1226 i2c.write(LSM303_ADR_MAG, cmd, 2);
lpeters 34:341fb423e74b 1227 magPin.rise(&onMagIrq);
lpeters 35:73b3963c6dd3 1228 #endif
lpeters 34:341fb423e74b 1229 }
lpeters 34:341fb423e74b 1230
lpeters 34:341fb423e74b 1231 void accInitSequence()
lpeters 34:341fb423e74b 1232 {
lpeters 35:73b3963c6dd3 1233 printf("In accInitSequence()...\r\n");
lpeters 34:341fb423e74b 1234 myLedR = 0;
lpeters 34:341fb423e74b 1235 myLedG = 0;
lpeters 34:341fb423e74b 1236 cmd[0] = LSM303_REG_ACC_WHO_AM_I_A;
lpeters 34:341fb423e74b 1237 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1238 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1239 res = (ret == LSM303_WHO_ACC ? sPass : sFail);
lpeters 34:341fb423e74b 1240 printf("ACC WhoAmI: %02X %s\r\n", ret, res);
lpeters 34:341fb423e74b 1241
lpeters 34:341fb423e74b 1242 if (ret == LSM303_WHO_ACC)
lpeters 34:341fb423e74b 1243 myLedG = 1;
lpeters 34:341fb423e74b 1244 else
lpeters 34:341fb423e74b 1245 myLedR = 1;
lpeters 34:341fb423e74b 1246
lpeters 34:341fb423e74b 1247 for (int i = 0; i < 2; i++) {
lpeters 34:341fb423e74b 1248 myLedB = 1;
lpeters 44:cf1070af05db 1249 wait(0.25);
lpeters 34:341fb423e74b 1250 myLedB = 0;
lpeters 44:cf1070af05db 1251 wait(0.25);
lpeters 34:341fb423e74b 1252 }
lpeters 34:341fb423e74b 1253
lpeters 34:341fb423e74b 1254 #if defined(TARGET_LRAT)
lpeters 34:341fb423e74b 1255 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 34:341fb423e74b 1256 cmd[1] = 0xB7; // High Resolution, ODR=100Hz, Enable XYZ Axes
lpeters 34:341fb423e74b 1257 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1258
Huot87 39:6da6cb44f22e 1259 // HUOT ADDITION -- 08/30/2018 -- Accelerometer Intterupt Init Sequence
Huot87 39:6da6cb44f22e 1260 #if defined(ACC_INTERRUPT_ON)
Huot87 39:6da6cb44f22e 1261 // ACC INTERRUPT SETUP
Huot87 39:6da6cb44f22e 1262 // Enable Interrupt Pin
Huot87 39:6da6cb44f22e 1263 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
Huot87 39:6da6cb44f22e 1264 i2c.write(LSM303_ADR_ACC, cmd, 1);
Huot87 39:6da6cb44f22e 1265 i2c.read(LSM303_ADR_ACC, &ret, 1);
Huot87 39:6da6cb44f22e 1266
Huot87 39:6da6cb44f22e 1267 // Configure Control Register 3
Huot87 39:6da6cb44f22e 1268 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
Huot87 39:6da6cb44f22e 1269 cmd[1] = 0x08;
Huot87 39:6da6cb44f22e 1270 // cmd[1] = ret | 0x40;
Huot87 39:6da6cb44f22e 1271 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1272
Huot87 39:6da6cb44f22e 1273 cmd[0] = LSM303_CTRL_REG7_A;
Huot87 39:6da6cb44f22e 1274 i2c.write(LSM303_ADR_ACC, cmd, 1);
Huot87 39:6da6cb44f22e 1275 i2c.read(LSM303_ADR_ACC, &ret, 1);
Huot87 39:6da6cb44f22e 1276
Huot87 39:6da6cb44f22e 1277 // Latch Interrupt Enabling
Huot87 39:6da6cb44f22e 1278 cmd[0] = LSM303_CTRL_REG7_A;
Huot87 39:6da6cb44f22e 1279 cmd[1] = 0x04;
Huot87 39:6da6cb44f22e 1280 //cmd[1] = ret | 0x08;
Huot87 39:6da6cb44f22e 1281 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1282
Huot87 39:6da6cb44f22e 1283 // Set Threshold/Duration/Config
Huot87 39:6da6cb44f22e 1284 // Set Threshold on X axis
Huot87 39:6da6cb44f22e 1285 cmd[0] = LSM303_REG_ACC_INT1_THS_X1_A;
Huot87 39:6da6cb44f22e 1286 cmd[1] = 0x7D;
Huot87 39:6da6cb44f22e 1287 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1288
Huot87 39:6da6cb44f22e 1289 // Set Threshold on Y axis
Huot87 39:6da6cb44f22e 1290 cmd[0] = LSM303_REG_ACC_INT1_THS_Y1_A;
Huot87 39:6da6cb44f22e 1291 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1292
Huot87 39:6da6cb44f22e 1293 // Set Y Threshold on Z axis
Huot87 39:6da6cb44f22e 1294 cmd[0] = LSM303_REG_ACC_INT1_THS_Z1_A;
Huot87 39:6da6cb44f22e 1295 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1296
Huot87 39:6da6cb44f22e 1297 // Set Interrupt Duration
Huot87 39:6da6cb44f22e 1298 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
Huot87 39:6da6cb44f22e 1299 cmd[1] = 0x00;
Huot87 39:6da6cb44f22e 1300 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1301
Huot87 39:6da6cb44f22e 1302 // Set Interrupt Configuration
Huot87 39:6da6cb44f22e 1303 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
Huot87 39:6da6cb44f22e 1304 cmd[1] = 0x02; // Set Interrupt Generation on X-Axis High event
Huot87 39:6da6cb44f22e 1305 i2c.write(LSM303_ADR_ACC, cmd, 2);
Huot87 39:6da6cb44f22e 1306 accPin.rise(&onAccIrq);
Huot87 39:6da6cb44f22e 1307 #endif
Huot87 39:6da6cb44f22e 1308
lpeters 34:341fb423e74b 1309 #else
lpeters 34:341fb423e74b 1310 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 34:341fb423e74b 1311 cmd[1] = 0x57; // Enable XYZ Axes, ODR=100Hz
lpeters 34:341fb423e74b 1312 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1313
lpeters 34:341fb423e74b 1314 // Enable High Resolution Mode
lpeters 34:341fb423e74b 1315 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1316 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1317 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1318 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1319 cmd[1] = ret | 0x08; // High Resolution
lpeters 34:341fb423e74b 1320 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1321
lpeters 44:cf1070af05db 1322 #if defined(ENABLE_TMPSENSOR)
lpeters 34:341fb423e74b 1323 // Enable Temp Sensor
lpeters 34:341fb423e74b 1324 cmd[0] = LSM303_REG_ACC_TEMP_CFG_REG_A;
lpeters 34:341fb423e74b 1325 cmd[1] = 0xC0;
lpeters 34:341fb423e74b 1326 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1327 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1328 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1329 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1330 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1331 cmd[1] = ret | 0x80;
lpeters 34:341fb423e74b 1332 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1333 #endif
lpeters 34:341fb423e74b 1334 #endif
lpeters 34:341fb423e74b 1335
lpeters 34:341fb423e74b 1336 //LED Confirmation Output - ACC INIT COMPLETE
lpeters 44:cf1070af05db 1337 /*
lpeters 34:341fb423e74b 1338 for (int i = 0; i < 2; i++) {
lpeters 34:341fb423e74b 1339 myLedR = 1;
lpeters 34:341fb423e74b 1340 myLedG = 1;
lpeters 34:341fb423e74b 1341 myLedB = 1;
lpeters 34:341fb423e74b 1342 wait(0.5);
lpeters 34:341fb423e74b 1343 myLedR = 0;
lpeters 34:341fb423e74b 1344 myLedG = 0;
lpeters 34:341fb423e74b 1345 myLedB = 0;
lpeters 34:341fb423e74b 1346 wait(0.5);
lpeters 34:341fb423e74b 1347 }
lpeters 44:cf1070af05db 1348 */
lpeters 44:cf1070af05db 1349 myLedG = 0;
lpeters 44:cf1070af05db 1350 myLedR = 0;
lpeters 34:341fb423e74b 1351
lpeters 34:341fb423e74b 1352 // Set Full Scale to 4g
lpeters 34:341fb423e74b 1353 /*
lpeters 34:341fb423e74b 1354 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1355 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1356 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1357 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1358 //cmd[1] = ret | 0x30; // 16g
lpeters 34:341fb423e74b 1359 //cmd[1] = (ret & ~0x10) | 0x20; // 8g
lpeters 34:341fb423e74b 1360 cmd[1] = (ret & ~0x20) | 0x10; // 4g
lpeters 34:341fb423e74b 1361 //cmd[1] = ret & ~0x30; // 2g
lpeters 34:341fb423e74b 1362 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1363 */
lpeters 34:341fb423e74b 1364 /*
lpeters 34:341fb423e74b 1365 // IRQ Init from Datasheet.
lpeters 34:341fb423e74b 1366 cmd[0] = LSM303_REG_ACC_CTRL_REG1_A;
lpeters 34:341fb423e74b 1367 cmd[1] = 0xA7;
lpeters 34:341fb423e74b 1368 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1369 cmd[0] = LSM303_REG_ACC_CTRL_REG2_A;
lpeters 34:341fb423e74b 1370 cmd[1] = 0x00;
lpeters 34:341fb423e74b 1371 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1372 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 34:341fb423e74b 1373 cmd[1] = 0x40;
lpeters 34:341fb423e74b 1374 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1375 cmd[0] = LSM303_REG_ACC_CTRL_REG4_A;
lpeters 34:341fb423e74b 1376 cmd[1] = 0x00;
lpeters 34:341fb423e74b 1377 //cmd[1] = 0x10;
lpeters 34:341fb423e74b 1378 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1379 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 34:341fb423e74b 1380 cmd[1] = 0x08;
lpeters 34:341fb423e74b 1381 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1382 */
lpeters 35:73b3963c6dd3 1383 #if defined(TARGET_LRAT)
lpeters 35:73b3963c6dd3 1384 // LRAT ACC IRQ SETUP GOES HERE
lpeters 35:73b3963c6dd3 1385 #else
lpeters 34:341fb423e74b 1386 // ACC INTERRUPT SETUP
lpeters 34:341fb423e74b 1387 // Enable Interrupt Pin
lpeters 34:341fb423e74b 1388 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 34:341fb423e74b 1389 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1390 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1391 cmd[0] = LSM303_REG_ACC_CTRL_REG3_A;
lpeters 34:341fb423e74b 1392 cmd[1] = ret | 0x40;
lpeters 34:341fb423e74b 1393 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1394 // Enable Interrupt Latch
lpeters 34:341fb423e74b 1395 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 34:341fb423e74b 1396 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1397 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1398 cmd[0] = LSM303_REG_ACC_CTRL_REG5_A;
lpeters 34:341fb423e74b 1399 cmd[1] = ret | 0x08;
lpeters 34:341fb423e74b 1400 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1401
lpeters 34:341fb423e74b 1402 // Set Threshold/Duration/Config
lpeters 34:341fb423e74b 1403 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 34:341fb423e74b 1404 //cmd[1] = 0x10;
lpeters 34:341fb423e74b 1405 //cmd[1] = 0x40;
lpeters 34:341fb423e74b 1406 //cmd[1] = 0x60;
lpeters 34:341fb423e74b 1407 cmd[1] = 0x7D;
lpeters 34:341fb423e74b 1408 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1409 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 34:341fb423e74b 1410 cmd[1] = 0x00;
lpeters 34:341fb423e74b 1411 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1412 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 34:341fb423e74b 1413 cmd[1] = 0x2A;
lpeters 34:341fb423e74b 1414 //cmd[1] = 0x0A;
lpeters 34:341fb423e74b 1415 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 35:73b3963c6dd3 1416 accPin.rise(&onAccIrq);
lpeters 35:73b3963c6dd3 1417 #endif
lpeters 34:341fb423e74b 1418 }
lpeters 34:341fb423e74b 1419
lpeters 34:341fb423e74b 1420 void gpsInitSequence()
lpeters 34:341fb423e74b 1421 {
lpeters 35:73b3963c6dd3 1422 printf("In gpsInitSequence()...\r\n");
lpeters 35:73b3963c6dd3 1423 gpsRead();
lpeters 35:73b3963c6dd3 1424 if (mytime > 0)
lpeters 35:73b3963c6dd3 1425 {
lpeters 35:73b3963c6dd3 1426 set_time(mytime);
lpeters 35:73b3963c6dd3 1427 tInit = mytime;
lpeters 35:73b3963c6dd3 1428 myLedG = 1;
lpeters 35:73b3963c6dd3 1429 }
lpeters 35:73b3963c6dd3 1430 else
lpeters 35:73b3963c6dd3 1431 myLedR = 1;
lpeters 34:341fb423e74b 1432
lpeters 34:341fb423e74b 1433 for (int i = 0; i < 2; i++) {
lpeters 34:341fb423e74b 1434 myLedB = 1;
lpeters 44:cf1070af05db 1435 wait(0.25);
lpeters 34:341fb423e74b 1436 myLedB = 0;
lpeters 44:cf1070af05db 1437 wait(0.25);
lpeters 34:341fb423e74b 1438 }
lpeters 34:341fb423e74b 1439 myLedG = 0;
lpeters 34:341fb423e74b 1440 myLedR = 0;
Huot87 38:fd7a407bfe3e 1441
Huot87 38:fd7a407bfe3e 1442 // HUOT ADDITION -- GPS LOW POWER SETUP
Huot87 38:fd7a407bfe3e 1443 //printf("Disabling GLONASS... \r\n");
Huot87 38:fd7a407bfe3e 1444 //gpsExecuteCommand(cmdDisableGLONASS, sizeof(cmdDisableGLONASS)); // Disable GLONASS
Huot87 38:fd7a407bfe3e 1445 //printf("Disabling Time Pulse... \r\n");
Huot87 38:fd7a407bfe3e 1446 //gpsExecuteCommand(cmdDisableTimePulse, sizeof(cmdDisableTimePulse)); // Disable Time Pulse
Huot87 38:fd7a407bfe3e 1447 //printf("Configuring PMS... \r\n");
Huot87 38:fd7a407bfe3e 1448 //gpsExecuteCommand(cmdConfigPMS, sizeof(cmdConfigPMS)); // Configure Power Management Setup
Huot87 38:fd7a407bfe3e 1449 //printf("LPM Init Sequence Complete. \r\n");
Huot87 38:fd7a407bfe3e 1450 }
Huot87 38:fd7a407bfe3e 1451
Huot87 39:6da6cb44f22e 1452 // HUOT ADDITION 08/30/2018 -- GENERIC GPS EXECUTE COMMAND FUNCTION
Huot87 38:fd7a407bfe3e 1453 void gpsExecuteCommand(char *command, int length)
Huot87 38:fd7a407bfe3e 1454 {
Huot87 38:fd7a407bfe3e 1455
Huot87 38:fd7a407bfe3e 1456 uint8_t crcA = 0;
Huot87 38:fd7a407bfe3e 1457 uint8_t crcB = 0;
Huot87 38:fd7a407bfe3e 1458 for(int i = 2; i <= (length - 3); i++)
Huot87 38:fd7a407bfe3e 1459 {
Huot87 38:fd7a407bfe3e 1460 crcA = crcA + command[i];
Huot87 38:fd7a407bfe3e 1461 crcB = crcB + crcA;
Huot87 38:fd7a407bfe3e 1462 }
Huot87 38:fd7a407bfe3e 1463
Huot87 38:fd7a407bfe3e 1464 command[(length - 2)] = crcA;
Huot87 38:fd7a407bfe3e 1465 command[(length - 1)] = crcB;
Huot87 38:fd7a407bfe3e 1466 printf("UBX CRC: %02X %02X\r\n", crcA, crcB);
Huot87 38:fd7a407bfe3e 1467 i2c.write(NEOM8M_ADR_GPS, command, length);
lpeters 44:cf1070af05db 1468 ubxRead();
Huot87 38:fd7a407bfe3e 1469 printf("Command Executed \r\n");
lpeters 44:cf1070af05db 1470 //wait(1);
lpeters 34:341fb423e74b 1471 }
lpeters 34:341fb423e74b 1472
lpeters 34:341fb423e74b 1473 void magRead()
lpeters 34:341fb423e74b 1474 {
lpeters 34:341fb423e74b 1475 cmd[0] = LSM303_REG_MAG_STATUS_REG_M;
lpeters 34:341fb423e74b 1476 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1477 i2c.read(LSM303_ADR_MAG, &rda, 1);
lpeters 34:341fb423e74b 1478 if (rda)
lpeters 34:341fb423e74b 1479 {
lpeters 34:341fb423e74b 1480 cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M;
lpeters 34:341fb423e74b 1481 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1482 i2c.read(LSM303_ADR_MAG, &buf[0], 1);
lpeters 34:341fb423e74b 1483 cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M;
lpeters 34:341fb423e74b 1484 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1485 i2c.read(LSM303_ADR_MAG, &buf[1], 1);
lpeters 34:341fb423e74b 1486 cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M;
lpeters 34:341fb423e74b 1487 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1488 i2c.read(LSM303_ADR_MAG, &buf[2], 1);
lpeters 34:341fb423e74b 1489 cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M;
lpeters 34:341fb423e74b 1490 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1491 i2c.read(LSM303_ADR_MAG, &buf[3], 1);
lpeters 34:341fb423e74b 1492 cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M;
lpeters 34:341fb423e74b 1493 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1494 i2c.read(LSM303_ADR_MAG, &buf[4], 1);
lpeters 34:341fb423e74b 1495 cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M;
lpeters 34:341fb423e74b 1496 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1497 i2c.read(LSM303_ADR_MAG, &buf[5], 1);
lpeters 34:341fb423e74b 1498 myMagX = (buf[0] | (buf[1] << 8));
lpeters 34:341fb423e74b 1499 myMagY = (buf[2] | (buf[3] << 8));
lpeters 34:341fb423e74b 1500 myMagZ = (buf[4] | (buf[5] << 8));
lpeters 34:341fb423e74b 1501 if (myMagX < magMinX)
lpeters 34:341fb423e74b 1502 magMinX = myMagX;
lpeters 34:341fb423e74b 1503 if (myMagY < magMinY)
lpeters 34:341fb423e74b 1504 magMinY = myMagY;
lpeters 34:341fb423e74b 1505 if (myMagZ < magMinZ)
lpeters 34:341fb423e74b 1506 magMinZ = myMagZ;
lpeters 34:341fb423e74b 1507 if (myMagX > magMaxX)
lpeters 34:341fb423e74b 1508 magMaxX = myMagX;
lpeters 34:341fb423e74b 1509 if (myMagY > magMaxY)
lpeters 34:341fb423e74b 1510 magMaxY = myMagY;
lpeters 34:341fb423e74b 1511 if (myMagZ > magMaxZ)
lpeters 34:341fb423e74b 1512 magMaxZ = myMagZ;
lpeters 34:341fb423e74b 1513 cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M;
lpeters 34:341fb423e74b 1514 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1515 i2c.read(LSM303_ADR_MAG, &ret, 1);
lpeters 34:341fb423e74b 1516 if (ret & 0x01 && magEvent == 0 && ret & 0xFC)
lpeters 34:341fb423e74b 1517 {
lpeters 34:341fb423e74b 1518 magSFire++;
lpeters 34:341fb423e74b 1519 magEvent = 1;
lpeters 34:341fb423e74b 1520 magSHIRQ++;
lpeters 34:341fb423e74b 1521 }
lpeters 34:341fb423e74b 1522 else if (!(ret & 0x01) && magEvent == 1 && !(ret & 0xFC))
lpeters 34:341fb423e74b 1523 {
lpeters 34:341fb423e74b 1524 magSFire++;
lpeters 34:341fb423e74b 1525 magEvent = 0;
lpeters 34:341fb423e74b 1526 magSLIRQ++;
lpeters 34:341fb423e74b 1527 }
lpeters 34:341fb423e74b 1528 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 34:341fb423e74b 1529 }
lpeters 34:341fb423e74b 1530 }
lpeters 34:341fb423e74b 1531
lpeters 34:341fb423e74b 1532 void accRead()
lpeters 34:341fb423e74b 1533 {
lpeters 34:341fb423e74b 1534 cmd[0] = LSM303_REG_ACC_STATUS_REG_A;
lpeters 34:341fb423e74b 1535 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1536 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 34:341fb423e74b 1537 if (rda)
lpeters 34:341fb423e74b 1538 {
lpeters 34:341fb423e74b 1539 cmd[0] = LSM303_REG_ACC_OUT_X_L_A;
lpeters 34:341fb423e74b 1540 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1541 i2c.read(LSM303_ADR_ACC, &buf[0], 1);
lpeters 34:341fb423e74b 1542 cmd[0] = LSM303_REG_ACC_OUT_X_H_A;
lpeters 34:341fb423e74b 1543 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1544 i2c.read(LSM303_ADR_ACC, &buf[1], 1);
lpeters 34:341fb423e74b 1545 cmd[0] = LSM303_REG_ACC_OUT_Y_L_A;
lpeters 34:341fb423e74b 1546 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1547 i2c.read(LSM303_ADR_ACC, &buf[2], 1);
lpeters 34:341fb423e74b 1548 cmd[0] = LSM303_REG_ACC_OUT_Y_H_A;
lpeters 34:341fb423e74b 1549 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1550 i2c.read(LSM303_ADR_ACC, &buf[3], 1);
lpeters 34:341fb423e74b 1551 cmd[0] = LSM303_REG_ACC_OUT_Z_L_A;
lpeters 34:341fb423e74b 1552 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1553 i2c.read(LSM303_ADR_ACC, &buf[4], 1);
lpeters 34:341fb423e74b 1554 cmd[0] = LSM303_REG_ACC_OUT_Z_H_A;
lpeters 34:341fb423e74b 1555 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1556 i2c.read(LSM303_ADR_ACC, &buf[5], 1);
lpeters 34:341fb423e74b 1557 myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift);
lpeters 34:341fb423e74b 1558 myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift);
lpeters 34:341fb423e74b 1559 myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift);
lpeters 34:341fb423e74b 1560 if (myAccX < accMinX)
lpeters 34:341fb423e74b 1561 accMinX = myAccX;
lpeters 34:341fb423e74b 1562 if (myAccY < accMinY)
lpeters 34:341fb423e74b 1563 accMinY = myAccY;
lpeters 34:341fb423e74b 1564 if (myAccZ < accMinZ)
lpeters 34:341fb423e74b 1565 accMinZ = myAccZ;
lpeters 34:341fb423e74b 1566 if (myAccX > accMaxX)
lpeters 34:341fb423e74b 1567 accMaxX = myAccX;
lpeters 34:341fb423e74b 1568 if (myAccY > accMaxY)
lpeters 34:341fb423e74b 1569 accMaxY = myAccY;
lpeters 34:341fb423e74b 1570 if (myAccZ > accMaxZ)
lpeters 34:341fb423e74b 1571 accMaxZ = myAccZ;
lpeters 34:341fb423e74b 1572 cmd[0] = LSM303_REG_ACC_INT1_SRC_A;
lpeters 34:341fb423e74b 1573 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1574 i2c.read(LSM303_ADR_ACC, &ret, 1);
lpeters 34:341fb423e74b 1575 if (ret & 0x40)
lpeters 34:341fb423e74b 1576 {
lpeters 34:341fb423e74b 1577 accSFire++;
lpeters 34:341fb423e74b 1578 if (accEvent == 1)
lpeters 34:341fb423e74b 1579 {
lpeters 34:341fb423e74b 1580 accEvent = 0;
lpeters 34:341fb423e74b 1581 accSLIRQ++;
lpeters 34:341fb423e74b 1582 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 34:341fb423e74b 1583 cmd[1] = 0x7D;
lpeters 34:341fb423e74b 1584 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1585 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 34:341fb423e74b 1586 cmd[1] = 0x00;
lpeters 34:341fb423e74b 1587 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1588 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 34:341fb423e74b 1589 cmd[1] = 0x2A;
lpeters 34:341fb423e74b 1590 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1591 }
lpeters 34:341fb423e74b 1592 else
lpeters 34:341fb423e74b 1593 {
lpeters 34:341fb423e74b 1594 accEvent = 1;
lpeters 34:341fb423e74b 1595 accSHIRQ++;
lpeters 34:341fb423e74b 1596 cmd[0] = LSM303_REG_ACC_INT1_THS_A;
lpeters 34:341fb423e74b 1597 cmd[1] = 0x50;
lpeters 34:341fb423e74b 1598 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1599 cmd[0] = LSM303_REG_ACC_INT1_DURATION_A;
lpeters 34:341fb423e74b 1600 //cmd[1] = 0x7D;
lpeters 34:341fb423e74b 1601 cmd[1] = 0x03;
lpeters 34:341fb423e74b 1602 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1603 cmd[0] = LSM303_REG_ACC_INT1_CFG_A;
lpeters 34:341fb423e74b 1604 cmd[1] = 0x95;
lpeters 34:341fb423e74b 1605 i2c.write(LSM303_ADR_ACC, cmd, 2);
lpeters 34:341fb423e74b 1606 }
lpeters 34:341fb423e74b 1607 }
lpeters 34:341fb423e74b 1608 printf("A|%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, myAccX, 6, myAccY, 6, myAccZ, 6, accMinX, 6, accMinY, 6, accMinZ, 6, accMaxX, 6, accMaxY, 6, accMaxZ, ret, accSHIRQ, accSLIRQ, accSFire, accHFire);
lpeters 34:341fb423e74b 1609 }
lpeters 34:341fb423e74b 1610 }
lpeters 34:341fb423e74b 1611
lpeters 34:341fb423e74b 1612 void tmpRead()
lpeters 34:341fb423e74b 1613 {
lpeters 34:341fb423e74b 1614 #if defined(TARGET_LRAT)
lpeters 34:341fb423e74b 1615 cmd[0] = LSM303_REG_MAG_TEMP_L_M;
lpeters 34:341fb423e74b 1616 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1617 i2c.read(LSM303_ADR_MAG, &buf[0], 1);
lpeters 34:341fb423e74b 1618 cmd[0] = LSM303_REG_MAG_TEMP_H_M;
lpeters 34:341fb423e74b 1619 i2c.write(LSM303_ADR_MAG, cmd, 1);
lpeters 34:341fb423e74b 1620 i2c.read(LSM303_ADR_MAG, &buf[1], 1);
lpeters 34:341fb423e74b 1621 myTemp = (int16_t)(buf[0] | (buf[1] << 8));
lpeters 34:341fb423e74b 1622 printf("T|%02X %02X| (%d)\r\n", buf[0], buf[1], myTemp);
lpeters 34:341fb423e74b 1623 #else
lpeters 34:341fb423e74b 1624 cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A;
lpeters 34:341fb423e74b 1625 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1626 i2c.read(LSM303_ADR_ACC, &rda, 1);
lpeters 34:341fb423e74b 1627 if (rda & 0x04)
lpeters 34:341fb423e74b 1628 {
lpeters 34:341fb423e74b 1629 cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80;
lpeters 34:341fb423e74b 1630 i2c.write(LSM303_ADR_ACC, cmd, 1);
lpeters 34:341fb423e74b 1631 i2c.read(LSM303_ADR_ACC, &buf[0], 2);
lpeters 34:341fb423e74b 1632 myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6;
lpeters 34:341fb423e74b 1633 printf("T|%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp);
lpeters 34:341fb423e74b 1634 }
lpeters 34:341fb423e74b 1635 #endif
lpeters 34:341fb423e74b 1636 }
lpeters 34:341fb423e74b 1637
Huot87 38:fd7a407bfe3e 1638
Huot87 39:6da6cb44f22e 1639 // HUOT ALTERATION -- 08/30/2018 -- Change GPS read from "void" to return "int" to solidfy if fix was good or bad
Huot87 38:fd7a407bfe3e 1640 int gpsRead()
lpeters 34:341fb423e74b 1641 {
lpeters 34:341fb423e74b 1642 bool gpsDone = false;
lpeters 34:341fb423e74b 1643 bool fixGood = false;
lpeters 35:73b3963c6dd3 1644 uint8_t crcPass = 0;
lpeters 35:73b3963c6dd3 1645 uint8_t crcFail = 0;
lpeters 35:73b3963c6dd3 1646 uint32_t tDate = 0;
lpeters 35:73b3963c6dd3 1647 uint32_t tTime = 0;
lpeters 34:341fb423e74b 1648 myLedW = 1;
lpeters 34:341fb423e74b 1649 pos = 0;
lpeters 33:e47306c32791 1650 ret = 0xFF;
lpeters 33:e47306c32791 1651 cmd[0] = 0xFF;
lpeters 33:e47306c32791 1652 i2c.write(NEOM8M_ADR_GPS, cmd, 1);
lpeters 33:e47306c32791 1653 while(!gpsDone)
lpeters 33:e47306c32791 1654 {
lpeters 33:e47306c32791 1655 while (ret == 0xFF)
lpeters 33:e47306c32791 1656 {
lpeters 33:e47306c32791 1657 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 1658 }
lpeters 33:e47306c32791 1659 while (ret != 0xFF)
lpeters 33:e47306c32791 1660 {
lpeters 33:e47306c32791 1661 buf[pos++] = ret;
lpeters 33:e47306c32791 1662 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 1663 if (ret == '\r')
lpeters 33:e47306c32791 1664 {
lpeters 33:e47306c32791 1665 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 1666 if (ret == '\n')
lpeters 33:e47306c32791 1667 {
lpeters 33:e47306c32791 1668 buf[pos] = 0x00;
lpeters 34:341fb423e74b 1669 // NMEA Validation
lpeters 33:e47306c32791 1670 uint16_t crc = 0;
lpeters 35:73b3963c6dd3 1671 char clr = '\0';
lpeters 33:e47306c32791 1672 if (buf[0] == '$' && buf[pos-3] == '*')
lpeters 33:e47306c32791 1673 {
lpeters 35:73b3963c6dd3 1674 for (int i = 1; i < pos-3; i++)
lpeters 33:e47306c32791 1675 {
lpeters 33:e47306c32791 1676 crc ^= buf[i];
lpeters 33:e47306c32791 1677 }
lpeters 33:e47306c32791 1678 }
lpeters 33:e47306c32791 1679 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 35:73b3963c6dd3 1680 {
lpeters 33:e47306c32791 1681 clr = '2'; // 2 = Green
lpeters 35:73b3963c6dd3 1682 crcPass++;
lpeters 35:73b3963c6dd3 1683 }
lpeters 33:e47306c32791 1684 else
lpeters 35:73b3963c6dd3 1685 {
lpeters 33:e47306c32791 1686 clr = '1'; // 1 = Red
lpeters 35:73b3963c6dd3 1687 crcFail++;
lpeters 35:73b3963c6dd3 1688 }
lpeters 33:e47306c32791 1689 printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf);
lpeters 35:73b3963c6dd3 1690 if (clr == '2')
lpeters 35:73b3963c6dd3 1691 {
lpeters 33:e47306c32791 1692 // Global Positioning System Fix Data
lpeters 33:e47306c32791 1693 if(strncmp(buf, "$GNGGA", 6) == 0)
lpeters 33:e47306c32791 1694 {
lpeters 33:e47306c32791 1695 printf("GNGGA> ");
lpeters 33:e47306c32791 1696 //sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
lpeters 33:e47306c32791 1697 //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 1698 float fldTim, fldAlt;
lpeters 33:e47306c32791 1699 double fldLat, fldLon;
lpeters 33:e47306c32791 1700 char fldN_S, fldE_W;
lpeters 33:e47306c32791 1701 int fldFix, fldSat;
lpeters 42:d59e50622292 1702 if (sscanf(buf, "$GNGGA,%f,%lf,%c,%lf,%c,%d,%d,%*f,%f", &fldTim, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldFix, &fldSat, &fldAlt) == 8)
lpeters 42:d59e50622292 1703 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 1704 if (clr == '2')
lpeters 33:e47306c32791 1705 {
lpeters 33:e47306c32791 1706 mylat = fldLat / (fldN_S == 'S' ? -100 : 100);
lpeters 33:e47306c32791 1707 mylon = fldLon / (fldE_W == 'W' ? -100 : 100);
lpeters 35:73b3963c6dd3 1708 //mytime = (uint32_t)fldTim;
lpeters 33:e47306c32791 1709 mybatt = (fldSat & 0xF0 ? 0x0F : fldSat & 0x0F);
lpeters 33:e47306c32791 1710 }
lpeters 33:e47306c32791 1711 }
lpeters 33:e47306c32791 1712 // Satellite status
lpeters 33:e47306c32791 1713 if(strncmp(buf, "$GNGSA", 6) == 0)
lpeters 33:e47306c32791 1714 {
lpeters 35:73b3963c6dd3 1715 //printf("GNGSA> ");
lpeters 33:e47306c32791 1716 //sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
lpeters 33:e47306c32791 1717 //pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
lpeters 33:e47306c32791 1718 char fldTyp;
lpeters 33:e47306c32791 1719 int fldDim, fldSat;
lpeters 33:e47306c32791 1720 sscanf(buf, "$GNGSA,%c,%d,%d", &fldTyp, &fldDim, &fldSat);
lpeters 35:73b3963c6dd3 1721 //printf("Typ: %c, Pos: %d, Sat: %d\r\n", fldTyp, fldDim, fldSat);
lpeters 33:e47306c32791 1722 }
lpeters 33:e47306c32791 1723 // Geographic position, Latitude and Longitude
lpeters 33:e47306c32791 1724 if(strncmp(buf, "$GNGLL", 6) == 0)
lpeters 33:e47306c32791 1725 {
lpeters 35:73b3963c6dd3 1726 //printf("GNGLL> ");
lpeters 33:e47306c32791 1727 //sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
lpeters 33:e47306c32791 1728 //pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
lpeters 33:e47306c32791 1729 float fldTim;
lpeters 33:e47306c32791 1730 double fldLat, fldLon;
lpeters 33:e47306c32791 1731 char fldN_S, fldE_W;
lpeters 33:e47306c32791 1732 sscanf(buf, "$GNGLL,%lf,%c,%lf,%c,%f", &fldLat, &fldN_S, &fldLon, &fldE_W, &fldTim);
lpeters 35:73b3963c6dd3 1733 //printf("Lat: %.5f %c, Lon: %.5f %c, Sec: %.2f\r\n", fldLat, fldN_S, fldLon, fldE_W, fldTim);
lpeters 33:e47306c32791 1734 }
lpeters 33:e47306c32791 1735 // Geographic position, Latitude and Longitude
lpeters 33:e47306c32791 1736 if(strncmp(buf, "$GNRMC", 6) == 0)
lpeters 33:e47306c32791 1737 {
lpeters 35:73b3963c6dd3 1738 //printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf);
lpeters 33:e47306c32791 1739 printf("GNRMC> ");
lpeters 33:e47306c32791 1740 //sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
lpeters 33:e47306c32791 1741 //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 35:73b3963c6dd3 1742 float fldTim, fldSpd, fldTrk;
lpeters 35:73b3963c6dd3 1743 fldTrk = 0;
lpeters 33:e47306c32791 1744 double fldLat, fldLon;
lpeters 33:e47306c32791 1745 char fldSts, fldN_S, fldE_W;
lpeters 35:73b3963c6dd3 1746 uint32_t fldDat;
lpeters 35:73b3963c6dd3 1747 if (sscanf(buf, "$GNRMC,,%c", &fldSts) != 1 &&
lpeters 35:73b3963c6dd3 1748 sscanf(buf, "$GNRMC,%f,%c,,,,,,,%d", &fldTim, &fldSts, &fldDat) != 3 &&
lpeters 35:73b3963c6dd3 1749 sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,,%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, &fldDat) != 8 &&
lpeters 35:73b3963c6dd3 1750 sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,%f,%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, &fldTrk, &fldDat) != 9)
lpeters 35:73b3963c6dd3 1751 printf("[\u001b[33mWARN\u001b[0m] Invalid GNRMC packet detected.\r\n");
lpeters 35:73b3963c6dd3 1752 //sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,%7[^,],%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, fldFoo, &fldDat);
lpeters 44:cf1070af05db 1753 if (fldN_S == 'N' || fldN_S == 'S' && fldE_W == 'E' || fldE_W == 'W')
lpeters 44:cf1070af05db 1754 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 44:cf1070af05db 1755 else
lpeters 44:cf1070af05db 1756 printf("\r\n");
lpeters 35:73b3963c6dd3 1757 if (clr == '2')
lpeters 35:73b3963c6dd3 1758 {
lpeters 35:73b3963c6dd3 1759 tTime = (uint32_t)fldTim;
lpeters 35:73b3963c6dd3 1760 tDate = fldDat;
lpeters 35:73b3963c6dd3 1761 if (fldSts == 'A')
lpeters 35:73b3963c6dd3 1762 fixGood = true;
lpeters 35:73b3963c6dd3 1763 }
lpeters 35:73b3963c6dd3 1764 }
lpeters 33:e47306c32791 1765 }
lpeters 33:e47306c32791 1766 pos = 0;
lpeters 33:e47306c32791 1767 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 1768 }
lpeters 33:e47306c32791 1769 else
lpeters 33:e47306c32791 1770 {
lpeters 35:73b3963c6dd3 1771 printf("[\u001b[33mWARN\u001b[0m] Expected '0A', received '%02X'.\r\n", ret);
lpeters 33:e47306c32791 1772 }
lpeters 33:e47306c32791 1773 }
lpeters 37:df69df1bcb1a 1774 //else if (pos == 82)
lpeters 37:df69df1bcb1a 1775 else if (pos == 191)
lpeters 33:e47306c32791 1776 {
lpeters 33:e47306c32791 1777 buf[pos] = 0x00;
lpeters 33:e47306c32791 1778 printf("GPS: |%s| ...\r\n", buf);
lpeters 33:e47306c32791 1779 pos = 0;
lpeters 33:e47306c32791 1780 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 33:e47306c32791 1781 }
lpeters 33:e47306c32791 1782 }
lpeters 33:e47306c32791 1783 buf[pos] = 0x00;
lpeters 33:e47306c32791 1784 gpsDone = true;
lpeters 33:e47306c32791 1785 }
lpeters 33:e47306c32791 1786 if (pos > 0)
lpeters 33:e47306c32791 1787 printf("GPS: |%s|\r\n", buf);
lpeters 34:341fb423e74b 1788 myLedW = 0;
lpeters 35:73b3963c6dd3 1789 if (crcFail)
lpeters 35:73b3963c6dd3 1790 printf("[\u001b[33mWARN\u001b[0m] CRC PASS: %d FAIL: %d\r\n", crcPass, crcFail);
lpeters 35:73b3963c6dd3 1791
lpeters 35:73b3963c6dd3 1792 struct tm ts;
lpeters 35:73b3963c6dd3 1793 time_t t;
lpeters 35:73b3963c6dd3 1794
lpeters 35:73b3963c6dd3 1795 uint8_t tDay = tDate / 10000;
lpeters 35:73b3963c6dd3 1796 uint8_t tMon = (tDate - (tDay * 10000)) / 100;
lpeters 35:73b3963c6dd3 1797 uint8_t tYear = (tDate - ((tDay * 10000) + (tMon * 100))) + 100;
lpeters 35:73b3963c6dd3 1798 uint8_t tHour = tTime / 10000;
lpeters 35:73b3963c6dd3 1799 uint8_t tMin = (tTime - (tHour * 10000)) / 100;
lpeters 35:73b3963c6dd3 1800 uint8_t tSec = (tTime - ((tHour * 10000) + (tMin * 100)));
lpeters 35:73b3963c6dd3 1801
lpeters 35:73b3963c6dd3 1802 ts.tm_year = tYear;
lpeters 35:73b3963c6dd3 1803 ts.tm_mon = tMon - 1;
lpeters 35:73b3963c6dd3 1804 ts.tm_mday = tDay;
lpeters 35:73b3963c6dd3 1805 ts.tm_hour = tHour;
lpeters 35:73b3963c6dd3 1806 ts.tm_min = tMin;
lpeters 35:73b3963c6dd3 1807 ts.tm_sec = tSec;
lpeters 35:73b3963c6dd3 1808 t = mktime(&ts);
lpeters 35:73b3963c6dd3 1809 //printf("DAT: %06d TIM: %d\r\n", tDate, tTime);
lpeters 35:73b3963c6dd3 1810 //printf("CNV: %04d-%02d-%02d@%02d:%02d:%02d\r\n", tYear, tMon, tDay, tHour, tMin, tSec);
lpeters 35:73b3963c6dd3 1811 //printf("T: %d\t%s", t, ctime(&t));
lpeters 35:73b3963c6dd3 1812 printf("GPS: %08X\t%s", t, ctime(&t));
lpeters 35:73b3963c6dd3 1813 mytime = t;
lpeters 33:e47306c32791 1814
Huot87 43:c900cd8ea072 1815
Huot87 43:c900cd8ea072 1816 // if (fixGood)
Huot87 43:c900cd8ea072 1817 // myLedG = 1;
Huot87 43:c900cd8ea072 1818 // else
Huot87 43:c900cd8ea072 1819 // myLedR = 1;
Huot87 43:c900cd8ea072 1820 //
Huot87 43:c900cd8ea072 1821 // for (int i = 0; i < 10; i++) {
Huot87 43:c900cd8ea072 1822 // myLedB = 1;
Huot87 43:c900cd8ea072 1823 // wait(0.1);
Huot87 43:c900cd8ea072 1824 // myLedB = 0;
Huot87 43:c900cd8ea072 1825 // wait(0.1);
Huot87 43:c900cd8ea072 1826 // }
Huot87 43:c900cd8ea072 1827
Huot87 38:fd7a407bfe3e 1828
Huot87 38:fd7a407bfe3e 1829 if (fixGood)
Huot87 38:fd7a407bfe3e 1830 return 0;
Huot87 38:fd7a407bfe3e 1831 else
Huot87 38:fd7a407bfe3e 1832 return 1;
mbed_official 0:7037ed05f54f 1833 }
mbed_official 0:7037ed05f54f 1834
lpeters 37:df69df1bcb1a 1835 void ubxRead()
lpeters 37:df69df1bcb1a 1836 {
lpeters 37:df69df1bcb1a 1837 uint8_t crcPass = 0;
lpeters 37:df69df1bcb1a 1838 uint8_t crcFail = 0;
lpeters 37:df69df1bcb1a 1839
lpeters 37:df69df1bcb1a 1840 myLedW = 1;
lpeters 37:df69df1bcb1a 1841 pos = 0;
lpeters 37:df69df1bcb1a 1842 ret = 0xFF;
lpeters 37:df69df1bcb1a 1843 cmd[0] = 0xFF;
lpeters 37:df69df1bcb1a 1844 i2c.write(NEOM8M_ADR_GPS, cmd, 1);
lpeters 37:df69df1bcb1a 1845 while (ret == 0xFF)
lpeters 37:df69df1bcb1a 1846 {
lpeters 37:df69df1bcb1a 1847 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 44:cf1070af05db 1848 }
lpeters 37:df69df1bcb1a 1849 while (ret != 0xFF)
lpeters 37:df69df1bcb1a 1850 {
lpeters 37:df69df1bcb1a 1851 buf[pos++] = ret;
lpeters 37:df69df1bcb1a 1852 i2c.read(NEOM8M_ADR_GPS, &ret, 1);
lpeters 37:df69df1bcb1a 1853 }
lpeters 37:df69df1bcb1a 1854 printf("UBX: | ");
lpeters 37:df69df1bcb1a 1855 for (int i = 0; i <= pos; i++) { printf("%02X ", buf[i]); }
lpeters 37:df69df1bcb1a 1856 printf("|\r\n", buf);
lpeters 37:df69df1bcb1a 1857 myLedW = 0;
lpeters 37:df69df1bcb1a 1858 //if (crcFail)
lpeters 37:df69df1bcb1a 1859 // printf("[\u001b[33mWARN\u001b[0m] CRC PASS: %d FAIL: %d\r\n", crcPass, crcFail);
lpeters 37:df69df1bcb1a 1860
lpeters 37:df69df1bcb1a 1861 if (pos > 0)
lpeters 37:df69df1bcb1a 1862 myLedG = 1;
lpeters 37:df69df1bcb1a 1863 else
lpeters 37:df69df1bcb1a 1864 myLedR = 1;
lpeters 37:df69df1bcb1a 1865
lpeters 37:df69df1bcb1a 1866 for (int i = 0; i < 10; i++) {
lpeters 37:df69df1bcb1a 1867 myLedB = 1;
lpeters 37:df69df1bcb1a 1868 wait(0.1);
lpeters 37:df69df1bcb1a 1869 myLedB = 0;
lpeters 37:df69df1bcb1a 1870 wait(0.1);
lpeters 37:df69df1bcb1a 1871 }
lpeters 37:df69df1bcb1a 1872 }
lpeters 37:df69df1bcb1a 1873
Huot87 40:eaf476b94684 1874 // HUOT ADDITION -- 08/31/2018 -- Write Packet to EEPROM (on failed send)
Huot87 40:eaf476b94684 1875 void backupPacket()
Huot87 40:eaf476b94684 1876 {
Huot87 40:eaf476b94684 1877 printf("====== IN BACKUP PACKET METHOD ======= \r\n");
Huot87 40:eaf476b94684 1878 int location = eepromCounter * 11;
lpeters 42:d59e50622292 1879 printf("Writing entry #%d to 0x%08d\r\n", eepromCounter, location);
lpeters 42:d59e50622292 1880 printf("BUF: |");
lpeters 42:d59e50622292 1881 for (int i = 0; i < PACKET_LEN; i++) { printf("%02X", tx_buffer[i]); }
lpeters 42:d59e50622292 1882 printf("|\r\n");
Huot87 40:eaf476b94684 1883 for (int i = 0; i < 11; i++)
Huot87 40:eaf476b94684 1884 {
Huot87 40:eaf476b94684 1885 writeEEPROMByte(location++, tx_buffer[i]);
Huot87 40:eaf476b94684 1886 }
Huot87 40:eaf476b94684 1887 eepromCounter++;
Huot87 40:eaf476b94684 1888 }
Huot87 40:eaf476b94684 1889
Huot87 40:eaf476b94684 1890 // HUOT ADDITION -- 08/31/2018 -- Read EEPROM Memory into Buffer
Huot87 40:eaf476b94684 1891 void prepBacklogSend()
Huot87 40:eaf476b94684 1892 {
Huot87 40:eaf476b94684 1893 printf("====== IN PREP BACKLOG SEND METHOD ======= \r\n");
Huot87 40:eaf476b94684 1894 int location = (eepromCounter - 1) * 11;
lpeters 42:d59e50622292 1895 printf("Reading entry #%d from 0x%08d\r\n", eepromCounter - 1, location);
Huot87 40:eaf476b94684 1896 for (int i = 0; i < 11; i++)
Huot87 40:eaf476b94684 1897 {
Huot87 40:eaf476b94684 1898 tx_buffer[i] = readEEPROMByte(location++);
Huot87 40:eaf476b94684 1899 }
lpeters 42:d59e50622292 1900 printf("BUF: |");
lpeters 42:d59e50622292 1901 for (int i = 0; i < PACKET_LEN; i++) { printf("%02X", tx_buffer[i]); }
lpeters 42:d59e50622292 1902 printf("|\r\n");
Huot87 40:eaf476b94684 1903 }
Huot87 40:eaf476b94684 1904
mbed_official 0:7037ed05f54f 1905 // EOF