This is example code that can get you started with building your own IR vision robot that communicates over LoRa
Dependencies: Adafruit-MotorShield Adafruit-PWM-Servo-Driver Adafruit_GFX BufferedSerial MAX17055_EZconfig NEO-6m-GPS SX1276GenericLib USBDeviceHT max32630fthr max77650_charger_sample
Fork of MAX326xxFTHR_LoRa_Example_test by
main.cpp@30:66f9750cc44c, 2018-07-24 (annotated)
- Committer:
- dev_alexander
- Date:
- Tue Jul 24 16:58:04 2018 +0000
- Revision:
- 30:66f9750cc44c
- Parent:
- 29:f7a0e49b826b
- Child:
- 31:f15747cffb20
Changed the way that the program handles the ble connection. Converted functions that were deprecated to function correctly using the new ble methods of a newer version of mbed-os.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Helmut64 | 0:c43b6919ae15 | 1 | /* |
Helmut64 | 17:98f2528e8399 | 2 | * Copyright (c) 2018 HELIOS Software GmbH |
Helmut64 | 0:c43b6919ae15 | 3 | * 30826 Garbsen (Hannover) Germany |
Helmut64 | 0:c43b6919ae15 | 4 | * Licensed under the Apache License, Version 2.0); |
Helmut64 | 0:c43b6919ae15 | 5 | */ |
dev_alexander | 21:1b92cabe8a3b | 6 | |
dev_alexander | 21:1b92cabe8a3b | 7 | /* |
dev_alexander | 21:1b92cabe8a3b | 8 | * For Wiring Instructions, please visit the link below: |
dev_alexander | 21:1b92cabe8a3b | 9 | * https://www.hackster.io/DevinAlex64/getting-started-with-the-max32620fthr-and-lora-f9d8dd\ |
dev_alexander | 21:1b92cabe8a3b | 10 | */ |
dev_alexander | 21:1b92cabe8a3b | 11 | |
dev_alexander | 30:66f9750cc44c | 12 | #include "main.h" |
dev_alexander | 30:66f9750cc44c | 13 | #include "global_buffers.h" |
dev_alexander | 30:66f9750cc44c | 14 | #include "GridEye.h" |
Helmut64 | 0:c43b6919ae15 | 15 | |
dev_alexander | 30:66f9750cc44c | 16 | #define COMPILE_BLE |
dev_alexander | 23:f74a50977593 | 17 | |
dev_alexander | 23:f74a50977593 | 18 | /* If the board that is compiled is the master device (BLE enabled MAX32630FTHR), |
dev_alexander | 23:f74a50977593 | 19 | * then it needs this library and needs to be configed in order for the device to |
dev_alexander | 23:f74a50977593 | 20 | * work with a 3.3volt output instead of a 1.8 volt output. |
dev_alexander | 23:f74a50977593 | 21 | * |
dev_alexander | 23:f74a50977593 | 22 | * This is only needed for the MAX32630FTHR. The MAX325620FTHR is exampt from this |
dev_alexander | 23:f74a50977593 | 23 | * additional setup in the main program. |
dev_alexander | 23:f74a50977593 | 24 | */ |
dev_alexander | 29:f7a0e49b826b | 25 | #if defined(TARGET_MAX32630FTHR) // using the RFM95 board |
dev_alexander | 29:f7a0e49b826b | 26 | #include "max32630fthr.h" |
dev_alexander | 19:9f035b9e65ec | 27 | MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); |
dev_alexander | 29:f7a0e49b826b | 28 | #endif |
Helmut64 | 0:c43b6919ae15 | 29 | |
dev_alexander | 30:66f9750cc44c | 30 | #if defined(COMPILE_BLE) |
dev_alexander | 30:66f9750cc44c | 31 | /* BLE Related MAX32630FTHR Specific stuff */ |
dev_alexander | 30:66f9750cc44c | 32 | #include "ble/BLE.h" |
dev_alexander | 30:66f9750cc44c | 33 | //#include "ble/Gap.h" |
dev_alexander | 30:66f9750cc44c | 34 | #include "UARTService_custom.h" |
dev_alexander | 30:66f9750cc44c | 35 | #include <events/mbed_events.h> |
dev_alexander | 30:66f9750cc44c | 36 | |
dev_alexander | 30:66f9750cc44c | 37 | DigitalOut led2(LED2); |
dev_alexander | 30:66f9750cc44c | 38 | //BLE &ble = BLE::Instance(); |
dev_alexander | 30:66f9750cc44c | 39 | UARTService *uart; |
dev_alexander | 30:66f9750cc44c | 40 | |
dev_alexander | 30:66f9750cc44c | 41 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
dev_alexander | 30:66f9750cc44c | 42 | * it will have an impact on code-size and power consumption. */ |
dev_alexander | 30:66f9750cc44c | 43 | |
dev_alexander | 30:66f9750cc44c | 44 | #if NEED_CONSOLE_OUTPUT |
dev_alexander | 30:66f9750cc44c | 45 | #define DEBUG(STR) { if (uart) uart->write(STR, strlen(STR)); } |
dev_alexander | 30:66f9750cc44c | 46 | #define READ(STR) { if (uart) uart->read(STR, strlen(STR)); } |
dev_alexander | 30:66f9750cc44c | 47 | |
dev_alexander | 30:66f9750cc44c | 48 | #else |
dev_alexander | 30:66f9750cc44c | 49 | #define DEBUG(...) /* nothing */ |
dev_alexander | 30:66f9750cc44c | 50 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
dev_alexander | 30:66f9750cc44c | 51 | |
dev_alexander | 30:66f9750cc44c | 52 | //Triggered when the robot is disconnected from the mobile app. |
dev_alexander | 30:66f9750cc44c | 53 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
dev_alexander | 30:66f9750cc44c | 54 | { |
dev_alexander | 30:66f9750cc44c | 55 | BLE &ble = BLE::Instance(); |
dev_alexander | 30:66f9750cc44c | 56 | DEBUG("Disconnected!\n\r"); |
dev_alexander | 30:66f9750cc44c | 57 | DEBUG("Restarting the advertising process\n\r"); |
dev_alexander | 30:66f9750cc44c | 58 | ble.gap().startAdvertising(); |
dev_alexander | 30:66f9750cc44c | 59 | } |
dev_alexander | 30:66f9750cc44c | 60 | |
dev_alexander | 30:66f9750cc44c | 61 | /* This pointer is needed to reference data in the main program when filling |
dev_alexander | 30:66f9750cc44c | 62 | * with data from the BLE |
dev_alexander | 30:66f9750cc44c | 63 | */ |
dev_alexander | 30:66f9750cc44c | 64 | uint8_t * onDataWritten_curr_ble_to_slave; |
dev_alexander | 30:66f9750cc44c | 65 | |
dev_alexander | 30:66f9750cc44c | 66 | // Triggered when there is data written |
dev_alexander | 30:66f9750cc44c | 67 | void onDataWritten(const GattWriteCallbackParams *params) |
dev_alexander | 30:66f9750cc44c | 68 | { |
dev_alexander | 30:66f9750cc44c | 69 | //LED1 will be off when button is pressed, and on when button is released. |
dev_alexander | 30:66f9750cc44c | 70 | led2 = !led2; |
dev_alexander | 30:66f9750cc44c | 71 | uint8_t button_state; |
dev_alexander | 30:66f9750cc44c | 72 | uint8_t direction; |
dev_alexander | 30:66f9750cc44c | 73 | /*Set up constants for direction of motion */ |
dev_alexander | 30:66f9750cc44c | 74 | // const char FRONT = '5'; |
dev_alexander | 30:66f9750cc44c | 75 | // const char BACK = '6'; |
dev_alexander | 30:66f9750cc44c | 76 | // const char LEFT = '7'; |
dev_alexander | 30:66f9750cc44c | 77 | // const char RIGHT = '8'; |
dev_alexander | 30:66f9750cc44c | 78 | |
dev_alexander | 30:66f9750cc44c | 79 | /*Set up constants for button state */ |
dev_alexander | 30:66f9750cc44c | 80 | // const char PRESSED = '1'; |
dev_alexander | 30:66f9750cc44c | 81 | // const char RELEASED = '0'; |
dev_alexander | 30:66f9750cc44c | 82 | |
dev_alexander | 30:66f9750cc44c | 83 | /* If there is a valid data sent by the mobile app */ |
dev_alexander | 30:66f9750cc44c | 84 | if ((uart != NULL) && (params->handle == uart ->getTXCharacteristicHandle())) { |
dev_alexander | 30:66f9750cc44c | 85 | const uint8_t *packet = params->data; |
dev_alexander | 30:66f9750cc44c | 86 | button_state = packet[3]; |
dev_alexander | 30:66f9750cc44c | 87 | direction = packet[2]; |
dev_alexander | 30:66f9750cc44c | 88 | |
dev_alexander | 30:66f9750cc44c | 89 | // make parameter to send over Lora |
dev_alexander | 30:66f9750cc44c | 90 | onDataWritten_curr_ble_to_slave[0] = direction; |
dev_alexander | 30:66f9750cc44c | 91 | onDataWritten_curr_ble_to_slave[1] = button_state; |
dev_alexander | 30:66f9750cc44c | 92 | |
dev_alexander | 30:66f9750cc44c | 93 | dprintf("direction: %d\n", direction); |
dev_alexander | 30:66f9750cc44c | 94 | dprintf("button_state: %d\n", button_state); |
dev_alexander | 30:66f9750cc44c | 95 | |
dev_alexander | 30:66f9750cc44c | 96 | /* |
dev_alexander | 30:66f9750cc44c | 97 | switch (button_state) |
dev_alexander | 30:66f9750cc44c | 98 | { |
dev_alexander | 30:66f9750cc44c | 99 | case PRESSED: |
dev_alexander | 30:66f9750cc44c | 100 | md_left_pwm = static_cast<float>(20/100.0F); |
dev_alexander | 30:66f9750cc44c | 101 | md_right_pwm = static_cast<float>(20/100.0F); |
dev_alexander | 30:66f9750cc44c | 102 | |
dev_alexander | 30:66f9750cc44c | 103 | switch (direction) |
dev_alexander | 30:66f9750cc44c | 104 | { |
dev_alexander | 30:66f9750cc44c | 105 | case FRONT: |
dev_alexander | 30:66f9750cc44c | 106 | md_left_dir = 1; |
dev_alexander | 30:66f9750cc44c | 107 | md_left_pwm = 0.7; |
dev_alexander | 30:66f9750cc44c | 108 | md_right_dir = 1; |
dev_alexander | 30:66f9750cc44c | 109 | md_right_pwm = 0.7; |
dev_alexander | 30:66f9750cc44c | 110 | break; |
dev_alexander | 30:66f9750cc44c | 111 | case BACK: |
dev_alexander | 30:66f9750cc44c | 112 | md_left_dir = 0; |
dev_alexander | 30:66f9750cc44c | 113 | md_left_pwm = 0.7; |
dev_alexander | 30:66f9750cc44c | 114 | md_right_dir = 0; |
dev_alexander | 30:66f9750cc44c | 115 | md_right_pwm = 0.7; |
dev_alexander | 30:66f9750cc44c | 116 | break; |
dev_alexander | 30:66f9750cc44c | 117 | case LEFT: |
dev_alexander | 30:66f9750cc44c | 118 | md_left_dir = 0; |
dev_alexander | 30:66f9750cc44c | 119 | md_left_pwm = 0.5; |
dev_alexander | 30:66f9750cc44c | 120 | md_right_dir = 1; |
dev_alexander | 30:66f9750cc44c | 121 | md_right_pwm = 0.5; |
dev_alexander | 30:66f9750cc44c | 122 | break; |
dev_alexander | 30:66f9750cc44c | 123 | case RIGHT: |
dev_alexander | 30:66f9750cc44c | 124 | md_left_dir = 1; |
dev_alexander | 30:66f9750cc44c | 125 | md_left_pwm = 0.5; |
dev_alexander | 30:66f9750cc44c | 126 | md_right_dir = 0; |
dev_alexander | 30:66f9750cc44c | 127 | md_right_pwm = 0.5; |
dev_alexander | 30:66f9750cc44c | 128 | break; |
dev_alexander | 30:66f9750cc44c | 129 | } |
dev_alexander | 30:66f9750cc44c | 130 | break; |
dev_alexander | 30:66f9750cc44c | 131 | case RELEASED: |
dev_alexander | 30:66f9750cc44c | 132 | md_left_pwm = 0; |
dev_alexander | 30:66f9750cc44c | 133 | md_right_pwm = 0; |
dev_alexander | 30:66f9750cc44c | 134 | break; |
dev_alexander | 30:66f9750cc44c | 135 | } |
dev_alexander | 30:66f9750cc44c | 136 | */ |
dev_alexander | 30:66f9750cc44c | 137 | |
dev_alexander | 30:66f9750cc44c | 138 | } |
dev_alexander | 30:66f9750cc44c | 139 | } |
dev_alexander | 30:66f9750cc44c | 140 | #endif |
dev_alexander | 30:66f9750cc44c | 141 | |
Helmut64 | 17:98f2528e8399 | 142 | DigitalOut myled(LED); |
Helmut64 | 0:c43b6919ae15 | 143 | |
dev_alexander | 28:0ed92c590607 | 144 | Serial pc(USBTX, USBRX); |
dev_alexander | 25:1a031add188a | 145 | |
Helmut64 | 0:c43b6919ae15 | 146 | |
dev_alexander | 23:f74a50977593 | 147 | #if defined(TARGET_MAX32630FTHR) // Master Device: MAX32630FTHR BLE-to-LoRa Gateway |
dev_alexander | 23:f74a50977593 | 148 | /* No grid eye object needed. The function the master uses to convert the raw |
dev_alexander | 23:f74a50977593 | 149 | * data that is sent over from the slave deevice that contains the data from the |
dev_alexander | 23:f74a50977593 | 150 | * actual grid eye sensor is actually a function that is not part of the grid eye |
dev_alexander | 23:f74a50977593 | 151 | * class. this is due to the fact that the grid eye class requires n i2c bus to |
dev_alexander | 23:f74a50977593 | 152 | * be assigned to a phyiscal sensor. In this case, the library for the Grid Eye |
dev_alexander | 23:f74a50977593 | 153 | * sensor has a support functin that is used to convert data that is aquired from |
dev_alexander | 23:f74a50977593 | 154 | * the grid eye sensor. So it is not supposed to be a class specific function. |
dev_alexander | 23:f74a50977593 | 155 | */ |
dev_alexander | 23:f74a50977593 | 156 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: Robot |
dev_alexander | 23:f74a50977593 | 157 | //Init I2C communications in default I2C bus I2C #1 |
dev_alexander | 23:f74a50977593 | 158 | I2C i2cGridEye(P3_4,P3_5); |
dev_alexander | 23:f74a50977593 | 159 | GridEye gridEye(i2cGridEye); |
dev_alexander | 23:f74a50977593 | 160 | #endif |
dev_alexander | 19:9f035b9e65ec | 161 | |
dev_alexander | 23:f74a50977593 | 162 | int main() |
dev_alexander | 23:f74a50977593 | 163 | { |
Helmut64 | 17:98f2528e8399 | 164 | /* |
Helmut64 | 17:98f2528e8399 | 165 | * inits the Serial or USBSerial when available (230400 baud). |
Helmut64 | 17:98f2528e8399 | 166 | * If the serial uart is not is not connected it swiches to USB Serial |
Helmut64 | 17:98f2528e8399 | 167 | * blinking LED means USBSerial detected, waiting for a connect. |
Helmut64 | 17:98f2528e8399 | 168 | * It waits up to 30 seconds for a USB terminal connections |
Helmut64 | 17:98f2528e8399 | 169 | */ |
Helmut64 | 17:98f2528e8399 | 170 | InitSerial(30*1000, &myled); |
Helmut64 | 17:98f2528e8399 | 171 | dprintf("Welcome to the SX1276GenericLib"); |
Helmut64 | 18:d5527ce82e6b | 172 | |
Helmut64 | 17:98f2528e8399 | 173 | dprintf("Starting a simple LoRa PingPong"); |
dev_alexander | 23:f74a50977593 | 174 | |
dev_alexander | 23:f74a50977593 | 175 | /* Setup begins here: */ |
dev_alexander | 25:1a031add188a | 176 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 25:1a031add188a | 177 | dprintf("MAX32630FTHR: Master"); |
dev_alexander | 25:1a031add188a | 178 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 25:1a031add188a | 179 | dprintf("MAX32620FTHR: Slave"); |
dev_alexander | 25:1a031add188a | 180 | #endif |
dev_alexander | 26:69aba05f010f | 181 | |
dev_alexander | 23:f74a50977593 | 182 | |
dev_alexander | 23:f74a50977593 | 183 | /*************************************************************************** |
dev_alexander | 23:f74a50977593 | 184 | * Grid Eye Sensor: Non-Buffer Program Variables |
dev_alexander | 23:f74a50977593 | 185 | **************************************************************************/ |
dev_alexander | 23:f74a50977593 | 186 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 23:f74a50977593 | 187 | int frame_idx = 0; |
dev_alexander | 24:e8d03912f303 | 188 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 23:f74a50977593 | 189 | // none yet |
dev_alexander | 25:1a031add188a | 190 | int frame_idx = 0; |
dev_alexander | 23:f74a50977593 | 191 | #endif |
dev_alexander | 23:f74a50977593 | 192 | |
dev_alexander | 23:f74a50977593 | 193 | |
dev_alexander | 28:0ed92c590607 | 194 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 195 | * Combined Payload Buffers for LoRa Communications |
dev_alexander | 28:0ed92c590607 | 196 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 197 | uint8_t BufferTx[BufferSizeTx]; |
dev_alexander | 28:0ed92c590607 | 198 | uint8_t BufferRx[BufferSizeRx]; |
dev_alexander | 28:0ed92c590607 | 199 | |
dev_alexander | 28:0ed92c590607 | 200 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 201 | * BLE Data Buffers |
dev_alexander | 28:0ed92c590607 | 202 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 203 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 204 | uint8_t curr_ble_to_slave[size_of_ble]; |
dev_alexander | 28:0ed92c590607 | 205 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 206 | uint8_t curr_ble_from_master[size_of_ble]; |
dev_alexander | 28:0ed92c590607 | 207 | uint8_t prev_ble_from_master[size_of_ble]; |
dev_alexander | 28:0ed92c590607 | 208 | #endif |
dev_alexander | 28:0ed92c590607 | 209 | |
dev_alexander | 30:66f9750cc44c | 210 | #if defined(COMPILE_BLE) |
dev_alexander | 30:66f9750cc44c | 211 | |
dev_alexander | 30:66f9750cc44c | 212 | BLE &ble = BLE::Instance(); |
dev_alexander | 30:66f9750cc44c | 213 | /* Create alias for the BLE data to be saved in function above that |
dev_alexander | 30:66f9750cc44c | 214 | * writes data to this buffer when function onDataWritten is called |
dev_alexander | 30:66f9750cc44c | 215 | */ |
dev_alexander | 30:66f9750cc44c | 216 | onDataWritten_curr_ble_to_slave = curr_ble_to_slave; |
dev_alexander | 30:66f9750cc44c | 217 | |
dev_alexander | 30:66f9750cc44c | 218 | /* Initialize BLE */ |
dev_alexander | 30:66f9750cc44c | 219 | ble.init(); |
dev_alexander | 30:66f9750cc44c | 220 | ble.gap().onDisconnection(disconnectionCallback); |
dev_alexander | 30:66f9750cc44c | 221 | ble.gattServer().onDataWritten(onDataWritten); |
dev_alexander | 30:66f9750cc44c | 222 | uart = new UARTService(ble); |
dev_alexander | 30:66f9750cc44c | 223 | /* setup advertising */ |
dev_alexander | 30:66f9750cc44c | 224 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
dev_alexander | 30:66f9750cc44c | 225 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
dev_alexander | 30:66f9750cc44c | 226 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
dev_alexander | 30:66f9750cc44c | 227 | (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1); |
dev_alexander | 30:66f9750cc44c | 228 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
dev_alexander | 30:66f9750cc44c | 229 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
dev_alexander | 30:66f9750cc44c | 230 | |
dev_alexander | 30:66f9750cc44c | 231 | ble.gap().setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
dev_alexander | 30:66f9750cc44c | 232 | ble.gap().startAdvertising(); |
dev_alexander | 30:66f9750cc44c | 233 | #endif |
dev_alexander | 28:0ed92c590607 | 234 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 235 | * Grid Eye Sensor Data Buffers |
dev_alexander | 28:0ed92c590607 | 236 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 237 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 238 | char curr_raw_frame_from_slave[size_of_grid_eye]; |
dev_alexander | 28:0ed92c590607 | 239 | char prev_raw_frame_from_slave[size_of_grid_eye]; |
dev_alexander | 28:0ed92c590607 | 240 | int16_t conv_frame_from_slave[64]; |
dev_alexander | 28:0ed92c590607 | 241 | #elif defined(TARGET_MAX32620FTHR) // Client Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 242 | char curr_raw_frame_to_master[size_of_grid_eye]; |
dev_alexander | 28:0ed92c590607 | 243 | char prev_raw_frame_to_master[size_of_grid_eye]; |
dev_alexander | 28:0ed92c590607 | 244 | int16_t conv_frame_to_master[64]; |
dev_alexander | 28:0ed92c590607 | 245 | #endif |
dev_alexander | 28:0ed92c590607 | 246 | |
dev_alexander | 28:0ed92c590607 | 247 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 248 | * GPS Data Buffers |
dev_alexander | 28:0ed92c590607 | 249 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 250 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 251 | uint8_t curr_gps_from_slave[size_of_gps]; |
dev_alexander | 28:0ed92c590607 | 252 | uint8_t prev_gps_from_slave[size_of_gps]; |
dev_alexander | 28:0ed92c590607 | 253 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 254 | uint8_t curr_gps_to_master[size_of_gps]; |
dev_alexander | 28:0ed92c590607 | 255 | #endif |
dev_alexander | 28:0ed92c590607 | 256 | |
dev_alexander | 28:0ed92c590607 | 257 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 258 | * MAX17055 Data Buffers |
dev_alexander | 28:0ed92c590607 | 259 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 260 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 261 | uint8_t curr_MAX17055_from_slave[size_of_MAX17055]; |
dev_alexander | 28:0ed92c590607 | 262 | uint8_t prev_MAX17055_from_slave[size_of_MAX17055]; |
dev_alexander | 28:0ed92c590607 | 263 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 264 | uint8_t curr_MAX17055_to_master[size_of_MAX17055]; |
dev_alexander | 28:0ed92c590607 | 265 | #endif |
dev_alexander | 28:0ed92c590607 | 266 | |
dev_alexander | 28:0ed92c590607 | 267 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 268 | * MAX77650 Data Buffers |
dev_alexander | 28:0ed92c590607 | 269 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 270 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 271 | uint8_t curr_MAX77650_from_slave[size_of_MAX77650]; |
dev_alexander | 28:0ed92c590607 | 272 | uint8_t prev_MAX77650_from_slave[size_of_MAX77650]; |
dev_alexander | 28:0ed92c590607 | 273 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 274 | uint8_t curr_MAX77650_to_master[size_of_MAX77650]; |
dev_alexander | 28:0ed92c590607 | 275 | #endif |
dev_alexander | 28:0ed92c590607 | 276 | |
dev_alexander | 28:0ed92c590607 | 277 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 278 | * Finish Setting up LoRa Radios: This passes in pointers to Buffers to send |
dev_alexander | 28:0ed92c590607 | 279 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 280 | SX1276PingPongSetup(BufferTx, BufferRx); |
dev_alexander | 28:0ed92c590607 | 281 | |
dev_alexander | 22:abca9d17d13d | 282 | while(1) |
dev_alexander | 28:0ed92c590607 | 283 | { |
dev_alexander | 23:f74a50977593 | 284 | /*************************************************************************** |
dev_alexander | 30:66f9750cc44c | 285 | * BLE Radio Data |
dev_alexander | 30:66f9750cc44c | 286 | **************************************************************************/ |
dev_alexander | 30:66f9750cc44c | 287 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 30:66f9750cc44c | 288 | #if defined(COMPILE_BLE) |
dev_alexander | 30:66f9750cc44c | 289 | ble.waitForEvent(); |
dev_alexander | 30:66f9750cc44c | 290 | #endif |
dev_alexander | 30:66f9750cc44c | 291 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 30:66f9750cc44c | 292 | // NOTHING YET |
dev_alexander | 30:66f9750cc44c | 293 | #endif |
dev_alexander | 30:66f9750cc44c | 294 | |
dev_alexander | 30:66f9750cc44c | 295 | /*************************************************************************** |
dev_alexander | 23:f74a50977593 | 296 | * Grid Eye Sensor |
dev_alexander | 23:f74a50977593 | 297 | **************************************************************************/ |
dev_alexander | 23:f74a50977593 | 298 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 299 | // Check to see if the contents of the previous scan are the same. If they are different then continue with converting |
dev_alexander | 28:0ed92c590607 | 300 | if( memcmp(prev_raw_frame_from_slave, curr_raw_frame_from_slave, sizeof(curr_raw_frame_from_slave)) != 0 ) |
dev_alexander | 27:6b549f838f0a | 301 | { |
dev_alexander | 23:f74a50977593 | 302 | // Convert raw data sent from slave to a 16 bit integer array by calling this |
dev_alexander | 28:0ed92c590607 | 303 | convRaw8x8Data2Point25degC(curr_raw_frame_from_slave, conv_frame_from_slave); |
dev_alexander | 26:69aba05f010f | 304 | |
dev_alexander | 23:f74a50977593 | 305 | // Next Print off the Converted data |
dev_alexander | 26:69aba05f010f | 306 | pc.printf("\r\nFrame %d data: \r\n", frame_idx); |
dev_alexander | 23:f74a50977593 | 307 | uint8_t idx; |
dev_alexander | 23:f74a50977593 | 308 | float pixel_data; |
dev_alexander | 23:f74a50977593 | 309 | for (int y = 0; y < 8; y++) { |
dev_alexander | 23:f74a50977593 | 310 | for (int x = 0; x < 8; x++) { |
dev_alexander | 23:f74a50977593 | 311 | idx = y*8 + x; |
dev_alexander | 28:0ed92c590607 | 312 | pixel_data = ((float)conv_frame_from_slave[idx])/4.0; |
dev_alexander | 26:69aba05f010f | 313 | pc.printf("%.2f \t", pixel_data); |
dev_alexander | 23:f74a50977593 | 314 | } |
dev_alexander | 26:69aba05f010f | 315 | pc.printf("\r\n\r\n"); |
dev_alexander | 23:f74a50977593 | 316 | } |
dev_alexander | 26:69aba05f010f | 317 | pc.printf("\r\n"); |
dev_alexander | 23:f74a50977593 | 318 | |
dev_alexander | 23:f74a50977593 | 319 | // Increment frame counter |
dev_alexander | 23:f74a50977593 | 320 | frame_idx = frame_idx +1; |
dev_alexander | 27:6b549f838f0a | 321 | } |
dev_alexander | 28:0ed92c590607 | 322 | |
dev_alexander | 25:1a031add188a | 323 | /* Next copy in data received from current data into buffer used for |
dev_alexander | 25:1a031add188a | 324 | * comparison next time the memcmp above is called. This prevents the |
dev_alexander | 25:1a031add188a | 325 | * program from converting the same raw data aquired by the grid eye |
dev_alexander | 25:1a031add188a | 326 | * sensor on the slave device to the floating point array with the |
dev_alexander | 25:1a031add188a | 327 | * 0.25 degrees celsius precision level when there is not new data. |
dev_alexander | 25:1a031add188a | 328 | */ |
dev_alexander | 28:0ed92c590607 | 329 | memcpy(prev_raw_frame_from_slave, curr_raw_frame_from_slave, sizeof(curr_raw_frame_from_slave)); |
dev_alexander | 25:1a031add188a | 330 | |
dev_alexander | 24:e8d03912f303 | 331 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 23:f74a50977593 | 332 | // Aquire raw data about 8x8 frame from the grid eye sensor in this function call |
dev_alexander | 28:0ed92c590607 | 333 | gridEye.getRaw8x8FrameData(curr_raw_frame_to_master); |
dev_alexander | 28:0ed92c590607 | 334 | wait_ms( 10 ); |
dev_alexander | 28:0ed92c590607 | 335 | /* |
dev_alexander | 28:0ed92c590607 | 336 | //if ( memcmp(prev_raw_frame_to_master, curr_raw_frame_to_master, sizeof(curr_raw_frame_to_master)) != 0 ) |
dev_alexander | 28:0ed92c590607 | 337 | //{ |
dev_alexander | 25:1a031add188a | 338 | // Convert raw data sent from slave to a 16 bit integer array by calling this |
dev_alexander | 28:0ed92c590607 | 339 | convRaw8x8Data2Point25degC(curr_raw_frame_to_master, conv_frame_to_master); |
dev_alexander | 25:1a031add188a | 340 | |
dev_alexander | 25:1a031add188a | 341 | // Next Print off the Converted data |
dev_alexander | 25:1a031add188a | 342 | pc.printf("\r\nFrame %d data: \r\n", frame_idx); |
dev_alexander | 25:1a031add188a | 343 | uint8_t idx; |
dev_alexander | 25:1a031add188a | 344 | float pixel_data; |
dev_alexander | 25:1a031add188a | 345 | for (int y = 0; y < 8; y++) { |
dev_alexander | 25:1a031add188a | 346 | for (int x = 0; x < 8; x++) { |
dev_alexander | 25:1a031add188a | 347 | idx = y*8 + x; |
dev_alexander | 28:0ed92c590607 | 348 | pixel_data = conv_frame_to_master[idx]/4.0; |
dev_alexander | 25:1a031add188a | 349 | pc.printf("%.2f \t", pixel_data); |
dev_alexander | 25:1a031add188a | 350 | } |
dev_alexander | 25:1a031add188a | 351 | pc.printf("\r\n\r\n"); |
dev_alexander | 25:1a031add188a | 352 | } |
dev_alexander | 25:1a031add188a | 353 | pc.printf("\r\n"); |
dev_alexander | 25:1a031add188a | 354 | |
dev_alexander | 25:1a031add188a | 355 | // Increment frame counter |
dev_alexander | 25:1a031add188a | 356 | frame_idx = frame_idx +1; |
dev_alexander | 28:0ed92c590607 | 357 | //} |
dev_alexander | 28:0ed92c590607 | 358 | */ |
dev_alexander | 28:0ed92c590607 | 359 | memcpy(prev_raw_frame_to_master, curr_raw_frame_to_master, sizeof(curr_raw_frame_to_master)); |
dev_alexander | 30:66f9750cc44c | 360 | #endif |
dev_alexander | 28:0ed92c590607 | 361 | |
dev_alexander | 23:f74a50977593 | 362 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 363 | * Fill Payload Buffer With Data From Sensors for LoRa Transmition |
dev_alexander | 28:0ed92c590607 | 364 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 365 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 366 | memcpy(&BufferTx[tx_idx_signature], PingMsg, size_signature); |
dev_alexander | 28:0ed92c590607 | 367 | memcpy(&BufferTx[tx_idx_ble], curr_ble_to_slave, size_of_ble); |
dev_alexander | 28:0ed92c590607 | 368 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 369 | memcpy(&BufferTx[tx_idx_signature], PongMsg, size_signature); |
dev_alexander | 28:0ed92c590607 | 370 | memcpy(&BufferTx[tx_idx_grid_eye], curr_raw_frame_to_master, size_of_grid_eye); |
dev_alexander | 28:0ed92c590607 | 371 | memcpy(&BufferTx[tx_idx_gps], curr_gps_to_master, size_of_gps); |
dev_alexander | 28:0ed92c590607 | 372 | memcpy(&BufferTx[tx_idx_MAX17055], curr_MAX17055_to_master, size_of_MAX17055); |
dev_alexander | 28:0ed92c590607 | 373 | memcpy(&BufferTx[tx_idx_MAX77650], curr_MAX77650_to_master, size_of_MAX77650); |
dev_alexander | 28:0ed92c590607 | 374 | #endif |
dev_alexander | 28:0ed92c590607 | 375 | |
dev_alexander | 28:0ed92c590607 | 376 | |
dev_alexander | 28:0ed92c590607 | 377 | |
dev_alexander | 28:0ed92c590607 | 378 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 379 | * Lora Communications |
dev_alexander | 28:0ed92c590607 | 380 | **************************************************************************/ |
dev_alexander | 25:1a031add188a | 381 | wait_ms( 10 ); |
dev_alexander | 22:abca9d17d13d | 382 | SX1276PingPong(); |
dev_alexander | 28:0ed92c590607 | 383 | |
dev_alexander | 28:0ed92c590607 | 384 | /*************************************************************************** |
dev_alexander | 28:0ed92c590607 | 385 | * Fill Global Buffers With Data From Received Payload Buffer |
dev_alexander | 28:0ed92c590607 | 386 | **************************************************************************/ |
dev_alexander | 28:0ed92c590607 | 387 | /* The master and slave devices will have different requirements for offloading payload */ |
dev_alexander | 28:0ed92c590607 | 388 | #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway |
dev_alexander | 28:0ed92c590607 | 389 | memcpy(curr_raw_frame_from_slave, &BufferRx[rx_idx_grid_eye], size_of_grid_eye); |
dev_alexander | 28:0ed92c590607 | 390 | memcpy(curr_gps_from_slave, &BufferRx[rx_idx_gps], size_of_gps); |
dev_alexander | 28:0ed92c590607 | 391 | memcpy(curr_MAX17055_from_slave, &BufferRx[rx_idx_MAX17055], size_of_MAX17055); |
dev_alexander | 28:0ed92c590607 | 392 | memcpy(curr_MAX77650_from_slave, &BufferRx[rx_idx_MAX77650], size_of_MAX77650); |
dev_alexander | 28:0ed92c590607 | 393 | #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot |
dev_alexander | 28:0ed92c590607 | 394 | memcpy(curr_ble_from_master, &BufferRx[rx_idx_ble], size_of_ble); |
dev_alexander | 28:0ed92c590607 | 395 | #endif |
dev_alexander | 23:f74a50977593 | 396 | |
dev_alexander | 23:f74a50977593 | 397 | |
dev_alexander | 23:f74a50977593 | 398 | |
dev_alexander | 23:f74a50977593 | 399 | |
dev_alexander | 23:f74a50977593 | 400 | |
dev_alexander | 22:abca9d17d13d | 401 | } |
dev_alexander | 22:abca9d17d13d | 402 | |
Helmut64 | 0:c43b6919ae15 | 403 | } |