Skip to content

Add v4 FEM LNA CLI control commands. - #1

Closed
fkallay1 wants to merge 35 commits into
mainfrom
features/nrf-ota
Closed

Add v4 FEM LNA CLI control commands.#1
fkallay1 wants to merge 35 commits into
mainfrom
features/nrf-ota

Conversation

@fkallay1

Copy link
Copy Markdown
Owner

No description provided.

Quency-D and others added 30 commits March 24, 2026 10:48
This reverts commit ca047fe, reversing
changes made to ddedb3c.
Co-authored-by: Copilot <copilot@github.com>
…on-parse-failure

Fix: CMD_SEND_RAW_PACKET not freeing packet on parse failure
Port funkčného OTA systému z FK_lora-sniffer do simple_repeater.
Aktualizácia FW cez LoRa malým delta-patchom (HPatchLite inplaceB +
streaming DEFLATE + in-place flasher), NIE Nordic BLE DFU.

Transport: MeshCore GRP_DATA kanál (PSK) — MyMesh override
searchChannelsByHash()/onGroupDataRecv(), dešifrované cez
Utils::MACThenDecrypt (AES-128-ECB+HMAC). Žiadna zmena jadra MeshCore.
Krypto: mesh::Utils::sha256 + rweather/Crypto. FS: CustomLFS @ 0xD4000.

Flash mapa (extrafs.ld): app 0x26000-0xD4000, OTA FS 0xD4000-0xEB000 (92kB),
flasher 0xEB000, trace 0xEC000, InternalFS 0xED000+ nedotknutý.

Vsetko gated -DWITH_LORA_OTA -> stock buildy nedotknute. Novy env
ProMicro_repeater_ota. Prikazy (serial+LoRa CLI): ota status|verify|flash|
clear|decompress|nack|dbg. flasher_code.h regen: nrfota/tools/build_flasher.py.

Build SUCCESS: ProMicro_repeater_ota + stock ProMicro_repeater.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
test_nrf-ota/: ota_test_lora_repeater.py (2-fáza baseline/run, CZ preset),
ota_sender.py + hdiffi.exe z FK_lora, gen_build_info.py (pre-script build#).

Repeater (WITH_LORA_OTA): heartbeat "build #N" + boot banner freq/sf na detekciu
verzie a zaručenie OLD!=NEW pre patch. OTA env: CZ preset (869.525/SF7) aby sa
nerušila SK sieť a zhodoval sa s FK_lora XIAO bridge. PSK "meshcore-ota-key" (16B).

readme_nrf-ota.md: kompletný popis architektúry, buildu, ovládania a testovania.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e, docs

Diagnostika príjmu OTA-over-LoRa na ProMicro repeateri (gated WITH_LORA_OTA):
- logRxRaw() override -> počítadlo rawrx (surové CRC-OK rámce PRED dekódom) v
  [OTA] AALIVE heartbeate; odlíši "rádio nepočuje nič" od "počuje, dekód zlyhá".
- onGroupDataRecv() už len buffruje do _ota_pending[]; ťažké CustomLFS I/O sa robí
  v loop() po re-arme rádia (mesh::Mesh::loop()).
- 'ota agc' príkaz (READ-ONLY): SX1262 RxGain reg 0x08AC (boosted/power-save),
  okamžité RSSI, noise floor, agc_reset_interval (extern RADIO_CLASS radio).

Záver debugovania (viď readme_tech_nrf-ota.md §8): HW v poriadku (FK_lora sniffer
test PASS na tých istých doskách). Trvalá hluchota = jednorazový zaseknutý receiver
(stuck noise floor), nie preamble. agc_reset auto-reset ROZBÍJA OTA flash -> držať
agc_reset_interval=0 (MeshCore default). Radio config repeatera NEZMENENÝ -> plná
kompatibilita s MeshCore sieťou.

Docs: readme_tech_nrf-ota.md (nový, technický popis + vyriešené problémy),
conv_claude_20260615.md (záznam debugu), readme_nrf-ota.md (update).
.gitignore: test artefakty (.bin), .claude/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y-run)

Dva zdroje flakeovosti automatického `run` odstránené (viď readme_verified_pooling.md):

1) Príjem nedosiahol VERIFIED (timing): fixný --cycles loop + jednorazová finálna
   kontrola padli skôr, než sa session skumulovala (fire-and-forget stráca pakety
   na začiatku). Nový broadcast_until_verified(): opakuje broadcast + poll 'ota status'
   až do VERIFIED alebo --verify-wait (60s), viac pollov/kolo, sleduje rast recv/total,
   + settle po reboote (RX arm). Nové args: --verify-wait/--poll-tries/--poll-secs/
   --reboot-settle (--cycles legacy).

2) Flash hardfault po dry-rune: 'ota verify' (malloc + streaming rekonštrukcia 442kB)
   pokazí heap → následný 'ota flash' hardfaultne na malloc (flasher stop po
   "Komprimovany format" → OLD). Dry-run je teraz opt-in (--verify-first, default vyp);
   run ide po VERIFIED rovno na flash. Bezpečnosť drží base-FW SHA256 check vnútri flash.

Overené: meshcore-dev#34meshcore-dev#36 konzistentný [PASS]. Dokumentácia: readme_verified_pooling.md (nový),
readme_tech_nrf-ota.md §8.2 (firmware TODO: vyčistiť heap medzi verify a flash).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fkallay1 and others added 5 commits June 15, 2026 17:28
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ozlíšenie

OTA-over-LoRa pre nRF52840 repeater — bezpečnostné a robustnosť vylepšenia.

Protokol:
- BEGIN paket premenovaný na HEADER (OtaHeaderPkt/OTA_PKT_HEADER, wire 0x10) —
  je to metadátová hlavička patchu, nie nutne prvý paket.
- Ed25519 podpis HEADER (107B správa, key_id + 64B signature), overenie proti
  s_authors[] v OtaReceiver_signkey.cpp. Nepodpísaný akceptovaný LEN s
  -D OTA_ALLOW_UNSIGNED (default OFF → produkcia odmieta).
- CHUNK +8B: old_fw_size + old_sha256_prefix pre rozlíšenie patchov pre rôzne FW.

Prijímač (OtaReceiver):
- Out-of-order: chunky pred HEADER sa bufferujú do partial session, HEADER ich
  promuje (merge, recv_count z bitmap). Fix: old_fw_size sa preberá z chunku
  (HEADER ho nenesie) — inak guard zahodil všetky chunky po HEADER.
- Base-FW gate: lacný fw_size cross-check (fw_image_size z linker symbolov
  __etext+SIZEOF(.data)) pred drahým SHA256.

FW identity trailer (FwId.{cpp,h} + gen_fw_trailer.py):
- FwIdTrailer (magic+image_size+build#+sha256) v .rodata, vyplnený post-build
  do firmware.hex. -Wl,-u,fw_id_trailer drží symbol pri --gc-sections.

Test (ota_sender.py, ota_test_lora_repeater.py):
- --privkey/--keyid: Ed25519 podpis HEADER (pycryptodome eddsa).
- --packetorder {normal,hbegin,hmiddle,hend}: pozícia HEADER pre out-of-order test.
- E2E na HW PASS: normal aj hend (build# → build#+1 cez LoRa, flash+reboot).

Ostatné: BOM/encoding fix, test_key.der + __pycache__ do .gitignore.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AGENTS.md — projektová dokumentácia pre AI agentov (build systém, varianty,
PlatformIO konvencie). .vscode/extensions.json — doc komentár k formátu.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
readme_nrf-ota.md, readme_tech_nrf-ota.md, readme_verified_pooling.md
→ fkclaude/fcl_*.md (FK/Claude projektové poznámky na jednom mieste).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…flash base z linker symbolu

RAM-assembly refaktor (rieši 2× FS pri veľkých patchoch):
- ota_acquire_patch_ram(): patch do čerstvo malloc-nutého RAM buffra; default
  zostaví z recv.log (assemble_log_to_buf: build_log_offsets + chunk_exp_len),
  -D USE_PATCHBIN_FILE číta /ota/patch.bin. Caller free().
- assemble_and_verify() pri COMPLETE: default verify_log_sha() = SHA256 streamovo
  z recv.log (žiadny patch.bin, žiadny veľký buffer); USE_PATCHBIN_FILE = patch.bin
  + over + zmaž recv.log (cleanup, rieši 2× v file móde).
- dry-run (ota_patch_to_file) aj real (ota_flash_via_flasher) cez ota_acquire_patch_ram
  → puff_stream / MemStream nad RAM buffrom. patch_file_read ostal unused.
- malloc zlyhanie = graceful error s tipom na -D USE_PATCHBIN_FILE. Tier-2
  (deštruktívny assemble do 0x20000000) NEIMPLEMENTOVANÝ (risk/netestovateľné).

fw_image_size(): base z linker symbolu __flash_arduino_start (= ORIGIN(FLASH))
namiesto hardcoded APP_FLASH_START → robustné pre v6/v7. Tvrdý symbol (žiadny weak
fallback) — ak chýba (non-Arduino projekt), link error = fail-fast, zámerne.
APP_FLASH_START/MAX makrá ostávajú pre compile-time kontexty.

E2E PASS na HW: build meshcore-dev#90meshcore-dev#91, dry-run aj real flash z recv.log→RAM, dry-run pred
flashom bez hardfaultu.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@fkallay1 fkallay1 closed this Jun 19, 2026
fkallay1 added a commit that referenced this pull request Aug 20, 2026
Doteraz sme vedeli, ze guard vystrelil 8x v jednom 25s okne, ale nie ci to boli
skutocne zachrany alebo falosne poplachy - guard nic nezaznamenaval. A zaroven
sme netestovali samotnu opravu navrhnutu do RadioLibu, len jej kriterium.

Toto riesi oboje. Za #ifdef FK_LR2021_SPI_DIAG ide getPacketLength() cez novy
fkDiagPktLen(), ktory:

1. cita dlzku sam (fkRawPktLen, dve transakcie), takze vidi status bajt PRAVE
   toho citania, ktore hodnotu vyrobilo - inak sa to overit neda, RadioLib si
   status spotrebuje vnutri;
2. o zastaralosti rozhoduje podla CMD_DAT, teda podla pravidla navrhnuteho
   upstreamu - cize ta oprava realne bezi na zeleze;
3. zaroven vyhodnocuje aj nase odtlackove pravidlo (hodnota == irq[31:16]) a
   zapise, ktore z nich vystrelilo;
4. ak ani po 4 pokusoch nedostane CMD_DAT, spadne na kniznicne citanie, aby sme
   na tom nikdy neboli horsie.

Udalosti (fp, prva hodnota, finalna hodnota, stat, pocet pokusov, ktore pravidlo)
idu do kruhoveho buffra na 8 zaznamov. Z horucej RX cesty sa NIC netlaci - zapis
do Serialu by zastavil prijem. Vypis je az cez CLI 'fk spifix'.

Tym sa da rozlisit falosny poplach: rule=FP bez CMD a first == final znamena, ze
dlzka bola spravna od zaciatku a odtlacok sa len nahodou zhodoval. To je presne
podozrenie na tych 8 udalosti z 09:11 - v tom okne boli dva hodnoverne 68
bajtove ramce a 68 je odtlacok pri RX_DONE|CRC_ERROR, cize 2 x 4 pokusy = 8.

Nediagnosticka cesta ostava nezmenena (overene buildom MeshTracker_X1_repeater),
PR vetva sa toho netyka.

Overene na zeleze, build meshcore-dev#460: prijem zdravy (11 ramcov, rxerr=0, miss=0) a dlzky
spravne - #1 len=61 path[4] -> meshcore-dev#2/meshcore-dev#3 len=63 path[5], teda +2 bajty na hop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants