From 0a4447b185b529d13a8ace7a5c8490365b55fed3 Mon Sep 17 00:00:00 2001 From: Leroy Date: Sun, 18 Oct 2020 22:00:54 -0500 Subject: [PATCH] add Platformio sample --- .../longfi-us915/{ => Arduino-IDE}/README.md | 0 .../{ => Arduino-IDE}/longfi-us915.ino | 0 .../Platformio/longfi-us915/.gitignore | 5 + .../Platformio/longfi-us915/include/README | 40 ++++ .../Platformio/longfi-us915/lib/README | 47 +++++ .../Platformio/longfi-us915/platformio.ini | 28 +++ .../Platformio/longfi-us915/src/main.cpp | 180 ++++++++++++++++++ .../Platformio/longfi-us915/test/README | 12 ++ 8 files changed, 312 insertions(+) rename Heltec-CubeCell-Board/longfi-us915/{ => Arduino-IDE}/README.md (100%) rename Heltec-CubeCell-Board/longfi-us915/{ => Arduino-IDE}/longfi-us915.ino (100%) create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/.gitignore create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/include/README create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/lib/README create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/platformio.ini create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/src/main.cpp create mode 100644 Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/test/README diff --git a/Heltec-CubeCell-Board/longfi-us915/README.md b/Heltec-CubeCell-Board/longfi-us915/Arduino-IDE/README.md similarity index 100% rename from Heltec-CubeCell-Board/longfi-us915/README.md rename to Heltec-CubeCell-Board/longfi-us915/Arduino-IDE/README.md diff --git a/Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino b/Heltec-CubeCell-Board/longfi-us915/Arduino-IDE/longfi-us915.ino similarity index 100% rename from Heltec-CubeCell-Board/longfi-us915/longfi-us915.ino rename to Heltec-CubeCell-Board/longfi-us915/Arduino-IDE/longfi-us915.ino diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/.gitignore b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/include/README b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/include/README new file mode 100644 index 0000000..1a2eba1 --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/include/README @@ -0,0 +1,40 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html + diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/lib/README b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/lib/README new file mode 100644 index 0000000..221335b --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/lib/README @@ -0,0 +1,47 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html + diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/platformio.ini b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/platformio.ini new file mode 100644 index 0000000..8f0e97d --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/platformio.ini @@ -0,0 +1,28 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:cubecell_board_plus] +platform = asrmicro650x +board = cubecell_board_plus +;board = cubecell_board_plus ; GPS Version AB02S +framework = arduino +build_flags = -Wl,-Map,output.map +monitor_speed = 115200 +board_build.arduino.lorawan.region = US915 +board_build.arduino.lorawan.class = CLASS_A +board_build.arduino.lorawan.netmode = OTAA +board_build.arduino.lorawan.uplinkmode = UNCONFIRMED +board_build.arduino.lorawan.rgb = DEACTIVE +board_build.arduino.lorawan.debug_level = FREQ_AND_DIO +; debug_level can be NONE, FREQ, FREQ_AND_DIO +board_build.arduino.lorawan.adr = OFF +board_build.arduino.lorawan.at_support = OFF +board_build.arduino.lorawan.net_reserve = OFF + diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/src/main.cpp b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/src/main.cpp new file mode 100644 index 0000000..4615f4f --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/src/main.cpp @@ -0,0 +1,180 @@ + +#include "LoRaWan_APP.h" +#include "Arduino.h" + +/* + * set LoraWan_RGB to Active,the RGB active in loraWan + * RGB red means sending; + * RGB purple means joined done; + * RGB blue means RxWindow1; + * RGB yellow means RxWindow2; + * RGB green means received done; + */ + + +/* OTAA para*/ +uint8_t devEui[] = { FILL_ME_IN }; +uint8_t appEui[] = { FILL_ME_IN }; +uint8_t appKey[] = { FILL_ME_IN }; + +/* ABP para*/ +uint8_t nwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 }; +uint8_t appSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 }; +uint32_t devAddr = ( uint32_t )0x007e6ae1; + +/*LoraWan channelsmask, default channels 0-7*/ +uint16_t userChannelsMask[6]={ 0xFF00,0x0000,0x0000,0x0000,0x0000,0x0000 }; + +/* NOTE: It is very important that these variables be defined correctly in the Arduino IDE Tools->Board options */ + +/*LoraWan region, select in arduino IDE tools*/ +LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; + +/*LoraWan Class, Class A and Class C are supported*/ +DeviceClass_t loraWanClass = LORAWAN_CLASS; + +/*OTAA or ABP*/ +bool overTheAirActivation = LORAWAN_NETMODE; + +/*ADR enable*/ +bool loraWanAdr = LORAWAN_ADR; + +/* set LORAWAN_Net_Reserve ON, the node could save the network info to flash, when node reset not need to join again */ +bool keepNet = LORAWAN_NET_RESERVE; + +/* Indicates if the node is sending confirmed or unconfirmed messages */ +bool isTxConfirmed = LORAWAN_UPLINKMODE; + +/*the application data transmission duty cycle. value in [ms].*/ +uint32_t appTxDutyCycle = 15000; + +/* Application port */ +uint8_t appPort = 2; +/*! +* Number of trials to transmit the frame, if the LoRaMAC layer did not +* receive an acknowledgment. The MAC performs a datarate adaptation, +* according to the LoRaWAN Specification V1.0.2, chapter 18.4, according +* to the following table: +* +* Transmission nb | Data Rate +* ----------------|----------- +* 1 (first) | DR +* 2 | DR +* 3 | max(DR-1,0) +* 4 | max(DR-1,0) +* 5 | max(DR-2,0) +* 6 | max(DR-2,0) +* 7 | max(DR-3,0) +* 8 | max(DR-3,0) +* +* Note, that if NbTrials is set to 1 or 2, the MAC will not decrease +* the datarate, in case the LoRaMAC layer did not receive an acknowledgment +*/ +uint8_t confirmedNbTrials = 4; + +// This variable, defined in the runtime, tracks the number of uplinks sent. +// When this count reaches 65,535 the connection must be re-established. +// If you do not the device will continue to send data to the network but +// it will not make it to the Helium console. +// The value is tested below and a reconnection is forced if the counter +// equals 65534. +// refer to FCnt on this documentation page: +// https://developer.helium.com/longfi/mac-commands-fopts-adr +extern uint32_t UpLinkCounter; + +/* Prepares the payload of the frame */ +static void prepareTxFrame( uint8_t port ) +{ + /*appData size is LORAWAN_APP_DATA_MAX_SIZE which is defined in "commissioning.h". + *appDataSize max value is LORAWAN_APP_DATA_MAX_SIZE. + *if enabled AT, don't modify LORAWAN_APP_DATA_MAX_SIZE, it may cause system hanging or failure. + *if disabled AT, LORAWAN_APP_DATA_MAX_SIZE can be modified, the max value is reference to lorawan region and SF. + *for example, if use REGION_CN470, + *the max value for different DR can be found in MaxPayloadOfDatarateCN470 refer to DataratesCN470 and BandwidthsCN470 in "RegionCN470.h". + */ + appDataSize = 4; + appData[0] = 0x00; + appData[1] = 0x01; + appData[2] = 0x02; + appData[3] = 0x03; +} + + +void setup() { + boardInitMcu(); + Serial.begin(115200); +#if(AT_SUPPORT) + enableAt(); +#endif + deviceState = DEVICE_STATE_INIT; + LoRaWAN.ifskipjoin(); +} + +void loop() +{ + switch( deviceState ) + { + case DEVICE_STATE_INIT: + { +#if(AT_SUPPORT) + getDevParam(); +#endif + printDevParam(); + LoRaWAN.init(loraWanClass,loraWanRegion); + deviceState = DEVICE_STATE_JOIN; + + // This is a runtime API that is in the Heltec github + // but has not yet made it to the Arduino install + // version. (1.0.0) It's here for future reference + // LoRaWAN.setDataRateForNoADR(DR_3); + + break; + } + case DEVICE_STATE_JOIN: + { + LoRaWAN.join(); + break; + } + case DEVICE_STATE_SEND: + { + // Comment out this warning if you "really" do want + // to enable ADR + if (loraWanAdr == true) + { + Serial.println(">>>> WARNING: ADR is enabled.\n\tThis may reduce the datarate/Spreading Factor after about 100 uplinks"); + } + + prepareTxFrame( appPort ); + LoRaWAN.send(); + deviceState = DEVICE_STATE_CYCLE; + // the following is experimental but does seem to + // re-initialize the connection correctly. See the note + // at extern UpLinkCounter above + if (UpLinkCounter == 65534) + { + // force a rejoin + deviceState = DEVICE_STATE_INIT; + } + break; + } + case DEVICE_STATE_CYCLE: + { + // Schedule next packet transmission + txDutyCycleTime = appTxDutyCycle + randr( 0, APP_TX_DUTYCYCLE_RND ); + LoRaWAN.cycle(txDutyCycleTime); + deviceState = DEVICE_STATE_SLEEP; + break; + } + case DEVICE_STATE_SLEEP: + { + LoRaWAN.sleep(); + break; + } + default: + { + deviceState = DEVICE_STATE_INIT; + break; + } + } +} + diff --git a/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/test/README b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/test/README new file mode 100644 index 0000000..e417127 --- /dev/null +++ b/Heltec-CubeCell-Board/longfi-us915/Platformio/longfi-us915/test/README @@ -0,0 +1,12 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html +