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 Devin Alexander

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?

UserRevisionLine numberNew 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 }