value-expanders.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #pragma once
  2. #include "flipper.h"
  3. /*
  4. == Value composer ==
  5. */
  6. typedef void(ValueComposerCallback)(void* ctx, void* state);
  7. void COPY_COMPOSE(void* ctx, void* state) {
  8. read_mutex((ValueMutex*)ctx, state, 0);
  9. }
  10. typedef enum { UiLayerBelowNotify UiLayerNotify, UiLayerAboveNotify } UiLayer;
  11. ValueComposerHandle*
  12. add_compose_layer(ValueComposer* composer, ValueComposerCallback cb, void* ctx, uint32_t layer);
  13. bool remove_compose_layer(ValueComposerHandle* handle);
  14. void request_compose(ValueComposerHandle* handle);
  15. // See [LED](LED-API) or [Display](Display-API) API for examples.
  16. /*
  17. == ValueManager ==
  18. More complicated concept is ValueManager.
  19. It is like ValueMutex, but user can subscribe to value updates.
  20. First of all you can use value and pubsub part as showing above:
  21. aquire/release mutex, read value, subscribe/unsubscribe pubsub.
  22. There are two specific methods for ValueManager: write_managed, commit_managed
  23. */
  24. typedef struct {
  25. ValueMutex value;
  26. PubSub pubsub;
  27. } ValueManager;
  28. /*
  29. acquire value, changes it and send notify with current value.
  30. */
  31. bool write_managed(ValueManager* managed, void* data, size_t len, uint32_t timeout);
  32. /*
  33. commit_managed works as `release_mutex` but send notify with current value.
  34. */
  35. bool commit_managed(ValueManager* managed, void* value);