esp32cam_marauder.ino 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. /* FLASH SETTINGS
  2. Board: ESP32 Dev Module
  3. Check: https://github.com/eried/flipperzero-mayhem/wiki/Compilation-of-the-firmware#board-settings
  4. */
  5. #include "configs.h"
  6. #ifndef HAS_SCREEN
  7. #define MenuFunctions_h
  8. #define Display_h
  9. #endif
  10. #include <WiFi.h>
  11. //#include "Web.h"
  12. #include "EvilPortal.h"
  13. #include <Wire.h>
  14. #include "esp_wifi.h"
  15. #include "esp_wifi_types.h"
  16. #include <stdio.h>
  17. #include "freertos/FreeRTOS.h"
  18. #include "freertos/task.h"
  19. #include "esp_system.h"
  20. #include <Arduino.h>
  21. #ifdef HAS_GPS
  22. #include "GpsInterface.h"
  23. #endif
  24. #include "FS.h" // SD Card ESP32
  25. #include "SD_MMC.h" // SD Card ESP32
  26. #include "esp_camera.h"
  27. #include "soc/soc.h" // Disable brownout problems
  28. #include "soc/rtc_cntl_reg.h" // Disable brownout problems
  29. #include "driver/rtc_io.h"
  30. // Pin definition for CAMERA_MODEL_AI_THINKER
  31. #define PWDN_GPIO_NUM 32
  32. #define RESET_GPIO_NUM -1
  33. #define XCLK_GPIO_NUM 0
  34. #define SIOD_GPIO_NUM 26
  35. #define SIOC_GPIO_NUM 27
  36. #define Y9_GPIO_NUM 35
  37. #define Y8_GPIO_NUM 34
  38. #define Y7_GPIO_NUM 39
  39. #define Y6_GPIO_NUM 36
  40. #define Y5_GPIO_NUM 21
  41. #define Y4_GPIO_NUM 19
  42. #define Y3_GPIO_NUM 18
  43. #define Y2_GPIO_NUM 5
  44. #define VSYNC_GPIO_NUM 25
  45. #define HREF_GPIO_NUM 23
  46. #define PCLK_GPIO_NUM 22
  47. bool camera_initialized = false;
  48. #include "Assets.h"
  49. #include "WiFiScan.h"
  50. #ifdef HAS_SD
  51. #include "SDInterface.h"
  52. #endif
  53. #include "Buffer.h"
  54. #ifdef MARAUDER_FLIPPER
  55. #include "flipperLED.h"
  56. #elif defined(XIAO_ESP32_S3)
  57. #include "xiaoLED.h"
  58. #else
  59. #include "LedInterface.h"
  60. #endif
  61. //#include "esp_interface.h"
  62. #include "settings.h"
  63. #include "CommandLine.h"
  64. #include "lang_var.h"
  65. #ifdef HAS_BATTERY
  66. #include "BatteryInterface.h"
  67. #endif
  68. //#ifdef HAS_TEMP_SENSOR
  69. // #include "TemperatureInterface.h"
  70. //#endif
  71. #ifdef HAS_SCREEN
  72. #include "Display.h"
  73. #include "MenuFunctions.h"
  74. //#include "a32u4_interface.h"
  75. #endif
  76. #ifdef HAS_BUTTONS
  77. #include <SwitchLib.h>
  78. #if (U_BTN >= 0)
  79. SwitchLib u_btn = SwitchLib(U_BTN, 1000, true);
  80. #endif
  81. #if (D_BTN >= 0)
  82. SwitchLib d_btn = SwitchLib(D_BTN, 1000, true);
  83. #endif
  84. #if (L_BTN >= 0)
  85. SwitchLib l_btn = SwitchLib(L_BTN, 1000, true);
  86. #endif
  87. #if (R_BTN >= 0)
  88. SwitchLib r_btn = SwitchLib(R_BTN, 1000, true);
  89. #endif
  90. #if (C_BTN >= 0)
  91. SwitchLib c_btn = SwitchLib(C_BTN, 1000, true);
  92. #endif
  93. #endif
  94. WiFiScan wifi_scan_obj;
  95. EvilPortal evil_portal_obj;
  96. //Web web_obj;
  97. Buffer buffer_obj;
  98. //EspInterface esp_obj;
  99. Settings settings_obj;
  100. CommandLine cli_obj;
  101. #ifdef HAS_GPS
  102. GpsInterface gps_obj;
  103. #endif
  104. #ifdef HAS_BATTERY
  105. BatteryInterface battery_obj;
  106. #endif
  107. //#ifdef HAS_TEMP_SENSOR
  108. // TemperatureInterface temp_obj;
  109. //#endif
  110. #ifdef HAS_SCREEN
  111. Display display_obj;
  112. MenuFunctions menu_function_obj;
  113. //A32u4Interface a32u4_obj;
  114. #endif
  115. #ifdef HAS_SD
  116. SDInterface sd_obj;
  117. #endif
  118. #ifdef MARAUDER_M5STICKC
  119. AXP192 axp192_obj;
  120. #endif
  121. #ifdef MARAUDER_FLIPPER
  122. flipperLED flipper_led;
  123. #elif defined(XIAO_ESP32_S3)
  124. xiaoLED xiao_led;
  125. #else
  126. LedInterface led_obj;
  127. #endif
  128. const String PROGMEM version_number = MARAUDER_VERSION;
  129. #ifdef HAS_NEOPIXEL_LED
  130. Adafruit_NeoPixel strip = Adafruit_NeoPixel(Pixels, PIN, NEO_GRB + NEO_KHZ800);
  131. #endif
  132. uint32_t currentTime = 0;
  133. void backlightOn() {
  134. #ifdef HAS_SCREEN
  135. #ifdef MARAUDER_MINI
  136. digitalWrite(TFT_BL, LOW);
  137. #endif
  138. #ifndef MARAUDER_MINI
  139. digitalWrite(TFT_BL, HIGH);
  140. #endif
  141. #endif
  142. }
  143. void backlightOff() {
  144. #ifdef HAS_SCREEN
  145. #ifdef MARAUDER_MINI
  146. digitalWrite(TFT_BL, HIGH);
  147. #endif
  148. #ifndef MARAUDER_MINI
  149. digitalWrite(TFT_BL, LOW);
  150. #endif
  151. #endif
  152. }
  153. void setup()
  154. {
  155. #ifdef MARAUDER_M5STICKC
  156. axp192_obj.begin();
  157. #endif
  158. // Start with the flashlight off
  159. pinMode(4, OUTPUT);
  160. digitalWrite(4, LOW);
  161. WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
  162. Serial.begin(230400);
  163. unsigned long waitForStreamMode = millis() + 3000;
  164. while (waitForStreamMode > millis()) {
  165. if (Serial.available()) // if we receive anything, just switch to another mode
  166. {
  167. switch (Serial.read()) {
  168. case 'q': // QR code reader mode
  169. qr_reader_setup();
  170. for (;;)
  171. qr_reader_loop();
  172. case 'm': // Motion detection
  173. motion_detection_setup();
  174. for (;;)
  175. motion_detection_loop();
  176. case 'c': // Camera stream
  177. cam_stream_setup();
  178. for (;;)
  179. cam_stream_loop();
  180. case 'n': // Nanny cam
  181. nanny_cam_setup();
  182. for (;;)
  183. nanny_cam_loop();
  184. case '.': // Morse flasher
  185. morse_setup();
  186. for (;;)
  187. morse_loop();
  188. /*case 'e': // Evil portal
  189. evilportal_setup();
  190. for (;;)
  191. evilportal_loop();*/
  192. case 'w': // Marauder
  193. goto continue_to_marauder;
  194. }
  195. }
  196. }
  197. continue_to_marauder:;
  198. //pinMode(FLASH_BUTTON, INPUT);
  199. #ifdef HAS_SCREEN
  200. pinMode(TFT_BL, OUTPUT);
  201. #endif
  202. backlightOff();
  203. #if BATTERY_ANALOG_ON == 1
  204. pinMode(BATTERY_PIN, OUTPUT);
  205. pinMode(CHARGING_PIN, INPUT);
  206. #endif
  207. // Preset SPI CS pins to avoid bus conflicts
  208. #ifdef HAS_SCREEN
  209. digitalWrite(TFT_CS, HIGH);
  210. #endif
  211. /*#ifdef HAS_SD
  212. pinMode(SD_CS, OUTPUT);
  213. delay(10);
  214. digitalWrite(SD_CS, HIGH);
  215. delay(10);
  216. #endif
  217. Serial.begin(115200);*/
  218. // Starts a second serial channel to stream the captured packets
  219. #ifdef WRITE_PACKETS_SERIAL
  220. #ifdef XIAO_ESP32_S3
  221. Serial1.begin(115200, SERIAL_8N1, XIAO_RX1, XIAO_TX1);
  222. #else
  223. Serial1.begin(115200);
  224. #endif
  225. #endif
  226. //Serial.println("\n\nHello, World!\n");
  227. Serial.println("ESP-IDF version is: " + String(esp_get_idf_version()));
  228. //#ifdef HAS_SCREEN
  229. // Serial.println("Has Screen");
  230. //#else
  231. // Serial.println("Does not have screen");
  232. //#endif
  233. #ifdef HAS_SCREEN
  234. display_obj.RunSetup();
  235. display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
  236. #endif
  237. backlightOff();
  238. // Draw the title screen
  239. #ifdef HAS_SCREEN
  240. #ifndef MARAUDER_MINI
  241. display_obj.drawJpeg("/marauder3L.jpg", 0 , 0); // 240 x 320 image
  242. #else
  243. display_obj.drawJpeg("/marauder3L.jpg", 0, 0);
  244. #endif
  245. #endif
  246. #ifdef HAS_SCREEN
  247. //showCenterText(version_number, 250);
  248. #ifndef MARAUDER_MINI
  249. display_obj.tft.drawCentreString(display_obj.version_number, 120, 250, 2);
  250. #endif
  251. #ifdef MARAUDER_MINI
  252. display_obj.tft.drawCentreString(display_obj.version_number, TFT_WIDTH/2, TFT_HEIGHT, 1);
  253. #endif
  254. #endif
  255. backlightOn(); // Need this
  256. #ifdef HAS_SCREEN
  257. delay(2000);
  258. display_obj.clearScreen();
  259. display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK);
  260. display_obj.tft.println(text_table0[0]);
  261. delay(2000);
  262. display_obj.tft.println("Marauder " + display_obj.version_number + "\n");
  263. display_obj.tft.println(text_table0[1]);
  264. #endif
  265. //Serial.println("Internal Temp: " + (String)((temprature_sens_read() - 32) / 1.8));
  266. settings_obj.begin();
  267. //Serial.println("This is a test Channel: " + (String)settings_obj.loadSetting<uint8_t>("Channel"));
  268. //if (settings_obj.loadSetting<bool>( "Force PMKID"))
  269. // Serial.println("This is a test Force PMKID: true");
  270. //else
  271. // Serial.println("This is a test Force PMKID: false");
  272. wifi_scan_obj.RunSetup();
  273. //Serial.println(wifi_scan_obj.freeRAM());
  274. #ifdef HAS_SCREEN
  275. display_obj.tft.println(F(text_table0[2]));
  276. #endif
  277. #ifdef WRITE_PACKETS_SERIAL
  278. buffer_obj = Buffer();
  279. #elif defined(HAS_SD)
  280. // Do some SD stuff
  281. if(sd_obj.initSD()) {
  282. #ifdef HAS_SCREEN
  283. display_obj.tft.println(F(text_table0[3]));
  284. #endif
  285. } else {
  286. Serial.println(F("SD Card NOT Supported"));
  287. #ifdef HAS_SCREEN
  288. display_obj.tft.setTextColor(TFT_RED, TFT_BLACK);
  289. display_obj.tft.println(F(text_table0[4]));
  290. display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK);
  291. #endif
  292. }
  293. #else
  294. return;
  295. #endif
  296. #ifdef HAS_BATTERY
  297. battery_obj.RunSetup();
  298. #endif
  299. #ifdef HAS_SCREEN
  300. display_obj.tft.println(F(text_table0[5]));
  301. #endif
  302. // Temperature stuff
  303. //#ifdef HAS_TEMP_SENSOR
  304. // temp_obj.RunSetup();
  305. //#endif
  306. #ifdef HAS_SCREEN
  307. display_obj.tft.println(F(text_table0[6]));
  308. #endif
  309. #ifdef HAS_BATTERY
  310. battery_obj.battery_level = battery_obj.getBatteryLevel();
  311. // if (battery_obj.i2c_supported) {
  312. // Serial.println(F("IP5306 I2C Supported: true"));
  313. // }
  314. // else
  315. // Serial.println(F("IP5306 I2C Supported: false"));
  316. #endif
  317. // Do some LED stuff
  318. #ifdef MARAUDER_FLIPPER
  319. flipper_led.RunSetup();
  320. #elif defined(XIAO_ESP32_S3)
  321. xiao_led.RunSetup();
  322. #else
  323. led_obj.RunSetup();
  324. #endif
  325. #ifdef HAS_SCREEN
  326. display_obj.tft.println(F(text_table0[7]));
  327. delay(500);
  328. #endif
  329. #ifdef HAS_GPS
  330. gps_obj.begin();
  331. #ifdef HAS_SCREEN
  332. if (gps_obj.getGpsModuleStatus())
  333. display_obj.tft.println("GPS Module connected");
  334. else
  335. display_obj.tft.println("GPS Module NOT connected");
  336. #endif
  337. #endif
  338. #ifdef HAS_SCREEN
  339. display_obj.tft.println(F(text_table0[8]));
  340. display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
  341. delay(2000);
  342. #endif
  343. #ifdef HAS_SCREEN
  344. menu_function_obj.RunSetup();
  345. #endif
  346. //Serial.println(F("\n\n--------------------------------\n"));
  347. //Serial.println(F(" ESP32 Marauder \n"));
  348. //Serial.println(" " + version_number + "\n");
  349. //Serial.println(F(" By: justcallmekoko\n"));
  350. //Serial.println(F("--------------------------------\n\n"));
  351. Serial.println(F("CLI Ready"));
  352. cli_obj.RunSetup();
  353. }
  354. void loop()
  355. {
  356. currentTime = millis();
  357. bool mini = false;
  358. #ifdef MARAUDER_MINI
  359. mini = true;
  360. #endif
  361. // Update all of our objects
  362. /*#ifdef HAS_SCREEN
  363. bool do_draw = display_obj.draw_tft;
  364. #else
  365. bool do_draw = false;
  366. #endif*/
  367. //if ((!do_draw) && (wifi_scan_obj.currentScanMode != ESP_UPDATE))
  368. //{
  369. cli_obj.main(currentTime);
  370. #ifdef HAS_SCREEN
  371. display_obj.main(wifi_scan_obj.currentScanMode);
  372. #endif
  373. wifi_scan_obj.main(currentTime);
  374. //evil_portal_obj.main(wifi_scan_obj.currentScanMode);
  375. #ifdef HAS_GPS
  376. gps_obj.main();
  377. #endif
  378. #ifdef WRITE_PACKETS_SERIAL
  379. buffer_obj.forceSaveSerial();
  380. #elif defined(HAS_SD)
  381. sd_obj.main();
  382. #else
  383. return;
  384. #endif
  385. #ifdef HAS_BATTERY
  386. battery_obj.main(currentTime);
  387. //temp_obj.main(currentTime);
  388. #endif
  389. settings_obj.main(currentTime);
  390. if (((wifi_scan_obj.currentScanMode != WIFI_PACKET_MONITOR) && (wifi_scan_obj.currentScanMode != WIFI_SCAN_EAPOL)) ||
  391. (mini)) {
  392. #ifdef HAS_SCREEN
  393. menu_function_obj.main(currentTime);
  394. #endif
  395. //cli_obj.main(currentTime);
  396. }
  397. #ifdef MARAUDER_FLIPPER
  398. flipper_led.main();
  399. #elif defined(XIAO_ESP32_S3)
  400. xiao_led.main();
  401. #else
  402. led_obj.main(currentTime);
  403. #endif
  404. //if (wifi_scan_obj.currentScanMode == OTA_UPDATE)
  405. // web_obj.main();
  406. #ifdef HAS_SCREEN
  407. delay(1);
  408. #else
  409. delay(50);
  410. #endif
  411. //}
  412. /*else if (wifi_scan_obj.currentScanMode == ESP_UPDATE) {
  413. #ifdef HAS_SCREEN
  414. display_obj.main(wifi_scan_obj.currentScanMode);
  415. menu_function_obj.main(currentTime);
  416. #endif
  417. #ifdef MARAUDER_FLIPPER
  418. flipper_led.main();
  419. #elif defined(XIAO_ESP32_S3)
  420. xiao_led.main();
  421. #else
  422. led_obj.main(currentTime);
  423. #endif
  424. //cli_obj.main(currentTime);
  425. delay(1);
  426. }*/
  427. }