pubsub.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. #include "cmsis_os.h"
  3. #include "m-list.h"
  4. /*
  5. == PubSub ==
  6. PubSub allows users to subscribe on notifies and notify subscribers.
  7. Notifier side can pass `void*` arg to subscriber callback,
  8. and also subscriber can set `void*` context pointer that pass into
  9. callback (you can see callback signature below).
  10. */
  11. typedef void (*PubSubCallback)(const void*, void*);
  12. typedef struct PubSubType PubSub;
  13. typedef struct {
  14. PubSubCallback cb;
  15. void* ctx;
  16. PubSub* self;
  17. } PubSubItem;
  18. LIST_DEF(list_pubsub_cb, PubSubItem, M_POD_OPLIST);
  19. struct PubSubType {
  20. list_pubsub_cb_t items;
  21. osMutexId_t mutex;
  22. };
  23. /*
  24. To create PubSub you should create PubSub instance and call `init_pubsub`.
  25. */
  26. bool init_pubsub(PubSub* pubsub);
  27. /*
  28. Since we use dynamic memory - we must explicity delete pubsub
  29. */
  30. bool delete_pubsub(PubSub* pubsub);
  31. /*
  32. Use `subscribe_pubsub` to register your callback.
  33. */
  34. PubSubItem* subscribe_pubsub(PubSub* pubsub, PubSubCallback cb, void* ctx);
  35. /*
  36. Use `unsubscribe_pubsub` to unregister callback.
  37. */
  38. bool unsubscribe_pubsub(PubSubItem* pubsub_id);
  39. /*
  40. Use `notify_pubsub` to notify subscribers.
  41. */
  42. bool notify_pubsub(PubSub* pubsub, void* arg);
  43. /*
  44. ```C
  45. // MANIFEST
  46. // name="test"
  47. // stack=128
  48. void example_pubsub_handler(void* arg, void* ctx) {
  49. printf("get %d from %s\n", *(uint32_t*)arg, (const char*)ctx);
  50. }
  51. void pubsub_test() {
  52. const char* app_name = "test app";
  53. PubSub example_pubsub;
  54. init_pubsub(&example_pubsub);
  55. if(!subscribe_pubsub(&example_pubsub, example_pubsub_handler, (void*)app_name)) {
  56. printf("critical error\n");
  57. flapp_exit(NULL);
  58. }
  59. uint32_t counter = 0;
  60. while(1) {
  61. notify_pubsub(&example_pubsub, (void*)&counter);
  62. counter++;
  63. osDelay(100);
  64. }
  65. }
  66. ```
  67. */