dtmf_dolphin_bluebox.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "dtmf_dolphin_bluebox.h"
  2. #include <gui/elements.h>
  3. typedef struct DTMFDolphinBluebox {
  4. View* view;
  5. DTMFDolphinBlueboxOkCallback callback;
  6. void* context;
  7. } DTMFDolphinBluebox;
  8. typedef struct {
  9. uint8_t index;
  10. } DTMFDolphinBlueboxModel;
  11. static bool dtmf_dolphin_bluebox_process_left(DTMFDolphinBluebox* dtmf_dolphin_bluebox);
  12. static bool dtmf_dolphin_bluebox_process_right(DTMFDolphinBluebox* dtmf_dolphin_bluebox);
  13. static bool dtmf_dolphin_bluebox_process_ok(DTMFDolphinBluebox* dtmf_dolphin_bluebox, InputEvent* event);
  14. static void dtmf_dolphin_bluebox_draw_callback(Canvas* canvas, void* _model) {
  15. DTMFDolphinBlueboxModel* model = _model;
  16. UNUSED(model);
  17. canvas_set_font(canvas, FontPrimary);
  18. elements_multiline_text_aligned(canvas, 64, 2, AlignCenter, AlignTop, "Bluebox Mode");
  19. canvas_set_font(canvas, FontSecondary);
  20. elements_multiline_text_aligned(
  21. canvas, 64, 16, AlignCenter, AlignTop, "Press < or > to select");
  22. // elements_multiline_text_aligned(
  23. // canvas, 64, 32, AlignCenter, AlignTop, dtmf_dolphin_get_tone_name(model->index, DTMF_DOLPHIN_TONE_BLOCK_BLUEBOX));
  24. }
  25. static bool dtmf_dolphin_bluebox_input_callback(InputEvent* event, void* context) {
  26. furi_assert(context);
  27. DTMFDolphinBluebox* dtmf_dolphin_bluebox = context;
  28. bool consumed = false;
  29. if(event->type == InputTypeShort) {
  30. if(event->key == InputKeyRight) {
  31. consumed = dtmf_dolphin_bluebox_process_right(dtmf_dolphin_bluebox);
  32. } else if(event->key == InputKeyLeft) {
  33. consumed = dtmf_dolphin_bluebox_process_left(dtmf_dolphin_bluebox);
  34. }
  35. } else if(event->key == InputKeyOk) {
  36. consumed = dtmf_dolphin_bluebox_process_ok(dtmf_dolphin_bluebox, event);
  37. }
  38. return consumed;
  39. }
  40. static bool dtmf_dolphin_bluebox_process_left(DTMFDolphinBluebox* dtmf_dolphin_bluebox) {
  41. with_view_model(
  42. dtmf_dolphin_bluebox->view, (DTMFDolphinBlueboxModel * model) {
  43. if(model->index) {
  44. model->index--;
  45. }
  46. return true;
  47. });
  48. return true;
  49. }
  50. static bool dtmf_dolphin_bluebox_process_right(DTMFDolphinBluebox* dtmf_dolphin_bluebox) {
  51. with_view_model(
  52. dtmf_dolphin_bluebox->view, (DTMFDolphinBlueboxModel * model) {
  53. if(model->index < DTMF_DOLPHIN_BLUEBOX_TONE_COUNT) {
  54. model->index++;
  55. }
  56. return true;
  57. });
  58. return true;
  59. }
  60. static bool dtmf_dolphin_bluebox_process_ok(DTMFDolphinBluebox* dtmf_dolphin_bluebox, InputEvent* event) {
  61. bool consumed = false;
  62. with_view_model(
  63. dtmf_dolphin_bluebox->view, (DTMFDolphinBlueboxModel* model) {
  64. if(event->type == InputTypePress) {
  65. if(model->index < DTMF_DOLPHIN_BLUEBOX_TONE_COUNT) {
  66. // TODO: Do the thing
  67. } else {
  68. // TODO: Do the thing
  69. }
  70. consumed = true;
  71. } else if(event->type == InputTypeRelease) {
  72. if(model->index < DTMF_DOLPHIN_BLUEBOX_TONE_COUNT) {
  73. // gpio_item_set_pin(Model->pin_idx, false);
  74. } else {
  75. // gpio_item_set_all_pins(false);
  76. }
  77. consumed = true;
  78. }
  79. dtmf_dolphin_bluebox->callback(event->type, dtmf_dolphin_bluebox->context);
  80. return true;
  81. });
  82. return consumed;
  83. }
  84. DTMFDolphinBluebox* dtmf_dolphin_bluebox_alloc() {
  85. DTMFDolphinBluebox* dtmf_dolphin_bluebox = malloc(sizeof(DTMFDolphinBluebox));
  86. dtmf_dolphin_bluebox->view = view_alloc();
  87. view_allocate_model(dtmf_dolphin_bluebox->view, ViewModelTypeLocking, sizeof(DTMFDolphinBlueboxModel));
  88. view_set_context(dtmf_dolphin_bluebox->view, dtmf_dolphin_bluebox);
  89. view_set_draw_callback(dtmf_dolphin_bluebox->view, dtmf_dolphin_bluebox_draw_callback);
  90. view_set_input_callback(dtmf_dolphin_bluebox->view, dtmf_dolphin_bluebox_input_callback);
  91. return dtmf_dolphin_bluebox;
  92. }
  93. void dtmf_dolphin_bluebox_free(DTMFDolphinBluebox* dtmf_dolphin_bluebox) {
  94. furi_assert(dtmf_dolphin_bluebox);
  95. view_free(dtmf_dolphin_bluebox->view);
  96. free(dtmf_dolphin_bluebox);
  97. }
  98. View* dtmf_dolphin_bluebox_get_view(DTMFDolphinBluebox* dtmf_dolphin_bluebox) {
  99. furi_assert(dtmf_dolphin_bluebox);
  100. return dtmf_dolphin_bluebox->view;
  101. }
  102. void dtmf_dolphin_bluebox_set_ok_callback(DTMFDolphinBluebox* dtmf_dolphin_bluebox, DTMFDolphinBlueboxOkCallback callback, void* context) {
  103. furi_assert(dtmf_dolphin_bluebox);
  104. furi_assert(callback);
  105. with_view_model(
  106. dtmf_dolphin_bluebox->view, (DTMFDolphinBlueboxModel * model) {
  107. UNUSED(model);
  108. dtmf_dolphin_bluebox->callback = callback;
  109. dtmf_dolphin_bluebox->context = context;
  110. return false;
  111. });
  112. }