-
Notifications
You must be signed in to change notification settings - Fork 250
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dynamically enable/disable and order faces at runtime #264
base: main
Are you sure you want to change the base?
Conversation
sorry for my 5¢: while I like the idea, watch face runtime customization is hackfix to:
|
Even if easy wireless firmware upgrade was available, I think there is still value in customizing active faces at runtime. For example, you could build a monster firmware that includes say 100 faces, most of which will be disabled most of the time. |
Woah! This is highly appreciated. I regularly use the watch, and depending on the context (work, traveling, vacation, leisure), I would disable specific faces to cycle through the important ones quickly. I will test the face in the next days. |
fda2221
to
cbb9069
Compare
This is amazing! Especially for things like a world clock it makes a lot of sense to be able to activate/deactivate that easily. But even for a face you just want to test-drive it would be really nice to be able to deactivate it if you don't end up using it after a while. Also moving things between the primary and secondary layer is also great! ❤️ |
cbb9069
to
e39151a
Compare
The label specified by each face can be used to help the user when rearranging the face order in page_ordering_page. Also implement the label function for a few common existing faces.
e39151a
to
188f716
Compare
Am I right that it would be a bad idea to disable faces like finetune and nanosec as it would not only hide them but also stop there execution? |
Can't speak for those faces since I don't use them, but it's up to the user I guess? The initial secondary face can be set at build time through |
Thanks for the fast reply. |
Hey! So sorry for the delay in reviewing this. This was a huge and impressive effort; thanks so much for your thoughtful approach and detailed notes! Alas I think this is a bit of a big change to make to the main Movement firmware, especially inasmuch as it would require rewriting a lot of documentation, and changing expectations both among folks who have previously made watch faces, and folks picking up the watch and using it for the first time. My thought: might it make sense to make this version of Movement its own app, separate from the default Movement firmware, in the Let me know what you think! |
@joeycastillo
I have already taken care of fixing these changes throughout the existing faces in the repo, as well as the face template generator, and the various readmes. The only other place that would need to be changed is the docs website. The other more invasive change is the addition of the Finally, I don't think making it an alternative movement app would be a good idea, because despite the minor breaking changes above, it means that all the existing and future faces wouldn't work with this alternative movement. What do you think? PS: |
First of all I would like to thank you for this great project!!
The developer experience has been great thanks to the documentation, code organization and the emulator: I'm not a C programmer (unless C++ counts :P) and don't even have the watch yet, but I was still able to put this together in a couple of evenings.
This is my first contribution to the project, and as you'll see it's quite far reaching. Should you decide to accept it, make sure to give it a careful review, cause I am not to be trusted :)
Changes to
movement
(first commit)I would like to propose some changes to
movement
app so that we can dynamically enable/disable the faces that were built into the current firmware, as well as reorder them.For example, lets assume the following faces have been specified in
movement_config.h
:When the watch first starts, the user will navigate through the pages in the following order:
Let's say that now we would like to have a different arrangement (and to achieve it at runtime without rebuilding/reflashing the firmware), for example:
where
AL
is no longer there, the order ofST
andDT
has been swapped, andCD
is a secondary face.To achieve this, I have introduced the concept of
page
which is a dynamic redirect to one of the staticfaces
. When navigating, we will now ask to go to the next page, or to the i-th page, instead of navigating based of the face like before.By calling the following methods that have been added in this PR, we obtain the desired navigation:
Internally I have added a couple of auxiliary arrays to keep track of which
face
is on eachpage
and the on/off status of eachface
:So when the the watch starts the arrays are in the following state:
and after calling the three methods above the arrays are in the following state:
New face
page_ordering_face
(second commit)I have created a new face that leverages the new API and gives the user complete control over rearranging their faces:
Screencast.from.08-18-2023.09.50.26.PM.webm
Changes to
watch_face_t
(third commit)In order to display a human readable label when using the
page_ordering_face
to help the user be aware of which face/page is being manipulated, I have extended thewatch_face_t
struct to include an additional optional method calledlabel
with the following signature:If changing the
watch_face_t
is considered out of scope for this improvement, you can simply revert the 3rd commit in this PR, and the watch faces will be labelled based on their static order.