infrared_app_scene_learn_success.cpp 5.4 KB

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