ibutton_scene_write.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "../ibutton_i.h"
  2. typedef enum {
  3. iButtonSceneWriteStateDefault,
  4. iButtonSceneWriteStateBlinkYellow,
  5. } iButtonSceneWriteState;
  6. static void ibutton_scene_write_callback(void* context, iButtonWorkerWriteResult result) {
  7. iButton* ibutton = context;
  8. view_dispatcher_send_custom_event(ibutton->view_dispatcher, result);
  9. }
  10. void ibutton_scene_write_on_enter(void* context) {
  11. iButton* ibutton = context;
  12. furi_assert(ibutton->write_mode != iButtonWriteModeInvalid);
  13. iButtonKey* key = ibutton->key;
  14. iButtonWorker* worker = ibutton->worker;
  15. const iButtonProtocolId protocol_id = ibutton_key_get_protocol_id(key);
  16. Widget* widget = ibutton->widget;
  17. FuriString* tmp = furi_string_alloc();
  18. widget_add_icon_element(widget, 3, 10, &I_iButtonKey_49x44);
  19. furi_string_printf(
  20. tmp,
  21. "%s\n[%s]",
  22. ibutton->key_name,
  23. ibutton_protocols_get_name(ibutton->protocols, protocol_id));
  24. widget_add_text_box_element(
  25. widget, 52, 38, 75, 26, AlignCenter, AlignCenter, furi_string_get_cstr(tmp), true);
  26. ibutton_worker_write_set_callback(worker, ibutton_scene_write_callback, ibutton);
  27. furi_string_set(tmp, "iButton\nwriting ");
  28. if(ibutton->write_mode == iButtonWriteModeBlank) {
  29. furi_string_cat(tmp, "Blank");
  30. ibutton_worker_write_blank_start(worker, key);
  31. } else if(ibutton->write_mode == iButtonWriteModeCopy) {
  32. furi_string_cat(tmp, "Copy");
  33. ibutton_worker_write_copy_start(worker, key);
  34. }
  35. widget_add_string_multiline_element(
  36. widget, 88, 10, AlignCenter, AlignTop, FontPrimary, furi_string_get_cstr(tmp));
  37. ibutton_notification_message(ibutton, iButtonNotificationMessageEmulateStart);
  38. view_dispatcher_switch_to_view(ibutton->view_dispatcher, iButtonViewWidget);
  39. furi_string_free(tmp);
  40. }
  41. bool ibutton_scene_write_on_event(void* context, SceneManagerEvent event) {
  42. iButton* ibutton = context;
  43. SceneManager* scene_manager = ibutton->scene_manager;
  44. bool consumed = false;
  45. if(event.type == SceneManagerEventTypeCustom) {
  46. consumed = true;
  47. if((event.event == iButtonWorkerWriteOK) || (event.event == iButtonWorkerWriteSameKey)) {
  48. scene_manager_next_scene(scene_manager, iButtonSceneWriteSuccess);
  49. } else if(event.event == iButtonWorkerWriteNoDetect) {
  50. ibutton_notification_message(ibutton, iButtonNotificationMessageEmulateBlink);
  51. } else if(event.event == iButtonWorkerWriteCannotWrite) {
  52. ibutton_notification_message(ibutton, iButtonNotificationMessageYellowBlink);
  53. }
  54. } else if(event.type == SceneManagerEventTypeTick) {
  55. consumed = true;
  56. }
  57. return consumed;
  58. }
  59. void ibutton_scene_write_on_exit(void* context) {
  60. iButton* ibutton = context;
  61. ibutton->write_mode = iButtonWriteModeInvalid;
  62. ibutton_worker_stop(ibutton->worker);
  63. widget_reset(ibutton->widget);
  64. ibutton_notification_message(ibutton, iButtonNotificationMessageBlinkStop);
  65. }