Thanks for reminding me to follow this up…
We actually ended up making our backend embedded system effectively the Model. The View is a related collection of lvgl widgets. And the presenter was the glue in the middle. Every component in our system use interfaces so this works perfectly with MVP.
This actually worked out brilliantly and was extremely flexible and versatile. As an example we might have a View which is an individual setting in a list of settings. We made this view very generic so can be reused, with interface for setting the description text, help text and the value of the property which could be edited.
The presenter periodically calls into the model (system) to get the current value, it then formats it appropriately before calling the views SetValue function. As well as setting the description and help text.
This mean that the view has almost no logic other than calling lvgl functions and all the formatting etc in the presenters can be easily TDD.
We also use the presenters to handle the callbacks from user buttons presses etc, again allowing us to TDD the logic.
Finally we have views/presenters which can be nested to allow the build up of larger views.
Would totally recommend this approach.