about.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include <furi.h>
  2. #include <dialogs/dialogs.h>
  3. #include <gui/gui.h>
  4. #include <gui/view_dispatcher.h>
  5. #include <gui/modules/empty_screen.h>
  6. #include <assets_icons.h>
  7. #include <furi_hal_version.h>
  8. #include <furi_hal_region.h>
  9. #include <furi_hal_bt.h>
  10. typedef DialogMessageButton (*AboutDialogScreen)(DialogsApp* dialogs, DialogMessage* message);
  11. static DialogMessageButton product_screen(DialogsApp* dialogs, DialogMessage* message) {
  12. DialogMessageButton result;
  13. FuriString* screen_header = furi_string_alloc_printf(
  14. "Product: %s\n"
  15. "Model: %s",
  16. furi_hal_version_get_model_name(),
  17. furi_hal_version_get_model_code());
  18. FuriString* screen_text = furi_string_alloc_printf(
  19. "FCC ID: %s\n"
  20. "IC: %s",
  21. furi_hal_version_get_fcc_id(),
  22. furi_hal_version_get_ic_id());
  23. dialog_message_set_header(
  24. message, furi_string_get_cstr(screen_header), 0, 0, AlignLeft, AlignTop);
  25. dialog_message_set_text(
  26. message, furi_string_get_cstr(screen_text), 0, 26, AlignLeft, AlignTop);
  27. result = dialog_message_show(dialogs, message);
  28. dialog_message_set_header(message, NULL, 0, 0, AlignLeft, AlignTop);
  29. dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
  30. furi_string_free(screen_header);
  31. furi_string_free(screen_text);
  32. return result;
  33. }
  34. static DialogMessageButton address_screen(DialogsApp* dialogs, DialogMessage* message) {
  35. DialogMessageButton result;
  36. const char* screen_text = "Flipper Devices Inc\n"
  37. "Suite B #551, 2803\n"
  38. "Philadelphia Pike, Claymont\n"
  39. "DE, USA 19703\n";
  40. dialog_message_set_text(message, screen_text, 0, 0, AlignLeft, AlignTop);
  41. result = dialog_message_show(dialogs, message);
  42. dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
  43. return result;
  44. }
  45. static DialogMessageButton compliance_screen(DialogsApp* dialogs, DialogMessage* message) {
  46. DialogMessageButton result;
  47. const char* screen_text = "For all compliance\n"
  48. "certificates please visit:\n"
  49. "www.flipp.dev/compliance";
  50. dialog_message_set_text(message, screen_text, 0, 0, AlignLeft, AlignTop);
  51. result = dialog_message_show(dialogs, message);
  52. dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
  53. return result;
  54. }
  55. static DialogMessageButton icon1_screen(DialogsApp* dialogs, DialogMessage* message) {
  56. DialogMessageButton result;
  57. dialog_message_set_icon(message, &I_Certification1_103x56, 13, 0);
  58. result = dialog_message_show(dialogs, message);
  59. dialog_message_set_icon(message, NULL, 0, 0);
  60. return result;
  61. }
  62. static DialogMessageButton icon2_screen(DialogsApp* dialogs, DialogMessage* message) {
  63. DialogMessageButton result;
  64. dialog_message_set_icon(message, &I_Certification2_98x33, 15, 10);
  65. result = dialog_message_show(dialogs, message);
  66. dialog_message_set_icon(message, NULL, 0, 0);
  67. return result;
  68. }
  69. static DialogMessageButton hw_version_screen(DialogsApp* dialogs, DialogMessage* message) {
  70. DialogMessageButton result;
  71. FuriString* buffer;
  72. buffer = furi_string_alloc();
  73. const char* my_name = furi_hal_version_get_name_ptr();
  74. furi_string_cat_printf(
  75. buffer,
  76. "%d.F%dB%dC%d %s:%s %s\n",
  77. furi_hal_version_get_hw_version(),
  78. furi_hal_version_get_hw_target(),
  79. furi_hal_version_get_hw_body(),
  80. furi_hal_version_get_hw_connect(),
  81. furi_hal_version_get_hw_region_name(),
  82. furi_hal_region_get_name(),
  83. my_name ? my_name : "Unknown");
  84. furi_string_cat_printf(buffer, "Serial Number:\n");
  85. const uint8_t* uid = furi_hal_version_uid();
  86. for(size_t i = 0; i < furi_hal_version_uid_size(); i++) {
  87. furi_string_cat_printf(buffer, "%02X", uid[i]);
  88. }
  89. dialog_message_set_header(message, "HW Version Info:", 0, 0, AlignLeft, AlignTop);
  90. dialog_message_set_text(message, furi_string_get_cstr(buffer), 0, 13, AlignLeft, AlignTop);
  91. result = dialog_message_show(dialogs, message);
  92. dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
  93. dialog_message_set_header(message, NULL, 0, 0, AlignLeft, AlignTop);
  94. furi_string_free(buffer);
  95. return result;
  96. }
  97. static DialogMessageButton fw_version_screen(DialogsApp* dialogs, DialogMessage* message) {
  98. DialogMessageButton result;
  99. FuriString* buffer;
  100. buffer = furi_string_alloc();
  101. const Version* ver = furi_hal_version_get_firmware_version();
  102. const BleGlueC2Info* c2_ver = NULL;
  103. #ifdef SRV_BT
  104. c2_ver = ble_glue_get_c2_info();
  105. #endif
  106. if(!ver) { //-V1051
  107. furi_string_cat_printf(buffer, "No info\n");
  108. } else {
  109. furi_string_cat_printf(
  110. buffer,
  111. "%s [%s]\n%s%s [%s] %s\n[%d] %s",
  112. version_get_version(ver),
  113. version_get_builddate(ver),
  114. version_get_dirty_flag(ver) ? "[!] " : "",
  115. version_get_githash(ver),
  116. version_get_gitbranchnum(ver),
  117. c2_ver ? c2_ver->StackTypeString : "<none>",
  118. version_get_target(ver),
  119. version_get_gitbranch(ver));
  120. }
  121. dialog_message_set_header(message, "FW Version Info:", 0, 0, AlignLeft, AlignTop);
  122. dialog_message_set_text(message, furi_string_get_cstr(buffer), 0, 13, AlignLeft, AlignTop);
  123. result = dialog_message_show(dialogs, message);
  124. dialog_message_set_text(message, NULL, 0, 0, AlignLeft, AlignTop);
  125. dialog_message_set_header(message, NULL, 0, 0, AlignLeft, AlignTop);
  126. furi_string_free(buffer);
  127. return result;
  128. }
  129. const AboutDialogScreen about_screens[] = {
  130. product_screen,
  131. compliance_screen,
  132. address_screen,
  133. icon1_screen,
  134. icon2_screen,
  135. hw_version_screen,
  136. fw_version_screen};
  137. const size_t about_screens_count = sizeof(about_screens) / sizeof(AboutDialogScreen);
  138. int32_t about_settings_app(void* p) {
  139. UNUSED(p);
  140. DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
  141. DialogMessage* message = dialog_message_alloc();
  142. Gui* gui = furi_record_open(RECORD_GUI);
  143. ViewDispatcher* view_dispatcher = view_dispatcher_alloc();
  144. EmptyScreen* empty_screen = empty_screen_alloc();
  145. const uint32_t empty_screen_index = 0;
  146. size_t screen_index = 0;
  147. DialogMessageButton screen_result;
  148. // draw empty screen to prevent menu flickering
  149. view_dispatcher_add_view(
  150. view_dispatcher, empty_screen_index, empty_screen_get_view(empty_screen));
  151. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  152. view_dispatcher_switch_to_view(view_dispatcher, empty_screen_index);
  153. while(1) {
  154. if(screen_index >= about_screens_count - 1) {
  155. dialog_message_set_buttons(message, "Back", NULL, NULL);
  156. } else {
  157. dialog_message_set_buttons(message, "Back", NULL, "Next");
  158. }
  159. screen_result = about_screens[screen_index](dialogs, message);
  160. if(screen_result == DialogMessageButtonLeft) {
  161. if(screen_index <= 0) {
  162. break;
  163. } else {
  164. screen_index--;
  165. }
  166. } else if(screen_result == DialogMessageButtonRight) {
  167. if(screen_index < about_screens_count) {
  168. screen_index++;
  169. }
  170. } else if(screen_result == DialogMessageButtonBack) {
  171. break;
  172. }
  173. }
  174. dialog_message_free(message);
  175. furi_record_close(RECORD_DIALOGS);
  176. view_dispatcher_remove_view(view_dispatcher, empty_screen_index);
  177. view_dispatcher_free(view_dispatcher);
  178. empty_screen_free(empty_screen);
  179. furi_record_close(RECORD_GUI);
  180. return 0;
  181. }