irda_app_scene_learn_success.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "../irda_app.h"
  2. #include <file_worker_cpp.h>
  3. #include "irda.h"
  4. #include <memory>
  5. static void dialog_result_callback(DialogExResult result, void* context) {
  6. auto app = static_cast<IrdaApp*>(context);
  7. IrdaAppEvent event;
  8. event.type = IrdaAppEvent::Type::DialogExSelected;
  9. event.payload.dialog_ex_result = result;
  10. app->get_view_manager()->send_event(&event);
  11. }
  12. void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) {
  13. IrdaAppViewManager* view_manager = app->get_view_manager();
  14. DialogEx* dialog_ex = view_manager->get_dialog_ex();
  15. app->notify_green_on();
  16. auto signal = app->get_received_signal();
  17. if(!signal.is_raw()) {
  18. auto message = &signal.get_message();
  19. uint8_t adr_digits = ROUND_UP_TO(irda_get_protocol_address_length(message->protocol), 4);
  20. uint8_t cmd_digits = ROUND_UP_TO(irda_get_protocol_command_length(message->protocol), 4);
  21. uint8_t max_digits = MAX(adr_digits, cmd_digits);
  22. max_digits = MIN(max_digits, 7);
  23. size_t label_x_offset = 63 + (7 - max_digits) * 3;
  24. app->set_text_store(0, "%s", irda_get_protocol_name(message->protocol));
  25. app->set_text_store(
  26. 1,
  27. "A: 0x%0*lX\nC: 0x%0*lX\n",
  28. adr_digits,
  29. message->address,
  30. cmd_digits,
  31. message->command);
  32. dialog_ex_set_header(dialog_ex, app->get_text_store(0), 95, 7, AlignCenter, AlignCenter);
  33. dialog_ex_set_text(
  34. dialog_ex, app->get_text_store(1), label_x_offset, 34, AlignLeft, AlignCenter);
  35. } else {
  36. dialog_ex_set_header(dialog_ex, "Unknown", 95, 10, AlignCenter, AlignCenter);
  37. app->set_text_store(0, "%d samples", signal.get_raw_signal().timings_cnt);
  38. dialog_ex_set_text(dialog_ex, app->get_text_store(0), 75, 23, AlignLeft, AlignTop);
  39. }
  40. dialog_ex_set_left_button_text(dialog_ex, "Retry");
  41. dialog_ex_set_right_button_text(dialog_ex, "Save");
  42. dialog_ex_set_center_button_text(dialog_ex, "Send");
  43. dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63);
  44. dialog_ex_set_result_callback(dialog_ex, dialog_result_callback);
  45. dialog_ex_set_context(dialog_ex, app);
  46. view_manager->switch_to(IrdaAppViewManager::ViewType::DialogEx);
  47. }
  48. bool IrdaAppSceneLearnSuccess::on_event(IrdaApp* app, IrdaAppEvent* event) {
  49. bool consumed = false;
  50. if(event->type == IrdaAppEvent::Type::Tick) {
  51. /* Send event every tick to suppress any switching off green light */
  52. app->notify_green_on();
  53. }
  54. if(event->type == IrdaAppEvent::Type::DialogExSelected) {
  55. switch(event->payload.dialog_ex_result) {
  56. case DialogExResultLeft:
  57. app->switch_to_next_scene_without_saving(IrdaApp::Scene::Learn);
  58. break;
  59. case DialogExResultCenter: {
  60. app->notify_sent_just_learnt();
  61. auto signal = app->get_received_signal();
  62. signal.transmit();
  63. break;
  64. }
  65. case DialogExResultRight: {
  66. FileWorkerCpp file_worker;
  67. if(file_worker.check_errors()) {
  68. app->switch_to_next_scene(IrdaApp::Scene::LearnEnterName);
  69. } else {
  70. app->switch_to_previous_scene();
  71. }
  72. break;
  73. }
  74. default:
  75. break;
  76. }
  77. }
  78. return consumed;
  79. }
  80. void IrdaAppSceneLearnSuccess::on_exit(IrdaApp* app) {
  81. IrdaAppViewManager* view_manager = app->get_view_manager();
  82. DialogEx* dialog_ex = view_manager->get_dialog_ex();
  83. dialog_ex_set_center_button_text(dialog_ex, nullptr);
  84. app->notify_green_off();
  85. }