seader_scene_uart.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "../seader_i.h"
  2. #include "../seader_bridge.h"
  3. #define TAG "SeaderSceneUart"
  4. typedef struct {
  5. SeaderUartConfig cfg;
  6. SeaderUartState state;
  7. } SceneUartBridge;
  8. static SceneUartBridge* scene_uart;
  9. void seader_uart_worker_callback(SeaderWorkerEvent event, void* context) {
  10. UNUSED(event);
  11. Seader* seader = context;
  12. view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventWorkerExit);
  13. }
  14. void seader_scene_uart_callback(SeaderCustomEvent event, void* context) {
  15. furi_assert(context);
  16. Seader* app = context;
  17. view_dispatcher_send_custom_event(app->view_dispatcher, event);
  18. }
  19. void seader_scene_uart_on_enter(void* context) {
  20. Seader* app = context;
  21. uint32_t prev_state = scene_manager_get_scene_state(app->scene_manager, SeaderViewUart);
  22. if(prev_state == 0) {
  23. scene_uart = malloc(sizeof(SceneUartBridge));
  24. scene_uart->cfg.uart_ch = 0;
  25. scene_uart->cfg.flow_pins = 0;
  26. scene_uart->cfg.baudrate_mode = 0;
  27. scene_uart->cfg.baudrate = 0;
  28. }
  29. seader_uart_get_config(app->uart, &scene_uart->cfg);
  30. seader_uart_get_state(app->uart, &scene_uart->state);
  31. seader_uart_view_set_callback(app->seader_uart_view, seader_scene_uart_callback, app);
  32. scene_manager_set_scene_state(app->scene_manager, SeaderSceneUart, 0);
  33. view_dispatcher_switch_to_view(app->view_dispatcher, SeaderViewUart);
  34. notification_message(app->notifications, &sequence_display_backlight_enforce_on);
  35. Seader* seader = app;
  36. if(seader->credential->type == SeaderCredentialTypePicopass) {
  37. seader_worker_start(
  38. seader->worker,
  39. SeaderWorkerStateReadPicopass,
  40. seader->uart,
  41. seader->credential,
  42. seader_uart_worker_callback,
  43. seader);
  44. } else if(seader->credential->type == SeaderCredentialType14A) {
  45. seader_worker_start(
  46. seader->worker,
  47. SeaderWorkerStateRead14a,
  48. seader->uart,
  49. seader->credential,
  50. seader_uart_worker_callback,
  51. seader);
  52. }
  53. }
  54. bool seader_scene_uart_on_event(void* context, SceneManagerEvent event) {
  55. Seader* app = context;
  56. Seader* seader = context;
  57. bool consumed = false;
  58. if(event.type == SceneManagerEventTypeCustom) {
  59. if(event.event == SeaderCustomEventWorkerExit) {
  60. scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
  61. consumed = true;
  62. } else if(event.type == SceneManagerEventTypeTick) {
  63. scene_manager_set_scene_state(app->scene_manager, SeaderSceneUart, 1);
  64. consumed = true;
  65. }
  66. } else if(event.type == SceneManagerEventTypeTick) {
  67. uint32_t tx_cnt_last = scene_uart->state.tx_cnt;
  68. uint32_t rx_cnt_last = scene_uart->state.rx_cnt;
  69. seader_uart_get_state(app->uart, &scene_uart->state);
  70. if(seader->credential->type == SeaderCredentialTypePicopass) {
  71. scene_uart->state.protocol = FrameProtocol_iclass;
  72. } else if(seader->credential->type == SeaderCredentialType14A) {
  73. scene_uart->state.protocol = FrameProtocol_nfc;
  74. }
  75. seader_uart_view_update_state(app->seader_uart_view, &scene_uart->cfg, &scene_uart->state);
  76. if(tx_cnt_last != scene_uart->state.tx_cnt) {
  77. notification_message(app->notifications, &sequence_blink_blue_10);
  78. }
  79. if(rx_cnt_last != scene_uart->state.rx_cnt) {
  80. notification_message(app->notifications, &sequence_blink_green_10);
  81. }
  82. }
  83. return consumed;
  84. }
  85. void seader_scene_uart_on_exit(void* context) {
  86. Seader* app = context;
  87. seader_worker_stop(app->worker);
  88. notification_message(app->notifications, &sequence_display_backlight_enforce_auto);
  89. }