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:
Huot87
Date:
Thu Sep 13 18:16:02 2018 +0000
Revision:
47:d643f02b5dab
Parent:
45:db9580357bc6
Work In Progress -- Code Refactor and Cleanup;

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