mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-02 08:00:38 +00:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75281e8c97 | ||
|
|
8d47e4f3e0 | ||
|
|
92124e1224 | ||
|
|
c798c0032c | ||
|
|
2c5ea03b74 | ||
|
|
9d452ebf29 | ||
|
|
8a20155214 | ||
|
|
6a872b6ac2 | ||
|
|
52d61acc23 | ||
|
|
2594ea0c2c | ||
|
|
9623be1484 | ||
|
|
d810ce0c1e | ||
|
|
efd39c0f49 | ||
|
|
5f45a10db5 | ||
|
|
5f948c09fe | ||
|
|
22f3efd083 | ||
|
|
88716fc352 | ||
|
|
5c1d8b5bb0 | ||
|
|
b68397a911 | ||
|
|
5fdcb72d46 | ||
|
|
b70a359fe8 | ||
|
|
a9c8564524 | ||
|
|
b527e0d447 | ||
|
|
d8669f860a | ||
|
|
78f104c6de | ||
|
|
2f8e663f03 | ||
|
|
7f7b07ce9d | ||
|
|
cdb4756d9d |
6
.github/workflows/main.yml
vendored
6
.github/workflows/main.yml
vendored
@@ -22,9 +22,6 @@ jobs:
|
|||||||
- name: Install extra python tools
|
- name: Install extra python tools
|
||||||
run: |
|
run: |
|
||||||
pip install -U adafruit-nrfutil
|
pip install -U adafruit-nrfutil
|
||||||
- name: Install libs needed for linux build
|
|
||||||
run: |
|
|
||||||
sudo apt install -y libpsocksxx-dev
|
|
||||||
- name: Build for tbeam
|
- name: Build for tbeam
|
||||||
run: platformio run -e tbeam
|
run: platformio run -e tbeam
|
||||||
- name: Build for heltec
|
- name: Build for heltec
|
||||||
@@ -36,6 +33,7 @@ jobs:
|
|||||||
- name: Integration test
|
- name: Integration test
|
||||||
run: |
|
run: |
|
||||||
.pio/build/native/program &
|
.pio/build/native/program &
|
||||||
sleep 1
|
sleep 5
|
||||||
|
echo "Simulator started, launching python test..."
|
||||||
python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
|
python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
|
||||||
|
|
||||||
|
|||||||
30
.idea/workspace.xml
generated
30
.idea/workspace.xml
generated
@@ -15,16 +15,13 @@
|
|||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="58922733-b05b-4b90-9655-b9b18914977a" name="Default Changelist" comment="">
|
<list default="true" id="58922733-b05b-4b90-9655-b9b18914977a" name="Default Changelist" comment="">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/docs/software/TODO.md" beforeDir="false" afterPath="$PROJECT_DIR$/docs/software/TODO.md" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/platformio.ini" beforeDir="false" afterPath="$PROJECT_DIR$/platformio.ini" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/proto" beforeDir="false" afterPath="$PROJECT_DIR$/proto" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/src/mesh/generated/mesh.pb.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/mesh/generated/mesh.pb.h" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ExecutionTargetManager" SELECTED_TARGET="CMakeBuildProfile:native" />
|
|
||||||
<component name="Git.Settings">
|
<component name="Git.Settings">
|
||||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
</component>
|
</component>
|
||||||
@@ -49,7 +46,7 @@
|
|||||||
<property name="node.js.selected.package.tslint" value="(autodetect)" />
|
<property name="node.js.selected.package.tslint" value="(autodetect)" />
|
||||||
<property name="settings.editor.selected.configurable" value="CMakeSettings" />
|
<property name="settings.editor.selected.configurable" value="CMakeSettings" />
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="PlatformIO.PlatformIO Upload">
|
<component name="RunManager" selected="GDB Remote Debug.gdbremote-localhost-2345">
|
||||||
<configuration default="true" type="CLion_Remote" version="1" remoteCommand="tcp:localhost:2345" symbolFile="" sysroot="">
|
<configuration default="true" type="CLion_Remote" version="1" remoteCommand="tcp:localhost:2345" symbolFile="" sysroot="">
|
||||||
<debugger kind="GDB" isBundled="true" />
|
<debugger kind="GDB" isBundled="true" />
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
@@ -63,9 +60,9 @@
|
|||||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration default="true" type="GradleAppRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" PASS_PARENT_ENVS_2="true">
|
<configuration default="true" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" PASS_PARENT_ENVS_2="true">
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="com.jetbrains.cidr.cpp.gradle.execution.GradleNativeBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration name="PlatformIO Debug" type="platformio" factoryName="PlatformIO Debug" REDIRECT_INPUT="false" ELEVATE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="meshtastic-esp32" TARGET_NAME="Debug" CONFIG_NAME="native" RUN_TARGET_PROJECT_NAME="meshtastic-esp32" RUN_TARGET_NAME="Debug">
|
<configuration name="PlatformIO Debug" type="platformio" factoryName="PlatformIO Debug" REDIRECT_INPUT="false" ELEVATE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="meshtastic-esp32" TARGET_NAME="Debug" CONFIG_NAME="native" RUN_TARGET_PROJECT_NAME="meshtastic-esp32" RUN_TARGET_NAME="Debug">
|
||||||
@@ -96,6 +93,10 @@
|
|||||||
<workItem from="1615788663210" duration="6661000" />
|
<workItem from="1615788663210" duration="6661000" />
|
||||||
<workItem from="1615938346019" duration="1208000" />
|
<workItem from="1615938346019" duration="1208000" />
|
||||||
<workItem from="1615971126983" duration="5945000" />
|
<workItem from="1615971126983" duration="5945000" />
|
||||||
|
<workItem from="1617115374907" duration="357000" />
|
||||||
|
<workItem from="1617115747078" duration="1391000" />
|
||||||
|
<workItem from="1617117632667" duration="307000" />
|
||||||
|
<workItem from="1617160691713" duration="1016000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
@@ -117,18 +118,23 @@
|
|||||||
<component name="XDebuggerManager">
|
<component name="XDebuggerManager">
|
||||||
<breakpoint-manager>
|
<breakpoint-manager>
|
||||||
<breakpoints>
|
<breakpoints>
|
||||||
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
|
|
||||||
<url>file://$PROJECT_DIR$/src/mesh/StreamAPI.cpp</url>
|
|
||||||
<line>20</line>
|
|
||||||
<option name="timeStamp" value="4" />
|
|
||||||
</line-breakpoint>
|
|
||||||
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
|
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
|
||||||
<url>file://$PROJECT_DIR$/src/mesh/wifi/WiFiServerAPI.cpp</url>
|
<url>file://$PROJECT_DIR$/src/mesh/wifi/WiFiServerAPI.cpp</url>
|
||||||
<line>53</line>
|
<line>53</line>
|
||||||
<option name="timeStamp" value="6" />
|
<option name="timeStamp" value="6" />
|
||||||
</line-breakpoint>
|
</line-breakpoint>
|
||||||
|
<line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
|
||||||
|
<url>file://$PROJECT_DIR$/src/mesh/wifi/WiFiServerAPI.cpp</url>
|
||||||
|
<line>37</line>
|
||||||
|
<option name="timeStamp" value="7" />
|
||||||
|
</line-breakpoint>
|
||||||
</breakpoints>
|
</breakpoints>
|
||||||
</breakpoint-manager>
|
</breakpoint-manager>
|
||||||
|
<watches-manager>
|
||||||
|
<configuration name="CLion_Remote">
|
||||||
|
<watch expression="radioConfig" language="ObjectiveC" />
|
||||||
|
</configuration>
|
||||||
|
</watches-manager>
|
||||||
</component>
|
</component>
|
||||||
<component name="XSLT-Support.FileAssociations.UIState">
|
<component name="XSLT-Support.FileAssociations.UIState">
|
||||||
<expand />
|
<expand />
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
set -e
|
set -e
|
||||||
pio run --environment native
|
pio run --environment native
|
||||||
gdbserver --once localhost:2345 .pio/build/native/program
|
gdbserver --once localhost:2345 .pio/build/native/program "$@"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
set -e
|
set -e
|
||||||
pio run --environment native
|
pio run --environment native
|
||||||
.pio/build/native/program
|
.pio/build/native/program "$@"
|
||||||
|
|||||||
@@ -4,9 +4,23 @@ You probably don't care about this section - skip to the next one.
|
|||||||
|
|
||||||
## before next release
|
## before next release
|
||||||
|
|
||||||
|
* fix heltec battery scaling
|
||||||
|
* DONE remote admin busted?
|
||||||
|
* DONE check android code - @havealoha comments about odd sleep behavior
|
||||||
|
* ABANDONED test github actions locally on linux
|
||||||
|
* DONE fix github actions per sasha tip
|
||||||
|
* tell ttgo to preinstall new bins
|
||||||
|
* DONE sendtext busted in portduino, due to bytetime calculations
|
||||||
|
* remove linux dependency in native build
|
||||||
|
* DONE tcp stream problem in python+pordtuino, server thinks client dropped when client DID NOT DROP
|
||||||
|
* DONE TCP mode for android, localhost is at 10.0.2.2
|
||||||
|
* make sure USB still works in android
|
||||||
|
* add portduino builds to zip
|
||||||
|
* add license to portduino and make announcement
|
||||||
* DONE naks are being dropped (though enqueuedLocal) sometimes before phone/PC gets them
|
* DONE naks are being dropped (though enqueuedLocal) sometimes before phone/PC gets them
|
||||||
* DONE have android fill in if local GPS has poor signal
|
* DONE have android fill in if local GPS has poor signal
|
||||||
* fix heltec battery scaling
|
* optionally restrict position sends to a named channel
|
||||||
|
* release to beta and amazon
|
||||||
* add reference counting to mesh packets
|
* add reference counting to mesh packets
|
||||||
* allow multiple simultanteous phoneapi connections
|
* allow multiple simultanteous phoneapi connections
|
||||||
* DONE split position.time and last_heard
|
* DONE split position.time and last_heard
|
||||||
@@ -38,6 +52,12 @@ You probably don't care about this section - skip to the next one.
|
|||||||
|
|
||||||
## MQTT
|
## MQTT
|
||||||
|
|
||||||
|
* mqtt.meshtastic.org should have VERY basic auth at launch (to prevent abuse)
|
||||||
|
* use MQTT for simulator mesh network
|
||||||
|
* do initial development inside of portduino
|
||||||
|
* do as much possible on the device side (so we can eventually just have ESP32 talk directly to server)
|
||||||
|
* eventually add a MQTTPacket on the ToRadio & FromRadio links
|
||||||
|
|
||||||
## Multichannel support
|
## Multichannel support
|
||||||
|
|
||||||
* DONE cleanup the external notification and serial plugins
|
* DONE cleanup the external notification and serial plugins
|
||||||
@@ -120,7 +140,7 @@ You probably don't care about this section - skip to the next one.
|
|||||||
* DONE make all subpackets different versions of data
|
* DONE make all subpackets different versions of data
|
||||||
* DONE move routing control into a data packet
|
* DONE move routing control into a data packet
|
||||||
* have phoneapi done via plugin (will allow multiple simultaneous API clients - stop disabling BLE while using phone API)
|
* have phoneapi done via plugin (will allow multiple simultaneous API clients - stop disabling BLE while using phone API)
|
||||||
* use reference counting and dynamic sizing for meshpackets.
|
* use reference counting and dynamic sizing for meshpackets. - use https://docs.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-shared-ptr-instances?view=msvc-160 (already used in arduino)
|
||||||
* let multiple PhoneAPI endpoints work at once
|
* let multiple PhoneAPI endpoints work at once
|
||||||
* allow multiple simultaneous bluetooth connections (create the bluetooth phoneapi instance dynamically based on client id)
|
* allow multiple simultaneous bluetooth connections (create the bluetooth phoneapi instance dynamically based on client id)
|
||||||
* DONE figure out how to add micro_delta to position, make it so that phone apps don't need to understand it?
|
* DONE figure out how to add micro_delta to position, make it so that phone apps don't need to understand it?
|
||||||
@@ -138,6 +158,7 @@ You probably don't care about this section - skip to the next one.
|
|||||||
|
|
||||||
For app cleanup:
|
For app cleanup:
|
||||||
|
|
||||||
|
* don't store redundant User admin or position broadcasts in the ToPhone queue (only keep one per sending node per proto type, and only most recent)
|
||||||
* use structured logging to kep logs in ram. Also send logs as packets to api clients
|
* use structured logging to kep logs in ram. Also send logs as packets to api clients
|
||||||
* DONE writeup nice python options docs (common cases, link to protobuf docs)
|
* DONE writeup nice python options docs (common cases, link to protobuf docs)
|
||||||
* have android app link to user manual
|
* have android app link to user manual
|
||||||
|
|||||||
10
docs/software/running-github-actions.md
Normal file
10
docs/software/running-github-actions.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Running github actions locally
|
||||||
|
|
||||||
|
If you'd like to run the **same** integration tests we run on github but on your own machine, you can do the following.
|
||||||
|
|
||||||
|
1. Install homebrew per https://brew.sh/
|
||||||
|
2. Install https://github.com/nektos/act with "brew install act"
|
||||||
|
3. cd into meshtastic-device and run "act"
|
||||||
|
4. Select a "medium" sized image
|
||||||
|
5. Alas - this "act" build **almost** works, but fails because it can't find lib/nanopb/include/pb.h! So someone (you the reader? @geeksville ays hopefully...) needs to fix that before these instructions are complete.
|
||||||
|
6.
|
||||||
@@ -40,7 +40,7 @@ extra_scripts = bin/platformio-custom.py
|
|||||||
; FIXME: fix lib/BluetoothOTA dependency back on src/ so we can remove -Isrc
|
; FIXME: fix lib/BluetoothOTA dependency back on src/ so we can remove -Isrc
|
||||||
build_flags = -Wno-missing-field-initializers
|
build_flags = -Wno-missing-field-initializers
|
||||||
-Wno-format
|
-Wno-format
|
||||||
-Isrc -Isrc/mesh -Isrc/gps -Ilib/nanopb/include -Isrc/buzz -Wl,-Map,.pio/build/output.map
|
-Isrc -Isrc/mesh -Isrc/gps -Isrc/buzz -Wl,-Map,.pio/build/output.map
|
||||||
-DHW_VERSION_${sysenv.COUNTRY}
|
-DHW_VERSION_${sysenv.COUNTRY}
|
||||||
-DHW_VERSION=${sysenv.HW_VERSION}
|
-DHW_VERSION=${sysenv.HW_VERSION}
|
||||||
-DUSE_THREAD_NAMES
|
-DUSE_THREAD_NAMES
|
||||||
@@ -68,7 +68,7 @@ lib_deps =
|
|||||||
https://github.com/meshtastic/esp8266-oled-ssd1306.git#35d796226b853b0c0ff818b2f1aa3d35e7296a96 ; ESP8266_SSD1306
|
https://github.com/meshtastic/esp8266-oled-ssd1306.git#35d796226b853b0c0ff818b2f1aa3d35e7296a96 ; ESP8266_SSD1306
|
||||||
https://github.com/geeksville/OneButton.git ; OneButton library for non-blocking button debounce
|
https://github.com/geeksville/OneButton.git ; OneButton library for non-blocking button debounce
|
||||||
1202 ; CRC32, explicitly needed because dependency is missing in the ble ota update lib
|
1202 ; CRC32, explicitly needed because dependency is missing in the ble ota update lib
|
||||||
https://github.com/meshtastic/arduino-fsm.git#55c47b6cded91645aff05a27b6e5821d8d0f64be
|
https://github.com/meshtastic/arduino-fsm.git#829e967b8a95c094f73c60ef8dacfe66eae38940
|
||||||
https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad
|
https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad
|
||||||
https://github.com/meshtastic/RadioLib.git#07de964e929238949035fb0d5887026a3058df1a
|
https://github.com/meshtastic/RadioLib.git#07de964e929238949035fb0d5887026a3058df1a
|
||||||
https://github.com/meshtastic/TinyGPSPlus.git#f0f47067ef2f67c856475933188251c1ef615e79
|
https://github.com/meshtastic/TinyGPSPlus.git#f0f47067ef2f67c856475933188251c1ef615e79
|
||||||
@@ -110,7 +110,7 @@ lib_deps =
|
|||||||
# board_build.ldscript = linker/esp32.extram.bss.ld
|
# board_build.ldscript = linker/esp32.extram.bss.ld
|
||||||
lib_ignore = segger_rtt
|
lib_ignore = segger_rtt
|
||||||
platform_packages =
|
platform_packages =
|
||||||
framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#352c8ea7cb73f10433ed139f34251979c470ad56
|
framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#4cde0f5d412d2695184f32e8a47e9bea57b45276
|
||||||
|
|
||||||
; leave this commented out to avoid breaking Windows
|
; leave this commented out to avoid breaking Windows
|
||||||
upload_port = /dev/ttyUSB0
|
upload_port = /dev/ttyUSB0
|
||||||
|
|||||||
2
proto
2
proto
Submodule proto updated: 0ea2328026...2aa1439214
@@ -40,7 +40,7 @@ bool scheduleHWCallback(PendableFunction callback, void *param1, uint32_t param2
|
|||||||
tParam1 = param1;
|
tParam1 = param1;
|
||||||
tParam2 = param2;
|
tParam2 = param2;
|
||||||
|
|
||||||
timerAlarmWrite(timer, delayMsec * 1000L, false); // Do not reload, we want it to be a single shot timer
|
timerAlarmWrite(timer, delayMsec * 1000UL, false); // Do not reload, we want it to be a single shot timer
|
||||||
timerRestart(timer);
|
timerRestart(timer);
|
||||||
timerAlarmEnable(timer);
|
timerAlarmEnable(timer);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -303,7 +303,9 @@ void PowerFSM_setup()
|
|||||||
#ifndef NRF52_SERIES
|
#ifndef NRF52_SERIES
|
||||||
// We never enter light-sleep or NB states on NRF52 (because the CPU uses so little power normally)
|
// We never enter light-sleep or NB states on NRF52 (because the CPU uses so little power normally)
|
||||||
|
|
||||||
powerFSM.add_timed_transition(&stateDARK, &stateNB, getPref_phone_timeout_secs() * 1000, NULL, "Phone timeout");
|
// I don't think this transition is correct, turning off for now - @geeksville
|
||||||
|
// powerFSM.add_timed_transition(&stateDARK, &stateNB, getPref_phone_timeout_secs() * 1000, NULL, "Phone timeout");
|
||||||
|
|
||||||
powerFSM.add_timed_transition(&stateNB, &stateLS, getPref_min_wake_secs() * 1000, NULL, "Min wake timeout");
|
powerFSM.add_timed_transition(&stateNB, &stateLS, getPref_min_wake_secs() * 1000, NULL, "Min wake timeout");
|
||||||
powerFSM.add_timed_transition(&stateDARK, &stateLS, getPref_wait_bluetooth_secs() * 1000, NULL, "Bluetooth timeout");
|
powerFSM.add_timed_transition(&stateDARK, &stateLS, getPref_wait_bluetooth_secs() * 1000, NULL, "Bluetooth timeout");
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ size_t RedirectablePrint::vprintf(const char *format, va_list arg)
|
|||||||
va_end(arg);
|
va_end(arg);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
if (len >= printBufLen) {
|
if (len >= (int)printBufLen) {
|
||||||
delete[] printBuf;
|
delete[] printBuf;
|
||||||
printBufLen *= 2;
|
printBufLen *= 2;
|
||||||
printBuf = new char[printBufLen];
|
printBuf = new char[printBufLen];
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "../freertosinc.h"
|
#include "../freertosinc.h"
|
||||||
|
|
||||||
namespace concurrency
|
namespace concurrency
|
||||||
@@ -28,4 +27,4 @@ class BinarySemaphorePosix
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
} // namespace concurrency
|
||||||
@@ -39,7 +39,7 @@ bool perhapsSetRTC(RTCQuality q, const struct timeval *tv)
|
|||||||
currentQuality = q;
|
currentQuality = q;
|
||||||
shouldSet = true;
|
shouldSet = true;
|
||||||
DEBUG_MSG("Upgrading time to RTC %ld secs (quality %d)\n", tv->tv_sec, q);
|
DEBUG_MSG("Upgrading time to RTC %ld secs (quality %d)\n", tv->tv_sec, q);
|
||||||
} else if(q == RTCQualityGPS && (now - lastSetMsec) > (12 * 60 * 60 * 1000L)) {
|
} else if(q == RTCQualityGPS && (now - lastSetMsec) > (12 * 60 * 60 * 1000UL)) {
|
||||||
// Every 12 hrs we will slam in a new GPS time, to correct for local RTC clock drift
|
// Every 12 hrs we will slam in a new GPS time, to correct for local RTC clock drift
|
||||||
shouldSet = true;
|
shouldSet = true;
|
||||||
DEBUG_MSG("Reapplying external time to correct clock drift %ld secs\n", tv->tv_sec);
|
DEBUG_MSG("Reapplying external time to correct clock drift %ld secs\n", tv->tv_sec);
|
||||||
|
|||||||
@@ -317,7 +317,9 @@ void setup()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_PORT
|
#ifdef DEBUG_PORT
|
||||||
consoleInit(); // Set serial baud rate and init our mesh console
|
if (!radioConfig.preferences.serial_disabled) {
|
||||||
|
consoleInit(); // Set serial baud rate and init our mesh console
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
initDeepSleep();
|
initDeepSleep();
|
||||||
|
|||||||
@@ -15,7 +15,10 @@
|
|||||||
#error ToRadio is too big
|
#error ToRadio is too big
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PhoneAPI::PhoneAPI() {}
|
PhoneAPI::PhoneAPI()
|
||||||
|
{
|
||||||
|
lastContactMsec = millis();
|
||||||
|
}
|
||||||
|
|
||||||
PhoneAPI::~PhoneAPI()
|
PhoneAPI::~PhoneAPI()
|
||||||
{
|
{
|
||||||
@@ -53,9 +56,12 @@ void PhoneAPI::close()
|
|||||||
void PhoneAPI::checkConnectionTimeout()
|
void PhoneAPI::checkConnectionTimeout()
|
||||||
{
|
{
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
bool newConnected = (millis() - lastContactMsec < getPref_phone_timeout_secs() * 1000L);
|
uint32_t now = millis();
|
||||||
if (!newConnected)
|
bool newContact = (now - lastContactMsec) < getPref_phone_timeout_secs() * 1000UL;
|
||||||
|
if (!newContact) {
|
||||||
|
DEBUG_MSG("Timed out on phone contact, dropping phone connection\n");
|
||||||
close();
|
close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,6 @@ bool RF95Interface::init()
|
|||||||
{
|
{
|
||||||
RadioLibInterface::init();
|
RadioLibInterface::init();
|
||||||
|
|
||||||
applyModemConfig();
|
|
||||||
|
|
||||||
if (power == 0)
|
if (power == 0)
|
||||||
power = POWER_DEFAULT;
|
power = POWER_DEFAULT;
|
||||||
|
|
||||||
@@ -86,24 +84,25 @@ void INTERRUPT_ATTR RF95Interface::disableInterrupt()
|
|||||||
lora->clearDio0Action();
|
lora->clearDio0Action();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool RF95Interface::reconfigure()
|
bool RF95Interface::reconfigure()
|
||||||
{
|
{
|
||||||
applyModemConfig();
|
RadioLibInterface::reconfigure();
|
||||||
|
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
setStandby();
|
setStandby();
|
||||||
|
|
||||||
// configure publicly accessible settings
|
// configure publicly accessible settings
|
||||||
int err = lora->setSpreadingFactor(sf);
|
int err = lora->setSpreadingFactor(sf);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
err = lora->setBandwidth(bw);
|
err = lora->setBandwidth(bw);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
err = lora->setCodingRate(cr);
|
err = lora->setCodingRate(cr);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
err = lora->setSyncWord(syncWord);
|
err = lora->setSyncWord(syncWord);
|
||||||
assert(err == ERR_NONE);
|
assert(err == ERR_NONE);
|
||||||
@@ -115,12 +114,14 @@ bool RF95Interface::reconfigure()
|
|||||||
assert(err == ERR_NONE);
|
assert(err == ERR_NONE);
|
||||||
|
|
||||||
err = lora->setFrequency(freq);
|
err = lora->setFrequency(freq);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
if (power > MAX_POWER) // This chip has lower power limits than some
|
if (power > MAX_POWER) // This chip has lower power limits than some
|
||||||
power = MAX_POWER;
|
power = MAX_POWER;
|
||||||
err = lora->setOutputPower(power);
|
err = lora->setOutputPower(power);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
startReceive(); // restart receiving
|
startReceive(); // restart receiving
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "RadioInterface.h"
|
#include "RadioInterface.h"
|
||||||
#include "Channels.h"
|
#include "Channels.h"
|
||||||
#include "MeshRadio.h"
|
#include "MeshRadio.h"
|
||||||
#include "MeshService.h"
|
#include "MeshService.h"
|
||||||
#include "NodeDB.h"
|
#include "NodeDB.h"
|
||||||
#include "assert.h"
|
|
||||||
#include "Router.h"
|
#include "Router.h"
|
||||||
|
#include "assert.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <pb_decode.h>
|
#include <pb_decode.h>
|
||||||
@@ -31,8 +31,8 @@ const RegionInfo regions[] = {
|
|||||||
|
|
||||||
/* Notes about the RU bandplan (from @denis-d in https://meshtastic.discourse.group/t/russian-band-plan-proposal/2786/2):
|
/* Notes about the RU bandplan (from @denis-d in https://meshtastic.discourse.group/t/russian-band-plan-proposal/2786/2):
|
||||||
|
|
||||||
According to Annex 12 to GKRCh (National Radio Frequency Commission) decision № 18-46-03-1 (September 11th 2018) https://digital.gov.ru/uploaded/files/prilozhenie-12-k-reshenyu-gkrch-18-46-03-1.pdf 1
|
According to Annex 12 to GKRCh (National Radio Frequency Commission) decision № 18-46-03-1 (September 11th 2018)
|
||||||
We have 3 options for 868 MHz:
|
https://digital.gov.ru/uploaded/files/prilozhenie-12-k-reshenyu-gkrch-18-46-03-1.pdf 1 We have 3 options for 868 MHz:
|
||||||
|
|
||||||
864,0 - 865,0 MHz ERP 25mW, Duty Cycle 0.1% (3.6 sec in hour) or LBT (Listen Before Talk), prohibited in airports.
|
864,0 - 865,0 MHz ERP 25mW, Duty Cycle 0.1% (3.6 sec in hour) or LBT (Listen Before Talk), prohibited in airports.
|
||||||
866,0 - 868,0 MHz ERP 25mW, Duty Cycle 1% or LBT, PSD (Power Spectrum Density) 1000mW/MHz, prohibited in airports
|
866,0 - 868,0 MHz ERP 25mW, Duty Cycle 1% or LBT, PSD (Power Spectrum Density) 1000mW/MHz, prohibited in airports
|
||||||
@@ -112,6 +112,8 @@ uint32_t RadioInterface::getPacketTime(MeshPacket *p)
|
|||||||
/** The delay to use for retransmitting dropped packets */
|
/** The delay to use for retransmitting dropped packets */
|
||||||
uint32_t RadioInterface::getRetransmissionMsec(const MeshPacket *p)
|
uint32_t RadioInterface::getRetransmissionMsec(const MeshPacket *p)
|
||||||
{
|
{
|
||||||
|
assert(shortPacketMsec); // Better be non zero
|
||||||
|
|
||||||
// was 20 and 22 secs respectively, but now with shortPacketMsec as 2269, this should give the same range
|
// was 20 and 22 secs respectively, but now with shortPacketMsec as 2269, this should give the same range
|
||||||
return random(9 * shortPacketMsec, 10 * shortPacketMsec);
|
return random(9 * shortPacketMsec, 10 * shortPacketMsec);
|
||||||
}
|
}
|
||||||
@@ -153,7 +155,7 @@ void printPacket(const char *prefix, const MeshPacket *p)
|
|||||||
if (s.dest != 0)
|
if (s.dest != 0)
|
||||||
DEBUG_MSG(" dest=%08x", s.dest);
|
DEBUG_MSG(" dest=%08x", s.dest);
|
||||||
|
|
||||||
if(s.request_id)
|
if (s.request_id)
|
||||||
DEBUG_MSG(" requestId=%0x", s.request_id);
|
DEBUG_MSG(" requestId=%0x", s.request_id);
|
||||||
|
|
||||||
/* now inside Data and therefore kinda opaque
|
/* now inside Data and therefore kinda opaque
|
||||||
@@ -185,6 +187,12 @@ RadioInterface::RadioInterface()
|
|||||||
// DEBUG_MSG("Set meshradio defaults name=%s\n", channelSettings.name);
|
// DEBUG_MSG("Set meshradio defaults name=%s\n", channelSettings.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RadioInterface::reconfigure()
|
||||||
|
{
|
||||||
|
applyModemConfig();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool RadioInterface::init()
|
bool RadioInterface::init()
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Starting meshradio init...\n");
|
DEBUG_MSG("Starting meshradio init...\n");
|
||||||
@@ -197,6 +205,8 @@ bool RadioInterface::init()
|
|||||||
// radioIf.setThisAddress(nodeDB.getNodeNum()); // Note: we must do this here, because the nodenum isn't inited at constructor
|
// radioIf.setThisAddress(nodeDB.getNodeNum()); // Note: we must do this here, because the nodenum isn't inited at constructor
|
||||||
// time.
|
// time.
|
||||||
|
|
||||||
|
applyModemConfig();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,7 +319,7 @@ void RadioInterface::applyModemConfig()
|
|||||||
// If user has manually specified a channel num, then use that, otherwise generate one by hashing the name
|
// 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());
|
const char *channelName = channels.getName(channels.getPrimaryIndex());
|
||||||
int channel_num = channelSettings.channel_num ? channelSettings.channel_num - 1 : hash(channelName) % myRegion->numChannels;
|
int channel_num = channelSettings.channel_num ? channelSettings.channel_num - 1 : hash(channelName) % myRegion->numChannels;
|
||||||
freq = myRegion->freq + myRegion->spacing * channel_num;
|
freq = myRegion->freq + radioConfig.preferences.frequency_offset + myRegion->spacing * channel_num;
|
||||||
|
|
||||||
DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, power=%d\n", channelName, channelSettings.modem_config, channel_num, power);
|
DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, power=%d\n", channelName, channelSettings.modem_config, channel_num, power);
|
||||||
DEBUG_MSG("Radio myRegion->freq: %f\n", myRegion->freq);
|
DEBUG_MSG("Radio myRegion->freq: %f\n", myRegion->freq);
|
||||||
|
|||||||
@@ -104,7 +104,11 @@ class RadioInterface
|
|||||||
virtual bool sleep() { return true; }
|
virtual bool sleep() { return true; }
|
||||||
|
|
||||||
/// Disable this interface (while disabled, no packets can be sent or received)
|
/// Disable this interface (while disabled, no packets can be sent or received)
|
||||||
void disable() { disabled = true; sleep(); }
|
void disable()
|
||||||
|
{
|
||||||
|
disabled = true;
|
||||||
|
sleep();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a packet (possibly by enquing in a private fifo). This routine will
|
* Send a packet (possibly by enquing in a private fifo). This routine will
|
||||||
@@ -126,7 +130,7 @@ class RadioInterface
|
|||||||
/// Apply any radio provisioning changes
|
/// Apply any radio provisioning changes
|
||||||
/// Make sure the Driver is properly configured before calling init().
|
/// Make sure the Driver is properly configured before calling init().
|
||||||
/// \return true if initialisation succeeded.
|
/// \return true if initialisation succeeded.
|
||||||
virtual bool reconfigure() = 0;
|
virtual bool reconfigure();
|
||||||
|
|
||||||
/** The delay to use for retransmitting dropped packets */
|
/** The delay to use for retransmitting dropped packets */
|
||||||
uint32_t getRetransmissionMsec(const MeshPacket *p);
|
uint32_t getRetransmissionMsec(const MeshPacket *p);
|
||||||
@@ -174,13 +178,6 @@ class RadioInterface
|
|||||||
*/
|
*/
|
||||||
void limitPower();
|
void limitPower();
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert our modemConfig enum into wf, sf, etc...
|
|
||||||
*
|
|
||||||
* These paramaters will be pull from the channelSettings global
|
|
||||||
*/
|
|
||||||
virtual void applyModemConfig();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save the frequency we selected for later reuse.
|
* Save the frequency we selected for later reuse.
|
||||||
*/
|
*/
|
||||||
@@ -192,6 +189,13 @@ class RadioInterface
|
|||||||
virtual void saveChannelNum(uint32_t savedChannelNum);
|
virtual void saveChannelNum(uint32_t savedChannelNum);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* Convert our modemConfig enum into wf, sf, etc...
|
||||||
|
*
|
||||||
|
* These paramaters will be pull from the channelSettings global
|
||||||
|
*/
|
||||||
|
void applyModemConfig();
|
||||||
|
|
||||||
/// Return 0 if sleep is okay
|
/// Return 0 if sleep is okay
|
||||||
int preflightSleepCb(void *unused = NULL) { return canSleep() ? 0 : 1; }
|
int preflightSleepCb(void *unused = NULL) { return canSleep() ? 0 : 1; }
|
||||||
|
|
||||||
@@ -208,18 +212,6 @@ class SimRadio : public RadioInterface
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ErrorCode send(MeshPacket *p);
|
virtual ErrorCode send(MeshPacket *p);
|
||||||
|
|
||||||
// methods from radiohead
|
|
||||||
|
|
||||||
/// Initialise the Driver transport hardware and software.
|
|
||||||
/// Make sure the Driver is properly configured before calling init().
|
|
||||||
/// \return true if initialisation succeeded.
|
|
||||||
virtual bool init() { return true; }
|
|
||||||
|
|
||||||
/// Apply any radio provisioning changes
|
|
||||||
/// Make sure the Driver is properly configured before calling init().
|
|
||||||
/// \return true if initialisation succeeded.
|
|
||||||
virtual bool reconfigure() { return true; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Debug printing for packets
|
/// Debug printing for packets
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ bool SX1262Interface::init()
|
|||||||
pinMode(SX1262_POWER_EN, OUTPUT);
|
pinMode(SX1262_POWER_EN, OUTPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RadioLibInterface::init();
|
|
||||||
|
|
||||||
#ifdef SX1262_RXEN // set not rx or tx mode
|
#ifdef SX1262_RXEN // set not rx or tx mode
|
||||||
digitalWrite(SX1262_RXEN, LOW); // Set low before becoming an output
|
digitalWrite(SX1262_RXEN, LOW); // Set low before becoming an output
|
||||||
pinMode(SX1262_RXEN, OUTPUT);
|
pinMode(SX1262_RXEN, OUTPUT);
|
||||||
@@ -38,11 +36,11 @@ bool SX1262Interface::init()
|
|||||||
float tcxoVoltage = 0; // None - we use an XTAL
|
float tcxoVoltage = 0; // None - we use an XTAL
|
||||||
#else
|
#else
|
||||||
// Use DIO3 to power tcxo per https://github.com/jgromes/RadioLib/issues/12#issuecomment-520695575
|
// Use DIO3 to power tcxo per https://github.com/jgromes/RadioLib/issues/12#issuecomment-520695575
|
||||||
float tcxoVoltage = 1.8;
|
float tcxoVoltage = 1.8;
|
||||||
#endif
|
#endif
|
||||||
bool useRegulatorLDO = false; // Seems to depend on the connection to pin 9/DCC_SW - if an inductor DCDC?
|
bool useRegulatorLDO = false; // Seems to depend on the connection to pin 9/DCC_SW - if an inductor DCDC?
|
||||||
|
|
||||||
applyModemConfig();
|
RadioLibInterface::init();
|
||||||
|
|
||||||
if (power == 0)
|
if (power == 0)
|
||||||
power = SX1262_MAX_POWER;
|
power = SX1262_MAX_POWER;
|
||||||
@@ -72,20 +70,23 @@ bool SX1262Interface::init()
|
|||||||
|
|
||||||
bool SX1262Interface::reconfigure()
|
bool SX1262Interface::reconfigure()
|
||||||
{
|
{
|
||||||
applyModemConfig();
|
RadioLibInterface::reconfigure();
|
||||||
|
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
setStandby();
|
setStandby();
|
||||||
|
|
||||||
// configure publicly accessible settings
|
// configure publicly accessible settings
|
||||||
int err = lora.setSpreadingFactor(sf);
|
int err = lora.setSpreadingFactor(sf);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
err = lora.setBandwidth(bw);
|
err = lora.setBandwidth(bw);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
err = lora.setCodingRate(cr);
|
err = lora.setCodingRate(cr);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
// Hmm - seems to lower SNR when the signal levels are high. Leaving off for now...
|
// Hmm - seems to lower SNR when the signal levels are high. Leaving off for now...
|
||||||
err = lora.setRxGain(true);
|
err = lora.setRxGain(true);
|
||||||
@@ -101,7 +102,8 @@ bool SX1262Interface::reconfigure()
|
|||||||
assert(err == ERR_NONE);
|
assert(err == ERR_NONE);
|
||||||
|
|
||||||
err = lora.setFrequency(freq);
|
err = lora.setFrequency(freq);
|
||||||
if(err != ERR_NONE) recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
if (err != ERR_NONE)
|
||||||
|
recordCriticalError(CriticalErrorCode_InvalidRadioSetting);
|
||||||
|
|
||||||
if (power > 22) // This chip has lower power limits than some
|
if (power > 22) // This chip has lower power limits than some
|
||||||
power = 22;
|
power = 22;
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ extern const pb_msgdesc_t AdminMessage_msg;
|
|||||||
#define AdminMessage_fields &AdminMessage_msg
|
#define AdminMessage_fields &AdminMessage_msg
|
||||||
|
|
||||||
/* Maximum encoded size of messages (where known) */
|
/* Maximum encoded size of messages (where known) */
|
||||||
#define AdminMessage_size 351
|
#define AdminMessage_size 360
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
|||||||
@@ -85,6 +85,8 @@ typedef struct _RadioConfig_UserPreferences {
|
|||||||
bool is_router;
|
bool is_router;
|
||||||
bool is_low_power;
|
bool is_low_power;
|
||||||
bool fixed_position;
|
bool fixed_position;
|
||||||
|
bool serial_disabled;
|
||||||
|
float frequency_offset;
|
||||||
bool factory_reset;
|
bool factory_reset;
|
||||||
bool debug_log_enabled;
|
bool debug_log_enabled;
|
||||||
pb_size_t ignore_incoming_count;
|
pb_size_t ignore_incoming_count;
|
||||||
@@ -150,9 +152,9 @@ extern "C" {
|
|||||||
|
|
||||||
/* Initializer values for message structs */
|
/* Initializer values for message structs */
|
||||||
#define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default}
|
#define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default}
|
||||||
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0}
|
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0}
|
||||||
#define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero}
|
#define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero}
|
||||||
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0}
|
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, _LocationSharing_MIN, _GpsOperation_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN, 0, 0}
|
||||||
|
|
||||||
/* Field tags (for use in manual encoding/decoding) */
|
/* Field tags (for use in manual encoding/decoding) */
|
||||||
#define RadioConfig_UserPreferences_position_broadcast_secs_tag 1
|
#define RadioConfig_UserPreferences_position_broadcast_secs_tag 1
|
||||||
@@ -177,6 +179,8 @@ extern "C" {
|
|||||||
#define RadioConfig_UserPreferences_is_router_tag 37
|
#define RadioConfig_UserPreferences_is_router_tag 37
|
||||||
#define RadioConfig_UserPreferences_is_low_power_tag 38
|
#define RadioConfig_UserPreferences_is_low_power_tag 38
|
||||||
#define RadioConfig_UserPreferences_fixed_position_tag 39
|
#define RadioConfig_UserPreferences_fixed_position_tag 39
|
||||||
|
#define RadioConfig_UserPreferences_serial_disabled_tag 40
|
||||||
|
#define RadioConfig_UserPreferences_frequency_offset_tag 41
|
||||||
#define RadioConfig_UserPreferences_factory_reset_tag 100
|
#define RadioConfig_UserPreferences_factory_reset_tag 100
|
||||||
#define RadioConfig_UserPreferences_debug_log_enabled_tag 101
|
#define RadioConfig_UserPreferences_debug_log_enabled_tag 101
|
||||||
#define RadioConfig_UserPreferences_ignore_incoming_tag 103
|
#define RadioConfig_UserPreferences_ignore_incoming_tag 103
|
||||||
@@ -237,6 +241,8 @@ X(a, STATIC, SINGULAR, UINT32, gps_attempt_time, 36) \
|
|||||||
X(a, STATIC, SINGULAR, BOOL, is_router, 37) \
|
X(a, STATIC, SINGULAR, BOOL, is_router, 37) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, is_low_power, 38) \
|
X(a, STATIC, SINGULAR, BOOL, is_low_power, 38) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, fixed_position, 39) \
|
X(a, STATIC, SINGULAR, BOOL, fixed_position, 39) \
|
||||||
|
X(a, STATIC, SINGULAR, BOOL, serial_disabled, 40) \
|
||||||
|
X(a, STATIC, SINGULAR, FLOAT, frequency_offset, 41) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, factory_reset, 100) \
|
X(a, STATIC, SINGULAR, BOOL, factory_reset, 100) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, debug_log_enabled, 101) \
|
X(a, STATIC, SINGULAR, BOOL, debug_log_enabled, 101) \
|
||||||
X(a, STATIC, REPEATED, UINT32, ignore_incoming, 103) \
|
X(a, STATIC, REPEATED, UINT32, ignore_incoming, 103) \
|
||||||
@@ -276,8 +282,8 @@ extern const pb_msgdesc_t RadioConfig_UserPreferences_msg;
|
|||||||
#define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg
|
#define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg
|
||||||
|
|
||||||
/* Maximum encoded size of messages (where known) */
|
/* Maximum encoded size of messages (where known) */
|
||||||
#define RadioConfig_size 348
|
#define RadioConfig_size 357
|
||||||
#define RadioConfig_UserPreferences_size 345
|
#define RadioConfig_UserPreferences_size 354
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
|||||||
@@ -1,76 +1,61 @@
|
|||||||
#include "CryptoEngine.h"
|
#include "CryptoEngine.h"
|
||||||
#include "target_specific.h"
|
|
||||||
#include "PortduinoGPIO.h"
|
#include "PortduinoGPIO.h"
|
||||||
#include "mesh/RF95Interface.h"
|
#include "mesh/RF95Interface.h"
|
||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
|
#include "target_specific.h"
|
||||||
|
|
||||||
#include <Utility.h>
|
#include <Utility.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
// FIXME - move getMacAddr/setBluetoothEnable into a HALPlatform class
|
// FIXME - move setBluetoothEnable into a HALPlatform class
|
||||||
|
|
||||||
uint32_t hwId; // fixme move into portduino
|
|
||||||
|
|
||||||
void getMacAddr(uint8_t *dmac)
|
|
||||||
{
|
|
||||||
if (!hwId) {
|
|
||||||
notImplemented("getMacAddr");
|
|
||||||
hwId = random();
|
|
||||||
}
|
|
||||||
|
|
||||||
dmac[0] = 0x80;
|
|
||||||
dmac[1] = 0;
|
|
||||||
dmac[2] = 0;
|
|
||||||
dmac[3] = hwId >> 16;
|
|
||||||
dmac[4] = hwId >> 8;
|
|
||||||
dmac[5] = hwId & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBluetoothEnable(bool on)
|
void setBluetoothEnable(bool on)
|
||||||
{
|
{
|
||||||
// not needed
|
// not needed
|
||||||
}
|
}
|
||||||
|
|
||||||
void cpuDeepSleep(uint64_t msecs) {
|
void cpuDeepSleep(uint64_t msecs)
|
||||||
|
{
|
||||||
notImplemented("cpuDeepSleep");
|
notImplemented("cpuDeepSleep");
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateBatteryLevel(uint8_t level) NOT_IMPLEMENTED("updateBatteryLevel");
|
void updateBatteryLevel(uint8_t level) NOT_IMPLEMENTED("updateBatteryLevel");
|
||||||
|
|
||||||
/** Dear pinetab hardware geeks!
|
/** Dear pinetab hardware geeks!
|
||||||
*
|
*
|
||||||
* The current pinetab lora module has a slight bug. The ch341 part only provides ISR assertions on edges.
|
* The current pinetab lora module has a slight bug. The ch341 part only provides ISR assertions on edges.
|
||||||
* This makes sense because USB interrupts happen through fast/repeated special irq urbs that are constantly
|
* This makes sense because USB interrupts happen through fast/repeated special irq urbs that are constantly
|
||||||
* chattering on the USB bus.
|
* chattering on the USB bus.
|
||||||
*
|
*
|
||||||
* But this isn't sufficient for level triggered ISR sources like the sx127x radios. The common way that seems to
|
* But this isn't sufficient for level triggered ISR sources like the sx127x radios. The common way that seems to
|
||||||
* be addressed by cs341 users is to **always** connect the INT# (pin 26 on the ch341f) signal to one of the GPIO signals
|
* be addressed by cs341 users is to **always** connect the INT# (pin 26 on the ch341f) signal to one of the GPIO signals
|
||||||
* on the part. I'd recommend connecting that LORA_DIO0/INT# line to pin 19 (data 4) on the pinetab board. This would
|
* on the part. I'd recommend connecting that LORA_DIO0/INT# line to pin 19 (data 4) on the pinetab board. This would
|
||||||
* provide an efficent mechanism so that the (kernel) code in the cs341 driver that I've slightly hacked up to see the
|
* provide an efficent mechanism so that the (kernel) code in the cs341 driver that I've slightly hacked up to see the
|
||||||
* current state of LORA_DIO0. Without that access, I can't know if the interrupt is still pending - which would create
|
* current state of LORA_DIO0. Without that access, I can't know if the interrupt is still pending - which would create
|
||||||
* race conditions in packet handling.
|
* race conditions in packet handling.
|
||||||
*
|
*
|
||||||
* My workaround is to poll the status register internally to the sx127x. Which is expensive because it involves a number of
|
* My workaround is to poll the status register internally to the sx127x. Which is expensive because it involves a number of
|
||||||
* i2c transactions and many trips back and forth between kernel and my userspace app. I think shipping the current version
|
* i2c transactions and many trips back and forth between kernel and my userspace app. I think shipping the current version
|
||||||
* of the pinetab lora device would be fine because I can poll slowly (because lora is slow). But if you ever have cause to
|
* of the pinetab lora device would be fine because I can poll slowly (because lora is slow). But if you ever have cause to
|
||||||
* rev this board. I highly encourage this small change.
|
* rev this board. I highly encourage this small change.
|
||||||
*
|
*
|
||||||
* Btw - your little "USB lora dongle" is really neat. I encourage you to sell it, because even non pinetab customers could
|
* Btw - your little "USB lora dongle" is really neat. I encourage you to sell it, because even non pinetab customers could
|
||||||
* use it to easily add lora to rasberry pi, desktop pcs etc...
|
* use it to easily add lora to rasberry pi, desktop pcs etc...
|
||||||
*
|
*
|
||||||
* Porduino helper class to do this i2c based polling:
|
* Porduino helper class to do this i2c based polling:
|
||||||
*/
|
*/
|
||||||
class R595PolledIrqPin : public GPIOPin {
|
class R595PolledIrqPin : public GPIOPin
|
||||||
public:
|
{
|
||||||
|
public:
|
||||||
R595PolledIrqPin() : GPIOPin(LORA_DIO0, "LORA_DIO0") {}
|
R595PolledIrqPin() : GPIOPin(LORA_DIO0, "LORA_DIO0") {}
|
||||||
|
|
||||||
/// Read the low level hardware for this pin
|
/// Read the low level hardware for this pin
|
||||||
virtual PinStatus readPinHardware()
|
virtual PinStatus readPinHardware()
|
||||||
{
|
{
|
||||||
if(isrPinStatus < 0)
|
if (isrPinStatus < 0)
|
||||||
return LOW; // No interrupt handler attached, don't bother polling i2c right now
|
return LOW; // No interrupt handler attached, don't bother polling i2c right now
|
||||||
else {
|
else {
|
||||||
extern RadioInterface *rIf; // FIXME, temporary hack until we know if we need to keep this
|
extern RadioInterface *rIf; // FIXME, temporary hack until we know if we need to keep this
|
||||||
|
|
||||||
assert(rIf);
|
assert(rIf);
|
||||||
RF95Interface *rIf95 = static_cast<RF95Interface *>(rIf);
|
RF95Interface *rIf95 = static_cast<RF95Interface *>(rIf);
|
||||||
@@ -81,17 +66,17 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** apps run under portduino can optionally define a portduinoSetup() to
|
||||||
/** apps run under portduino can optionally define a portduinoSetup() to
|
|
||||||
* use portduino specific init code (such as gpioBind) to setup portduino on their host machine,
|
* use portduino specific init code (such as gpioBind) to setup portduino on their host machine,
|
||||||
* before running 'arduino' code.
|
* before running 'arduino' code.
|
||||||
*/
|
*/
|
||||||
void portduinoSetup() {
|
void portduinoSetup()
|
||||||
printf("Setting up Meshtastic on Porduino...\n");
|
{
|
||||||
|
printf("Setting up Meshtastic on Porduino...\n");
|
||||||
|
|
||||||
// FIXME: disable while not testing with real hardware
|
// FIXME: disable while not testing with real hardware
|
||||||
// gpioBind(new R595PolledIrqPin());
|
// gpioBind(new R595PolledIrqPin());
|
||||||
|
|
||||||
// gpioBind((new SimGPIOPin(LORA_RESET, "LORA_RESET")));
|
// gpioBind((new SimGPIOPin(LORA_RESET, "LORA_RESET")));
|
||||||
// gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent());
|
// gpioBind((new SimGPIOPin(RF95_NSS, "RF95_NSS"))->setSilent());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[VERSION]
|
[VERSION]
|
||||||
major = 1
|
major = 1
|
||||||
minor = 2
|
minor = 2
|
||||||
build = 17
|
build = 20
|
||||||
|
|||||||
Reference in New Issue
Block a user