link_camera.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "link_camera.h"
  2. #include <gui/elements.h>
  3. #include <malveke_gb_link_camera_icons.h>
  4. QRCode qrcode;
  5. uint8_t qrcodeData[((((4 * 8 + 17) * (4 * 8 + 17)) + 7) / 8)];
  6. static uint32_t link_camera_exit(void* context) {
  7. UNUSED(context);
  8. return VIEW_NONE;
  9. }
  10. static void view_draw_callback(Canvas* canvas, void* _model) {
  11. LinkCameraModel* model = _model;
  12. canvas_clear(canvas);
  13. canvas_set_color(canvas, ColorBlack);
  14. canvas_set_font(canvas, FontPrimary);
  15. if(model->connected) {
  16. canvas_set_font(canvas, FontPrimary);
  17. canvas_draw_str(canvas, 2, 11, "SSID");
  18. canvas_set_font(canvas, FontSecondary);
  19. canvas_draw_str(canvas, 2, 20, "[MALVEKE] Flipper GB Cam");
  20. canvas_set_font(canvas, FontPrimary);
  21. canvas_draw_str(canvas, 2, 30, "Password");
  22. canvas_set_font(canvas, FontSecondary);
  23. canvas_draw_str(canvas, 2, 40, "12345678");
  24. canvas_set_font(canvas, FontPrimary);
  25. canvas_draw_str(canvas, 2, 50, "Host");
  26. canvas_set_font(canvas, FontSecondary);
  27. canvas_draw_str(canvas, 2, 60, model->ip);
  28. } else {
  29. canvas_draw_icon(canvas, 60, 7, &I_malveke_67x49);
  30. canvas_set_font(canvas, FontSecondary);
  31. canvas_draw_str(canvas, 4, 25, "Connect");
  32. canvas_set_font(canvas, FontPrimary);
  33. canvas_draw_str(canvas, 4, 35, "MALVEKE");
  34. canvas_set_font(canvas, FontSecondary);
  35. canvas_draw_str(canvas, 4, 44, "into Flipper");
  36. elements_button_center(canvas, "Ok");
  37. }
  38. }
  39. static bool view_input_callback(InputEvent* event, void* context) {
  40. LinkCameraApp* instance = context;
  41. UNUSED(instance);
  42. if(event->type == InputTypePress) {
  43. if(event->key == InputKeyBack) {
  44. uart_set_handle_rx_data_cb(instance->uart, NULL);
  45. uart_free(instance->uart);
  46. furi_hal_power_disable_external_3_3v();
  47. furi_delay_ms(100);
  48. furi_hal_power_enable_external_3_3v();
  49. furi_delay_ms(200);
  50. } else if(event->key == InputKeyOk) {
  51. furi_hal_power_disable_external_3_3v();
  52. furi_delay_ms(100);
  53. furi_hal_power_enable_external_3_3v();
  54. furi_delay_ms(200);
  55. with_view_model(
  56. instance->view, LinkCameraModel * model, { model->initialized = true; }, true);
  57. uart_tx(instance->uart, (uint8_t*)("c"), 1);
  58. uart_tx(instance->uart, (uint8_t*)("\n"), 1);
  59. }
  60. }
  61. return false;
  62. }
  63. static void link_camera_free(LinkCameraApp* app) {
  64. furi_assert(app);
  65. // Free views
  66. view_dispatcher_remove_view(app->view_dispatcher, 0);
  67. view_free(app->view);
  68. view_dispatcher_free(app->view_dispatcher);
  69. // Close gui record
  70. furi_record_close(RECORD_GUI);
  71. furi_record_close(RECORD_STORAGE);
  72. app->gui = NULL;
  73. // Free rest
  74. free(app);
  75. }
  76. void handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
  77. furi_assert(context);
  78. UNUSED(len);
  79. LinkCameraApp* instance = (LinkCameraApp*)context;
  80. with_view_model(
  81. instance->view,
  82. LinkCameraModel * model,
  83. {
  84. cJSON* json = cJSON_Parse((char*)buf);
  85. if(json == NULL) {
  86. } else {
  87. cJSON* type = cJSON_GetObjectItemCaseSensitive(json, "type");
  88. if(cJSON_IsString(type) && (type->valuestring != NULL)) {
  89. model->event_type = strdup(type->valuestring);
  90. } else {
  91. model->event_type = "None";
  92. }
  93. if(strcmp(model->event_type, "connected") == 0) {
  94. cJSON* ip = cJSON_GetObjectItemCaseSensitive(json, "ip");
  95. if(cJSON_IsString(ip) && (ip->valuestring != NULL)) {
  96. model->ip = strdup(ip->valuestring);
  97. } else {
  98. model->ip = "0.0.0.0";
  99. }
  100. cJSON* ssid = cJSON_GetObjectItemCaseSensitive(json, "ssid");
  101. if(cJSON_IsString(ssid) && (ssid->valuestring != NULL)) {
  102. model->ssid = strdup(ssid->valuestring);
  103. } else {
  104. model->ssid = " - ";
  105. }
  106. cJSON* password = cJSON_GetObjectItemCaseSensitive(json, "password");
  107. if(cJSON_IsString(password) && (password->valuestring != NULL)) {
  108. model->password = strdup(password->valuestring);
  109. } else {
  110. model->password = "******";
  111. }
  112. model->connected = true;
  113. }
  114. }
  115. },
  116. true);
  117. }
  118. static LinkCameraApp* link_camera_alloc() {
  119. LinkCameraApp* app = malloc(sizeof(LinkCameraApp));
  120. // Gui
  121. app->gui = furi_record_open(RECORD_GUI);
  122. app->storage = furi_record_open(RECORD_STORAGE);
  123. app->uart = usart_init(app);
  124. uart_set_handle_rx_data_cb(app->uart, handle_rx_data_cb);
  125. // View dispatcher
  126. app->view_dispatcher = view_dispatcher_alloc();
  127. view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  128. // Views
  129. app->view = view_alloc();
  130. view_set_context(app->view, app);
  131. view_set_draw_callback(app->view, view_draw_callback);
  132. view_set_input_callback(app->view, view_input_callback);
  133. view_allocate_model(app->view, ViewModelTypeLocking, sizeof(LinkCameraModel));
  134. view_set_previous_callback(app->view, link_camera_exit);
  135. view_dispatcher_add_view(app->view_dispatcher, 0, app->view);
  136. view_dispatcher_switch_to_view(app->view_dispatcher, 0);
  137. return app;
  138. }
  139. int32_t link_camera_app(void* p) {
  140. UNUSED(p);
  141. LinkCameraApp* app = link_camera_alloc();
  142. view_dispatcher_run(app->view_dispatcher);
  143. link_camera_free(app);
  144. return 0;
  145. }