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