Compare commits
2 Commits
v0.2.0
...
493826bef5
| Author | SHA1 | Date | |
|---|---|---|---|
| 493826bef5 | |||
| cc8f61158f |
@@ -9,6 +9,10 @@ channel PSKs, and read link metadata.
|
|||||||
This is the inverse of the phone/web app: your host MCU plays the *client*, the
|
This is the inverse of the phone/web app: your host MCU plays the *client*, the
|
||||||
companion radio plays the *server*.
|
companion radio plays the *server*.
|
||||||
|
|
||||||
|
> The canonical repository is on Gitea at
|
||||||
|
> <https://gitea.sh3d.com.au/Sh3d/meshcore_c>. A mirror is kept on GitHub at
|
||||||
|
> <https://github.com/SH3D/meshcore_c> for **issues** and **pull requests**.
|
||||||
|
|
||||||
## Design: portable C core + Arduino wrapper
|
## Design: portable C core + Arduino wrapper
|
||||||
|
|
||||||
Two layers, so the protocol is reusable and testable far beyond Arduino:
|
Two layers, so the protocol is reusable and testable far beyond Arduino:
|
||||||
|
|||||||
+6
-1
@@ -1,12 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "MeshCoreCompanion",
|
"name": "MeshCoreCompanion",
|
||||||
"version": "0.2.0",
|
"version": "0.2.1",
|
||||||
"description": "Client library for the MeshCore Companion Radio serial protocol. Portable C99 core (no I/O, no malloc, host-testable) with a thin Arduino C++ wrapper that connects a host MCU to a separate MeshCore companion radio over UART/USB serial. Receive and send on channels, set channel PSKs, read SNR/path metadata.",
|
"description": "Client library for the MeshCore Companion Radio serial protocol. Portable C99 core (no I/O, no malloc, host-testable) with a thin Arduino C++ wrapper that connects a host MCU to a separate MeshCore companion radio over UART/USB serial. Receive and send on channels, set channel PSKs, read SNR/path metadata.",
|
||||||
"keywords": ["meshcore", "lora", "companion", "serial", "mesh", "sx1262", "esp32", "nrf52"],
|
"keywords": ["meshcore", "lora", "companion", "serial", "mesh", "sx1262", "esp32", "nrf52"],
|
||||||
"authors": [
|
"authors": [
|
||||||
{ "name": "Scott Penrose", "maintainer": true }
|
{ "name": "Scott Penrose", "maintainer": true }
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"homepage": "https://gitea.sh3d.com.au/Sh3d/meshcore_c",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitea.sh3d.com.au/Sh3d/meshcore_c.git"
|
||||||
|
},
|
||||||
"frameworks": ["arduino"],
|
"frameworks": ["arduino"],
|
||||||
"platforms": ["espressif32", "nordicnrf52", "raspberrypi", "ststm32"],
|
"platforms": ["espressif32", "nordicnrf52", "raspberrypi", "ststm32"],
|
||||||
"headers": ["MeshCoreCompanion.h", "meshcore_companion.h"],
|
"headers": ["MeshCoreCompanion.h", "meshcore_companion.h"],
|
||||||
|
|||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
name=MeshCoreCompanion
|
name=MeshCoreCompanion
|
||||||
version=0.2.0
|
version=0.2.1
|
||||||
author=Scott Penrose
|
author=Scott Penrose
|
||||||
maintainer=Scott Penrose
|
maintainer=Scott Penrose
|
||||||
sentence=Client for the MeshCore Companion Radio serial protocol.
|
sentence=Client for the MeshCore Companion Radio serial protocol.
|
||||||
paragraph=Connect a host MCU (e.g. an ESP32 display board) to a separate MeshCore companion radio over UART/USB serial. Portable C99 protocol core plus a thin Arduino wrapper. Send/receive on channels, set channel PSKs, read SNR/path metadata. Auto-drains the radio message queue.
|
paragraph=Connect a host MCU (e.g. an ESP32 display board) to a separate MeshCore companion radio over UART/USB serial. Portable C99 protocol core plus a thin Arduino wrapper. Send/receive on channels, set channel PSKs, read SNR/path metadata. Auto-drains the radio message queue.
|
||||||
category=Communication
|
category=Communication
|
||||||
url=https://github.com/digitaldimensions/MeshCoreCompanion
|
url=https://github.com/SH3D/meshcore_c
|
||||||
architectures=esp32,nrf52,stm32,rp2040
|
architectures=esp32,nrf52,stm32,rp2040
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ void MeshCoreCompanion::loop() {
|
|||||||
while (mc_rx_poll(&_rx, _scratch, sizeof(_scratch), &olen)) {
|
while (mc_rx_poll(&_rx, _scratch, sizeof(_scratch), &olen)) {
|
||||||
mc_event_t ev;
|
mc_event_t ev;
|
||||||
if (mc_parse(_scratch, olen, &ev)) dispatch(ev);
|
if (mc_parse(_scratch, olen, &ev)) dispatch(ev);
|
||||||
|
else if (_onUnparsed) _onUnparsed(_scratch, olen); /* frame we couldn't decode */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +122,11 @@ void MeshCoreCompanion::syncNextMessage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MeshCoreCompanion::drainMessages() {
|
void MeshCoreCompanion::drainMessages() {
|
||||||
if (!_draining) { _draining = true; syncNextMessage(); }
|
// Always (re)issue a sync — recovers a wedged drain (a lost reply leaving
|
||||||
|
// _draining stuck true), not only when idle. Safe to call periodically:
|
||||||
|
// the radio answers each sync with the next queued message or NoMoreMessages.
|
||||||
|
_draining = true;
|
||||||
|
syncNextMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshCoreCompanion::getStats(uint8_t statsType) {
|
void MeshCoreCompanion::getStats(uint8_t statsType) {
|
||||||
@@ -217,7 +222,12 @@ void MeshCoreCompanion::dispatch(const mc_event_t &ev) {
|
|||||||
if (_onBinaryResp) _onBinaryResp(ev.u.binary_resp);
|
if (_onBinaryResp) _onBinaryResp(ev.u.binary_resp);
|
||||||
break;
|
break;
|
||||||
case MC_PUSH_MSG_WAITING:
|
case MC_PUSH_MSG_WAITING:
|
||||||
if (_autoSync && !_draining) { _draining = true; syncNextMessage(); }
|
// Always (re)start the drain on a MsgWaiting push. If a prior sync
|
||||||
|
// reply was lost (e.g. the host stalled and its UART RX overflowed),
|
||||||
|
// _draining can be left stuck true; gating on !_draining would then
|
||||||
|
// ignore every later push and silently stop pulling messages.
|
||||||
|
// Re-kicking unconditionally self-heals that.
|
||||||
|
if (_autoSync) { _draining = true; syncNextMessage(); }
|
||||||
break;
|
break;
|
||||||
case MC_RESP_CHANNEL_MSG_RECV:
|
case MC_RESP_CHANNEL_MSG_RECV:
|
||||||
case MC_RESP_CHANNEL_MSG_RECV_V3:
|
case MC_RESP_CHANNEL_MSG_RECV_V3:
|
||||||
|
|||||||
@@ -105,6 +105,10 @@ public:
|
|||||||
void onContactsDone(ContactsDoneCb cb){ _onContactsDone = cb; }
|
void onContactsDone(ContactsDoneCb cb){ _onContactsDone = cb; }
|
||||||
void onBinaryResponse(BinaryRespCb cb){ _onBinaryResp = cb; }
|
void onBinaryResponse(BinaryRespCb cb){ _onBinaryResp = cb; }
|
||||||
void onEvent(EventCb cb) { _onEvent = cb; } /* every parsed frame */
|
void onEvent(EventCb cb) { _onEvent = cb; } /* every parsed frame */
|
||||||
|
/* Raw frames the parser did NOT recognise (payload incl. code byte). For
|
||||||
|
* diagnosing firmware/protocol mismatches — normally unused. */
|
||||||
|
using RawCb = std::function<void(const uint8_t* payload, size_t len)>;
|
||||||
|
void onUnparsedFrame(RawCb cb) { _onUnparsed = cb; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void sendPayload(const uint8_t *payload, size_t len);
|
void sendPayload(const uint8_t *payload, size_t len);
|
||||||
@@ -134,6 +138,7 @@ private:
|
|||||||
ContactsDoneCb _onContactsDone;
|
ContactsDoneCb _onContactsDone;
|
||||||
BinaryRespCb _onBinaryResp;
|
BinaryRespCb _onBinaryResp;
|
||||||
EventCb _onEvent;
|
EventCb _onEvent;
|
||||||
|
RawCb _onUnparsed;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MESHCORE_COMPANION_HPP */
|
#endif /* MESHCORE_COMPANION_HPP */
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extern "C" {
|
|||||||
|
|
||||||
/* Library version. Keep in sync with library.json and library.properties;
|
/* Library version. Keep in sync with library.json and library.properties;
|
||||||
* check_version.sh verifies all three match and that a git tag exists. */
|
* check_version.sh verifies all three match and that a git tag exists. */
|
||||||
#define MESHCORE_COMPANION_VERSION "0.2.0"
|
#define MESHCORE_COMPANION_VERSION "0.2.1"
|
||||||
|
|
||||||
/* ---- Compile-time sizing (override before including if you need more) ---- */
|
/* ---- Compile-time sizing (override before including if you need more) ---- */
|
||||||
#ifndef MC_MAX_PAYLOAD
|
#ifndef MC_MAX_PAYLOAD
|
||||||
|
|||||||
Reference in New Issue
Block a user