Merge branch 'ripplebiz:dev' into dev

This commit is contained in:
Rastislav Vysoky
2025-03-09 07:16:50 +01:00
committed by GitHub
7 changed files with 46 additions and 11 deletions

View File

@@ -25,10 +25,11 @@ MeshCore provides the ability to create wireless mesh networks, similar to Mesht
## 🚀 How to Get Started ## 🚀 How to Get Started
Flash the Firmware: Download the pre-built firmware binary for Heltec V3 and flash it using Adafruit ESPTool. Andy Kirby has published a very useful [intro video](https://www.youtube.com/watch?v=t1qne8uJBAc) which explains the steps for beginners.
Install [PlatformIO](https://docs.platformio.org) in Visual Studio Code (optional for developers who want to modify the firmware).
For developers, install [PlatformIO](https://docs.platformio.org) in Visual Studio Code.
Download & Open the MeshCore repository. Download & Open the MeshCore repository.
Select a Sample Application: Choose from chat, ping, repeater, or admin test tools. Select a Sample Application: Choose from chat, repeater, other example app.
Monitor & Communicate using the Serial Monitor (e.g., Serial USB Terminal on Android). Monitor & Communicate using the Serial Monitor (e.g., Serial USB Terminal on Android).
📁 Included Example Applications 📁 Included Example Applications
@@ -36,8 +37,6 @@ Monitor & Communicate using the Serial Monitor (e.g., Serial USB Terminal on And
* 📡 Simple Repeater: Extends network coverage by relaying messages. * 📡 Simple Repeater: Extends network coverage by relaying messages.
* 📡 Companion Radio: For use with an external chat app, over BLE or USB. * 📡 Companion Radio: For use with an external chat app, over BLE or USB.
* 📡 Room Server: A simple BBS server for shared Posts. * 📡 Room Server: A simple BBS server for shared Posts.
* 📡 Ping Client, Ping Server & Client: Basic client/server example.
* 📡 Test Admin: Monitors and manages repeaters remotely.
## 🛠 Hardware Compatibility ## 🛠 Hardware Compatibility
@@ -49,6 +48,9 @@ MeshCore is designed for use with:
* LilyGo T3S3 * LilyGo T3S3
* Heltec T114 * Heltec T114
* Station G2 * Station G2
* Sensecap T1000e
* Heltec V2
* LilyGo TLora32 v1.6
## 📜 License ## 📜 License
MeshCore is open-source software released under the MIT License. You are free to use, modify, and distribute it for personal and commercial projects. MeshCore is open-source software released under the MIT License. You are free to use, modify, and distribute it for personal and commercial projects.

View File

@@ -26,6 +26,7 @@ Anyone is able to build anything they like on top of MeshCore without paying any
Phone Client Applications: https://meshcore.co.uk/apps.html Phone Client Applications: https://meshcore.co.uk/apps.html
MeshCore Fimrware Github: https://github.com/ripplebiz/MeshCore MeshCore Fimrware Github: https://github.com/ripplebiz/MeshCore
NOTE: Andy Kirby has a very useful [intro video](https://www.youtube.com/watch?v=t1qne8uJBAc) for beginners.
You need LoRa hardware devices to run MeshCore firmware as clients or server (repeater and room server). You need LoRa hardware devices to run MeshCore firmware as clients or server (repeater and room server).

View File

@@ -184,6 +184,7 @@ static uint32_t _atoi(const char* sp) {
#define PUSH_CODE_LOGIN_SUCCESS 0x85 #define PUSH_CODE_LOGIN_SUCCESS 0x85
#define PUSH_CODE_LOGIN_FAIL 0x86 #define PUSH_CODE_LOGIN_FAIL 0x86
#define PUSH_CODE_STATUS_RESPONSE 0x87 #define PUSH_CODE_STATUS_RESPONSE 0x87
#define PUSH_CODE_LOG_RX_DATA 0x88
/* -------------------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------------------- */
@@ -435,6 +436,18 @@ protected:
return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time); return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time);
} }
void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override {
if (_serial->isConnected()) {
int i = 0;
out_frame[i++] = PUSH_CODE_LOG_RX_DATA;
out_frame[i++] = (int8_t)(snr * 4);
out_frame[i++] = (int8_t)(rssi);
memcpy(&out_frame[i], raw, len); i += len;
_serial->writeFrame(out_frame, i);
}
}
void onDiscoveredContact(ContactInfo& contact, bool is_new) override { void onDiscoveredContact(ContactInfo& contact, bool is_new) override {
if (_serial->isConnected()) { if (_serial->isConnected()) {
out_frame[0] = PUSH_CODE_ADVERT; out_frame[0] = PUSH_CODE_ADVERT;

View File

@@ -422,16 +422,22 @@ build_flags =
-D P_LORA_MOSI=27 ; SPI MOSI -D P_LORA_MOSI=27 ; SPI MOSI
-D P_LORA_TX_LED=2 ; LED pin for TX indication -D P_LORA_TX_LED=2 ; LED pin for TX indication
-D PIN_VBAT_READ=35 ; Battery voltage reading (analog pin) -D PIN_VBAT_READ=35 ; Battery voltage reading (analog pin)
-D PIN_USER_BTN=0
-D RADIO_CLASS=CustomSX1276 -D RADIO_CLASS=CustomSX1276
-D ARDUINO_LOOP_STACK_SIZE=16384 -D ARDUINO_LOOP_STACK_SIZE=16384
-D DISPLAY_CLASS=SSD1306Display
-D WRAPPER_CLASS=CustomSX1276Wrapper -D WRAPPER_CLASS=CustomSX1276Wrapper
-D LORA_TX_POWER=20 -D LORA_TX_POWER=20
lib_deps =
${esp32_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13
; === LILYGO T-LoRa V2.1-1.6 with SX1276 environments === ; === LILYGO T-LoRa V2.1-1.6 with SX1276 environments ===
[env:LilyGo_TLora_V2_1_1_6_Repeater] [env:LilyGo_TLora_V2_1_1_6_Repeater]
extends = LilyGo_TLora_V2_1_1_6 extends = LilyGo_TLora_V2_1_1_6
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<../examples/simple_repeater/main.cpp> +<helpers/ui/*.cpp>
+<../examples/simple_repeater>
build_flags = build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags} ${LilyGo_TLora_V2_1_1_6.build_flags}
-D ADVERT_NAME="\"TLora-V2.1-1.6 Repeater\"" -D ADVERT_NAME="\"TLora-V2.1-1.6 Repeater\""
@@ -451,7 +457,8 @@ build_flags =
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<../examples/simple_secure_chat/main.cpp> +<helpers/ui/*.cpp>
+<../examples/simple_repeater>
lib_deps = lib_deps =
${LilyGo_TLora_V2_1_1_6.lib_deps} ${LilyGo_TLora_V2_1_1_6.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -467,7 +474,8 @@ build_flags =
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 ; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<../examples/companion_radio/main.cpp> +<helpers/ui/*.cpp>
+<../examples/companion_radio>
lib_deps = lib_deps =
${LilyGo_TLora_V2_1_1_6.lib_deps} ${LilyGo_TLora_V2_1_1_6.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -486,7 +494,8 @@ build_flags =
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<helpers/esp32/*.cpp> +<helpers/esp32/*.cpp>
+<../examples/companion_radio/main.cpp> +<helpers/ui/*.cpp>
+<../examples/companion_radio>
lib_deps = lib_deps =
${LilyGo_TLora_V2_1_1_6.lib_deps} ${LilyGo_TLora_V2_1_1_6.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -494,7 +503,8 @@ lib_deps =
[env:LilyGo_TLora_V2_1_1_6_room_server] [env:LilyGo_TLora_V2_1_1_6_room_server]
extends = LilyGo_TLora_V2_1_1_6 extends = LilyGo_TLora_V2_1_1_6
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<../examples/simple_room_server/main.cpp> +<helpers/ui/*.cpp>
+<../examples/simple_room_server>
build_flags = build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags} ${LilyGo_TLora_V2_1_1_6.build_flags}
-D ADVERT_NAME="\"TLora-V2.1-1.6 Room\"" -D ADVERT_NAME="\"TLora-V2.1-1.6 Room\""

View File

@@ -78,9 +78,11 @@ void Dispatcher::checkRecv() {
float score; float score;
uint32_t air_time; uint32_t air_time;
{ {
uint8_t raw[MAX_TRANS_UNIT]; uint8_t raw[MAX_TRANS_UNIT+1];
int len = _radio->recvRaw(raw, MAX_TRANS_UNIT); int len = _radio->recvRaw(raw, MAX_TRANS_UNIT);
if (len > 0) { if (len > 0) {
logRxRaw(_radio->getLastSNR(), _radio->getLastRSSI(), raw, len);
pkt = _mgr->allocNew(); pkt = _mgr->allocNew();
if (pkt == NULL) { if (pkt == NULL) {
MESH_DEBUG_PRINTLN("%s Dispatcher::checkRecv(): WARNING: received data, no unused packets available!", getLogDateTime()); MESH_DEBUG_PRINTLN("%s Dispatcher::checkRecv(): WARNING: received data, no unused packets available!", getLogDateTime());

View File

@@ -117,6 +117,8 @@ protected:
virtual DispatcherAction onRecvPacket(Packet* pkt) = 0; virtual DispatcherAction onRecvPacket(Packet* pkt) = 0;
virtual void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) { } // custom hook
virtual void logRx(Packet* packet, int len, float score) { } // hooks for custom logging virtual void logRx(Packet* packet, int len, float score) { } // hooks for custom logging
virtual void logTx(Packet* packet, int len) { } virtual void logTx(Packet* packet, int len) { }
virtual void logTxFail(Packet* packet, int len) { } virtual void logTxFail(Packet* packet, int len) { }

View File

@@ -31,8 +31,13 @@ public:
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
#ifdef BATTERY_PIN #ifdef BATTERY_PIN
analogReference(AR_INTERNAL_3_0);
analogReadResolution(12); analogReadResolution(12);
float volts = (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE) / 4096; float volts = (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE) / 4096;
analogReference(AR_DEFAULT); // put back to default
analogReadResolution(10);
return volts * 1000; return volts * 1000;
#else #else
return 0; return 0;