APS Lab
/
STM32F4_SmartMesh_QSL
SmartMesh QSL for STM32F4 version
Fork of COG-AD4050_QSL by
Diff: main.cpp
- Revision:
- 0:8ca1e814a851
- Child:
- 1:b909b8399252
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed May 02 09:26:10 2018 +0000 @@ -0,0 +1,172 @@ +#include "mbed.h" +/* +Copyright (c) 2016, Dust Networks. All rights reserved. + +SimplePublish example application for the mbed OS. + +\license See attached DN_LICENSE.txt. +*/ + +#include "mbed.h" +#include "millis.h" +#include "dn_qsl_api.h" // Only really need this include from QSL +#include "dn_debug.h" // Included to borrow debug macros +#include "dn_endianness.h" // Included to borrow array copying +#include "dn_time.h" // Included to borrow sleep function +#include "ADXL362.h" + +#define NETID 0 // Factory default value used if zero (1229) +#define JOINKEY NULL // Factory default value used if NULL (44 55 53 54 4E 45 54 57 4F 52 4B 53 52 4F 43 4B) +#define BANDWIDTH_MS 500 // Not changed if zero (default base bandwidth given by manager is 9 s) +#define SRC_PORT 60000 // Default port used if zero (0xf0b8) +#define DEST_PORT 0 // Default port used if zero (0xf0b8) +#define DATA_PERIOD_MS 500 // Should be longer than (or equal to) bandwidth + +// We can use debug macros from dn_debug, as stdio defaults to this serial +//Serial serialDebug(USBTX1, USBRX1); +#define log_info serialDebug.printf + +// LED2 is the green LED on the NUCLEO-L053R8; might change for other boards +DigitalOut myled(LED1); +DigitalOut status(LED2); +ADXL362 Acc(P1_07, P1_08, P1_06, P1_10); + +static uint16_t randomWalk(void); +static void parsePayload(const uint8_t *payload, uint8_t size); + +void init_acc(void) +{ + Acc.init_spi(); + Acc.init_adxl362(); +} + +int main() +{ + uint8_t payload[4]; + uint8_t inboxBuf[DN_DEFAULT_PAYLOAD_SIZE_LIMIT]; + uint8_t bytesRead; + uint8_t i,e; + int8_t x0, y0, z0; + + myled=1; + status=1; + + for(e=0;e<10;e++) + { + myled=!myled; + status=!status; + wait(0.5); + } + + myled=1; + status=1; + + init_acc(); + // Configure SysTick for timing + millisStart(); + + // Set PC debug serial baudrate + //serialDebug.baud(115200); + + //log_info("Initializing..."); + dn_qsl_init(); + + // Flash LED to indicate start-up complete + for (i = 0; i < 10; i++) + { + myled = !myled; + dn_sleep_ms(50); + } + myled=0; + + while(TRUE) { + if (dn_qsl_isConnected()) + { + Acc.ACC_GetXYZ8(&x0, &y0, &z0); + payload[0]=x0; + payload[1]=y0; + payload[2]=z0; + //uint16_t val = randomWalk(); + static uint8_t count = 0; + myled = 1; // Turn off LED during send/read + status = 0; + //dn_write_uint16_t(payload, val); + payload[3] = count; + + if (dn_qsl_send(payload, sizeof (payload), DEST_PORT)) + { + //log_info("Sent message nr %u: %u", count, val); + count++; + status=1; + } else + { + //log_info("Send failed"); + status=0; + } + + do + { + bytesRead = dn_qsl_read(inboxBuf); + parsePayload(inboxBuf, bytesRead); + } while (bytesRead > 0); + + myled = 1; // Turn on LED + dn_sleep_ms(DATA_PERIOD_MS); + } else + { + //log_info("Connecting..."); + myled = 1; // Not connected; turn off LED + if (dn_qsl_connect(NETID, JOINKEY, SRC_PORT, BANDWIDTH_MS)) + { + myled = 0; // Connected; turn on LED + status=1;//log_info("Connected to network"); + } else + { + //log_info("Failed to connect"); + } + } + status=0; + wait(0.5); + status=1; + } +} + +static uint16_t randomWalk(void) +{ + static bool first = TRUE; + static uint16_t lastValue = 0x7fff; // Start in middle of uint16 range + const int powerLevel = 9001; + + // Seed random number generator on first call + if (first) + { + first = FALSE; + srand(dn_time_ms()); + } + + // Random walk within +/- powerLevel + lastValue += rand() / (RAND_MAX / (2*powerLevel) + 1) - powerLevel; + return lastValue; +} + +static void parsePayload(const uint8_t *payload, uint8_t size) +{ + uint8_t i; + char msg[size + 1]; + + if (size == 0) + { + // Nothing to parse + return; + } + + // Parse bytes individually as well as together as a string + //log_info("Received downstream payload of %u bytes:", size); + for (i = 0; i < size; i++) + { + msg[i] = payload[i]; + //log_info("\tByte# %03u: %#.2x (%u)", i, payload[i], payload[i]); + } + msg[size] = '\0'; + //log_info("\tMessage: %s", msg); +}