diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d30c5da --- /dev/null +++ b/.clang-format @@ -0,0 +1,121 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: false +IndentPPDirectives: None +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +... + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e351fd7..5d59b16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,10 @@ our way or a bug to report: repo](https://github.com/helium/longfi-arduino). Include a write up of the PR with details on what it does. +* **Formatting Code**: Please apply clang-format to any PRs. From the + root of the repository: + `find . -regex '.*\.\(cpp\|hpp\|cu\|c\|h\|ino\)' -exec clang-format -i {} \;` + * **Reporting Bugs**: Open an issue [against this repo](https://github.com/helium/longfi-arduino/issues) with as much detail as you can. At the very least you'll include steps to @@ -19,4 +23,4 @@ collaboration, and contributors are expected to adhere to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/). -Above all, thank you for taking the time to be a part of the Helium community. \ No newline at end of file +Above all, thank you for taking the time to be a part of the Helium community. diff --git a/GPS/GPS.ino b/GPS/GPS.ino index 8565f61..f879373 100644 --- a/GPS/GPS.ino +++ b/GPS/GPS.ino @@ -15,7 +15,6 @@ * *******************************************************************************/ - /******************************************************************************* * * For Helium developers, follow the Arduino Quickstart guide: @@ -27,34 +26,34 @@ * *******************************************************************************/ -#include -#include +#include +#include +#include #include +#include #include #include -#include #include -#include -#include +#include #define GPSSerial Serial1 // Connect to the GPS on the hardware port Adafruit_GPS GPS(&GPSSerial); - // This is the "App EUI" in Helium. Make sure it is little-endian (lsb). -static const u1_t PROGMEM APPEUI[8]= { FILL_ME_IN }; -void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);} +static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; +void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } // This should also be in little endian format // These are user configurable values and Helium console permits anything -static const u1_t PROGMEM DEVEUI[8]= { 0x48, 0x65, 0x6c, 0x69, 0x75, 0x6d, 0x20, 0x20 }; -void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);} +static const u1_t PROGMEM DEVEUI[8] = {0x48, 0x65, 0x6c, 0x69, + 0x75, 0x6d, 0x20, 0x20}; +void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } // This is the "App Key" in Helium. It is big-endian (msb). -static const u1_t PROGMEM APPKEY[16] = { FILL_ME_IN }; -void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);} +static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; +void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } static uint8_t mydata[] = "Hello, world!"; static osjob_t sendjob; @@ -76,229 +75,230 @@ const lmic_pinmap lmic_pins = { .rst = 4, .dio = {3, 6, LMIC_UNUSED_PIN}, .rxtx_rx_active = 0, - .rssi_cal = 8, // LBT cal for the Adafruit Feather M0 LoRa, in dB + .rssi_cal = 8, // LBT cal for the Adafruit Feather M0 LoRa, in dB .spi_freq = 8000000, }; -#elif defined(MCCI_CATENA_4610) +#elif defined(MCCI_CATENA_4610) #include "arduino_lmic_hal_boards.h" const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Catena4610(); #else -# error "Unknown target" +#error "Unknown target" #endif -void onEvent (ev_t ev) { - Serial.print(os_getTime()); - Serial.print(": "); - switch(ev) { - case EV_SCAN_TIMEOUT: - Serial.println(F("EV_SCAN_TIMEOUT")); - break; - case EV_BEACON_FOUND: - Serial.println(F("EV_BEACON_FOUND")); - break; - case EV_BEACON_MISSED: - Serial.println(F("EV_BEACON_MISSED")); - break; - case EV_BEACON_TRACKED: - Serial.println(F("EV_BEACON_TRACKED")); - break; - case EV_JOINING: - Serial.println(F("EV_JOINING")); - break; - case EV_JOIN_TXCOMPLETE: - Serial.println(F("EV_JOIN_TXCOMPLETE")); - break; - case EV_JOINED: - Serial.println(F("EV_JOINED")); - { - u4_t netid = 0; - devaddr_t devaddr = 0; - u1_t nwkKey[16]; - u1_t artKey[16]; - LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey); - Serial.print("netid: "); - Serial.println(netid, DEC); - Serial.print("devaddr: "); - Serial.println(devaddr, HEX); - Serial.print("artKey: "); - for (size_t i=0; i> 24; - payload[idx++] = data >> 16; - payload[idx++] = data >> 8; - payload[idx++] = data; - data = (int)(GPS.longitudeDegrees * 1E7); - payload[idx++] = data >> 24; - payload[idx++] = data >> 16; - payload[idx++] = data >> 8; - payload[idx++] = data; - data = (int)(GPS.altitude + 0.5); - payload[idx++] = data >> 8; - payload[idx++] = data; - data = (int)(GPS.speed); - payload[idx++] = data >> 8; - payload[idx++] = data; - } else { - for (idx=0; idx<12; idx++) { - payload[idx] = 0; - } - } - Serial.println(F("Packet queued")); - LMIC_setTxData2(1, payload, idx, 0); + // Prepare upstream data transmission at the next possible time. + static uint8_t payload[32]; + uint8_t idx = 0; + uint32_t data; + + if (GPS.newNMEAreceived()) { + GPS.parse(GPS.lastNMEA()); } - + + if (GPS.fix) { + Serial.println(GPS.latitudeDegrees); + Serial.println(GPS.longitudeDegrees); + Serial.println(GPS.altitude + 0.5); + data = (int)(GPS.latitudeDegrees * 1E7); + payload[idx++] = data >> 24; + payload[idx++] = data >> 16; + payload[idx++] = data >> 8; + payload[idx++] = data; + data = (int)(GPS.longitudeDegrees * 1E7); + payload[idx++] = data >> 24; + payload[idx++] = data >> 16; + payload[idx++] = data >> 8; + payload[idx++] = data; + data = (int)(GPS.altitude + 0.5); + payload[idx++] = data >> 8; + payload[idx++] = data; + data = (int)(GPS.speed); + payload[idx++] = data >> 8; + payload[idx++] = data; + } else { + for (idx = 0; idx < 12; idx++) { + payload[idx] = 0; + } + } + Serial.println(F("Packet queued")); + LMIC_setTxData2(1, payload, idx, 0); + } } void setup() { - delay(5000); - while (! Serial) - ; - Serial.begin(9600); - Serial.println(F("Starting")); + delay(5000); + while (!Serial) + ; + Serial.begin(9600); + Serial.println(F("Starting")); - #if defined(ARDUINO_DISCO_L072CZ_LRWAN1) - SPI.setMOSI(RADIO_MOSI_PORT); - SPI.setMISO(RADIO_MISO_PORT); - SPI.setSCLK(RADIO_SCLK_PORT); - SPI.setSSEL(RADIO_NSS_PORT); - // SPI.begin(); - #endif +#if defined(ARDUINO_DISCO_L072CZ_LRWAN1) + SPI.setMOSI(RADIO_MOSI_PORT); + SPI.setMISO(RADIO_MISO_PORT); + SPI.setSCLK(RADIO_SCLK_PORT); + SPI.setSSEL(RADIO_NSS_PORT); +// SPI.begin(); +#endif - #ifdef VCC_ENABLE - // For Pinoccio Scout boards - pinMode(VCC_ENABLE, OUTPUT); - digitalWrite(VCC_ENABLE, HIGH); - delay(1000); - #endif +#ifdef VCC_ENABLE + // For Pinoccio Scout boards + pinMode(VCC_ENABLE, OUTPUT); + digitalWrite(VCC_ENABLE, HIGH); + delay(1000); +#endif - // LMIC init - os_init(); - // Reset the MAC state. Session and pending data transfers will be discarded. - LMIC_reset(); + // LMIC init + os_init(); + // Reset the MAC state. Session and pending data transfers will be discarded. + LMIC_reset(); - // allow much more clock error than the X/1000 default. See: - // https://github.com/mcci-catena/arduino-lorawan/issues/74#issuecomment-462171974 - // https://github.com/mcci-catena/arduino-lmic/commit/42da75b56#diff-16d75524a9920f5d043fe731a27cf85aL633 - // the X/1000 means an error rate of 0.1%; the above issue discusses using values up to 10%. - // so, values from 10 (10% error, the most lax) to 1000 (0.1% error, the most strict) can be used. - LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); - - LMIC_setLinkCheckMode(0); - LMIC_setDrTxpow(DR_SF8, 20); - LMIC_selectSubBand(6); + // allow much more clock error than the X/1000 default. See: + // https://github.com/mcci-catena/arduino-lorawan/issues/74#issuecomment-462171974 + // https://github.com/mcci-catena/arduino-lmic/commit/42da75b56#diff-16d75524a9920f5d043fe731a27cf85aL633 + // the X/1000 means an error rate of 0.1%; the above issue discusses using + // values up to 10%. so, values from 10 (10% error, the most lax) to 1000 + // (0.1% error, the most strict) can be used. + LMIC_setClockError(1 * MAX_CLOCK_ERROR / 40); - GPS.begin(9600); - // Only interrested in GGA, no antenna status - GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); - GPS.sendCommand(PGCMD_NOANTENNA); - - // Update every second - GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + LMIC_setLinkCheckMode(0); + LMIC_setDrTxpow(DR_SF8, 20); + LMIC_selectSubBand(6); - // Start job (sending automatically starts OTAA too) - do_send(&sendjob); + GPS.begin(9600); + // Only interrested in GGA, no antenna status + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + GPS.sendCommand(PGCMD_NOANTENNA); + + // Update every second + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + + // Start job (sending automatically starts OTAA too) + do_send(&sendjob); } void loop() { - GPS.read(); - os_runloop_once(); + GPS.read(); + os_runloop_once(); } diff --git a/longfi-us915/longfi-us915.ino b/longfi-us915/longfi-us915.ino index c45845e..90274a5 100644 --- a/longfi-us915/longfi-us915.ino +++ b/longfi-us915/longfi-us915.ino @@ -15,7 +15,6 @@ * *******************************************************************************/ - /******************************************************************************* * * For Helium developers, follow the Arduino Quickstart guide: @@ -27,27 +26,28 @@ * *******************************************************************************/ -#include -#include +#include +#include #include +#include #include #include -#include #include -#include +#include // This is the "App EUI" in Helium. Make sure it is little-endian (lsb). -static const u1_t PROGMEM APPEUI[8]= { FILL_ME_IN }; -void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);} +static const u1_t PROGMEM APPEUI[8] = {FILL_ME_IN}; +void os_getArtEui(u1_t *buf) { memcpy_P(buf, APPEUI, 8); } // This should also be in little endian format // These are user configurable values and Helium console permits anything -static const u1_t PROGMEM DEVEUI[8]= { 0x48, 0x65, 0x6c, 0x69, 0x75, 0x6d, 0x20, 0x20 }; -void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);} +static const u1_t PROGMEM DEVEUI[8] = {0x48, 0x65, 0x6c, 0x69, + 0x75, 0x6d, 0x20, 0x20}; +void os_getDevEui(u1_t *buf) { memcpy_P(buf, DEVEUI, 8); } // This is the "App Key" in Helium. It is big-endian (msb). -static const u1_t PROGMEM APPKEY[16] = { FILL_ME_IN }; -void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);} +static const u1_t PROGMEM APPKEY[16] = {FILL_ME_IN}; +void os_getDevKey(u1_t *buf) { memcpy_P(buf, APPKEY, 16); } static uint8_t mydata[] = "Hello, world!"; static osjob_t sendjob; @@ -69,7 +69,7 @@ const lmic_pinmap lmic_pins = { .rst = 4, .dio = {3, 6, LMIC_UNUSED_PIN}, .rxtx_rx_active = 0, - .rssi_cal = 8, // LBT cal for the Adafruit Feather M0 LoRa, in dB + .rssi_cal = 8, // LBT cal for the Adafruit Feather M0 LoRa, in dB .spi_freq = 8000000, }; #elif defined(ARDUINO_AVR_FEATHER32U4) @@ -83,24 +83,26 @@ const lmic_pinmap lmic_pins = { .rst = 4, .dio = {7, 6, LMIC_UNUSED_PIN}, .rxtx_rx_active = 0, - .rssi_cal = 8, // LBT cal for the Adafruit Feather 32U4 LoRa, in dB + .rssi_cal = 8, // LBT cal for the Adafruit Feather 32U4 LoRa, in dB .spi_freq = 1000000, }; #elif defined(ARDUINO_CATENA_4551) // Pin mapping for Murata module / Catena 4551 const lmic_pinmap lmic_pins = { - .nss = 7, - .rxtx = 29, - .rst = 8, - .dio = { 25, // DIO0 (IRQ) is D25 - 26, // DIO1 is D26 - 27, // DIO2 is D27 - }, - .rxtx_rx_active = 1, - .rssi_cal = 10, - .spi_freq = 8000000 // 8MHz + .nss = 7, + .rxtx = 29, + .rst = 8, + .dio = + { + 25, // DIO0 (IRQ) is D25 + 26, // DIO1 is D26 + 27, // DIO2 is D27 + }, + .rxtx_rx_active = 1, + .rssi_cal = 10, + .spi_freq = 8000000 // 8MHz }; -#elif defined(MCCI_CATENA_4610) +#elif defined(MCCI_CATENA_4610) #include "arduino_lmic_hal_boards.h" const lmic_pinmap lmic_pins = *Arduino_LMIC::GetPinmap_Catena4610(); #elif defined(ARDUINO_DISCO_L072CZ_LRWAN1) @@ -109,221 +111,216 @@ const HalPinmap_t GetPinmap_Disco_L072cz_Lrwan1(); } const lmic_pinmap lmic_pins = Arduino_LMIC::GetPinmap_Disco_L072cz_Lrwan1(); #else -# error "Unknown target" +#error "Unknown target" #endif -void onEvent (ev_t ev) { - Serial.print(os_getTime()); - Serial.print(": "); - switch(ev) { - case EV_SCAN_TIMEOUT: - Serial.println(F("EV_SCAN_TIMEOUT")); - break; - case EV_BEACON_FOUND: - Serial.println(F("EV_BEACON_FOUND")); - break; - case EV_BEACON_MISSED: - Serial.println(F("EV_BEACON_MISSED")); - break; - case EV_BEACON_TRACKED: - Serial.println(F("EV_BEACON_TRACKED")); - break; - case EV_JOINING: - Serial.println(F("EV_JOINING")); - break; - case EV_JOIN_TXCOMPLETE: - Serial.println(F("EV_JOIN_TXCOMPLETE")); - break; - case EV_JOINED: - Serial.println(F("EV_JOINED")); - { - u4_t netid = 0; - devaddr_t devaddr = 0; - u1_t nwkKey[16]; - u1_t artKey[16]; - LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey); - Serial.print("netid: "); - Serial.println(netid, DEC); - Serial.print("devaddr: "); - Serial.println(devaddr, HEX); - Serial.print("artKey: "); - for (size_t i=0; i