Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/rcc6-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ jobs:
--partitions "$out/partitions.bin" \
--elf "$out/firmware.elf" \
--sha "${{ github.event.pull_request.head.sha || github.sha }}" \
--version 2.3.0-rc.5
--version 2.3.0-rc.6

- name: Build and verify signed Ultimate Web package
if: matrix.ota && github.event_name != 'pull_request'
Expand All @@ -153,10 +153,10 @@ jobs:
key="$RUNNER_TEMP/ultimate-ota-private.pem"
printf '%s\n' "$ULTIMATE_OTA_SIGNING_KEY_PEM" > "$key"
chmod 600 "$key"
package="$out/NeonPocketMC-RCC6-Ultimate-Web-v2.3.0-rc.5.npu"
package="$out/NeonPocketMC-RCC6-Ultimate-Web-v2.3.0-rc.6.npu"
python tools/package_ultimate_ota.py pack \
--app "$out/firmware.bin" --output "$package" --key "$key" \
--version 2.3.0-rc.5 \
--version 2.3.0-rc.6 \
--git-sha "${{ github.event.pull_request.head.sha || github.sha }}"
rm -f "$key"
python tools/package_ultimate_ota.py verify \
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ This is a direct, checksum-verified capture of the RCC6 220×128 framebuffer run

## Release status

The proven v1 line remains available as [`v1.2.0-rc.2`](https://github.com/n30nex/NeonPocketMC-RCC6/releases/tag/v1.2.0-rc.2). Current [`v2.3.0-rc.5`](https://github.com/n30nex/NeonPocketMC-RCC6/releases/tag/v2.3.0-rc.5) keeps BLE, native USB, and authenticated Web modes while rejecting impossible RCC6 battery readings. Use only files attached to a named release—short-lived Actions artifacts are development builds.
The proven v1 line remains available as [`v1.2.0-rc.2`](https://github.com/n30nex/NeonPocketMC-RCC6/releases/tag/v1.2.0-rc.2). Current [`v2.3.0-rc.6`](https://github.com/n30nex/NeonPocketMC-RCC6/releases/tag/v2.3.0-rc.6) keeps BLE, native USB, and authenticated Web modes while fixing saved-location adverts on GPS-less hardware. Use only files attached to a named release—short-lived Actions artifacts are development builds.

Using RCC6 without the TFT? [NeonPocketMC-RCC6-Headless](https://github.com/n30nex/NeonPocketMC-RCC6-Headless) provides dedicated BLE, native USB/serial, and Wi-Fi Web/TCP companion images with no display or framebuffer code.

Expand Down Expand Up @@ -158,12 +158,12 @@ Replace `COM21` with the port actually shown by your computer. Use the Web/AP fi
Normal Ultimate installation remains application-only at `0x10000`; it does not replace the bootloader, partition table, NVS, or SPIFFS:

```text
python -m esptool --chip esp32c6 --port COM21 write-flash 0x10000 NeonPocketMC-RCC6-Ultimate-v2.3.0-rc.5-BLE-app.bin
python -m esptool --chip esp32c6 --port COM21 write-flash 0x10000 NeonPocketMC-RCC6-Ultimate-v2.3.0-rc.6-BLE-app.bin
```

Use the USB filename for the native-USB binary companion or the Web filename for Web mode. Identity-preserving merged recovery images are provided separately and are for bootloader/partition recovery at `0x0`, not ordinary updates. Never erase the whole chip. The USB image carries the standard binary MeshCore companion protocol; it is not the text CLI.

The WebUI accepts only a signed `NeonPocketMC-RCC6-Ultimate-Web-v2.3.0-rc.5.npu` package. Firmware verifies the RCC6 target, Web mode, application length, SHA-256, and Ed25519 signature before selecting the inactive OTA application slot. The existing bootloader does not guarantee automatic rollback from a boot-breaking app; keep USB access and the matching app/recovery images available. BLE and native-USB firmware have no Web OTA and are updated over USB only.
The WebUI accepts only a signed `NeonPocketMC-RCC6-Ultimate-Web-v2.3.0-rc.6.npu` package. Firmware verifies the RCC6 target, Web mode, application length, SHA-256, and Ed25519 signature before selecting the inactive OTA application slot. The existing bootloader does not guarantee automatic rollback from a boot-breaking app; keep USB access and the matching app/recovery images available. BLE and native-USB firmware have no Web OTA and are updated over USB only.

## Build

Expand Down
18 changes: 18 additions & 0 deletions docs/releases/2.3-RC6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# NeonPocketMC RCC6 Ultimate v2.3.0-rc.6

Experimental prerelease built from the exact tagged `main` commit and MeshCore 1.17.1.

## Changes

- Saved latitude/longitude adverts now work on GPS-less RCC6 hardware.
- Unsupported live-GPS policy requests are normalized to saved-coordinate mode.
- Browser-entered coordinates are stored and advertised through the saved-location policy.

## Files

- BLE, native USB, and Web app-only images at `0x10000`
- matching identity-preserving recovery images at `0x0`
- signed Web OTA package `NeonPocketMC-RCC6-Ultimate-Web-v2.3.0-rc.6.npu`
- exact source/licenses bundle and `SHA256SUMS.txt`

This remains experimental. Keep USB recovery access available.
7 changes: 7 additions & 0 deletions examples/companion_radio/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,10 @@ void MyMesh::begin(bool has_display) {
_store->loadPrefs(_prefs);
sensors.node_lat = _prefs.node_lat;
sensors.node_lon = _prefs.node_lon;
if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE && sensors.getLocationProvider() == nullptr) {
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
_store->savePrefs(_prefs);
}

// sanitise bad pref values
_prefs.rx_delay_base = constrain(_prefs.rx_delay_base, 0, 20.0f);
Expand Down Expand Up @@ -1587,6 +1591,9 @@ void MyMesh::handleCmdFrame(size_t len) {

if (len >= 4) {
_prefs.advert_loc_policy = cmd_frame[3];
if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE && sensors.getLocationProvider() == nullptr) {
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
}
if (len >= 5) {
_prefs.multi_acks = cmd_frame[4];
}
Expand Down
3 changes: 2 additions & 1 deletion examples/companion_radio/NodePrefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#define ADVERT_LOC_NONE 0
#define ADVERT_LOC_SHARE 1
#define ADVERT_LOC_PREFS 2

class NodePrefs : public ConfigSerializer { // persisted to file
public:
Expand Down Expand Up @@ -135,4 +136,4 @@ class NodePrefs : public ConfigSerializer { // persisted to file
// new accessor methods
bool isRepeatEn() const { return repeat.disable_fwd == 0; }
void setRepeatEn(bool en) { repeat.disable_fwd = en ? 0 : 1; }
};
};
2 changes: 1 addition & 1 deletion examples/companion_radio/UltimateWebApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ void UltimateWebApi::handleLocation() {
sensors.node_lat = latitude;
sensors.node_lon = longitude;
if (has_advertise) {
the_mesh.getNodePrefs()->advert_loc_policy = advertise ? ADVERT_LOC_SHARE : ADVERT_LOC_NONE;
the_mesh.getNodePrefs()->advert_loc_policy = advertise ? ADVERT_LOC_PREFS : ADVERT_LOC_NONE;
}
the_mesh.savePrefs();
String json = F("{\"saved\":true,\"latitude\":"); json += String(latitude, 6);
Expand Down
Loading
Loading