flip_store_firmwares.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include <firmwares/flip_store_firmwares.h>
  2. Firmware *firmwares = NULL;
  3. VGMFirmware *vgm_firmwares = NULL;
  4. bool is_esp32_firmware = true;
  5. Firmware *firmware_alloc()
  6. {
  7. Firmware *fw = (Firmware *)malloc(FIRMWARE_COUNT * sizeof(Firmware));
  8. if (!fw)
  9. {
  10. FURI_LOG_E(TAG, "Failed to allocate memory for Firmware");
  11. return NULL;
  12. }
  13. // Black Magic
  14. snprintf(fw[0].name, sizeof(fw[0].name), "%s", "Black Magic");
  15. snprintf(fw[0].links[0], sizeof(fw[0].links[0]), "%s", "https://raw.githubusercontent.com/FZEEFlasher/fzeeflasher.github.io/main/resources/STATIC/BM/bootloader.bin");
  16. snprintf(fw[0].links[1], sizeof(fw[0].links[1]), "%s", "https://raw.githubusercontent.com/FZEEFlasher/fzeeflasher.github.io/main/resources/STATIC/BM/partition-table.bin");
  17. snprintf(fw[0].links[2], sizeof(fw[0].links[2]), "%s", "https://raw.githubusercontent.com/FZEEFlasher/fzeeflasher.github.io/main/resources/STATIC/BM/blackmagic.bin");
  18. // FlipperHTTP
  19. snprintf(fw[1].name, sizeof(fw[1].name), "%s", "FlipperHTTP");
  20. snprintf(fw[1].links[0], sizeof(fw[1].links[0]), "%s", "https://raw.githubusercontent.com/jblanked/FlipperHTTP/main/WiFi%20Developer%20Board%20(ESP32S2)/flipper_http_bootloader.bin");
  21. snprintf(fw[1].links[1], sizeof(fw[1].links[1]), "%s", "https://raw.githubusercontent.com/jblanked/FlipperHTTP/main/WiFi%20Developer%20Board%20(ESP32S2)/flipper_http_firmware_a.bin");
  22. snprintf(fw[1].links[2], sizeof(fw[1].links[2]), "%s", "https://raw.githubusercontent.com/jblanked/FlipperHTTP/main/WiFi%20Developer%20Board%20(ESP32S2)/flipper_http_partitions.bin");
  23. // Marauder (this changes too often.. we need a static link for the third one. maybe I'll fork the repo and host it myself)
  24. snprintf(fw[2].name, sizeof(fw[2].name), "%s", "Marauder");
  25. snprintf(fw[2].links[0], sizeof(fw[2].links[0]), "%s", "https://raw.githubusercontent.com/FZEEFlasher/fzeeflasher.github.io/main/resources/STATIC/M/FLIPDEV/esp32_marauder.ino.bootloader.bin");
  26. snprintf(fw[2].links[1], sizeof(fw[2].links[1]), "%s", "https://raw.githubusercontent.com/FZEEFlasher/fzeeflasher.github.io/main/resources/STATIC/M/FLIPDEV/esp32_marauder.ino.partitions.bin");
  27. snprintf(fw[2].links[2], sizeof(fw[2].links[2]), "%s", "https://raw.githubusercontent.com/jblanked/fzeeflasher.github.io/main/resources/CURRENT/esp32_marauder_v1_4_1_20250406_flipper.bin");
  28. return fw;
  29. }
  30. VGMFirmware *vgm_firmware_alloc()
  31. {
  32. VGMFirmware *fw = (VGMFirmware *)malloc(VGM_FIRMWARE_COUNT * sizeof(VGMFirmware));
  33. if (!fw)
  34. {
  35. FURI_LOG_E(TAG, "Failed to allocate memory for VGM Firmware");
  36. return NULL;
  37. }
  38. // FlipperHTTP
  39. snprintf(fw[0].name, sizeof(fw[0].name), "%s", "FlipperHTTP");
  40. snprintf(fw[0].link, sizeof(fw[0].link), "%s", "https://raw.githubusercontent.com/jblanked/FlipperHTTP/main/Video%20Game%20Module/MicroPython/flipper_http_vgm_micro_python.uf2");
  41. /* VGM Library specs
  42. Screensavers: https://github.com/jblanked/VGM-Library/tree/main/Screensavers
  43. - aquarium.uf2
  44. - boing_ball.uf2
  45. - bouncing_balls.uf2
  46. - dvi_logo_bounce.uf2
  47. - flying_toasters.uf2
  48. - trippy_tvhost.uf2
  49. Games: https://github.com/jblanked/VGM-Library/tree/main/engine/Arduino
  50. - AirLabyrinth-VGM-Engine.uf2
  51. - Arkanoid-VGM-Engine.uf2
  52. - Doom-VGM-Engine.uf2
  53. - Doom_8bit-VGM-Engine.uf2
  54. - FlappyBird-VGM-Engine.uf2
  55. - FlightAssault-VGM-Engine.uf2
  56. - FlipWorld-VGM-Engine.uf2
  57. - FuriousBirds-VGM-Engine.uf2
  58. - Hawaii-VGM-Engine.uf2
  59. - Pong-VGM-Engine.uf2
  60. - T-Rex-Runner-VGM-Engine.uf2
  61. - Tetris-VGM-Engine.uf2
  62. - example_8bit-VGM-Engine.uf2
  63. */
  64. // VGM Library
  65. snprintf(fw[1].name, sizeof(fw[1].name), "%s", "Aquarium - Screensaver");
  66. snprintf(fw[1].link, sizeof(fw[1].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/aquarium.uf2");
  67. //
  68. snprintf(fw[2].name, sizeof(fw[2].name), "%s", "Boing Ball - Screensaver");
  69. snprintf(fw[2].link, sizeof(fw[2].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/boing_ball.uf2");
  70. //
  71. snprintf(fw[3].name, sizeof(fw[3].name), "%s", "Bouncing Balls - Screensaver");
  72. snprintf(fw[3].link, sizeof(fw[3].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/bouncing_balls.uf2");
  73. //
  74. snprintf(fw[4].name, sizeof(fw[4].name), "%s", "DVI Logo Bounce - Screensaver");
  75. snprintf(fw[4].link, sizeof(fw[4].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/dvi_logo_bounce.uf2");
  76. //
  77. snprintf(fw[5].name, sizeof(fw[5].name), "%s", "Flying Toasters - Screensaver");
  78. snprintf(fw[5].link, sizeof(fw[5].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/flying_toasters.uf2");
  79. //
  80. snprintf(fw[6].name, sizeof(fw[6].name), "%s", "Trippy TV Host - Screensaver");
  81. snprintf(fw[6].link, sizeof(fw[6].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/Screensavers/trippy_tvhost.uf2");
  82. //
  83. snprintf(fw[7].name, sizeof(fw[7].name), "%s", "Air Labyrinth - Game");
  84. snprintf(fw[7].link, sizeof(fw[7].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/AirLabyrinth-VGM-Engine.uf2");
  85. //
  86. snprintf(fw[8].name, sizeof(fw[8].name), "%s", "Arkanoid - Game");
  87. snprintf(fw[8].link, sizeof(fw[8].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Arkanoid-VGM-Engine.uf2");
  88. //
  89. snprintf(fw[9].name, sizeof(fw[9].name), "%s", "Doom - Game");
  90. snprintf(fw[9].link, sizeof(fw[9].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Doom-VGM-Engine.uf2");
  91. //
  92. snprintf(fw[10].name, sizeof(fw[10].name), "%s", "Doom 8bit - Game");
  93. snprintf(fw[10].link, sizeof(fw[10].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Doom_8bit-VGM-Engine.uf2");
  94. //
  95. snprintf(fw[11].name, sizeof(fw[11].name), "%s", "Flappy Bird - Game");
  96. snprintf(fw[11].link, sizeof(fw[11].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/FlappyBird-VGM-Engine.uf2");
  97. //
  98. snprintf(fw[12].name, sizeof(fw[12].name), "%s", "Flight Assault - Game");
  99. snprintf(fw[12].link, sizeof(fw[12].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/FlightAssault-VGM-Engine.uf2");
  100. //
  101. snprintf(fw[13].name, sizeof(fw[13].name), "%s", "Flip World - Game");
  102. snprintf(fw[13].link, sizeof(fw[13].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/FlipWorld-VGM-Engine.uf2");
  103. //
  104. snprintf(fw[14].name, sizeof(fw[14].name), "%s", "Furious Birds - Game");
  105. snprintf(fw[14].link, sizeof(fw[14].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/FuriousBirds-VGM-Engine.uf2");
  106. //
  107. snprintf(fw[15].name, sizeof(fw[15].name), "%s", "Hawaii - Game");
  108. snprintf(fw[15].link, sizeof(fw[15].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Hawaii-VGM-Engine.uf2");
  109. //
  110. snprintf(fw[16].name, sizeof(fw[16].name), "%s", "Pong - Game");
  111. snprintf(fw[16].link, sizeof(fw[16].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Pong-VGM-Engine.uf2");
  112. //
  113. snprintf(fw[17].name, sizeof(fw[17].name), "%s", "T-Rex Runner - Game");
  114. snprintf(fw[17].link, sizeof(fw[17].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/T-Rex-Runner-VGM-Engine.uf2");
  115. //
  116. snprintf(fw[18].name, sizeof(fw[18].name), "%s", "Tetris - Game");
  117. snprintf(fw[18].link, sizeof(fw[18].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/Tetris-VGM-Engine.uf2");
  118. //
  119. snprintf(fw[19].name, sizeof(fw[19].name), "%s", "Example 8bit - Game");
  120. snprintf(fw[19].link, sizeof(fw[19].link), "%s", "https://raw.githubusercontent.com/jblanked/VGM-Library/main/engine/Arduino/example_8bit-VGM-Engine.uf2");
  121. return fw;
  122. }
  123. void firmware_free()
  124. {
  125. if (firmwares)
  126. {
  127. free(firmwares);
  128. firmwares = NULL;
  129. }
  130. }
  131. void vgm_firmware_free()
  132. {
  133. if (vgm_firmwares)
  134. {
  135. free(vgm_firmwares);
  136. vgm_firmwares = NULL;
  137. }
  138. }
  139. bool flip_store_get_firmware_file(FlipperHTTP *fhttp, char *link, char *name, char *filename)
  140. {
  141. if (!fhttp)
  142. {
  143. FURI_LOG_E(TAG, "FlipperHTTP is NULL");
  144. return false;
  145. }
  146. if (fhttp->state == INACTIVE)
  147. {
  148. return false;
  149. }
  150. Storage *storage = furi_record_open(RECORD_STORAGE);
  151. char directory_path[64];
  152. // save in ESP32 flasher directory
  153. if (is_esp32_firmware)
  154. {
  155. snprintf(directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/esp_flasher");
  156. storage_common_mkdir(storage, directory_path);
  157. snprintf(directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/esp_flasher/%s", firmwares[selected_firmware_index].name);
  158. storage_common_mkdir(storage, directory_path);
  159. snprintf(fhttp->file_path, sizeof(fhttp->file_path), STORAGE_EXT_PATH_PREFIX "/apps_data/esp_flasher/%s/%s", name, filename);
  160. }
  161. else // install in app_data directory
  162. {
  163. snprintf(directory_path, sizeof(directory_path), STORAGE_EXT_PATH_PREFIX "/apps_data/vgm");
  164. storage_common_mkdir(storage, directory_path);
  165. snprintf(fhttp->file_path, sizeof(fhttp->file_path), STORAGE_EXT_PATH_PREFIX "/apps_data/vgm/%s", filename);
  166. }
  167. furi_record_close(RECORD_STORAGE);
  168. fhttp->save_received_data = false;
  169. fhttp->is_bytes_request = true;
  170. // return flipper_http_get_request_bytes(fhttp, link, "{\"Content-Type\":\"application/octet-stream\"}");
  171. return flipper_http_request(fhttp, BYTES, link, "{\"Content-Type\":\"application/octet-stream\"}", NULL);
  172. }