Repository navigation
1.0.1-beta.5: detect ISO 14443A (NFC-A) tags next to ISO 15693 (#93) - #103
Merged
Merged
Conversation
Each 500 ms poll cycle still runs the NFC-V inventory first. Only when it
finds nothing and tracks nothing does the same field window also run an
NFC-A detection (mode switch, REQA, anticollision), so OpenPrintTag
detection and removal timing is unchanged. An NFC-A tag is reported as
unsupported_technology with its NFCID1, SAK, ATQA and a kind derived from
the SAK; nothing is read from it and it is not handed to the workflow.
The touchscreen, browser and API name such a tag ("Tag type not supported
yet") instead of staying on "Place a spool". check_production_nfc.py
permits exactly the three detection calls in the I2C driver and forbids
T2T, ISO-DEP and NFC-DEP routines in the ELF.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QcYr11a5B65kS64MagbgF1
Regenerated with tools/curate_public_images.py from the opentag-ui-review artifact of CI run 39650026601 (head d452806); 123 capture receipts verified, including the new wt32-unsupported-type fixture. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QcYr11a5B65kS64MagbgF1
A merge to main that changes documentation-site/, VERSION or tools/export_docs.py runs .github/workflows/docs-publish.yml: the CI documentation checks, the export, an rsync --delete over a deploy-key checkout of the Docs repository (keeping its .git, .github and .gitignore), the Docs repository's own four checks, then one commit "Manual for <version> from 76cb/OpenTag-Station@<sha>" pushed to its main. Nothing is pushed when the export is unchanged. Pre-releases are published too. The README and the release page describe the flow and the one-time deploy-key setup. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QcYr11a5B65kS64MagbgF1
Owner
Author
|
CI on 737b302 is green (firmware, ui-review, documentation, version-policy). Numbers from the firmware job, against
The ELF allow-list check passed with the three NFC-A detection calls and the new forbidden-symbol list; the NFC, HTTP and touch stack checks passed. Screenshot receipts were refreshed from this run's Not verified here: anything on a physical WT32; the acceptance steps are in the PR description. Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stage 2a of the tag-support roadmap, issue #93: the reader polls ISO 14443A (NFC-A) next to ISO 15693 and names what it finds. Detection only: nothing is read from an NFC-A tag, nothing is written, and the OpenPrintTag read and write paths are unchanged. Pre-release
1.0.1-beta.5.What changed
Polling (
src/nfc/poll_schedule.hpp,src/nfc/read_only_service.cpp)multiple, and an NFC-V tag answering while an NFC-A tag is tracked wins at once.unsupported_technology; the snapshot carriestechnology(nfcv/nfca) and annfca::Identity(NFCID1 4/7/10 bytes, SAK, ATQA, kind from SAK per NXP AN10833:type2,mifare_classic,type4,other). The workflow handoff ignores such a tag (no Spoolman lookup, no automatic weigh).Driver (
src/hardware/nfc/st25r3916b/i2c_reader.cpp)inventory_nfca():rfalNfcaPollerInitialize(mode switch, field already on) →rfalNfcaPollerTechnologyDetection(REQA) →rfalNfcaPollerFullCollisionResolution→rfalNfcvPollerInitializeto restore NFC-V. This is the sequence RFAL's own discovery worker runs for NFC-A (rfal_nfc.cpp), which the vendor'sESP32_I2C_scan_14443Aexample exercises over I2C. I2C errors propagate; a timeout or RF-side error is "no NFC-A tag this cycle" so NFC-V polling never pauses in the error state because of NFC-A.tools/check_production_nfc.py: exactly those threerfalNfcaPoller*calls are permitted, in the I2C driver only; the ELF check additionally fails if a T2T read/write,rfalNfcaPollerSelect, ISO-DEP APDU or NFC-DEP routine is linked.UIs and API
GET /api/v1/nfc:technology,nfca{nfcid1,length,sak,atqa,kind,description}, lifecycleUNSUPPORTED_TYPE,inventory.technologynow dynamic. Serial log addstechnology=and an NFC-A detail line.Verified on the host / in CI
test_nfc_read_onlycases (identity kinds, poll schedule, found-and-never-read, removal tolerance, NFC-V-first ordering, transport failure), a touch-flow case and fixture, a UI source contract and a browser (node) test.native-writer-sanitized, and the RAM/flash deltas (reported in a comment once the firmware job has run). The screenshot receipts will be refreshed from CI'sopentag-ui-reviewartifact in a follow-up commit, as in 1.0.1-beta.4: delete Community (#86) and finish the #85 leftovers #102.Needs a physical WT32 (not done by the author)
Flash the beta.5 application update. Open the serial monitor (115200) and
GET /api/v1/nfcin a browser tab.GET /api/v1/nfchasstate: "unsupported_technology",technology: "nfca",nfca.kind: "type2",nfca.sak: 0,nfca.length: 7; serial lineNFC-A tag nfcid1=04:… sak=0x00 … kind=type2.state: "error"withlast_errornaming "NFC-A mode" / "NFC-A detection I2C" / "NFC-V mode" (mode switch failed; please paste the serial lines).nfca.kind: "mifare_classic",sak: 8(0x18 for a 4K card), 4-byte ID.What I could not verify: that the ST25R3916B accepts the mode switch with the field on in this wiring (RFAL's worker does the same, but it was not run on this station by me), the real detection distance for NFC-A tags with the station's antenna, and the timing numbers in step 3.
Not in this PR (by design): reading NTAG (#95) or MIFARE Classic (#94), writing anything, NFC-B/F (#97), other ISO 15693 chips (#96).
_Generated by [Claude Code](## Also in this PR: automatic manual publishing
.github/workflows/docs-publish.yml("Publish manual") runs on a merge tomainthat changesdocumentation-site/**,VERSIONortools/export_docs.py, and onworkflow_dispatch. It runs the CI documentation checks, exports the manual, syncs it withrsync -a --deleteover a deploy-key checkout of76cb/OpenTag-Station-Docs(keeping that repo's.git,.github,.gitignore), runs the Docs repository's own four checks, and pushes one commitManual for <version> from 76cb/OpenTag-Station@<sha>; it stops with "Manual already up to date" when nothing changed.documentation-site/README.mdand the manual's release page describe the flow and the one-time setup (deploy key with write access on the Docs repo, secretDOCS_DEPLOY_KEYhere, one manual run).Validated locally: the CI documentation step list passes; a dry run exported the manual, synced it into a fresh clone of the Docs repository (25 files change, bringing it from 1.0.0 to this head) and passed its four checks. Nothing was pushed to the Docs repository. The workflow YAML parses;
actionlintis not available in this sandbox, andrsyncis not installed here, so the sync was emulated for the dry run (the GitHub runner image has rsync). It rides on this PR because this session may only push to this branch; say the word and I move it to its own branch and PR.https://claude.ai/code/session_01QcYr11a5B65kS64MagbgF1)_
Generated by Claude Code