Compare commits

...

67 Commits

Author SHA1 Message Date
Jm Casler
c88ba583c6 Bump to .27 2022-07-25 11:07:16 -07:00
Thomas Göttgens
b36cd32c03 Merge pull request #1563 from meshtastic/patch1
Fix formula to consider Bandwidth in kHz
2022-07-21 10:20:41 +02:00
Thomas Göttgens
43733ce150 Fix formula to consider Bandwidth in kHz 2022-07-21 10:07:08 +02:00
Jm Casler
0010231172 Update to .26 2022-07-19 09:43:08 -07:00
Jm Casler
50300957db Merge pull request #1561 from mc-hamster/master
Updated the frequency selection formula
2022-07-19 09:38:11 -07:00
Jm Casler
07d4773722 Merge branch 'meshtastic:master' into master 2022-07-19 07:37:12 -07:00
Jm Casler
62aa740c93 Updated channel selection formula 2022-07-19 07:36:55 -07:00
Jm Casler
4de6d5bdb0 Merge pull request #1560 from mc-hamster/master
Allow range test module to loop back messages
2022-07-16 11:56:17 -07:00
Jm
cf4c814b59 Allow range test module to loop back messages 2022-07-16 08:08:10 -07:00
Jm Casler
ca8e307976 Merge pull request #1559 from mc-hamster/master
fix comments in smart position
2022-07-16 07:58:21 -07:00
Jm Casler
b51b7d3eb7 Merge branch 'meshtastic:master' into master 2022-07-16 07:57:51 -07:00
Jm
ea7da3178b Fixed comment 2022-07-16 07:57:35 -07:00
Jm Casler
3011d09c8c Merge pull request #1557 from kokroo/master
Allow up to 500mW transmission power for EU868 region
2022-07-15 08:40:36 -07:00
Shiv Kokroo
d179f02519 Removed comment about frequency hopping
Removed comment about frequency hopping due to lack of universal hardware support
2022-07-15 16:37:53 +02:00
Shiv Kokroo
67a7056025 Change page number to section for reference document 2022-07-15 16:37:01 +02:00
Shiv Kokroo
930b023d10 Allow up to 500mW transmission power for EU868 region
The European Union regulations clearly state that the power limit for this frequency range is 500 mW, or 27 dBm. goTenna Mesh uses the same frequency range and power limit too.

It also states that we can use interference avoidance and spectrum access techniques to avoid a duty cycle.

It might be worthwhile in the future to implement frequency hopping to avoid duty cycling.

(Please refer to page 69 in the following document)
        https://ec.europa.eu/growth/tools-databases/tris/index.cfm/ro/search/?trisaction=search.detail&year=2021&num=528&dLang=EN
2022-07-15 16:06:41 +02:00
Ben Meadors
85f46d3231 Bump to 1.3.25 for release 2022-07-11 13:18:58 -05:00
Ben Meadors
d56094fb7c Set last gps coordinates after comparison (#1556)
* Set last gps coordinates after comparison

* Wrong spot
2022-07-11 13:18:02 -05:00
Jm Casler
dff69157d6 bump to 24 2022-07-08 17:57:08 -07:00
Jm Casler
38088253f8 disable welcome screen 2022-07-08 17:56:49 -07:00
Jm Casler
0e560b376f Merge pull request #1535 from mc-hamster/master
Add ability to adjust frequency by config.lora.frequency_offset
2022-07-05 19:56:24 -07:00
Ben Meadors
8c2af4f3d5 Merge branch 'master' into master 2022-07-04 13:19:56 -05:00
Ben Meadors
d7d574e0a7 Screen for voltage / current (#1547)
* Add voltage + current measurements

* mA instead of amp
2022-07-03 11:10:41 -05:00
Ben Meadors
5462d84bfc Bump for release 2022-07-02 14:51:50 -05:00
Ben Meadors
1efcd5e125 Merge branch 'master' into master 2022-07-02 14:44:40 -05:00
Ben Meadors
9fd7abf3d4 Actually save nodeDb after we init (#1546) 2022-07-02 10:16:48 -05:00
Ben Meadors
4a08f86f96 Oops (#1545) 2022-07-02 09:25:01 -05:00
Ben Meadors
3f0ff45232 Node db cleanup and debug prints (#1543)
* Node db cleanup and debug prints

* File name cleanup
2022-07-02 09:09:41 -05:00
loodydo
f8ee1ac4f9 Update GeoCoord.cpp (#1540)
Adding clarification to comments on GeoCoord::bearing function.

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2022-07-02 07:05:10 -05:00
loodydo
f26441727c Update MQTT.cpp (#1534)
Fix returning pointer to local variable that will become invalid when returning.

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2022-07-02 06:53:15 -05:00
Ben Meadors
c725a6b65f Bump for next tech preview release 2022-06-29 20:17:51 -05:00
Ben Meadors
9c6da233b9 Phoneapi moduleconfig (#1538) 2022-06-29 19:41:43 -05:00
github-actions[bot]
0f2aa7660d [create-pull-request] automated change (#1537)
Co-authored-by: thebentern <thebentern@users.noreply.github.com>
2022-06-29 19:09:38 -05:00
Jm Casler
004a6f9c25 Merge branch 'master' into master 2022-06-25 22:59:58 -07:00
Jm Casler
d81b043f1d Add ability to adjust frequency by config.lora.frequency_offset 2022-06-25 22:43:13 -07:00
Thomas Göttgens
9f78dff25f Merge pull request #1532 from meshtastic/patch-1
avoid BLE device names like a123_a123
2022-06-22 15:44:25 +02:00
Thomas Göttgens
e7dfd14917 Change recursive delete to be recursive 2022-06-22 15:33:53 +02:00
Thomas Göttgens
bc47dd574b avoid BLE device names like a123_a123 2022-06-22 14:26:33 +02:00
Thomas Göttgens
41d5ccc29f Merge pull request #1531 from meshtastic/patch-1
Small fixes and inprovements
2022-06-22 12:36:46 +02:00
Thomas Göttgens
aead7a23f9 - Put Modemconfig in logical order and fix typo
- non-zero config.lora.bandwidth means a custom radio config, not 'Unknown'
- Enable 'this is a new device, set region' screen again now we can actually set region.
2022-06-22 09:52:08 +02:00
Thomas Göttgens
c9fd591942 Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-22 09:44:59 +02:00
Jm Casler
c81fbd867d Merge pull request #1530 from mc-hamster/master
Add debug to monitor radio reconfiguration for #1014
2022-06-21 22:18:13 -07:00
Jm Casler
cfb76290cb Merge branch 'master' into master 2022-06-21 21:52:55 -07:00
Jm Casler
46e13d23d9 Add debug to monitor radio reconfiguration for #1014 - 2022-06-21 21:51:45 -07:00
Jm Casler
45b2c169aa Merge pull request #1529 from mc-hamster/master
Fix typo in the modem presets
2022-06-21 19:34:37 -07:00
Jm Casler
90baf9d8a0 Fix typo in the modem presets 2022-06-21 19:23:07 -07:00
Jm Casler
a390fc7ea8 Merge pull request #1528 from meshtastic/create-pull-request/patch
Changes by create-pull-request action
2022-06-21 19:07:36 -07:00
mc-hamster
e0f912ab2a [create-pull-request] automated change 2022-06-22 02:06:51 +00:00
Thomas Göttgens
646d6f5615 Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-21 10:09:22 +02:00
Jm Casler
cf00ac593f Update to 1.3.21 2022-06-20 16:44:33 -07:00
Thomas Göttgens
ff9f973a1d Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-20 20:33:43 +02:00
Ben Meadors
7a50ab4de2 Re-init config_state after we switch to nodeinfo (#1526) 2022-06-20 13:28:50 -05:00
Thomas Göttgens
c80f260fba Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-20 20:26:13 +02:00
Ben Meadors
a7d527c3c3 Pins for m5stack-core 2022-06-20 12:41:03 -05:00
Mark Trevor Birss
2e2c485f4c M5Stack CoreInk Pins_Arduino.h (#1527)
* Update EInkDisplay2.cpp

* Create pins_arduino.h

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2022-06-20 12:33:44 -05:00
Ben Meadors
388865aba7 Dashes not underscores 2022-06-20 11:19:20 -05:00
Ben Meadors
21c6e595a1 Update build-all.sh 2022-06-20 11:18:30 -05:00
Ben Meadors
4a2522dbd3 Add m5stack core targets to release 2022-06-20 09:16:00 -05:00
Ben Meadors
877d72cbad Helps if you get the name right 2022-06-20 09:15:30 -05:00
Ben Meadors
63238cb810 Add m5stack core boards to CI 2022-06-20 09:13:27 -05:00
Mark Trevor Birss
e87c5d8d34 Update EInkDisplay2.cpp (#1524)
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2022-06-20 09:08:35 -05:00
Ben Meadors
f9bbbfccb3 Fix typo 2022-06-18 14:03:58 -05:00
Thomas Göttgens
089c91a7ac Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-18 09:48:22 +02:00
Thomas Göttgens
515a411e8c Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-17 22:37:55 +02:00
Thomas Göttgens
cf380e6cb6 Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-17 09:01:14 +02:00
Thomas Göttgens
74e926ef00 Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-16 20:44:43 +02:00
Thomas Göttgens
af335e9c06 Merge branch 'master' of github.com:meshtastic/Meshtastic-device 2022-06-16 09:46:17 +02:00
27 changed files with 337 additions and 135 deletions

View File

@@ -38,7 +38,9 @@ jobs:
- board: rak4631_eink
- board: t-echo
- board: nano-g1
- board: m5stack-core
- board: m5stack-coreink
runs-on: ubuntu-latest
steps:
- name: Checkout code
@@ -93,6 +95,8 @@ jobs:
- board: tbeam0.7
- board: meshtastic-diy-v1
- board: nano-g1
- board: m5stack-core
- board: m5stack-coreink
runs-on: ubuntu-latest
steps:

View File

@@ -5,7 +5,7 @@ set -e
VERSION=`bin/buildinfo.py long`
SHORT_VERSION=`bin/buildinfo.py short`
BOARDS_ESP32="rak11200 tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-v1 heltec-v2.0 heltec-v2.1 tbeam0.7 meshtastic-diy-v1 nano-g1"
BOARDS_ESP32="rak11200 tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-v1 heltec-v2.0 heltec-v2.1 tbeam0.7 meshtastic-diy-v1 nano-g1 m5stack-core m5stack-coreink"
#BOARDS_ESP32=tbeam
# FIXME note nrf52840dk build is for some reason only generating a BIN file but not a HEX file nrf52840dk-geeksville is fine

View File

@@ -2,8 +2,8 @@
#include "FSCommon.h"
void listDir(const char * dirname, uint8_t levels)
#ifdef FSCom
{
#ifdef FSCom
File root = FSCom.open(dirname);
if(!root){
return;
@@ -29,29 +29,41 @@ void listDir(const char * dirname, uint8_t levels)
}
void rmDir(const char * dirname)
#ifdef FSCom
{
File root = FSCom.open(dirname);
if(!root){
#ifdef FSCom
File file = FSCom.open(dirname);
if(!file){
return;
}
if(!root.isDirectory()){
if(!file.isDirectory()){
file.close();
FSCom.remove(file.name());
// DEBUG_MSG("Remove FILE %s\n", file.name());
return;
}
File file = root.openNextFile();
while(file){
if(file.isDirectory() && !String(file.name()).endsWith(".")) {
file.close();
rmDir(file.name());
FSCom.rmdir(file.name());
} else {
file.close();
FSCom.remove(file.name());
file.rewindDirectory();
while (true) {
File entry = file.openNextFile();
if (!entry) {
break;
}
char dirpath[100]; // array to hold the result.
strcpy(dirpath, dirname); // copy string one into the result.
strcat(dirpath,"/"); // append string two to the result.
strcat(dirpath,entry.name()); // append string two to the result.
if(entry.isDirectory() && !String(entry.name()).endsWith(".")) {
entry.close();
// DEBUG_MSG("Descend DIR %s\n", dirpath);
rmDir(dirpath);
} else {
entry.close();
// DEBUG_MSG("Remove FILE %s\n", entry.name());
FSCom.remove(entry.name());
}
file.close();
file = root.openNextFile();
}
FSCom.rmdir(dirname);
// DEBUG_MSG("Remove DIR %s\n", dirname);
file.close();
#endif
}

View File

@@ -142,7 +142,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// -----------------------------------------------------------------------------
// Disable use of the NTP library and related features
//#define DISABLE_NTP
// #define DISABLE_NTP
// Disable the welcome screen and allow
#define DISABLE_WELCOME_UNSET

View File

@@ -379,7 +379,7 @@ float GeoCoord::latLongToMeter(double lat_a, double lng_a, double lat_b, double
* Latitude of the second point
* @param lon2
* Longitude of the second point
* @return Bearing between the two points in radians. A value of 0 means due
* @return Bearing from point 1 to point 2 in radians. A value of 0 means due
* north.
*/
float GeoCoord::bearing(double lat1, double lon1, double lat2, double lon2)

View File

@@ -210,8 +210,7 @@ bool EInkDisplay::connect()
#elif defined(M5_COREINK)
auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY);
adafruitDisplay = new GxEPD2_BW<TECHO_DISPLAY_MODEL, TECHO_DISPLAY_MODEL::HEIGHT>(*lowLevel);
delay(100);
adafruitDisplay->init(115200, true, 20, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
adafruitDisplay->init(115200, true, 40, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
adafruitDisplay->setRotation(0);
adafruitDisplay->setPartialWindow(0, 0, EPD_WIDTH, EPD_HEIGHT);
#endif

View File

@@ -1520,25 +1520,25 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat
switch (config.lora.modem_preset) {
case Config_LoRaConfig_ModemPreset_ShortSlow:
mode = "ShortSlow";
mode = "ShortS";
break;
case Config_LoRaConfig_ModemPreset_ShortFast:
mode = "ShortFast";
mode = "ShortF";
break;
case Config_LoRaConfig_ModemPreset_MidSlow:
mode = "MediumSlow";
case Config_LoRaConfig_ModemPreset_MedSlow:
mode = "MedS";
break;
case Config_LoRaConfig_ModemPreset_MidFast:
mode = "MediumFast";
break;
case Config_LoRaConfig_ModemPreset_LongFast:
mode = "LongFast";
case Config_LoRaConfig_ModemPreset_MedFast:
mode = "MedF";
break;
case Config_LoRaConfig_ModemPreset_LongSlow:
mode = "LongSlow";
mode = "LongS";
break;
case Config_LoRaConfig_ModemPreset_LongFast:
mode = "LongF";
break;
case Config_LoRaConfig_ModemPreset_VLongSlow:
mode = "VLongSlow";
mode = "VeryL";
break;
default:
mode = "Custom";

View File

@@ -105,7 +105,7 @@ const char *getDeviceName()
static char name[20];
sprintf(name, "%02x%02x", dmac[4], dmac[5]);
// if the shortname exists and is NOT the new default of ab3c, use it for BLE name.
if ((owner.short_name != NULL) && (owner.short_name != name)) {
if ((owner.short_name != NULL) && (strcmp(owner.short_name, name) != 0)) {
sprintf(name, "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]);
} else {
sprintf(name, "Meshtastic_%02x%02x", dmac[4], dmac[5]);

View File

@@ -211,29 +211,29 @@ const char *Channels::getName(size_t chIndex)
// the app fucked up and forgot to set channelSettings.name
if (config.lora.bandwidth != 0)
channelName = "Unset";
channelName = "Custom";
else
switch (config.lora.modem_preset) {
case Config_LoRaConfig_ModemPreset_ShortSlow:
channelName = "ShortSlow";
channelName = "ShortS";
break;
case Config_LoRaConfig_ModemPreset_ShortFast:
channelName = "ShortFast";
channelName = "ShortF";
break;
case Config_LoRaConfig_ModemPreset_MidSlow:
channelName = "MediumSlow";
case Config_LoRaConfig_ModemPreset_MedSlow:
channelName = "MedS";
break;
case Config_LoRaConfig_ModemPreset_MidFast:
channelName = "MediumFast";
break;
case Config_LoRaConfig_ModemPreset_LongFast:
channelName = "LongFast";
case Config_LoRaConfig_ModemPreset_MedFast:
channelName = "MedF";
break;
case Config_LoRaConfig_ModemPreset_LongSlow:
channelName = "LongSlow";
channelName = "LongS";
break;
case Config_LoRaConfig_ModemPreset_LongFast:
channelName = "LongF";
break;
case Config_LoRaConfig_ModemPreset_VLongSlow:
channelName = "VLongSlow";
channelName = "VeryL";
break;
default:
channelName = "Invalid";

View File

@@ -89,26 +89,7 @@ bool NodeDB::resetRadioConfig()
// radioConfig.has_preferences = true;
if (config.device.factory_reset) {
DEBUG_MSG("Performing factory reset!\n");
// first, remove the "/prefs" (this removes most prefs)
rmDir("/prefs");
// second, install default state (this will deal with the duplicate mac address issue)
installDefaultDeviceState();
// third, write to disk
saveToDisk();
#ifndef NO_ESP32
// This will erase what's in NVS including ssl keys, persistant variables and ble pairing
nvs_flash_erase();
#endif
#ifdef NRF52_SERIES
Bluefruit.begin();
DEBUG_MSG("Clearing bluetooth bonds!\n");
bond_print_list(BLE_GAP_ROLE_PERIPH);
bond_print_list(BLE_GAP_ROLE_CENTRAL);
Bluefruit.Periph.clearBonds();
Bluefruit.Central.clearBonds();
#endif
didFactoryReset = true;
didFactoryReset = factoryReset();
}
if (channelFile.channels_count != MAX_NUM_CHANNELS) {
@@ -142,8 +123,33 @@ bool NodeDB::resetRadioConfig()
return didFactoryReset;
}
bool NodeDB::factoryReset()
{
DEBUG_MSG("Performing factory reset!\n");
// first, remove the "/prefs" (this removes most prefs)
rmDir("/prefs");
// second, install default state (this will deal with the duplicate mac address issue)
installDefaultDeviceState();
// third, write to disk
saveToDisk();
#ifndef NO_ESP32
// This will erase what's in NVS including ssl keys, persistant variables and ble pairing
nvs_flash_erase();
#endif
#ifdef NRF52_SERIES
Bluefruit.begin();
DEBUG_MSG("Clearing bluetooth bonds!\n");
bond_print_list(BLE_GAP_ROLE_PERIPH);
bond_print_list(BLE_GAP_ROLE_CENTRAL);
Bluefruit.Periph.clearBonds();
Bluefruit.Central.clearBonds();
#endif
return true;
}
void NodeDB::installDefaultConfig()
{
DEBUG_MSG("Installing default LocalConfig\n");
memset(&config, 0, sizeof(LocalConfig));
config.version = DEVICESTATE_CUR_VER;
config.has_device = true;
@@ -164,25 +170,28 @@ void NodeDB::installDefaultConfig()
void NodeDB::installDefaultModuleConfig()
{
DEBUG_MSG("Installing default ModuleConfig\n");
memset(&moduleConfig, 0, sizeof(ModuleConfig));
moduleConfig.version = DEVICESTATE_CUR_VER;
moduleConfig.has_canned_message = true;
moduleConfig.has_external_notification = true;
moduleConfig.has_mqtt = true;
moduleConfig.has_range_test = true;
moduleConfig.has_serial = true;
moduleConfig.has_store_forward = true;
moduleConfig.has_telemetry = true;
moduleConfig.has_external_notification = true;
moduleConfig.has_canned_message = true;
}
void NodeDB::installDefaultChannels()
{
DEBUG_MSG("Installing default ChannelFile\n");
memset(&channelFile, 0, sizeof(ChannelFile));
channelFile.version = DEVICESTATE_CUR_VER;
}
void NodeDB::installDefaultDeviceState()
{
DEBUG_MSG("Installing default DeviceState\n");
memset(&devicestate, 0, sizeof(DeviceState));
*numNodes = 0; // Forget node DB
@@ -209,23 +218,17 @@ void NodeDB::installDefaultDeviceState()
sprintf(owner.id, "!%08x", getNodeNum()); // Default node ID now based on nodenum
memcpy(owner.macaddr, ourMacAddr, sizeof(owner.macaddr));
installDefaultChannels();
installDefaultConfig();
}
void NodeDB::init()
{
installDefaultDeviceState();
DEBUG_MSG("Initializing NodeDB\n");
// saveToDisk();
loadFromDisk();
// saveToDisk();
myNodeInfo.max_channels = MAX_NUM_CHANNELS; // tell others the max # of channels we can understand
myNodeInfo.error_code =
CriticalErrorCode_None; // For the error code, only show values from this boot (discard value from flash)
myNodeInfo.error_code = CriticalErrorCode_None; // For the error code, only show values from this boot (discard value from flash)
myNodeInfo.error_address = 0;
// likewise - we always want the app requirements to come from the running appload
@@ -259,8 +262,8 @@ void NodeDB::init()
#endif
resetRadioConfig(); // If bogus settings got saved, then fix them
DEBUG_MSG("region=%d, NODENUM=0x%x, dbsize=%d\n", config.lora.region, myNodeInfo.my_node_num, *numNodes);
saveToDisk();
}
// We reserve a few nodenums for future use
@@ -290,10 +293,10 @@ void NodeDB::pickNewNodeNum()
myNodeInfo.my_node_num = r;
}
static const char *preffile = "/prefs/db.proto";
static const char *configfile = "/prefs/config.proto";
static const char *moduleConfigfile = "/prefs/module.proto";
static const char *channelfile = "/prefs/channels.proto";
static const char *prefFileName = "/prefs/db.proto";
static const char *configFileName = "/prefs/config.proto";
static const char *moduleConfigFileName = "/prefs/module.proto";
static const char *channelFileName = "/prefs/channels.proto";
/** Load a protobuf from a file, return true for success */
bool loadProto(const char *filename, size_t protoSize, size_t objSize, const pb_msgdesc_t *fields, void *dest_struct)
@@ -330,30 +333,30 @@ bool loadProto(const char *filename, size_t protoSize, size_t objSize, const pb_
void NodeDB::loadFromDisk()
{
// static DeviceState scratch; We no longer read into a tempbuf because this structure is 15KB of valuable RAM
if (!loadProto(preffile, DeviceState_size, sizeof(devicestate), DeviceState_fields, &devicestate)) {
if (!loadProto(prefFileName, DeviceState_size, sizeof(devicestate), DeviceState_fields, &devicestate)) {
installDefaultDeviceState(); // Our in RAM copy might now be corrupt
} else {
if (devicestate.version < DEVICESTATE_MIN_VER) {
DEBUG_MSG("Warn: devicestate %d is old, discarding\n", devicestate.version);
installDefaultDeviceState();
#ifndef NO_ESP32
// This will erase what's in NVS including ssl keys, persistant variables and ble pairing
nvs_flash_erase();
// This will erase what's in NVS including ssl keys, persistant variables and ble pairing
nvs_flash_erase();
#endif
#ifdef NRF52_SERIES
Bluefruit.begin();
DEBUG_MSG("Clearing bluetooth bonds!\n");
bond_print_list(BLE_GAP_ROLE_PERIPH);
bond_print_list(BLE_GAP_ROLE_CENTRAL);
Bluefruit.Periph.clearBonds();
Bluefruit.Central.clearBonds();
Bluefruit.begin();
DEBUG_MSG("Clearing bluetooth bonds!\n");
bond_print_list(BLE_GAP_ROLE_PERIPH);
bond_print_list(BLE_GAP_ROLE_CENTRAL);
Bluefruit.Periph.clearBonds();
Bluefruit.Central.clearBonds();
#endif
} else {
DEBUG_MSG("Loaded saved devicestate version %d\n", devicestate.version);
}
}
if (!loadProto(configfile, LocalConfig_size, sizeof(LocalConfig), LocalConfig_fields, &config)) {
if (!loadProto(configFileName, LocalConfig_size, sizeof(LocalConfig), LocalConfig_fields, &config)) {
installDefaultConfig(); // Our in RAM copy might now be corrupt
} else {
if (config.version < DEVICESTATE_MIN_VER) {
@@ -364,7 +367,7 @@ void NodeDB::loadFromDisk()
}
}
if (!loadProto(moduleConfigfile, LocalModuleConfig_size, sizeof(LocalModuleConfig), LocalModuleConfig_fields, &moduleConfig)) {
if (!loadProto(moduleConfigFileName, LocalModuleConfig_size, sizeof(LocalModuleConfig), LocalModuleConfig_fields, &moduleConfig)) {
installDefaultModuleConfig(); // Our in RAM copy might now be corrupt
} else {
if (moduleConfig.version < DEVICESTATE_MIN_VER) {
@@ -375,7 +378,7 @@ void NodeDB::loadFromDisk()
}
}
if (!loadProto(channelfile, ChannelFile_size, sizeof(ChannelFile), ChannelFile_fields, &channelFile)) {
if (!loadProto(channelFileName, ChannelFile_size, sizeof(ChannelFile), ChannelFile_fields, &channelFile)) {
installDefaultChannels(); // Our in RAM copy might now be corrupt
} else {
if (channelFile.version < DEVICESTATE_MIN_VER) {
@@ -428,7 +431,7 @@ void NodeDB::saveChannelsToDisk()
#ifdef FSCom
FSCom.mkdir("/prefs");
#endif
saveProto(channelfile, ChannelFile_size, sizeof(ChannelFile), ChannelFile_fields, &channelFile);
saveProto(channelFileName, ChannelFile_size, sizeof(ChannelFile), ChannelFile_fields, &channelFile);
}
}
@@ -438,7 +441,7 @@ void NodeDB::saveToDisk()
#ifdef FSCom
FSCom.mkdir("/prefs");
#endif
saveProto(preffile, DeviceState_size, sizeof(devicestate), DeviceState_fields, &devicestate);
saveProto(prefFileName, DeviceState_size, sizeof(devicestate), DeviceState_fields, &devicestate);
// save all config segments
config.has_device = true;
@@ -447,7 +450,7 @@ void NodeDB::saveToDisk()
config.has_position = true;
config.has_power = true;
config.has_wifi = true;
saveProto(configfile, LocalConfig_size, sizeof(LocalConfig), LocalConfig_fields, &config);
saveProto(configFileName, LocalConfig_size, sizeof(LocalConfig), LocalConfig_fields, &config);
moduleConfig.has_canned_message = true;
moduleConfig.has_external_notification = true;
@@ -456,10 +459,9 @@ void NodeDB::saveToDisk()
moduleConfig.has_serial = true;
moduleConfig.has_store_forward = true;
moduleConfig.has_telemetry = true;
saveProto(moduleConfigfile, LocalModuleConfig_size, sizeof(LocalModuleConfig), LocalModuleConfig_fields, &moduleConfig);
saveProto(moduleConfigFileName, LocalModuleConfig_size, sizeof(LocalModuleConfig), LocalModuleConfig_fields, &moduleConfig);
saveChannelsToDisk();
} else {
DEBUG_MSG("***** DEVELOPMENT MODE - DO NOT RELEASE - not saving to flash *****\n");
}

View File

@@ -119,6 +119,8 @@ class NodeDB
newStatus.notifyObservers(&status);
}
bool factoryReset();
/// read our db from flash
void loadFromDisk();

View File

@@ -183,10 +183,47 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf)
config_state++;
// Advance when we have sent all of our config objects
if (config_state > Config_lora_tag) {
state = STATE_SEND_NODEINFO;
state = STATE_SEND_MODULECONFIG;
config_state = ModuleConfig_mqtt_tag;
}
break;
case STATE_SEND_MODULECONFIG:
fromRadioScratch.which_payloadVariant = FromRadio_moduleConfig_tag;
switch (config_state) {
case ModuleConfig_mqtt_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_mqtt_tag;
fromRadioScratch.moduleConfig.payloadVariant.mqtt = moduleConfig.mqtt;
break;
case ModuleConfig_serial_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_serial_tag;
fromRadioScratch.moduleConfig.payloadVariant.serial = moduleConfig.serial;
break;
case ModuleConfig_external_notification_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_external_notification_tag;
fromRadioScratch.moduleConfig.payloadVariant.external_notification = moduleConfig.external_notification;
break;
case ModuleConfig_range_test_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_range_test_tag;
fromRadioScratch.moduleConfig.payloadVariant.range_test = moduleConfig.range_test;
break;
case ModuleConfig_telemetry_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_telemetry_tag;
fromRadioScratch.moduleConfig.payloadVariant.telemetry = moduleConfig.telemetry;
break;
case ModuleConfig_canned_message_tag:
fromRadioScratch.moduleConfig.which_payloadVariant = ModuleConfig_canned_message_tag;
fromRadioScratch.moduleConfig.payloadVariant.canned_message = moduleConfig.canned_message;
break;
}
config_state++;
// Advance when we have sent all of our ModuleConfig objects
if (config_state > ModuleConfig_canned_message_tag) {
state = STATE_SEND_NODEINFO;
config_state = Config_device_tag;
}
break;
case STATE_SEND_NODEINFO: {
const NodeInfo *info = nodeInfoForPhone;
nodeInfoForPhone = NULL; // We just consumed a nodeinfo, will need a new one next time
@@ -264,6 +301,9 @@ bool PhoneAPI::available()
return true;
case STATE_SEND_CONFIG:
return true;
case STATE_SEND_MODULECONFIG:
return true;
case STATE_SEND_NODEINFO:

View File

@@ -24,6 +24,7 @@ class PhoneAPI
STATE_SEND_MY_INFO, // send our my info record
STATE_SEND_GROUPS, // new in 1.3?
STATE_SEND_CONFIG, // Replacement for the old Radioconfig
STATE_SEND_MODULECONFIG, // Send Module specific config
STATE_SEND_NODEINFO, // states progress in this order as the device sends to to the client
STATE_SEND_COMPLETE_ID,
STATE_SEND_PACKETS // send packets or debug strings

View File

@@ -70,6 +70,10 @@ bool RF95Interface::init()
int res = lora->begin(getFreq(), bw, sf, cr, syncWord, power, currentLimit, preambleLength);
DEBUG_MSG("RF95 init result %d\n", res);
DEBUG_MSG("Frequency set to %f\n", getFreq());
DEBUG_MSG("Bandwidth set to %f\n", bw);
DEBUG_MSG("Power output set to %d\n", power);
// current limit was removed from module' ctor
// override default value (60 mA)
res = lora->setCurrentLimit(currentLimit);

View File

@@ -35,8 +35,15 @@ const RegionInfo regions[] = {
https://www.legislation.gov.uk/uksi/1999/930/schedule/6/part/III/made/data.xht?view=snippet&wrap=true
audio_permitted = false per regulation
Special Note:
The link above describes LoRaWAN's band plan, stating a power limit of 16 dBm. This is their own suggested specification,
we do not need to follow it. The European Union regulations clearly state that the power limit for this frequency range is 500 mW, or 27 dBm.
It also states that we can use interference avoidance and spectrum access techniques to avoid a duty cycle.
(Please refer to section 4.21 in the following document)
https://ec.europa.eu/growth/tools-databases/tris/index.cfm/ro/search/?trisaction=search.detail&year=2021&num=528&dLang=EN
*/
RDEF(EU868, 869.4f, 869.65f, 10, 0, 16, false, false),
RDEF(EU868, 869.4f, 869.65f, 10, 0, 27, false, false),
/*
https://lora-alliance.org/wp-content/uploads/2020/11/lorawan_regional_parameters_v1.0.3reva_0.pdf
@@ -360,12 +367,12 @@ void RadioInterface::applyModemConfig()
cr = 8;
sf = 8;
break;
case Config_LoRaConfig_ModemPreset_MidFast:
case Config_LoRaConfig_ModemPreset_MedFast:
bw = 250;
cr = 8;
sf = 9;
break;
case Config_LoRaConfig_ModemPreset_MidSlow:
case Config_LoRaConfig_ModemPreset_MedSlow:
bw = 250;
cr = 8;
sf = 10;
@@ -414,14 +421,18 @@ void RadioInterface::applyModemConfig()
// If user has manually specified a channel num, then use that, otherwise generate one by hashing the name
const char *channelName = channels.getName(channels.getPrimaryIndex());
int channel_num = channelSettings.channel_num ? channelSettings.channel_num - 1 : hash(channelName) % numChannels;
float freq = myRegion->freqStart + ((((myRegion->freqEnd - myRegion->freqStart) / numChannels) / 2) * channel_num);
// Old frequency selection formula
// float freq = myRegion->freqStart + ((((myRegion->freqEnd - myRegion->freqStart) / numChannels) / 2) * channel_num);
// New frequency selection formula
float freq = myRegion->freqStart + (bw / 2000) + ( channel_num * (bw / 1000));
saveChannelNum(channel_num);
saveFreq(freq);
saveFreq(freq + config.lora.frequency_offset);
DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, power=%d\n", channelName, loraConfig.modem_preset, channel_num, power);
DEBUG_MSG("Radio myRegion->freqStart / myRegion->freqEnd: %f -> %f (%f mhz)\n", myRegion->freqStart, myRegion->freqEnd,
myRegion->freqEnd - myRegion->freqStart);
DEBUG_MSG("Set radio: region=%s, name=%s, config=%u, ch=%d, power=%d\n", myRegion->name, channelName, loraConfig.modem_preset, channel_num, power);
DEBUG_MSG("Radio myRegion->freqStart / myRegion->freqEnd: %f -> %f (%f mhz)\n", myRegion->freqStart, myRegion->freqEnd, myRegion->freqEnd - myRegion->freqStart);
DEBUG_MSG("Radio myRegion->numChannels: %d\n", numChannels);
DEBUG_MSG("Radio channel_num: %d\n", channel_num);
DEBUG_MSG("Radio frequency: %f\n", getFreq());

View File

@@ -56,6 +56,10 @@ bool SX126xInterface<T>::init()
// \todo Display actual typename of the adapter, not just `SX126x`
DEBUG_MSG("SX126x init result %d\n", res);
DEBUG_MSG("Frequency set to %f\n", getFreq());
DEBUG_MSG("Bandwidth set to %f\n", bw);
DEBUG_MSG("Power output set to %d\n", power);
// current limit was removed from module' ctor
// override default value (60 mA)
res = lora.setCurrentLimit(currentLimit);

View File

@@ -26,7 +26,9 @@ typedef enum _Config_PositionConfig_PositionFlags {
Config_PositionConfig_PositionFlags_POS_HVDOP = 16,
Config_PositionConfig_PositionFlags_POS_SATINVIEW = 32,
Config_PositionConfig_PositionFlags_POS_SEQ_NOS = 64,
Config_PositionConfig_PositionFlags_POS_TIMESTAMP = 128
Config_PositionConfig_PositionFlags_POS_TIMESTAMP = 128,
Config_PositionConfig_PositionFlags_POS_HEADING = 256,
Config_PositionConfig_PositionFlags_POS_SPEED = 512
} Config_PositionConfig_PositionFlags;
typedef enum _Config_PowerConfig_ChargeCurrent {
@@ -78,8 +80,8 @@ typedef enum _Config_LoRaConfig_ModemPreset {
Config_LoRaConfig_ModemPreset_LongFast = 0,
Config_LoRaConfig_ModemPreset_LongSlow = 1,
Config_LoRaConfig_ModemPreset_VLongSlow = 2,
Config_LoRaConfig_ModemPreset_MidSlow = 3,
Config_LoRaConfig_ModemPreset_MidFast = 4,
Config_LoRaConfig_ModemPreset_MedSlow = 3,
Config_LoRaConfig_ModemPreset_MedFast = 4,
Config_LoRaConfig_ModemPreset_ShortSlow = 5,
Config_LoRaConfig_ModemPreset_ShortFast = 6
} Config_LoRaConfig_ModemPreset;
@@ -145,17 +147,11 @@ typedef struct _Config_WiFiConfig {
typedef struct _Config {
pb_size_t which_payloadVariant;
union {
/* TODO: REPLACE */
Config_DeviceConfig device;
/* TODO: REPLACE */
Config_PositionConfig position;
/* TODO: REPLACE */
Config_PowerConfig power;
/* TODO: REPLACE */
Config_WiFiConfig wifi;
/* TODO: REPLACE */
Config_DisplayConfig display;
/* TODO: REPLACE */
Config_LoRaConfig lora;
} payloadVariant;
} Config;
@@ -167,8 +163,8 @@ typedef struct _Config {
#define _Config_DeviceConfig_Role_ARRAYSIZE ((Config_DeviceConfig_Role)(Config_DeviceConfig_Role_RouterClient+1))
#define _Config_PositionConfig_PositionFlags_MIN Config_PositionConfig_PositionFlags_POS_UNDEFINED
#define _Config_PositionConfig_PositionFlags_MAX Config_PositionConfig_PositionFlags_POS_TIMESTAMP
#define _Config_PositionConfig_PositionFlags_ARRAYSIZE ((Config_PositionConfig_PositionFlags)(Config_PositionConfig_PositionFlags_POS_TIMESTAMP+1))
#define _Config_PositionConfig_PositionFlags_MAX Config_PositionConfig_PositionFlags_POS_SPEED
#define _Config_PositionConfig_PositionFlags_ARRAYSIZE ((Config_PositionConfig_PositionFlags)(Config_PositionConfig_PositionFlags_POS_SPEED+1))
#define _Config_PowerConfig_ChargeCurrent_MIN Config_PowerConfig_ChargeCurrent_MAUnset
#define _Config_PowerConfig_ChargeCurrent_MAX Config_PowerConfig_ChargeCurrent_MA1320

View File

@@ -5,6 +5,7 @@
#define PB_MESH_PB_H_INCLUDED
#include <pb.h>
#include "config.pb.h"
#include "module_config.pb.h"
#include "portnums.pb.h"
#include "telemetry.pb.h"
@@ -652,6 +653,8 @@ typedef struct _FromRadio {
Not used on all transports, currently just used for the serial console.
NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. */
bool rebooted;
/* Include module config */
ModuleConfig moduleConfig;
/* Log levels, chosen to match python logging conventions. */
MeshPacket packet;
};
@@ -856,6 +859,7 @@ extern "C" {
#define FromRadio_log_record_tag 7
#define FromRadio_config_complete_id_tag 8
#define FromRadio_rebooted_tag 9
#define FromRadio_moduleConfig_tag 10
#define FromRadio_packet_tag 11
#define ToRadio_packet_tag 2
#define ToRadio_peer_info_tag 3
@@ -1006,6 +1010,7 @@ X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,config,config), 6) \
X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,log_record,log_record), 7) \
X(a, STATIC, ONEOF, UINT32, (payloadVariant,config_complete_id,config_complete_id), 8) \
X(a, STATIC, ONEOF, BOOL, (payloadVariant,rebooted,rebooted), 9) \
X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,moduleConfig,moduleConfig), 10) \
X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,packet,packet), 11)
#define FromRadio_CALLBACK NULL
#define FromRadio_DEFAULT NULL
@@ -1013,6 +1018,7 @@ X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,packet,packet), 11)
#define FromRadio_payloadVariant_node_info_MSGTYPE NodeInfo
#define FromRadio_payloadVariant_config_MSGTYPE Config
#define FromRadio_payloadVariant_log_record_MSGTYPE LogRecord
#define FromRadio_payloadVariant_moduleConfig_MSGTYPE ModuleConfig
#define FromRadio_payloadVariant_packet_MSGTYPE MeshPacket
#define ToRadio_FIELDLIST(X, a) \

View File

@@ -222,7 +222,7 @@ bool initWifi(bool forceSoftAP)
// The configurations on softAP are from the espresif library
int ok = WiFi.softAP(wifiName, wifiPsw, 1, 1, 4);
DEBUG_MSG("Starting hiddem WIFI AP: ssid=%s, ok=%d\n", wifiName, ok);
DEBUG_MSG("Starting hidden WIFI AP: ssid=%s, ok=%d\n", wifiName, ok);
} else {
int ok = WiFi.softAP(wifiName, wifiPsw);
DEBUG_MSG("Starting WIFI AP: ssid=%s, ok=%d\n", wifiName, ok);

View File

@@ -171,23 +171,26 @@ int32_t PositionModule::runOnce()
// Yes, this has a bunch of magic numbers. Sorry. This is to make the scale non-linear.
const float distanceTravelMath = 1203 / (sqrt(pow(myNodeInfo.bitrate, 1.5) / 1.1));
uint32_t distanceTravel =
uint32_t distanceTravelThreshold =
(distanceTravelMath >= distanceTravelMinimum) ? distanceTravelMath : distanceTravelMinimum;
// Yes, this has a bunch of magic numbers. Sorry.
uint32_t timeTravel =
((1500 / myNodeInfo.bitrate) >= timeTravelMinimum) ? (1500 / myNodeInfo.bitrate) : timeTravelMinimum;
// If the distance traveled since the last update is greater than 100 meters
// and it's been at least 60 seconds since the last update
if ((abs(distance) >= distanceTravel) && (now - lastGpsSend >= timeTravel * 1000)) {
// If the distance traveled since the last update is greater than distanceTravelMinimum meters
// and it's been at least timeTravelMinimum seconds since the last update
if ((abs(distance) >= distanceTravelThreshold) && (now - lastGpsSend) >= (timeTravel * 1000)) {
bool requestReplies = currentGeneration != radioGeneration;
currentGeneration = radioGeneration;
DEBUG_MSG("Sending smart pos@%x:6 to mesh (wantReplies=%d, dt=%d, tt=%d)\n", node2->position.pos_timestamp,
requestReplies, distanceTravel, timeTravel);
DEBUG_MSG("Sending smart pos@%x:6 to mesh (wantReplies=%d, d=%d, dtt=%d, tt=%d)\n", node2->position.pos_timestamp,
requestReplies, distance, distanceTravelThreshold, timeTravel);
sendOurPosition(NODENUM_BROADCAST, requestReplies);
// Set the current coords as our last ones, after we've compared distance with current and decided to send
lastGpsLatitude = node->position.latitude_i;
lastGpsLongitude = node->position.longitude_i;
/* Update lastGpsSend to now. This means if the device is stationary, then
getPref_position_broadcast_secs will still apply.
*/

View File

@@ -196,11 +196,13 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
}
display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
display->drawString(x, y += fontHeight(FONT_SMALL) - 2,
"Temp/Hum: " + last_temp + " / " +
String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%");
"Temp/Hum: " + last_temp + " / " + String(lastMeasurement.variant.environment_metrics.relative_humidity, 0) + "%");
if (lastMeasurement.variant.environment_metrics.barometric_pressure != 0)
display->drawString(x, y += fontHeight(FONT_SMALL),
"Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA");
"Press: " + String(lastMeasurement.variant.environment_metrics.barometric_pressure, 0) + "hPA");
if (lastMeasurement.variant.environment_metrics.voltage != 0)
display->drawString(x, y += fontHeight(FONT_SMALL),
"Volt/Cur: " + String(lastMeasurement.variant.environment_metrics.voltage, 0) + "V / " + String(lastMeasurement.variant.environment_metrics.current, 0) + "mA");
}
bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Telemetry *t)

View File

@@ -28,7 +28,10 @@ class RangeTestModuleRadio : public SinglePortModule
uint32_t lastRxID = 0;
public:
RangeTestModuleRadio() : SinglePortModule("RangeTestModuleRadio", PortNum_TEXT_MESSAGE_APP) {}
RangeTestModuleRadio() : SinglePortModule("RangeTestModuleRadio", PortNum_TEXT_MESSAGE_APP)
{
loopbackOk = true; // Allow locally generated messages to loop back to the client
}
/**
* Send our payload into the mesh
@@ -50,7 +53,8 @@ class RangeTestModuleRadio : public SinglePortModule
/** Called to handle a particular incoming message
@return ProcessMessage::STOP if you've guaranteed you've handled this message and no other handlers should be considered for it
@return ProcessMessage::STOP if you've guaranteed you've handled this message and no other handlers should be considered for
it
*/
virtual ProcessMessage handleReceived(const MeshPacket &mp) override;
};

View File

@@ -356,8 +356,8 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp)
{"payload", msgPayload}};
// serialize and return it
std::string jsonStr = jsonObj.dump();
static std::string jsonStr = jsonObj.dump();
DEBUG_MSG("serialized json message: %s\n", jsonStr.c_str());
return jsonStr.c_str();
}
}

View File

@@ -0,0 +1,55 @@
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS 20
#define NUM_ANALOG_INPUTS 16
#define analogInputToDigitalPin(p) (((p)<20)?(analogChannelToDigitalPin(p)):-1)
#define digitalPinToInterrupt(p) (((p)<40)?(p):-1)
#define digitalPinHasPWM(p) (p < 34)
static const uint8_t TX = 1;
static const uint8_t RX = 3;
static const uint8_t TXD2 = 17;
static const uint8_t RXD2 = 16;
static const uint8_t SDA = 21;
static const uint8_t SCL = 22;
static const uint8_t SS = 5;
static const uint8_t MOSI = 23;
static const uint8_t MISO = 19;
static const uint8_t SCK = 18;
static const uint8_t G23 = 23;
static const uint8_t G19 = 19;
static const uint8_t G18 = 18;
static const uint8_t G3 = 3;
static const uint8_t G16 = 16;
static const uint8_t G21 = 21;
static const uint8_t G2 = 2;
static const uint8_t G12 = 12;
static const uint8_t G15 = 15;
static const uint8_t G35 = 35;
static const uint8_t G36 = 36;
static const uint8_t G25 = 25;
static const uint8_t G26 = 26;
static const uint8_t G1 = 1;
static const uint8_t G17 = 17;
static const uint8_t G22 = 22;
static const uint8_t G5 = 5;
static const uint8_t G13 = 13;
static const uint8_t G0 = 0;
static const uint8_t G34 = 34;
static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;
static const uint8_t ADC1 = 35;
static const uint8_t ADC2 = 36;
#endif /* Pins_Arduino_h */

View File

@@ -0,0 +1,57 @@
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS 40
#define NUM_ANALOG_INPUTS 16
#define analogInputToDigitalPin(p) (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p) (((p)<40)?(p):-1)
#define digitalPinHasPWM(p) (p < 34)
#define TX2 -1
#define RX2 -1
static const uint8_t TX = 1;
static const uint8_t RX = 3;
static const uint8_t SDA = 32;
static const uint8_t SCL = 33;
static const uint8_t SS = 9;
static const uint8_t MOSI = 23;
static const uint8_t MISO = 34;
static const uint8_t SCK = 18;
static const uint8_t G26 = 26;
static const uint8_t G36 = 36;
static const uint8_t G25 = 25;
static const uint8_t G32 = 32;
static const uint8_t G33 = 33;
static const uint8_t G21 = 21;
static const uint8_t G22 = 22;
static const uint8_t G13 = 13;
static const uint8_t G14 = 14;
static const uint8_t G12 = 12;
static const uint8_t G19 = 19;
static const uint8_t G5 = 5;
static const uint8_t G10 = 10;
static const uint8_t G2 = 2;
static const uint8_t G37 = 37;
static const uint8_t G38 = 38;
static const uint8_t G39 = 39;
static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;
static const uint8_t ADC1 = 35;
static const uint8_t ADC2 = 36;
#endif /* Pins_Arduino_h */

View File

@@ -1,4 +1,4 @@
[VERSION]
major = 1
minor = 3
build = 20
build = 27