lora's drivers taken out of examples repo to make a smaller binary
Dependencies: libxDot-mbed5
Diff: src/main.cpp
- Revision:
- 1:80bc4501abc5
- Parent:
- 0:973a5bbb2a17
--- a/src/main.cpp Thu Nov 21 08:46:20 2019 +0000 +++ b/src/main.cpp Sun Dec 08 01:56:17 2019 +0000 @@ -1,69 +1,120 @@ +/* mbed Microcontroller Library + * Copyright (c) 2018 ARM Limited + * SPDX-License-Identifier: Apache-2.0 + */ +#include <stdio.h> +#include <LoRaRadio.h> +#include "dot_util.h" +#include "RadioEvent.h" +// Application helper #include "mbed.h" -#define u16_max 65526 -AnalogIn mic(PB_0); -DigitalOut vcc(GPIO0); -Serial pc(UART_TX, UART_RX, 115200); -const int sampleTime = 50; -int micOut; -// Find the Peak-to-Peak Amplitude Function -int findPTPAmp(float* sampleArr){ -// Time variables to find the peak-to-peak amplitude - - unsigned int PTPAmp = 0; +#include <AnalogIn.h> +#include <DigitalOut.h> + +static std::string network_name = "LAleakers"; +static std::string network_passphrase = "stephisbroke"; +static uint8_t network_id[] = { 0x6C, 0x4E, 0xEF, 0x66, 0xF4, 0x79, 0x86, 0xA6 }; +static uint8_t network_key[] = { 0x1F, 0x33, 0xA1, 0x70, 0xA5, 0xF1, 0xFD, 0xA0, 0xAB, 0x69, 0x7A, 0xAE, 0x2B, 0x95, 0x91, 0x6B }; +static uint8_t frequency_sub_band = 7; +static lora::NetworkType network_type = lora::PUBLIC_LORAWAN; +static uint8_t join_delay = 5; +static uint8_t ack = 0; +static bool adr = true; + +mDot* dot = NULL; +lora::ChannelPlan* plan = new lora::ChannelPlan_US915(); + +I2C i2c(I2C_SDA, I2C_SCL); -// Signal variables to find the peak-to-peak amplitude - unsigned int maxAmp = 0; - unsigned int minAmp = 1023; +// PIN DEFINITIONS +DigitalOut vcc(GPIO0); +AnalogIn mic(PB_0); + +// To sleep, 'wait' should be replaced by 'ThisThread::sleep_for' (C++) or 'thread_sleep_for' (C). If you wish to wait (without sleeping), call 'wait_us'. 'wait_us' is safe to call from ISR context. [since mbed-os-5.14] [-Wdeprecated-declarations] in "main.cpp", Line: 59, Col: 9 + +int main() { + i2c.frequency(400000); + assert(plan); + RadioEvent events; + dot = mDot::getInstance(plan); + assert(dot); + + // attach the custom events handler + dot->setEvents(&events); -// Find the max and min of the mic output within the 50 ms timeframe - for(int i=0; i<8000; i++) - { - if( sampleArr[i] < 1023) //prevent erroneous readings - { - if (sampleArr[i] > maxAmp) - { - maxAmp = sampleArr[i]; //save only the max reading - } - else if (sampleArr[i] < minAmp) - { - minAmp = sampleArr[i]; //save only the min reading + if (!dot->getStandbyFlag()) { + logInfo("mbed-os library version: %d.%d.%d", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION); + + // start from a well-known state + logInfo("defaulting Dot configuration"); + dot->resetConfig(); + dot->resetNetworkSession(); + + // make sure library logging is turned on + dot->setLogLevel(mts::MTSLog::INFO_LEVEL); + + // update configuration if necessary + if (dot->getJoinMode() != mDot::OTA) { + logInfo("changing network join mode to OTA"); + if (dot->setJoinMode(mDot::OTA) != mDot::MDOT_OK) { + logError("failed to set network join mode to OTA"); + } } - } - } - - PTPAmp = maxAmp - minAmp; // (max amp) - (min amp) = peak-to-peak amplitude - double micOut_Volts = (PTPAmp * 3.3) / 1024; // Convert ADC into voltage + // in OTA and AUTO_OTA join modes, the credentials can be passed to the library as a name and passphrase or an ID and KEY + // only one method or the other should be used! + // network ID = crc64(network name) + // network KEY = cmac(network passphrase) + update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, network_type, ack); + //update_ota_config_id_key(network_id, network_key, frequency_sub_band, network_type, ack); - //Uncomment this line for help debugging (be sure to also comment out the VUMeter function) - //Serial.println(PTPAmp); + // configure network link checks + // network link checks are a good alternative to requiring the gateway to ACK every packet and should allow a single gateway to handle more Dots + // check the link every count packets + // declare the Dot disconnected after threshold failed link checks + // for count = 3 and threshold = 5, the Dot will ask for a link check response every 5 packets and will consider the connection lost if it fails to receive 3 responses in a row + update_network_link_check_config(3, 5); - //Return the PTP amplitude to use in the soundLevel function. - // You can also return the micOut_Volts if you prefer to use the voltage level. - return PTPAmp; -} + // enable or disable Adaptive Data Rate + dot->setAdr(adr); + + // Configure the join delay + dot->setJoinDelay(join_delay); + + // save changes to configuration + logInfo("saving configuration"); + if (!dot->saveConfig()) { + logError("failed to save configuration"); + } -void record(float* sampleArr) { - //record sound for 1 second - for(int i=0; i<8000; i++) { - sampleArr[i] = mic.read(); //put samples in array - wait(0.000125f); //sample rate of 8000 Hz - } -} - -int main(){ - float sampleArr[8000]; //used to store sound - pc.printf("\r\n Sparkfun MEM Microphone Test\n"); - pc.printf("******************\n"); - vcc = 1; - unsigned int val; - int ptpAmp; - while(1){ - wait(0.2); - record(sampleArr); - ptpAmp=findPTPAmp(sampleArr); + // display configuration + display_config(); + } else { + // restore the saved session if the dot woke from deepsleep mode + // useful to use with deepsleep because session info is otherwise lost when the dot enters deepsleep + logInfo("restoring network session from NVM"); + dot->restoreNetworkSession(); + } + // join network if not joined + if (!dot->getNetworkJoinStatus()) { + join_network(); + } + + /* + tests: + 1. Check received transmissions/second from this loop + 2. make the packet size a lot bigger + 3. + */ + // get some data in send vector + std::vector<uint8_t> tx_data; + tx_data.clear(); + snprintf(arr, 5, "%u", mic.read_u16()); + for(int i = 0; i < 5; i++) { + tx_data.push_back(arr[i]); + } + + while(1) { + send_data(tx_data); } } - - -