v3.4.6

Changes

  • Devices now sleep and wake with the PC correctly
  • Device STALLs now pass through to the PC correctly
  • Devices with lots of interfaces, endpoints or alternate settings no longer require IMPERFECT
  • Devices now connect ~200ms faster
  • Improvements to query latency (status queries are now on-par with stock firmware)
  • Improvements to native report latency (~0.05ms)
  • More memory headroom on models without PSRAM
  • Added a full comparison against the MAKCU stock firmware to the website
  • Overhauled the website, with a new landing page, guide and help section
  • Added search across the whole website
  • Added link previews for pages, help answers, releases and devices
  • Added copy-link buttons across the website and dashboard
  • Added an Options guide explaining what every option does
  • Added a Flash page to the dashboard (releases, files and MAKCU stock firmware, over USB2 or ROM download)
  • The dashboard now offers the fix a connected device needs (ie, IMPERFECT, the Logitech fix)
  • Boxes on older firmware (v3.2.0 to v3.4.1) can now use the Options tab in the dashboard
  • Connection errors in the dashboard now say why, and Retry no longer needs the port picked again
  • Added firmware updates to the C/C++ and Python bindings
  • Streams can now be closed from another thread in the library and bindings (ie, to stop a thread waiting on input)
  • The C ABI (medius-capi) is now published on crates.io, for Rust projects that offer a C API built on Medius
  • Fixed an issue where typing a long string could drop characters
  • Fixed an issue where a fast burst of commands could be lost (and leave a key held down)
  • Fixed an issue where commands could be lost while a device was being plugged in or unplugged
  • Fixed an issue where rendered movement may not add up to what was sent while the mouse was moving
  • Fixed an issue where quick back-and-forth rendered movement could lose a few counts
  • Fixed an issue where a CLIP's first click after a pause could land a frame late
  • Fixed an issue where a 1khz keyboard could run at half rate beside slower endpoints (ie, Wooting keyboards)
  • Fixed an issue where movement could arrive 1ms late under heavy load
  • Fixed an issue where a single late report could leave a device a poll behind for up to 3 seconds
  • Fixed an issue where IMPERFECT devices could lose bulk packets
  • Fixed an issue where HEALTH could report the rate as confident with no mouse bound
  • Fixed an issue where closing a device or stream in Python while another thread was using it could crash
  • Several other smaller improvements to stability and performance

Notes

Devices now go to sleep with the PC like they would plugged in directly, and only wake the PC the way they normally would (ie, a mouse that only wakes on click won't wake it on movement anymore)

The website also got a massive overhaul this update, including a full side-by-side comparison against the stock firmware: https://medius.k4tech.net/comparison

The C/C++ bindings have a new ABI version (10), so rebuild against the new header if you use them

Show commits

Firmware

  1. docs: a stock defect worded so site search still puts Help's answer first for a mouse that won't move07d5c95
  2. ci: the firmware zip goes on the GitHub release as well as the Discord post87db760
  3. docs: release notes for 3.4.6d6171e2
  4. tools: gate docs, rig notes and test comments read on first pass24db7a5
  5. firmware: comments read on first passc349253
  6. docs: the spec, write-ups and comparison read on first pass, with symbols for counts and limitsd89e5ac
  7. tools: gate docstrings, rig notes and test comments in the project's words77de5dd
  8. firmware: comments in the project's words, and the ones that had the code wrong86e8c59
  9. docs: the protocol spec, architecture and comparison write-ups in the project's words, and the facts they had wrong3ada641
  10. docs: the suppression gate needs a device that sends nothing unprompteded20cb8
  11. docs: the protocol doc, README, PSRAM page and detection notes follow 3.4.6cdfd496
  12. docs: comparison rerun on the final build, with report latency, the lead and bulk data on Medius brought up to dateb6695e9
  13. docs: the design record, release notes and gate list follow the bulk data fix9daf47e
  14. firmware: a device's bulk data reaches the PC whole, however late or slowly the PC reads it7457c41
  15. docs: the Discord foundation's rules post ends on rule 53b5f48e
  16. docs: the Discord rework's embeds and panels in the site's blue, and the comparison's benchmarks9193c6d
  17. tools: the release post's embed is in the site's blue, its title linking the release97475a5
  18. docs: the Discord rework's embeds follow the bot's lookbc4e32a
  19. tools: the release post's text is its pings, the notes an embed titled with the release967f32b
  20. docs: the Discord rework's bot posts are embeds503f9f0
  21. tools: the release's Discord post is an embed, with the ping and the credits' thanks in its text2b78491
  22. docs: the design record, release notes and bench notes follow the 400 ยตs lead and the shorter wait after a late reporta302c08
  23. firmware: every report the box relays is readied ahead of its other work, not only the mouse's173dc14
  24. docs: the Discord rework adds a comparison channel holding the site's summary3bde844
  25. firmware: one late report no longer leaves the reports after it a poll late for secondsfdcab3f
  26. firmware: the mouse's reports keep their poll under heavy load, and reach the PC 50 ยตs sooner5044c5d
  27. docs: comparison has no pending tests left; the three that need Windows are listed as not covered47ca3c9
  28. docs: comparison counts reports carrying only injected motion beside a varying mouse, and shows each clone's endpoint 0 reply timedf7ed4e
  29. docs: comparison lists stock's 1 ms mouse interval as a defect on every row it wins02a91e7
  30. tools: comparison checks take a defect on every row it decides, and the device matrix has 2 ms and 4 ms mice263e809
  31. docs: comparison report latency rerun, p99 in place of the slowest reportf3746bc
  32. tools: report latency script places the emulator's clock per window and follows its held-back intervals5953efb
  33. docs: comparison report latency on both boxes at 125 Hz to 1 kHz4163514
  34. tools: comparison script timing every native report from the emulator to the PC, on both boxes401aab8
  35. docs: comparison click timing rerun on the clip fix0b2d552
  36. firmware: a clip's clicks and keys reach the PC as far apart as they were played, the first after a pause included328db02
  37. docs: comparison rebuilt on one hub with Medius 3.4.6 final, the pending tests measured on both boxes7751eb7
  38. tools: comparison scripts give Medius the same fast and back-to-back legs as stock, and keep a clone that reconnectseb32686
  39. firmware: every interface number, setting and endpoint a device has is driven, and a stream polled every frame keeps its rate beside a slower one43f9538
  40. tools: comparison scripts for interface data, intake limits, typing, sleep and timing legs; same-hub evidence and its manifest8ddbc03
  41. docs: v3.4.6 sleep, halt, render debt and link fixes in the design record, protocol and release notes2f353a4
  42. tools: gates find this box's clone by its USB port as well as its ID, and the suspend and halt gates check more1c7907a
  43. firmware: the PC's sleep and a device's halts pass through, rendered debts are delivered, and a device change loses no link frameaa833ee
  44. docs: v3.4.6 faithfulness fixes design record and release notes0d37dfd
  45. tools: a clone lookup never takes another box's clone25c7c2b
  46. firmware: an endpoint the mouse stops reaches the PC, and the device chip keeps one snapshot825a402
  47. firmware: rendered moves deliver exactly what was sent, with no count against them49edc1d
  48. docs: comparison results rebuilt as direct like-for-like rows, with defects and pending testsd03373e
  49. docs: comparison results: relay reruns, Equal by overlapping ranges, defects that reproduce, pending tests for readers8b70cef
  50. docs: comparison smoothing group described in fewer wordsb288474
  51. docs: comparison results format: unmeasured chart points, defects on rows of results, stricter checks; seed refreshedda7b336
  52. docs: comparison results in one checked file, for the site1b87cad
  53. docs: comparison section designdbdc893
  54. docs: dashboard controls design recordf7f2945
  55. docs: v3.4.6 render totals and query replies36d86fc
  56. tools: wire-level timing for the comparison, and the transform gate reads a reader overflow as blocked8cb9f99
  57. firmware: the control port answers queries soonera381d09
  58. firmware: rendered motion keeps its totals with every report the model's375710d
  59. release v3.4.60e0175b
  60. docs: v3.4.6 design record, release tables and protocol change log8ac0726
  61. tools: the transform gate reads its own box's cloneed59ffc
  62. firmware: devices enumerate on the USB specification's reset timingsb93a834
  63. firmware: typed strings arrive whole, and bursts of commands are keptde854a4
  64. firmware: rendered moves add up while the mouse moves2cd6524
  65. docs: comparison wording4229ddc
  66. docs: comparison refusals with the mouse moving, readers in their own processes, hub timingc65622c
  67. docs: comparison move sizes, text clumps and the reworked lock check on stockb728b24
  68. docs: comparison move acceptance by form and pacing, lock checks, native rate triggersc055649
  69. docs: comparison stock re-runs after power cycles, native rate while injecting, parser trigger6875489
  70. docs: comparison second review: trigger order, interval rule, render evidence, imperfect coveragef0f1ff8
  71. docs: comparison data path checksfad19f0
  72. docs: comparison report descriptor limits and endpoint 0 shapes4a6c80c
  73. docs: comparison corrections, Medius fastest-settings and cold-start runs, stock re-run scriptea6672b
  74. docs: the stock firmware comparison: rig, measurements and researchbff4704
  75. tools: quiet_clone and clone_guard cover two clones on one PC9ee97ab
  76. docs: the dashboard's Flash page and one-count flash meterb6d4856
  77. docs: the ROM client spec's erase before the write and its smaller blocks970fa9c
  78. docs: the device feed's first post and the changelog's history in the Discord designe2c8c4e
  79. docs: the ROM client spec's stock done screen, one lineba5c3ae
  80. release notes: a refused Discord post prints Discord's answer0c4a7a2
  81. docs: the dashboard's boot ROM client, spec and planb4a289d
  82. docs: release posts by Clanker and the device feed in the Discord design79bd102
  83. release notes: the Discord post comes from the server's bot, not a webhook60fb701
  84. docs: the honeypot and bot settings in the Discord spec8562eb9
  85. docs: Home under Support in the Discord layoute87073b
  86. docs: the Server Tag in the Discord checklist36866d9
  87. docs: what the Discord spec holds now08f9cad
  88. docs: the Discord Apply checklist3507bba
  89. docs: options spec, the stock erase in regionsffb0cfd
  90. release notes: ping a release role in place of @everyone when one is set414f00b
  91. docs: Discord onboarding beside the captchad29730d
  92. docs: place addresses spec and plan, as built91c0a9c
  93. docs: Discord layout after the second reviewddca522
  94. docs: Discord rework after review5a7d5c7
  95. docs: options spec, project termsfc385e5
  96. docs: Discord rework design0623ddf
  97. docs: options spec, details as tables31b5023
  98. docs: rule 2 is the rule as written2299430
  99. docs: options spec, every option a section6a04047
  100. docs: options spec, links both ways and plain sectionsec9691d
  101. docs: Discord foundation spec as builtb1d3e86
  102. docs: options page and dashboard fixes spec and plan, as built5b95e15
  103. docs: Discord foundation spec, build changes075af56
  104. docs: Discord foundation plan; spec binds by name1b9bfe9
  105. docs: Discord foundation spec7296017
  106. docs: deferred minors spec and plan, as built0de35d1
  107. docs: copy link spec as built1ae6b55
  108. docs: copy link spec and plan6431caa
  109. release notes: no preview for any other link in the postf2e8b1a
  110. release notes: link the release's page, so its card showsd349667
  111. docs: plan wordingef24270
  112. docs: link preview plan; theme-color set before first paint95bfe26
  113. docs: link preview spec and the approved cards975886b
  114. docs: site loading spec as built; search spec follows it5127cd9
  115. docs: site search spec as built049759f
  116. docs: site search spec and planbe54efa
  117. docs: site surfaces implementation planac49efd
  118. docs: surfaces mockup, approved version5a77bb8
  119. docs: surfaces mockup, eighth version4f21c4e
  120. docs: surfaces mockup, seventh versionda90739
  121. docs: surfaces mockup uses the full page width0910fcc
  122. docs: surfaces mockup, fifth versioncad1657
  123. docs: surfaces mockup, fourth version7a3f54c
  124. docs: surfaces mockup, third version21fe54e
  125. docs: design mockup for the site's remaining surfaces9951773
  126. tools: closer injection bursts in the site feed capture, and no capture dateeb72838
  127. tools: site capture rigs read the run exactly and restore every option they changefc314f6
  128. tools: descriptor and report capture for the docs sited01f12c
  129. docs: plan wording0a95b59
  130. docs: site theme and user pages plan8c13329
  131. docs: site theme and user pages specc4a6fe7
  132. docs: the approved site design mockupc213605
  133. docs: every dashboard page is indexed8edef13
  134. docs: the search foundation spec as built35d4814
  135. tools: release notes refuse unknown sections and stray mentions; long posts split cleanly42821b3
  136. docs: wording in the search foundation spec and plan371a670
  137. docs: release notes for v2.2.1 to v3.4.5d8ea65d
  138. tools, ci: release notes written once, posted to GitHub and Discorda572a8e
  139. docs: plan for the docs site's search foundation304274c
  140. docs: design for the docs site's search foundation6b7013f

Library

  1. docs: doc comments, the C header and Python docs read on first passc8dc355
  2. docs: doc comments, the C header and the Python docstrings in the project's words, and the facts they had wrong88f2073
  3. library 3.4.6: close a stream from another thread, the C ABI on crates.io, and docs that match the code5260727
  4. docs: the library follows firmware 3.4.6: what relay_drops counts, sleep, STALLs, typing capacity and the RAW IN queue042a40c
  5. library: mock refuses an activate or reboots after one, tests for the abort and the confirm retry390deeb
  6. python: Device and ClipHandle close safe across threads13e2dd3
  7. python, capi: closer to the crate, safe stream close across threads, firmware update and confirm through the crate881a342
  8. capi: MediusDevice::into_raw, a handle over a Device that's already open0d7e773

Docs

  1. comparison: data synced; search for a mouse that won't move finds Help's answer again017498a
  2. comparison: a count out of a total reads 6/10a109fb7
  3. site: every page reads on first pass, with symbols for counts and limits30cfe39
  4. docs: comparison wording synced from the firmware repo: native rate, emitted reports, relaying6335da1
  5. docs: every page and the dashboard in the project's words, and the facts they had wrongd72fe58
  6. docs: library 3.4.6: closing a stream from another thread, firmware update and confirm in every language, and the mock's update knobscf7e706
  7. docs: the site follows firmware 3.4.6: sleep, STALLs, typing capacity, what relay_drops counts and when a transfer gets no answerec1cbbc
  8. test: the stats page's dates are checked in the locale the tests run under2df307e
  9. docs: the comparison follows the final firmware build, and the RAW page describes how bulk IN fills its queue066ed8b
  10. feat: the comparison JSON carries a few benchmarks with both boxes' values, and every area's pagef8a3694
  11. feat: the comparison JSON counts the results each box is ahead in, by area487b38a
  12. fix: the comparison JSON is built once per deploydba8df8
  13. feat: the comparison's Overview as JSON, for the Discord botae4be1a
  14. comparison: the Method page drops its pending tests sectione4f07d6
  15. comparison: injected-only reports beside a varying mouse, and endpoint 0 reply timescdbcf84
  16. site: links land clear of the bar and light the place they go to, and the settings table's headers wrap over their columns0c03139
  17. comparison: a defect marks every row it decides and links to its own place in the listb521746
  18. comparison: report latency rerunac08092
  19. comparison: report latency section, led on the Overview6c7aca3
  20. comparison: click timing on the clip fix86c7316
  21. comparison: results from the one-hub final pass, the pending tests added, and the rig described as one hub9fb2033
  22. docs: comparison pages rebuilt as direct like-for-like results; headings and in-page links fixed682bbeb
  23. docs: comparison results refreshed; Method states the Equal rule and what interval sd measures4412cf5
  24. feat: a Comparison section: MAKCU's stock firmware against Medius, area by area7c3acdc
  25. docs: the privacy page carries what the law asks for, in the site's voice5169636
  26. fix: rate limits drop an address when its window ends, and count each visitor rather than the proxyfbba2e2
  27. feat: a Flash page that writes either chip through its ROM, older releases, and dashboard controls that match the sited539a57
  28. docs: update firmware version strings to 3.4.65a216b0
  29. test: comment wording in the Devices JSON test405f9d9
  30. test: each device's address in the Devices JSON is its own row's carda0aabd5
  31. fix: the privacy page dates a scam signature from the last scam post that added it30c425e
  32. feat: each device in the Devices JSON carries its card's addressc1dca68
  33. feat: the Devices list as JSON, for the Discord bot21eb8fa
  34. fix: the privacy page keeps scam signatures for a year, as the bot does161c3f2
  35. fix: the privacy page names scam signatures as the bot keeps them50b709d
  36. feat: a copy of a box's stats on request; the privacy page covers copies, verifications, signatures and DMed transcripts875c68e
  37. fix: the stock firmware relay follows MAKCU's toolkit 1.15.20b9fe229
  38. fix: the stock source reads as the release does, plainer fix offers, a stock erase as MAKCU's toolkit does it, and a fuller privacy page4fdc7ba
  39. feat: privacy page, a footer link to it, and a stats delete commanded419c8
  40. feat: an address and a link card for every section, tab and panelc210347
  41. docs: emit, ride and relay in place of paraphrases across the sitee28100b
  42. docs: option details as tables with measured delays, not proseda96a00
  43. docs: Rendered motion and Wire rate as sections of the Options guide2ebbb90
  44. docs: plain option explanations with links back to the dashboard, and noun headings across the reference13ba603
  45. docs: plainer wording across the reference pages, comments and test names24c9f54
  46. fix: review findings for the Options page, the fix offers and the stock firmware relay and flashd65f947
  47. docs: Help sends owners to the dashboard for older boxes and MAKCU's stock firmware63903b1
  48. feat: Update's Manual tab can put MAKCU's stock firmware back on either chipa08c74d
  49. feat: the server relays MAKCU's signed stock firmware, checked as MAKCU's toolkit checks itd3287ee
  50. feat: the dashboard offers the fix a connected device needs, in placebef0948
  51. feat: boxes on firmware from v3.2.0 get the options their firmware hasb83f9fe
  52. feat: an Options page in the Guide, linked from each option on the dashboard864ed80
  53. fix: review findings: a poll that stalls after a flash, the Devices twin's links, tab spacing per strip, and the feed on browsers that round97be654
  54. fix: no page scrolls sideways at 320 px, tab strips fit before they scroll, and Copied stays clear of tabs8c92a13
  55. fix: the landing's feed and descriptor are right before the app runs, pause under the pointer, and take the keyboard2aa8ac3
  56. fix: a link to an option says how to reach it before a box is connected0de7f3c
  57. test: crawlcheck fails a doubled or missing link-preview tag, and one naming another pagec7b11a7
  58. fix: link cards draw every Latin letter off the main thread, item pages carry their own data, and drafts stay off the changelog33762e7
  59. fix: an unplugged box waits for its port without timers, and Reconnecting reads as a statusaf7a5ea
  60. fix: link icons take no room until shown, keep headings' names, and Copied never widens the pageb921cb9
  61. docs: the link icon and Anchor in CLAUDE.mde068230
  62. fix: the open tab's Copied stays inside the tab bard50cf64
  63. test: the build fails on a place search can land on with no link icona2880ea
  64. feat: copy the link to the open dashboard tabfc844d6
  65. feat: copy the link to a Help answer, device or release4d5c7ba
  66. feat: a copy link icon on every section, panel and marked blockaa606cd
  67. fix: one release date for every reader, page and cardd884d2a
  68. docs: Pulsar ZywOo The Chosen Mouse reported working675f071
  69. docs: six more devices reported working, four confirmed on v3.4.585a9319
  70. fix: link cards kept by what they show, unknown items stay a 404, release lookups answer within 5 s513e5fb
  71. test: crawl every link card and item address0cfbc07
  72. fix: fill the changelog and stats blocks as the prerender now captures them683aef8
  73. feat: serve link cards and item addressesc596cf4
  74. feat: link card tags on every page, and addresses for one Help answer, release or device6ab40f3
  75. feat: draw link cards as PNGs on the serverbc87a87
  76. feat: what each link card says, and addresses for single items71ff1ec
  77. feat: link card fonts and text layout798032a
  78. fix: one top bar and grid for the site, scroll kept per page, motion that never plays twiceda5197e
  79. perf: split the site's code per page and fetch search on use2653d39
  80. feat: site search built from the pages themselves514fb1c
  81. feat: rebuilt site search1b90eb8
  82. fix: the box diagram matches the boarda298aa7
  83. fix: the safety clear's caption is one short line1845204
  84. feat: one motion for every page0fb5d52
  85. fix: the dashboard's rare states, each rendered and measured07ef510
  86. fix: the 404's description names the links it carriesdf1517d
  87. fix: the 404 page prerenders again237b076
  88. fix: dashboard controls as designed: sliders, steppers, buttons and linksaace53a
  89. fix: review findings across the dashboard and the Guide432b849
  90. docs: pages open on their title and first paragraph, with no subtitle465420c
  91. feat: the 404 names the address asked for and where to go instead55e44e2
  92. feat: the Guide in three pages: Start here, Devices and Helpe2ceb4c
  93. feat: Changelog with each version beside its notes, and commits grouped by repo418a637
  94. feat: Stats on tabs, with charts that read out the column or row under the pointerbade974
  95. feat: Control on tabs, Update with a manual flash tab, and Set up as one flowc05ee44
  96. feat: the Device page on tabs: overview, options and a log to copy or save8211222
  97. feat: the box drawn from its board, for wiring and install steps07b0009
  98. feat: segmented choices, a filterable dropdown and a log for the dashboarddd94a12
  99. feat: page tabs and panels for the dashboard, and pages that use the full widthf035a3b
  100. chore: a box that answers without hardware on the dev server25bcb11
  101. feat: the landing feed shows a burst of injected motion every few seconds, and no capture date6a26bc8
  102. feat: the landing feed recaptured with exact injected-byte marks9278d64
  103. fix: the landing intro carries on when the app takes over, and descriptor panel fixesa6f6ce7
  104. fix: landing and changelog answer within seconds while GitHub or Discord hang0130bec
  105. fix: plainer Troubleshooting lead and search descriptiona3fe643
  106. fix: the custom scrollbar shows in Chrome, square and blue on hoverba7b2c6
  107. fix: the landing feed keeps every byte of a long report on screen at any widthbfec47c
  108. test: crawlcheck holds every page to one h1 and a footer, and no hidden reveals1fa1d71
  109. feat: landing page3967f7d
  110. feat: captured descriptor and report samples for the landing page4e62486
  111. fix: phone panels, scrolling, prerendered reveals, contrast and search anchors85f94ad
  112. fix: phone page panel closes on a box pick or search, and dashboard tools get the full width9765e4a
  113. fix: guide corrections, and page leads without trailing periodsc1c3e36
  114. fix: compatibility rows stay apart per device, and the Discord count retries after a failure94c9e64
  115. fix: prerender waits for the 404 page's header3568738
  116. docs: project notes for the new shellf4613ce
  117. feat: not-found page on the new shelld049c04
  118. feat: landing page blocks1e3d911
  119. feat: live figures on the landing and compatibility pagesd54320d
  120. feat: guide pages for box ownersc6a3a05
  121. feat: compatibility data1d3f078
  122. feat: FAQ data and structured data95b7570
  123. feat: docs content in the site themedf74a74
  124. feat: frame diagrams as byte strips19b6a89
  125. refactor: docs pages use page headers and sections5f893f5
  126. feat: dashboard in the site theme6f16d46
  127. feat: docs pages on the new shell20b6382
  128. feat: page header, sections and on-this-page raildf5300b
  129. feat: docs sidebar1bdd0e5
  130. feat: site nav and footer4c7d086
  131. feat: guide section routes99dc575
  132. feat: scroll reveal helpersf5e97d9
  133. feat: site theme tokens, fonts and base stylesf59b667
  134. feat: the Control and Advanced control pages are indexedb1a7aa7
  135. fix: the server's shared modules ship in the image; live pages answer 503, not a placeholder3050201
  136. chore: wording in comments, a description and a test name0a59366
  137. feat: bold and code in release notes; crawl check typechecks4905b9e
  138. docs: the route registry, sidebar links and 404 in CLAUDE.mdd490c73
  139. ci: sitemap dates from each page's last commit0df48e2
  140. feat: release notes on the changelog, commits behind Show commits, filled in for crawlers02a5489
  141. test: drop the removed unsupported-browser cards from the search exemptions9e34f4e
  142. feat: dashboard pages keep their content in a browser without Web Serialb8349a0
  143. feat: breadcrumbs and a site footer452aeae
  144. feat: a sidebar of real links9598337
  145. feat: a 404 page67d43ae
  146. feat: 301 to the canonical URL and a real 404 for unknown pathsd1e876d
  147. feat: page head and structured data from the registryff7fb51
  148. feat: prerender every route, the dashboard included, from the registry6ab9ba9
  149. feat: one route registry for page titles, descriptions and navigation13c9fe7

v3.4.5

Changes

  • Fixed an issue where certain models without PSRAM would fail to update
  • Fixed an issue where certain models without PSRAM could get stuck when attempting to start
  • Improved EP0 round-trip timing (~-30% reduction in EP0 latency)
  • Improved timing stability for certain EP0 commands

Notes

Sorry to those affected, this hotfix should address the issues you had with updating. Should be fully fixed now.

Show commits

Firmware

  1. docs, tools: v3.4.5's control request timing and RAM figures6ad9805
  2. firmware: control requests are answered from RAMbf6e62f
  3. docs: v3.4.5 in the release table and protocol change log2dcc498
  4. release v3.4.595a4d53
  5. docs: internal RAM on a box without PSRAM, and how the update gate checks it977e03e
  6. tools: the update gate runs the device image as a box without PSRAM does2339868
  7. firmware: the clone starts on a box without PSRAMe8c1e2f
  8. docs: the usage stats design and plan reach the page from the Stats tab alonec2a431d

Docs

  1. docs: update firmware version strings to 3.4.5116031c
  2. dashboard: fewer words on the Update, Advanced and Device pages8b0a097
  3. dashboard: the connect card without the stats line45c272b

v3.4.4

Changes

  • Over-capacity IMPERFECT device's extra endpoints will now function correctly (ie, Wooting keyboards)
  • Added support for multiple boxes in the dashboard
  • Added flashing over USB2 from the Advanced page
  • Boxes on newer firmware than the dashboard supports will now be able to connect (to upgrade/rollback)
  • Added a public usage stats page
  • Updates now catch a chip which fell back to its previous firmware during the process
  • Fixed an issue where locks could take up-to 50ms to engage/disengage (now <2ms)
  • Fixed an issue where some over-capacity devices would constantly re-enumerate on Windows
  • Fixed an issue where devices with several interfaces could send reports in uneven gaps
  • Fixed an issue where a 500hz device could read as 1khz if some reports arrived late
  • Fixed an issue where the box could ignore a program's first commands if the previous was disconnected mid-command
  • Fixed several issues when a cable is pulled mid-flash
  • Fixed an issue where the dashboard couldn't read the box after a program had been using it
  • Fixed an issue where the dropdowns could continue using the CPU after being closed (on the dashboard)
  • Numerous other small improvements to performance and stability

Notes

The over-capacity IMPERFECT changes allow devices which originally had dead endpoints to now function fully. It still requires IMPERFECT to be enabled, but DRAMATICALLY improves device-support and security in IMPERFECT mode. (IMO, there is almost no difference in security between a perfect and imperfect clone now)

The public usage stats page can be found here: https://medius.k4tech.net/dashboard/stats

Show commits

Firmware

  1. docs: the usage stats design's result names and totals4020244
  2. docs: the usage stats page down to its numbers5fb9415
  3. docs: the usage stats page is reached from the dashboard alone14867a0
  4. docs: the usage stats design's limits, active boxes and shared devices7c2b211
  5. docs: the public usage stats design and plan628d511
  6. docs, tools: plainer wording in the protocol doc, designs and gate notes3dc6e29
  7. tools: leave the control port readable by the browser dashboard390ca7d
  8. firmware: the control port drops a frame its sender abandoned83fbd1b
  9. docs: the USB2 flash design's rare paths and what they changed4a65e0d
  10. docs, tests: the stable update path names its resync, waits and the messages between the chips8183489
  11. docs: the USB2 flash design as built, and its hardware run19410d8
  12. docs: name the stable update path section, and plain punctuation in the plan8df2fee
  13. docs, tests: the update path keeps its shape from protocol 5 on9d7e587
  14. docs: plan for flashing over USB2 from the dashboard's Advanced pagedd5c6ce
  15. docs: design for flashing over USB2 from the dashboard's Advanced paged543602
  16. docs: USB device box icon, and dropdown menus idle once closedbe31119
  17. docs: box icons in the multi-box dashboard design6dd0725
  18. docs: multi-box dashboard design, Add box tab and card wordingaa5f821
  19. docs: the multi-box dashboard design as builtdfe9a8c
  20. docs: design and plan for managing several boxes from the dashboarda7b7de2
  21. firmware, tests, tools, docs: an imperfect clone keeps every IN endpoint lived4eb9ec
  22. firmware, tools, docs: a lock is in force before any command sent after itea2e07a
  23. docs: v3.4.4 in the protocol change log4d8f564
  24. tools: the Logitech fix runs on Linux and Windows with nothing to installc6d64e1
  25. docs: v3.4.4 in the release tablesd2f2839
  26. firmware, tools, docs: an endpoint polled every frame keeps one place in it beside slower onesff60509
  27. firmware, tests, tools, docs: the native rate reads true through reports a poll late74558cf
  28. release v3.4.4c2417ef

Library

  1. library: over_capacity says what it counts, now that the box serves every IN endpoint610a5fe

Docs

  1. dashboard: Waiting for injection and Move the mouse to start as neutral chips292d018
  2. dashboard: stats bar labels wide enough for the longest routec56d2ae
  3. dashboard: stats totals as tiles, Unconfirmed as a flash result, a nameless device named by its kindd397ef4
  4. dashboard: the stats page down to its numbersc40b38f
  5. dashboard: the stats page is reached from the dashboard alone535fdf2
  6. dashboard: the dev server refuses to serve the stats database550b9c7
  7. dashboard: the stats page says when it can't load, wraps long names, and tells flash results apart5a33b27
  8. dashboard: stats rate limits, a box active only when it connects, a device listed once two boxes share itaeea4d5
  9. dashboard: stats headings named as nouns, a peak on each chart, and New this week among the totals848103a
  10. dashboard: a volume for the usage stats databasef870b69
  11. dashboard: a public stats page, and a note on the connect card that boxes are counted926b4be
  12. dashboard: report each ROM download flash to the public stats1228dcc
  13. dashboard: report each box, its cloned device and each update to the public stats72686a7
  14. dashboard: a usage stats sink, and the totals read for the paged0c9d29
  15. dashboard: an event route and a totals route for the usage stats04f1ad4
  16. dashboard: usage counts in SQLite, a box known only by a keyed hash of its MACadd952c
  17. dashboard: the stats server checks each reported event, field by field653dde4
  18. dashboard: name ROM download on Advanced, and plainer copy for the fixed update pathd4a5e73
  19. dashboard: a box the browser can't read says to replug USB2, instead of an empty liste6413eb
  20. dashboard: say which firmware needs the resync before a handshake77af84e
  21. dashboard: a flash retried after a pulled cable clears what the box still held, and the box's busy is no longer worded as a held port81471f1
  22. dashboard: a box unplugged mid-flash reconnects when it comes back, and says the flash didn't finish57d455e
  23. dashboard: a newer box is named as newer on every page, and Update leaves Advanced's result alone46e20f8
  24. dashboard: Advanced keeps a flash set up when a box comes or goes, and spaces its fields like the other cards3f6a169
  25. dashboard: one update at a time, and a newer box found after an install is connectedcb6c47d
  26. tests: pin this page's half of the stable update pathd25cd11
  27. docs, dashboard: name the stable update path, and tighten two comments1372324
  28. dashboard: a refused file names no version to come, and Flash anyway has its own row3078029
  29. docs: the update path keeps its shape, and Advanced's search words9aee6d0
  30. dashboard: flash either chip or both over USB2 from Advancedc563c96
  31. dashboard: an update records which slot each chip came back onf07950b
  32. dashboard: say when a box is newer than the page, and where it can still be flashedcfd434a
  33. dashboard: a box on another protocol is kept connected without asking it for health5713f0a
  34. dashboard: a box on a newer protocol connects, for updatingbda9d27
  35. dashboard: read a firmware file's chip and version before flashing it0e44693
  36. dashboard: a USB device icon for a box64ffd79
  37. dashboard: dropdowns no longer keep working in the background after they close2c3bca1
  38. dashboard: pick an icon for each box in the sidebar3e36c5b
  39. dashboard: long box names end in an ellipsis, and no Boxes section without Web Serial130805b
  40. dashboard: Add box as the last box tab, and box card wording to match its siblingsa5285c6
  41. dashboard: box list as sidebar tabs, Identify on the box card4c0664d
  42. dashboard: one opener per port, and a box is held by one tabb3f5522
  43. dashboard: every box on the PC, listed and held at oncecc61111
  44. docs: an imperfect clone serves every IN endpoint2a7fdfd
  45. docs: a lock is in force before anything sent after itf4d5828
  46. docs: update firmware version strings to 3.4.40381ea2

v3.4.3

Changes

  • Improved support for many more device types (devices with no HID interface, alternate settings, ect)
  • Endpoint halts now pass in both directions correctly
  • Improvements to native report latency (packets emit 1-tick after arrival instead of 2)
  • Updated to ABCurves v2.0
  • Added support for high-dpi while using rendering
  • CATCH now reports zero-length packets correctly
  • Improvements to latency for library replies on Windows
  • Fixed an issue where writing to a device's OUT endpoints was capped at ~1 packet/ms
  • Fixed an issue where reports could be lost when the PC paused reading the stream
  • Fixed an issue where reports could be lost when a device switched settings
  • Fixed an issue where zero-length packets from a device wouldn't be passed to the PC
  • Fixed an issue where devices with a small control endpoint could take several seconds to connect
  • Fixed an issue where some some strings and descriptors weren't cloned exactly as the device sent them
  • Fixed an issue where a low-speed device's first report after a pause could land a frame late
  • Fixed an issue where a CLIP could play 2 entries in 1 report
  • Fixed an issue where MOVEs at poll rate could merge
  • Several other smaller improvements to stability and performance

Notes

This update should provide numerous improvements to stability, latency, and device support

I have some other changes in the works too, but I want to get this stuff out first

Show commits

Firmware

  1. firmware, tools, docs: relayed reports reach the PC on the poll after they arrive, and none are lost across setting switches8ab665e
  2. firmware, docs: a clip plays one entry to a report, every time2974980
  3. docs: v3.4.3 in the release tablesdae9d77
  4. firmware, tests, docs: a low-speed device's first report after a pause keeps its place557253f
  5. firmware, tools, docs: a PC that stops reading a stream loses nothing, and reads it current afterd8f701e
  6. firmware, tools, docs: zero-length packets on interrupt endpoints reach the PC as the device sends them1f918af
  7. firmware, tools, docs: relayed endpoints keep every packet through halts, resets and setting changesebe9ed7
  8. firmware, tools, docs: reports reach the PC sooner, and slower endpoints wait on its polls65aca8b
  9. docs: the device shapes v3.4.3 clones, the OUT relay, endpoint halts and alternate settings08376dd
  10. firmware: HID interfaces with alternate settings are cloned, and a switch loses no report7649b8a
  11. firmware: an endpoint halt passes both ways between the PC and the devicee6d0427
  12. firmware: every packet the PC writes to an OUT endpoint reaches the device, at the PC's rate41fdcee
  13. firmware: IN endpoints numbered 5 and 6 are cloned72aaa87
  14. firmware: a control request for more than 2048 bytes reaches the device as the PC wrote itf1d0046
  15. firmware: a patched string is readable on a device that lists no languagebb769ca
  16. firmware: the device qualifier and other-speed configuration are cloned7e160c8
  17. firmware: a device with a small endpoint 0 enumerates at once8f6a057
  18. firmware: strings are cloned as the device answers them, in every language it listsa1bf68b
  19. firmware: a device with no HID interface is cloned7b63fb9
  20. firmware, docs: remove the unused capture-owner hooks256946b
  21. firmware: class and vendor requests to any interface reach the device45efb0e
  22. firmware: vendor relay buffers are sized to the endpoints that can be live at oncefadb88b
  23. firmware: a device past the host's descriptor tables clones what fits and says what did note3fa3d0
  24. firmware: a device that refuses its own report descriptor is cloned refusing itcb82a3b
  25. firmware: a slow report descriptor fetch is waited for, not left out of the clone3144bee
  26. firmware: a HID descriptor after the endpoints, or listing another descriptor first, no longer loses its interfaced154a9f
  27. firmware: devices whose interface numbers skip a value or start at 1 are cloned4f0ce37
  28. firmware: an EP0 answer is relayed whole or refused4511feb
  29. firmware: tell an interrupt transfer a zero-length packet endedabea180
  30. firmware: count the IN endpoints a configuration can have live at once2ef987d
  31. firmware: name the host limit a configuration exceedsf963527
  32. firmware: one device is cloned from behind a hub, the first to configure50d7fb7
  33. firmware: OUT credit that lets a clone hold the PC the way a busy device does82f7856
  34. firmware: the report descriptor store keeps a device's refusal as an entry1a9a03b
  35. firmware: vendor endpoint buffers are sized to what can be live at once93a9591
  36. firmware: a table of string descriptors keyed by index and language41193f0
  37. firmware: find a HID interface's report descriptor wherever its HID descriptor sits10e6ee1
  38. tools: a descriptor gate and shared sim shape builders08d473b
  39. docs: design and plan for faithful clones of more device shapes45a09a0
  40. firmware, tools, docs: the box's reports reach the PC at one place in its framefad5327
  41. firmware: moves at the poll rate stay one to a report beside a slower mousecffba9b
  42. tools: the relay gate checks a feature report's bytes reach the device8d8aff7
  43. firmware, tools, docs: a HID interface without an interrupt IN is clonedd88cfc3
  44. firmware: rendered motion keeps pace with a flick (ABCurves 2.0)5c24af8
  45. release v3.4.315efeb3
  46. firmware: the host chip logs lost reports, not a heartbeat every 5 s3c69470

Library

  1. capi: format a test31fd6ba
  2. library, capi, python: relay_drops as the firmware counts it now that the box polls only as the PC reads47f1aff
  3. library, capi, python: the zero-length packet flag on every relayed traffic class6516ce7
  4. library, capi, python: relay_drops, RAW OUT and the device kind as the firmware has theme861041
  5. library, capi, python: a clone is up once its identity says so, and the counters and kinds read as the firmware has them8d9ceb2
  6. library, capi, python: a clone with no HID interface counts as cloned47df70c
  7. library, capi, python: 3.4.3d3f2e13
  8. examples: inject_latency also times a query's round trip4ce1787
  9. library: a Windows read wakes on the box's reply, not on a 2 ms poll466412c

Docs

  1. docs: relay drops, and the room RAW reports have in an interrupt IN queue15f09d3
  2. dashboard, docs: zero-length packets on interrupt endpoints and the CATCH flag that marks them5f69d13
  3. docs: relay drops, RAW OUT waiting, the requests CATCH sees on EP0, the product string and the device kindeb4619f
  4. dashboard, docs: an attached device the box did not clone, relay drops, the IN endpoints a clone serves and the requests it passes on361a7a8
  5. docs: the native requests page on a clone with no HID interface, and which long requests the box refuses9b2a754
  6. dashboard, docs: a clone with no HID interface reads as cloned, and the IN endpoints a clone serves at onceca384a0
  7. docs: when a native report keeps its own poll beside an injectionc721340
  8. docs: a rendered report is bounded by the mouse's own field, not 127 countsb699bcf
  9. docs: the library's unsafe code is its Windows comm-event wait8e996ba
  10. docs: update firmware and crate version strings to 3.4.365632ec

v3.4.2

Changes

  • Moved all motion processing to the host chip (rendering, riding, spreading, locks, ect)
  • Added factory reset
  • The library now restores locks, rules, subscriptions, ect after a box restart
  • Injection now wakes a sleeping PC (where applicable)
  • Fixed an issue where using CATCH could cause the devices movement to be dropped
  • Fixed an issue where the library could bluescreen Windows PCs using the WCH CH343 driver
  • Fixed an issue where a descriptor patch that failed a check could still override the device
  • Fixed an issue where a device with reports larger than one packet would stop after its first report
  • Fixed an issue where OUT reporting could be merged and lost on certain devices
  • Fixed an issue where back-to-back injected clicks could be lost
  • Fixed an issue where injected reports could delay a native report
  • Fixed an issue where a devices reports could drop during an update
  • Clearing descriptor patches no longer requires a reboot
  • Several other smaller improvements to stability and performance

Notes

With the motion processing being done on the host chip, it should eliminate any slowdown that occurred on certain devices whilst using Full Rendering and other high-intensity features

Overall, we are looking at a roughly 40% decrease in render latency across a number of different measurements. This also means native reports are delivered more consistently

Show commits

Firmware

  1. firmware: a render comment keeps the reason one report is outstanding1517fe2
  2. firmware, tools, docs: fewer words in every comment and doc, and the claims the pass found wrong11752c1
  3. docs: a flagged MOVE skips spreading and rendering with riding offe8dd0ca
  4. docs: the protocol reference and architecture match the corrected behaviourf08625b
  5. tools: gates for the advanced control fixes, session releases and OUT relay, all sim-driven68b5ebd
  6. firmware: advanced control corrections, OUT relay fixes and report schedulingaafaf4f
  7. docs: the version table names the flag RESET grew2e623a4
  8. tools: the client's opcode list says what RESET carriesf3ad3a6
  9. firmware: RESET requires its flags byte, like every other commandc7a4dd2
  10. firmware: RESET can take the box's stored settings with itd69e608
  11. firmware: a suspended PC is woken for injection, and hears it when it wakes10f89dd
  12. tools: the render gate reads a property the paced fill cannot have1389ff4
  13. firmware: the health bit answers for the control PC's motion, not the device's ownb39b53f
  14. firmware, tools: comments say the one thing that is not obvious, in two lines8895c70
  15. firmware: injected commands cross the link a whole frame at a time47cf5e8
  16. tools: the wedge gate walks past an identity it has already spent3a4943b
  17. firmware: an abort that worked no longer leaves the session open behind itca82234
  18. tools: three cadence checks now read the value their property is about297b43d
  19. firmware: what a departed control PC left behind is released whether or not a device is attached8aefc06
  20. tools: the wedge gate stops spending a device identity it cannot get back91a3285
  21. tools: a cadence gate was grading its own sender, not the box4298d03
  22. firmware: an update no longer loses its answer to the link's own recovery3e1e82f
  23. firmware: a relayed update says what happened to itb567d1a
  24. firmware: an OUT report lost on the link is the relay shedding, not input the game missedfb52822
  25. tools: the reference client's stats reply length follows the field it grew9e4111d
  26. firmware: a drop counter says which fault it is, or it says nothing useful2af524b
  27. tools: what a scale does to physical input no longer needs a hand2fca234
  28. firmware: injected motion leaves on arrival, not on a clock of its own0ce9edb
  29. tools: the transform gate measures the weigh and the transform together4960cd1
  30. firmware: nothing that carries motion blocks on the link, and the host watches its own workfe925ec
  31. firmware: the authority's answer crosses as the weigh and the release, apart4f02b05
  32. firmware: the box reports what the links droppedc4bfad1
  33. firmware: the motion authority releases the lock it takesabe6356
  34. firmware: the motion authority moves to the host chip87f59c6
  35. firmware: one weighing unit, on the delta rather than the reportefa315b
  36. firmware: the motion primitives move to commondea849e
  37. docs: the motion authority moves to the host chip9038058
  38. release v3.4.26cdbbfe
  39. tools: the conservation arm puts the sim back when it is done0154163
  40. tools: the catch rig asks whether observing cost the player any movementac495eb
  41. firmware: observing the traffic no longer costs the device's reportsff0c296

Library

  1. library, capi, python: fewer words in every doc, and the claims the pass found wrong45468f3
  2. library: a non-blocking control-port read avoids a WCH serial-driver crash on Windows5b60d0b
  3. library, capi, python: the library restores its state after a box restart or session release37fdd95
  4. library: RESET carries its flags byte on both paths460c51c
  5. library, capi, python: the box can be asked to erase what it keeps across a reboote84f1b3
  6. library, capi, python: comments say the one thing that is not obvious, in two lines6fc9f65
  7. library, capi, python: back-pressure on a relayed stream is its own counterb5782b0
  8. library, capi, python: control protocol 9 and the box's link drop counters57a56fd

Docs

  1. dashboard: values that stand alone start with a capital47cdd60
  2. dashboard: DTR and RTS reset neither chip, measured28c624a
  3. docs, dashboard: fewer words on every page, and the wrong claims the pass turned up60d5c89
  4. dashboard: shorter performance row labels33442a7
  5. dashboard: the performance card shows every counter's counta196c66
  6. dashboard: the relayed-streams chip stands on its ownf862c43
  7. dashboard: decode protocol 9 catch flags and stats, and show patch and rewrite state as reportedda3a75a
  8. docs: the library and bindings pages cover session recovery and the corrected advanced controlbbd45cf
  9. docs: native pages for RAW, TRANSFER, REWRITE and PATCH, and a sidebar that fits its panef9c68d5
  10. docs, dashboard: RESET carries its flags byte on every framed678a45
  11. docs, dashboard: RESET's erase-and-reboot flagf231ce8
  12. docs, dashboard: comments say the one thing that is not obvious, in two linesb648d75
  13. docs, dashboard: the stats counters tell lost input from relayed back-pressure1cf6f21
  14. docs: the stats offsets are what-inclusive, and the samples speak protocol 96bbb5f7
  15. docs, dashboard: control protocol 9 and the inter-chip link counters37a8d9c

v3.4.1

Changes

  • Added packet-based triggers to the CLIP system
  • Added AC pan, raw reports and control transfers to CLIP system
  • CLIPs now function correctly on all device types, not just mice
  • Fixed an issue where injecting at the devices native report rate could blend moves together
  • Fixed an issue where a descriptor patch wouldn't apply to a device without a mouse interface
  • Fixed an issue where rewrite rules weren't cleared when the control link went silent
  • Fixed an issue where rewrite rules on a vendor interface's OUT wouldn't match
  • Improvements to latency when injecting RAW packets via the library
  • Several other smaller improvements to stability and performance

Notes

Packet triggers let a CLIP fire directly from the device's traffic. This allows for specific behaviour when a flag is seen (ie, conduct macro when DPI button is pressed): https://medius.k4tech.net/library/clip#packet-triggers

The protocol and ABI version has changed to 8, so devs with their own libs will need to update accordingly

Show commits

Firmware

  1. docs: what protocol 8 changes, and the README's command referencef9bea34
  2. firmware: control protocol 86388acc
  3. docs: a packet trigger's read-back has its present bit clear3fd6757
  4. docs: clip packet triggers44c550a
  5. tools: the clip gate proves packet triggers on every surfacef219f0b
  6. firmware: a matched packet is a clip trigger9ea7e94
  7. docs: whole commands at the report rate14e9bf1
  8. tools: the spread gate measures a report-rate loop, and a tool keeps the clone off the desktopd5c7ed6
  9. firmware: a command loop at the report rate lands one command on each report807593e
  10. docs: clip entries for pan, raw reports and transfers, and the clip transfer classd35751d
  11. tools: the catch gate presents its own streaming mouse for the clock-offset leg9a73e43
  12. tools: the reference client builds the new clip entries, and a clip gate proves them on the sim9bfa856
  13. firmware: clips carry pan, raw reports and control transfersf2e6caf
  14. release v3.4.1c09fa89
  15. tools: the clone-policy gate waits out a multi-configuration capture45dd27e
  16. tools: the descriptor-patch gate covers a device the box finds no mouse in66280e5
  17. firmware: a descriptor patch is stored against the device, not the mouse in itd4aef98

Library

  1. library: the C header names its ABI, and a reconnect refuses a box on another protocola0740f2
  2. library: control protocol 8 and C ABI 8dac754e
  3. library: packet triggers follow the box through the opt-in, and the mock refuses as the box does8208e81
  4. capi, python: clip packet triggerseb0a3a7
  5. library: a matched packet is a clip trigger7a93a44
  6. docs: set_spread says what a loop at the report rate getsa006979
  7. examples: the hardware suite proves clip entries and a clip across a reconnect901a1ec
  8. library, capi, python: clip frames carry pan, raw reports and control transfers1a54225
  9. ci: the crate, the C ABI and the Python binding must carry one versionc066099
  10. library, capi, python: the bindings reach the transfer timeout the crate has9454600
  11. release: bump the crate, C ABI, and Python binding to 3.4.1cecf373
  12. library: raw sends without a round trip for the opt-in50a4f8d

Docs

  1. docs, dashboard: what protocol 8 changes, the C ABI constant, and a reconnect across protocolsf85d02b
  2. docs, dashboard: control protocol 8 and C ABI 89a0bf86
  3. dashboard: number fields take whole numbers07ae27d
  4. docs: packet trigger ordering, placement, timing and the mockb0b2f26
  5. dashboard: the Clip card says when the box does not take a trigger439682f
  6. docs, dashboard: clip packet triggers6bf5ab2
  7. docs: what a loop at the native report rate gets from spreading3e4bb4e
  8. dashboard: clips build pan, raw report and control transfer ticks8ac29c2
  9. docs: clip frames with pan, raw reports and control transfers, and the clip transfer class52dce04
  10. docs: the C and Python transfer timeout calls31a433c
  11. docs: update crate version strings to 3.4.10a96dd5
  12. docs: update firmware version strings to 3.4.1d8d5931
  13. docs: a patch's cfg is a configuration index, and raw does not read the opt-ina0e2823

v3.4.0

Changes

  • Added an advanced control layer (raw report injection, traffic rewrite rules, descriptor patches, ect)
  • Added AC pan as first-class axis
  • Added support for buttons above 5 (up to whatever the device declares)
  • Added transform system: swap axis' and remap buttons with first-class support
  • Fixed an issue where CLIP motion wouldn't be processed by the renderer
  • Fixed an issue where CLIP + rendering may not advance at the correct rate for slower-reporting devices
  • Fixed an issue where rendered motion may not be delivered in full on large movements
  • Major improvements to injection throughput and reductions in latency
  • Fixed an issue where a device may stop working after a host-pc restart
  • Fixed an issue where a device may read as not connected when it just takes a while to connect
  • Fixed an issue where an update may fail whilst the other chip was still erasing
  • Several other smaller improvements to stability and performance

Notes

The advanced control layer gives you low-level control over the device itself. Emit bytes on any endpoint, control transfers though to the real device, rules that can rewrite traffic in-flight, and patches to the descriptors being sent to the host device

It requires Imperfect Clone to be enabled, and can be found here: https://medius.k4tech.net/library/advanced/raw

The protocol version has changed, so for those with their own libs, you will need to update accordingly. The control port has also moved from 4MBaud to 6MBaud, so you will need to update your port-opening accordingly

Show commits

Firmware

  1. docs: the transform section says how the two commands compose, not what one lacks4279cd1
  2. firmware: a lock bites the field the device drove, and every one-bit class refuses a reversal5641e52
  3. firmware: the two comments that still described the old pass orderde0c479
  4. docs, tools: the lock scale is signed, and a transform only moves a fielddcfd81f
  5. firmware: weighing a field belongs to LOCK, and a transform only moves it7af85dd
  6. firmware: the field-transform pass is the first thing the renderer does, not the second5a28e90
  7. firmware: a scaled swap banks each direction, and a remapped key is one a keyboard reports78b5873
  8. firmware: the one injection path that reads the report map checks it is boundae091fd
  9. tools: the transform gate reads the wire the game PC sees2322322
  10. tools, protocol: the reference client and the byte reference cover transformsf90d0e7
  11. firmware: a narrower configuration can still release what a wider one held2685068
  12. firmware: transforms hold their own arithmetic, and a remapped key follows the button73941a4
  13. firmware: shorter clip rendering notes and comments67f58ba
  14. firmware: clips play through the renderer at their own pace, and rendered motion arrives whole74a6c6a
  15. firmware: the mouse keeps working after the game PC restarts99e546d
  16. firmware: the tools open the port at the rate the box answers on0bb18b2
  17. firmware: a completed transmission is no longer thrown away before it is seencdcf9e0
  18. firmware: a host image confirms itself only on a link that works4247979
  19. firmware: the link's rate recovery starts where the image expects it52594cc
  20. firmware: the inter-chip link runs at 20 Mbaudb7a799e
  21. firmware: revert the short frame form and CTRL_MOVE839d5644
  22. protocol: one version bump for the release, not twoe802ed3
  23. firmware: the control link runs its own UART interrupt, and the link watchdog tolerates an erase9fab234
  24. tools: the recovery flash script takes the control rate from the client, not a literalac67ce4
  25. firmware: the inter-chip link runs its own UART interrupt instead of IDF's driver95d8c53
  26. firmware: link frames go straight into the TX FIFO instead of through the driver's ring299a0a4
  27. firmware: the snapshot retry budget is spent only on attempts the link could carry1bf86fd
  28. protocol: the short frame form is v8, and the reference spells it out4d14a07
  29. tools: a control-rate rig, and the client stops charging the port timeout to every reply1c5e7e6
  30. firmware: the inter-chip link runs at 12 Mbaud and stops waiting out its receive timeoutab9f62b
  31. firmware: a shorter hot-path frame, and injection stops paying for a refused emitb325bf4
  32. firmware: the frame CRC reads a table instead of shifting eight times a bytebc14de0
  33. firmware: hold 32 rewrite rules, and count the matches the reply reports5e96c48
  34. tools: bearing and lock take the AC-Pan axis in their motion callbackf45dfef
  35. firmware: descriptor-patch consistency read the wrong bytes, and a refusal stranded the clonef7426a3
  36. firmware: rename the developer layer to the advanced control layer2e5b4a6
  37. tools: catch subscribes to endpoints by number, and a raw injection gateecfc977
  38. tools: reference client and protocol reference name an endpoint by number and directione9e99bf
  39. firmware: name a cloned endpoint by number and direction, not a packed byte51f0e97
  40. firmware: transforms apply on a secondary mouse, and a cross-class remap releases its key on removal3f136c8
  41. tests: gate the field transforms and their compositions1481d38
  42. firmware: field transforms (invert, scale, swap, remap)9c3a259
  43. tools: reference client mirrors the widened input core (AC Pan, buttons past five)27cab02
  44. firmware: correct AC Pan's clip scope and the reported button countf6741da
  45. tests: gate AC Pan, buttons past five, and the spread/ride drain7052133
  46. firmware: widen the input core to AC Pan and buttons past five5efc74d
  47. firmware: the rewrite table's generation counter stays monotonic across a clear855f239
  48. firmware: set the milestone version to 3.4.0617997d
  49. firmware: skip an unchanged patch-set write, and correct a transfer status commente4dc8dc
  50. tools: reference client and protocol reference track the patch-length widening2740192
  51. firmware: correctness fixes to the developer layer's emit, observation, transfer and patch paths163e0f4
  52. firmware: a table overwrite that will not fit keeps the existing entry7ee87de
  53. docs: control-protocol reference for the developer layer (proto 7)8f0d7cf
  54. tools: reference client for the raw, transfer, rewrite and patch verbs (proto 7)21817e3
  55. firmware: dispatch the raw, transfer, rewrite and patch commands6d91f35
  56. firmware: persisted descriptor patches, applied under the clone-refusal ladder50c48c2
  57. firmware: health carries the rewrite state (health is now 16 bits)389aa18
  58. firmware: an on-box rule table that rewrites traffic at every surface41e2c40
  59. firmware: run a control transfer against the device on the control PC's behalfd17be06
  60. firmware: raw report injection on any cloned endpointba45759
  61. firmware: control-protocol wire for raw injection, transfers, rewrites and patches (proto 7)dbd264f
  62. firmware: a per-device descriptor-patch set with consistency checksfc0a70f
  63. firmware: a pure rule table for rewriting traffic in flight8e3e1cf
  64. docs: implementation plan for the generic control layerd38d73c
  65. docs: v3.4.0 design specs (generic control, widened input, transforms)ebaf3ff

Library

  1. library, capi, python: docs say where to go, not what the API lacksa6f2520
  2. library, capi, python: pin the signed scale's guards, and rank a block above a reversale2cbfde
  3. library, capi, python: weighing a field is the lock's, and the percent is signed8856654
  4. library, capi, python: the C transform op byte, and the tests that never compiledee62bcd
  5. library, capi, python: a transform table replays in the order it was built8281209
  6. library, capi: the clip ride readback fields keep their original wording837c25a
  7. library, capi, python: clip riding reaches only the wheel while rendering takes the cursord37c615
  8. library: say what actually confirms a firmware image7bfa7f4
  9. library: the control link opens at 6 Mbaud6abe68c
  10. library, capi: the rewrite table holds 32 rules38ca523
  11. python: finish the advanced control layer rename in a test section header35160bd
  12. library, capi, python: rename the developer layer to the advanced control layer2fa56be
  13. library, capi, python: name a cloned endpoint by number and direction, not a packed byte42510de
  14. capi, python: AC Pan and first-class transforms45d730e
  15. library: field transforms (invert/scale/swap/remap)c085db7
  16. library: a button blanket re-asserts every declared button after a reconnect7c4cebe
  17. library: AC Pan axis and buttons past five in the input corea76de9a
  18. library: C API and Python bindings for the developer layer0740836
  19. library: serialize the developer-layer session state and harden its testsad99e91
  20. library: cover the developer layer in tests and the hardware exampleab33cce
  21. library: raw injection, control transfers, rewrite rules and descriptor patchesb492584

Docs

  1. docs: a conformance gate, so shape drift is caught by the build and not by the readere7bf915
  2. docs: an enum is documented on the enum page, not carded again on the method page67936ae
  3. docs: pages point somewhere, instead of naming calls that were never there0bf11aa
  4. docs, dashboard: the opcode table reaches 0x1E, and a block outranks a reversal2dcbfb2
  5. docs, dashboard: the lock scale is signed, and a transform only moves a field412ff1d
  6. docs: correct what the transform pages claim, and finish moving the types0fa563c
  7. docs, dashboard: the v3.4.0 types live on the type pages, and transforms match the wireb822eb2
  8. dashboard: the update choices are the ones they wereda23a7b
  9. dashboard: reach a box on older firmware, and see its update througha949be4
  10. docs: shorter clip rendering copy152ef34
  11. docs: clips are rendered like live motion0c594e1
  12. docs: the pages that tell you which baud to open still said the old one66182d3
  13. docs: the control link is 6 Mbaud and the inter-chip link 209650135
  14. docs: the rewrite table holds 32 rules02023b5
  15. docs: rebuild the advanced control tab on the pattern the other tabs use12b760d
  16. docs: gate the rewrite remove/clear buttons on the imperfect opt-in4fb4b97
  17. docs: the advanced control dashboard tab is no longer blank without a deviced968e0e
  18. docs: finish the advanced control layer rename (tab variable, a test comment)20213f3
  19. docs: rename the developer layer to the advanced control layercc5d672
  20. docs: fix the dashboard RAW comments left on the old packed wireffa5a43
  21. docs: name a cloned endpoint by number and direction, not a packed byteb6988c9
  22. docs: complete and de-slop the v3.4.0 reference7fbc25b
  23. docs: AC Pan and buttons past five as first-class input22254a4
  24. docs: widen the native HEALTH reference to the 16-bit wordda8f6eb
  25. docs: developer layer reference and the 3.4.0 version bump9be03ac
  26. docs: firmware 3.4.0, protocol 7 on the native pagesf70735d
  27. dashboard: add a Developer tab to edit rewrite rules and descriptor patchesaec3079
  28. dashboard: mirror the developer layer on the control link (proto 7)a4f09ec

v3.3.4

Changes

  • Fixed an issue where the box could reboot while under heavy load
  • Fixed an issue where data sent from the control pc could be silently dropped
  • Fixed a rare crash on startup
  • More small improvements to stability and crash reporting

Notes

I've got a couple more features I want to do, but I have a TON of stuff coming up with work soon so just be aware of that

And just FYI, Unless a developer approaches me with the stuff to add proper console support (ie, the decryption process for PS5), it is unlikely that controller/console support will be implemented

This is simply because I do not have the hardware to test it on (A PS5 is >$1000 in Australia ๐Ÿ’ธ)

Show commits

Firmware

  1. firmware: claim a deferred write before making it, not afterf4c4623
  2. firmware: make a bulk sequence increment atomic now that it crosses coresea3e711
  3. host: a control job refused rather than asserted before its queue exists7cbd464
  4. firmware: move the two starved tasks instead of working around theme3be0b7
  5. firmware: the record keeps the names worth reading, and a refused write is its own80566b6
  6. firmware: watch fewer tasks, and say which one stoppede89e759
  7. firmware: a busy box stays up, and a wedged one still names what stopped9aa62e8
  8. release v3.3.487e90bf
  9. firmware: a busy box no longer reboots itself under a heavy observation load16459f3
  10. docs: what a watchdog record says, and the boot line as it is actually emitted6f56497
  11. firmware: a task watchdog now says what was running when it fired698b263

Docs

  1. docs: tx_drops counts both directions, not just the report path7318cb8
  2. docs: update firmware version strings to 3.3.4ae7a32a

v3.3.3

Firmware

  1. release v3.3.34d5ad7f
  2. firmware: act on the review of the PSRAM fix2a0448a
  3. docs: the two PSRAM variants of the board and what differs on each17f749d
  4. firmware: a box whose S3 has no PSRAM stops reverting its updatec01a089

Docs

  1. docs: update firmware version strings to 3.3.3, and record that clip capacity variesea25c2a

v3.3.2

Changes

  • Fixed an issue where PSRAM may not initiate correctly causing the update to fail
Show commits

Firmware

  1. firmware: ask for PSRAM a second time before giving up on itd69deec
  2. firmware: boot a box whose PSRAM does not answer, and say what it foundc2a6425

Docs

  1. docs: the firmware is on 3.3.26e79184

v3.3.1

Changes

  • Added emission rendering, injected movement is pushed via a fitted model of your device
  • Added "Full Rendering" where native movement ALSO passes through the model
  • Added injection spreading to spread out added movement from sub-native injection rates
  • Fixed an issue where after a pause, injected movement would wait an extra milisecond
  • Fixed an issue where a device could get out-of-sync with its emitted state
  • More improvements to stability and performance

Notes

Rendering is probably the most important feature ever released. Injected movement now carries the texture of the device connected, not just a fixed, flat pattern

https://medius.k4tech.net/library/options#set-render

The protocol version has changed, so for those with their own libs, you will need to update accordingly.

Show commits

Firmware

  1. tools: let the relay arm allow an accumulation, and only an accumulation881c34b
  2. tools: let the mirror gate run itselfbcc50b7
  3. firmware: keep the motion mirror true through a coalesced report52dec74
  4. tools: three gate defects, one of which inverted what a gate measuredd1e6c1b
  5. firmware: hold the smoother's rounding orderf61dfd9
  6. firmware: deposit a rendered report from the clock that emits it9bcaf95
  7. firmware: take a sixth off the model step and the observation passc52d7ef
  8. firmware: learn the command period from the bucket's low edge42c5811
  9. firmware: cover a command rate that varies continuously, not in stepsec76b3c
  10. firmware: name the subject in three comments that opened on a pronounb2407d1
  11. firmware: name what is being released instead of writing itee78ecd
  12. firmware: keep the anchor a deposit has already earnedda65db8
  13. firmware: drop the commentary the composing change made pointless22c6678
  14. tools: wait for the clone's event node instead of guessing onea9d52c4
  15. firmware: compose the release interval with movement riding4f77770
  16. spec: record where the build differs from the design53697c9
  17. firmware: fix the defects an adversarial audit of the release interval found4f52577
  18. tools: gate the release interval on density and magnitude, not the total7b07f3c
  19. firmware: spread an injected delta across the host's command interval5d8a740
  20. firmware: release an injected pot across an interval rather than on one drain0eb0ee9
  21. plan: the release-interval implementation7f03864
  22. spec: spread injected motion across the learnt command intervalbc5d559
  23. tools: three gate defects the hardware run exposeda31c648
  24. firmware: say native for the operator's motion too, and drop two metaphors9f1de70
  25. firmware: say native in the host tests too0f4bc36
  26. firmware: say native9577f8e
  27. firmware: fix the defects an adversarial audit of the render change foundcb5107c
  28. docs: name the box state a faithfulness capture requiresdab36b4
  29. docs: mark the superseded render design records1f57ef0
  30. docs: correct the plan steps that contradicted their own constraints1ea2e65
  31. tools: have the client's selftest read every option back125f3f1
  32. firmware: dispatch and pack the box options in id ordere6588b4
  33. tools: correct which personality the full-rendering gate runs on5e6c796
  34. docs: record the rendered texture in the detection register6655022
  35. tools: order the client's options by id, and name the bearing rather than the aimdfd08d2
  36. docs: say rendering adds latency, and stop there250873a
  37. firmware: credit ABCurves, and ship its licence with the images395771e
  38. docs: cut the render prose back to what the surrounding pages carryf3b8c7e
  39. docs: use the vocabulary and voice the rest of the stack already uses684f625
  40. firmware: keep the wire version this branch already introducedfb83667
  41. docs: record the soak result and what still needs a handba47579
  42. docs: record what the acceptance run measured and what it did nota23b22e
  43. device: keep the operator's motion out of every path that drops the host's3169ec7
  44. docs: describe the texture as its own setting, and what full rendersa74ee47
  45. tools: address the texture settings on their own command19da53d
  46. device: render the attached device's motion with the same model483084c
  47. docs: plan the work for rendering native motion7af1de1
  48. docs: settle how native motion joins the model's streama4cc658
  49. docs: the constraint set and open decisions for rendering native motion58ad3d3
  50. docs: design for spreading owed injection across the learnt command interval61bfe18
  51. tools: measure what a host commanding slower than the device costs the wiref8fa8ec
  52. docs: describe the kernel the box ships and the clock the model steps on5ea77cd
  53. docs: record every departure from the upstream render runtime and its measured cost5f5d897
  54. tools: verify the profile armed before the texture page claims a mode6635fda
  55. tools: apply the comparison kernels causally, at their own lagbcc39ba
  56. tools: resolve the clone's input node instead of assuming its index6b571ae
  57. firmware: begin a render phase on the tick it steps on, and hand back what it still owes78545fa
  58. firmware: render the intent in single precision, on a kernel that answers soonerc0c16c4
  59. tools: ignore the texture rig's outputcc46e41
  60. tools: measure the render model against injection shapes a host actually sendsb2165e2
  61. tools: score injected texture against the attached mouse9a513ab
  62. firmware: render on the same clock reports leave on95e6e95
  63. docs: record the measured result and why the render path deposits againa43c4a8
  64. tests: bound the assertions that passed on a dead pipeline6925be7
  65. firmware: drop the smoother's dead branches and answer flush misuse78419a3
  66. firmware: keep the device stack on its own core, and let the pace clock catch uped1d30b
  67. docs: correct the renderer state size after the smoother change4ee0cab
  68. docs: what the render model reproduces, and why it paces off a timer8286116
  69. tools: gate the renderer on its texture and on whole delivery, not on idle fractionf978169
  70. firmware: stop the render pace clock on a clear, and only yield when a tick is already owed43978f4
  71. docs: record the measured injected-emit latency41ee33c
  72. tools: measure injected-emit latency per render modef3e1a14
  73. firmware: the renderer keeps to its millisecond grid and starts a phase without folding the profile94efd3c
  74. firmware: injected motion emits as soon as its rate gate allows8fb49d3
  75. firmware: one place that builds a synthetic injected frameac55a88
  76. tests: assert the render pipeline's latency without hardware9eed0f9
  77. firmware: the de-spiked smoother no longer drops the motion it starts with383cbb2
  78. docs: implementation plan for the injected-emit latency workf0cb115
  79. docs: design for cutting injected-emit latency6d03dae
  80. docs: use one spelling for the words that had twob700ceb
  81. firmware: apply a render mode change at the next phase, not mid-phase03afab9
  82. docs: correct stale protocol facts and tighten the writing07fdee7
  83. docs: split the render section and drop the em dashes75735d7
  84. docs: correct the protocol version and the emit sectiondf9d435
  85. tools: assert the render profile is armed, and leave the box as found6212b28
  86. firmware: render only once the device has been seen to movefcfbef5
  87. firmware: render injected motion by default092b7f7
  88. firmware: give the render mode its own field in the emit optionef63132
  89. tools: show every render mode in the texture page and fix its idle metric2ad2995
  90. firmware: stock / de-spiked / off modes for the injected-motion smoother2b5bfd2
  91. firmware: no first-tick spike from the injected-motion smoothere0fc07a
  92. tools: ignore the generated render_viz.htmlc3bffde
  93. tools: visualise paced vs rendered injectionfd2550d
  94. firmware: drop the stale mode-3 name from the render headerab2e69c
  95. firmware: make rendered a texture flag that composes with the pace55622e2
  96. firmware: vendor the ABCurves MIT license2b8f7a4
  97. firmware: cut comment noise in the render path0f30828
  98. release v3.3.1edcb98f
  99. docs: list the rendered emit gate among the validators3561e40
  100. firmware: measure the rendered emit gate in isolation, off kernel time482d940
  101. firmware: harden the rendered emit path found by reviewd6837e4
  102. firmware: point the render gate at the trace mouse's own product idfdbb35f
  103. firmware: conformance gate for the rendered emit mode7fa49cc
  104. firmware: keep the rendered tick on-chip (IRAM code, internal-RAM tables)183370b
  105. firmware: rendered emit mode drives injected motion36ec37a
  106. firmware: move the clip ring to PSRAM to free internal RAM70cec1c
  107. firmware: 1ms grid reconstruction for the emit observera5c2961
  108. firmware: bit-exact render runtime with SIMD-optimised tick and host gatef9a10b3
  109. docs: implementation plan for rendered emit modebbd6c1d
  110. docs: design for rendered emit modee9407bb

Library

  1. library: name what is being released instead of writing it2cfd1df
  2. library: say native for the report rate in set_spread's docs4f86ba2
  3. library: regenerate the C header, and widen two boundary tests past a bytec8e0104
  4. library: expose the release interval on the library and both bindingsef0d6e6
  5. library: say nativee047fee
  6. library: cover the render option's async and C-ABI paths, and match the mock to the box8a74375
  7. library: expose the box options in id order across the library and both bindingsfeadf82
  8. docs: say rendering adds latency, and stop thereb76c1d0
  9. docs: name the model the box renders withbad84cd
  10. docs: tighten the render option's doc commente64ec71
  11. docs: use the vocabulary and voice the rest of the stack already uses788be0b
  12. library: keep the wire version this branch already introducedb1b27dc
  13. library: make the mock answer the pace the way an unarmed box does11f7b86
  14. library: address the texture settings on their own command5f31ad4
  15. library: one spelling in the Cargo.toml comment6b1f0b5
  16. library: take the render mode across the C ABI as a bytee3a04f2
  17. library: correct stale doc comments and tighten the writinge2ff4f9
  18. library: bump the C ABI, and require an explicit render modef997d6c
  19. library: the render mode is its own emit field, and de-spiked is the default860905c
  20. library: a RenderMode of off / stock / de-spiked / unsmoothed4fcb605
  21. library: trim the emit-pace doc comments to one-liners1971cf3
  22. library: rendered is a composing flag, not a pace variant9787636
  23. release: bump the crate, C ABI, and Python binding to 3.3.15dbfc7d
  24. library: assert the rendered pace resolves to 1 kHz, and document it59965e5
  25. library: rendered emit pace across the crate, C API and Pythone5014c9

Docs

  1. docs: name what is being released instead of writing it23ad387
  2. docs: drop the riding paragraphs the composing change made pointlessce9cc43
  3. docs: say that the release interval composes with movement ridingbc1453c
  4. docs: correct what the release interval does, and say native02d005b
  5. docs: document the release interval and add its control1dfa40e
  6. dashboard: say what two more controls are, in fewer words50db963
  7. dashboard: say native for the wire rate toob531d09
  8. docs: say native068eab6
  9. dashboard: name the render setting, not what it does to the mouse64cc05c
  10. docs: fix the docs defects an adversarial audit found611014b
  11. dashboard: order the option code paths by id too82b1bec
  12. docs: list the box options in id order on every page3bf7bb0
  13. docs: put the option cards back in the order the other pages usebcc5402
  14. docs: say rendering adds latency, and stop theree7b78ef
  15. docs: credit ABCurves where the render option is described861e177
  16. docs: bring the render copy back to the shape of the cards around ite57335d
  17. docs: put the render option back with the other optionsd24381c
  18. docs: use the vocabulary and voice the rest of the stack already uses8f43a93
  19. docs: give the texture its own page instead of a footnote in the options list9c60f5f
  20. docs: keep the wire version this branch already introduced53210af
  21. docs: correct the texture's own cost and what it renders when it is off5732204
  22. docs: give the texture settings their own command and page8145b5c
  23. docs: shorten the labels that had grown into sentences76b9167
  24. dashboard: give every card a search anchor and every state its own card6cffdd2
  25. docs: correct stale references and tighten the writing945600a
  26. docs: cut the emit card down and stop tables repeating their own label17cb075
  27. dashboard: say what to do, not what the protocol isb0b2132
  28. dashboard: give the older-protocol state a card, not a loose callout285ddfe
  29. dashboard: connect a box a protocol version behind so it can be updated491ed70
  30. docs: correct the protocol version and the binding references5051cc4
  31. docs: rebuild the emit option page around its four fieldsbbaa865
  32. dashboard: four render modes in the selector; drop the Render Lab7a483cf
  33. dashboard: hint when rendered emits nothing on an unprofiled devicebc163c1
  34. dashboard: a Render Lab to visualise rendered vs paced injectiona712679
  35. docs: fix the rendered control's label case and reactive blurb5317a5c
  36. docs: strip the rendered prose to the terse house styleb5cb437
  37. docs: match the bindings set_emit_pace signature and status fielddd7db68
  38. docs: rendered is a composing flag, and credit ABCurves34932ad
  39. docs: order the option sections by id8b77755
  40. docs: tighten the rendered emit prose3a70975
  41. docs: rendered emit mode, and the 3.3.1 firmware versiona090bcc

v3.2.1

Changes

  • Fixed an issue where a mouse would stop responding despite still showing as connected
Show commits

Firmware

  1. release v3.2.1c024681
  2. docs: what the box does when a mouse stops answering, and what the delivery count meansc2c87e3
  3. firmware: count a delivery stall only on an endpoint the PC reads8c48083
  4. firmware: bring a stream back when the mouse stops answering its own endpointaa409d1

Docs

  1. docs: update firmware version strings to 3.2.17e3ae55

v3.2.0

Changes

  • Added firmware updating via USB2, both chips with no buttons or recabling
  • LOCK is now a scale, you can keep a fraction of an input instead of only blocking it
  • Added injection-based aim bearing, so LOCKs can apply with or against the direction of injection
  • Added forcing of the rate the clone advertises
  • Improved dashboard onboarding and update workflow
  • Connection errors in dashboard now actually explain what is wrong
  • Fixed some devices going unresponsive when the box attempts to seed certain information
  • Fixed some wireless receivers reporting as a keyboard instead of a mouse
  • Fixed clearing an aim bearing not actually fully clearing it
  • Fixed a button LOCK reading back as the wrong thing
  • Fixed SCALE affecting reports it shouldnt

Notes

Updating is a big theme this release. Both chips can now take firmware over the control cable instead of performing the dance previously required. If an image won't run, the box will return to the previously working firmware automatically

However, you need to get TO v3.2.0 first though to enjoy this benefit. So follow the new setup page and that should hopefully be the last manual flash you'll need to do

https://medius.k4tech.net/dashboard/setup

LOCK got a big overhaul, it's a scale now instead of a binary on or off. 0 blocks everything, 100 allows everything through untouched. Above 100 amplifies the movement as well. Combined with the new aim bearing system and you can weigh native input by whether it's with or against the injection

Superstrike users, I will make a guide shortly on how to fix your device so it works correctly with this latest update. It will be found in #guides on the Discord

Keep it coming lads ๐Ÿซก

Show commits

Firmware

  1. docs: correct the setup design to what the board and the reviews showed8ff0f49
  2. docs: the build order for getting a box set up the first time05e0635
  3. docs: the design for getting a box set up the first time29e6813
  4. tools: guard each restore, hand the sim back, and name the verb that existsbd6bbde
  5. docs: correct the forced-rate entry to what the wire actually does16645c1
  6. firmware: build the forced rate the way the files around it are built346c220
  7. firmware: say the poll interval changed only when it didf4b8491
  8. tools: run the rate gate against a real attached device, forcing away from what it declares696c824
  9. tools: let the riding gate run without a hand when the sim owns the only node45e3456
  10. tools: build the gate's mouse from the rig's own, and find its input node77e7a57
  11. firmware: what the review found in the forced-rate path48d477d
  12. tools: a gate for a clone running at a rate the device did not declare25ff60e
  13. docs: how a box is told to run at a rate the device did not declareafbb2a0
  14. tools: set and read the forced rate from the reference client0527fda
  15. firmware: ask the device for reports as often as the clone says it will be asked94fe1f7
  16. firmware: let a box advertise a rate the device did not declarec99497e
  17. firmware: carry a forced rate and what the clone advertises on the pacing optionba558cc
  18. firmware: work out the poll interval a forced rate needs, and write it into a descriptor4c97cb3
  19. docs: keep the dash sweep out of the file it sweepsa9d859e
  20. docs: the build order for a clone that runs at a forced ratee9b5d91
  21. docs: the design for running a clone at a rate the device does not declare068a5a2
  22. gate: hold each chip to the window it advertises43ecf6e
  23. firmware: let the mouse-side chip restart the way it always didd36c59b
  24. firmware: put the mouse-side USB controller down before that chip restarts6165e95
  25. firmware: ask for only as much as the chip can actually hold8f1efa9
  26. firmware: hold the whole window the box says it will takec9e5a55
  27. docs: say that abandoning a commit disarms both chips4965827
  28. firmware: abandoning one commit abandons both, and the client could not clear either493bb1a
  29. firmware: tell the other chip too, and settle before erasingce01bc4
  30. firmware: only abandon an update while there is still something to abandon898ff28
  31. firmware: what the third review found in the second round of fixesa1a3075
  32. firmware: what the second review found in the first round of fixes0bba54a
  33. firmware: anchor every timer to the clock, not to zero6f6728b
  34. docs: match the renamed client callc08bba0
  35. firmware: read every elapsed-time check as signedc07b370
  36. tools: what the review found in the reference clientd03ca93
  37. firmware: what the review found in the update pathac065b0
  38. tools: one command to push firmware to a connected box211c39f
  39. docs: how an image reaches each chip now4711a91
  40. tools: prove a broken image does not stick20965e3
  41. tools: a gate for taking an image over the control porta9f26b8
  42. firmware: ask the far chip for its version until it answers1da1093
  43. docs: record what the hardware corrected in the update design9dbabfc
  44. firmware: keep the clone down while the box rewrites itself20a4807
  45. firmware: serve an update on the control port and pass one along0a1d078
  46. firmware: let the mouse-side chip take an image over the internal linka37c3b2
  47. firmware: put the box down cleanly before it rewrites itself161bbce
  48. firmware: write a staged image to the spare slot1f31d89
  49. firmware: the chunk sequencing behind a staged image, with its testsa139518
  50. firmware: the wire shape for taking an image over the control port1afe07e
  51. firmware: give both chips a second app slota22f3c1
  52. docs: the host chip gets one rom flash, and it has to be the right onee14b65a
  53. docs: the work order for updating over the control portde9c107
  54. docs: the design for updating both chips over the control portedbd2ef
  55. docs: the G502 answer is not random, it is before-first-motion8944b4c
  56. docs: point the work order at what actually shippedb36bd88
  57. docs: record what the review corrected in the at-rest rule88c9289
  58. docs: say which fields the spec pins and which only look pinnedcb4cd80
  59. firmware: trust only what the descriptor pins, and ask once at a device that answersbc6d4ee
  60. docs: where an at-rest report comes from, in order of preference80bef6d
  61. firmware: ask a device once, and bring it back if the question stops it answeringe694922
  62. tools: a gate for a device that stops answering when askedfe39acb
  63. firmware: reuse a report the box already has before asking for one7f8e023
  64. firmware: do not ask a device for a report its descriptor already spells outf92d3b6
  65. firmware: work out from the descriptor what a report reads at resta3c6f8e
  66. docs: the build order for deciding when a device needs askingd88e6e5
  67. docs: decide from the descriptor whether a device needs asking at alle0b4c26
  68. docs: why a receiver falls into its bootloader behind the box6cfccd4
  69. fix: a full key bitmap made a receiver's paired mouse report as a keyboard03f5d3e
  70. docs: name the mechanism in the protocol reference and the comments5fc4378
  71. docs: correct what a discard, a refusal and a saturating gain actually doccf4f60
  72. tools: validate the motion flags, and pin what the last round fixed282386b
  73. tools: stop a mutating verb defaulting to the destructive value6ea1bb0
  74. firmware: make a bearing clear actually clear, and keep the aim's angle0e59085
  75. docs: write down what the box applies, not what it was told85adde4
  76. tools: make a bearing gate that a plain sign lock cannot pass252e352
  77. tests: pin the weighing rules a mutation can still break32603dc
  78. firmware: weigh a report only when the scale actually changes it13d1106
  79. tools: stop the puller before closing the port it writes to698a65f
  80. tools: measure what the bearing does to a hand, not what it reports125d7c2
  81. firmware: let a button store the block it renders, not the number sent0895364
  82. firmware: re-read the version header when it changes, not once per build tree6c56608
  83. tools: validate a scale by hand, not only a lock9a15813
  84. firmware: let a lock keep a fraction of an input instead of all or none19606fe

Library

  1. ci: check the features this crate actually has, and do not ship wheels for a crate that did not publish5ed374b
  2. library: mirror the interval the box now advertises, and format66f588e
  3. library: what the review found in the forced-rate surfacesee75bd6
  4. library: check the forced rate round-trips on a real box06b2435
  5. bindings: carry the forced rate through the C and Python surfacesd31e06b
  6. library: set and read the rate a box advertises94d2cec
  7. library: shorter refusal textbc78c27
  8. library: say what a refused update means and what to do about it5cb91b6
  9. library: derive the result-name guard instead of listing itcdca871
  10. library: clear what a refused commit left armed0a6dc24
  11. library: drop a reply the box has moved on from74b6e09
  12. library: look for a parked reply on every wake5606b85
  13. library: park a reply for the caller it belongs tocc701a1
  14. library: put back a reply that answers another caller2df1b87
  15. library: what the review found in the update client0b7cafd
  16. library: formattingee4567d
  17. library: update box firmware over the control portb2b43f6
  18. docs: name the mechanism in the public API surfacef1fdc4b
  19. capi: refuse a byte no constant names, everywhere one crosses34747d2
  20. hw_full: assert what only the firmware can satisfycb8f075
  21. bindings(python): check a scalar before ctypes truncates it8826d5a
  22. capi: take a byte where the boundary cannot trust an enumd80ce4b
  23. crate: model the box's lock table so a reapply rebuilds what it found2c98fac
  24. crate: say what the scale readback actually promisesd2574c3
  25. hw_full: prove the scale round trip and the bearing option on a box78db22f
  26. v3.2.0da8d355
  27. bindings(python): follow the C ABI to the scale system8bb2c5b
  28. capi: carry the scale and the bearing across the C boundaryed65e1d
  29. crate: let a lock keep a fraction of an input instead of all or nonee179bcb

Docs

  1. dashboard: let the manual flasher be manual, and size the secondary buttons like the reste643106
  2. dashboard: keep the step chip, and stop the diagram forcing the gap above it54d3a70
  3. dashboard: put the step in the header instead of a row of its own041af30
  4. dashboard: even the gap either side of the step counterc769401
  5. dashboard: let the card header own the step counter's spacing0a21b47
  6. dashboard: give the step chip its own gap, and say the reason oncef8851e0
  7. dashboard: set the device port apart from the two computers86fa2a2
  8. dashboard: one diagram per action, and cut the filler4ed10e7
  9. dashboard: judge each chip on its own version, and tests that can actually fail324cc80
  10. dashboard: a finish screen that could not finish, and the update path nothing tested7996f79
  11. dashboard: stop claiming a check that never ran, and cover the page that had no tests5a29691
  12. dashboard: two fixes that cancelled each other, and four more blind tests1c4c470
  13. dashboard: the wrong chip named, the slow read, and three blind tests397baba
  14. dashboard: the button beside the socket, and what round four foundd224f71
  15. dashboard: the page freezes and the skipped gate that round three foundc0ec1ef
  16. dashboard: what reviewing the fixes found in themce8f568
  17. dashboard: what three reviews found in the setup pathde0efd7
  18. dashboard: a guided first install, and a connect that says what is wrong9992bc6
  19. dashboard: turn a failed connect into one answer, and say which firmware gave it0c952e7
  20. dashboard: name the wire rate in the card's own heading stylecac69b8
  21. dashboard: build the wire rate the way every other control on the card is builtc078168
  22. dashboard: give the wire rate the card's own spacing, and name the two rate fields apart260a4e9
  23. dashboard: apply the forced rate the user actually asked for55b2243
  24. docs: the rate a box advertises is now something you setfbfe5de
  25. dashboard: refusal text that reads like the rest of the UIa53ca34
  26. dashboard: errors that say what to dof40db50
  27. dashboard: adopt a port that is already open, and say the window is not fixede108e85
  28. docs: write the update pages the way every other page is written7d6fd66
  29. docs: put the update feature where the rest of the docs keep things42efafd
  30. docs: say that abandoning a commit disarms both chips86c2a10
  31. dashboard: make the typecheck gate able to fail88f8787
  32. docs: list the new result where the results are listed8a7bb6c
  33. dashboard: typecheck what the bundler never looked atc835fea
  34. dashboard: clear what a failed update left behindaa668f7
  35. dashboard: keep the real cause when a port goes away24c8e42
  36. dashboard: do not consume a reply from an abandoned transfera2f10f8
  37. dashboard: do not lose an update reply that arrives earlyb9d383a
  38. docs: say which flashing path is the normal one now009a9a4
  39. docs: the library calls for updating a box2209088
  40. docs: a page for updating a box over the control portb410928
  41. dashboard: update both chips over the port you are already connected to9cfdd68
  42. dashboard: speak the firmware-update protocol2f2deb1
  43. docs: say where a lock readback can disagree with what the axis doese30951b
  44. dashboard: keep a readout's rows together64f7075
  45. dashboard: give the riding checkbox the margin its siblings have33ccc30
  46. Revert "dashboard: let the container own vertical rhythm, not the child"ed9526e
  47. dashboard: let the container own vertical rhythm, not the child99c812d
  48. dashboard: stop restating the reference in the control panel2361d38
  49. dashboard: pin that the release-on-silence fact is stated once629aeba
  50. dashboard: one sentence per control on the control page too9ecc171
  51. dashboard: put the bearing Turn off button backd67a9e1
  52. dashboard: one sentence per option, and one shape for every control58977c9
  53. dashboard: say why a connect failed on the control page3690611
  54. docs: name the mechanism, not the picture it makesc5bfc00
  55. docs: hold the rest of the reference to the bar the lock page setdc0016f
  56. docs: rebuild the lock page in the shape the rest of the reference uses5a46100
  57. docs: correct what a saturating gain does, and make the client claims truebc998d7
  58. docs: split the lock page, and say what the bearing actually does660454e
  59. docs: say each thing once, where the reader is looking for it2aa0d86
  60. docs: carry the scale, the aim and the version the pages describe45169ab
  61. dashboard: drop a lock entry the box would never have named7ef46d8
  62. docs: correct what Both does, and warn where the version cannotef59816
  63. docs: document the scale and the bearing across every page they reachfbf8811
  64. dashboard: put the scale and the aim bearing on the control page80bbf96
  65. dashboard: follow the lock wire from a state to a scale3bf110d

v3.1.0

Changes

  • CATCH now observed every class of traffic, not just input
  • Catch events carry the timestamp the report actually arrived
  • Vendor specific interfaces are now relayed correctly, instead of being presented dead
  • Alternate settings are now followed all the way to the real device
  • Devices with multiple configurations are correctly described and can be switched to
  • Added support for control endpoints above 0
  • HID interfaces that declare extra endpoints are now driven (instead of being refused)
  • Extra-large report descriptors are now correctly carried, via any interface
  • Added a per-command movement riding override
  • Fixed low-speed device support
  • Fixed keyboards that split their keys across several reports
  • Fixed key reports corrupting on an endpoint shared with a mouse report
  • Fixed control frames being silently dropped whilst the box was emitting
  • Fixed blanket lock axis doing nothing
  • Fixed some devices reporting as the wrong KIND

Notes

Security got a HUGE improvement this update, IMO this is pretty close to the limit of security for this hardware. Additionally, many more devices are now supported due to massive improvements in what can be cloned faithfully

CATCH is the other big one this release, it has received a massive overhaul, and now supports a wide range of functionality

https://medius.k4tech.net/library/catch

Keep the feedback coming lads ๐Ÿซก

Show commits

Firmware

  1. docs: the design behind the per-command riding override4aa8246
  2. tools: a gate for what riding delivers, and what it holds back4598c8b
  3. tools: two tools had been sending move frames the box throws away269decb
  4. firmware: let one move say whether it waits for the user to moved9da046
  5. docs: say when a clip trigger takes its input lock, and when it does note3790a7
  6. firmware: lock every axis when the blanket asks for itc8598cd
  7. docs: write the catch design doc without the dashes3ce7a00
  8. docs: the design behind the catch API rework5b82fe9
  9. firmware: charge a lost event to every subscription it belonged tof691b7b
  10. tools: leave the rig on a device the other gates can actually exercise54750b7
  11. firmware: make a snapshot say which class and which edge produced itc2f4760
  12. firmware: hold back only what can flood the link, and let the waits be short enough to matter375267f
  13. firmware: make the clock estimate say what it actually knows, and the tests able to tell003518e
  14. docs: say what the counter orders and what actually holds input earlye791ae4
  15. firmware: keep the observation stream from making an input report latef5ab3a7
  16. tools: a conformance gate for the observation surface6eee30a
  17. firmware: keep the busiest observation work off the core the USB stack needs1877297
  18. firmware: carry the crash record's caller chain, and keep the rig off the desktop cursor52c70ad
  19. firmware: wake the drain directly instead of through a shared counterbcdea80
  20. firmware: read the observation table without locking the paths that read it mostcce63f1
  21. firmware: pace the event stream to the link instead of spinning on it8219d3d
  22. firmware: keep the event stream from stalling the link it shares255569e
  23. docs: document what can be observed and which clock stamped it0f132a6
  24. tools: prove observing the traffic does not disturb it39fb9c0
  25. firmware: observe every class of traffic the box carriesbfbed83
  26. firmware: hold the observation subscription as a table, and rank its event streamcb46f50
  27. firmware: stamp bulk where it arrives, like every other inbound stream7c8ca4b
  28. firmware: a four-stamp exchange so the two chips' clocks can be compared619e26f
  29. tools: teach the reference client the new observation surface9694782
  30. firmware: measure the two chips' clock difference instead of assuming it380864b
  31. firmware: address what to observe the way locks are addressedc7c200c
  32. docs: the implementation plan for observing everything the box carries52d3182
  33. docs: tap emitted reports where they complete, not where they are staged59c8542
  34. docs: a design for observing everything the box carries, not only physical input96ee0f4
  35. docs: a top-level guide so the repo carries its own bring-up knowledge6bb87dc
  36. tools: prove the descriptor half of the configuration cost, on hardware11b67c1
  37. firmware: cost the configurations the clone is not in, not just the one it isb23f831
  38. firmware: the faults only repeated switching could reachbc626ca
  39. firmware: rebind the roles a configuration switch moves, and hold every configuration's descriptors8092fd6
  40. firmware: a configuration switch rebuilds what it changes3d72c39
  41. firmware: the rest of what the reviews founde346dc6
  42. firmware: a marker that is a prefix of another could never be seen missing3c5215e
  43. firmware: defects a review found, including two the previous round introduced368fb59
  44. firmware: carry the report descriptors a configuration switch needs, with the switch76e3a12
  45. firmware: enter any configuration a device offers, not only the one it came up inb262349
  46. firmware: carry a control data stage larger than one link frame62b41b1
  47. tools: count the bytes on every endpoint a shape exists to exercise7a7c042
  48. tools: make the hardware oracles able to fail2853b1d
  49. firmware: defects found reviewing the rest of the interface-coverage workfcfbd14
  50. firmware: defects found reviewing the control-endpoint work7050f85
  51. firmware: carry a control endpoint a device declares beyond the firstdf18d25
  52. firmware: name the control endpoint above zero, and teach the port to hear ita1c527d
  53. firmware: describe every configuration a device has, not just the one it is incccaa2d
  54. firmware: follow the alternate setting a host selects, all the way to the device51bb6d0
  55. docs: why the alt-setting relay is asynchronouscd6ed02
  56. firmware: drive the endpoints a HID interface declares and its driver ignoresf8a0d11
  57. firmware: carry a report descriptor the device actually has, from an interface of any classab95091
  58. docs: design for retiring every refusal the hardware does not forceb29edaa
  59. firmware: a control transfer too big to buffer hung the clone instead of failing it66580fc
  60. firmware: the two chips disagreed about which interfaces they serveeba56a3
  61. tools: the refusal ladder had no test that ran itc9f688a
  62. firmware: an audio device cloned in silence, minus the half that matteredae6014e
  63. firmware: a HID interface could declare an endpoint the clone never feeds866ff13
  64. firmware: a clone answered questions about configurations it does not have90e3d13
  65. docs: the vendor bulk ceiling is measured now, not estimated7814fb3
  66. docs: the vendor-interface pass-through design0494a35
  67. firmware: vendor-specific interfaces were declared to the PC but carried nothing446b93f
  68. firmware: a rejected hunk could still report itself applied9ece3cc
  69. firmware: defects found reviewing this branchd0a5751
  70. docs: the low-speed frame-interval fault, and finish a truncated sentence5584bbe
  71. firmware: low-speed devices were told the bus was idle on every frame6d28b89
  72. firmware: one keypress read as three on a keyboard that splits its keys across reportsc3c4aa3
  73. firmware: the previous commit changed no behaviour; say so82d9c02
  74. firmware: log which firmware image is actually runninge5add6f
  75. fix: device kind was decided by interface order, not by what the device sendsb91235b
  76. fix: queue overflow dropped the newest report on one of two paths5459acc
  77. fix: report-ID budget counted Feature reports it never neededa38482c
  78. Revert "surface reports cut short mid-transfer"bedda73
  79. fix: key reports corrupted on an endpoint shared with a mouse reportcf55d44
  80. docs: low-speed clones now match native bus speed2d0077f
  81. tools: screen HID devices for multi-packet reportsb0e1a84
  82. fix: low-speed device support on both chipsac5a647
  83. docs: compress the protocol timestamp note4195634
  84. docs: spec matches the wire-width crate surface7224a5d
  85. docs: usage-event timestamp capture from the bench694a185
  86. tools: revive the lock validator and poll for ROM download20f668d
  87. docs: native jitter baseline for the timestamp accuracy oracle3f73ce6
  88. docs: record the bench device's measured report families3d31dbb
  89. firmware: catch events carry the report's arrival timestamp0722057
  90. docs: timestamped catch events design spec644ea05
  91. revert: drop the QUERY(LINK) selector283e47c
  92. fix: defects found reviewing the control-link work4a2962f
  93. firmware: drop the emit-path blocking histogram from RESP(LINK)6307db2
  94. firmware: RESP(LINK) reports only the window it can measure exactly8974cf2
  95. v3.1.00b4e07e
  96. tools: control-link loss rig, scripted host flash5e0cc83
  97. firmware: control frames survive a busy emit path3a1a72b

Library

  1. bindings: carry the move override through C and Pythone0975ce
  2. crate: let one move say whether it waits for the user to move35034c2
  3. docs: strip the dashes and the padding out of the referenceecfab01
  4. crate: address an input the way a lock does, and hand back the edgesc6f5ca0
  5. crate: refuse a subscription the box cannot hold, and send only what changedb341abf
  6. hw_full: measure the sustained rate, and drive the traffic a still device will not39cc619
  7. crate: route a held-usage snapshot as the class state it is, and mirror it in C and Pythonce3a72e
  8. crate: expose the protocol version, and stop asserting quiet on a streaming clone8ee86f3
  9. hw_full: check the per-id observation path on hardware, not only the blankets344230a
  10. crate: route each observed input event by the address it actually carries3cfb471
  11. crate: give each observer only the traffic it asked forc6ea88c
  12. bindings(python): follow the C ABI to version 46bbe0cf
  13. capi: carry the observation surface across the C boundary911eb2f
  14. crate: observe every traffic class, not only physical inputcd50aca
  15. capi: hold the ABI version at 37ce742b
  16. v3.1.0956d9c1
  17. refactor: hand the catch timestamp over at its wire width8b642b5
  18. refactor: match the crate's idiom in the catch clock widener72e76b1
  19. feat: catch events carry the report's arrival timestamp81118e6
  20. v3.0.1f6b4dd1
  21. fix: stop Windows injection queueing behind the reader thread7ba7c4c

Docs

  1. docs: check the rest of the pages this feature touched the same way6f6d350
  2. docs+dashboard: follow the patterns the reference already has, on the pages this feature touchedfdc3b21
  3. docs: document what a move can say about waiting9bb4f27
  4. dashboard: drive the riding override from the control pagea3e52c4
  5. docs: index the names the catch rework introduced3e2ed8b
  6. docs: index the dashboard cards search could not reach737249f
  7. dashboard: name the clip trigger flag in full on the checkboxa59bf55
  8. dashboard: call the clip trigger flag what the protocol calls ita60a88e
  9. dashboard: open the clip trigger picker on the class its own list leads with96b1eca
  10. docs: describe a clip trigger's input lock by what it does5f03e36
  11. dashboard: rebuild the control page around what the box can do08e613c
  12. docs: cut the documentation down to what it actually saysf4d9e68
  13. docs: stop the reference justifying what the table just definedb7a1698
  14. docs: stop the tables saying their own column headings2753832
  15. docs+dashboard: document the catch surface as it is, not as it wasf43090c
  16. docs: a table that is full, and who a lost event is charged toa1a4b14
  17. docs+dashboard: say which edge produced a snapshot, and how to route one8f9f0e0
  18. docs: document the protocol version a build speaks5ee0d93
  19. docs+dashboard: say which class a snapshot names, and what an unfitted drift rate meansee104d3
  20. docs: correct what the event counter means and how the stream is rankedd43d7bb
  21. docs+dashboard: document and display every traffic class the box can observe1bad5f4
  22. docs: repoint two search entries at the anchors that existe3b9ca8
  23. docs: ABI displays back to 381c9e65
  24. docs: crate and ABI displays for v3.1.055387ed
  25. docs: firmware displays to 3.1.04ef0046
  26. dashboard: decode the catch timestamp instead of reading it as motion90cc283
  27. docs: ts_us belongs on the frame that carries it37146b0
  28. docs: trim the timestamp cards to reference-only3026e95
  29. docs: rebuild the timestamp cards as diagrams and tablesda0dc25
  30. docs: correct the mock inbound-traffic card subtitle1b2c016
  31. docs: catch events carry the report's arrival timestampbd40044
  32. docs: crate version displays to v3.0.1981a99e

v3.0.1

Changes

  • Fixed a bug with the lock system where events could report through a lock if other conditions were met

Notes

Keep it coming

Show commits

Firmware

  1. firmware: classify falls open on report shapes it can't model73d0dbd
  2. firmware: a locked input emits nothing instead of an empty report (v3.0.1)7abc2a8

Docs

  1. docs: firmware version displays to v3.0.19f6257b

v3.0.0

Changes

  • Unified mouse buttons, keyboard keys, and media into a single input model
  • Added buffered clip playback
  • Added on-device clip triggers
  • Added retained clips with looping replay
  • Added per-clip auto-lock
  • Clip triggers can be consumed to never reach the target pc
  • Added persistent box names
  • Added AI support for documentation

Notes

Buffered clips and the on-device trigger system is documented here: https://medius.k4tech.net/library/clip

Buttons, keys and media are now a unified "Usage" across the whole api, you will need to update your code if you are using any of the libraries

Keep the suggestions coming

Show commits

Firmware

  1. docs: update README control-surface to proto 3 (MOTION_EVENT/USAGE_EVENT, CLIP_SET/CLIP_TRIGGER, 10 query selectors)d495261
  2. ci: split the Discord release changelog across messages over the embed limitb26bdea
  3. docs: control-protocol clip trigger set + config + RESP(CLIP) rewrite8d02390
  4. tools: refclient clip trigger set + config, new RESP(CLIP) decode3d2ca96
  5. firmware: clip trigger set, retain/rewind engine, and queryable configfeefbe2
  6. docs: clip trigger + config redesign spec and planc872c0c
  7. cleanup: strip comments and AI-slop from host firmware, common, and docs4bde84e
  8. cleanup: strip AI-slop and comments (tools, host tests, protocol doc)26a0a08
  9. cleanup: strip firmware comments and AI-slop9eaea0b
  10. medius.py: one usage vocabulary for inject and lock8027a85
  11. docs+comments: proto 3 wire spec, RESP(CATCH) media bit, stale event-name comments5f1f6dc
  12. v3.0.0e939e75
  13. medius.py: decode the clip held-usage snapshot in RESP(CLIP)b1b60ca
  14. firmware: report clip held state as one usage snapshot, not a button bitmask0321ece
  15. firmware: one catch event shape for every input class9b79c45
  16. firmware: uniform LOCK addressing and a full lock-state readback (proto v3)d3d536b
  17. firmware: one inject verb and one synthetic-emit path for every class093d3f8
  18. firmware: unify the HID injection core on one momentary-usage model30e27fd
  19. docs: input-taxonomy unification design8dc8f7d
  20. firmware: field-generic clip control with an autolock scopef977fb5
  21. firmware: clip STOP releases held input; auto-lock owns locks per directionf76849e
  22. firmware: clip auto-lock locks all input, drop the lock-mask3ad676c
  23. firmware: buffered clip playback drives keyboard and media, not just the mouse255ebd3
  24. docs: note buffered clip playback in README, ARCHITECTURE, tools2c2a9c7
  25. docs: correct clip overrun semantics + crate API reference979db9b
  26. firmware: harden buffered clip playback (adversarial review)e8909fd
  27. firmware: clip reference client + protocol doc752fc28
  28. firmware: clip playback engine + command dispatch92fb50f
  29. firmware: CLIP protocol constants + status packerc99630c
  30. firmware: clip SPSC byte ring (host-tested)39d2651
  31. firmware: clip entry codec (host-tested)252df80
  32. docs: buffered clip playback implementation plan3e29317
  33. docs: buffered clip playback design spec17f8cd0
  34. firmware: persistent, host-settable box name671afbe

Library

  1. docs: fix README to the v3 unified-usage API0a34b65
  2. fix: repair crate CI for v39eaed71
  3. hw_full: correct stale proto assertion and grab all composite clone nodese724e36
  4. python: clip trigger set + queryable config bindings59b2682
  5. capi: clip trigger set + queryable config C ABI0663193
  6. clip: trigger set, retain/rewind, and queryable config surface89c5521
  7. cleanup: strip AI-slop from README and a stray doc-comment5f5b08e
  8. cleanup: strip unnecessary comments and AI-slop (crate, capi, python)db05194
  9. finish the builder unification + align the usage id fielddc0b940
  10. bindings: rename MediusInput to MediusUsage (one Usage vocabulary)9c9bbd7
  11. review: LockScope sum type, shared usage codec, safer conversions7657b2b
  12. v3.0.0b2f684c
  13. hw_full: v3 handshake + correct the clip/lock/name checks65ec4a7
  14. host: clip held state is a usage snapshot across crate, C ABI, and Pythoncf2befe
  15. python: unify bindings on the Input usage taxonomy (ABI v3)b8eaab3
  16. capi: unify the C ABI on the Usage taxonomy (ABI v3)3659dee
  17. crate: unify the input API on Usage and Axis (proto v3)0676994
  18. clip: ClipConfig options type + field-generic control API6ac4187
  19. clip: held is a per-button bitmask; enforce the edge cap; validate C edge actionsc47cfb1
  20. crate + C ABI + Python: field-generic clip reuses existing typesa7158f3
  21. docs: buffered clip playback section in the crate README5a5f16f
  22. crate + C ABI + Python: buffered clip playback05728aa
  23. crate + C ABI + Python: box name19c9f17

Docs

  1. docs: update README to the v3 API (opcode range 0x15, all 5 sections, input-passthrough, drop dead MidnightUI link)7339e79
  2. chore: shorten server.json description to the registry 100-char limit8474b06
  3. chore: MCP registry manifest (server.json) + publishing guide3b74cc5
  4. docs: demonstrate a move and an edge on one clip frame, all four surfacese9d7574
  5. docs: move AI page to its own /ai section, add dropdown link12a3ef9
  6. docs: fix clip reconnect claim and clip-query section polishbfc3014
  7. docs: lay out the clip streaming/retained and trigger sections visually42973bd
  8. docs: add the AI & LLM access page6ec7aea
  9. feat: advertise MCP, cache headers, rel=alternate, prerender Homeb8c01e5
  10. feat: ChatGPT-compatible search/fetch MCP tools6600245
  11. docs: fix the AI-actions menu button font49f6ff3
  12. fix: review findings (head defaults, search cap, route decode)275e7f4
  13. feat: serve the agent surface under vite dev and previewfa14b49
  14. ci: prerender stage in Docker, tests in CI, prerender scripts8044820
  15. feat: move AI-actions to a titlebar dropdown (portaled)8fd103e
  16. feat: per-route head + AI-actions row + SSG double-mount fixb4a4dc7
  17. fix: harden markdown extractor (review findings)4b3e76d
  18. feat: remote MCP docs server on /mcp2db15e8
  19. feat: agent content-negotiation in the Bun serverc58e47f
  20. feat: build-time prerender + markdown extraction pipeline and agent artifacts0e254db
  21. docs: link the clip queries from the Clip page, like Lock and Catchcdd428d
  22. docs: agent-accessible docs design spec3b67739
  23. docs: move the clip queries onto the Requests page with the others205b7de
  24. docs: full page-by-page consistency pass across all 78 pages79f41fc
  25. docs: fix broken binding anchors + em-dash labels, mirror c/python clip API5294fa5
  26. docs: tighten the clip page to the sibling norm82db2b0
  27. docs: fix clip content + anchors from the migration review9ecaf50
  28. docs: clip trigger set + queryable config across the SPA86a81be
  29. docs: add the missing CLIP entry to feature-index enumerations950e079
  30. cleanup: strip AI-slop and narrating comments from the docs-SPA components2a82ba0
  31. docs: dashboard UI copy pass (terminology, labels, one diagram prop)9555b82
  32. docs: page-by-page quality pass (dedup, links, diagram redraws)18fee2f
  33. docs: finish the builder + field-rename propagation, ClipState meaning tables, reconnect badge265cdff
  34. docs: apply deep-review findings + propagate the Usage rename52ab2c5
  35. docs: v3.0.0 / proto 3 version references6db69c3
  36. docs: unify the input taxonomy across the reference and dashboard39b49e5
  37. docs: field-generic clip control and ClipConfig89ae248
  38. docs: correct clip status held (button bitmask) and ticks (content-only)373f8f8
  39. docs: rebuild the clip pages to match the rest of the docs, diagram-first831879d
  40. docs: rewrite the clip pages, field-generic and tersebe75744
  41. docs: buffered clip playbackea11667
  42. docs + dashboard: box name1ed73a2

v2.3.2

Changes

  • Fixed an inconsistency in the locking behaviour
Show commits

Firmware

  1. firmware: soft-release clears a force-release, not just a press (v2.3.2)da24f52

Docs

  1. docs: soft-release defers to physical from any state; version strings to 2.3.25e2d10a

v2.3.1

Changes

  • Fixed lock and catch occasionally binding to the wrong interface on certain mice
  • Lock and catch logic now applies across ALL applicable interfaces, not just the first
  • Injection now prefers the boot interface for certain mice

Notes

These changes should hopefully fix some inconsistencies some people were having with the injection/lock/catch logic

It may also improve device support for certain devices

Please keep the bug reports coming, I'm committed to fixing as much as a physically can

Show commits

Firmware

  1. firmware: catch and lock cover multi-interface mouse dongles (v2.3.1)8a3c63f

Docs

  1. docs: update firmware version strings to 2.3.13d77801
  2. docs: correct the stale crate version (2.0.0 -> 2.3.0)1886e43
  3. docs: bare-symbol card titles for discovery + a few consistency fixes8c88a19

v2.3.0

Changes

  • Added emission rate control (Learnt rate (default), Interval (bInterval based), Fixed)
  • Improved HID capture on erratic enumeration
  • Clone is now only emit after full enumeration (or timeout)
  • Multi-box support, more detailed box descriptors
  • Device info now carries more information about the connected device

Notes

Emission pacing control can be found in the documentation: https://medius.k4tech.net/library/options#set-emit-pace

Discover by device type and similar multi-box steps can be found here: https://medius.k4tech.net/library/discovery

Show commits

Firmware

  1. firmware: self-heal a control decoder wedged by an abandoned partial frameabb0c95
  2. docs: sync the control-protocol reference + READMEs to the DEVICE_INFO rename (kind, product, box MAC)64dd946
  3. firmware: name the DEVICE_INFO product-tail cap (127) so host string buffers keep NUL roomdc36571
  4. tools: multi-box discovery (list / open-by-id) + generic device_info in the reference clientbd283dd
  5. firmware: VERSION carries the box MAC; MOUSE_INFO -> generic DEVICE_INFO (+kind, +product)691aadb
  6. docs: plan multi-box + generic device-info80a07bd
  7. docs: spec multi-box management + generic device-info406a80a
  8. host: robust HID report-descriptor fetch (blind-fetch + retry, verbatim)1158d0a
  9. host: emit the clone snapshot once all HID interfaces are capturedf2642eb
  10. host: count HID interfaces in a config descriptor (for capture completion)35ba281
  11. docs: plan the capture-robustness implementation065ba8d
  12. docs: spec capture robustness for slow composite HID devices7c1237b
  13. Bump version to v2.3.0307c21e
  14. tools: harden the emit-rate test + validation rig998cd72
  15. firmware: reset the interval emit-rate when the device detachesfaa0ee0
  16. tools: emit-rate HW validation rig02da0af
  17. tools: emit-rate option in the reference client8c3ed75
  18. firmware: wire the emit-rate option command + queryfbda1e0
  19. firmware: emit-rate pacing override (state + gate)7351086
  20. firmware: add the emit-rate option to the control protocol7fcdb74
  21. docs: plan the emit-rate option implementationb5151ce
  22. docs: spec a selectable emit-rate optiond347419

Library

  1. style: cargo fmt345ad1e
  2. crate: discover example (enumerate boxes + open by kind/id); gate open_transport to the mock buildabcfe0e
  3. capi + python: device_info (+kind +product) + multi-box discovery (list/open_by_id/find_*_box) + version MACf642a95
  4. crate: multi-box discovery (list/open_by_id/find_*_box) + reconnect by identity; device_info replaces mouse_info8480595
  5. Bump version to 2.3.0d2f3a86
  6. mock: match the firmware's emit-rate snapping1eb5851
  7. emit-rate pacing: C ABI + Python bindings6d9ab05
  8. emit-rate pacing API93b19fc
  9. bindings(python): add a README and use it as the PyPI long descriptiond304bea

Docs

  1. docs: update example version strings from 2.2.1 to 2.3.09eeb739
  2. docs: bump docs site to v2.3.097a25f3
  3. dashboard: flush a wedged box decoder before retrying the handshake7529503
  4. dashboard: capitalize the device-kind chip, make the emit-rate radio vertical to match the others, and group Box id with the identity rows95124f5
  5. docs: add the mac field to mock Version examples; correct is_composite to n_hid>1c61e317
  6. document multi-box discovery + generic device-info (kind, product, box MAC)72f81a7
  7. docs: rewrite the native Options page table-firstf78e1e5
  8. document the emit-rate option218cf4e
  9. dashboard: add the emit-rate option control39146b2

v2.2.1

Changes

  • Added C/C++ bindings
  • Added Python bindings
  • Hardening of release binary
  • Improvements to documentation

Notes

Documentation for the new bindings can be found here: https://medius.k4tech.net/bindings

This was a required step so other developers can start utilising Medius, now I can start implementing more features/functionality

Make sure to keep the suggestions coming

Show commits

Firmware

  1. firmware: binary hardening (v2.2.1)da48813
  2. release: drop the parenthetical from the Library changelog header50d2233
  3. release: combine the 3-repo changelog and attach a bin zip to Discord9157dd8

Library

  1. bindings(python): add a README and use it as the PyPI long descriptiond304bea
  2. ci: drop sccache (measured ~no gain) + the redundant host rust reinstall47ab1dc
  3. ci: cache the wheel Rust builds with sccache (GHA backend)e1ad8b3
  4. ci: aggressive caching to cut CI time32fa151
  5. ci: attach only wheels to the release, not the sdistdc1fdde
  6. ci: export MACOSX_DEPLOYMENT_TARGET=11.0 to cibuildwheel so delocate accepts the macOS wheels772f1ce
  7. ci: pin macOS deployment target so the x86_64 wheel passes delocate6de7f4c
  8. ci: wheels match the C tarball platforms (drop i686, add macOS x86_64)5bab67e
  9. ci: skip-existing on PyPI publish so a re-dispatch is idempotentff4fa90
  10. ci: fix the crates.io version check (User-Agent) + attach wheels to the release8940488
  11. ci: build all 5 C ABI tarballs + add a manual backfill pathcc0dcac
  12. ci: merge the C ABI + Python checks into ci.yml; gate the release on themfc94810
  13. ci: drop the unavailable macos-13 wheel runner146fc21
  14. release: bump the crate, C ABI, and Python binding to 2.2.117f04ba
  15. bindings: drop the C++ wrapper; the C header serves C and C++336b4d4
  16. test: cut drift โ€” src/tests covers only what hw_full can't reachab361dd
  17. Drop the docs/ directory โ€” docs live in the medius-docs repo1c3d127
  18. review: cut slop and dedupe across the bindings1d2cd64
  19. docs(bindings): drop DIFFERENCES.md for a short README section; trim prose079731d
  20. bindings: drop the Conan recipe / vcpkg plan04e8cf8
  21. ci: fold the bindings release into the crate publish flow4ff3da7
  22. ci(wheels): install libudev in the manylinux container; skip musllinux/win325b6c99f
  23. bindings: deviation doc + publishing (PyPI, C/C++ release assets, Conan)eedbae9
  24. bindings: restore the Clone capability (Device/streams/MockBox)c78696e
  25. docs: bindings README + main README pointer to the C/C++/Python bindingsd044b5f
  26. ci: build/test/lint the C ABI + bindings; fix the publish version check6a21cf9
  27. bindings(python): self-contained sdist, py3-none wheel, API fixes20beb94
  28. bindings(python): ctypes package over the C ABI + wheel packagingd3a652e
  29. bindings(cpp): header-only RAII C++ wrapper over the C ABI00b5c36
  30. capi: cap catch-event key count at u8::MAX so it can never wrap95f8113
  31. capi: C ABI crate (medius-capi) covering the full medius surface2eeadb8
  32. docs: design spec for the C ABI + C++/Python bindingscb6919b

Docs

  1. docs: de-AI the binding prose and set version strings to 2.2.1478e9ec
  2. docs: syntax-highlight code blocks with Prisme009fb4
  3. docs: bindings section for C/C++ and Python49fede4
  4. dashboard: render the grouped per-repo changelog headers9123bc2
  5. docs: add a Discord link (top-bar button + search)52cfbc9

v2.2.0

  1. firmware: enforce the no-radio guarantee with a build guard + document1483d70
  2. Bump version to v2.2.022b2ced

v2.1.0

  1. Feat/options movement riding (#13)e657212
  2. research: note report-density is sensitivity-dependent (no absolute human threshold)0b4d928
  3. research: movement-injection detectability rig + findings781ff2d
  4. Revert "ci: cache the esp-idf docker image"2982ef5
  5. ci: cache the esp-idf docker image31ef02e
  6. ci: cache ccache across firmware buildsde14333

v2.0.1

  1. Gate verbose diagnostics behind the dev build flag (v2.0.1)f4f6074

v2.0.0

  1. Unified HID-input core (inject/move/lock/rate, faithful EP0 proxying) (#12)da90ef9
  2. Keyboard support P1 โ€” injection state into a per-target table (#8)70bbdd3
  3. Keyboard support P0 โ€” parser learns keyboard fields (#7)9f949cf
  4. fix(keyboard): follow the active interface for catch + injectcb89c70
  5. docs(protocol): keyboard + media (KEY/CONSUMER/KB_EVENT/CONS_EVENT, KBD_CAPS, KEYS catch)fca4e0f
  6. Make the mouse protocol names explicit, matching KBD_CAPS / KB_EVENTdee2484
  7. P5: note the variable-bitmap Consumer form is passthrough-only (review nit)546ee25
  8. P5: media (Consumer) key inject + catch3bf90ba
  9. P5: parse the Consumer (media-key) collectiona1ee76a
  10. P5: bind the richest keyboard interface, not the boot 6KRO96ccf5a
  11. P4: review nits โ€” widen NKRO run counter, fix stale catch comments7f47dd9
  12. P4: keyboard catch โ€” generalize the catch pipeline in place15c359a
  13. P2: review hardening โ€” reserved keycodes, bind alias, suspend-safe release992b1e6
  14. spec: drop send_text โ€” library stays semantic, no keystroke automationf54ff65
  15. test: cover the keyboard control-protocol additions3ff5aa9
  16. P2: wire keyboard inject into usbdev + control dispatch + medius client6bae488
  17. P2 (wip): keyboard render core + protocol (host-tested)57bfd90
  18. P1: injection state into a per-target table (mouse byte-identical)4a605f9
  19. P0: keyboard field parsing (modifier / array / NKRO bitmap)a0c24b4
  20. Add keyboard support design spec (v1.7.0)61b0773

v1.6.0

  1. CATCH โ€” physical-input event stream (v1.6.0) (#6)42bf371

v1.5.0

  1. LOCK โ€” block physical input selectively (v1.5.0) (#4)801b1ea
  2. Post the release changelog to Discord (#5)1a32ae0

v1.4.1

  1. LED control (v1.4.1) (#3)b85bb5b

v1.4.0

  1. feat: device-info requests (MOUSE_INFO/CAPS/RATE/STATS + RATE_CONFIDENT) (#2)01207b2

v1.3.1

  1. rate: log/persist the realised emit rate, not the raw bucket centre1c72990
  2. docs: sync reference docs with v1.3.0 (link watchdog/safety machine, drop dead PONG)455f837

v1.3.0

  1. release v1.3.094ccf57
  2. docs: record the inter-chip link watchdog + safety machine (HW-validated)2e6f224
  3. tools: link-watchdog HW validation script (idle stability, no-false-trip, strand-trip)57ad484
  4. docs: sync link-watchdog spec/plan with review fixes8f71df4
  5. fw: adversarial-review fixes โ€” dedicated lossy heartbeat task, drop dead PONGdbd5303
  6. docs: link-watchdog safety design + implementation pland9b9d0e
  7. host: ~100ms inter-chip heartbeat so idle links stay warmea44acc
  8. device: inter-chip link-loss watchdog, safety clear on loss/detach4c07124
  9. usbdev: unify the atomic clear as usbdev_safety_clear()e9ef4fb
  10. link: pure link-liveness watch helper + host test920e674
  11. docs: bring DETECTION-RESISTANCE + ARCHITECTURE up to v1.2.06c2e39c

v1.2.0

  1. release v1.2.0b73ae80
  2. fw: strip comment slop from the Tier-2 detection-resistance work7f342c3
  3. tools: fix flash_device.sh for esptool v5 + target the device's 303a download port3ea000d
  4. fw: adversarial-review fixes (patch-harness silent-unpatched + ctrl-chunk race + drop-on-full)d3dbbb2
  5. fw: B6 โ€” clone non-ASCII (raw UTF-16) string descriptors byte-truee2fa27f
  6. fw: interrupt-OUT endpoint forwarding70a3804
  7. fw: B8 โ€” chunk proxied control transfers with a data stage >504 Be96759f
  8. fw: build-time CherryUSB patch harness + 3 core conformance fixes + host limitsf5ae094
  9. fw: iConfiguration/iInterface caching, snapshot forward-compat, multi-IN guard40ce42d
  10. fw: enum-safe empty-string fallback + wIndex check + audit doc updates36dd316
  11. fw: EP0 device-feature conformance + capture stale-tail/empty-string fixesa3a192f
  12. docs: drop the "risky" framing from the host-chip flashf5ffa35
  13. docs: reflect v1.1.0 native-rate injection pacing6803c0a

v1.1.0

  1. fw: pace pure injection to the mouse's live report rate44d26a8

v1.0.2

  1. fw: clone the BOS descriptor for USB 2.01+ mice8159f29

v1.0.1

  1. release v1.0.18f1bc9b
  2. fw: robustness fixes โ€” stream re-arm, snapshot re-send, enum recoverydd34ba4
  3. ci: release notes are a commit list, not GitHub PR notes46d613a

v0.1.0

Initial release of the Medius firmware.