| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include "../seader_i.h"
- #include "../seader_bridge.h"
- #define TAG "SeaderSceneUart"
- typedef struct {
- SeaderUartConfig cfg;
- SeaderUartState state;
- } SceneUartBridge;
- static SceneUartBridge* scene_uart;
- void seader_uart_worker_callback(SeaderWorkerEvent event, void* context) {
- UNUSED(event);
- Seader* seader = context;
- view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventWorkerExit);
- }
- void seader_scene_uart_callback(SeaderCustomEvent event, void* context) {
- furi_assert(context);
- Seader* app = context;
- view_dispatcher_send_custom_event(app->view_dispatcher, event);
- }
- void seader_scene_uart_on_enter(void* context) {
- Seader* app = context;
- uint32_t prev_state = scene_manager_get_scene_state(app->scene_manager, SeaderViewUart);
- if(prev_state == 0) {
- scene_uart = malloc(sizeof(SceneUartBridge));
- scene_uart->cfg.uart_ch = 0;
- scene_uart->cfg.flow_pins = 0;
- scene_uart->cfg.baudrate_mode = 0;
- scene_uart->cfg.baudrate = 0;
- }
- seader_uart_get_config(app->uart, &scene_uart->cfg);
- seader_uart_get_state(app->uart, &scene_uart->state);
- seader_uart_view_set_callback(app->seader_uart_view, seader_scene_uart_callback, app);
- scene_manager_set_scene_state(app->scene_manager, SeaderSceneUart, 0);
- view_dispatcher_switch_to_view(app->view_dispatcher, SeaderViewUart);
- notification_message(app->notifications, &sequence_display_backlight_enforce_on);
- Seader* seader = app;
- if(seader->credential->type == SeaderCredentialTypePicopass) {
- seader_worker_start(
- seader->worker,
- SeaderWorkerStateReadPicopass,
- seader->uart,
- seader->credential,
- seader_uart_worker_callback,
- seader);
- } else if(seader->credential->type == SeaderCredentialType14A) {
- seader_worker_start(
- seader->worker,
- SeaderWorkerStateRead14a,
- seader->uart,
- seader->credential,
- seader_uart_worker_callback,
- seader);
- }
- }
- bool seader_scene_uart_on_event(void* context, SceneManagerEvent event) {
- Seader* app = context;
- Seader* seader = context;
- bool consumed = false;
- if(event.type == SceneManagerEventTypeCustom) {
- if(event.event == SeaderCustomEventWorkerExit) {
- scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
- consumed = true;
- } else if(event.type == SceneManagerEventTypeTick) {
- scene_manager_set_scene_state(app->scene_manager, SeaderSceneUart, 1);
- consumed = true;
- }
- } else if(event.type == SceneManagerEventTypeTick) {
- uint32_t tx_cnt_last = scene_uart->state.tx_cnt;
- uint32_t rx_cnt_last = scene_uart->state.rx_cnt;
- seader_uart_get_state(app->uart, &scene_uart->state);
- if(seader->credential->type == SeaderCredentialTypePicopass) {
- scene_uart->state.protocol = FrameProtocol_iclass;
- } else if(seader->credential->type == SeaderCredentialType14A) {
- scene_uart->state.protocol = FrameProtocol_nfc;
- }
- seader_uart_view_update_state(app->seader_uart_view, &scene_uart->cfg, &scene_uart->state);
- if(tx_cnt_last != scene_uart->state.tx_cnt) {
- notification_message(app->notifications, &sequence_blink_blue_10);
- }
- if(rx_cnt_last != scene_uart->state.rx_cnt) {
- notification_message(app->notifications, &sequence_blink_green_10);
- }
- }
- return consumed;
- }
- void seader_scene_uart_on_exit(void* context) {
- Seader* app = context;
- seader_worker_stop(app->worker);
- notification_message(app->notifications, &sequence_display_backlight_enforce_auto);
- }
|