infrared_app_scene_learn_success.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include <gui/modules/dialog_ex.h>
  2. #include <memory>
  3. #include <dolphin/dolphin.h>
  4. #include "../infrared_app.h"
  5. #include "infrared.h"
  6. static void dialog_result_callback(DialogExResult result, void* context) {
  7. auto app = static_cast<InfraredApp*>(context);
  8. InfraredAppEvent event;
  9. event.type = InfraredAppEvent::Type::DialogExSelected;
  10. event.payload.dialog_ex_result = result;
  11. app->get_view_manager()->send_event(&event);
  12. }
  13. void InfraredAppSceneLearnSuccess::on_enter(InfraredApp* app) {
  14. InfraredAppViewManager* view_manager = app->get_view_manager();
  15. DialogEx* dialog_ex = view_manager->get_dialog_ex();
  16. DOLPHIN_DEED(DolphinDeedIrLearnSuccess);
  17. app->notify_green_on();
  18. infrared_worker_tx_set_get_signal_callback(
  19. app->get_infrared_worker(), infrared_worker_tx_get_signal_steady_callback, app);
  20. infrared_worker_tx_set_signal_sent_callback(
  21. app->get_infrared_worker(), InfraredApp::signal_sent_callback, app);
  22. auto signal = app->get_received_signal();
  23. if(!signal.is_raw()) {
  24. auto message = &signal.get_message();
  25. uint8_t adr_digits =
  26. ROUND_UP_TO(infrared_get_protocol_address_length(message->protocol), 4);
  27. uint8_t cmd_digits =
  28. ROUND_UP_TO(infrared_get_protocol_command_length(message->protocol), 4);
  29. uint8_t max_digits = MAX(adr_digits, cmd_digits);
  30. max_digits = MIN(max_digits, 7);
  31. size_t label_x_offset = 63 + (7 - max_digits) * 3;
  32. app->set_text_store(0, "%s", infrared_get_protocol_name(message->protocol));
  33. app->set_text_store(
  34. 1,
  35. "A: 0x%0*lX\nC: 0x%0*lX\n",
  36. adr_digits,
  37. message->address,
  38. cmd_digits,
  39. message->command);
  40. dialog_ex_set_header(dialog_ex, app->get_text_store(0), 95, 7, AlignCenter, AlignCenter);
  41. dialog_ex_set_text(
  42. dialog_ex, app->get_text_store(1), label_x_offset, 34, AlignLeft, AlignCenter);
  43. } else {
  44. dialog_ex_set_header(dialog_ex, "Unknown", 95, 10, AlignCenter, AlignCenter);
  45. app->set_text_store(0, "%d samples", signal.get_raw_signal().timings_cnt);
  46. dialog_ex_set_text(dialog_ex, app->get_text_store(0), 75, 23, AlignLeft, AlignTop);
  47. }
  48. dialog_ex_set_left_button_text(dialog_ex, "Retry");
  49. dialog_ex_set_right_button_text(dialog_ex, "Save");
  50. dialog_ex_set_center_button_text(dialog_ex, "Send");
  51. dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63);
  52. dialog_ex_set_result_callback(dialog_ex, dialog_result_callback);
  53. dialog_ex_set_context(dialog_ex, app);
  54. dialog_ex_enable_extended_events(dialog_ex);
  55. view_manager->switch_to(InfraredAppViewManager::ViewId::DialogEx);
  56. }
  57. bool InfraredAppSceneLearnSuccess::on_event(InfraredApp* app, InfraredAppEvent* event) {
  58. bool consumed = false;
  59. if(event->type == InfraredAppEvent::Type::Tick) {
  60. /* Send event every tick to suppress any switching off green light */
  61. if(!button_pressed) {
  62. app->notify_green_on();
  63. }
  64. }
  65. if(event->type == InfraredAppEvent::Type::DialogExSelected) {
  66. switch(event->payload.dialog_ex_result) {
  67. case DialogExResultLeft:
  68. consumed = true;
  69. if(!button_pressed) {
  70. app->switch_to_next_scene_without_saving(InfraredApp::Scene::Learn);
  71. }
  72. break;
  73. case DialogExResultRight: {
  74. consumed = true;
  75. if(!button_pressed) {
  76. app->switch_to_next_scene(InfraredApp::Scene::LearnEnterName);
  77. }
  78. break;
  79. }
  80. case DialogExPressCenter:
  81. if(!button_pressed) {
  82. button_pressed = true;
  83. auto signal = app->get_received_signal();
  84. if(signal.is_raw()) {
  85. infrared_worker_set_raw_signal(
  86. app->get_infrared_worker(),
  87. signal.get_raw_signal().timings,
  88. signal.get_raw_signal().timings_cnt);
  89. } else {
  90. infrared_worker_set_decoded_signal(
  91. app->get_infrared_worker(), &signal.get_message());
  92. }
  93. infrared_worker_tx_start(app->get_infrared_worker());
  94. }
  95. break;
  96. case DialogExReleaseCenter:
  97. if(button_pressed) {
  98. button_pressed = false;
  99. infrared_worker_tx_stop(app->get_infrared_worker());
  100. app->notify_green_off();
  101. }
  102. break;
  103. default:
  104. break;
  105. }
  106. }
  107. if(event->type == InfraredAppEvent::Type::Back) {
  108. if(!button_pressed) {
  109. app->switch_to_next_scene(InfraredApp::Scene::AskBack);
  110. }
  111. consumed = true;
  112. }
  113. return consumed;
  114. }
  115. void InfraredAppSceneLearnSuccess::on_exit(InfraredApp* app) {
  116. InfraredAppViewManager* view_manager = app->get_view_manager();
  117. DialogEx* dialog_ex = view_manager->get_dialog_ex();
  118. dialog_ex_reset(dialog_ex);
  119. app->notify_green_off();
  120. infrared_worker_tx_set_get_signal_callback(app->get_infrared_worker(), nullptr, nullptr);
  121. infrared_worker_tx_set_signal_sent_callback(app->get_infrared_worker(), nullptr, nullptr);
  122. }