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@36:dcc6f89fa39a, 2018-08-27 (annotated)
- Committer:
- lpeters
- Date:
- Mon Aug 27 21:06:30 2018 +0000
- Revision:
- 36:dcc6f89fa39a
- Parent:
- 35:73b3963c6dd3
- Child:
- 37:df69df1bcb1a
Overrode LoRaWAN stack with custom timing loop.
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 | 34:341fb423e74b | 18 | //#define TARGET_LRAT 1 |
lpeters | 35:73b3963c6dd3 | 19 | #define TARGET_DISCO1 1 |
lpeters | 35:73b3963c6dd3 | 20 | //#define TARGET_DISCO2 1 |
lpeters | 34:341fb423e74b | 21 | //#define SENSOR_TEMP 1 |
lpeters | 36:dcc6f89fa39a | 22 | |
mbed_official | 0:7037ed05f54f | 23 | #include <stdio.h> |
tchari | 30:ff249a9156dc | 24 | #include "mbed.h" |
mbed_official | 3:8c7198d1a2a1 | 25 | |
mbed_official | 0:7037ed05f54f | 26 | #include "lorawan/LoRaWANInterface.h" |
mbed_official | 0:7037ed05f54f | 27 | #include "lorawan/system/lorawan_data_structures.h" |
mbed_official | 0:7037ed05f54f | 28 | #include "events/EventQueue.h" |
mbed_official | 0:7037ed05f54f | 29 | |
mbed_official | 0:7037ed05f54f | 30 | // Application helpers |
mbed_official | 0:7037ed05f54f | 31 | #include "DummySensor.h" |
mbed_official | 0:7037ed05f54f | 32 | #include "trace_helper.h" |
mbed_official | 0:7037ed05f54f | 33 | #include "lora_radio_helper.h" |
mbed_official | 0:7037ed05f54f | 34 | |
tchari | 30:ff249a9156dc | 35 | #include "mbed-trace/mbed_trace.h" |
tchari | 30:ff249a9156dc | 36 | #define TRACE_GROUP "MAIN" |
tchari | 30:ff249a9156dc | 37 | |
mbed_official | 0:7037ed05f54f | 38 | using namespace events; |
mbed_official | 0:7037ed05f54f | 39 | |
mbed_official | 12:5015dfead3f2 | 40 | // Max payload size can be LORAMAC_PHY_MAXPAYLOAD. |
mbed_official | 12:5015dfead3f2 | 41 | // This example only communicates with much shorter messages (<30 bytes). |
mbed_official | 12:5015dfead3f2 | 42 | // If longer messages are used, these buffers must be changed accordingly. |
mbed_official | 12:5015dfead3f2 | 43 | uint8_t tx_buffer[30]; |
mbed_official | 12:5015dfead3f2 | 44 | uint8_t rx_buffer[30]; |
mbed_official | 0:7037ed05f54f | 45 | |
mbed_official | 0:7037ed05f54f | 46 | /* |
mbed_official | 0:7037ed05f54f | 47 | * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing |
mbed_official | 0:7037ed05f54f | 48 | */ |
mbed_official | 0:7037ed05f54f | 49 | #define TX_TIMER 10000 |
mbed_official | 0:7037ed05f54f | 50 | |
mbed_official | 0:7037ed05f54f | 51 | /** |
mbed_official | 0:7037ed05f54f | 52 | * Maximum number of events for the event queue. |
mbed_official | 12:5015dfead3f2 | 53 | * 10 is the safe number for the stack events, however, if application |
mbed_official | 0:7037ed05f54f | 54 | * also uses the queue for whatever purposes, this number should be increased. |
mbed_official | 0:7037ed05f54f | 55 | */ |
mbed_official | 12:5015dfead3f2 | 56 | #define MAX_NUMBER_OF_EVENTS 10 |
mbed_official | 0:7037ed05f54f | 57 | |
mbed_official | 0:7037ed05f54f | 58 | /** |
mbed_official | 0:7037ed05f54f | 59 | * Maximum number of retries for CONFIRMED messages before giving up |
mbed_official | 0:7037ed05f54f | 60 | */ |
tchari | 30:ff249a9156dc | 61 | #define CONFIRMED_MSG_RETRY_COUNTER 15 |
mbed_official | 0:7037ed05f54f | 62 | |
mbed_official | 0:7037ed05f54f | 63 | /** |
mbed_official | 0:7037ed05f54f | 64 | * Dummy pin for dummy sensor |
mbed_official | 0:7037ed05f54f | 65 | */ |
mbed_official | 0:7037ed05f54f | 66 | #define PC_9 0 |
mbed_official | 0:7037ed05f54f | 67 | |
mbed_official | 0:7037ed05f54f | 68 | /** |
mbed_official | 0:7037ed05f54f | 69 | * Dummy sensor class object |
mbed_official | 0:7037ed05f54f | 70 | */ |
mbed_official | 0:7037ed05f54f | 71 | DS1820 ds1820(PC_9); |
mbed_official | 0:7037ed05f54f | 72 | |
mbed_official | 0:7037ed05f54f | 73 | /** |
mbed_official | 0:7037ed05f54f | 74 | * This event queue is the global event queue for both the |
mbed_official | 0:7037ed05f54f | 75 | * application and stack. To conserve memory, the stack is designed to run |
mbed_official | 0:7037ed05f54f | 76 | * in the same thread as the application and the application is responsible for |
mbed_official | 0:7037ed05f54f | 77 | * providing an event queue to the stack that will be used for ISR deferment as |
mbed_official | 0:7037ed05f54f | 78 | * well as application information event queuing. |
mbed_official | 0:7037ed05f54f | 79 | */ |
mbed_official | 0:7037ed05f54f | 80 | static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS * EVENTS_EVENT_SIZE); |
mbed_official | 0:7037ed05f54f | 81 | |
mbed_official | 0:7037ed05f54f | 82 | /** |
mbed_official | 0:7037ed05f54f | 83 | * Event handler. |
mbed_official | 0:7037ed05f54f | 84 | * |
mbed_official | 0:7037ed05f54f | 85 | * This will be passed to the LoRaWAN stack to queue events for the |
mbed_official | 0:7037ed05f54f | 86 | * application which in turn drive the application. |
mbed_official | 0:7037ed05f54f | 87 | */ |
mbed_official | 0:7037ed05f54f | 88 | static void lora_event_handler(lorawan_event_t event); |
mbed_official | 0:7037ed05f54f | 89 | |
mbed_official | 0:7037ed05f54f | 90 | /** |
mbed_official | 2:dc95ac6d6d4e | 91 | * Constructing Mbed LoRaWANInterface and passing it down the radio object. |
mbed_official | 0:7037ed05f54f | 92 | */ |
mbed_official | 2:dc95ac6d6d4e | 93 | static LoRaWANInterface lorawan(radio); |
mbed_official | 0:7037ed05f54f | 94 | |
mbed_official | 0:7037ed05f54f | 95 | /** |
mbed_official | 0:7037ed05f54f | 96 | * Application specific callbacks |
mbed_official | 0:7037ed05f54f | 97 | */ |
mbed_official | 0:7037ed05f54f | 98 | static lorawan_app_callbacks_t callbacks; |
mbed_official | 0:7037ed05f54f | 99 | |
lpeters | 35:73b3963c6dd3 | 100 | /* |
lpeters | 35:73b3963c6dd3 | 101 | #if defined(TARGET_LRAT) or defined(TARGET_DISCO2) |
lpeters | 34:341fb423e74b | 102 | #include "USBSerial.h" |
lpeters | 34:341fb423e74b | 103 | USBSerial serial; |
lpeters | 34:341fb423e74b | 104 | FileHandle* mbed::mbed_override_console(int) { |
lpeters | 34:341fb423e74b | 105 | return &serial; |
lpeters | 34:341fb423e74b | 106 | } |
lpeters | 34:341fb423e74b | 107 | #endif |
lpeters | 35:73b3963c6dd3 | 108 | */ |
lpeters | 34:341fb423e74b | 109 | |
lpeters | 35:73b3963c6dd3 | 110 | uint32_t mytime = 0; |
lpeters | 35:73b3963c6dd3 | 111 | uint8_t mybatt = 0; |
lpeters | 35:73b3963c6dd3 | 112 | double mylat = 0; |
lpeters | 35:73b3963c6dd3 | 113 | double mylon = 0; |
lpeters | 33:e47306c32791 | 114 | |
lpeters | 33:e47306c32791 | 115 | int16_t myAccX = 0; |
lpeters | 33:e47306c32791 | 116 | int16_t myAccY = 0; |
lpeters | 33:e47306c32791 | 117 | int16_t myAccZ = 0; |
lpeters | 33:e47306c32791 | 118 | int16_t myMagX = 0; |
lpeters | 33:e47306c32791 | 119 | int16_t myMagY = 0; |
lpeters | 33:e47306c32791 | 120 | int16_t myMagZ = 0; |
lpeters | 33:e47306c32791 | 121 | int16_t myOffX = 0; |
lpeters | 33:e47306c32791 | 122 | int16_t myOffY = 0; |
lpeters | 33:e47306c32791 | 123 | int16_t myOffZ = 0; |
lpeters | 33:e47306c32791 | 124 | int16_t myTemp = 0; |
lpeters | 33:e47306c32791 | 125 | |
lpeters | 33:e47306c32791 | 126 | int16_t accMinX = 0; |
lpeters | 33:e47306c32791 | 127 | int16_t accMinY = 0; |
lpeters | 33:e47306c32791 | 128 | int16_t accMinZ = 0; |
lpeters | 33:e47306c32791 | 129 | int16_t accMaxX = 0; |
lpeters | 33:e47306c32791 | 130 | int16_t accMaxY = 0; |
lpeters | 33:e47306c32791 | 131 | int16_t accMaxZ = 0; |
lpeters | 33:e47306c32791 | 132 | |
lpeters | 33:e47306c32791 | 133 | int16_t magMinX = 0; |
lpeters | 33:e47306c32791 | 134 | int16_t magMinY = 0; |
lpeters | 33:e47306c32791 | 135 | int16_t magMinZ = 0; |
lpeters | 33:e47306c32791 | 136 | int16_t magMaxX = 0; |
lpeters | 33:e47306c32791 | 137 | int16_t magMaxY = 0; |
lpeters | 33:e47306c32791 | 138 | int16_t magMaxZ = 0; |
lpeters | 33:e47306c32791 | 139 | |
lpeters | 33:e47306c32791 | 140 | #define NEOM8M_ADR_GPS 0x84 |
lpeters | 34:341fb423e74b | 141 | //#define LSM303_ADR_ACC 0x32 |
lpeters | 33:e47306c32791 | 142 | #define LSM303_ADR_MAG 0x3C |
tchari | 30:ff249a9156dc | 143 | |
lpeters | 33:e47306c32791 | 144 | #define NEOM8M_REG_GPS_LENH 0xFD |
lpeters | 33:e47306c32791 | 145 | #define NEOM8M_REG_GPS_LENL 0xFE |
lpeters | 33:e47306c32791 | 146 | #define NEOM8M_REG_GPS_DATA 0xFE |
lpeters | 33:e47306c32791 | 147 | #define LSM303_REG_ACC_STATUS_REG_AUX_A 0x07 |
lpeters | 34:341fb423e74b | 148 | //#define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C |
lpeters | 34:341fb423e74b | 149 | //#define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D |
lpeters | 33:e47306c32791 | 150 | #define LSM303_REG_ACC_WHO_AM_I_A 0x0F |
lpeters | 34:341fb423e74b | 151 | //#define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F |
lpeters | 33:e47306c32791 | 152 | #define LSM303_REG_ACC_CTRL_REG1_A 0x20 |
lpeters | 33:e47306c32791 | 153 | #define LSM303_REG_ACC_CTRL_REG2_A 0x21 |
lpeters | 33:e47306c32791 | 154 | #define LSM303_REG_ACC_CTRL_REG3_A 0x22 |
lpeters | 33:e47306c32791 | 155 | #define LSM303_REG_ACC_CTRL_REG4_A 0x23 |
lpeters | 33:e47306c32791 | 156 | #define LSM303_REG_ACC_CTRL_REG5_A 0x24 |
lpeters | 34:341fb423e74b | 157 | #define LSM303_REG_ACC_CTRL_REG6_A 0x25 |
lpeters | 33:e47306c32791 | 158 | #define LSM303_REG_ACC_STATUS_REG_A 0x27 |
lpeters | 33:e47306c32791 | 159 | #define LSM303_REG_ACC_OUT_X_L_A 0x28 |
lpeters | 33:e47306c32791 | 160 | #define LSM303_REG_ACC_OUT_X_H_A 0x29 |
lpeters | 33:e47306c32791 | 161 | #define LSM303_REG_ACC_OUT_Y_L_A 0x2A |
lpeters | 33:e47306c32791 | 162 | #define LSM303_REG_ACC_OUT_Y_H_A 0x2B |
lpeters | 33:e47306c32791 | 163 | #define LSM303_REG_ACC_OUT_Z_L_A 0x2C |
lpeters | 33:e47306c32791 | 164 | #define LSM303_REG_ACC_OUT_Z_H_A 0x2D |
lpeters | 33:e47306c32791 | 165 | #define LSM303_REG_ACC_INT1_CFG_A 0x30 |
lpeters | 33:e47306c32791 | 166 | #define LSM303_REG_ACC_INT1_SRC_A 0x31 |
lpeters | 33:e47306c32791 | 167 | #define LSM303_REG_ACC_INT1_THS_A 0x32 |
lpeters | 33:e47306c32791 | 168 | #define LSM303_REG_ACC_INT1_DURATION_A 0x33 |
lpeters | 35:73b3963c6dd3 | 169 | |
lpeters | 33:e47306c32791 | 170 | #define LSM303_REG_MAG_OFFSET_X_REG_L_M 0x45 |
lpeters | 33:e47306c32791 | 171 | #define LSM303_REG_MAG_OFFSET_X_REG_H_M 0x46 |
lpeters | 33:e47306c32791 | 172 | #define LSM303_REG_MAG_OFFSET_Y_REG_L_M 0x47 |
lpeters | 33:e47306c32791 | 173 | #define LSM303_REG_MAG_OFFSET_Y_REG_H_M 0x48 |
lpeters | 33:e47306c32791 | 174 | #define LSM303_REG_MAG_OFFSET_Z_REG_L_M 0x49 |
lpeters | 33:e47306c32791 | 175 | #define LSM303_REG_MAG_OFFSET_Z_REG_H_M 0x4A |
lpeters | 34:341fb423e74b | 176 | //#define LSM303_REG_MAG_WHO_AM_I_M 0x4F |
lpeters | 34:341fb423e74b | 177 | //#define LSM303_REG_MAG_CFG_REG_A_M 0x60 |
lpeters | 34:341fb423e74b | 178 | //#define LSM303_REG_MAG_CFG_REG_B_M 0x61 |
lpeters | 34:341fb423e74b | 179 | //#define LSM303_REG_MAG_CFG_REG_C_M 0x62 |
lpeters | 33:e47306c32791 | 180 | #define LSM303_REG_MAG_INT_CTRL_REG_M 0x63 |
lpeters | 33:e47306c32791 | 181 | #define LSM303_REG_MAG_INT_SOURCE_REG_M 0x64 |
lpeters | 33:e47306c32791 | 182 | #define LSM303_REG_MAG_INT_THS_L_REG_M 0x65 |
lpeters | 33:e47306c32791 | 183 | #define LSM303_REG_MAG_INT_THS_H_REG_M 0x66 |
lpeters | 34:341fb423e74b | 184 | //#define LSM303_REG_MAG_STATUS_REG_M 0x67 |
lpeters | 34:341fb423e74b | 185 | //#define LSM303_REG_MAG_OUTX_L_REG_M 0x68 |
lpeters | 34:341fb423e74b | 186 | //#define LSM303_REG_MAG_OUTX_H_REG_M 0x69 |
lpeters | 34:341fb423e74b | 187 | //#define LSM303_REG_MAG_OUTY_L_REG_M 0x6A |
lpeters | 34:341fb423e74b | 188 | //#define LSM303_REG_MAG_OUTY_H_REG_M 0x6B |
lpeters | 34:341fb423e74b | 189 | //#define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C |
lpeters | 34:341fb423e74b | 190 | //#define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D |
lpeters | 33:e47306c32791 | 191 | |
lpeters | 35:73b3963c6dd3 | 192 | #define EEPROM_MAX 0x17FF |
lpeters | 35:73b3963c6dd3 | 193 | |
lpeters | 34:341fb423e74b | 194 | #if defined(TARGET_LRAT) |
lpeters | 34:341fb423e74b | 195 | #define LEDR PB_6 |
lpeters | 34:341fb423e74b | 196 | #define LEDG PB_7 |
lpeters | 34:341fb423e74b | 197 | #define LEDB PB_5 |
lpeters | 34:341fb423e74b | 198 | #define LEDW PB_2 |
lpeters | 35:73b3963c6dd3 | 199 | #define PIN_ACC PB_14 |
lpeters | 35:73b3963c6dd3 | 200 | #define PIN_MAG PB_12 |
lpeters | 35:73b3963c6dd3 | 201 | #define PIN_BTN PA_5 |
lpeters | 35:73b3963c6dd3 | 202 | #define PIN_ALT PA_4 |
lpeters | 34:341fb423e74b | 203 | #define LSM303_ADR_ACC 0x3A |
lpeters | 34:341fb423e74b | 204 | #define LSM303_REG_MAG_WHO_AM_I_M 0x0F |
lpeters | 34:341fb423e74b | 205 | #define LSM303_WHO_ACC 0x41 |
lpeters | 34:341fb423e74b | 206 | #define LSM303_WHO_MAG 0x3D |
lpeters | 34:341fb423e74b | 207 | #define LSM303_CTRL_REG7_A 0x26 |
lpeters | 34:341fb423e74b | 208 | #define LSM303_REG_MAG_CTRL_REG1_M 0x20 |
lpeters | 34:341fb423e74b | 209 | #define LSM303_REG_MAG_CTRL_REG2_M 0x21 |
lpeters | 34:341fb423e74b | 210 | #define LSM303_REG_MAG_CTRL_REG3_M 0x22 |
lpeters | 34:341fb423e74b | 211 | #define LSM303_REG_MAG_CTRL_REG4_M 0x23 |
lpeters | 34:341fb423e74b | 212 | #define LSM303_REG_MAG_CTRL_REG5_M 0x24 |
lpeters | 34:341fb423e74b | 213 | #define LSM303_REG_MAG_STATUS_REG_M 0x27 |
lpeters | 34:341fb423e74b | 214 | #define LSM303_REG_MAG_OUTX_L_REG_M 0x28 |
lpeters | 34:341fb423e74b | 215 | #define LSM303_REG_MAG_OUTX_H_REG_M 0x29 |
lpeters | 34:341fb423e74b | 216 | #define LSM303_REG_MAG_OUTY_L_REG_M 0x2A |
lpeters | 34:341fb423e74b | 217 | #define LSM303_REG_MAG_OUTY_H_REG_M 0x2B |
lpeters | 34:341fb423e74b | 218 | #define LSM303_REG_MAG_OUTZ_L_REG_M 0x2C |
lpeters | 34:341fb423e74b | 219 | #define LSM303_REG_MAG_OUTZ_H_REG_M 0x2D |
lpeters | 34:341fb423e74b | 220 | #define LSM303_REG_MAG_TEMP_L_M 0x2E |
lpeters | 34:341fb423e74b | 221 | #define LSM303_REG_MAG_TEMP_H_M 0x2F |
lpeters | 34:341fb423e74b | 222 | #define LSM303_REG_MAG_TEMP_CFG_REG_A 0x1F |
lpeters | 34:341fb423e74b | 223 | #define CFG_ACC_ADR LSM303_REG_ACC_CTRL_REG1_A |
lpeters | 34:341fb423e74b | 224 | #define CFG_ACC_LEN 7 |
lpeters | 34:341fb423e74b | 225 | #define CFG_MAG_ADR LSM303_REG_MAG_CTRL_REG1_M |
lpeters | 34:341fb423e74b | 226 | #define CFG_MAG_LEN 5 |
lpeters | 34:341fb423e74b | 227 | #else |
lpeters | 34:341fb423e74b | 228 | #define LEDR PB_7 |
lpeters | 34:341fb423e74b | 229 | #define LEDG PB_5 |
lpeters | 34:341fb423e74b | 230 | #define LEDB PB_6 |
lpeters | 34:341fb423e74b | 231 | #define LEDW PA_5 |
lpeters | 35:73b3963c6dd3 | 232 | #define PIN_ACC PB_14 // Not really. |
lpeters | 35:73b3963c6dd3 | 233 | #if defined(TARGET_DISCO2) |
lpeters | 35:73b3963c6dd3 | 234 | #define PIN_MAG PB_13 |
lpeters | 35:73b3963c6dd3 | 235 | #else |
lpeters | 35:73b3963c6dd3 | 236 | #define PIN_MAG PA_10 |
lpeters | 35:73b3963c6dd3 | 237 | #endif |
lpeters | 35:73b3963c6dd3 | 238 | #define PIN_BTN PB_2 |
lpeters | 34:341fb423e74b | 239 | #define LSM303_ADR_ACC 0x32 |
lpeters | 34:341fb423e74b | 240 | #define LSM303_REG_MAG_WHO_AM_I_M 0x4F |
lpeters | 34:341fb423e74b | 241 | #define LSM303_WHO_ACC 0x33 |
lpeters | 34:341fb423e74b | 242 | #define LSM303_WHO_MAG 0x40 |
lpeters | 34:341fb423e74b | 243 | #define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C |
lpeters | 34:341fb423e74b | 244 | #define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D |
lpeters | 34:341fb423e74b | 245 | #define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F |
lpeters | 34:341fb423e74b | 246 | #define LSM303_REG_MAG_CFG_REG_A_M 0x60 |
lpeters | 34:341fb423e74b | 247 | #define LSM303_REG_MAG_CFG_REG_B_M 0x61 |
lpeters | 34:341fb423e74b | 248 | #define LSM303_REG_MAG_CFG_REG_C_M 0x62 |
lpeters | 34:341fb423e74b | 249 | #define LSM303_REG_MAG_STATUS_REG_M 0x67 |
lpeters | 34:341fb423e74b | 250 | #define LSM303_REG_MAG_OUTX_L_REG_M 0x68 |
lpeters | 34:341fb423e74b | 251 | #define LSM303_REG_MAG_OUTX_H_REG_M 0x69 |
lpeters | 34:341fb423e74b | 252 | #define LSM303_REG_MAG_OUTY_L_REG_M 0x6A |
lpeters | 34:341fb423e74b | 253 | #define LSM303_REG_MAG_OUTY_H_REG_M 0x6B |
lpeters | 34:341fb423e74b | 254 | #define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C |
lpeters | 34:341fb423e74b | 255 | #define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D |
lpeters | 34:341fb423e74b | 256 | #define CFG_ACC_ADR LSM303_REG_ACC_TEMP_CFG_REG_A // Start Disco at TEMP CFG. |
lpeters | 34:341fb423e74b | 257 | #define CFG_ACC_LEN 7 |
lpeters | 34:341fb423e74b | 258 | #define CFG_MAG_ADR LSM303_REG_MAG_CFG_REG_A_M |
lpeters | 34:341fb423e74b | 259 | #define CFG_MAG_LEN 3 |
lpeters | 34:341fb423e74b | 260 | #endif |
tchari | 30:ff249a9156dc | 261 | |
tchari | 30:ff249a9156dc | 262 | I2C i2c(PB_9, PB_8); |
lpeters | 35:73b3963c6dd3 | 263 | InterruptIn accPin(PIN_ACC); |
lpeters | 35:73b3963c6dd3 | 264 | InterruptIn magPin(PIN_MAG); |
lpeters | 35:73b3963c6dd3 | 265 | InterruptIn btnPin(PIN_BTN); |
lpeters | 33:e47306c32791 | 266 | |
lpeters | 35:73b3963c6dd3 | 267 | uint8_t cfg; |
lpeters | 33:e47306c32791 | 268 | char ret; |
lpeters | 33:e47306c32791 | 269 | char rda = '\0'; |
lpeters | 33:e47306c32791 | 270 | char cmd[2]; |
lpeters | 33:e47306c32791 | 271 | char buf[83]; |
lpeters | 35:73b3963c6dd3 | 272 | uint8_t pos = 0; |
lpeters | 35:73b3963c6dd3 | 273 | |
lpeters | 33:e47306c32791 | 274 | int accShift = 0; |
lpeters | 33:e47306c32791 | 275 | int accScale = 0; |
lpeters | 33:e47306c32791 | 276 | int accEvent = 0; |
lpeters | 35:73b3963c6dd3 | 277 | uint8_t accSFire = 0; |
lpeters | 35:73b3963c6dd3 | 278 | uint8_t accHFire = 0; |
lpeters | 35:73b3963c6dd3 | 279 | uint8_t accSLIRQ = 0; |
lpeters | 35:73b3963c6dd3 | 280 | uint8_t accSHIRQ = 0; |
lpeters | 33:e47306c32791 | 281 | int magEvent = 0; |
lpeters | 35:73b3963c6dd3 | 282 | uint8_t magSFire = 0; |
lpeters | 35:73b3963c6dd3 | 283 | uint8_t magHFire = 0; |
lpeters | 35:73b3963c6dd3 | 284 | uint8_t magSLIRQ = 0; |
lpeters | 35:73b3963c6dd3 | 285 | uint8_t magSHIRQ = 0; |
lpeters | 35:73b3963c6dd3 | 286 | uint8_t btnHFire = 0; |
lpeters | 33:e47306c32791 | 287 | |
lpeters | 35:73b3963c6dd3 | 288 | char *res; |
lpeters | 35:73b3963c6dd3 | 289 | char sPass[26] = "[\u001b[32mPASS\u001b[0m]"; |
lpeters | 35:73b3963c6dd3 | 290 | char sFail[26] = "[\u001b[31mFAIL\u001b[0m]"; |
lpeters | 33:e47306c32791 | 291 | char cmdSendLoop[9] = "SendLoop"; |
lpeters | 33:e47306c32791 | 292 | |
lpeters | 35:73b3963c6dd3 | 293 | time_t tInit = 0; |
lpeters | 35:73b3963c6dd3 | 294 | time_t tBump = 0; |
lpeters | 35:73b3963c6dd3 | 295 | time_t tLast = 0; |
lpeters | 35:73b3963c6dd3 | 296 | time_t tNext = 0; |
lpeters | 36:dcc6f89fa39a | 297 | time_t tSend = 0; |
lpeters | 35:73b3963c6dd3 | 298 | |
lpeters | 34:341fb423e74b | 299 | DigitalOut myLedR(LEDR); |
lpeters | 34:341fb423e74b | 300 | DigitalOut myLedG(LEDG); |
lpeters | 34:341fb423e74b | 301 | DigitalOut myLedB(LEDB); |
lpeters | 34:341fb423e74b | 302 | DigitalOut myLedW(LEDW); |
lpeters | 34:341fb423e74b | 303 | |
lpeters | 34:341fb423e74b | 304 | void magInitSequence(); |
lpeters | 34:341fb423e74b | 305 | void accInitSequence(); |
lpeters | 34:341fb423e74b | 306 | void gpsInitSequence(); |
lpeters | 34:341fb423e74b | 307 | void tmpRead(); |
lpeters | 34:341fb423e74b | 308 | void magRead(); |
lpeters | 34:341fb423e74b | 309 | void accRead(); |
lpeters | 34:341fb423e74b | 310 | void gpsRead(); |
lpeters | 36:dcc6f89fa39a | 311 | void send_message(); |
lpeters | 34:341fb423e74b | 312 | |
lpeters | 35:73b3963c6dd3 | 313 | void onBtnIrq() |
lpeters | 35:73b3963c6dd3 | 314 | { |
lpeters | 35:73b3963c6dd3 | 315 | btnHFire++; |
lpeters | 36:dcc6f89fa39a | 316 | tSend = 0; |
lpeters | 35:73b3963c6dd3 | 317 | } |
lpeters | 35:73b3963c6dd3 | 318 | |
lpeters | 33:e47306c32791 | 319 | void onAccIrq() |
lpeters | 33:e47306c32791 | 320 | { |
lpeters | 33:e47306c32791 | 321 | accHFire++; |
lpeters | 36:dcc6f89fa39a | 322 | tSend = 0; |
lpeters | 33:e47306c32791 | 323 | } |
lpeters | 33:e47306c32791 | 324 | |
lpeters | 33:e47306c32791 | 325 | void onMagIrq() |
lpeters | 33:e47306c32791 | 326 | { |
lpeters | 33:e47306c32791 | 327 | magHFire++; |
lpeters | 36:dcc6f89fa39a | 328 | tSend = 0; |
lpeters | 33:e47306c32791 | 329 | } |
lpeters | 33:e47306c32791 | 330 | |
lpeters | 33:e47306c32791 | 331 | void accDumpCfg() |
lpeters | 33:e47306c32791 | 332 | { |
lpeters | 34:341fb423e74b | 333 | char start = CFG_ACC_ADR; |
lpeters | 34:341fb423e74b | 334 | for (int i = 0; i < CFG_ACC_LEN; i++) |
lpeters | 33:e47306c32791 | 335 | { |
lpeters | 33:e47306c32791 | 336 | cmd[0] = start + i; |
lpeters | 33:e47306c32791 | 337 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 33:e47306c32791 | 338 | i2c.read(LSM303_ADR_ACC, &buf[i], 1); |
lpeters | 33:e47306c32791 | 339 | } |
lpeters | 34:341fb423e74b | 340 | printf("CFGACC: | "); |
lpeters | 34:341fb423e74b | 341 | for (int i = 0; i < CFG_ACC_LEN; i++) |
lpeters | 34:341fb423e74b | 342 | { |
lpeters | 34:341fb423e74b | 343 | printf("%02X ", buf[i]); |
lpeters | 34:341fb423e74b | 344 | } |
lpeters | 34:341fb423e74b | 345 | printf("|\r\n"); |
lpeters | 33:e47306c32791 | 346 | } |
lpeters | 33:e47306c32791 | 347 | |
lpeters | 33:e47306c32791 | 348 | void magDumpCfg() |
lpeters | 33:e47306c32791 | 349 | { |
lpeters | 34:341fb423e74b | 350 | char start = CFG_MAG_ADR; |
lpeters | 34:341fb423e74b | 351 | for (int i = 0; i < CFG_MAG_LEN; i++) |
lpeters | 33:e47306c32791 | 352 | { |
lpeters | 33:e47306c32791 | 353 | cmd[0] = start + i; |
lpeters | 33:e47306c32791 | 354 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 33:e47306c32791 | 355 | i2c.read(LSM303_ADR_MAG, &buf[i], 1); |
lpeters | 33:e47306c32791 | 356 | } |
lpeters | 34:341fb423e74b | 357 | printf("CFGMAG: | "); |
lpeters | 34:341fb423e74b | 358 | for (int i = 0; i < CFG_MAG_LEN; i++) |
lpeters | 34:341fb423e74b | 359 | { |
lpeters | 34:341fb423e74b | 360 | printf("%02X ", buf[i]); |
lpeters | 34:341fb423e74b | 361 | } |
lpeters | 34:341fb423e74b | 362 | printf("|\r\n"); |
lpeters | 33:e47306c32791 | 363 | } |
lpeters | 33:e47306c32791 | 364 | |
mbed_official | 0:7037ed05f54f | 365 | /** |
mbed_official | 0:7037ed05f54f | 366 | * Entry point for application |
mbed_official | 0:7037ed05f54f | 367 | */ |
mbed_official | 0:7037ed05f54f | 368 | int main (void) |
mbed_official | 0:7037ed05f54f | 369 | { |
lpeters | 35:73b3963c6dd3 | 370 | //i2c.frequency(400000); |
lpeters | 33:e47306c32791 | 371 | wait(4); |
lpeters | 33:e47306c32791 | 372 | printf("\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); |
lpeters | 34:341fb423e74b | 373 | |
lpeters | 34:341fb423e74b | 374 | // Boot Flash |
lpeters | 34:341fb423e74b | 375 | for (int i = 0; i <= 64; i++) |
lpeters | 33:e47306c32791 | 376 | { |
lpeters | 34:341fb423e74b | 377 | myLedR = i & 0x01; |
lpeters | 34:341fb423e74b | 378 | myLedG = i & 0x02; |
lpeters | 34:341fb423e74b | 379 | myLedB = i & 0x04; |
lpeters | 34:341fb423e74b | 380 | myLedW = i & 0x08; |
lpeters | 34:341fb423e74b | 381 | wait(0.01); |
lpeters | 33:e47306c32791 | 382 | } |
lpeters | 34:341fb423e74b | 383 | wait(4); |
lpeters | 35:73b3963c6dd3 | 384 | // btnPin.rise(&onBtnIrq); |
lpeters | 35:73b3963c6dd3 | 385 | |
mbed_official | 0:7037ed05f54f | 386 | // setup tracing |
mbed_official | 0:7037ed05f54f | 387 | setup_trace(); |
mbed_official | 0:7037ed05f54f | 388 | |
mbed_official | 0:7037ed05f54f | 389 | // stores the status of a call to LoRaWAN protocol |
mbed_official | 0:7037ed05f54f | 390 | lorawan_status_t retcode; |
lpeters | 33:e47306c32791 | 391 | |
lpeters | 34:341fb423e74b | 392 | /* I2C init */ |
lpeters | 34:341fb423e74b | 393 | ret = 0x00; |
lpeters | 34:341fb423e74b | 394 | magDumpCfg(); |
lpeters | 34:341fb423e74b | 395 | accDumpCfg(); |
lpeters | 34:341fb423e74b | 396 | magInitSequence(); |
lpeters | 34:341fb423e74b | 397 | accInitSequence(); |
lpeters | 34:341fb423e74b | 398 | gpsInitSequence(); |
lpeters | 33:e47306c32791 | 399 | magDumpCfg(); |
lpeters | 33:e47306c32791 | 400 | accDumpCfg(); |
lpeters | 33:e47306c32791 | 401 | |
lpeters | 34:341fb423e74b | 402 | cfg = 0x00; |
lpeters | 34:341fb423e74b | 403 | #if defined(TARGET_LRAT) |
lpeters | 33:e47306c32791 | 404 | cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; |
lpeters | 33:e47306c32791 | 405 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 33:e47306c32791 | 406 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 407 | cfg |= (ret & 0x80) >> 7; |
lpeters | 33:e47306c32791 | 408 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 33:e47306c32791 | 409 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 33:e47306c32791 | 410 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 411 | accScale = 1 << (!(ret & 0x30) ? 0 : ((ret & 0x30) >> 4) - 1); |
lpeters | 34:341fb423e74b | 412 | cmd[0] = LSM303_REG_MAG_CTRL_REG2_M; |
lpeters | 34:341fb423e74b | 413 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 414 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 34:341fb423e74b | 415 | cfg |= (ret & 0x60) >> 1; |
lpeters | 34:341fb423e74b | 416 | //accShift = 0; // Full 16-bit resolution |
lpeters | 34:341fb423e74b | 417 | accShift = 4; |
lpeters | 34:341fb423e74b | 418 | #else |
lpeters | 33:e47306c32791 | 419 | cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; |
lpeters | 33:e47306c32791 | 420 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 33:e47306c32791 | 421 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 33:e47306c32791 | 422 | cfg |= (ret & 0x08) >> 3; |
lpeters | 33:e47306c32791 | 423 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 33:e47306c32791 | 424 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 33:e47306c32791 | 425 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 33:e47306c32791 | 426 | cfg |= (ret & 0x08) >> 2; |
lpeters | 33:e47306c32791 | 427 | accScale = 1 << ((ret & 0x30) >> 4); |
lpeters | 33:e47306c32791 | 428 | cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; |
lpeters | 33:e47306c32791 | 429 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 33:e47306c32791 | 430 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 33:e47306c32791 | 431 | cfg |= (ret & 0x10); |
lpeters | 33:e47306c32791 | 432 | if (cfg & 0x01) |
lpeters | 33:e47306c32791 | 433 | accShift = 8; |
lpeters | 33:e47306c32791 | 434 | else if (cfg & 0x02) |
lpeters | 33:e47306c32791 | 435 | accShift = 4; |
lpeters | 33:e47306c32791 | 436 | else |
lpeters | 33:e47306c32791 | 437 | accShift = 6; |
lpeters | 34:341fb423e74b | 438 | #endif |
lpeters | 33:e47306c32791 | 439 | printf("Quality: %02x AccShift: %d AccScale: %d\r\n", cfg, accShift, accScale); |
lpeters | 33:e47306c32791 | 440 | |
lpeters | 35:73b3963c6dd3 | 441 | time_t tNow; |
lpeters | 35:73b3963c6dd3 | 442 | /* |
lpeters | 35:73b3963c6dd3 | 443 | // while(1) |
lpeters | 35:73b3963c6dd3 | 444 | // { |
lpeters | 35:73b3963c6dd3 | 445 | tNow = time(NULL); |
lpeters | 35:73b3963c6dd3 | 446 | printf("RTC: %08X\r\n", tNow); |
lpeters | 34:341fb423e74b | 447 | #if defined(SENSOR_TEMP) |
lpeters | 34:341fb423e74b | 448 | tmpRead(); |
lpeters | 34:341fb423e74b | 449 | #endif |
lpeters | 34:341fb423e74b | 450 | magRead(); |
lpeters | 34:341fb423e74b | 451 | accRead(); |
lpeters | 34:341fb423e74b | 452 | gpsRead(); |
lpeters | 35:73b3963c6dd3 | 453 | printf("TIM: %d, SAT: %d, LAT: %f, LON: %f\r\n", mytime, mybatt, mylat, mylon); |
lpeters | 35:73b3963c6dd3 | 454 | printf("IRQ: A=%02X M=%02X B=%02X\r\n", accHFire, magHFire, btnHFire); |
lpeters | 35:73b3963c6dd3 | 455 | wait(1); |
lpeters | 35:73b3963c6dd3 | 456 | // } |
lpeters | 35:73b3963c6dd3 | 457 | */ |
lpeters | 35:73b3963c6dd3 | 458 | |
lpeters | 35:73b3963c6dd3 | 459 | for (int i = 0; i <= 64; i++) |
lpeters | 35:73b3963c6dd3 | 460 | { |
lpeters | 35:73b3963c6dd3 | 461 | myLedR = i & 0x01; |
lpeters | 35:73b3963c6dd3 | 462 | myLedG = i & 0x02; |
lpeters | 35:73b3963c6dd3 | 463 | myLedB = i & 0x04; |
lpeters | 35:73b3963c6dd3 | 464 | myLedW = i & 0x08; |
lpeters | 35:73b3963c6dd3 | 465 | wait(0.01); |
lpeters | 33:e47306c32791 | 466 | } |
lpeters | 33:e47306c32791 | 467 | |
mbed_official | 0:7037ed05f54f | 468 | // Initialize LoRaWAN stack |
mbed_official | 2:dc95ac6d6d4e | 469 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
mbed_official | 0:7037ed05f54f | 470 | printf("\r\n LoRa initialization failed! \r\n"); |
mbed_official | 0:7037ed05f54f | 471 | return -1; |
mbed_official | 0:7037ed05f54f | 472 | } |
mbed_official | 0:7037ed05f54f | 473 | |
mbed_official | 0:7037ed05f54f | 474 | printf("\r\n Mbed LoRaWANStack initialized \r\n"); |
lpeters | 36:dcc6f89fa39a | 475 | printf("MBED_CONF_LORA_APP_PORT: %d\r\n", MBED_CONF_LORA_APP_PORT); |
lpeters | 36:dcc6f89fa39a | 476 | printf("MBED_CONF_LORA_DUTY_CYCLE_ON: %d\r\n", MBED_CONF_LORA_DUTY_CYCLE_ON); |
mbed_official | 0:7037ed05f54f | 477 | |
mbed_official | 0:7037ed05f54f | 478 | // prepare application callbacks |
mbed_official | 0:7037ed05f54f | 479 | callbacks.events = mbed::callback(lora_event_handler); |
mbed_official | 2:dc95ac6d6d4e | 480 | lorawan.add_app_callbacks(&callbacks); |
mbed_official | 0:7037ed05f54f | 481 | |
mbed_official | 0:7037ed05f54f | 482 | // Set number of retries in case of CONFIRMED messages |
mbed_official | 2:dc95ac6d6d4e | 483 | if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) |
mbed_official | 0:7037ed05f54f | 484 | != LORAWAN_STATUS_OK) { |
mbed_official | 0:7037ed05f54f | 485 | printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n"); |
mbed_official | 0:7037ed05f54f | 486 | return -1; |
mbed_official | 0:7037ed05f54f | 487 | } |
mbed_official | 0:7037ed05f54f | 488 | |
mbed_official | 0:7037ed05f54f | 489 | printf("\r\n CONFIRMED message retries : %d \r\n", |
mbed_official | 0:7037ed05f54f | 490 | CONFIRMED_MSG_RETRY_COUNTER); |
mbed_official | 0:7037ed05f54f | 491 | |
mbed_official | 0:7037ed05f54f | 492 | // Enable adaptive data rate |
mbed_official | 2:dc95ac6d6d4e | 493 | if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
mbed_official | 0:7037ed05f54f | 494 | printf("\r\n enable_adaptive_datarate failed! \r\n"); |
mbed_official | 0:7037ed05f54f | 495 | return -1; |
mbed_official | 0:7037ed05f54f | 496 | } |
mbed_official | 0:7037ed05f54f | 497 | |
mbed_official | 0:7037ed05f54f | 498 | printf("\r\n Adaptive data rate (ADR) - Enabled \r\n"); |
mbed_official | 0:7037ed05f54f | 499 | |
mbed_official | 2:dc95ac6d6d4e | 500 | retcode = lorawan.connect(); |
lpeters | 33:e47306c32791 | 501 | |
mbed_official | 0:7037ed05f54f | 502 | if (retcode == LORAWAN_STATUS_OK || |
mbed_official | 0:7037ed05f54f | 503 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
mbed_official | 0:7037ed05f54f | 504 | } else { |
mbed_official | 0:7037ed05f54f | 505 | printf("\r\n Connection error, code = %d \r\n", retcode); |
mbed_official | 0:7037ed05f54f | 506 | return -1; |
mbed_official | 0:7037ed05f54f | 507 | } |
mbed_official | 0:7037ed05f54f | 508 | |
mbed_official | 0:7037ed05f54f | 509 | printf("\r\n Connection - In Progress ...\r\n"); |
mbed_official | 0:7037ed05f54f | 510 | |
mbed_official | 0:7037ed05f54f | 511 | // make your event queue dispatching events forever |
lpeters | 36:dcc6f89fa39a | 512 | //ev_queue.dispatch_forever(); |
lpeters | 36:dcc6f89fa39a | 513 | ev_queue.dispatch(); |
lpeters | 36:dcc6f89fa39a | 514 | printf("\r\n- = - = - = - = - = - DISPATCH 1 COMPLETE - = - = - = - = - = -\r\n"); |
lpeters | 36:dcc6f89fa39a | 515 | /* |
lpeters | 36:dcc6f89fa39a | 516 | printf("CONTROL LOOP GOES HERE!\r\n"); |
lpeters | 36:dcc6f89fa39a | 517 | #if defined(TARGET_LRAT) |
lpeters | 36:dcc6f89fa39a | 518 | #else |
lpeters | 36:dcc6f89fa39a | 519 | for (int i = 0; i < 6; i++) |
lpeters | 36:dcc6f89fa39a | 520 | { |
lpeters | 36:dcc6f89fa39a | 521 | tNow = time(NULL); |
lpeters | 36:dcc6f89fa39a | 522 | printf("RTC: %08X\r\n", tNow); |
lpeters | 36:dcc6f89fa39a | 523 | tNext = tNow + 10; |
lpeters | 36:dcc6f89fa39a | 524 | printf("NXT: %08X\r\n", tNext); |
lpeters | 36:dcc6f89fa39a | 525 | // Clear any pending IRQs |
lpeters | 36:dcc6f89fa39a | 526 | cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M; |
lpeters | 36:dcc6f89fa39a | 527 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 36:dcc6f89fa39a | 528 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 36:dcc6f89fa39a | 529 | while (time(NULL) < tNext) |
lpeters | 36:dcc6f89fa39a | 530 | { |
lpeters | 36:dcc6f89fa39a | 531 | wait(1); |
lpeters | 36:dcc6f89fa39a | 532 | } |
lpeters | 36:dcc6f89fa39a | 533 | printf("Timer #%d complete.\r\n", i); |
lpeters | 36:dcc6f89fa39a | 534 | } |
lpeters | 36:dcc6f89fa39a | 535 | #endif |
lpeters | 36:dcc6f89fa39a | 536 | */ |
lpeters | 36:dcc6f89fa39a | 537 | tSend = time(NULL) + 1; |
lpeters | 36:dcc6f89fa39a | 538 | while (1) { |
lpeters | 36:dcc6f89fa39a | 539 | while (time(NULL) < tSend) |
lpeters | 36:dcc6f89fa39a | 540 | wait(0.1); |
lpeters | 36:dcc6f89fa39a | 541 | printf("IT'S PACKET TIME!\r\n"); |
lpeters | 36:dcc6f89fa39a | 542 | ev_queue.call(send_message); |
lpeters | 36:dcc6f89fa39a | 543 | ev_queue.dispatch(); |
lpeters | 36:dcc6f89fa39a | 544 | printf("\r\n- = - = - = - = - = - DISPATCH 2 COMPLETE - = - = - = - = - = -\r\n"); |
lpeters | 36:dcc6f89fa39a | 545 | tSend = time(NULL) + 300; |
lpeters | 36:dcc6f89fa39a | 546 | // Clear any pending IRQs |
lpeters | 36:dcc6f89fa39a | 547 | cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M; |
lpeters | 36:dcc6f89fa39a | 548 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 36:dcc6f89fa39a | 549 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 36:dcc6f89fa39a | 550 | } |
mbed_official | 3:8c7198d1a2a1 | 551 | |
mbed_official | 3:8c7198d1a2a1 | 552 | return 0; |
mbed_official | 0:7037ed05f54f | 553 | } |
mbed_official | 0:7037ed05f54f | 554 | |
mbed_official | 0:7037ed05f54f | 555 | /** |
mbed_official | 0:7037ed05f54f | 556 | * Sends a message to the Network Server |
mbed_official | 0:7037ed05f54f | 557 | */ |
mbed_official | 0:7037ed05f54f | 558 | static void send_message() |
mbed_official | 0:7037ed05f54f | 559 | { |
lpeters | 36:dcc6f89fa39a | 560 | printf("In send_message()...\r\n"); |
mbed_official | 0:7037ed05f54f | 561 | uint16_t packet_len; |
mbed_official | 0:7037ed05f54f | 562 | int16_t retcode; |
mbed_official | 0:7037ed05f54f | 563 | float sensor_value; |
mbed_official | 0:7037ed05f54f | 564 | |
mbed_official | 0:7037ed05f54f | 565 | if (ds1820.begin()) { |
mbed_official | 0:7037ed05f54f | 566 | ds1820.startConversion(); |
mbed_official | 0:7037ed05f54f | 567 | sensor_value = ds1820.read(); |
mbed_official | 0:7037ed05f54f | 568 | printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value); |
mbed_official | 0:7037ed05f54f | 569 | ds1820.startConversion(); |
mbed_official | 0:7037ed05f54f | 570 | } else { |
mbed_official | 0:7037ed05f54f | 571 | printf("\r\n No sensor found \r\n"); |
mbed_official | 0:7037ed05f54f | 572 | return; |
mbed_official | 0:7037ed05f54f | 573 | } |
mbed_official | 0:7037ed05f54f | 574 | |
tchari | 30:ff249a9156dc | 575 | time_t tNow = time(NULL); |
tchari | 30:ff249a9156dc | 576 | printf("Clock: %d\r\n", tNow); |
lpeters | 34:341fb423e74b | 577 | |
lpeters | 34:341fb423e74b | 578 | #if defined(SENSOR_TEMP) |
lpeters | 34:341fb423e74b | 579 | tmpRead(); |
lpeters | 34:341fb423e74b | 580 | #endif |
lpeters | 34:341fb423e74b | 581 | magRead(); |
lpeters | 34:341fb423e74b | 582 | accRead(); |
lpeters | 34:341fb423e74b | 583 | gpsRead(); |
lpeters | 34:341fb423e74b | 584 | |
lpeters | 34:341fb423e74b | 585 | int ilat = (int)(mylat * 100000); |
lpeters | 34:341fb423e74b | 586 | int ilon = (int)(mylon * 100000); |
lpeters | 34:341fb423e74b | 587 | printf("TIM: %d, SAT: %d, LAT: %d, LON: %d\r\n", mytime, mybatt, ilat, ilon); |
lpeters | 34:341fb423e74b | 588 | packet_len = 11; |
lpeters | 34:341fb423e74b | 589 | tx_buffer[0] = (mytime >> 24) & 0xFF; |
lpeters | 34:341fb423e74b | 590 | tx_buffer[1] = (mytime >> 16) & 0xFF; |
lpeters | 34:341fb423e74b | 591 | tx_buffer[2] = (mytime >> 8) & 0xFF; |
lpeters | 34:341fb423e74b | 592 | tx_buffer[3] = (mytime >> 0) & 0xFF; |
lpeters | 34:341fb423e74b | 593 | tx_buffer[4] = ((mybatt << 4) & 0xF0) | ((ilat >> 22) & 0x0F); |
lpeters | 34:341fb423e74b | 594 | tx_buffer[5] = (ilat >> 14) & 0xFF; |
lpeters | 34:341fb423e74b | 595 | tx_buffer[6] = (ilat >> 6) & 0xFF; |
lpeters | 34:341fb423e74b | 596 | tx_buffer[7] = ((ilat << 2) & 0xFC) | ((ilon >> 24) & 0x03); |
lpeters | 34:341fb423e74b | 597 | tx_buffer[8] = (ilon >> 16) & 0xFF; |
lpeters | 34:341fb423e74b | 598 | tx_buffer[9] = (ilon >> 8) & 0xFF; |
lpeters | 34:341fb423e74b | 599 | tx_buffer[10] = (ilon >> 0) & 0xFF; |
lpeters | 34:341fb423e74b | 600 | printf("\r\nBUF: |"); |
lpeters | 34:341fb423e74b | 601 | for (int i = 0; i < packet_len; i++) { printf("%02X", tx_buffer[i]); } |
lpeters | 34:341fb423e74b | 602 | printf("|\r\n"); |
lpeters | 34:341fb423e74b | 603 | retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, |
lpeters | 34:341fb423e74b | 604 | MSG_CONFIRMED_FLAG); |
lpeters | 33:e47306c32791 | 605 | |
lpeters | 34:341fb423e74b | 606 | if (retcode < 0) { |
lpeters | 34:341fb423e74b | 607 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") |
lpeters | 34:341fb423e74b | 608 | : printf("\r\n send() - Error code %d \r\n", retcode); |
lpeters | 34:341fb423e74b | 609 | |
lpeters | 34:341fb423e74b | 610 | if (retcode == LORAWAN_STATUS_WOULD_BLOCK) { |
lpeters | 34:341fb423e74b | 611 | //retry in 3 seconds |
lpeters | 34:341fb423e74b | 612 | if (MBED_CONF_LORA_DUTY_CYCLE_ON) { |
lpeters | 34:341fb423e74b | 613 | ev_queue.call_in(3000, send_message); |
lpeters | 34:341fb423e74b | 614 | } |
lpeters | 34:341fb423e74b | 615 | } |
lpeters | 34:341fb423e74b | 616 | return; |
lpeters | 34:341fb423e74b | 617 | } |
lpeters | 34:341fb423e74b | 618 | |
lpeters | 34:341fb423e74b | 619 | printf("\r\n %d bytes scheduled for transmission \r\n", retcode); |
lpeters | 34:341fb423e74b | 620 | memset(tx_buffer, 0, sizeof(tx_buffer)); |
lpeters | 34:341fb423e74b | 621 | |
lpeters | 34:341fb423e74b | 622 | //LED Confirmation Output - MESSAGE SENT |
lpeters | 34:341fb423e74b | 623 | for (int i = 0; i < 10; i++) { |
lpeters | 34:341fb423e74b | 624 | myLedG = 1; |
lpeters | 34:341fb423e74b | 625 | wait(0.1); |
lpeters | 34:341fb423e74b | 626 | myLedG = 0; |
lpeters | 34:341fb423e74b | 627 | myLedR = 1; |
lpeters | 34:341fb423e74b | 628 | wait(0.1); |
lpeters | 34:341fb423e74b | 629 | myLedR = 0; |
lpeters | 34:341fb423e74b | 630 | myLedB = 1; |
lpeters | 34:341fb423e74b | 631 | wait(0.1); |
lpeters | 34:341fb423e74b | 632 | myLedB = 0; |
lpeters | 34:341fb423e74b | 633 | } |
lpeters | 34:341fb423e74b | 634 | } |
lpeters | 34:341fb423e74b | 635 | |
lpeters | 34:341fb423e74b | 636 | /** |
lpeters | 34:341fb423e74b | 637 | * Receive a message from the Network Server |
lpeters | 34:341fb423e74b | 638 | */ |
lpeters | 34:341fb423e74b | 639 | static void receive_message() |
lpeters | 34:341fb423e74b | 640 | { |
lpeters | 36:dcc6f89fa39a | 641 | printf("In receive_message()...\r\n"); |
lpeters | 34:341fb423e74b | 642 | int16_t retcode; |
lpeters | 34:341fb423e74b | 643 | retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, |
lpeters | 34:341fb423e74b | 644 | sizeof(rx_buffer), |
lpeters | 34:341fb423e74b | 645 | MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); |
lpeters | 34:341fb423e74b | 646 | |
lpeters | 34:341fb423e74b | 647 | if (retcode < 0) { |
lpeters | 34:341fb423e74b | 648 | printf("\r\n receive() - Error code %d \r\n", retcode); |
lpeters | 34:341fb423e74b | 649 | return; |
lpeters | 34:341fb423e74b | 650 | } |
lpeters | 34:341fb423e74b | 651 | |
lpeters | 34:341fb423e74b | 652 | printf(" Data:"); |
lpeters | 34:341fb423e74b | 653 | |
lpeters | 34:341fb423e74b | 654 | for (uint8_t i = 0; i < retcode; i++) { |
lpeters | 34:341fb423e74b | 655 | printf("%x", rx_buffer[i]); |
lpeters | 34:341fb423e74b | 656 | } |
lpeters | 34:341fb423e74b | 657 | |
lpeters | 34:341fb423e74b | 658 | printf("\r\n Data Length: %d\r\n", retcode); |
lpeters | 34:341fb423e74b | 659 | |
lpeters | 34:341fb423e74b | 660 | /* |
lpeters | 34:341fb423e74b | 661 | int startLoop = 0; |
lpeters | 34:341fb423e74b | 662 | if (strncmp((char *)rx_buffer, cmdSendLoop, 8) == 0) |
lpeters | 34:341fb423e74b | 663 | { |
lpeters | 34:341fb423e74b | 664 | printf("SendLoop Command Received!\r\n"); |
lpeters | 34:341fb423e74b | 665 | startLoop = 1; |
lpeters | 34:341fb423e74b | 666 | } |
lpeters | 34:341fb423e74b | 667 | */ |
lpeters | 34:341fb423e74b | 668 | |
lpeters | 34:341fb423e74b | 669 | memset(rx_buffer, 0, sizeof(rx_buffer)); |
lpeters | 34:341fb423e74b | 670 | /* |
lpeters | 34:341fb423e74b | 671 | if (startLoop) |
lpeters | 34:341fb423e74b | 672 | send_message(); |
lpeters | 34:341fb423e74b | 673 | */ |
lpeters | 34:341fb423e74b | 674 | } |
lpeters | 34:341fb423e74b | 675 | |
lpeters | 34:341fb423e74b | 676 | /** |
lpeters | 34:341fb423e74b | 677 | * Event handler |
lpeters | 34:341fb423e74b | 678 | */ |
lpeters | 34:341fb423e74b | 679 | static void lora_event_handler(lorawan_event_t event) |
lpeters | 34:341fb423e74b | 680 | { |
lpeters | 34:341fb423e74b | 681 | tr_debug("In lora_event_handler(%d)...", event); |
lpeters | 34:341fb423e74b | 682 | switch (event) { |
lpeters | 34:341fb423e74b | 683 | case CONNECTED: |
lpeters | 34:341fb423e74b | 684 | printf("\r\n Connection - Successful \r\n"); |
lpeters | 36:dcc6f89fa39a | 685 | ev_queue.break_dispatch(); |
lpeters | 36:dcc6f89fa39a | 686 | /* |
lpeters | 34:341fb423e74b | 687 | if (MBED_CONF_LORA_DUTY_CYCLE_ON) { |
lpeters | 34:341fb423e74b | 688 | send_message(); |
lpeters | 34:341fb423e74b | 689 | } else { |
lpeters | 34:341fb423e74b | 690 | ev_queue.call_every(TX_TIMER, send_message); |
lpeters | 34:341fb423e74b | 691 | } |
lpeters | 36:dcc6f89fa39a | 692 | */ |
lpeters | 34:341fb423e74b | 693 | break; |
lpeters | 34:341fb423e74b | 694 | case DISCONNECTED: |
lpeters | 34:341fb423e74b | 695 | ev_queue.break_dispatch(); |
lpeters | 34:341fb423e74b | 696 | printf("\r\n Disconnected Successfully \r\n"); |
lpeters | 34:341fb423e74b | 697 | break; |
lpeters | 34:341fb423e74b | 698 | case TX_DONE: |
lpeters | 34:341fb423e74b | 699 | printf("\r\n Message Sent to Network Server \r\n"); |
lpeters | 36:dcc6f89fa39a | 700 | ev_queue.break_dispatch(); |
lpeters | 36:dcc6f89fa39a | 701 | /* |
lpeters | 34:341fb423e74b | 702 | if (MBED_CONF_LORA_DUTY_CYCLE_ON) { |
lpeters | 34:341fb423e74b | 703 | send_message(); |
lpeters | 34:341fb423e74b | 704 | } |
lpeters | 36:dcc6f89fa39a | 705 | */ |
lpeters | 34:341fb423e74b | 706 | break; |
lpeters | 34:341fb423e74b | 707 | case TX_TIMEOUT: |
lpeters | 34:341fb423e74b | 708 | case TX_ERROR: |
lpeters | 34:341fb423e74b | 709 | case TX_CRYPTO_ERROR: |
lpeters | 34:341fb423e74b | 710 | case TX_SCHEDULING_ERROR: |
lpeters | 34:341fb423e74b | 711 | printf("\r\n Transmission Error - EventCode = %d \r\n", event); |
lpeters | 34:341fb423e74b | 712 | // try again |
lpeters | 36:dcc6f89fa39a | 713 | /* |
lpeters | 34:341fb423e74b | 714 | if (MBED_CONF_LORA_DUTY_CYCLE_ON) { |
lpeters | 34:341fb423e74b | 715 | send_message(); |
lpeters | 34:341fb423e74b | 716 | } |
lpeters | 36:dcc6f89fa39a | 717 | */ |
lpeters | 34:341fb423e74b | 718 | break; |
lpeters | 34:341fb423e74b | 719 | case RX_DONE: |
lpeters | 34:341fb423e74b | 720 | printf("\r\n Received message from Network Server \r\n"); |
lpeters | 34:341fb423e74b | 721 | receive_message(); |
lpeters | 34:341fb423e74b | 722 | break; |
lpeters | 34:341fb423e74b | 723 | case RX_TIMEOUT: |
lpeters | 34:341fb423e74b | 724 | case RX_ERROR: |
lpeters | 34:341fb423e74b | 725 | printf("\r\n Error in reception - Code = %d \r\n", event); |
lpeters | 34:341fb423e74b | 726 | break; |
lpeters | 34:341fb423e74b | 727 | case JOIN_FAILURE: |
lpeters | 34:341fb423e74b | 728 | printf("\r\n OTAA Failed - Check Keys \r\n"); |
lpeters | 34:341fb423e74b | 729 | break; |
lpeters | 34:341fb423e74b | 730 | case UPLINK_REQUIRED: |
lpeters | 34:341fb423e74b | 731 | printf("\r\n Uplink required by NS \r\n"); |
lpeters | 36:dcc6f89fa39a | 732 | /* |
lpeters | 34:341fb423e74b | 733 | if (MBED_CONF_LORA_DUTY_CYCLE_ON) { |
lpeters | 34:341fb423e74b | 734 | send_message(); |
lpeters | 34:341fb423e74b | 735 | } |
lpeters | 36:dcc6f89fa39a | 736 | */ |
lpeters | 34:341fb423e74b | 737 | break; |
lpeters | 34:341fb423e74b | 738 | default: |
lpeters | 34:341fb423e74b | 739 | MBED_ASSERT("Unknown Event"); |
lpeters | 34:341fb423e74b | 740 | } |
lpeters | 34:341fb423e74b | 741 | } |
lpeters | 34:341fb423e74b | 742 | |
lpeters | 34:341fb423e74b | 743 | void magInitSequence() |
lpeters | 34:341fb423e74b | 744 | { |
lpeters | 35:73b3963c6dd3 | 745 | printf("In magInitSequence()...\r\n"); |
lpeters | 34:341fb423e74b | 746 | myLedR = 0; |
lpeters | 34:341fb423e74b | 747 | myLedG = 0; |
lpeters | 34:341fb423e74b | 748 | cmd[0] = LSM303_REG_MAG_WHO_AM_I_M; |
lpeters | 34:341fb423e74b | 749 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 750 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 34:341fb423e74b | 751 | res = (ret == LSM303_WHO_MAG ? sPass : sFail); |
lpeters | 34:341fb423e74b | 752 | printf("MAG WhoAmI: %02X %s\r\n", ret, res); |
lpeters | 34:341fb423e74b | 753 | |
lpeters | 34:341fb423e74b | 754 | if (ret == LSM303_WHO_MAG) |
lpeters | 34:341fb423e74b | 755 | myLedG = 1; |
lpeters | 34:341fb423e74b | 756 | else |
lpeters | 34:341fb423e74b | 757 | myLedR = 1; |
lpeters | 34:341fb423e74b | 758 | |
lpeters | 34:341fb423e74b | 759 | for (int i = 0; i < 2; i++) { |
lpeters | 34:341fb423e74b | 760 | myLedB = 1; |
lpeters | 34:341fb423e74b | 761 | wait(0.3); |
lpeters | 34:341fb423e74b | 762 | myLedB = 0; |
lpeters | 34:341fb423e74b | 763 | wait(0.3); |
lpeters | 34:341fb423e74b | 764 | } |
lpeters | 34:341fb423e74b | 765 | |
lpeters | 34:341fb423e74b | 766 | #if defined(TARGET_LRAT) |
lpeters | 34:341fb423e74b | 767 | cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; |
lpeters | 34:341fb423e74b | 768 | cmd[1] = 0x70; // Ultra-High Performance Mode on XY axes, ODR=10Hz |
lpeters | 34:341fb423e74b | 769 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 770 | cmd[0] = LSM303_REG_MAG_CTRL_REG3_M; |
lpeters | 34:341fb423e74b | 771 | cmd[1] = 0x00; // High Resolution? (Full-power), Continuous |
lpeters | 34:341fb423e74b | 772 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 773 | cmd[0] = LSM303_REG_MAG_CTRL_REG4_M; |
lpeters | 34:341fb423e74b | 774 | cmd[1] = 0x0C; // Ultra-High Performance Mode on Z axis |
lpeters | 34:341fb423e74b | 775 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 776 | #if defined(SENSOR_TEMP) |
lpeters | 34:341fb423e74b | 777 | // Enable Temp Sensor |
lpeters | 34:341fb423e74b | 778 | cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; |
lpeters | 34:341fb423e74b | 779 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 780 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 34:341fb423e74b | 781 | cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; |
lpeters | 34:341fb423e74b | 782 | cmd[1] = ret | 0x80; |
lpeters | 34:341fb423e74b | 783 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 784 | /* |
lpeters | 34:341fb423e74b | 785 | cmd[0] = LSM303_REG_MAG_CTRL_REG5_M; |
lpeters | 34:341fb423e74b | 786 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 787 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 34:341fb423e74b | 788 | cmd[0] = LSM303_REG_MAG_CTRL_REG5_M; |
lpeters | 34:341fb423e74b | 789 | cmd[1] = ret | 0x40; |
lpeters | 34:341fb423e74b | 790 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 791 | */ |
lpeters | 34:341fb423e74b | 792 | #endif |
lpeters | 34:341fb423e74b | 793 | #else |
lpeters | 34:341fb423e74b | 794 | cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; |
lpeters | 34:341fb423e74b | 795 | cmd[1] = 0x00; // Mag = 10 Hz (high-resolution and continuous mode) |
lpeters | 34:341fb423e74b | 796 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 797 | cmd[0] = LSM303_REG_MAG_CFG_REG_C_M; |
lpeters | 34:341fb423e74b | 798 | //cmd[1] = 0x01; // Mag data-ready interrupt enable |
lpeters | 34:341fb423e74b | 799 | cmd[1] = 0x40; // Mag enable interrupt on pin |
lpeters | 34:341fb423e74b | 800 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 801 | #endif |
lpeters | 34:341fb423e74b | 802 | |
lpeters | 34:341fb423e74b | 803 | for (int i = 0; i < 2; i++) { |
lpeters | 34:341fb423e74b | 804 | myLedR = 1; |
lpeters | 34:341fb423e74b | 805 | myLedG = 1; |
lpeters | 34:341fb423e74b | 806 | myLedB = 1; |
lpeters | 34:341fb423e74b | 807 | wait(0.5); |
lpeters | 34:341fb423e74b | 808 | myLedR = 0; |
lpeters | 34:341fb423e74b | 809 | myLedG = 0; |
lpeters | 34:341fb423e74b | 810 | myLedB = 0; |
lpeters | 34:341fb423e74b | 811 | wait(0.5); |
lpeters | 34:341fb423e74b | 812 | } |
lpeters | 35:73b3963c6dd3 | 813 | #if defined(TARGET_LRAT) |
lpeters | 35:73b3963c6dd3 | 814 | // LRAT MAG IRQ SETUP GOES HERE |
lpeters | 35:73b3963c6dd3 | 815 | #else |
lpeters | 34:341fb423e74b | 816 | // MAG INTERRUPT SETUP |
lpeters | 34:341fb423e74b | 817 | cmd[0] = LSM303_REG_MAG_INT_THS_L_REG_M; |
lpeters | 35:73b3963c6dd3 | 818 | cmd[1] = 0xE8; |
lpeters | 34:341fb423e74b | 819 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 820 | cmd[0] = LSM303_REG_MAG_INT_THS_H_REG_M; |
lpeters | 35:73b3963c6dd3 | 821 | cmd[1] = 0x03; |
lpeters | 34:341fb423e74b | 822 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 823 | cmd[0] = LSM303_REG_MAG_INT_CTRL_REG_M; |
lpeters | 34:341fb423e74b | 824 | cmd[1] = 0xE7; |
lpeters | 34:341fb423e74b | 825 | i2c.write(LSM303_ADR_MAG, cmd, 2); |
lpeters | 34:341fb423e74b | 826 | magPin.rise(&onMagIrq); |
lpeters | 35:73b3963c6dd3 | 827 | #endif |
lpeters | 34:341fb423e74b | 828 | } |
lpeters | 34:341fb423e74b | 829 | |
lpeters | 34:341fb423e74b | 830 | void accInitSequence() |
lpeters | 34:341fb423e74b | 831 | { |
lpeters | 35:73b3963c6dd3 | 832 | printf("In accInitSequence()...\r\n"); |
lpeters | 34:341fb423e74b | 833 | myLedR = 0; |
lpeters | 34:341fb423e74b | 834 | myLedG = 0; |
lpeters | 34:341fb423e74b | 835 | cmd[0] = LSM303_REG_ACC_WHO_AM_I_A; |
lpeters | 34:341fb423e74b | 836 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 837 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 838 | res = (ret == LSM303_WHO_ACC ? sPass : sFail); |
lpeters | 34:341fb423e74b | 839 | printf("ACC WhoAmI: %02X %s\r\n", ret, res); |
lpeters | 34:341fb423e74b | 840 | |
lpeters | 34:341fb423e74b | 841 | if (ret == LSM303_WHO_ACC) |
lpeters | 34:341fb423e74b | 842 | myLedG = 1; |
lpeters | 34:341fb423e74b | 843 | else |
lpeters | 34:341fb423e74b | 844 | myLedR = 1; |
lpeters | 34:341fb423e74b | 845 | |
lpeters | 34:341fb423e74b | 846 | for (int i = 0; i < 2; i++) { |
lpeters | 34:341fb423e74b | 847 | myLedB = 1; |
lpeters | 34:341fb423e74b | 848 | wait(0.3); |
lpeters | 34:341fb423e74b | 849 | myLedB = 0; |
lpeters | 34:341fb423e74b | 850 | wait(0.3); |
lpeters | 34:341fb423e74b | 851 | } |
lpeters | 34:341fb423e74b | 852 | |
lpeters | 34:341fb423e74b | 853 | #if defined(TARGET_LRAT) |
lpeters | 34:341fb423e74b | 854 | cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; |
lpeters | 34:341fb423e74b | 855 | cmd[1] = 0xB7; // High Resolution, ODR=100Hz, Enable XYZ Axes |
lpeters | 34:341fb423e74b | 856 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 857 | #else |
lpeters | 34:341fb423e74b | 858 | cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; |
lpeters | 34:341fb423e74b | 859 | cmd[1] = 0x57; // Enable XYZ Axes, ODR=100Hz |
lpeters | 34:341fb423e74b | 860 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 861 | |
lpeters | 34:341fb423e74b | 862 | // Enable High Resolution Mode |
lpeters | 34:341fb423e74b | 863 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 864 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 865 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 866 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 867 | cmd[1] = ret | 0x08; // High Resolution |
lpeters | 34:341fb423e74b | 868 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 869 | |
lpeters | 34:341fb423e74b | 870 | #if defined(SENSOR_TEMP) |
lpeters | 34:341fb423e74b | 871 | // Enable Temp Sensor |
lpeters | 34:341fb423e74b | 872 | cmd[0] = LSM303_REG_ACC_TEMP_CFG_REG_A; |
lpeters | 34:341fb423e74b | 873 | cmd[1] = 0xC0; |
lpeters | 34:341fb423e74b | 874 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 875 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 876 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 877 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 878 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 879 | cmd[1] = ret | 0x80; |
lpeters | 34:341fb423e74b | 880 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 881 | #endif |
lpeters | 34:341fb423e74b | 882 | #endif |
lpeters | 34:341fb423e74b | 883 | |
lpeters | 34:341fb423e74b | 884 | //LED Confirmation Output - ACC INIT COMPLETE |
lpeters | 34:341fb423e74b | 885 | for (int i = 0; i < 2; i++) { |
lpeters | 34:341fb423e74b | 886 | myLedR = 1; |
lpeters | 34:341fb423e74b | 887 | myLedG = 1; |
lpeters | 34:341fb423e74b | 888 | myLedB = 1; |
lpeters | 34:341fb423e74b | 889 | wait(0.5); |
lpeters | 34:341fb423e74b | 890 | myLedR = 0; |
lpeters | 34:341fb423e74b | 891 | myLedG = 0; |
lpeters | 34:341fb423e74b | 892 | myLedB = 0; |
lpeters | 34:341fb423e74b | 893 | wait(0.5); |
lpeters | 34:341fb423e74b | 894 | } |
lpeters | 34:341fb423e74b | 895 | |
lpeters | 34:341fb423e74b | 896 | // Set Full Scale to 4g |
lpeters | 34:341fb423e74b | 897 | /* |
lpeters | 34:341fb423e74b | 898 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 899 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 900 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 901 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 902 | //cmd[1] = ret | 0x30; // 16g |
lpeters | 34:341fb423e74b | 903 | //cmd[1] = (ret & ~0x10) | 0x20; // 8g |
lpeters | 34:341fb423e74b | 904 | cmd[1] = (ret & ~0x20) | 0x10; // 4g |
lpeters | 34:341fb423e74b | 905 | //cmd[1] = ret & ~0x30; // 2g |
lpeters | 34:341fb423e74b | 906 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 907 | */ |
lpeters | 34:341fb423e74b | 908 | /* |
lpeters | 34:341fb423e74b | 909 | // IRQ Init from Datasheet. |
lpeters | 34:341fb423e74b | 910 | cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; |
lpeters | 34:341fb423e74b | 911 | cmd[1] = 0xA7; |
lpeters | 34:341fb423e74b | 912 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 913 | cmd[0] = LSM303_REG_ACC_CTRL_REG2_A; |
lpeters | 34:341fb423e74b | 914 | cmd[1] = 0x00; |
lpeters | 34:341fb423e74b | 915 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 916 | cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; |
lpeters | 34:341fb423e74b | 917 | cmd[1] = 0x40; |
lpeters | 34:341fb423e74b | 918 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 919 | cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; |
lpeters | 34:341fb423e74b | 920 | cmd[1] = 0x00; |
lpeters | 34:341fb423e74b | 921 | //cmd[1] = 0x10; |
lpeters | 34:341fb423e74b | 922 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 923 | cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; |
lpeters | 34:341fb423e74b | 924 | cmd[1] = 0x08; |
lpeters | 34:341fb423e74b | 925 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 926 | */ |
lpeters | 35:73b3963c6dd3 | 927 | #if defined(TARGET_LRAT) |
lpeters | 35:73b3963c6dd3 | 928 | // LRAT ACC IRQ SETUP GOES HERE |
lpeters | 35:73b3963c6dd3 | 929 | #else |
lpeters | 34:341fb423e74b | 930 | // ACC INTERRUPT SETUP |
lpeters | 34:341fb423e74b | 931 | // Enable Interrupt Pin |
lpeters | 34:341fb423e74b | 932 | cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; |
lpeters | 34:341fb423e74b | 933 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 934 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 935 | cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; |
lpeters | 34:341fb423e74b | 936 | cmd[1] = ret | 0x40; |
lpeters | 34:341fb423e74b | 937 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 938 | // Enable Interrupt Latch |
lpeters | 34:341fb423e74b | 939 | cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; |
lpeters | 34:341fb423e74b | 940 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 941 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 942 | cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; |
lpeters | 34:341fb423e74b | 943 | cmd[1] = ret | 0x08; |
lpeters | 34:341fb423e74b | 944 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 945 | |
lpeters | 34:341fb423e74b | 946 | // Set Threshold/Duration/Config |
lpeters | 34:341fb423e74b | 947 | cmd[0] = LSM303_REG_ACC_INT1_THS_A; |
lpeters | 34:341fb423e74b | 948 | //cmd[1] = 0x10; |
lpeters | 34:341fb423e74b | 949 | //cmd[1] = 0x40; |
lpeters | 34:341fb423e74b | 950 | //cmd[1] = 0x60; |
lpeters | 34:341fb423e74b | 951 | cmd[1] = 0x7D; |
lpeters | 34:341fb423e74b | 952 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 953 | cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; |
lpeters | 34:341fb423e74b | 954 | cmd[1] = 0x00; |
lpeters | 34:341fb423e74b | 955 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 956 | cmd[0] = LSM303_REG_ACC_INT1_CFG_A; |
lpeters | 34:341fb423e74b | 957 | cmd[1] = 0x2A; |
lpeters | 34:341fb423e74b | 958 | //cmd[1] = 0x0A; |
lpeters | 34:341fb423e74b | 959 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 35:73b3963c6dd3 | 960 | accPin.rise(&onAccIrq); |
lpeters | 35:73b3963c6dd3 | 961 | #endif |
lpeters | 34:341fb423e74b | 962 | } |
lpeters | 34:341fb423e74b | 963 | |
lpeters | 34:341fb423e74b | 964 | void gpsInitSequence() |
lpeters | 34:341fb423e74b | 965 | { |
lpeters | 35:73b3963c6dd3 | 966 | printf("In gpsInitSequence()...\r\n"); |
lpeters | 35:73b3963c6dd3 | 967 | gpsRead(); |
lpeters | 35:73b3963c6dd3 | 968 | if (mytime > 0) |
lpeters | 35:73b3963c6dd3 | 969 | { |
lpeters | 35:73b3963c6dd3 | 970 | set_time(mytime); |
lpeters | 35:73b3963c6dd3 | 971 | tInit = mytime; |
lpeters | 35:73b3963c6dd3 | 972 | myLedG = 1; |
lpeters | 35:73b3963c6dd3 | 973 | } |
lpeters | 35:73b3963c6dd3 | 974 | else |
lpeters | 35:73b3963c6dd3 | 975 | myLedR = 1; |
lpeters | 34:341fb423e74b | 976 | |
lpeters | 34:341fb423e74b | 977 | for (int i = 0; i < 2; i++) { |
lpeters | 34:341fb423e74b | 978 | myLedB = 1; |
lpeters | 34:341fb423e74b | 979 | wait(0.3); |
lpeters | 34:341fb423e74b | 980 | myLedB = 0; |
lpeters | 34:341fb423e74b | 981 | wait(0.3); |
lpeters | 34:341fb423e74b | 982 | } |
lpeters | 34:341fb423e74b | 983 | myLedG = 0; |
lpeters | 34:341fb423e74b | 984 | myLedR = 0; |
lpeters | 34:341fb423e74b | 985 | } |
lpeters | 34:341fb423e74b | 986 | |
lpeters | 34:341fb423e74b | 987 | void magRead() |
lpeters | 34:341fb423e74b | 988 | { |
lpeters | 34:341fb423e74b | 989 | cmd[0] = LSM303_REG_MAG_STATUS_REG_M; |
lpeters | 34:341fb423e74b | 990 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 991 | i2c.read(LSM303_ADR_MAG, &rda, 1); |
lpeters | 34:341fb423e74b | 992 | if (rda) |
lpeters | 34:341fb423e74b | 993 | { |
lpeters | 34:341fb423e74b | 994 | cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M; |
lpeters | 34:341fb423e74b | 995 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 996 | i2c.read(LSM303_ADR_MAG, &buf[0], 1); |
lpeters | 34:341fb423e74b | 997 | cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M; |
lpeters | 34:341fb423e74b | 998 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 999 | i2c.read(LSM303_ADR_MAG, &buf[1], 1); |
lpeters | 34:341fb423e74b | 1000 | cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M; |
lpeters | 34:341fb423e74b | 1001 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1002 | i2c.read(LSM303_ADR_MAG, &buf[2], 1); |
lpeters | 34:341fb423e74b | 1003 | cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M; |
lpeters | 34:341fb423e74b | 1004 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1005 | i2c.read(LSM303_ADR_MAG, &buf[3], 1); |
lpeters | 34:341fb423e74b | 1006 | cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M; |
lpeters | 34:341fb423e74b | 1007 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1008 | i2c.read(LSM303_ADR_MAG, &buf[4], 1); |
lpeters | 34:341fb423e74b | 1009 | cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M; |
lpeters | 34:341fb423e74b | 1010 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1011 | i2c.read(LSM303_ADR_MAG, &buf[5], 1); |
lpeters | 34:341fb423e74b | 1012 | myMagX = (buf[0] | (buf[1] << 8)); |
lpeters | 34:341fb423e74b | 1013 | myMagY = (buf[2] | (buf[3] << 8)); |
lpeters | 34:341fb423e74b | 1014 | myMagZ = (buf[4] | (buf[5] << 8)); |
lpeters | 34:341fb423e74b | 1015 | if (myMagX < magMinX) |
lpeters | 34:341fb423e74b | 1016 | magMinX = myMagX; |
lpeters | 34:341fb423e74b | 1017 | if (myMagY < magMinY) |
lpeters | 34:341fb423e74b | 1018 | magMinY = myMagY; |
lpeters | 34:341fb423e74b | 1019 | if (myMagZ < magMinZ) |
lpeters | 34:341fb423e74b | 1020 | magMinZ = myMagZ; |
lpeters | 34:341fb423e74b | 1021 | if (myMagX > magMaxX) |
lpeters | 34:341fb423e74b | 1022 | magMaxX = myMagX; |
lpeters | 34:341fb423e74b | 1023 | if (myMagY > magMaxY) |
lpeters | 34:341fb423e74b | 1024 | magMaxY = myMagY; |
lpeters | 34:341fb423e74b | 1025 | if (myMagZ > magMaxZ) |
lpeters | 34:341fb423e74b | 1026 | magMaxZ = myMagZ; |
lpeters | 34:341fb423e74b | 1027 | cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M; |
lpeters | 34:341fb423e74b | 1028 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1029 | i2c.read(LSM303_ADR_MAG, &ret, 1); |
lpeters | 34:341fb423e74b | 1030 | if (ret & 0x01 && magEvent == 0 && ret & 0xFC) |
lpeters | 34:341fb423e74b | 1031 | { |
lpeters | 34:341fb423e74b | 1032 | magSFire++; |
lpeters | 34:341fb423e74b | 1033 | magEvent = 1; |
lpeters | 34:341fb423e74b | 1034 | magSHIRQ++; |
lpeters | 34:341fb423e74b | 1035 | } |
lpeters | 34:341fb423e74b | 1036 | else if (!(ret & 0x01) && magEvent == 1 && !(ret & 0xFC)) |
lpeters | 34:341fb423e74b | 1037 | { |
lpeters | 34:341fb423e74b | 1038 | magSFire++; |
lpeters | 34:341fb423e74b | 1039 | magEvent = 0; |
lpeters | 34:341fb423e74b | 1040 | magSLIRQ++; |
lpeters | 34:341fb423e74b | 1041 | } |
lpeters | 34:341fb423e74b | 1042 | 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 | 1043 | } |
lpeters | 34:341fb423e74b | 1044 | } |
lpeters | 34:341fb423e74b | 1045 | |
lpeters | 34:341fb423e74b | 1046 | void accRead() |
lpeters | 34:341fb423e74b | 1047 | { |
lpeters | 34:341fb423e74b | 1048 | cmd[0] = LSM303_REG_ACC_STATUS_REG_A; |
lpeters | 34:341fb423e74b | 1049 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1050 | i2c.read(LSM303_ADR_ACC, &rda, 1); |
lpeters | 34:341fb423e74b | 1051 | if (rda) |
lpeters | 34:341fb423e74b | 1052 | { |
lpeters | 34:341fb423e74b | 1053 | cmd[0] = LSM303_REG_ACC_OUT_X_L_A; |
lpeters | 34:341fb423e74b | 1054 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1055 | i2c.read(LSM303_ADR_ACC, &buf[0], 1); |
lpeters | 34:341fb423e74b | 1056 | cmd[0] = LSM303_REG_ACC_OUT_X_H_A; |
lpeters | 34:341fb423e74b | 1057 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1058 | i2c.read(LSM303_ADR_ACC, &buf[1], 1); |
lpeters | 34:341fb423e74b | 1059 | cmd[0] = LSM303_REG_ACC_OUT_Y_L_A; |
lpeters | 34:341fb423e74b | 1060 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1061 | i2c.read(LSM303_ADR_ACC, &buf[2], 1); |
lpeters | 34:341fb423e74b | 1062 | cmd[0] = LSM303_REG_ACC_OUT_Y_H_A; |
lpeters | 34:341fb423e74b | 1063 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1064 | i2c.read(LSM303_ADR_ACC, &buf[3], 1); |
lpeters | 34:341fb423e74b | 1065 | cmd[0] = LSM303_REG_ACC_OUT_Z_L_A; |
lpeters | 34:341fb423e74b | 1066 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1067 | i2c.read(LSM303_ADR_ACC, &buf[4], 1); |
lpeters | 34:341fb423e74b | 1068 | cmd[0] = LSM303_REG_ACC_OUT_Z_H_A; |
lpeters | 34:341fb423e74b | 1069 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1070 | i2c.read(LSM303_ADR_ACC, &buf[5], 1); |
lpeters | 34:341fb423e74b | 1071 | myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift); |
lpeters | 34:341fb423e74b | 1072 | myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift); |
lpeters | 34:341fb423e74b | 1073 | myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift); |
lpeters | 34:341fb423e74b | 1074 | if (myAccX < accMinX) |
lpeters | 34:341fb423e74b | 1075 | accMinX = myAccX; |
lpeters | 34:341fb423e74b | 1076 | if (myAccY < accMinY) |
lpeters | 34:341fb423e74b | 1077 | accMinY = myAccY; |
lpeters | 34:341fb423e74b | 1078 | if (myAccZ < accMinZ) |
lpeters | 34:341fb423e74b | 1079 | accMinZ = myAccZ; |
lpeters | 34:341fb423e74b | 1080 | if (myAccX > accMaxX) |
lpeters | 34:341fb423e74b | 1081 | accMaxX = myAccX; |
lpeters | 34:341fb423e74b | 1082 | if (myAccY > accMaxY) |
lpeters | 34:341fb423e74b | 1083 | accMaxY = myAccY; |
lpeters | 34:341fb423e74b | 1084 | if (myAccZ > accMaxZ) |
lpeters | 34:341fb423e74b | 1085 | accMaxZ = myAccZ; |
lpeters | 34:341fb423e74b | 1086 | cmd[0] = LSM303_REG_ACC_INT1_SRC_A; |
lpeters | 34:341fb423e74b | 1087 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1088 | i2c.read(LSM303_ADR_ACC, &ret, 1); |
lpeters | 34:341fb423e74b | 1089 | if (ret & 0x40) |
lpeters | 34:341fb423e74b | 1090 | { |
lpeters | 34:341fb423e74b | 1091 | accSFire++; |
lpeters | 34:341fb423e74b | 1092 | if (accEvent == 1) |
lpeters | 34:341fb423e74b | 1093 | { |
lpeters | 34:341fb423e74b | 1094 | accEvent = 0; |
lpeters | 34:341fb423e74b | 1095 | accSLIRQ++; |
lpeters | 34:341fb423e74b | 1096 | cmd[0] = LSM303_REG_ACC_INT1_THS_A; |
lpeters | 34:341fb423e74b | 1097 | cmd[1] = 0x7D; |
lpeters | 34:341fb423e74b | 1098 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1099 | cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; |
lpeters | 34:341fb423e74b | 1100 | cmd[1] = 0x00; |
lpeters | 34:341fb423e74b | 1101 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1102 | cmd[0] = LSM303_REG_ACC_INT1_CFG_A; |
lpeters | 34:341fb423e74b | 1103 | cmd[1] = 0x2A; |
lpeters | 34:341fb423e74b | 1104 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1105 | } |
lpeters | 34:341fb423e74b | 1106 | else |
lpeters | 34:341fb423e74b | 1107 | { |
lpeters | 34:341fb423e74b | 1108 | accEvent = 1; |
lpeters | 34:341fb423e74b | 1109 | accSHIRQ++; |
lpeters | 34:341fb423e74b | 1110 | cmd[0] = LSM303_REG_ACC_INT1_THS_A; |
lpeters | 34:341fb423e74b | 1111 | cmd[1] = 0x50; |
lpeters | 34:341fb423e74b | 1112 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1113 | cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; |
lpeters | 34:341fb423e74b | 1114 | //cmd[1] = 0x7D; |
lpeters | 34:341fb423e74b | 1115 | cmd[1] = 0x03; |
lpeters | 34:341fb423e74b | 1116 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1117 | cmd[0] = LSM303_REG_ACC_INT1_CFG_A; |
lpeters | 34:341fb423e74b | 1118 | cmd[1] = 0x95; |
lpeters | 34:341fb423e74b | 1119 | i2c.write(LSM303_ADR_ACC, cmd, 2); |
lpeters | 34:341fb423e74b | 1120 | } |
lpeters | 34:341fb423e74b | 1121 | } |
lpeters | 34:341fb423e74b | 1122 | 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 | 1123 | } |
lpeters | 34:341fb423e74b | 1124 | } |
lpeters | 34:341fb423e74b | 1125 | |
lpeters | 34:341fb423e74b | 1126 | void tmpRead() |
lpeters | 34:341fb423e74b | 1127 | { |
lpeters | 34:341fb423e74b | 1128 | #if defined(TARGET_LRAT) |
lpeters | 34:341fb423e74b | 1129 | cmd[0] = LSM303_REG_MAG_TEMP_L_M; |
lpeters | 34:341fb423e74b | 1130 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1131 | i2c.read(LSM303_ADR_MAG, &buf[0], 1); |
lpeters | 34:341fb423e74b | 1132 | cmd[0] = LSM303_REG_MAG_TEMP_H_M; |
lpeters | 34:341fb423e74b | 1133 | i2c.write(LSM303_ADR_MAG, cmd, 1); |
lpeters | 34:341fb423e74b | 1134 | i2c.read(LSM303_ADR_MAG, &buf[1], 1); |
lpeters | 34:341fb423e74b | 1135 | myTemp = (int16_t)(buf[0] | (buf[1] << 8)); |
lpeters | 34:341fb423e74b | 1136 | printf("T|%02X %02X| (%d)\r\n", buf[0], buf[1], myTemp); |
lpeters | 34:341fb423e74b | 1137 | #else |
lpeters | 34:341fb423e74b | 1138 | cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; |
lpeters | 34:341fb423e74b | 1139 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1140 | i2c.read(LSM303_ADR_ACC, &rda, 1); |
lpeters | 34:341fb423e74b | 1141 | if (rda & 0x04) |
lpeters | 34:341fb423e74b | 1142 | { |
lpeters | 34:341fb423e74b | 1143 | cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80; |
lpeters | 34:341fb423e74b | 1144 | i2c.write(LSM303_ADR_ACC, cmd, 1); |
lpeters | 34:341fb423e74b | 1145 | i2c.read(LSM303_ADR_ACC, &buf[0], 2); |
lpeters | 34:341fb423e74b | 1146 | myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; |
lpeters | 34:341fb423e74b | 1147 | printf("T|%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); |
lpeters | 34:341fb423e74b | 1148 | } |
lpeters | 34:341fb423e74b | 1149 | #endif |
lpeters | 34:341fb423e74b | 1150 | } |
lpeters | 34:341fb423e74b | 1151 | |
lpeters | 34:341fb423e74b | 1152 | void gpsRead() |
lpeters | 34:341fb423e74b | 1153 | { |
lpeters | 34:341fb423e74b | 1154 | bool gpsDone = false; |
lpeters | 34:341fb423e74b | 1155 | bool fixGood = false; |
lpeters | 35:73b3963c6dd3 | 1156 | uint8_t crcPass = 0; |
lpeters | 35:73b3963c6dd3 | 1157 | uint8_t crcFail = 0; |
lpeters | 35:73b3963c6dd3 | 1158 | uint32_t tDate = 0; |
lpeters | 35:73b3963c6dd3 | 1159 | uint32_t tTime = 0; |
lpeters | 34:341fb423e74b | 1160 | myLedW = 1; |
lpeters | 34:341fb423e74b | 1161 | pos = 0; |
lpeters | 33:e47306c32791 | 1162 | ret = 0xFF; |
lpeters | 33:e47306c32791 | 1163 | cmd[0] = 0xFF; |
lpeters | 33:e47306c32791 | 1164 | i2c.write(NEOM8M_ADR_GPS, cmd, 1); |
lpeters | 33:e47306c32791 | 1165 | while(!gpsDone) |
lpeters | 33:e47306c32791 | 1166 | { |
lpeters | 33:e47306c32791 | 1167 | while (ret == 0xFF) |
lpeters | 33:e47306c32791 | 1168 | { |
lpeters | 33:e47306c32791 | 1169 | i2c.read(NEOM8M_ADR_GPS, &ret, 1); |
lpeters | 33:e47306c32791 | 1170 | } |
lpeters | 33:e47306c32791 | 1171 | while (ret != 0xFF) |
lpeters | 33:e47306c32791 | 1172 | { |
lpeters | 33:e47306c32791 | 1173 | buf[pos++] = ret; |
lpeters | 33:e47306c32791 | 1174 | i2c.read(NEOM8M_ADR_GPS, &ret, 1); |
lpeters | 33:e47306c32791 | 1175 | if (ret == '\r') |
lpeters | 33:e47306c32791 | 1176 | { |
lpeters | 33:e47306c32791 | 1177 | i2c.read(NEOM8M_ADR_GPS, &ret, 1); |
lpeters | 33:e47306c32791 | 1178 | if (ret == '\n') |
lpeters | 33:e47306c32791 | 1179 | { |
lpeters | 33:e47306c32791 | 1180 | buf[pos] = 0x00; |
lpeters | 34:341fb423e74b | 1181 | // NMEA Validation |
lpeters | 33:e47306c32791 | 1182 | uint16_t crc = 0; |
lpeters | 35:73b3963c6dd3 | 1183 | char clr = '\0'; |
lpeters | 33:e47306c32791 | 1184 | if (buf[0] == '$' && buf[pos-3] == '*') |
lpeters | 33:e47306c32791 | 1185 | { |
lpeters | 35:73b3963c6dd3 | 1186 | for (int i = 1; i < pos-3; i++) |
lpeters | 33:e47306c32791 | 1187 | { |
lpeters | 33:e47306c32791 | 1188 | crc ^= buf[i]; |
lpeters | 33:e47306c32791 | 1189 | } |
lpeters | 33:e47306c32791 | 1190 | } |
lpeters | 33:e47306c32791 | 1191 | 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 | 1192 | { |
lpeters | 33:e47306c32791 | 1193 | clr = '2'; // 2 = Green |
lpeters | 35:73b3963c6dd3 | 1194 | crcPass++; |
lpeters | 35:73b3963c6dd3 | 1195 | } |
lpeters | 33:e47306c32791 | 1196 | else |
lpeters | 35:73b3963c6dd3 | 1197 | { |
lpeters | 33:e47306c32791 | 1198 | clr = '1'; // 1 = Red |
lpeters | 35:73b3963c6dd3 | 1199 | crcFail++; |
lpeters | 35:73b3963c6dd3 | 1200 | } |
lpeters | 33:e47306c32791 | 1201 | printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf); |
lpeters | 35:73b3963c6dd3 | 1202 | if (clr == '2') |
lpeters | 35:73b3963c6dd3 | 1203 | { |
lpeters | 33:e47306c32791 | 1204 | // Global Positioning System Fix Data |
lpeters | 33:e47306c32791 | 1205 | if(strncmp(buf, "$GNGGA", 6) == 0) |
lpeters | 33:e47306c32791 | 1206 | { |
lpeters | 33:e47306c32791 | 1207 | printf("GNGGA> "); |
lpeters | 33:e47306c32791 | 1208 | //sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude); |
lpeters | 33:e47306c32791 | 1209 | //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 | 1210 | float fldTim, fldAlt; |
lpeters | 33:e47306c32791 | 1211 | double fldLat, fldLon; |
lpeters | 33:e47306c32791 | 1212 | char fldN_S, fldE_W; |
lpeters | 33:e47306c32791 | 1213 | int fldFix, fldSat; |
lpeters | 33:e47306c32791 | 1214 | sscanf(buf, "$GNGGA,%f,%lf,%c,%lf,%c,%d,%d,%*f,%f", &fldTim, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldFix, &fldSat, &fldAlt); |
lpeters | 33:e47306c32791 | 1215 | 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 | 1216 | if (clr == '2') |
lpeters | 33:e47306c32791 | 1217 | { |
lpeters | 33:e47306c32791 | 1218 | mylat = fldLat / (fldN_S == 'S' ? -100 : 100); |
lpeters | 33:e47306c32791 | 1219 | mylon = fldLon / (fldE_W == 'W' ? -100 : 100); |
lpeters | 35:73b3963c6dd3 | 1220 | //mytime = (uint32_t)fldTim; |
lpeters | 33:e47306c32791 | 1221 | mybatt = (fldSat & 0xF0 ? 0x0F : fldSat & 0x0F); |
lpeters | 33:e47306c32791 | 1222 | } |
lpeters | 33:e47306c32791 | 1223 | } |
lpeters | 33:e47306c32791 | 1224 | // Satellite status |
lpeters | 33:e47306c32791 | 1225 | if(strncmp(buf, "$GNGSA", 6) == 0) |
lpeters | 33:e47306c32791 | 1226 | { |
lpeters | 35:73b3963c6dd3 | 1227 | //printf("GNGSA> "); |
lpeters | 33:e47306c32791 | 1228 | //sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst); |
lpeters | 33:e47306c32791 | 1229 | //pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst); |
lpeters | 33:e47306c32791 | 1230 | char fldTyp; |
lpeters | 33:e47306c32791 | 1231 | int fldDim, fldSat; |
lpeters | 33:e47306c32791 | 1232 | sscanf(buf, "$GNGSA,%c,%d,%d", &fldTyp, &fldDim, &fldSat); |
lpeters | 35:73b3963c6dd3 | 1233 | //printf("Typ: %c, Pos: %d, Sat: %d\r\n", fldTyp, fldDim, fldSat); |
lpeters | 33:e47306c32791 | 1234 | } |
lpeters | 33:e47306c32791 | 1235 | // Geographic position, Latitude and Longitude |
lpeters | 33:e47306c32791 | 1236 | if(strncmp(buf, "$GNGLL", 6) == 0) |
lpeters | 33:e47306c32791 | 1237 | { |
lpeters | 35:73b3963c6dd3 | 1238 | //printf("GNGLL> "); |
lpeters | 33:e47306c32791 | 1239 | //sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix); |
lpeters | 33:e47306c32791 | 1240 | //pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix); |
lpeters | 33:e47306c32791 | 1241 | float fldTim; |
lpeters | 33:e47306c32791 | 1242 | double fldLat, fldLon; |
lpeters | 33:e47306c32791 | 1243 | char fldN_S, fldE_W; |
lpeters | 33:e47306c32791 | 1244 | sscanf(buf, "$GNGLL,%lf,%c,%lf,%c,%f", &fldLat, &fldN_S, &fldLon, &fldE_W, &fldTim); |
lpeters | 35:73b3963c6dd3 | 1245 | //printf("Lat: %.5f %c, Lon: %.5f %c, Sec: %.2f\r\n", fldLat, fldN_S, fldLon, fldE_W, fldTim); |
lpeters | 33:e47306c32791 | 1246 | } |
lpeters | 33:e47306c32791 | 1247 | // Geographic position, Latitude and Longitude |
lpeters | 33:e47306c32791 | 1248 | if(strncmp(buf, "$GNRMC", 6) == 0) |
lpeters | 33:e47306c32791 | 1249 | { |
lpeters | 35:73b3963c6dd3 | 1250 | //printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf); |
lpeters | 33:e47306c32791 | 1251 | printf("GNRMC> "); |
lpeters | 33:e47306c32791 | 1252 | //sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date); |
lpeters | 33:e47306c32791 | 1253 | //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 | 1254 | float fldTim, fldSpd, fldTrk; |
lpeters | 35:73b3963c6dd3 | 1255 | fldTrk = 0; |
lpeters | 33:e47306c32791 | 1256 | double fldLat, fldLon; |
lpeters | 33:e47306c32791 | 1257 | char fldSts, fldN_S, fldE_W; |
lpeters | 35:73b3963c6dd3 | 1258 | uint32_t fldDat; |
lpeters | 35:73b3963c6dd3 | 1259 | if (sscanf(buf, "$GNRMC,,%c", &fldSts) != 1 && |
lpeters | 35:73b3963c6dd3 | 1260 | sscanf(buf, "$GNRMC,%f,%c,,,,,,,%d", &fldTim, &fldSts, &fldDat) != 3 && |
lpeters | 35:73b3963c6dd3 | 1261 | 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 | 1262 | 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 | 1263 | printf("[\u001b[33mWARN\u001b[0m] Invalid GNRMC packet detected.\r\n"); |
lpeters | 35:73b3963c6dd3 | 1264 | //sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,%7[^,],%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, fldFoo, &fldDat); |
lpeters | 33:e47306c32791 | 1265 | 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 | 35:73b3963c6dd3 | 1266 | if (clr == '2') |
lpeters | 35:73b3963c6dd3 | 1267 | { |
lpeters | 35:73b3963c6dd3 | 1268 | tTime = (uint32_t)fldTim; |
lpeters | 35:73b3963c6dd3 | 1269 | tDate = fldDat; |
lpeters | 35:73b3963c6dd3 | 1270 | if (fldSts == 'A') |
lpeters | 35:73b3963c6dd3 | 1271 | fixGood = true; |
lpeters | 35:73b3963c6dd3 | 1272 | } |
lpeters | 35:73b3963c6dd3 | 1273 | } |
lpeters | 33:e47306c32791 | 1274 | } |
lpeters | 33:e47306c32791 | 1275 | pos = 0; |
lpeters | 33:e47306c32791 | 1276 | i2c.read(NEOM8M_ADR_GPS, &ret, 1); |
lpeters | 33:e47306c32791 | 1277 | } |
lpeters | 33:e47306c32791 | 1278 | else |
lpeters | 33:e47306c32791 | 1279 | { |
lpeters | 35:73b3963c6dd3 | 1280 | printf("[\u001b[33mWARN\u001b[0m] Expected '0A', received '%02X'.\r\n", ret); |
lpeters | 33:e47306c32791 | 1281 | } |
lpeters | 33:e47306c32791 | 1282 | } |
lpeters | 33:e47306c32791 | 1283 | else if (pos == 82) |
lpeters | 33:e47306c32791 | 1284 | { |
lpeters | 33:e47306c32791 | 1285 | buf[pos] = 0x00; |
lpeters | 33:e47306c32791 | 1286 | printf("GPS: |%s| ...\r\n", buf); |
lpeters | 33:e47306c32791 | 1287 | pos = 0; |
lpeters | 33:e47306c32791 | 1288 | i2c.read(NEOM8M_ADR_GPS, &ret, 1); |
lpeters | 33:e47306c32791 | 1289 | } |
lpeters | 33:e47306c32791 | 1290 | } |
lpeters | 33:e47306c32791 | 1291 | buf[pos] = 0x00; |
lpeters | 33:e47306c32791 | 1292 | gpsDone = true; |
lpeters | 33:e47306c32791 | 1293 | } |
lpeters | 33:e47306c32791 | 1294 | if (pos > 0) |
lpeters | 33:e47306c32791 | 1295 | printf("GPS: |%s|\r\n", buf); |
lpeters | 34:341fb423e74b | 1296 | myLedW = 0; |
lpeters | 35:73b3963c6dd3 | 1297 | if (crcFail) |
lpeters | 35:73b3963c6dd3 | 1298 | printf("[\u001b[33mWARN\u001b[0m] CRC PASS: %d FAIL: %d\r\n", crcPass, crcFail); |
lpeters | 35:73b3963c6dd3 | 1299 | |
lpeters | 35:73b3963c6dd3 | 1300 | struct tm ts; |
lpeters | 35:73b3963c6dd3 | 1301 | time_t t; |
lpeters | 35:73b3963c6dd3 | 1302 | |
lpeters | 35:73b3963c6dd3 | 1303 | uint8_t tDay = tDate / 10000; |
lpeters | 35:73b3963c6dd3 | 1304 | uint8_t tMon = (tDate - (tDay * 10000)) / 100; |
lpeters | 35:73b3963c6dd3 | 1305 | uint8_t tYear = (tDate - ((tDay * 10000) + (tMon * 100))) + 100; |
lpeters | 35:73b3963c6dd3 | 1306 | uint8_t tHour = tTime / 10000; |
lpeters | 35:73b3963c6dd3 | 1307 | uint8_t tMin = (tTime - (tHour * 10000)) / 100; |
lpeters | 35:73b3963c6dd3 | 1308 | uint8_t tSec = (tTime - ((tHour * 10000) + (tMin * 100))); |
lpeters | 35:73b3963c6dd3 | 1309 | |
lpeters | 35:73b3963c6dd3 | 1310 | ts.tm_year = tYear; |
lpeters | 35:73b3963c6dd3 | 1311 | ts.tm_mon = tMon - 1; |
lpeters | 35:73b3963c6dd3 | 1312 | ts.tm_mday = tDay; |
lpeters | 35:73b3963c6dd3 | 1313 | ts.tm_hour = tHour; |
lpeters | 35:73b3963c6dd3 | 1314 | ts.tm_min = tMin; |
lpeters | 35:73b3963c6dd3 | 1315 | ts.tm_sec = tSec; |
lpeters | 35:73b3963c6dd3 | 1316 | t = mktime(&ts); |
lpeters | 35:73b3963c6dd3 | 1317 | //printf("DAT: %06d TIM: %d\r\n", tDate, tTime); |
lpeters | 35:73b3963c6dd3 | 1318 | //printf("CNV: %04d-%02d-%02d@%02d:%02d:%02d\r\n", tYear, tMon, tDay, tHour, tMin, tSec); |
lpeters | 35:73b3963c6dd3 | 1319 | //printf("T: %d\t%s", t, ctime(&t)); |
lpeters | 35:73b3963c6dd3 | 1320 | printf("GPS: %08X\t%s", t, ctime(&t)); |
lpeters | 35:73b3963c6dd3 | 1321 | mytime = t; |
lpeters | 35:73b3963c6dd3 | 1322 | |
lpeters | 34:341fb423e74b | 1323 | if (fixGood) |
lpeters | 34:341fb423e74b | 1324 | myLedG = 1; |
lpeters | 34:341fb423e74b | 1325 | else |
lpeters | 34:341fb423e74b | 1326 | myLedR = 1; |
lpeters | 33:e47306c32791 | 1327 | |
lpeters | 34:341fb423e74b | 1328 | for (int i = 0; i < 10; i++) { |
lpeters | 34:341fb423e74b | 1329 | myLedB = 1; |
lpeters | 34:341fb423e74b | 1330 | wait(0.1); |
lpeters | 34:341fb423e74b | 1331 | myLedB = 0; |
lpeters | 34:341fb423e74b | 1332 | wait(0.1); |
mbed_official | 0:7037ed05f54f | 1333 | } |
mbed_official | 0:7037ed05f54f | 1334 | } |
mbed_official | 0:7037ed05f54f | 1335 | |
mbed_official | 0:7037ed05f54f | 1336 | // EOF |