Conversation
Co-authored-by: Cursor <cursoragent@cursor.com>
|
Hi @kosmar , This is a significant UX change that I am not sure we'll go forward with. Here is the reasoning. Parameters are meant to be set and forget settings and are meant to be fixed and never change unless the user changes it with the configurator. Anything that is that is dynamic has to be accessible with the channel UI and have LED feedback. This goes with the UX intent that we have with Faderpunk which is to have a two stage workflow. First, one would create their layout and set the params. Second, the user would use the setup they created to perform and play the Faderpunk. The goal if this UX is to replicate the workflow of a modular synth were one select modules and put them into a case with limited space and play with it. The goal of this are:
I want to avoid the dependence to the configurator for any apps. Now, these are not points that are blocking this PR but I'd like to consider this longer. However I don't think the implementation of this PR should be a blocker for all the apps that are currently stacked on top of it. I would suggest that the apps stacked on this PR are modified so that these can be reviewed independently. |
|
i think its mainly #642, that wants this. but more a convenience than necessity. |
|
only UX issue might be: |
ParamStore writeback push stays out; apps use the save-only polyfill. Authored by an AI coding agent on behalf of kosmar. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep Mode B/C/D as configurator params for setup. On-device Shift+long writes scene storage (survives jack reconfigure restart) and calls params.update so ParamStore/FRAM stay aligned. Host UI stays stale until ATOVproject#640 adds the AppState push. Authored by an AI coding agent on behalf of kosmar. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Split the non-blocking part into #647: |
|
Superseded by #691, which takes a different approach: the device never pushes an unsolicited message (that broke the open configurator — see the review on this PR), and it adds the SDK mirror needed for installed apps to actually use this, which this PR never had. Thanks for opening the discussion that led to it. |
Replaces #640. Apps can change their own parameters (a panel gesture that picks a value the user could otherwise only set from the configurator), and the change reaches the configurator without a reconnect. The device never pushes an unsolicited message; the configurator polls GetChangedAppParams alongside its existing connection check. ParamStore::update() persists and marks a channel dirty on both the firmware store and its fpapp-sdk mirror, so installed apps get it too. Also fixes the configurator never displaying a live update: react-hook-form's fields are uncontrolled and never revisit a changed defaultValue.
Params travel host→device: the configurator sets them, the app reads them. An
app that lets the user pick a value on the hardware (a gesture that cycles a
genre or a voice, say) has no way to close the loop — the value is neither
persisted nor reflected, so the configurator keeps showing the old one until
the app task restarts.
Adds
ParamStore::update(), which mutates, saves, and pushes the new values tothe host.
The push needs its own channel.
APP_PARAM_CHANNELcarries request/responsereplies, and an unsolicited push queued there gets drained as a stale reply to
a later
GetAppParams— the host would see the wrong layout's state. SoAPP_PARAM_PUSH_CHANNELis separate, and the config loop selects on it whileidle. The select is cancel-safe:
read_msgawaits on the frame channel, so nopartial frame is lost when the select flips.
#[allow(dead_code)]because the first callers are the WIP app branches(#633, #604), which cannot compile against
mainwithout this.Note for review:
cargo clippy -D warningscurrently fails onmainitselfwith a
chunks_exactlint intasks/midi.rs, unrelated to this change.Test checklist (hardware)
the configurator updates live without a reconnect
GetAppParamsfor another layout still returns that layout's own state(no stale reply crossover)
Made with Cursor