Compare commits

...

315 Commits

Author SHA1 Message Date
Just Call Me Koko
1624d98183 Fix menu navigation for back button 2025-12-04 18:12:28 -05:00
Just Call Me Koko
9681076542 Update C5 FBQN 2025-12-02 01:00:16 -05:00
Just Call Me Koko
86d35cba6a Update NimBLE version in actions 2025-12-02 00:49:20 -05:00
Just Call Me Koko
fb2b33d538 Maybe I should learn something 2025-12-02 00:09:43 -05:00
Just Call Me Koko
5e47927969 Update arduino esp32 2025-12-02 00:02:34 -05:00
Just Call Me Koko
d7d2b28f9e Add 5ghz channels for c5 packet injection 2025-12-01 18:37:43 -05:00
Just Call Me Koko
5d188bfa62 Merge pull request #995 from justcallmekoko/NimBLE-2.0
Add Bluetooth to C5 hardware
2025-12-01 01:37:32 -05:00
Just Call Me Koko
576601fd21 Fix non-UI hardware 2025-11-30 22:38:47 -05:00
Just Call Me Koko
dc2dd414eb Clean up dead code 2025-11-30 22:03:34 -05:00
Just Call Me Koko
5439fc7ceb Fix flock sniffer 2025-11-29 04:18:35 -05:00
Just Call Me Koko
84416970e7 Remove LVGL completely 2025-11-27 03:08:04 -05:00
Just Call Me Koko
ba67c63010 Add wifi filter for flock 2025-11-26 23:59:15 -05:00
Just Call Me Koko
e4458ad1e6 Add TFT_eSPI keyboard 2025-11-26 20:22:44 -05:00
Just Call Me Koko
6c996a489f Remove unused LVGL code 2025-11-26 18:02:19 -05:00
Just Call Me Koko
d3ce284ea4 Save more flash space 2025-11-26 00:26:03 -05:00
Just Call Me Koko
eab60701d5 Clean up callback methods 2025-11-25 19:12:36 -05:00
Just Call Me Koko
30893adaa5 Bring bluetooth to ESP32-C5 2025-11-25 17:46:14 -05:00
Just Call Me Koko
2c0868e893 Start NimBLE Migration 2025-11-25 01:26:24 -05:00
Just Call Me Koko
0fba6966a6 Fix for non bluetooth hardware 2025-11-24 13:20:01 -05:00
Just Call Me Koko
b714f274b5 Add Flock wardriving 2025-11-24 13:07:20 -05:00
Just Call Me Koko
e5c6c6906e Merge pull request #989 from H4W9/MAC_CLI_Command
Add MAC Address CLI commands
2025-11-24 11:59:34 -05:00
H4W9
ccf7cd1493 Update CommandLine.cpp
Seriously, gotta filter em...
2025-11-24 07:49:14 -06:00
H4W9
a1ff26a9d2 Update CommandLine.cpp
Add the command actions
2025-11-24 01:44:30 -06:00
H4W9
57f867a8ec Update CommandLine.h
correction
2025-11-23 22:56:02 -06:00
H4W9
c901ade02c Update CommandLine.h
Finished what I started...
2025-11-23 19:18:23 -06:00
H4W9
aee56f879f Update CommandLine.cpp
more
2025-11-23 19:16:04 -06:00
H4W9
0535646ba8 Update CommandLine.h
Add MAC cli commands
2025-11-23 18:55:32 -06:00
Just Call Me Koko
cd3ab51080 Add flock command and icon 2025-11-23 07:41:31 -05:00
Just Call Me Koko
b6d1ce7a37 Compensate for NimBLE memory leak 2025-11-23 07:03:34 -05:00
Just Call Me Koko
9d51b91ad3 Merge pull request #986 from justcallmekoko/develop
Fix flock scan memory leak
2025-11-22 17:05:00 -05:00
Just Call Me Koko
018bddae6a Fix flock scan memory leak 2025-11-22 16:58:55 -05:00
Just Call Me Koko
b014332169 Merge pull request #985 from justcallmekoko/develop
Add Flock penguin battery scanner
2025-11-22 11:27:35 -05:00
Just Call Me Koko
5079a05458 Fix for non BT device 2025-11-22 11:10:45 -05:00
Just Call Me Koko
c002aee646 Add Flock Penguin battery scanner 2025-11-22 11:04:05 -05:00
Just Call Me Koko
5afcb9da61 Move tag name to new step 2025-11-13 09:50:44 -05:00
Just Call Me Koko
a874375fb0 Merge pull request #975 from justcallmekoko/develop
pee pee poo poo
2025-11-11 00:40:20 -05:00
Just Call Me Koko
22f4dc66ec pee pee poo poo 2025-11-11 00:37:58 -05:00
Just Call Me Koko
31baacac3e Merge pull request #974 from justcallmekoko/develop
I guess this
2025-11-10 21:47:35 -05:00
Just Call Me Koko
601aee9b8a I guess this 2025-11-10 21:42:58 -05:00
Just Call Me Koko
93ac8b3cde Merge pull request #972 from justcallmekoko/develop
Final graph scale check before display
2025-11-07 09:34:45 -05:00
Just Call Me Koko
08d1682ae4 Final graph scale check before display 2025-11-06 12:34:44 -05:00
Just Call Me Koko
1343c91064 Merge pull request #970 from justcallmekoko/develop
Adjust UI of channel summary graph
2025-11-04 19:27:31 -05:00
Just Call Me Koko
7f741d75fb Adjust UI of channel summary graph 2025-11-04 16:08:17 -05:00
Just Call Me Koko
de2a916ad6 Merge pull request #969 from justcallmekoko/develop
Fix channel summary graph for Mini
2025-11-04 10:35:45 -05:00
Just Call Me Koko
5a928a7ae8 Don't create release notes for nightly builds 2025-11-04 10:23:05 -05:00
Just Call Me Koko
b5bb65f76b Fix mini channel summary graph 2025-11-03 22:09:05 -05:00
Just Call Me Koko
09b519d0a2 Fix channel summary for button hardware 2025-11-03 21:52:18 -05:00
Just Call Me Koko
3fc18d642b Merge pull request #968 from justcallmekoko/develop
Add channel summary graph
2025-11-03 21:09:58 -05:00
Just Call Me Koko
7460b40543 Fix CYD GPS pins 2025-11-03 21:05:57 -05:00
Just Call Me Koko
0b6dc40fa6 Add channel summary frontend 2025-11-03 00:36:54 -05:00
Just Call Me Koko
6331e43db1 add channel summary backend 2025-11-02 20:25:26 -05:00
Just Call Me Koko
9819a6ba1b Merge pull request #962 from justcallmekoko/develop
Add last seen to airtag monitor
2025-10-30 14:15:57 -04:00
Just Call Me Koko
f170caa9d2 Add last seen to airtag monitor 2025-10-30 13:59:16 -04:00
Just Call Me Koko
3838296173 Merge pull request #961 from justcallmekoko/develop
Adjust regular and nightly build output
2025-10-30 13:00:11 -04:00
Just Call Me Koko
8526e49189 Hahaha funny 2025-10-30 12:56:27 -04:00
Just Call Me Koko
a3aff9afd6 Add version dot to build parallel 2025-10-30 12:48:20 -04:00
Just Call Me Koko
50033af120 Merge pull request #960 from justcallmekoko/master
Update Develop
2025-10-29 17:00:49 -04:00
Just Call Me Koko
2ccb8675dc Merge pull request #959 from justcallmekoko/develop
Add airtag monitor
2025-10-29 16:44:49 -04:00
Just Call Me Koko
05eb6d74a5 Add airtag monitor 2025-10-29 15:32:07 -04:00
Just Call Me Koko
c06e104485 Merge pull request #956 from justcallmekoko/develop
Select bin file from list for updating firmware
2025-10-27 15:05:31 -04:00
Just Call Me Koko
0a8d9d2d41 Allow select bin file for firmware update 2025-10-27 14:56:32 -04:00
Just Call Me Koko
ab9870219a Merge pull request #955 from justcallmekoko/master
Update Develop
2025-10-27 12:56:29 -04:00
Just Call Me Koko
941532eba0 Merge pull request #954 from justcallmekoko/develop
Develop
2025-10-27 12:36:26 -04:00
Just Call Me Koko
c515873fd5 Merge pull request #951 from H4W9/H4W9-GPS-Option-Fix
H4W9 gps option fix
2025-10-27 12:21:27 -04:00
Just Call Me Koko
1bf0b0e2c1 Merge pull request #953 from justcallmekoko/develop
Fix station select back button
2025-10-27 12:01:52 -04:00
Just Call Me Koko
9ea5fbc3eb Fix station menu back button 2025-10-27 11:43:46 -04:00
H4W9
0e8e698254 Update configs.h (RevertDumbCommit)
Revert my dumb commit
2025-10-26 12:18:24 -05:00
H4W9
630687359d Update MenuFunctions.cpp
Fix GPS option showing up on Main Menu when GPS Chip is not available.
2025-10-26 11:51:06 -05:00
Just Call Me Koko
5070b9785d Consolidate display init method 2025-10-25 02:45:09 -04:00
H4W9
b0c8dd5cb4 Update configs.h 2025-10-24 11:24:08 -05:00
Just Call Me Koko
5fa046b599 Merge pull request #947 from justcallmekoko/develop
Slow down dual band channel hopping
2025-10-17 11:18:05 -04:00
Just Call Me Koko
48164bc4ec Hahaha double silly 2025-10-17 10:56:01 -04:00
Just Call Me Koko
68085fc6a7 Haha silly 2025-10-17 10:49:48 -04:00
Just Call Me Koko
0f62303018 Consolidate touch calibration data 2025-10-17 10:40:00 -04:00
Just Call Me Koko
dc7992d040 Update MenuFunctions.cpp 2025-10-14 11:48:29 -04:00
Just Call Me Koko
0764625eb1 Adjust dual band channel hop time 2025-10-10 15:49:22 -04:00
Just Call Me Koko
748afc99e8 Merge pull request #942 from justcallmekoko/master
Update Develop
2025-10-10 11:27:32 -04:00
Just Call Me Koko
c4e78293a6 Merge pull request #941 from justcallmekoko/develop
Adjust EAPOL sniff filter parameters
2025-10-10 11:12:39 -04:00
Just Call Me Koko
74cd774718 Adjust eapol monitor UI 2025-10-10 10:53:27 -04:00
Just Call Me Koko
feaae672da Refactor EAPOL sniff filtering 2025-10-09 15:39:08 -04:00
Just Call Me Koko
ba9ec4023e Remove channel hop from targeted eapol 2025-10-09 11:12:40 -04:00
Just Call Me Koko
7045ce9380 Fix caldata for landscape 2025-10-07 13:21:32 -04:00
Just Call Me Koko
69a7d9b24f Merge pull request #939 from justcallmekoko/master
Update Develop
2025-10-07 12:34:21 -04:00
Just Call Me Koko
11f2cec1fd Merge pull request #938 from justcallmekoko/develop
Update Adafruit NeoPixel library version
2025-10-07 12:27:53 -04:00
Just Call Me Koko
828d0b1760 Update neopixel version for C5 2025-10-07 12:12:58 -04:00
Just Call Me Koko
fc903cc66b Adjust board definition 2025-10-07 10:26:09 -04:00
Just Call Me Koko
e3d3d8276c Merge pull request #937 from justcallmekoko/develop
Clean up menu transition for Minis
2025-10-06 14:58:11 -04:00
Just Call Me Koko
72951397d8 Clean menu transition for minis 2025-10-06 14:47:10 -04:00
Just Call Me Koko
e5f2466c41 Merge pull request #936 from justcallmekoko/master
Update Develop
2025-10-06 12:07:54 -04:00
Just Call Me Koko
d70d141662 Merge pull request #935 from justcallmekoko/develop
Fix status bar formatting
2025-10-06 11:34:14 -04:00
Just Call Me Koko
4bd3a1d4b1 Fix status bar formatting 2025-10-06 11:29:38 -04:00
Just Call Me Koko
510e5692b0 Merge pull request #934 from justcallmekoko/develop
Delete old nightly assets
2025-10-05 11:07:01 -04:00
Just Call Me Koko
4b5339bf89 Delete old nightly assets 2025-10-05 11:04:32 -04:00
Just Call Me Koko
2efcb63d19 Merge pull request #933 from justcallmekoko/develop
Add support for CYD 3.5inch
2025-10-03 15:50:29 -04:00
Just Call Me Koko
871fc356c6 Add build for CYD 3.5inch 2025-10-03 15:42:48 -04:00
Just Call Me Koko
0e1a289678 Fix display formatting for 3.5inch 2025-10-03 15:39:30 -04:00
Just Call Me Koko
a1f4c9dc28 Add support for CYD 3.5inch 2025-10-03 14:57:56 -04:00
Just Call Me Koko
762f6f7ec9 Merge pull request #932 from justcallmekoko/develop
Fix nightly workflow conditions
2025-10-03 10:11:01 -04:00
Just Call Me Koko
ffcb2585d5 Double oopsie 2025-10-03 10:06:46 -04:00
Just Call Me Koko
b2cd8efe38 Merge pull request #931 from justcallmekoko/develop
Oopsie
2025-10-03 10:00:17 -04:00
Just Call Me Koko
174885dff5 Oopsie 2025-10-03 09:57:14 -04:00
Just Call Me Koko
8e523ed237 Merge pull request #930 from justcallmekoko/develop
Update nightly build criteria
2025-10-03 09:49:31 -04:00
Just Call Me Koko
faf1bbb620 Change nightly build criteria 2025-10-03 09:47:26 -04:00
Just Call Me Koko
71c0d2e616 Merge pull request #929 from justcallmekoko/master
Update Develop
2025-10-02 11:57:44 -04:00
Just Call Me Koko
3e09d2d816 Merge pull request #928 from justcallmekoko/develop
Add softAP to wifi general
2025-10-02 11:50:14 -04:00
Just Call Me Koko
3ce7d45341 Fix menu navigation for AP start 2025-10-02 11:45:45 -04:00
Just Call Me Koko
e86f16934e softAP feature from #876 2025-10-02 10:42:28 -04:00
Just Call Me Koko
4042e9d43b Merge pull request #926 from justcallmekoko/develop
Oops is boolean
2025-09-30 12:22:20 -04:00
Just Call Me Koko
8a0817e547 Oops is boolean 2025-09-30 12:21:20 -04:00
Just Call Me Koko
02febc63c6 Merge pull request #925 from justcallmekoko/develop
Fix release naming convention for nightly
2025-09-30 12:05:37 -04:00
Just Call Me Koko
969a2fff30 Update release naming convention 2025-09-30 12:04:43 -04:00
Just Call Me Koko
8831927580 Merge pull request #924 from justcallmekoko/master
Update Develop
2025-09-30 11:46:36 -04:00
Just Call Me Koko
72ed6de7dc Merge pull request #923 from justcallmekoko/develop
Adjust naming and release message body
2025-09-30 11:32:36 -04:00
Just Call Me Koko
ad4b660dd4 Adjust naming and release message body 2025-09-30 11:31:56 -04:00
Just Call Me Koko
f25e2b90d5 Merge pull request #922 from justcallmekoko/develop
Create nightly build workflow
2025-09-30 11:19:23 -04:00
Just Call Me Koko
c44be1ecdc Do not trigger on push and pull 2025-09-30 11:12:13 -04:00
Just Call Me Koko
d74a22b297 Create nightly build workflow 2025-09-30 11:08:23 -04:00
Just Call Me Koko
79cbd91b60 Merge pull request #921 from justcallmekoko/develop
Improve signal monitor UI
2025-09-29 15:37:11 -04:00
Just Call Me Koko
7448c266e4 Fix non display hardware 2025-09-29 15:21:39 -04:00
Just Call Me Koko
5088e0bfb4 Improve signal monitor UI 2025-09-29 15:16:06 -04:00
Just Call Me Koko
08517d7587 Get that crap out of here 2025-09-29 13:57:53 -04:00
Just Call Me Koko
d1ad247dd3 Add AXP2102 for cardputer 2025-09-24 18:34:18 -04:00
Just Call Me Koko
71cd5859f4 Merge pull request #917 from justcallmekoko/develop
Fix ESP32-C5 event loop errors and Evil Portal
2025-09-24 17:03:25 -04:00
Just Call Me Koko
24f3e18b69 Update ESPAsyncWebServer version 2025-09-24 16:19:06 -04:00
Just Call Me Koko
74f09ee86f Fix ESP32-C5 event loop errors 2025-09-24 13:40:18 -04:00
Just Call Me Koko
20242245ab Merge pull request #914 from justcallmekoko/develop
Add CLI commands for GPS POI and new port scans
2025-09-23 11:43:27 -04:00
Just Call Me Koko
e8f0c1317e Fix for non display 2025-09-23 11:30:28 -04:00
Just Call Me Koko
d52b2922e6 and GPS POI and port scan commands 2025-09-23 10:37:40 -04:00
Just Call Me Koko
ecfdcd3bdc Merge pull request #913 from justcallmekoko/develop
Develop
2025-09-21 19:16:55 -04:00
Just Call Me Koko
8e54de7b2d Merge pull request #884 from H4W9/Funny-Beacon-Spam
Funny SSID Beacon Spam Attack
2025-09-21 18:25:01 -04:00
H4W9
77f3fa7025 Update WiFiScan.h 2025-09-16 19:14:23 -05:00
H4W9
b86929256f Merge branch 'justcallmekoko:master' into Funny-Beacon-Spam 2025-09-16 18:47:50 -05:00
H4W9
16d0101ce6 Update WiFiScan.h 2025-09-16 18:47:23 -05:00
Just Call Me Koko
e3668645e3 Merge pull request #908 from justcallmekoko/develop
Add new port scan presets and improve SD delete menu
2025-09-15 13:58:15 -04:00
Just Call Me Koko
ea0be07c91 Improve SD delete menu 2025-09-12 11:35:52 -04:00
Just Call Me Koko
e4d483d736 Enable new port scans 2025-09-11 11:18:21 -04:00
Just Call Me Koko
c2aba77cc0 Add more port scanners 2025-09-11 10:57:41 -04:00
Just Call Me Koko
78b73f4ca2 Merge pull request #898 from justcallmekoko/develop
Update stale threshold
2025-09-04 10:15:59 -04:00
Just Call Me Koko
ef4ec4edad Update stale threshold 2025-09-04 10:06:45 -04:00
Just Call Me Koko
c6daeb5517 Merge pull request #897 from justcallmekoko/develop
Adjust operations per run
2025-09-04 10:01:25 -04:00
Just Call Me Koko
dcd493d474 Adjust operations per run 2025-09-04 10:00:47 -04:00
Just Call Me Koko
68bd55b162 Merge pull request #896 from justcallmekoko/develop
Add stale issue workflow
2025-09-04 09:50:58 -04:00
Just Call Me Koko
90db402b6b Add stale issue workflow 2025-09-04 09:50:09 -04:00
Just Call Me Koko
e064c3beed Merge pull request #894 from justcallmekoko/develop
Adjust GPS POI log format
2025-09-03 14:58:00 -04:00
Just Call Me Koko
18d71769da Adjust GPS POI log format 2025-09-03 13:57:00 -04:00
Just Call Me Koko
a259cbcc6d Merge pull request #893 from justcallmekoko/develop
L/R buttons change channel on menu
2025-09-03 13:44:35 -04:00
Just Call Me Koko
482f4114e0 L/R buttons change channel on menu 2025-09-03 13:32:47 -04:00
Just Call Me Koko
a917ff2211 Merge pull request #892 from justcallmekoko/develop
Enable LED for C5 DevKit
2025-09-03 12:30:59 -04:00
Just Call Me Koko
92e1795ce5 Put H4W9 stuff back 2025-09-03 12:10:03 -04:00
Just Call Me Koko
605086ea59 Enable LED for C5 2025-09-03 12:03:58 -04:00
Just Call Me Koko
554d358cba Merge pull request #891 from justcallmekoko/develop
GPS Menu
2025-09-02 19:33:03 -04:00
H4W9
614c7099f9 Update README.md
Fix my goof-up... I had accidentally removed the Marauder Logo
2025-08-26 12:44:45 -05:00
Just Call Me Koko
d131491bbf Add updated bin for C5 2025-08-26 10:42:05 -04:00
Just Call Me Koko
dcf3b13552 Merge pull request #882 from H4W9/H4W9_patch-2
Add GPS to Main Menu
2025-08-26 07:31:53 -07:00
H4W9
4b6cb6582d Update MenuFunctions.cpp 2025-08-22 19:28:40 -05:00
H4W9
7a41d4be14 Merge branch 'H4W9_GPSMenu_FunnySpam' into Funny-Beacon-Spam 2025-08-21 11:33:45 -05:00
H4W9
2d195ea697 Update lang_var.h 2025-08-21 11:28:05 -05:00
H4W9
b1c256036f Update WiFiScan.cpp 2025-08-21 11:26:44 -05:00
H4W9
ac3e4ab427 Update MenuFunctions.cpp 2025-08-21 11:26:09 -05:00
H4W9
3ca777e711 Merge pull request #1 from H4W9/H4W9_patch-2
H4 w9 patch 2
2025-08-21 11:20:44 -05:00
H4W9
938a691010 Update MenuFunctions.cpp
Change text1_67 to text1_66
2025-08-21 10:57:00 -05:00
H4W9
3c61198d09 Update lang_var.h
Change text1_67 to text1_66
2025-08-21 10:54:16 -05:00
H4W9
bbf245859a Update CommandLine.h
Add Funny SSID Spam
2025-08-20 23:54:50 -05:00
H4W9
fbf2e9ab18 Update CommandLine.cpp
Add Funny SSID Spam to CLI
2025-08-20 23:52:36 -05:00
H4W9
de05c9be2b Update WiFiScan.cpp 2025-08-20 22:51:43 -05:00
H4W9
4e88212e2f Update WiFiScan.cpp 2025-08-20 22:38:23 -05:00
H4W9
ef5d9527ef Update MenuFunctions.cpp 2025-08-20 22:25:15 -05:00
H4W9
7f522d8e15 Update WiFiScan.cpp 2025-08-20 20:56:10 -05:00
H4W9
f35d88122c Update lang_var.h 2025-08-20 20:28:07 -05:00
H4W9
fc8f9629fa Update WiFiScan.cpp
Add Funny Beacon Spam attack
2025-08-20 20:26:29 -05:00
H4W9
5a1269d062 Update WiFiScan.h
add Funny Beacon Spam attack defs
2025-08-20 20:12:04 -05:00
H4W9
3c093f6c9c Update lang_var.h
Add text1_68[] = "Funny Beacon Spam";
2025-08-20 20:01:44 -05:00
H4W9
6840d4c7ac Update MenuFunctions.cpp
Add Funny Beacon button to the Wi-Fi Attack Menu
2025-08-20 20:00:05 -05:00
H4W9
d5c5e0e011 Update MenuFunctions.h
define funny beacon icon
2025-08-20 19:52:38 -05:00
H4W9
2f9d70b725 Update Assets.h
add funny beacon icon
2025-08-20 19:49:57 -05:00
H4W9
06293a0a4c Add files via upload 2025-08-20 19:48:17 -05:00
H4W9
c51171df76 Update lang_var.h 2025-08-20 12:54:39 -05:00
H4W9
030035f68d Update lang_var.h 2025-08-20 12:44:13 -05:00
H4W9
9a265f805b Update lang_var.h
Add GPS Menu text
2025-08-20 12:43:39 -05:00
H4W9
6497e741d6 Update MenuFunctions.cpp Add GPS Menu to Main Menu
Add GPS Menu to Main Menu and move GPS functions to GPS Menu.
2025-08-20 12:33:37 -05:00
H4W9
e5387b80fc Update README.md 2025-08-20 11:32:10 -05:00
H4W9
53613de14b Update MenuFunctions.h to add GPS Menu
Just adds the GPS Menu
2025-08-20 10:31:24 -05:00
Just Call Me Koko
3cf7702e23 Merge pull request #872 from justcallmekoko/develop
Fix time format for GPS and change select button for cardputer
2025-08-13 12:51:15 -07:00
Just Call Me Koko
e8f449ad01 Change select button for cardputer 2025-08-13 15:42:36 -04:00
Just Call Me Koko
b2ed6c70e1 Update enclosures 2025-08-10 23:23:28 -04:00
Just Call Me Koko
d8b9e3b138 Merge pull request #866 from AWOK559/develop
added c5 adapter case
2025-08-07 21:13:56 -07:00
Just Call Me Koko
ba35343600 Update the rest of the time format for GPS 2025-08-07 23:07:51 -04:00
AWOK
02f0ecf85b added c5 adapter case 2025-08-07 19:07:33 -07:00
Just Call Me Koko
57fde11782 Merge pull request #863 from justcallmekoko/develop
Add select all button for AP and STA
2025-08-06 10:34:39 -07:00
Just Call Me Koko
f5ecde8278 Add select all button for AP and STA 2025-08-06 13:26:20 -04:00
Just Call Me Koko
1964072b99 Merge pull request #862 from justcallmekoko/develop
Adjust build workflow to name files for release
2025-08-06 08:47:48 -07:00
Just Call Me Koko
2d8403b090 Adjust v4 output bin name 2025-08-06 11:40:05 -04:00
Just Call Me Koko
27c37a489d Adjust artifact naming 2025-08-06 11:34:34 -04:00
Just Call Me Koko
34ccdbaa14 Adjust release file naming 2025-08-06 11:29:19 -04:00
Just Call Me Koko
b85ce8b071 Merge pull request #861 from justcallmekoko/develop
Add GPS POI Marker
2025-08-05 20:10:06 -07:00
Just Call Me Koko
db75cd7d91 Add GPS POI Marker 2025-08-05 23:02:12 -04:00
Just Call Me Koko
76b06792f5 Merge pull request #859 from justcallmekoko/develop
Join with saved wifi credentials
2025-08-05 07:27:29 -07:00
Just Call Me Koko
3ea48c35e5 Join with saved wifi credentials 2025-08-04 17:47:56 -04:00
Just Call Me Koko
74d952dc5f Merge pull request #858 from justcallmekoko/develop
Add ARP scan, Add sleep attack, fix GPS time format for seconds
2025-08-04 14:37:16 -07:00
Just Call Me Koko
b490b5968f Adjust time format for GPS data seconds 2025-08-04 16:52:15 -04:00
Just Call Me Koko
7e2646e889 Add menu and CLI options for sleep attack 2025-08-04 15:34:19 -04:00
Just Call Me Koko
a75e1d7891 Add single ARP 2025-08-04 10:48:26 -04:00
Just Call Me Koko
8c56181871 Merge pull request #857 from Alexxdal/feature/association_with_sleep_bit
Fix bad handshake message 1, Added forged association request with sl…
2025-08-04 07:20:46 -07:00
Alessandro D'Alterio
34157d93cd Fix missing argument 2025-08-02 17:37:18 +02:00
Alessandro D'Alterio
387d277e02 Fix bad handshake message 1, Added forged association request with sleep bit set. 2025-08-02 17:32:14 +02:00
Just Call Me Koko
1ae345234d Add ARP scan 2025-07-31 12:42:55 -04:00
Just Call Me Koko
399b8d6c38 Merge pull request #852 from justcallmekoko/develop
Fix evil portal crash
2025-07-29 12:23:57 -07:00
Just Call Me Koko
3c51ae4e4d Fix evil portal crash 2025-07-29 15:17:07 -04:00
Just Call Me Koko
d17222d7b0 Merge pull request #851 from justcallmekoko/develop
Adjust frame data based on AP security
2025-07-28 12:47:40 -07:00
Just Call Me Koko
561bca75d2 Adjust frame data based on AP security 2025-07-28 15:42:51 -04:00
Just Call Me Koko
0603468ee3 Merge pull request #850 from justcallmekoko/develop
Add bad msg attack for CLI
2025-07-28 11:36:11 -07:00
Just Call Me Koko
6596b41029 Enable Bad Msg on GUI 2025-07-28 14:30:30 -04:00
Just Call Me Koko
9722cce0ba Add bin for c5 to flasher again 2025-07-28 12:56:21 -04:00
Just Call Me Koko
5ddf9786e0 Enable bad msg attack for CLI 2025-07-28 12:52:57 -04:00
Just Call Me Koko
4ebbd90e74 Merge pull request #849 from Alexxdal/feature/eapol_bad_msg1
Added Malformed EapoL Message 1 with install flag set (Advanced deauth)
2025-07-28 08:04:41 -07:00
Just Call Me Koko
944d23c3a9 Add C5 bin to flasher 2025-07-28 10:51:38 -04:00
Just Call Me Koko
7e5f48bacd Oh...do it this way 2025-07-28 10:28:18 -04:00
Just Call Me Koko
bc9c3ad32b Only associate stations when data frames 2025-07-28 10:27:45 -04:00
Alessandro D'Alterio
adebbb15d1 Fix error in function definition 2025-07-28 14:54:13 +02:00
Alessandro D'Alterio
fe975f1145 Added Malformed EapoL Message 1 with install flag set (Advanced deauth) 2025-07-28 14:44:07 +02:00
Just Call Me Koko
c16afc958b Merge pull request #848 from justcallmekoko/develop
Fix packet rate and evil portal
2025-07-26 21:30:59 -07:00
Just Call Me Koko
f2c8d2071b Fix packet rate not working on non-display 2025-07-27 00:19:10 -04:00
Just Call Me Koko
0bdb9470fb Fix country code for evil portal 2025-07-26 11:07:46 -04:00
Just Call Me Koko
761966e704 Merge pull request #847 from justcallmekoko/develop
Specify country code for to remove tx restrictions
2025-07-25 15:37:19 -07:00
Just Call Me Koko
66a5efcd33 Specify country code for tx restrictions 2025-07-25 18:30:40 -04:00
Just Call Me Koko
478586a8da Merge pull request #846 from justcallmekoko/develop
Add GPS tracker
2025-07-25 10:35:29 -07:00
Just Call Me Koko
1febb4a13c Add GPS tracker 2025-07-25 13:27:31 -04:00
Just Call Me Koko
f55e5aede3 Merge pull request #845 from justcallmekoko/develop
Set evilportal AP from CLI
2025-07-25 07:12:09 -07:00
Just Call Me Koko
701abd2aa7 Fix board definition 2025-07-25 10:05:01 -04:00
Just Call Me Koko
113e8c0c92 Set evilportal AP from command line 2025-07-25 10:04:17 -04:00
Just Call Me Koko
6920db4ab9 Merge pull request #844 from justcallmekoko/develop
Select AP for EP but deauth multiple
2025-07-24 10:26:37 -04:00
Just Call Me Koko
77117a4dae Select AP for EP but deauth multiple 2025-07-24 10:07:00 -04:00
Just Call Me Koko
7353dd69b3 Merge pull request #843 from justcallmekoko/develop
Add option to deauth with evil portal and automatically create missing settings
2025-07-24 10:05:31 -04:00
Just Call Me Koko
1398dbe00d Deauth with evil portal 2025-07-23 18:51:25 -04:00
Just Call Me Koko
23e2b6d221 Merge pull request #842 from justcallmekoko/develop
Add karma attack and build workflow variables
2025-07-23 16:36:35 -04:00
Just Call Me Koko
fd1a34e567 Do not include neopixel 2025-07-23 16:21:22 -04:00
Just Call Me Koko
e2b6983950 Yea this shit doesn't make sense 2025-07-23 15:21:02 -04:00
Just Call Me Koko
651761c7a7 Somthing 2025-07-23 15:17:45 -04:00
Just Call Me Koko
c0d17f195a I don't get it 2025-07-23 15:14:23 -04:00
Just Call Me Koko
7c59161ae7 Something 2025-07-23 15:09:20 -04:00
Just Call Me Koko
899b854819 Update build flags and add partition check 2025-07-23 15:03:58 -04:00
Just Call Me Koko
052d336c92 Update arduino test compile 2025-07-23 13:59:46 -04:00
Just Call Me Koko
6008cc359d Change core version 2025-07-23 13:51:22 -04:00
Just Call Me Koko
01a7c33e9e Update bootloader address 2025-07-23 13:13:31 -04:00
Just Call Me Koko
4c22b9af7c I guess import the lib from repo 2025-07-23 12:22:42 -04:00
Just Call Me Koko
c6bf7d63e5 Switch back 2025-07-23 12:08:04 -04:00
Just Call Me Koko
e618e878f6 Update espasyncwebserver repo 2025-07-23 11:49:39 -04:00
Just Call Me Koko
2311aa1f1b ESPAsyncWebServer as variable 2025-07-23 11:36:52 -04:00
Just Call Me Koko
a2fd8ef90d Remove core install 2025-07-23 11:21:09 -04:00
Just Call Me Koko
e1217a7f4f Add ESP32-C5 to build workflow 2025-07-23 11:15:49 -04:00
Just Call Me Koko
0025dc2f68 Add NimBLE version as variable 2025-07-23 10:58:33 -04:00
Just Call Me Koko
999be5d100 IDF version as variable 2025-07-23 10:56:01 -04:00
Just Call Me Koko
04847f9537 Add commands for Karma 2025-07-23 09:50:39 -04:00
Just Call Me Koko
02802ca6e4 Merge pull request #841 from justcallmekoko/marauder_c5
Add karma attack
2025-07-22 23:19:00 -04:00
Just Call Me Koko
e8c4e9c01a Fix board definition 2025-07-22 23:14:03 -04:00
Just Call Me Koko
f1bcdad370 Add karma attack 2025-07-22 23:13:31 -04:00
Just Call Me Koko
2c2df227d2 Merge pull request #840 from justcallmekoko/develop
Merge develop into master
2025-07-22 09:59:16 -04:00
Just Call Me Koko
ede779845c Merge pull request #839 from justcallmekoko/marauder_c5
Add C5 flasher
2025-07-22 09:54:01 -04:00
Just Call Me Koko
9c62237fcf Add C5 flasher 2025-07-22 09:40:56 -04:00
Just Call Me Koko
7966b07441 Merge pull request #838 from justcallmekoko/develop
Merge develop into master
2025-07-21 19:24:29 -04:00
Just Call Me Koko
158644092c Merge pull request #837 from justcallmekoko/marauder_c5
Add support for M5 Cardputer
2025-07-21 19:19:13 -04:00
Just Call Me Koko
9411128cca Fix board definition 2025-07-21 18:55:12 -04:00
Just Call Me Koko
530a30c6d7 Add support for M5 Cardputer 2025-07-21 18:47:57 -04:00
Just Call Me Koko
ee7e3f1d1e Merge pull request #836 from justcallmekoko/marauder_c5
Add support for ESP32-C5 DevKit
2025-07-21 18:45:51 -04:00
Just Call Me Koko
3d9b91a80b Adjust wardriving coverage for C5 2025-07-10 13:40:47 -04:00
Just Call Me Koko
07a3e54498 Silly little C5 SD card stuff 2025-07-10 12:23:37 -04:00
Just Call Me Koko
9a25224c83 Marauder compiles and installs for ESP32-C5 2025-07-10 11:20:50 -04:00
Just Call Me Koko
44189ff945 Merge pull request #826 from justcallmekoko/develop
Develop
2025-07-07 19:04:24 -04:00
Just Call Me Koko
d61542eb5f Merge pull request #825 from justcallmekoko/captiveportal
captiveportal
2025-07-07 17:26:10 -04:00
Just Call Me Koko
e0eb37e082 Merge pull request #824 from bpmcircuits/captiveportal-dev
Added captive endpoints redirection to index.html file.
2025-07-07 17:14:37 -04:00
Just Call Me Koko
17338427a1 Fix BLE spam crash 2025-07-07 17:10:55 -04:00
Bartek Pokrywka
a10bb164ac Added captive endopints redirection to index_html 2025-07-07 16:52:27 +02:00
Bartek Pokrywka
b43a79e036 Added captive endopints redirection to index_html 2025-07-07 16:49:24 +02:00
Just Call Me Koko
1cdb9b4a17 Merge pull request #813 from justcallmekoko/develop
Increment version number
2025-06-24 13:16:52 -04:00
Just Call Me Koko
c117eebc0f Increment version number 2025-06-24 13:11:26 -04:00
Just Call Me Koko
303a9d2eeb Merge pull request #812 from justcallmekoko/develop
Fix S3 PSRAM and BLE transmit stop, Add probe SSID list
2025-06-24 11:54:05 -04:00
Just Call Me Koko
a101bfdddf Merge pull request #811 from justcallmekoko/probe
Select SSIDs from Probe Request Sniff
2025-06-24 11:39:05 -04:00
Just Call Me Koko
a0ed27308e Merge pull request #803 from m1crod0t/Select_SSIDs_from_Probe
Select SSIDs from Probe Request Sniff #796
2025-06-24 09:00:22 -04:00
Just Call Me Koko
2362b8e8c5 Merge pull request #809 from WillyJL/fix/s3-psram
Fix multiboardS3 builds, fix BLE spam not stopping
2025-06-24 08:43:39 -04:00
WillyJL
0ca43eb403 Fix multiboardS3 builds, fix BLE spam not stopping 2025-06-21 04:49:29 +01:00
m1crod0t
b76de6c314 Update WiFiScan.cpp
Intendent issue
2025-06-11 15:30:22 +02:00
m1crod0t
d0ac2f178b Update build_parallel.yml
revert to def
2025-06-11 15:25:37 +02:00
m1crod0t
06a5de8cd9 Just intendent 2025-06-11 15:23:18 +02:00
m1crod0t
e300489b77 Update build_parallel.yml 2025-06-10 19:37:04 +02:00
m1crod0t
fe27910096 Update build_parallel.yml 2025-06-10 15:59:03 +02:00
m1crod0t
50b96f696e Merge pull request #2 from m1crod0t/master
Update from master
2025-06-10 15:53:15 +02:00
Just Call Me Koko
35c6d9ca63 Merge pull request #798 from justcallmekoko/develop
Update pins for CYD board from fork configs
2025-06-09 14:28:15 -04:00
Just Call Me Koko
07762891d5 Fix wifi channel in status bar 2025-06-09 12:05:27 -04:00
Just Call Me Koko
1278474ca0 Merge pull request #792 from CodeHedge/develop
Updated pins for the CYD 2.8" boards
2025-06-09 11:12:25 -04:00
Just Call Me Koko
4874ef3193 Add flipper zero dev board gps enclosure 2025-06-09 11:06:53 -04:00
m1crod0t
a6ed8899c7 Update MenuFunctions.cpp
Changed how request count is shown
2025-06-08 17:53:40 +02:00
m1crod0t
2c40d83e3a Update WiFiScan.cpp
Fixed saving request count per ssid
2025-06-08 17:24:54 +02:00
m1crod0t
acef9d437c Select SSIDs from Probe Request Sniff 2025-06-08 16:09:16 +02:00
Just Call Me Koko
50d876e20f Merge pull request #791 from justcallmekoko/develop
Write IP scan info to logs
2025-06-06 12:48:57 -04:00
hedge
d8512b082c Updated pins for the CYD 2.8" boards 2025-06-06 09:11:29 -07:00
Just Call Me Koko
dec4b9066f Write scan info to logs 2025-06-06 10:49:38 -04:00
Just Call Me Koko
dd74b60744 Merge pull request #790 from justcallmekoko/develop
Add TCP port scan and Force PMKID status icon
2025-06-06 09:59:37 -04:00
Just Call Me Koko
3a3102d877 Add command for port scan 2025-06-06 09:54:55 -04:00
Just Call Me Koko
38d99bda35 Update status bar format for v7.1 2025-06-05 17:57:51 -04:00
Just Call Me Koko
01660f408d Add port scan 2025-06-05 15:29:04 -04:00
Just Call Me Koko
5d2c2d553a Add status icon for force pmkid 2025-06-05 14:04:24 -04:00
Just Call Me Koko
0beb7c455f Merge pull request #789 from justcallmekoko/develop
Add Join WiFi, Ping Scan, and associated commands
2025-06-05 12:23:46 -04:00
Just Call Me Koko
61a7449a89 Fix more non-display stuff 2025-06-05 12:00:42 -04:00
Just Call Me Koko
eb6000a5c3 Fix color definition 2025-06-05 11:46:37 -04:00
Just Call Me Koko
93cb77526f Add ping command and fix join command 2025-06-05 11:38:37 -04:00
Just Call Me Koko
bade515fb3 Add active IPs to list 2025-06-05 11:05:45 -04:00
Just Call Me Koko
ed95a97506 Connect using set MAC addresses 2025-06-05 10:07:37 -04:00
Just Call Me Koko
ebc3497c32 Add Ping Scan 2025-06-04 20:26:54 -04:00
Just Call Me Koko
38bef9121f Add network info tracking 2025-06-04 18:59:36 -04:00
Just Call Me Koko
a274e42708 Add wifi connection status icon to status bar 2025-06-04 15:51:26 -04:00
Just Call Me Koko
33d7460c6b Add join wifi for switch hardware 2025-06-04 11:59:03 -04:00
Just Call Me Koko
51eddd5b8f Add Join WiFi for touch hardware 2025-06-03 23:13:11 -04:00
Just Call Me Koko
e9e6a84c17 Merge pull request #782 from justcallmekoko/develop
Fix display includes
2025-05-31 18:33:42 -04:00
Just Call Me Koko
75e3e71453 Increment version number 2025-05-31 18:29:28 -04:00
Just Call Me Koko
a73da306c9 Fix display includes 2025-05-31 08:26:53 -04:00
67 changed files with 10694 additions and 3042 deletions

View File

@@ -17,23 +17,26 @@ jobs:
fail-fast: false
matrix:
board:
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000" }
- { name: "Flipper Zero Multi Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=enabled", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "og", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000" }
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000" }
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000" }
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000" }
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Flipper Zero Multi Board S3", flag: "MARAUDER_MULTIBOARD_S3", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=4M", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "2.3.6", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
steps:
- name: Checkout Code
@@ -46,21 +49,21 @@ jobs:
export PATH=$PATH:/home/runner/work/ESP32Marauder/ESP32Marauder/bin
arduino-cli version
- name: Install Arduino-ESP32 Core v2.0.11
run: |
arduino-cli core update-index
arduino-cli core install esp32:esp32@2.0.11
#- name: Install Arduino-ESP32 Core v${{ matrix.board.idf_ver }}
# run: |
# arduino-cli core update-index
# arduino-cli core install esp32:esp32@${{ matrix.board.idf_ver }}
- name: Verify Installed Cores
run: arduino-cli core list
- name: Build TestFile with ESP32 v2.0.11
- name: Build TestFile with ESP32 v${{ matrix.board.idf_ver }}
uses: ArminJo/arduino-test-compile@v3.2.1
with:
sketch-names: TestFile.ino
arduino-board-fqbn: esp32:esp32:esp32s2
arduino-platform: esp32:esp32@2.0.11
platform-url: https://github.com/espressif/arduino-esp32/releases/download/2.0.11/package_esp32_dev_index.json
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
- name: Verify Installed Cores Again
run: arduino-cli core list
@@ -69,11 +72,18 @@ jobs:
run: |
find /home/runner/.arduino15/packages/esp32/hardware/
- name: Install ESP32Ping
uses: actions/checkout@v2
with:
repository: marian-craciunescu/ESP32Ping
ref: 1.6
path: CustomESP32Ping
- name: Install AsyncTCP
uses: actions/checkout@v2
with:
repository: me-no-dev/AsyncTCP
ref: master
repository: ESP32Async/AsyncTCP
ref: v3.4.8
path: CustomAsyncTCP
- name: Install MicroNMEA
@@ -86,9 +96,13 @@ jobs:
- name: Install ESPAsyncWebServer
uses: actions/checkout@v2
with:
repository: bigbrodude6119/ESPAsyncWebServer
ref: master
repository: ESP32Async/ESPAsyncWebServer
ref: v3.8.1
path: CustomESPAsyncWebServer
#- name: Install ESPAsyncWebServer
# run: |
# cp -r libraries/ESPAsyncWebServer ./CustomESPAsyncWebServer
- name: Install TFT_eSPI
uses: actions/checkout@v2
@@ -122,14 +136,14 @@ jobs:
uses: actions/checkout@v2
with:
repository: h2zero/NimBLE-Arduino
ref: 1.3.5
ref: ${{ matrix.board.nimble_ver }}
path: CustomNimBLE-Arduino
- name: Install Adafruit_NeoPixel
uses: actions/checkout@v2
with:
repository: adafruit/Adafruit_NeoPixel
ref: 1.10.7
ref: 1.12.0
path: CustomAdafruit_NeoPixel
- name: Install ArduinoJson
@@ -167,6 +181,10 @@ jobs:
ref: 1.0.2
path: CustomAdafruit_MAX1704X
- name: Show Libraries
run: |
find /home/runner/ -name "Custom*"
- name: Configure TFT_eSPI
run: |
rm -f CustomTFT_eSPI/User_Setup_Select.h
@@ -181,16 +199,24 @@ jobs:
- name: Modify platform.txt
run: |
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.libs.esp32c3=/compiler.c.elf.libs.esp32c3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s3=/compiler.c.elf.libs.esp32s3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s2=/compiler.c.elf.libs.esp32s2=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32=/compiler.c.elf.libs.esp32=-zmuldefs /' "$i"
cat "$i" | grep compiler.c.elf.libs.esp32c3
cat "$i" | grep compiler.c.elf.libs.esp32s3
cat "$i" | grep compiler.c.elf.libs.esp32s2
cat "$i" | grep compiler.c.elf.libs.esp32
done
if [[ ${{ matrix.board.idf_ver }} == "2.0.11" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.libs.esp32c3=/compiler.c.elf.libs.esp32c3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s3=/compiler.c.elf.libs.esp32s3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s2=/compiler.c.elf.libs.esp32s2=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32=/compiler.c.elf.libs.esp32=-zmuldefs /' "$i"
cat "$i" | grep compiler.c.elf.libs.esp32c3
cat "$i" | grep compiler.c.elf.libs.esp32s3
cat "$i" | grep compiler.c.elf.libs.esp32s2
cat "$i" | grep compiler.c.elf.libs.esp32
done
fi
if [[ ${{ matrix.board.idf_ver }} == "3.3.4" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.extra_flags=/compiler.c.elf.extra_flags=-Wl,-zmuldefs /' "$i"
done
fi
- name: Configure TFT_eSPI (if needed)
run: |
@@ -201,29 +227,37 @@ jobs:
fi
- name: Build Marauder for ${{ matrix.board.name }}
uses: ArminJo/arduino-test-compile@v3.2.1
uses: ArminJo/arduino-test-compile@v3.3.0
with:
sketch-names: esp32_marauder.ino
arduino-board-fqbn: ${{ matrix.board.fbqn }}
extra-arduino-cli-args: "--warnings none --build-property compiler.cpp.extra_flags='-D${{ matrix.board.flag }}'"
arduino-platform: esp32:esp32@2.0.11
platform-url: https://github.com/espressif/arduino-esp32/releases/download/2.0.11/package_esp32_dev_index.json
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
- name: Rename Marauder ${{ matrix.board.name }} bin
#- name: Rename Marauder ${{ matrix.board.name }} bin
# run: |
# mv ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.ino.bin ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.${{ matrix.board.file_name }}.bin
- name: Rename and Upload ${{ matrix.board.name }} Artifact
run: |
mv ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.ino.bin ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.${{ matrix.board.file_name }}.bin
# ls -la ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/
# esptool.py --chip esp32s3 merge_bin -o ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.${{ matrix.board.file_name }}.bin \
# ${{ matrix.board.addr }} ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.ino.bootloader.bin \
# 0x8000 ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.ino.partitions.bin \
# 0x10000 ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.ino.bin
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
DATE=$(date +%Y%m%d)
BUILD_DIR=./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}
INPUT_BIN=$BUILD_DIR/esp32_marauder.ino.bin
OUTPUT_BIN=esp32_marauder_${VERSION}_${DATE}_${{ matrix.board.file_name }}.bin
VERSION_DOT=${VERSION_DOT}
mv "$INPUT_BIN" "$BUILD_DIR/$OUTPUT_BIN"
echo "artifact_name=$OUTPUT_BIN" >> $GITHUB_ENV
echo "artifact_path=$BUILD_DIR/$OUTPUT_BIN" >> $GITHUB_ENV
- name: Upload ${{ matrix.board.name }} Artifact
uses: actions/upload-artifact@v4
with:
name: esp32_marauder.${{ matrix.board.file_name }}.bin
path: ./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}/esp32_marauder.${{ matrix.board.file_name }}.bin
name: ${{ env.artifact_name }}
path: ${{ env.artifact_path }}
retention-days: 5
post_compile_steps:
@@ -236,12 +270,61 @@ jobs:
- uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Get Tag Version
run: |
VERSION_DOT=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/')
echo "version_dot=$VERSION_DOT" >> $GITHUB_ENV
- name: Create Release
uses: softprops/action-gh-release@v1
with:
name: "Marauder Release ${{ github.ref_name }}"
tag_name: ${{ github.ref_name }}
generate_release_notes: true
tag_name: ${{ env.version_dot }}
generate_release_notes: false
draft: true
files: |
esp32_marauder.*.bin
esp32_marauder_v*.bin
body: |
[justcallmekokollc.com](https://justcallmekokollc.com)
### Please see [GPS Modification](https://github.com/justcallmekoko/ESP32Marauder/wiki/gps-modification) to find out how to add GPS capabilities to your Marauder.
**Flipper Zero Marauder Companion App:**
**Be sure to install the latest version of the [Marauder Companion](https://github.com/0xchocolate/flipperzero-wifi-marauder/releases/latest) to use these new features on your Flipper Zero**
**Additional Resources**
**[Project Issues](https://github.com/justcallmekoko/ESP32Marauder/issues)**
**[Install/Update Instructions](https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware)**
**[ESP32 Marauder companion app](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion/releases/latest)**
**[My Discord](https://discord.com/servers/willstunforfood-776211399918878760)**
**Flipper Zero Dev Board is NOT the same thing as Dev Board Pro. Don't get them confused.**
### MARAUDER V6/V6.X WARNING
**Please check which Marauder you are using by looking at the front face of the PCB (side with the screen). If it says v6.1 (or .2), use the v6.1 bin. If it says v6, use the v6 bin.**
## ESP32-C5 (5GHz support)
Please see our [installation guide](https://github.com/justcallmekoko/ESP32Marauder/wiki/ESP32%E2%80%90C5%E2%80%90DevKitC%E2%80%901) for installing the Marauder firmware on your ESP32-C5-DevKitC-1
| Hardware | Binary Version |
| -------- | -------------- |
| v4 (OG) | `_old_hardware.bin` |
| v6 | `_new_hardware.bin`/`_v6.bin` |
| v6.1/v6.2 | `_v6_1.bin` |
| v7 | `_v7.bin` |
| Kit | `_kit.bin` |
| Mini | `_mini.bin` |
| Flipper Zero | `_flipper.bin` |
| MutliBoard S3 | `_multiboardS3.bin` |
| LDDB/NodeMCU/Wemos | `_lddb.bin` |
| Dev Board Pro | `_marauder_dev_board_pro.bin` |
| BFFB | `_marauder_dev_board_pro.bin` |
| ESP32-S2 Reverse Feather | `_rev_feather.bin` |
| CYD 2432S028(R) | `_cyd_2432S028.bin` |
| RL Phantom | `_cyd_2432S024_guition.bin` |
| CYD 2432S028 2 USB | `_cyd_2432S028_2usb.bin` |
| M5 Cardputer | `_m5cardputer.bin` (Available on M5 Burner) |
| ESP32-C5 DevKit | [`_esp32c5_devkit.bin`](https://github.com/justcallmekoko/ESP32Marauder/wiki/ESP32%E2%80%90C5%E2%80%90DevKitC%E2%80%901) |
| AWOK V2/V3 screen (white usb) | `_v6_1.bin` |
| AWOK V2 flipper (orange usb) | `_flipper.bin` |
| AWOK V3 flipper (orange usb) | `_marauder_dev_board_pro.bin` |

32
.github/workflows/close_stale.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: Close stale issues
on:
schedule:
- cron: "0 3 * * *" # runs daily at 03:00 UTC
workflow_dispatch: {}
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
days-before-stale: 132
days-before-close: 7
stale-issue-message: >
This issue has been automatically marked as stale due to inactivity.
It will be closed in 7 days unless there is further activity.
close-issue-message: >
Closing due to prolonged inactivity. If this is still relevant,
please comment or open a new issue with updated details.
stale-issue-label: "stale"
exempt-issue-labels: "pinned,security,backlog,keep-open"
remove-stale-when-updated: true
operations-per-run: 2000
# Optional: also handle PRs
days-before-pr-stale: -1
days-before-pr-close: -1

409
.github/workflows/nightly_build.yml vendored Normal file
View File

@@ -0,0 +1,409 @@
name: Build and (Nightly) Pre-release
on:
workflow_dispatch:
schedule:
# daily at 03:00 UTC (adjust to your preferred time)
- cron: '0 3 * * *'
jobs:
decide:
name: Detect new commits on default branch
runs-on: ubuntu-latest
outputs:
should_build: ${{ steps.decide.outputs.should_build }}
default_branch: ${{ steps.decide.outputs.default_branch }}
head_sha: ${{ steps.decide.outputs.head_sha }}
short_sha: ${{ steps.decide.outputs.short_sha }}
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- id: decide
uses: actions/github-script@v7
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
// Find default branch and its HEAD
const repoInfo = await github.rest.repos.get({ owner, repo });
const defaultBranch = repoInfo.data.default_branch;
const head = await github.rest.repos.getBranch({ owner, repo, branch: defaultBranch });
const headSha = head.data.commit.sha;
const shortSha = headSha.slice(0,7);
// Try get the existing nightly release (single static tag)
let nightlyRelease = null;
try {
nightlyRelease = await github.rest.repos.getReleaseByTag({
owner, repo, tag: 'nightly'
});
} catch (e) {
if (e.status !== 404) throw e;
}
// Decide if we need to rebuild: compare short SHA in the release name
// Name format we set: "<shortsha>_nightly"
let shouldBuild = true;
if (nightlyRelease) {
const name = nightlyRelease.data.name || '';
const m = name.match(/^([0-9a-f]{7})_nightly$/i);
if (m && m[1] === shortSha) {
shouldBuild = false; // no new commits since last nightly
}
}
core.setOutput('should_build', String(shouldBuild));
core.setOutput('default_branch', defaultBranch);
core.setOutput('head_sha', headSha);
core.setOutput('short_sha', shortSha);
compile_sketch:
name: build ${{ matrix.board.name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
board:
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Flipper Zero Multi Board S3", flag: "MARAUDER_MULTIBOARD_S3", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=4M", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "2.3.6", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Install Arduino CLI
run: |
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
echo "/home/runner/work/ESP32Marauder/ESP32Marauder/bin" >> $GITHUB_PATH
export PATH=$PATH:/home/runner/work/ESP32Marauder/ESP32Marauder/bin
arduino-cli version
- name: Verify Installed Cores
run: arduino-cli core list
- name: Build TestFile with ESP32 v${{ matrix.board.idf_ver }}
uses: ArminJo/arduino-test-compile@v3.2.1
with:
sketch-names: TestFile.ino
arduino-board-fqbn: esp32:esp32:esp32s2
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
- name: Verify Installed Cores Again
run: arduino-cli core list
- name: Show Arduino dir structure
run: |
find /home/runner/.arduino15/packages/esp32/hardware/
- name: Install ESP32Ping
uses: actions/checkout@v2
with:
repository: marian-craciunescu/ESP32Ping
ref: 1.6
path: CustomESP32Ping
- name: Install AsyncTCP
uses: actions/checkout@v2
with:
repository: ESP32Async/AsyncTCP
ref: v3.4.8
path: CustomAsyncTCP
- name: Install MicroNMEA
uses: actions/checkout@v2
with:
repository: stevemarple/MicroNMEA
ref: v2.0.6
path: CustomMicroNMEA
- name: Install ESPAsyncWebServer
uses: actions/checkout@v2
with:
repository: ESP32Async/ESPAsyncWebServer
ref: v3.8.1
path: CustomESPAsyncWebServer
- name: Install TFT_eSPI
uses: actions/checkout@v2
with:
repository: Bodmer/TFT_eSPI
ref: V2.5.34
path: CustomTFT_eSPI
- name: Install XPT2046_Touchscreen
uses: actions/checkout@v2
with:
repository: PaulStoffregen/XPT2046_Touchscreen
ref: v1.4
path: CustomXPT2046_Touchscreen
- name: Install lv_arduino
uses: actions/checkout@v2
with:
repository: lvgl/lv_arduino
ref: 3.0.0
path: Customlv_arduino
- name: Install JPEGDecoder
uses: actions/checkout@v2
with:
repository: Bodmer/JPEGDecoder
ref: 1.8.0
path: CustomJPEGDecoder
- name: Install NimBLE-Arduino
uses: actions/checkout@v2
with:
repository: h2zero/NimBLE-Arduino
ref: ${{ matrix.board.nimble_ver }}
path: CustomNimBLE-Arduino
- name: Install Adafruit_NeoPixel
uses: actions/checkout@v2
with:
repository: adafruit/Adafruit_NeoPixel
ref: 1.12.0
path: CustomAdafruit_NeoPixel
- name: Install ArduinoJson
uses: actions/checkout@v2
with:
repository: bblanchon/ArduinoJson
ref: v6.18.2
path: CustomArduinoJson
- name: Install LinkedList
uses: actions/checkout@v2
with:
repository: ivanseidel/LinkedList
ref: v1.3.3
path: CustomLinkedList
- name: Install EspSoftwareSerial
uses: actions/checkout@v2
with:
repository: plerup/espsoftwareserial
ref: 8.1.0
path: CustomEspSoftwareSerial
- name: Install Adafruit_BusIO
uses: actions/checkout@v2
with:
repository: adafruit/Adafruit_BusIO
ref: 1.15.0
path: CustomAdafruit_BusIO
- name: Install Adafruit_MAX1704X
uses: actions/checkout@v2
with:
repository: adafruit/Adafruit_MAX1704X
ref: 1.0.2
path: CustomAdafruit_MAX1704X
- name: Show Libraries
run: |
find /home/runner/ -name "Custom*"
- name: Configure TFT_eSPI
run: |
rm -f CustomTFT_eSPI/User_Setup_Select.h
cp User*.h CustomTFT_eSPI/
pwd
ls -la
ls -la CustomTFT_eSPI
- name: Install Esptool
run: |
pip install esptool
- name: Modify platform.txt
run: |
if [[ ${{ matrix.board.idf_ver }} == "2.0.11" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.libs.esp32c3=/compiler.c.elf.libs.esp32c3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s3=/compiler.c.elf.libs.esp32s3=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32s2=/compiler.c.elf.libs.esp32s2=-zmuldefs /' "$i"
sed -i 's/compiler.c.elf.libs.esp32=/compiler.c.elf.libs.esp32=-zmuldefs /' "$i"
cat "$i" | grep compiler.c.elf.libs.esp32c3
cat "$i" | grep compiler.c.elf.libs.esp32s3
cat "$i" | grep compiler.c.elf.libs.esp32s2
cat "$i" | grep compiler.c.elf.libs.esp32
done
fi
if [[ ${{ matrix.board.idf_ver }} == "3.3.4" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.extra_flags=/compiler.c.elf.extra_flags=-Wl,-zmuldefs /' "$i"
done
fi
- name: Configure TFT_eSPI (if needed)
run: |
pwd
if [[ ${{ matrix.board.tft }} == true ]]; then
find /home/runner/ -name "*TFT_eSPI*"
sed -i 's/^\/\/#include <${{ matrix.board.tft_file }}>/#include <${{ matrix.board.tft_file }}>/' /home/runner/work/ESP32Marauder/ESP32Marauder/CustomTFT_eSPI/User_Setup_Select.h
fi
- name: Build Marauder for ${{ matrix.board.name }}
uses: ArminJo/arduino-test-compile@v3.3.0
with:
sketch-names: esp32_marauder.ino
arduino-board-fqbn: ${{ matrix.board.fbqn }}
extra-arduino-cli-args: "--warnings none --build-property compiler.cpp.extra_flags='-D${{ matrix.board.flag }}'"
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
- name: Rename and Upload ${{ matrix.board.name }} Artifact
run: |
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
DATE=$(date +%Y%m%d)
BUILD_DIR=./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}
INPUT_BIN=$BUILD_DIR/esp32_marauder.ino.bin
OUTPUT_BIN=esp32_marauder_${VERSION}_beta_${DATE}_${{ matrix.board.file_name }}.bin
mv "$INPUT_BIN" "$BUILD_DIR/$OUTPUT_BIN"
echo "artifact_name=$OUTPUT_BIN" >> $GITHUB_ENV
echo "artifact_path=$BUILD_DIR/$OUTPUT_BIN" >> $GITHUB_ENV
echo "wild_card=esp32_marauder_${VERSION}_beta_${DATE}_*.bin" >> $GITHUB_ENV
- name: Upload ${{ matrix.board.name }} Artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.artifact_name }}
path: ${{ env.artifact_path }}
retention-days: 5
post_compile_steps:
name: Create Nightly Release
runs-on: ubuntu-latest
needs: [compile_sketch, decide]
# create release if manual dispatch OR should_release decided true for scheduled run
if: ${{ needs.decide.outputs.should_build == 'true' }}
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Compute release title/tag
id: meta
shell: bash
run: |
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
DATE=$(date +%Y%m%d)
SHORT_SHA="$(git rev-parse --short HEAD)"
if [[ "${{ github.event_name }}" == "schedule" ]]; then
echo "name=${SHORT_SHA}_nightly" >> $GITHUB_OUTPUT
# keep your existing tag, or set one here:
echo "tag=nightly-$(date -u +'%Y%m%d')-${SHORT_SHA}" >> $GITHUB_OUTPUT
echo "prerelease=true" >> $GITHUB_OUTPUT
else
echo "name=${SHORT_SHA}" >> $GITHUB_OUTPUT
echo "tag=manual-$(date -u +'%Y%m%d')-${SHORT_SHA}" >> $GITHUB_OUTPUT
echo "prerelease=false" >> $GITHUB_OUTPUT
fi
echo "wild_card=esp32_marauder_${VERSION}_beta_${DATE}_*.bin" >> $GITHUB_ENV
echo ${{ env.wild_card }}
- name: Delete old assets on nightly release (if any)
uses: actions/github-script@v7
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
let rel;
try {
rel = await github.rest.repos.getReleaseByTag({ owner, repo, tag: 'nightly' });
} catch (e) {
if (e.status === 404) {
// No release yet — nothing to delete
return;
}
throw e;
}
const assets = rel.data.assets || [];
for (const a of assets) {
await github.rest.repos.deleteReleaseAsset({ owner, repo, asset_id: a.id });
core.info(`Deleted old asset: ${a.name}`);
}
- name: Create Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.decide.outputs.short_sha }}_nightly
tag_name: nightly_${{ needs.decide.outputs.short_sha }}
prerelease: true
generate_release_notes: false
draft: false
files: |
${{ env.wild_card }}
body: |
[justcallmekokollc.com](https://justcallmekokollc.com)
### This is an automated pre-release / beta created by CI.
### Please see [GPS Modification](https://github.com/justcallmekoko/ESP32Marauder/wiki/gps-modification) to find out how to add GPS capabilities to your Marauder.
**Flipper Zero Marauder Companion App:**
**Be sure to install the latest version of the [Marauder Companion](https://github.com/0xchocolate/flipperzero-wifi-marauder/releases/latest) to use these new features on your Flipper Zero**
**Additional Resources**
**[Project Issues](https://github.com/justcallmekoko/ESP32Marauder/issues)**
**[Install/Update Instructions](https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware)**
**[ESP32 Marauder companion app](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion/releases/latest)**
**[My Discord](https://discord.com/servers/willstunforfood-776211399918878760)**
**Note:** Nightly pre-releases are for testing and evaluation. Use them at your own risk.
| Hardware | Binary Version |
| -------- | -------------- |
| v4 (OG) | `_old_hardware.bin` |
| v6 | `_new_hardware.bin`/`_v6.bin` |
| v6.1/v6.2 | `_v6_1.bin` |
| v7 | `_v7.bin` |
| Kit | `_kit.bin` |
| Mini | `_mini.bin` |
| Flipper Zero | `_flipper.bin` |
| MutliBoard S3 | `_multiboardS3.bin` |
| LDDB/NodeMCU/Wemos | `_lddb.bin` |
| Dev Board Pro | `_marauder_dev_board_pro.bin` |
| BFFB | `_marauder_dev_board_pro.bin` |
| ESP32-S2 Reverse Feather | `_rev_feather.bin` |
| CYD 2432S028(R) | `_cyd_2432S028.bin` |
| RL Phantom | `_cyd_2432S024_guition.bin` |
| CYD 2432S028 2 USB | `_cyd_2432S028_2usb.bin` |
| M5 Cardputer | `_m5cardputer.bin` (Available on M5 Burner) |
| ESP32-C5 DevKit | [`_esp32c5_devkit.bin`](https://github.com/justcallmekoko/ESP32Marauder/wiki/ESP32%E2%80%90C5%E2%80%90DevKitC%E2%80%901) |
| AWOK V2/V3 screen (white usb) | `_v6_1.bin` |
| AWOK V2 flipper (orange usb) | `_flipper.bin` |
| AWOK V3 flipper (orange usb) | `_marauder_dev_board_pro.bin` |

Binary file not shown.

Binary file not shown.

164
C5_Py_Flasher/c5_flasher.py Normal file
View File

@@ -0,0 +1,164 @@
# === ESP32-C5 Auto Flasher Script By: AWOK ===
import sys
import subprocess
import os
import platform # Placeholder for possible OS checks
import glob
import time
import shutil
import argparse
def ensure_package(pkg):
try:
__import__(pkg if pkg != 'gitpython' else 'git')
except ImportError:
print(f"Installing missing package: {pkg}")
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', pkg])
try:
import serial.tools.list_ports
except ImportError:
ensure_package('pyserial')
try:
import esptool
except ImportError:
ensure_package('esptool')
try:
from colorama import Fore, Style
except ImportError:
ensure_package('colorama')
# Dependency check and install if needed
REQUIRED_PACKAGES = [
'pyserial',
'esptool',
'colorama'
]
def ensure_requirements():
for pkg in REQUIRED_PACKAGES:
ensure_package(pkg)
ensure_requirements()
# Finds the first file from a list of possible names in the bins folder
def find_file(name_options, bins_dir):
for name in name_options:
files = glob.glob(os.path.join(bins_dir, name))
if files:
return files[0]
return None
def main():
parser = argparse.ArgumentParser(description="ESP32-C5 Auto Flasher (bins subdir)")
parser.parse_args()
bins_dir = os.path.join(os.path.dirname(__file__), 'bins')
if not os.path.isdir(bins_dir):
print(Fore.RED + f"Bins directory not found: {bins_dir}\nPlease create a 'bins' folder with your .bin files." + Style.RESET_ALL)
exit(1)
# Logo and splash, both centered and purple
terminal_width = shutil.get_terminal_size((100, 20)).columns
def center(text): return text.center(terminal_width)
logo_lines = [
" @@@@@@ ",
" @@@@@@@@ @@@@@ @@@@ ",
" @@@ @@@@@@@ @@@ @@@@@@@@ ",
" @@@@@@@@@@@@@ @@@@@ @@@ @@@@ @@@ ",
" @@@ @@@@@ @@@ @@@@@@ @@@ ",
" @@@ @@@ @@ @@@@ @@@ ",
" @@@@@@@@@@@@ @@ @ @@@ @@@ @@ ",
" @@@ @@@@@ @@ @@@ @@ @@@@@@@@@@@@@@ ",
" @@@ @@@ @@ @@@ @@@@@ @@@@",
" @@@ @@ @@@@ @@@ @@@",
" @@@@@ @@ @@@@ @@@",
" @@@@@@ @@ @@ @ @@@ @@@@ ",
" @@@ @@ @@ @ @@@@@@ ",
" @@@ @@ @@@ @@ @@@@@@@@@@@@@@@ ",
"@@@ @@@@ @ @@@@ @@@@@ @@@ @ @@@@ @@@ @@@ ",
"@@@ @@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ ",
"@@@ @@@@@ @@@ @@@@@ @@@@ @@@@ @@@@@@@@@@ @@@@ @@@ ",
"@@@@ @@@@@@@@@@@@@@@@ @@@ @@@ @@ @@@@@@@@@@@@ @@@ ",
" @@@@ @@@@@@@@@@@@@@@@ @@@ @@ @@@@@@@@@@@@ @@@ ",
" @@@@@@ @@@@@ @@@ @@ @ @@ @@ @@@@ @@@@ ",
" @@@@@@@@@@@@@ @@@ @@ @@ @@ @@@@@@@@@@@ ",
" @@@@@@@@@@@@ @@@ @@ @@@ @ @@@@@@@@ ",
" @@ @@ @@@ @@ @@@ ",
" @ @@ @@ @@@ ",
" @@@ @@@ ",
" @@@ ",
""
]
splash_lines = [
"-- ESP32 C5 Flasher --",
"By AWOK",
"Inspired from LordSkeletonMans ESP32 FZEasyFlasher",
"Shout out to JCMK for the inspiration on setting up the C5",
""
]
print(Fore.MAGENTA + "\n" + "\n".join(center(line) for line in logo_lines + splash_lines) + Style.RESET_ALL)
# Wait for ESP32 device to show up as a new serial port
existing_ports = set([port.device for port in serial.tools.list_ports.comports()])
print(Fore.YELLOW + "Waiting for ESP32-C5 device to be connected..." + Style.RESET_ALL)
while True:
current_ports = set([port.device for port in serial.tools.list_ports.comports()])
new_ports = current_ports - existing_ports
if new_ports:
serial_port = new_ports.pop()
break
time.sleep(0.5)
print(Fore.GREEN + f"Detected ESP32-C5 on port: {serial_port}" + Style.RESET_ALL)
# Find bin files for each firmware component
bootloader = find_file(['bootloader.bin'], bins_dir)
partitions = find_file(['partition-table.bin', 'partitions.bin'], bins_dir)
ota_data = find_file(['ota_data_initial.bin'], bins_dir)
# Main firmware: largest bin in the folder that's not bootloader, partition, or OTA
all_bins = glob.glob(os.path.join(bins_dir, "*.bin"))
exclude = {bootloader, partitions, ota_data}
firmware_bins = [f for f in all_bins if f not in exclude and os.path.isfile(f)]
if not firmware_bins:
print(Fore.RED + "No application firmware .bin file found in the 'bins' folder!" + Style.RESET_ALL)
exit(1)
app_bin = max(firmware_bins, key=lambda f: os.path.getsize(f))
# Print summary, ask for confirmation before flashing
print(Fore.CYAN + f"\nBootloader: {bootloader or 'NOT FOUND'}")
print(f"Partitions: {partitions or 'NOT FOUND'}")
print(f"OTA Data: {ota_data or 'NOT FOUND'}")
print(f"App (main): {app_bin}\n" + Style.RESET_ALL)
if not (bootloader and partitions):
print(Fore.RED + "Missing bootloader or partition table. Both are required for a complete flash!" + Style.RESET_ALL)
exit(1)
confirm = input(Fore.YELLOW + "Ready to flash these files to ESP32-C5? (y/N): " + Style.RESET_ALL)
if confirm.strip().lower() != 'y':
print("Aborting.")
exit(0)
# Flash using esptool, with offsets for C5
esptool_args = [
'--chip', 'esp32c5',
'--port', serial_port,
'--baud', '921600',
'--before', 'default_reset',
'--after', 'hard_reset',
'write_flash', '-z',
'0x2000', bootloader,
'0x8000', partitions,
]
if ota_data:
esptool_args += ['0xd000', ota_data]
esptool_args += ['0x10000', app_bin]
print(Fore.YELLOW + "Flashing ESP32-C5 with bootloader, partition table, and application..." + Style.RESET_ALL)
try:
esptool.main(esptool_args)
print(Fore.GREEN + "Flashing complete!" + Style.RESET_ALL)
except Exception as e:
print(Fore.RED + f"Flashing failed: {e}" + Style.RESET_ALL)
if __name__ == "__main__":
main()

1
FlashFiles/flash_cmd.txt Normal file
View File

@@ -0,0 +1 @@
./esptool.exe --chip esp32 --port COM4 --baud 921600 write_flash -z 0x1000 /c/Users/culrP/Downloads/esp32_marauder.ino.bootloader.bin 0x8000 /c/Users/culrP/Downloads/esp32_marauder.ino.partitions.bin 0xE000 /c/Users/culrP/Downloads/boot_app0.bin 0x10000 /c/Users/culrP/Downloads/esp32_marauder_v1_8_9_20251030_v6_1.bin

View File

@@ -28,11 +28,14 @@
//#include <User_Setup_marauder_m5stickc.h>
//#include <User_Setup_marauder_m5stickcp2.h>
//#include <User_Setup_pocket_sdr.h>
//#include <User_Setup_dual_nrf24.h> // Marauder v7
//#include <User_Setup_pocket_sdr_2.h> // Drone Signal Analyzer
//#include <User_Setup_dual_nrf24.h>
//#include <User_Setup_pocket_sdr_2.h>
//#include <User_Setup_pocket_sdr_3.h>
//#include <User_Setup_cyd_micro.h>
//#include <User_Setup_cyd_guition.h>
#include <User_Setup_cyd_2usb.h>
//#include <User_Setup_cyd_2usb.h>
//#include <User_Setup_marauder_m5cardputer.h>
//#include <User_Setup_cyd_3_5_inch.h>
//#include <User_Setups/Setup1_ILI9341.h> // Setup file configured for my ILI9341
//#include <User_Setups/Setup2_ST7735.h> // Setup file configured for my ST7735

299
User_Setup_cyd_3_5_inch.h Normal file
View File

@@ -0,0 +1,299 @@
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Display type - only define if RPi display
//#define RPI_DRIVER
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER // OG Marauder
//#define ST7735_DRIVER // Marauder Mini // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
#define ST7796_DRIVER
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH 80
// #define TFT_WIDTH 128 // Marauder Mini
#define TFT_WIDTH 320 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128 // Marauder Mini
// #define TFT_HEIGHT 240 // ST7789 240 x 240
#define TFT_HEIGHT 480 // ST7789 240 x 320
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
// #define TFT_BACKLIGHT_ON LOW // HIGH or LOW are options
// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
//#define TFT_CS PIN_D8 // Chip select control pin D8
//#define TFT_DC PIN_D3 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line wjen chip select is high!
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
// Marauder Mini
/*
#define TFT_CS 17 // Chip select control pin D8
#define TFT_DC 16 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_BL 32
*/
// ESP32 Marauder
#define TFT_MISO 12
#define TFT_MOSI 13
#define TFT_SCLK 14
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST -1 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TFT_BL 27 // LED back-light (only for ST7789 with backlight control pin)
#define TOUCH_CS 33 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported on ESP32
// Uncomment line below to use ESP32 Parallel interface instead of SPI
//#define ESP32_PARALLEL
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.
// #define SPI_FREQUENCY 1000000
//#define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Marauder // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS

View File

@@ -0,0 +1,328 @@
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Display type - only define if RPi display
//#define RPI_DRIVER
#define CGRAM_OFFSET
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER // OG Marauder
//#define ST7735_DRIVER // Marauder Mini // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH 80
#define TFT_WIDTH 135 // Marauder Mini
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
#define TFT_HEIGHT 240 // Marauder Mini
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
#define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options
// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
//#define TFT_CS PIN_D8 // Chip select control pin D8
//#define TFT_DC PIN_D3 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line wjen chip select is high!
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
// M5 Cardputer
#define TFT_BL 38
#define TFT_RST 33 // Reset pin (could connect to NodeMCU RST, see next line)
#define TFT_DC 34 // Data Command control pin
#define TFT_MOSI 35
#define TFT_SCLK 36
#define TFT_CS 37 // Chip select control pin D8
#define TOUCH_CS -1
// #define TFT_MISO -1
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
/*
// ESP32 Marauder
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 17 // Chip select control pin
#define TFT_DC 16 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
*/
/////////////////////////////
// ESP32 Centauri
/*
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 27 // Chip select control pin
#define TFT_DC 26 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
*/
/////////////////////////////
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported on ESP32
// Uncomment line below to use ESP32 Parallel interface instead of SPI
//#define ESP32_PARALLEL
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.
// #define SPI_FREQUENCY 1000000
//#define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
#define SPI_FREQUENCY 20000000
//#define SPI_FREQUENCY 27000000 // Marauder // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS

330
User_Setup_pocket_sdr_3.h Normal file
View File

@@ -0,0 +1,330 @@
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Display type - only define if RPi display
//#define RPI_DRIVER
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER // OG Marauder
#define ST7735_DRIVER // Marauder Mini // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
#define TFT_WIDTH 80
// #define TFT_WIDTH 128 // Marauder Mini
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
#define TFT_HEIGHT 160
// #define TFT_HEIGHT 128 // Marauder Mini
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
#define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
#define TFT_INVERSION_OFF
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
#define TFT_BACKLIGHT_ON LOW // HIGH or LOW are options
// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
//#define TFT_CS PIN_D8 // Chip select control pin D8
//#define TFT_DC PIN_D3 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line wjen chip select is high!
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
// Marauder Mini
// Drone Detector v1
#define TFT_CS 23 // Chip select control pin D8
#define TFT_DC 24 // Data Command control pin
#define TFT_RST -1 // Reset pin (could connect to NodeMCU RST, see next line)
#define TOUCH_CS -1
//#define TFT_MISO 16
#define TFT_MOSI 7
#define TFT_SCLK 6
#define TFT_BL 27
// Drone Detector v2
/*
#define TFT_CS 17 // Chip select control pin D8
#define TFT_DC 26 // Data Command control pin
#define TFT_RST -1 // Reset pin (could connect to NodeMCU RST, see next line)
#define TOUCH_CS -1
//#define TFT_MISO 16
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_BL 32
*/
/*
// ESP32 Marauder
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 17 // Chip select control pin
#define TFT_DC 16 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
*/
/////////////////////////////
// ESP32 Centauri
/*
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 27 // Chip select control pin
#define TFT_DC 26 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
*/
/////////////////////////////
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported on ESP32
// Uncomment line below to use ESP32 Parallel interface instead of SPI
//#define ESP32_PARALLEL
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.
// #define SPI_FREQUENCY 1000000
//#define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Marauder // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
//#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
//#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS

View File

@@ -221,7 +221,25 @@ PROGMEM static const unsigned char menu_icons[][66] = {
0x3B, 0x77, 0x37, 0xBD, 0x6A, 0x2F, 0xD6, 0xBD, 0x1A, 0xDA, 0xDA, 0x16,
0x5A, 0x6F, 0x16, 0x9A, 0xF7, 0x16, 0xD6, 0x5A, 0x1A, 0xDD, 0xBD, 0x2E,
0xBB, 0x5A, 0x37, 0x3F, 0x6F, 0x3F, 0x7F, 0xB7, 0x3F, 0xFF, 0xCC, 0x3F,
0xFF, 0xF3, 0x3F, 0xFF, 0xFF, 0x3F}
0xFF, 0xF3, 0x3F, 0xFF, 0xFF, 0x3F},
{0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0x87, 0xF7, // JOINED: 38
0x7F, 0xEE, 0xFF, 0xED, 0xC7, 0xDD, 0xBF, 0xDB, 0x7F, 0xDB, 0x67, 0xDB,
0x67, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0x1F, 0xF8, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, // FORCE: 39
0x67, 0xE6, 0x77, 0xEE, 0x87, 0xE0, 0x8F, 0xF1, 0x0F, 0xF0, 0x4F, 0xF5,
0x1F, 0xF8, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, // FUNNY BEACON: 40
0xDF, 0xFF, 0x3E, 0xEF, 0xFF, 0x3D, 0x77, 0xBF, 0x3B, 0x77, 0x3E, 0x3B,
0x7B, 0x3E, 0x37, 0x7B, 0xBF, 0x37, 0xFB, 0xF7, 0x37, 0xFB, 0xF7, 0x37,
0xFB, 0xF3, 0x37, 0xBB, 0x7F, 0x37, 0x37, 0x3F, 0x3B, 0x77, 0x80, 0x3B,
0xEF, 0xE1, 0x3D, 0xDF, 0xFF, 0x3E, 0x3F, 0x3F, 0x3F, 0xFF, 0xC0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F},
{0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x3F, 0x3F, 0x9F, 0x3F, 0xBF, 0xBF, 0x3F, // FLOCK: 41
0xDF, 0x71, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x7B, 0x3F, 0xDF, 0x7F, 0x3F, 0xDF, 0x7F, 0x3F,
0xDF, 0x7F, 0x3F, 0xBF, 0xBF, 0x3F, 0xBF, 0xBB, 0x3F, 0x3F, 0x9B, 0x3F,
0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0xFF, 0xE0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F}
};
/*#ifndef MARAUDER_MINI

View File

@@ -26,63 +26,41 @@ void BatteryInterface::RunSetup() {
#ifdef HAS_BATTERY
Wire.begin(I2C_SDA, I2C_SCL);
Serial.println("Checking for battery monitors...");
Wire.beginTransmission(IP5306_ADDR);
error = Wire.endTransmission();
#ifndef HAS_AXP2101
Wire.begin(I2C_SDA, I2C_SCL);
if (error == 0) {
Serial.println("Detected IP5306");
this->has_ip5306 = true;
this->i2c_supported = true;
}
Wire.beginTransmission(MAX17048_ADDR);
error = Wire.endTransmission();
if (error == 0) {
if (maxlipo.begin()) {
Serial.println("Detected MAX17048");
this->has_max17048 = true;
this->i2c_supported = true;
}
}
/*for(addr = 1; addr < 127; addr++ ) {
Wire.beginTransmission(addr);
Wire.beginTransmission(IP5306_ADDR);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (addr<16)
Serial.print("0");
if (error == 0) {
Serial.println("Detected IP5306");
this->has_ip5306 = true;
this->i2c_supported = true;
}
Serial.println(addr,HEX);
if (addr == IP5306_ADDR) {
this->has_ip5306 = true;
Wire.beginTransmission(MAX17048_ADDR);
error = Wire.endTransmission();
if (error == 0) {
if (maxlipo.begin()) {
Serial.println("Detected MAX17048");
this->has_max17048 = true;
this->i2c_supported = true;
}
if (addr == MAX17048_ADDR) {
if (maxlipo.begin()) {
Serial.println("Detected MAX17048");
this->has_max17048 = true;
this->i2c_supported = true;
}
}
}
}*/
#else
bool result = this->power.begin(Wire, AXP2101_SLAVE_ADDRESS, I2C_SDA, I2C_SCL);
if (!result)
return;
Serial.println("Detected AXP2101");
/*if (this->maxlipo.begin()) {
Serial.println("Detected MAX17048");
this->has_max17048 = true;
this->i2c_supported = true;
}*/
this->has_axp2101 = true;
#endif
this->initTime = millis();
#endif
@@ -120,4 +98,10 @@ int8_t BatteryInterface::getBatteryLevel() {
else
return percent;
}
#ifdef HAS_AXP2101
if (this->has_axp2101) {
return this->power.getBatteryPercent();
}
#endif
}

View File

@@ -8,6 +8,11 @@
#include "configs.h"
#include "Adafruit_MAX1704X.h"
#ifdef HAS_AXP2101
#define XPOWERS_CHIP_AXP2101
#include "XPowersLib.h"
#endif
#include <Wire.h>
#define IP5306_ADDR 0x75
@@ -18,12 +23,17 @@ class BatteryInterface {
uint32_t initTime = 0;
Adafruit_MAX17048 maxlipo;
#ifdef HAS_AXP2101
XPowersPMU power;
#endif
public:
int8_t battery_level = 0;
int8_t old_level = 0;
bool i2c_supported = false;
bool has_max17048 = false;
bool has_ip5306 = false;
bool has_axp2101 = false;
BatteryInterface();

View File

@@ -6,7 +6,7 @@ Buffer::Buffer(){
bufB = (uint8_t*)malloc(BUF_SIZE);
}
void Buffer::createFile(String name, bool is_pcap){
void Buffer::createFile(String name, bool is_pcap, bool is_gpx){
int i=0;
if (is_pcap) {
do{
@@ -14,12 +14,18 @@ void Buffer::createFile(String name, bool is_pcap){
i++;
} while(fs->exists(fileName));
}
else {
else if ((!is_pcap) && (!is_gpx)) {
do{
fileName = "/"+name+"_"+(String)i+".log";
i++;
} while(fs->exists(fileName));
}
else {
do{
fileName = "/"+name+"_"+(String)i+".gpx";
i++;
} while(fs->exists(fileName));
}
Serial.println(fileName);
@@ -46,7 +52,7 @@ void Buffer::open(bool is_pcap){
}
}
void Buffer::openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap) {
void Buffer::openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap, bool is_gpx) {
bool save_pcap = settings_obj.loadSetting<bool>("SavePCAP");
if (!save_pcap) {
this->fs = NULL;
@@ -57,7 +63,7 @@ void Buffer::openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap) {
this->fs = fs;
this->serial = serial;
if (this->fs) {
createFile(file_name, is_pcap);
createFile(file_name, is_pcap, is_gpx);
}
if (this->fs || this->serial) {
open(is_pcap);
@@ -74,6 +80,10 @@ void Buffer::logOpen(String file_name, fs::FS* fs, bool serial) {
openFile(file_name, fs, serial, false);
}
void Buffer::gpxOpen(String file_name, fs::FS* fs, bool serial) {
openFile(file_name, fs, serial, false, true);
}
void Buffer::add(const uint8_t* buf, uint32_t len, bool is_pcap){
// buffer is full -> drop packet
if((useA && bufSizeA + len >= BUF_SIZE && bufSizeB > 0) || (!useA && bufSizeB + len >= BUF_SIZE && bufSizeA > 0)){

View File

@@ -21,13 +21,14 @@ class Buffer {
Buffer();
void pcapOpen(String file_name, fs::FS* fs, bool serial);
void logOpen(String file_name, fs::FS* fs, bool serial);
void gpxOpen(String file_name, fs::FS* fs, bool serial);
void append(wifi_promiscuous_pkt_t *packet, int len);
void append(String log);
void save();
private:
void createFile(String name, bool is_pcap);
void createFile(String name, bool is_pcap, bool is_gpx = false);
void open(bool is_pcap);
void openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap);
void openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap, bool is_gpx = false);
void add(const uint8_t* buf, uint32_t len, bool is_pcap);
void write(int32_t n);
void write(uint32_t n);

View File

@@ -217,10 +217,16 @@ void CommandLine::runCommand(String input) {
Serial.println(HELP_GPS_DATA_CMD);
Serial.println(HELP_GPS_CMD);
Serial.println(HELP_NMEA_CMD);
Serial.println(HELP_GPS_POI_CMD);
Serial.println(HELP_GPS_TRACKER_CMD);
// WiFi sniff/scan
Serial.println(HELP_EVIL_PORTAL_CMD);
Serial.println(HELP_KARMA_CMD);
Serial.println(HELP_PACKET_COUNT_CMD);
Serial.println(HELP_PING_CMD);
Serial.println(HELP_ARP_SCAN_CMD);
Serial.println(HELP_PORT_SCAN_CMD);
Serial.println(HELP_SIGSTREN_CMD);
Serial.println(HELP_SCAN_ALL_CMD);
Serial.println(HELP_SCANAP_CMD);
@@ -248,11 +254,18 @@ void CommandLine::runCommand(String input) {
Serial.println(HELP_LIST_AP_CMD_B);
Serial.println(HELP_LIST_AP_CMD_C);
Serial.println(HELP_LIST_AP_CMD_D);
Serial.println(HELP_LIST_AP_CMD_E);
Serial.println(HELP_LIST_AP_CMD_F);
Serial.println(HELP_SEL_CMD_A);
Serial.println(HELP_SSID_CMD_A);
Serial.println(HELP_SSID_CMD_B);
Serial.println(HELP_SAVE_CMD);
Serial.println(HELP_LOAD_CMD);
Serial.println(HELP_JOIN_CMD);
Serial.println(HELP_MAC_CMD_A);
Serial.println(HELP_MAC_CMD_B);
Serial.println(HELP_MAC_CMD_C);
Serial.println(HELP_MAC_CMD_D);
// Bluetooth sniff/scan
#ifdef HAS_BT
@@ -282,21 +295,28 @@ void CommandLine::runCommand(String input) {
// web_obj.shutdownServer();
// return;
//}
int f_arg = this->argSearch(&cmd_args, "-f");
uint8_t old_scan_mode=wifi_scan_obj.currentScanMode;
if (f_arg != -1) {
WiFi.disconnect(true);
delay(100);
}
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
if(old_scan_mode == WIFI_SCAN_GPS_NMEA)
Serial.println("END OF NMEA STREAM");
Serial.println(F("END OF NMEA STREAM"));
else if(old_scan_mode == WIFI_SCAN_GPS_DATA)
Serial.println("Stopping GPS data updates");
Serial.println(F("Stopping GPS data updates"));
else
Serial.println("Stopping WiFi tran/recv");
Serial.println(F("Stopping WiFi tran/recv"));
// If we don't do this, the text and button coordinates will be off
#ifdef HAS_SCREEN
display_obj.tft.init();
display_obj.init();
menu_function_obj.changeMenu(menu_function_obj.current_menu);
#endif
}
@@ -316,6 +336,7 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int get_arg = this->argSearch(&cmd_args, "-g");
int track_arg = this->argSearch(&cmd_args, "-t");
int nmea_arg = this->argSearch(&cmd_args, "-n");
if (get_arg != -1) {
@@ -354,7 +375,7 @@ void CommandLine::runCommand(String input) {
Serial.println(gps_obj.getNmeaNotparsed());
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if(nmea_arg != -1){
String nmea_type = cmd_args.get(nmea_arg + 1);
@@ -370,12 +391,19 @@ void CommandLine::runCommand(String input) {
Serial.println("GPS Output Type Set To: " + nmea_type);
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if (track_arg != -1) {
wifi_scan_obj.currentScanMode = GPS_TRACKER;
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
#endif
wifi_scan_obj.StartScan(GPS_TRACKER, TFT_CYAN);
}
else if(cmd_args.size()>1)
Serial.println("You did not provide a valid flag");
Serial.println(F("You did not provide a valid flag"));
else
Serial.println("You did not provide an argument");
Serial.println(F("You did not provide an argument"));
}
#endif
}
@@ -385,7 +413,7 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
#endif
Serial.println("NMEA STREAM FOLLOWS");
Serial.println(F("NMEA STREAM FOLLOWS"));
wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_NMEA;
wifi_scan_obj.StartScan(WIFI_SCAN_GPS_NMEA, TFT_CYAN);
}
@@ -416,7 +444,7 @@ void CommandLine::runCommand(String input) {
}
}
#else
Serial.println("This hardware does not support neopixel");
Serial.println(F("This hardware does not support neopixel"));
#endif
}
// ls command
@@ -425,9 +453,9 @@ void CommandLine::runCommand(String input) {
if (cmd_args.size() > 1)
sd_obj.listDir(cmd_args.get(1));
else
Serial.println("You did not provide a dir to list");
Serial.println(F("You did not provide a dir to list"));
#else
Serial.println("SD support disabled, cannot use command");
Serial.println(F("SD support disabled, cannot use command"));
return;
#endif
}
@@ -496,7 +524,7 @@ void CommandLine::runCommand(String input) {
else if (da_sw != -1)
result = settings_obj.saveSetting<bool>(setting_name, false);
else {
Serial.println("You did not properly enable/disable this setting.");
Serial.println(F("You did not properly enable/disable this setting."));
return;
}
@@ -508,7 +536,7 @@ void CommandLine::runCommand(String input) {
}
else if (cmd_args.get(0) == REBOOT_CMD) {
Serial.println("Rebooting...");
Serial.println(F("Rebooting..."));
ESP.restart();
}
@@ -541,8 +569,25 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int sta_sw = this->argSearch(&cmd_args, "-s");
int flk_sw = this->argSearch(&cmd_args, "-f");
if (sta_sw == -1) {
if (flk_sw == -1) {
Serial.println("Starting Flock Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLOCK_WARDRIVE, TFT_GREEN);
}
else if (sta_sw != -1) {
Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_STATION_WAR_DRIVE, TFT_GREEN);
}
else {
Serial.println("Starting Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
@@ -550,20 +595,44 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_WAR_DRIVE, TFT_GREEN);
}
else {Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_STATION_WAR_DRIVE, TFT_GREEN);
}
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
}
// Karma
else if (cmd_args.get(0) == KARMA_CMD) {
int pr_sw = this->argSearch(&cmd_args, "-p");
if (pr_sw == -1) {
Serial.println(F("You did not provide a target index"));
return;
}
int pr_index = cmd_args.get(pr_sw + 1).toInt();
if ((pr_index < 0) || (pr_index > probe_req_ssids->size() - 1)) {
Serial.println(F("The provided index was not in range"));
return;
}
if (evil_portal_obj.setAP(probe_req_ssids->get(pr_index).essid)) {
Serial.println("Starting Karma Attack with " + probe_req_ssids->get(pr_index).essid + ". Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_EVIL_PORTAL, TFT_ORANGE);
wifi_scan_obj.setMac();
}
else {
Serial.println(F("Unable to set AP ESSID"));
return;
}
}
// AP Scan
else if (cmd_args.get(0) == EVIL_PORTAL_CMD) {
int cmd_sw = this->argSearch(&cmd_args, "-c");
@@ -604,7 +673,15 @@ void CommandLine::runCommand(String input) {
evil_portal_obj.setHtmlFromSerial();
}
else if (et_command == "setap") {
int target_ap_index = cmd_args.get(cmd_sw + 2).toInt();
if ((target_ap_index >= 0) && (target_ap_index < access_points->size())) {
evil_portal_obj.setAP(access_points->get(target_ap_index).essid);
AccessPoint new_ap = access_points->get(target_ap_index);
new_ap.selected = true;
access_points->set(target_ap_index, new_ap);
evil_portal_obj.ap_index = target_ap_index;
}
}
}
}
@@ -746,6 +823,81 @@ void CommandLine::runCommand(String input) {
}
}
//// MAC Address commands (Added by H4W9_4)
// Generate random MAC for AP
if (cmd_args.get(0) == MAC_CMD_A) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.RunGenerateRandomMac(true);
}
// Generate random MAC for STA
else if (cmd_args.get(0) == MAC_CMD_B) {
//Serial.println("Setting STA MAC: " + macToString(this->sta_mac));
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.RunGenerateRandomMac(false);
}
// Clone MAC for AP
else if (cmd_args.get(0) == MAC_CMD_C) {
int ap_sw = this->argSearch(&cmd_args, "-a"); // APs
if (ap_sw == -1) {
Serial.println(F("You did not provide a target index"));
return;
}
int ap_index = cmd_args.get(ap_sw + 1).toInt();
if ((ap_index < 0) || (ap_index > access_points->size() - 1)) {
Serial.println(F("The provided index was not in range"));
return;
}
if (ap_sw != -1) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
int filter_ap = cmd_args.get(ap_sw + 1).toInt();
wifi_scan_obj.RunSetMac(access_points->get(filter_ap).bssid, true);
}
}
// Clone MAC for STA
else if (cmd_args.get(0) == MAC_CMD_D) {
int cl_sw = this->argSearch(&cmd_args, "-s"); // Stations
if (cl_sw == -1) {
Serial.println(F("You did not provide a target index"));
return;
}
int sta_index = cmd_args.get(cl_sw + 1).toInt();
if ((sta_index < 0) || (sta_index > stations->size() - 1)) {
Serial.println(F("The provided index was not in range"));
return;
}
if (cl_sw != -1) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
int filter_sta = cmd_args.get(cl_sw + 1).toInt();
wifi_scan_obj.RunSetMac(stations->get(filter_sta).mac, false);
}
}
//// End MAC Address commands (Added by H4W9_4)
//// WiFi attack commands
// attack
if (cmd_args.get(0) == ATTACK_CMD) {
@@ -758,7 +910,7 @@ void CommandLine::runCommand(String input) {
int targ_sw = this->argSearch(&cmd_args, "-c");
if (attack_type_switch == -1) {
Serial.println("You must specify an attack type");
Serial.println(F("You must specify an attack type"));
return;
}
else {
@@ -769,7 +921,7 @@ void CommandLine::runCommand(String input) {
if (attack_type == ATTACK_TYPE_DEAUTH) {
// Default to broadcast
if ((dst_addr_sw == -1) && (targ_sw == -1)) {
Serial.println("Sending to broadcast...");
Serial.println(F("Sending to broadcast..."));
wifi_scan_obj.dst_mac = "ff:ff:ff:ff:ff:ff";
}
// Dest addr specified
@@ -779,7 +931,7 @@ void CommandLine::runCommand(String input) {
}
// Station list specified
else if (targ_sw != -1)
Serial.println("Sending to Station list");
Serial.println(F("Sending to Station list"));
// Source addr not specified
if (src_addr_sw == -1) {
@@ -813,6 +965,47 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH_MANUAL, TFT_RED);
}
}
// Bad Msg
else if (attack_type == ATTACK_TYPE_BM) {
// Attack all
if (targ_sw == -1) {
Serial.println("Starting Bad Msg attack against all stations. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_BAD_MSG, TFT_RED);
}
// Target clients
else {
Serial.println("Starting targeted Bad Msg attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_BAD_MSG_TARGETED, TFT_YELLOW);
}
}
else if (attack_type == ATTACK_TYPE_S) {
// Attack all
if (targ_sw == -1) {
Serial.println("Starting Sleep attack against all stations. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_SLEEP, TFT_RED);
}
// Target clients
else {
Serial.println("Starting targeted Sleep attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_SLEEP_TARGETED, TFT_MAGENTA);
}
}
// Beacon
else if (attack_type == ATTACK_TYPE_BEACON) {
// spam by list
@@ -874,8 +1067,16 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_RICK_ROLL, TFT_YELLOW);
}
else if (attack_type == ATTACK_TYPE_FUNNY) {
Serial.println("Starting Funny SSID Beacon spam. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_FUNNY_BEACON, TFT_CYAN);
}
else {
Serial.println("Attack type not properly defined");
Serial.println(F("Attack type not properly defined"));
return;
}
}
@@ -910,6 +1111,14 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLIPPER, TFT_ORANGE);
}
else if (bt_type == "flock") {
Serial.println("Starting Flock sniff. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLOCK, TFT_ORANGE);
}
}
// General bluetooth sniff
else {
@@ -921,7 +1130,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SCAN_ALL, TFT_GREEN);
}
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (cmd_args.get(0) == BT_SPOOFAT_CMD) {
@@ -966,7 +1175,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SOUR_APPLE, TFT_GREEN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "windows") {
@@ -978,7 +1187,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SWIFTPAIR_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "samsung") {
@@ -990,7 +1199,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SAMSUNG_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "google") {
@@ -1002,7 +1211,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_GOOGLE_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "flipper") {
@@ -1014,7 +1223,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_FLIPPER_SPAM, TFT_ORANGE);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "all") {
@@ -1026,62 +1235,14 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SPAM_ALL, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else {
Serial.println("You did not specify a correct spam type");
Serial.println(F("You did not specify a correct spam type"));
}
}
}
/*else if (cmd_args.get(0) == BT_SOUR_APPLE_CMD) {
#ifdef HAS_BT
Serial.println("Starting Sour Apple attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SOUR_APPLE, TFT_GREEN);
#else
Serial.println("Bluetooth not supported");
#endif
}
else if (cmd_args.get(0) == BT_SWIFTPAIR_SPAM_CMD) {
#ifdef HAS_BT
Serial.println("Starting Swiftpair Spam attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SWIFTPAIR_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
#endif
}
else if (cmd_args.get(0) == BT_SAMSUNG_SPAM_CMD) {
#ifdef HAS_BT
Serial.println("Starting Samsung Spam attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SAMSUNG_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
#endif
}
else if (cmd_args.get(0) == BT_SPAM_ALL_CMD) {
#ifdef HAS_BT
Serial.println("Starting BT Spam All attack. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SPAM_ALL, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
#endif
}*/
// Wardrive
else if (cmd_args.get(0) == BT_WARDRIVE_CMD) {
#ifdef HAS_BT
@@ -1106,12 +1267,12 @@ void CommandLine::runCommand(String input) {
}
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
@@ -1125,7 +1286,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_SCAN_SKIMMERS, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
@@ -1147,19 +1308,159 @@ void CommandLine::runCommand(String input) {
if (sd_sw != -1) {
#ifdef HAS_SD
if (!sd_obj.supported) {
Serial.println("SD card is not connected. Cannot perform SD Update");
Serial.println(F("SD card is not connected. Cannot perform SD Update"));
return;
}
wifi_scan_obj.currentScanMode = OTA_UPDATE;
sd_obj.runUpdate();
#else
Serial.println("SD card support disabled. Cannot perform SD Update");
Serial.println(F("SD card support disabled. Cannot perform SD Update"));
return;
#endif
}
}
}
if (wifi_scan_obj.wifi_connected) {
// Ping Scan
if (cmd_args.get(0) == PING_CMD) {
Serial.println("Starting Ping Scan. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_PING_SCAN, TFT_GREEN);
}
if (cmd_args.get(0) == ARP_SCAN_CMD) {
#ifndef HAS_DUAL_BAND
Serial.println("Starting ARP Scan. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ARP_SCAN, TFT_CYAN);
#endif
}
// GPS POI
if (cmd_args.get(0) == GPS_POI_CMD) {
#ifdef HAS_GPS
int start_sw = this->argSearch(&cmd_args, "-s");
int mark_sw = this->argSearch(&cmd_args, "-m");
int end_sw = this->argSearch(&cmd_args, "-e");
if (start_sw != -1) {
wifi_scan_obj.StartScan(GPS_POI, TFT_CYAN);
wifi_scan_obj.currentScanMode = WIFI_SCAN_OFF;
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsPOIMenu);
#endif
}
else if (mark_sw != -1) {
wifi_scan_obj.currentScanMode = GPS_POI;
#ifdef HAS_SCREEN
display_obj.tft.setCursor(0, TFT_HEIGHT / 2);
display_obj.clearScreen();
#endif
if (wifi_scan_obj.RunGPSInfo(true, false, true)) {
#ifdef HAS_SCREEN
display_obj.showCenterText("POI Logged", TFT_HEIGHT / 2);
#endif
}
else {
#ifdef HAS_SCREEN
display_obj.showCenterText("POI Log Failed", TFT_HEIGHT / 2);
#endif
}
wifi_scan_obj.currentScanMode = WIFI_SCAN_OFF;
delay(2000);
//wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsPOIMenu);
#endif
}
else if (end_sw != -1) {
wifi_scan_obj.currentScanMode = GPS_POI;
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(menu_function_obj.gpsPOIMenu.parentMenu);
#endif
}
#else
Serial.println(F("Your hardware doesn't have GPS, silly"));
return;
#endif
}
// Port Scan
if (cmd_args.get(0) == PORT_SCAN_CMD) {
int all_sw = this->argSearch(&cmd_args, "-a");
int ip_sw = this->argSearch(&cmd_args, "-t");
int port_sw = this->argSearch(&cmd_args, "-s");
// Check they specified ip index
if (ip_sw != -1) {
int ip_index = cmd_args.get(ip_sw + 1).toInt();
// Check provided index is in list
if (ip_index < ipList->size()) {
// Full port scan
if (all_sw != -1) {
Serial.println("Selected: " + ipList->get(ip_index).toString());
wifi_scan_obj.current_scan_ip = ipList->get(ip_index);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_PORT_SCAN_ALL, TFT_BLUE);
}
}
else {
Serial.println(F("The IP index specified is out of range"));
return;
}
}
else if (port_sw != -1) {
String port_name = cmd_args.get(port_sw + 1);
port_name.toUpperCase();
uint8_t target_mode = 0;
if (port_name == "SSH")
target_mode = WIFI_SCAN_SSH;
else if (port_name == "TELNET")
target_mode = WIFI_SCAN_TELNET;
else if (port_name == "DNS")
target_mode = WIFI_SCAN_DNS;
else if (port_name == "HTTP")
target_mode = WIFI_SCAN_HTTP;
else if (port_name == "SMTP")
target_mode = WIFI_SCAN_SMTP;
else if (port_name == "HTTPS")
target_mode = WIFI_SCAN_HTTPS;
else if (port_name == "RDP")
target_mode = WIFI_SCAN_RDP;
if (target_mode != 0) {
Serial.println("Starting port scan for service " + port_name);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(target_mode, TFT_CYAN);
}
else {
Serial.println(F("You did not specify a supported service"));
return;
}
}
else {
Serial.println(F("You did not specify an IP index"));
return;
}
}
}
int count_selected = 0;
//// WiFi aux commands
@@ -1169,6 +1470,8 @@ void CommandLine::runCommand(String input) {
int ss_sw = this->argSearch(&cmd_args, "-s");
int cl_sw = this->argSearch(&cmd_args, "-c");
int at_sw = this->argSearch(&cmd_args, "-t");
int ip_sw = this->argSearch(&cmd_args, "-i");
int pr_sw = this->argSearch(&cmd_args, "-p");
// List APs
if (ap_sw != -1) {
@@ -1182,6 +1485,18 @@ void CommandLine::runCommand(String input) {
}
this->showCounts(count_selected);
}
// List IPs
else if (ip_sw != -1) {
for (int i = 0; i < ipList->size(); i++) {
Serial.println("[" + (String)i + "] " + ipList->get(i).toString());
}
}
// List Probes
else if (pr_sw != -1) {
for (int i = 0; i < probe_req_ssids->size(); i++) {
Serial.println("[" + (String)i + "] " + probe_req_ssids->get(i).essid);
}
}
// List SSIDs
else if (ss_sw != -1) {
for (int i = 0; i < ssids->size(); i++) {
@@ -1222,7 +1537,7 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("You did not specify which list to show");
Serial.println(F("You did not specify which list to show"));
return;
}
}
@@ -1241,6 +1556,43 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.RunInfo();
}
}
else if (cmd_args.get(0) == JOIN_CMD) {
int ap_sw = this->argSearch(&cmd_args, "-a");
int pw_sw = this->argSearch(&cmd_args, "-p");
int s_sw = this->argSearch(&cmd_args, "-s");
if ((ap_sw != -1) && (pw_sw != -1)) {
int index = cmd_args.get(ap_sw + 1).toInt();
String password = cmd_args.get(pw_sw + 1);
Serial.println("Using SSID: " + (String)access_points->get(index).essid + " Password: " + (String)password);
//wifi_scan_obj.currentScanMode = LV_JOIN_WIFI;
//wifi_scan_obj.StartScan(LV_JOIN_WIFI, TFT_YELLOW);
wifi_scan_obj.joinWiFi(access_points->get(index).essid, password, false);
#ifdef HAS_SCREEN
#ifdef HAS_MINI_KB
menu_function_obj.changeMenu(menu_function_obj.current_menu);
#endif
#endif
}
else if (s_sw != -1) {
String ssid = settings_obj.loadSetting<String>("ClientSSID");
String pw = settings_obj.loadSetting<String>("ClientPW");
if ((ssid != "") && (pw != "")) {
wifi_scan_obj.joinWiFi(ssid, pw, false);
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(menu_function_obj.current_menu);
#endif
}
else {
Serial.println(F("There are no saved WiFi credentials"));
}
}
else {
Serial.println(F("You did not provide the proper args"));
return;
}
}
// Select access points or stations
else if (cmd_args.get(0) == SEL_CMD) {
// Get switches
@@ -1407,7 +1759,7 @@ void CommandLine::runCommand(String input) {
this->showCounts(count_selected, count_unselected);
}
else {
Serial.println("You did not specify which list to select from");
Serial.println(F("You did not specify which list to select from"));
return;
}
}
@@ -1466,7 +1818,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.addSSID(essid);
}
else {
Serial.println("You did not specify how to add SSIDs");
Serial.println(F("You did not specify how to add SSIDs"));
}
}
// Remove SSID
@@ -1479,7 +1831,7 @@ void CommandLine::runCommand(String input) {
ssids->remove(index);
}
else {
Serial.println("You did not specify whether to add or remove SSIDs");
Serial.println(F("You did not specify whether to add or remove SSIDs"));
return;
}
}

View File

@@ -34,6 +34,8 @@ extern LinkedList<AccessPoint>* access_points;
extern LinkedList<AirTag>* airtags;
extern LinkedList<ssid>* ssids;
extern LinkedList<Station>* stations;
extern LinkedList<IPAddress>* ipList;
extern LinkedList<ProbeReqSsid>* probe_req_ssids;
extern const String PROGMEM version_number;
extern const String PROGMEM board_target;
@@ -51,9 +53,12 @@ const char PROGMEM LED_CMD[] = "led";
const char PROGMEM GPS_DATA_CMD[] = "gpsdata";
const char PROGMEM GPS_CMD[] = "gps";
const char PROGMEM NMEA_CMD[] = "nmea";
const char PROGMEM GPS_POI_CMD[] = "gpspoi";
const char PROGMEM GPS_TRACKER_CMD[] = "gpstracker";
// WiFi sniff/scan
const char PROGMEM EVIL_PORTAL_CMD[] = "evilportal";
const char PROGMEM KARMA_CMD[] = "karma";
const char PROGMEM PACKET_COUNT_CMD[] = "packetcount";
const char PROGMEM SIGSTREN_CMD[] = "sigmon";
const char PROGMEM SCAN_ALL_CMD[] = "scanall";
@@ -70,13 +75,19 @@ const char PROGMEM SNIFF_DEAUTH_CMD[] = "sniffdeauth";
const char PROGMEM SNIFF_PMKID_CMD[] = "sniffpmkid";
const char PROGMEM STOPSCAN_CMD[] = "stopscan";
const char PROGMEM WARDRIVE_CMD[] = "wardrive";
const char PROGMEM PING_CMD[] = "pingscan";
const char PROGMEM PORT_SCAN_CMD[] = "portscan";
const char PROGMEM ARP_SCAN_CMD[] = "arpscan";
// WiFi attack
const char PROGMEM ATTACK_CMD[] = "attack";
const char PROGMEM ATTACK_TYPE_DEAUTH[] = "deauth";
const char PROGMEM ATTACK_TYPE_BEACON[] = "beacon";
const char PROGMEM ATTACK_TYPE_PROBE[] = "probe";
const char PROGMEM ATTACK_TYPE_FUNNY[] = "funny";
const char PROGMEM ATTACK_TYPE_RR[] = "rickroll";
const char PROGMEM ATTACK_TYPE_BM[] = "badmsg";
const char PROGMEM ATTACK_TYPE_S[] = "sleep";
// WiFi Aux
const char PROGMEM LIST_AP_CMD[] = "list";
@@ -85,6 +96,11 @@ const char PROGMEM SEL_CMD[] = "select";
const char PROGMEM SSID_CMD[] = "ssid";
const char PROGMEM SAVE_CMD[] = "save";
const char PROGMEM LOAD_CMD[] = "load";
const char PROGMEM JOIN_CMD[] = "join";
const char PROGMEM MAC_CMD_A[] = "randapmac";
const char PROGMEM MAC_CMD_B[] = "randstamac";
const char PROGMEM MAC_CMD_C[] = "cloneapmac";
const char PROGMEM MAC_CMD_D[] = "clonestamac";
// Bluetooth sniff/scan
const char PROGMEM BT_SPAM_CMD[] = "blespam";
@@ -109,11 +125,14 @@ const char PROGMEM HELP_SETTINGS_CMD[] = "settings [-s <setting> enable/disable>
const char PROGMEM HELP_LS_CMD[] = "ls <directory>";
const char PROGMEM HELP_LED_CMD[] = "led -s <hex color>/-p <rainbow>";
const char PROGMEM HELP_GPS_DATA_CMD[] = "gpsdata";
const char PROGMEM HELP_GPS_CMD[] = "gps [-g] <fix/sat/lon/lat/alt/date/accuracy/text/nmea>\r\n [-n] <native/all/gps/glonass/galileo/navic/qzss/beidou>\r\n [-b = use BD vs GB for beidou]";
const char PROGMEM HELP_GPS_CMD[] = "gps [-t] [-g] <fix/sat/lon/lat/alt/date/accuracy/text/nmea>\r\n [-n] <native/all/gps/glonass/galileo/navic/qzss/beidou>\r\n [-b = use BD vs GB for beidou]";
const char PROGMEM HELP_GPS_POI_CMD[] = "gpspoi -s/-m/-e";
const char PROGMEM HELP_GPS_TRACKER_CMD[] = "gpstracker -c <start/stop>";
const char PROGMEM HELP_NMEA_CMD[] = "nmea";
// WiFi sniff/scan
const char PROGMEM HELP_EVIL_PORTAL_CMD[] = "evilportal [-c start [-w html.html]/sethtml <html.html>]";
const char PROGMEM HELP_KARMA_CMD[] = "karma -p <index>";
const char PROGMEM HELP_PACKET_COUNT_CMD[] = "packetcount";
const char PROGMEM HELP_SIGSTREN_CMD[] = "sigmon";
const char PROGMEM HELP_SCAN_ALL_CMD[] = "scanall";
@@ -128,26 +147,36 @@ const char PROGMEM HELP_SNIFF_MULTISSID_CMD[] = "sniffmultissid";
const char PROGMEM HELP_SNIFF_ESP_CMD[] = "sniffesp";
const char PROGMEM HELP_SNIFF_DEAUTH_CMD[] = "sniffdeauth";
const char PROGMEM HELP_SNIFF_PMKID_CMD[] = "sniffpmkid [-c <channel>][-d][-l]";
const char PROGMEM HELP_STOPSCAN_CMD[] = "stopscan";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s]";
const char PROGMEM HELP_STOPSCAN_CMD[] = "stopscan [-f]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s/-f]";
const char PROGMEM HELP_PING_CMD[] = "pingscan";
const char PROGMEM HELP_PORT_SCAN_CMD[] = "portscan [-a -t <ip index>]/[-s <ssh/telnet/dns/http/smtp/https/rdp>]";
const char PROGMEM HELP_ARP_SCAN_CMD[] = "arpscan [-f]";
// WiFi attack
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll>";
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll/badmsg [-c]/sleep [-c]>";
// WiFi Aux
const char PROGMEM HELP_LIST_AP_CMD_A[] = "list -s";
const char PROGMEM HELP_LIST_AP_CMD_B[] = "list -a";
const char PROGMEM HELP_LIST_AP_CMD_C[] = "list -c";
const char PROGMEM HELP_LIST_AP_CMD_D[] = "list -t";
const char PROGMEM HELP_LIST_AP_CMD_E[] = "list -i";
const char PROGMEM HELP_LIST_AP_CMD_F[] = "list -p";
const char PROGMEM HELP_INFO_CMD[] = "info [-a <index>]";
const char PROGMEM HELP_SEL_CMD_A[] = "select -a/-s/-c <index (comma separated)>/-f \"equals <String> or contains <String>\"";
const char PROGMEM HELP_SSID_CMD_A[] = "ssid -a [-g <count>/-n <name>]";
const char PROGMEM HELP_SSID_CMD_B[] = "ssid -r <index>";
const char PROGMEM HELP_SAVE_CMD[] = "save -a/-s";
const char PROGMEM HELP_LOAD_CMD[] = "load -a/-s";
const char PROGMEM HELP_JOIN_CMD[] = "join -a <index> -p <password>/-s";
const char PROGMEM HELP_MAC_CMD_A[] = "randapmac";
const char PROGMEM HELP_MAC_CMD_B[] = "randstamac";
const char PROGMEM HELP_MAC_CMD_C[] = "cloneapmac [-a <index>]";
const char PROGMEM HELP_MAC_CMD_D[] = "clonestamac [-s <index>]";
// Bluetooth sniff/scan
const char PROGMEM HELP_BT_SNIFF_CMD[] = "sniffbt [-t] <airtag/flipper>";
const char PROGMEM HELP_BT_SNIFF_CMD[] = "sniffbt [-t] <airtag/flipper/flock>";
const char PROGMEM HELP_BT_SPAM_CMD[] = "blespam -t <apple/google/samsung/windows/flipper/all>";
const char PROGMEM HELP_BT_SPOOFAT_CMD[] = "spoofat -t <index>";
//const char PROGMEM HELP_BT_SOUR_APPLE_CMD[] = "sourapple";

View File

@@ -11,7 +11,7 @@ Display::Display()
{
}
int8_t Display::menuButton(uint16_t *x, uint16_t *y, bool pressed) {
int8_t Display::menuButton(uint16_t *x, uint16_t *y, bool pressed, bool check_hold) {
#ifdef HAS_ILI9341
for (uint8_t b = BUTTON_ARRAY_LEN; b < BUTTON_ARRAY_LEN + 3; b++) {
if (pressed && this->key[b].contains(*x, *y)) {
@@ -22,8 +22,15 @@ int8_t Display::menuButton(uint16_t *x, uint16_t *y, bool pressed) {
}
for (uint8_t b = BUTTON_ARRAY_LEN; b < BUTTON_ARRAY_LEN + 3; b++) {
if ((this->key[b].justReleased()) && (!pressed)) {
return b - BUTTON_ARRAY_LEN;
if (!check_hold) {
if ((this->key[b].justReleased()) && (!pressed)) {
return b - BUTTON_ARRAY_LEN;
}
}
else {
if ((this->key[b].isPressed())) {
return b - BUTTON_ARRAY_LEN;
}
}
}
@@ -80,6 +87,69 @@ uint8_t Display::updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold) {
return 0;
}
bool Display::isTouchHeld(uint16_t threshold) {
static unsigned long touchStartTime = 0;
static bool touchHeld = false;
uint16_t x, y;
if (this->updateTouch(&x, &y, threshold)) {
// Touch detected
if (touchStartTime == 0) {
touchStartTime = millis(); // First touch timestamp
} else if (!touchHeld && millis() - touchStartTime >= 1000) {
touchHeld = true; // Held for at least 1000ms
return true;
}
} else {
// Touch released
touchStartTime = 0;
touchHeld = false;
}
return false;
}
void Display::init() {
tft.init();
#ifdef HAS_DUAL_BAND
digitalWrite(TFT_BL, HIGH);
#endif
}
void Display::setCalData(bool landscape) {
#ifndef HAS_CYD_TOUCH
if (!landscape) {
#ifdef TFT_SHIELD
uint16_t calData[5] = { 275, 3494, 361, 3528, 4 }; // tft.setRotation(0); // Portrait with TFT Shield
#elif defined(MARAUDER_CYD_3_5_INCH)
uint16_t calData[5] = { 239, 3560, 262, 3643, 4 };
#elif defined(MARAUDER_V8)
uint16_t calData[5] = { 351, 3279, 214, 3394, 2 };
#elif defined(TFT_DIY)
uint16_t calData[5] = { 339, 3470, 237, 3438, 2 }; // tft.setRotation(0); // Portrait with DIY TFT
#endif
#ifdef HAS_ILI9341
tft.setTouch(calData);
#endif
}
else {
#ifdef TFT_SHIELD
uint16_t calData[5] = { 391, 3491, 266, 3505, 7 }; // Landscape TFT Shield
#elif defined(MARAUDER_CYD_3_5_INCH)
uint16_t calData[5] = { 272, 3648, 234, 3565, 7 };
#elif defined(MARAUDER_V8)
uint16_t calData[5] = { 213, 3396, 350, 3275, 1 };
#else if defined(TFT_DIY)
uint16_t calData[5] = { 213, 3469, 320, 3446, 1 }; // Landscape TFT DIY
#endif
#ifdef HAS_ILI9341
tft.setTouch(calData);
#endif
}
#endif
}
// Function to prepare the display and the menus
void Display::RunSetup()
{
@@ -102,46 +172,18 @@ void Display::RunSetup()
tft.setRotation(SCREEN_ORIENTATION);
/*#ifndef MARAUDER_M5STICKC
tft.setRotation(0); // Portrait
#endif
#ifdef HAS_CYD_PORTRAIT
tft.setRotation(3); // Bro these CYDs are so stupid
#endif
#ifdef MARAUDER_M5STICKC
tft.setRotation(1);
#endif
#ifdef MARAUDER_REV_FEATHER
tft.setRotation(1);
#endif*/
tft.setCursor(0, 0);
#ifdef HAS_ILI9341
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 275, 3494, 361, 3528, 4 }; // tft.setRotation(0); // Portrait with TFT Shield
//Serial.println(F("Using TFT Shield"));
#elif defined(TFT_DIY)
uint16_t calData[5] = { 339, 3470, 237, 3438, 2 }; // tft.setRotation(0); // Portrait with DIY TFT
//Serial.println(F("Using TFT DIY"));
#endif
tft.setTouch(calData);
this->setCalData();
#endif
#endif
//tft.fillScreen(TFT_BLACK);
clearScreen();
//Serial.println("SPI_FREQUENCY: " + (String)SPI_FREQUENCY);
//Serial.println("SPI_READ_FREQUENCY:" + (String)SPI_READ_FREQUENCY);
//Serial.println("SPI_TOUCH_FREQUENCY: " + (String)SPI_TOUCH_FREQUENCY);
#ifdef KIT
pinMode(KIT_LED_BUILTIN, OUTPUT);
#endif
@@ -195,11 +237,16 @@ void Display::tftDrawGraphObjects(byte x_scale)
tft.setCursor(3, 228); tft.print("0"); // "-" at bottom of y axis
}
void Display::tftDrawEapolColorKey()
void Display::tftDrawEapolColorKey(bool filter)
{
//Display color key
tft.setTextSize(1); tft.setTextColor(TFT_WHITE);
tft.fillRect(14, 0, 15, 8, TFT_CYAN); tft.setCursor(30, 0); tft.print(" - EAPOL");
tft.fillRect(14, 0, 15, 8, TFT_CYAN); tft.setCursor(30, 0); tft.println(" - EAPOL");
if (filter) {
uint16_t y = tft.getCursorY();
tft.setCursor(14, y);
tft.println("Filter Active");
}
}
void Display::tftDrawColorKey()
@@ -391,7 +438,7 @@ void Display::touchToExit()
{
tft.setTextColor(TFT_BLACK, TFT_LIGHTGREY);
tft.fillRect(0,32,HEIGHT_1,16, TFT_LIGHTGREY);
tft.drawCentreString(text11,120,32,2);
tft.drawCentreString(text11,TFT_WIDTH / 2,32,2);
}
@@ -402,6 +449,9 @@ void Display::clearScreen()
#ifndef MARAUDER_V7
tft.fillScreen(TFT_BLACK);
tft.setCursor(0, 0);
#elif defined(MARAUDER_MINI)
tft.fillRect(0, 0, TFT_WIDTH, TFT_HEIGHT, TFT_BLACK);
tft.setCursor(0, 0);
#else
tft.fillRect(0, 0, TFT_WIDTH, TFT_HEIGHT, TFT_BLACK);
tft.setCursor(0, 0);
@@ -564,7 +614,9 @@ void Display::setupScrollArea(uint16_t tfa, uint16_t bfa) {
//Serial.println(" bfa: " + (String)bfa);
//Serial.println("yStart: " + (String)this->yStart);
#ifdef HAS_ILI9341
#ifdef HAS_ST7789
#ifdef HAS_ST7796
tft.writecommand(0x33);
#elif defined(HAS_ST7789)
tft.writecommand(ST7789_VSCRDEF); // Vertical scroll definition
#else
tft.writecommand(ILI9341_VSCRDEF);
@@ -583,6 +635,8 @@ void Display::scrollAddress(uint16_t vsp) {
#ifdef HAS_ILI9341
#ifdef HAS_ST7789
tft.writecommand(ST7789_VSCRDEF); // Vertical scroll definition
#elif defined(HAS_ST7796)
tft.writecommand(0x33);
#else
tft.writecommand(ILI9341_VSCRDEF);
#endif
@@ -705,7 +759,7 @@ void Display::drawStylus()
//====================================================================================
// Decode and render the Jpeg image onto the TFT screen
//====================================================================================
void Display::jpegRender(int xpos, int ypos) {
/*void Display::jpegRender(int xpos, int ypos) {
// retrieve infomration about the image
uint16_t *pImg;
@@ -772,13 +826,13 @@ void Display::jpegRender(int xpos, int ypos) {
// calculate how long it took to draw the image
drawTime = millis() - drawTime; // Calculate the time it took
}
}*/
//====================================================================================
// Print information decoded from the Jpeg image
//====================================================================================
void Display::jpegInfo() {
/*
/*void Display::jpegInfo() {
Serial.println("===============");
Serial.println("JPEG image info");
Serial.println("===============");
@@ -792,13 +846,12 @@ void Display::jpegInfo() {
Serial.print ("MCU height :"); Serial.println(JpegDec.MCUHeight);
Serial.println("===============");
Serial.println("");
*/
}
}*/
//====================================================================================
// Open a Jpeg file and send it to the Serial port in a C array compatible format
//====================================================================================
void createArray(const char *filename) {
/*void createArray(const char *filename) {
// Open the named file
fs::File jpgFile = SPIFFS.open( filename, "r"); // File handle reference for SPIFFS
@@ -838,7 +891,7 @@ void createArray(const char *filename) {
Serial.println("};\r\n");
jpgFile.close();
}
}*/
// End JPEG_functions
@@ -992,9 +1045,9 @@ void Display::buildBanner(String msg, int xpos)
void Display::main(uint8_t scan_mode)
{
if ((scan_mode == LV_JOIN_WIFI) ||
/*if ((scan_mode == LV_JOIN_WIFI) ||
(scan_mode == LV_ADD_SSID))
lv_task_handler();
lv_task_handler();*/
return;
}
// End SPIFFS_functions

View File

@@ -9,10 +9,10 @@
#include <FS.h>
#include <functional>
#include <JPEGDecoder.h>
//#include <JPEGDecoder.h>
#include <LinkedList.h>
#include <SPI.h>
#include <lvgl.h>
//#include <lvgl.h>
#include <Ticker.h>
#include "SPIFFS.h"
#include "Assets.h"
@@ -118,12 +118,13 @@ class Display
// We can speed up scrolling of short text lines by just blanking the character we drew
int blank[19]; // We keep all the strings pixel lengths to optimise the speed of the top line blanking
int8_t menuButton(uint16_t *x, uint16_t *y, bool pressed);
int8_t menuButton(uint16_t *x, uint16_t *y, bool pressed, bool check_hold = false);
uint8_t updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);
bool isTouchHeld(uint16_t threshold = 600);
void tftDrawRedOnOffButton();
void tftDrawGreenOnOffButton();
void tftDrawGraphObjects(byte x_scale);
void tftDrawEapolColorKey();
void tftDrawEapolColorKey(bool filter = false);
void tftDrawColorKey();
void tftDrawXScaleButtons(byte x_scale);
void tftDrawYScaleButtons(byte y_scale);
@@ -135,10 +136,11 @@ class Display
//void drawJpeg(const char *filename, int xpos, int ypos);
void getTouchWhileFunction(bool pressed);
void initScrollValues(bool tte = false);
void jpegInfo();
void jpegRender(int xpos, int ypos);
//void jpegInfo();
//void jpegRender(int xpos, int ypos);
void listDir(fs::FS &fs, const char * dirname, uint8_t levels);
void listFiles();
void init();
void main(uint8_t scan_mode);
void RunSetup();
void scrollAddress(uint16_t vsp);
@@ -148,6 +150,7 @@ class Display
void touchToExit();
void twoPartDisplay(String center_text);
void updateBanner(String msg);
void setCalData(bool landscape = false);
};
#endif
#endif

View File

@@ -28,6 +28,8 @@ void EvilPortal::setup() {
}
void EvilPortal::cleanup() {
this->ap_index = -1;
#ifdef HAS_PSRAM
free(index_html);
index_html = nullptr;
@@ -35,8 +37,10 @@ void EvilPortal::cleanup() {
}
bool EvilPortal::begin(LinkedList<ssid>* ssids, LinkedList<AccessPoint>* access_points) {
if (!this->setAP(ssids, access_points))
return false;
if (!this->has_ap) {
if (!this->setAP(ssids, access_points))
return false;
}
if (!this->setHtml())
return false;
@@ -57,9 +61,9 @@ void EvilPortal::setupServer() {
#ifndef HAS_PSRAM
server.on("/", HTTP_GET, [this](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", index_html);
Serial.println("client connected");
Serial.println(F("client connected"));
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#else
@@ -67,11 +71,35 @@ void EvilPortal::setupServer() {
request->send(200, "text/html", index_html);
Serial.println("client connected");
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#endif
const char* captiveEndpoints[] = {
"/hotspot-detect.html",
"/library/test/success.html",
"/success.txt",
"/generate_204",
"/gen_204",
"/ncsi.txt",
"/connecttest.txt",
"/redirect"
};
for (int i = 0; i < sizeof(captiveEndpoints) / sizeof(captiveEndpoints[0]); i++) {
#ifndef HAS_PSRAM
server.on(captiveEndpoints[i], HTTP_GET, [this](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html);
});
#else
server.on(captiveEndpoints[i], HTTP_GET, [this](AsyncWebServerRequest *request){
request->send(200, "text/html", index_html);
});
#endif
}
server.on("/get-ap-name", HTTP_GET, [this](AsyncWebServerRequest *request) {
request->send(200, "text/plain", WiFi.softAPSSID());
});
@@ -97,7 +125,6 @@ void EvilPortal::setupServer() {
200, "text/html",
"<html><head><script>setTimeout(() => { window.location.href ='/' }, 100);</script></head><body></body></html>");
});
Serial.println("web server up");
}
void EvilPortal::setHtmlFromSerial() {
@@ -117,10 +144,10 @@ void EvilPortal::setHtmlFromSerial() {
bool EvilPortal::setHtml() {
if (this->using_serial_html) {
Serial.println("html previously set");
Serial.println(F("html previously set"));
return true;
}
Serial.println("Setting HTML...");
Serial.println(F("Setting HTML..."));
#ifdef HAS_SD
File html_file = sd_obj.getFile("/" + this->target_html_name);
#else
@@ -129,7 +156,7 @@ bool EvilPortal::setHtml() {
if (!html_file) {
#ifdef HAS_SCREEN
this->sendToDisplay("Could not find /" + this->target_html_name);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("Could not find /" + this->target_html_name + ". Use stopscan...");
return false;
@@ -137,9 +164,9 @@ bool EvilPortal::setHtml() {
else {
if (html_file.size() > MAX_HTML_SIZE) {
#ifdef HAS_SCREEN
this->sendToDisplay("The given HTML is too large.");
this->sendToDisplay(F("The given HTML is too large."));
this->sendToDisplay("The Byte limit is " + (String)MAX_HTML_SIZE);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("The provided HTML is too large. Byte limit is " + (String)MAX_HTML_SIZE + "\nUse stopscan...");
return false;
@@ -167,11 +194,13 @@ bool EvilPortal::setHtml() {
bool EvilPortal::setAP(LinkedList<ssid>* ssids, LinkedList<AccessPoint>* access_points) {
// See if there are selected APs first
int targ_ap_index = -1;
String ap_config = "";
String temp_ap_name = "";
for (int i = 0; i < access_points->size(); i++) {
if (access_points->get(i).selected) {
temp_ap_name = access_points->get(i).essid;
targ_ap_index = i;
break;
}
}
@@ -269,6 +298,7 @@ bool EvilPortal::setAP(LinkedList<ssid>* ssids, LinkedList<AccessPoint>* access_
strncpy(apName, ap_config.c_str(), MAX_AP_NAME_SIZE);
this->has_ap = true;
Serial.println("ap config set");
this->ap_index = targ_ap_index;
return true;
}
else
@@ -276,10 +306,24 @@ bool EvilPortal::setAP(LinkedList<ssid>* ssids, LinkedList<AccessPoint>* access_
}
bool EvilPortal::setAP(String essid) {
if (essid == "")
return false;
if (essid.length() > MAX_AP_NAME_SIZE) {
return false;
}
strncpy(apName, essid.c_str(), MAX_AP_NAME_SIZE);
this->has_ap = true;
Serial.println(F("ap config set"));
return true;
}
void EvilPortal::startAP() {
const IPAddress AP_IP(172, 0, 0, 1);
Serial.print("starting ap ");
Serial.print(F("starting ap "));
Serial.println(apName);
WiFi.mode(WIFI_AP);
@@ -290,14 +334,19 @@ void EvilPortal::startAP() {
this->sendToDisplay("AP started");
#endif
Serial.print("ap ip address: ");
Serial.print(F("ap ip address: "));
Serial.println(WiFi.softAPIP());
this->setupServer();
Serial.println(F("Server endpoints configured"));
this->dnsServer.start(53, "*", WiFi.softAPIP());
Serial.println(F("DNS Server started"));
server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);
Serial.println(F("Captive Portal handler started"));
server.begin();
Serial.println(F("Server started"));
#ifdef HAS_SCREEN
this->sendToDisplay("Evil Portal READY");
#endif
@@ -326,20 +375,29 @@ void EvilPortal::sendToDisplay(String msg) {
}
void EvilPortal::main(uint8_t scan_mode) {
if ((scan_mode == WIFI_SCAN_EVIL_PORTAL) && (this->has_ap) && (this->has_html)){
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
String logValue1 =
"u: " + this->user_name;
String logValue2 = "p: " + this->password;
String full_string = logValue1 + " " + logValue2 + "\n";
Serial.print(full_string);
buffer_obj.append(full_string);
#ifdef HAS_SCREEN
this->sendToDisplay(full_string);
#endif
}
if (scan_mode != WIFI_SCAN_EVIL_PORTAL || !this->has_ap || !this->has_html) {
return;
}
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
// Adjust size depending on your max username/password length
char line[96];
// If user_name / password are still Arduino String:
snprintf(line, sizeof(line),
"u: %s p: %s\n",
this->user_name.c_str(),
this->password.c_str());
Serial.print(line);
buffer_obj.append(line);
#ifdef HAS_SCREEN
this->sendToDisplay(line);
#endif
}
}

View File

@@ -6,6 +6,7 @@
#include "ESPAsyncWebServer.h"
#include <AsyncTCP.h>
#include <DNSServer.h>
#include <WiFi.h>
#include "configs.h"
#include "settings.h"
@@ -89,7 +90,6 @@ class EvilPortal {
String password;
bool has_html;
bool has_ap;
DNSServer dnsServer;
@@ -105,16 +105,20 @@ class EvilPortal {
public:
EvilPortal();
int ap_index = -1;
String target_html_name = "index.html";
uint8_t selected_html_index = 0;
bool using_serial_html;
bool has_ap;
LinkedList<String>* html_files;
void cleanup();
String get_user_name();
String get_password();
bool setAP(String essid);
void setup();
bool begin(LinkedList<ssid>* ssids, LinkedList<AccessPoint>* access_points);
void main(uint8_t scan_mode);

View File

@@ -469,16 +469,41 @@ String GpsInterface::dt_string_from_gps(){
String datetime = "";
if (nmea.isValid() && nmea.getYear() > 0){
datetime += nmea.getYear();
datetime += "-";
datetime += nmea.getMonth();
uint8_t month = nmea.getMonth();
if (month < 10)
datetime += "0";
datetime += month;
datetime += "-";
datetime += nmea.getDay();
uint8_t day = nmea.getDay();
if (day < 10)
datetime += "0";
datetime += day;
datetime += " ";
datetime += nmea.getHour();
uint8_t hour = nmea.getHour();
if (hour < 10)
datetime += "0";
datetime += hour;
datetime += ":";
datetime += nmea.getMinute();
uint8_t minute = nmea.getMinute();
if (minute < 10)
datetime += "0";
datetime += minute;
datetime += ":";
datetime += nmea.getSecond();
uint8_t seconds = nmea.getSecond();
if (seconds < 10)
datetime += "0";
datetime += seconds;
}
return datetime;
}

269
esp32_marauder/Keyboard.cpp Normal file
View File

@@ -0,0 +1,269 @@
#include "Keyboard.h"
#ifdef MARAUDER_CARDPUTER
#include <driver/gpio.h>
#include <Arduino.h>
#define digitalWrite(pin, level) gpio_set_level((gpio_num_t)pin, level)
#define digitalRead(pin) gpio_get_level((gpio_num_t)pin)
void Keyboard_Class::_set_output(const std::vector<int> &pinList,
uint8_t output)
{
output = output & 0B00000111;
digitalWrite(pinList[0], (output & 0B00000001));
digitalWrite(pinList[1], (output & 0B00000010));
digitalWrite(pinList[2], (output & 0B00000100));
}
uint8_t Keyboard_Class::_get_input(const std::vector<int> &pinList)
{
uint8_t buffer = 0x00;
uint8_t pin_value = 0x00;
for (int i = 0; i < 7; i++)
{
pin_value = (digitalRead(pinList[i]) == 1) ? 0x00 : 0x01;
pin_value = pin_value << i;
buffer = buffer | pin_value;
}
return buffer;
}
void Keyboard_Class::begin()
{
for (auto i : output_list)
{
gpio_reset_pin((gpio_num_t)i);
gpio_set_direction((gpio_num_t)i, GPIO_MODE_OUTPUT);
gpio_set_pull_mode((gpio_num_t)i, GPIO_PULLUP_PULLDOWN);
digitalWrite(i, 0);
}
for (auto i : input_list)
{
gpio_reset_pin((gpio_num_t)i);
gpio_set_direction((gpio_num_t)i, GPIO_MODE_INPUT);
gpio_set_pull_mode((gpio_num_t)i, GPIO_PULLUP_ONLY);
}
_set_output(output_list, 0);
}
uint8_t Keyboard_Class::getKey(Point2D_t keyCoor)
{
uint8_t ret = 0;
if ((keyCoor.x < 0) || (keyCoor.y < 0))
{
return 0;
}
if (_keys_state_buffer.ctrl || _keys_state_buffer.shift ||
_is_caps_locked)
{
ret = _key_value_map[keyCoor.y][keyCoor.x].value_second;
}
else
{
ret = _key_value_map[keyCoor.y][keyCoor.x].value_first;
}
return ret;
}
void Keyboard_Class::updateKeyList()
{
_key_list_buffer.clear();
Point2D_t coor;
uint8_t input_value = 0;
for (int i = 0; i < 8; i++)
{
_set_output(output_list, i);
input_value = _get_input(input_list);
/* If key pressed */
if (input_value)
{
/* Get X */
for (int j = 0; j < 7; j++)
{
if (input_value & (0x01 << j))
{
coor.x = (i > 3) ? X_map_chart[j].x_1 : X_map_chart[j].x_2;
/* Get Y */
coor.y = (i > 3) ? (i - 4) : i;
// printf("%d,%d\t", coor.x, coor.y);
/* Keep the same as picture */
coor.y = -coor.y;
coor.y = coor.y + 3;
_key_list_buffer.push_back(coor);
}
}
}
}
}
uint8_t Keyboard_Class::isPressed()
{
return _key_list_buffer.size();
}
bool Keyboard_Class::isChange()
{
if (_last_key_size != _key_list_buffer.size())
{
_last_key_size = _key_list_buffer.size();
return true;
}
else
{
return false;
}
}
String Keyboard_Class::getPressedKeysString() {
updateKeyList();
String pressed = "";
for (auto &keyCoor : _key_list_buffer) {
pressed += getKey(keyCoor);
}
return pressed;
}
bool Keyboard_Class::isKeyPressed(char c)
{
if (_key_list_buffer.size())
{
for (const auto &i : _key_list_buffer)
{
if (getKey(i) == c)
return true;
}
}
return false;
}
#include <cstring>
void Keyboard_Class::updateKeysState()
{
_keys_state_buffer.reset();
_key_pos_print_keys.clear();
_key_pos_hid_keys.clear();
_key_pos_modifier_keys.clear();
// Get special keys
for (auto &i : _key_list_buffer)
{
// modifier
if (getKeyValue(i).value_first == KEY_FN)
{
_keys_state_buffer.fn = true;
continue;
}
if (getKeyValue(i).value_first == KEY_OPT)
{
_keys_state_buffer.opt = true;
continue;
}
if (getKeyValue(i).value_first == KEY_LEFT_CTRL)
{
_keys_state_buffer.ctrl = true;
_key_pos_modifier_keys.push_back(i);
continue;
}
if (getKeyValue(i).value_first == KEY_LEFT_SHIFT)
{
_keys_state_buffer.shift = true;
_key_pos_modifier_keys.push_back(i);
continue;
}
if (getKeyValue(i).value_first == KEY_LEFT_ALT)
{
_keys_state_buffer.alt = true;
_key_pos_modifier_keys.push_back(i);
continue;
}
// function
if (getKeyValue(i).value_first == KEY_TAB)
{
_keys_state_buffer.tab = true;
_key_pos_hid_keys.push_back(i);
continue;
}
if (getKeyValue(i).value_first == KEY_BACKSPACE)
{
_keys_state_buffer.del = true;
_key_pos_hid_keys.push_back(i);
continue;
}
if (getKeyValue(i).value_first == KEY_ENTER)
{
_keys_state_buffer.enter = true;
_key_pos_hid_keys.push_back(i);
continue;
}
if (getKeyValue(i).value_first == ' ')
{
_keys_state_buffer.space = true;
}
_key_pos_hid_keys.push_back(i);
_key_pos_print_keys.push_back(i);
}
for (auto &i : _key_pos_modifier_keys)
{
uint8_t key = getKeyValue(i).value_first;
_keys_state_buffer.modifier_keys.push_back(key);
}
for (auto &k : _keys_state_buffer.modifier_keys)
{
_keys_state_buffer.modifiers |= (1 << (k - 0x80));
}
for (auto &i : _key_pos_hid_keys)
{
uint8_t k = getKeyValue(i).value_first;
if (k == KEY_TAB || k == KEY_BACKSPACE || k == KEY_ENTER)
{
_keys_state_buffer.hid_keys.push_back(k);
continue;
}
uint8_t key = _kb_asciimap[k];
if (key)
{
_keys_state_buffer.hid_keys.push_back(key);
}
}
// Deal what left
for (auto &i : _key_pos_print_keys)
{
if (_keys_state_buffer.ctrl || _keys_state_buffer.shift ||
_is_caps_locked)
{
_keys_state_buffer.word.push_back(getKeyValue(i).value_second);
}
else
{
_keys_state_buffer.word.push_back(getKeyValue(i).value_first);
}
}
}
#endif

206
esp32_marauder/Keyboard.h Normal file
View File

@@ -0,0 +1,206 @@
#pragma once
#ifndef Keyboard_h
#define Keyboard_h
#include "configs.h"
#ifdef MARAUDER_CARDPUTER
/**
* @file keyboard.h
* @author Forairaaaaa
* @brief
* @version 0.1
* @date 2023-09-22
*
* @copyright Copyright (c) 2023
*
*/
#include <iostream>
#include <vector>
#include "Arduino.h"
#include "Keyboard_def.h"
#include "configs.h"
struct Chart_t
{
uint8_t value;
uint8_t x_1;
uint8_t x_2;
};
struct Point2D_t
{
int x;
int y;
};
const std::vector<int> output_list = {8, 9, 11};
const std::vector<int> input_list = {13, 15, 3, 4, 5, 6, 7};
const Chart_t X_map_chart[7] = {{1, 0, 1}, {2, 2, 3}, {4, 4, 5}, {8, 6, 7}, {16, 8, 9}, {32, 10, 11}, {64, 12, 13}};
struct KeyValue_t
{
const char value_first;
const char value_second;
};
const KeyValue_t _key_value_map[4][14] = {{{'`', '~'},
{'1', '!'},
{'2', '@'},
{'3', '#'},
{'4', '$'},
{'5', '%'},
{'6', '^'},
{'7', '&'},
{'8', '*'},
{'9', '('},
{'0', ')'},
{'-', '_'},
{'=', '+'},
{KEY_BACKSPACE, KEY_BACKSPACE}},
{{KEY_TAB, KEY_TAB},
{'q', 'Q'},
{'w', 'W'},
{'e', 'E'},
{'r', 'R'},
{'t', 'T'},
{'y', 'Y'},
{'u', 'U'},
{'i', 'I'},
{'o', 'O'},
{'p', 'P'},
{'[', '{'},
{']', '}'},
{'\\', '|'}},
{{KEY_FN, KEY_FN},
{KEY_LEFT_SHIFT, KEY_LEFT_SHIFT},
{'a', 'A'},
{'s', 'S'},
{'d', 'D'},
{'f', 'F'},
{'g', 'G'},
{'h', 'H'},
{'j', 'J'},
{'k', 'K'},
{'l', 'L'},
{';', ':'},
{'\'', '\"'},
{KEY_ENTER, KEY_ENTER}},
{{KEY_LEFT_CTRL, KEY_LEFT_CTRL},
{KEY_OPT, KEY_OPT},
{KEY_LEFT_ALT, KEY_LEFT_ALT},
{'z', 'Z'},
{'x', 'X'},
{'c', 'C'},
{'v', 'V'},
{'b', 'B'},
{'n', 'N'},
{'m', 'M'},
{',', '<'},
{'.', '>'},
{'/', '?'},
{' ', ' '}}};
class Keyboard_Class
{
public:
struct KeysState
{
bool tab = false;
bool fn = false;
bool shift = false;
bool ctrl = false;
bool opt = false;
bool alt = false;
bool del = false;
bool enter = false;
bool space = false;
uint8_t modifiers = 0;
std::vector<char> word;
std::vector<uint8_t> hid_keys;
std::vector<uint8_t> modifier_keys;
void reset()
{
tab = false;
fn = false;
shift = false;
ctrl = false;
opt = false;
alt = false;
del = false;
enter = false;
space = false;
modifiers = 0;
word.clear();
hid_keys.clear();
modifier_keys.clear();
}
};
private:
std::vector<Point2D_t> _key_list_buffer;
std::vector<Point2D_t> _key_pos_print_keys; // only text: eg A,B,C
std::vector<Point2D_t> _key_pos_hid_keys; // print key + space, enter, del
std::vector<Point2D_t>
_key_pos_modifier_keys; // modifier key: eg shift, ctrl, alt
KeysState _keys_state_buffer;
bool _is_caps_locked;
uint8_t _last_key_size;
void _set_output(const std::vector<int> &pinList, uint8_t output);
uint8_t _get_input(const std::vector<int> &pinList);
public:
const char _ascii_list[95] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F',
'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z',' ','0','1','2','3','4','5','6','7','8','9','-',
'=','[',']',';','\'',',','.','/','`','\\','_','+','{','}',':',
'"','<','>','?','~','|','!','@','#','$','%','^','&','*','(',')'};
Keyboard_Class() : _is_caps_locked(false)
{
}
void begin();
uint8_t getKey(Point2D_t keyCoor);
void updateKeyList();
inline std::vector<Point2D_t> &keyList()
{
return _key_list_buffer;
}
inline KeyValue_t getKeyValue(const Point2D_t &keyCoor)
{
return _key_value_map[keyCoor.y][keyCoor.x];
}
uint8_t isPressed();
bool isChange();
bool isKeyPressed(char c);
String getPressedKeysString();
void updateKeysState();
inline KeysState &keysState()
{
return _keys_state_buffer;
}
inline bool capslocked(void)
{
return _is_caps_locked;
}
inline void setCapsLocked(bool isLocked)
{
_is_caps_locked = isLocked;
}
};
#endif
#endif

View File

@@ -0,0 +1,155 @@
#ifndef M5CARDPUTER_KB_KEYS_DEF_H
#define M5CARDPUTER_KB_KEYS_DEF_H
#include "configs.h"
#ifdef MARAUDER_CARDPUTER
#define SHIFT 0x80
#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_FN 0xff
#define KEY_OPT 0x00
#define KEY_BACKSPACE 0x2a
#define KEY_TAB 0x2b
#define KEY_ENTER 0x28
const uint8_t _kb_asciimap[128] = {
0x00, // NUL
0x00, // SOH
0x00, // STX
0x00, // ETX
0x00, // EOT
0x00, // ENQ
0x00, // ACK
0x00, // BEL
KEY_BACKSPACE, // BS Backspace
KEY_TAB, // TAB Tab
KEY_ENTER, // LF Enter
0x00, // VT
0x00, // FF
0x00, // CR
0x00, // SO
0x00, // SI
0x00, // DEL
0x00, // DC1
0x00, // DC2
0x00, // DC3
0x00, // DC4
0x00, // NAK
0x00, // SYN
0x00, // ETB
0x00, // CAN
0x00, // EM
0x00, // SUB
0x00, // ESC
0x00, // FS
0x00, // GS
0x00, // RS
0x00, // US
0x2c, // ' '
0x1e | SHIFT, // !
0x34 | SHIFT, // "
0x20 | SHIFT, // #
0x21 | SHIFT, // $
0x22 | SHIFT, // %
0x24 | SHIFT, // &
0x34, // '
0x26 | SHIFT, // (
0x27 | SHIFT, // )
0x25 | SHIFT, // *
0x2e | SHIFT, // +
0x36, // ,
0x2d, // -
0x37, // .
0x38, // /
0x27, // 0
0x1e, // 1
0x1f, // 2
0x20, // 3
0x21, // 4
0x22, // 5
0x23, // 6
0x24, // 7
0x25, // 8
0x26, // 9
0x33 | SHIFT, // :
0x33, // ;
0x36 | SHIFT, // <
0x2e, // =
0x37 | SHIFT, // >
0x38 | SHIFT, // ?
0x1f | SHIFT, // @
0x04 | SHIFT, // A
0x05 | SHIFT, // B
0x06 | SHIFT, // C
0x07 | SHIFT, // D
0x08 | SHIFT, // E
0x09 | SHIFT, // F
0x0a | SHIFT, // G
0x0b | SHIFT, // H
0x0c | SHIFT, // I
0x0d | SHIFT, // J
0x0e | SHIFT, // K
0x0f | SHIFT, // L
0x10 | SHIFT, // M
0x11 | SHIFT, // N
0x12 | SHIFT, // O
0x13 | SHIFT, // P
0x14 | SHIFT, // Q
0x15 | SHIFT, // R
0x16 | SHIFT, // S
0x17 | SHIFT, // T
0x18 | SHIFT, // U
0x19 | SHIFT, // V
0x1a | SHIFT, // W
0x1b | SHIFT, // X
0x1c | SHIFT, // Y
0x1d | SHIFT, // Z
0x2f, // [
0x31, // bslash
0x30, // ]
0x23 | SHIFT, // ^
0x2d | SHIFT, // _
0x35, // `
0x04, // a
0x05, // b
0x06, // c
0x07, // d
0x08, // e
0x09, // f
0x0a, // g
0x0b, // h
0x0c, // i
0x0d, // j
0x0e, // k
0x0f, // l
0x10, // m
0x11, // n
0x12, // o
0x13, // p
0x14, // q
0x15, // r
0x16, // s
0x17, // t
0x18, // u
0x19, // v
0x1a, // w
0x1b, // x
0x1c, // y
0x1d, // z
0x2f | SHIFT, // {
0x31 | SHIFT, // |
0x30 | SHIFT, // }
0x35 | SHIFT, // ~
0 // DEL
};
#endif
#endif

View File

@@ -1,19 +1,23 @@
#include "LedInterface.h"
LedInterface::LedInterface() {
}
void LedInterface::RunSetup() {
//Serial.println("Setting neopixel to black...");
strip.setBrightness(0);
strip.begin();
strip.setPixelColor(0, strip.Color(0, 0, 0));
strip.show();
//delay(100);
strip.setBrightness(50);
strip.setPixelColor(0, strip.Color(0, 0, 0));
strip.show();
#ifdef HAS_NEOPIXEL_LED
strip.setBrightness(0);
strip.begin();
strip.setPixelColor(0, strip.Color(0, 0, 0));
strip.show();
//delay(100);
strip.setBrightness(50);
strip.setPixelColor(0, strip.Color(0, 0, 0));
strip.show();
#endif
this->initTime = millis();
}
@@ -50,8 +54,10 @@ uint8_t LedInterface::getMode() {
}
void LedInterface::setColor(int r, int g, int b) {
strip.setPixelColor(0, strip.Color(r, g, b));
strip.show();
#ifdef HAS_NEOPIXEL_LED
strip.setPixelColor(0, strip.Color(r, g, b));
strip.show();
#endif
}
void LedInterface::sniffLed() {
@@ -67,25 +73,29 @@ void LedInterface::ledOff() {
}
void LedInterface::rainbow() {
strip.setPixelColor(0, this->Wheel((0 * 256 / 100 + this->wheel_pos) % 256));
strip.show();
#ifdef HAS_NEOPIXEL_LED
strip.setPixelColor(0, this->Wheel((0 * 256 / 100 + this->wheel_pos) % 256));
strip.show();
this->current_fade_itter++;
this->current_fade_itter++;
this->wheel_pos = this->wheel_pos - this->wheel_speed;
if (this->wheel_pos < 0)
this->wheel_pos = 255;
this->wheel_pos = this->wheel_pos - this->wheel_speed;
if (this->wheel_pos < 0)
this->wheel_pos = 255;
#endif
}
uint32_t LedInterface::Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
#ifdef HAS_NEOPIXEL_LED
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
#endif
}

View File

@@ -6,7 +6,9 @@
#include "configs.h"
#include "settings.h"
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#ifdef HAS_NEOPIXEL_LED
#include <Adafruit_NeoPixel.h>
#endif
#define Pixels 1
@@ -17,7 +19,10 @@
#define MODE_CUSTOM 4
extern Settings settings_obj;
extern Adafruit_NeoPixel strip;
#ifdef HAS_NEOPIXEL_LED
extern Adafruit_NeoPixel strip;
#endif
class LedInterface {

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,14 @@
#include "configs.h"
#ifdef MARAUDER_CARDPUTER
#include "Keyboard.h"
#endif
#ifdef HAS_TOUCH
#include "TouchKeyboard.h"
#endif
#ifdef HAS_SCREEN
#define BATTERY_ANALOG_ON 0
@@ -16,11 +24,21 @@
#ifdef HAS_BUTTONS
#include "Switches.h"
extern Switches u_btn;
extern Switches d_btn;
extern Switches l_btn;
extern Switches r_btn;
extern Switches c_btn;
#if (U_BTN >= 0)
extern Switches u_btn;
#endif
#if (D_BTN >= 0)
extern Switches d_btn;
#endif
#if (L_BTN >= 0)
extern Switches l_btn;
#endif
#if (R_BTN >= 0)
extern Switches r_btn;
#endif
#if (C_BTN >= 0)
extern Switches c_btn;
#endif
#endif
extern WiFiScan wifi_scan_obj;
@@ -76,40 +94,15 @@ extern Settings settings_obj;
#define BLANK 36
#define PINESCAN_SNIFF 37 // Use blanks icon
#define MULTISSID_SNIFF 37 // Use blanks icon
PROGMEM void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
PROGMEM bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data);
PROGMEM static lv_disp_buf_t disp_buf;
PROGMEM static lv_color_t buf[LV_HOR_RES_MAX * 10];
PROGMEM static void ta_event_cb(lv_obj_t * ta, lv_event_t event);
PROGMEM static void add_ssid_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void html_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_info_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void at_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void station_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void setting_dropdown_cb(lv_obj_t * btn, lv_event_t event);
// lvgl stuff
PROGMEM static lv_obj_t *kb;
PROGMEM static lv_obj_t * save_as_kb;
#define JOINED 38
#define FORCE 39
#define FUNNY_BEACON 40
#define FLOCK 41
struct Menu;
// Individual Nodes of a menu
/*struct MenuNode {
String name;
bool command;
uint16_t color;
uint8_t icon;
TFT_eSPI_Button* button;
bool selected;
std::function<void()> callable;
};*/
struct MenuNode {
String name;
bool command;
@@ -148,30 +141,36 @@ class MenuFunctions
Menu wifiMenu;
Menu bluetoothMenu;
#ifdef HAS_GPS
Menu gpsMenu; // H4W9 Added GPS Menu option to Main Menu
#endif
Menu badusbMenu;
Menu deviceMenu;
// Device menu stuff
Menu whichUpdateMenu;
//Menu whichUpdateMenu;
Menu failedUpdateMenu;
Menu confirmMenu;
Menu updateMenu;
Menu settingsMenu;
Menu specSettingMenu;
Menu languageMenu;
//Menu languageMenu;
Menu sdDeleteMenu;
// WiFi menu stuff
Menu wifiSnifferMenu;
Menu wifiScannerMenu;
Menu wifiAttackMenu;
#ifdef HAS_GPS
Menu wardrivingMenu;
#endif
Menu wifiGeneralMenu;
Menu wifiAPMenu;
#ifdef HAS_BT
Menu airtagMenu;
#endif
Menu wifiIPMenu;
Menu ssidsMenu;
//#ifdef HAS_BT
// Menu airtagMenu;
//#endif
//#ifndef HAS_ILI9341
Menu wifiStationMenu;
//#endif
@@ -183,6 +182,7 @@ class MenuFunctions
Menu genAPMacMenu;
Menu cloneAPMacMenu;
Menu setMacMenu;
Menu selectProbeSSIDsMenu;
// Bluetooth menu stuff
Menu bluetoothSnifferMenu;
@@ -191,17 +191,29 @@ class MenuFunctions
// Settings things menus
Menu generateSSIDsMenu;
Menu evilPortalMenu;
static void lv_tick_handler();
// Menu icons
void setupSDFileList(bool update = false);
void buildSDFileMenu(bool update = false);
void displayMenuButtons();
uint16_t getColor(uint16_t color);
void drawAvgLine(int16_t value);
void drawMaxLine(int16_t value, uint16_t color);
void drawMaxLine(uint8_t value, uint16_t color);
float calculateGraphScale(int16_t value);
float calculateGraphScale(uint8_t value);
float graphScaleCheck(const int16_t array[TFT_WIDTH]);
#ifndef HAS_DUAL_BAND
float graphScaleCheckSmall(const uint8_t array[MAX_CHANNEL]);
#else
float graphScaleCheckSmall(const uint8_t array[DUAL_BAND_CHANNELS]);
#endif
void drawGraph(int16_t *values);
void drawGraphSmall(uint8_t *values);
void renderGraphUI(uint8_t scan_mode = 0);
//void addNodes(Menu* menu, String name, uint16_t color, Menu* child, int place, std::function<void()> callable, bool selected = false, String command = "");
void addNodes(Menu* menu, String name, uint8_t color, Menu* child, int place, std::function<void()> callable, bool selected = false, String command = "");
@@ -213,8 +225,15 @@ class MenuFunctions
void displaySetting(String key, Menu* menu, int index);
void buttonSelected(int b, int x = -1);
void buttonNotSelected(int b, int x = -1);
#if (!defined(HAS_ILI9341) && defined(HAS_BUTTONS))
void miniKeyboard(Menu * targetMenu);
//#if (!defined(HAS_ILI9341) && defined(HAS_BUTTONS))
#ifdef HAS_MINI_KB
String miniKeyboard(Menu * targetMenu, bool do_pass = false);
#endif
//#endif
#ifdef MARAUDER_CARDPUTER
Keyboard_Class M5CardputerKeyboard = Keyboard_Class();
bool isKeyPressed(char c);
#endif
public:
@@ -235,6 +254,7 @@ class MenuFunctions
#ifdef HAS_GPS
// GPS Menu
Menu gpsInfoMenu;
Menu gpsPOIMenu;
#endif
Menu infoMenu;
@@ -249,16 +269,12 @@ class MenuFunctions
String loaded_file = "";
void joinWiFiGFX(String essid, bool start_ap = false);
void setGraphScale(float scale);
void initLVGL();
void deinitLVGL();
void selectEPHTMLGFX();
void updateStatusBar();
void addSSIDGFX();
void addAPGFX(String type = "AP");
void addStationGFX();
void buildButtons(Menu* menu, int starting_index = 0, String button_name = "");
void changeMenu(Menu* menu);
void changeMenu(Menu* menu, bool simple_change = false);
void drawStatusBar();
void displayCurrentMenu(int start_index = 0);
void main(uint32_t currentTime);
@@ -269,3 +285,4 @@ class MenuFunctions
#endif
#endif

View File

@@ -1,6 +1,10 @@
#include "SDInterface.h"
#include "lang_var.h"
#ifdef HAS_C5_SD
SDInterface::SDInterface(SPIClass* spi, int cs)
: _spi(spi), _cs(cs) {}
#endif
bool SDInterface::initSD() {
#ifdef HAS_SD
@@ -21,7 +25,7 @@ bool SDInterface::initSD() {
pinMode(SD_CS, OUTPUT);
delay(10);
#if (defined(MARAUDER_M5STICKC)) || (defined(HAS_CYD_TOUCH))
#if (defined(MARAUDER_M5STICKC)) || (defined(HAS_CYD_TOUCH)) || (defined(MARAUDER_CARDPUTER))
/* Set up SPI SD Card using external pin header
StickCPlus Header - SPI SD Card Reader
3v3 - 3v3
@@ -33,14 +37,22 @@ bool SDInterface::initSD() {
*/
#if defined(MARAUDER_M5STICKC)
enum { SPI_SCK = 0, SPI_MISO = 36, SPI_MOSI = 26 };
#elif defined(HAS_CYD_TOUCH)
#elif defined(HAS_CYD_TOUCH) || defined(MARAUDER_CARDPUTER) || defined(HAS_SEPARATE_SD)
enum { SPI_SCK = SD_SCK, SPI_MISO = SD_MISO, SPI_MOSI = SD_MOSI };
#else
enum { SPI_SCK = 0, SPI_MISO = 36, SPI_MOSI = 26 };
#endif
this->spiExt = new SPIClass();
#ifndef MARAUDER_CARDPUTER
this->spiExt = new SPIClass();
#else
this->spiExt = new SPIClass(FSPI);
#endif
Serial.println("Using external SPI configuration...");
this->spiExt->begin(SPI_SCK, SPI_MISO, SPI_MOSI, SD_CS);
if (!SD.begin(SD_CS, *(this->spiExt))) {
#elif defined(HAS_C5_SD)
Serial.println("Using C5 SD configuration...");
if (!SD.begin(SD_CS, *_spi)) {
#else
if (!SD.begin(SD_CS)) {
#endif
@@ -51,19 +63,9 @@ bool SDInterface::initSD() {
else {
this->supported = true;
this->cardType = SD.cardType();
//if (cardType == CARD_MMC)
// Serial.println(F("SD: MMC Mounted"));
//else if(cardType == CARD_SD)
// Serial.println(F("SD: SDSC Mounted"));
//else if(cardType == CARD_SDHC)
// Serial.println(F("SD: SDHC Mounted"));
//else
// Serial.println(F("SD: UNKNOWN Card Mounted"));
this->cardSizeMB = SD.cardSize() / (1024 * 1024);
//Serial.printf("SD Card Size: %lluMB\n", this->cardSizeMB);
if (this->supported) {
const int NUM_DIGITS = log10(this->cardSizeMB) + 1;
@@ -80,21 +82,21 @@ bool SDInterface::initSD() {
}
if (!SD.exists("/SCRIPTS")) {
Serial.println("/SCRIPTS does not exist. Creating...");
Serial.println(F("/SCRIPTS does not exist. Creating..."));
SD.mkdir("/SCRIPTS");
Serial.println("/SCRIPTS created");
Serial.println(F("/SCRIPTS created"));
}
this->sd_files = new LinkedList<String>();
this->sd_files->add("Back");
//this->sd_files->add("Back");
return true;
}
#else
Serial.println("SD support disabled, skipping init");
Serial.println(F("SD support disabled, skipping init"));
return false;
#endif
}
@@ -163,7 +165,10 @@ void SDInterface::listDir(String str_dir){
}
}
void SDInterface::runUpdate() {
void SDInterface::runUpdate(String file_name) {
if (file_name == "")
file_name = "/update.bin";
#ifdef HAS_SCREEN
display_obj.tft.setTextWrap(false);
display_obj.tft.setFreeFont(NULL);
@@ -171,16 +176,18 @@ void SDInterface::runUpdate() {
display_obj.tft.setTextSize(1);
display_obj.tft.setTextColor(TFT_WHITE);
display_obj.tft.println(F(text15));
display_obj.tft.println("Opening " + file_name + "...");
#endif
File updateBin = SD.open("/update.bin");
File updateBin = SD.open(file_name);
if (updateBin) {
if(updateBin.isDirectory()){
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_RED);
display_obj.tft.println(F(text_table2[0]));
#endif
Serial.println(F("Error, could not find \"update.bin\""));
Serial.println("Error, could not find \"" + file_name + "\"");
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_WHITE);
#endif
@@ -215,6 +222,15 @@ void SDInterface::runUpdate() {
#ifdef HAS_SCREEN
display_obj.tft.println(F(text_table2[3]));
#endif
const esp_partition_t *running = esp_ota_get_running_partition();
Serial.printf("Currently running: %s at 0x%X\n", running->label, running->address);
const esp_partition_t *next = esp_ota_get_next_update_partition(NULL);
Serial.printf("Next OTA partition: %s at 0x%X\n", next->label, next->address);
esp_err_t result = esp_ota_set_boot_partition(next);
Serial.printf("esp_ota_set_boot_partition result: %s\n", esp_err_to_name(result));
Serial.println(F("rebooting..."));
//SD.remove("/update.bin");
delay(1000);
@@ -264,7 +280,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
display_obj.tft.setTextColor(TFT_RED);
display_obj.tft.println(text_table2[12]);
#endif
Serial.println("Update not finished? Something went wrong!");
Serial.println(F("Update not finished? Something went wrong!"));
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_WHITE);
#endif
@@ -283,7 +299,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
#ifdef HAS_SCREEN
display_obj.tft.println(text_table2[14]);
#endif
Serial.println("Not enough space to begin OTA");
Serial.println(F("Not enough space to begin OTA"));
}
}

View File

@@ -6,13 +6,23 @@
#include "configs.h"
#include "settings.h"
#ifdef HAS_C5_SD
#include "FS.h"
#endif
#include "SD.h"
#ifdef HAS_C5_SD
#include "SPI.h"
#endif
#include "Buffer.h"
#ifdef HAS_SCREEN
#include "Display.h"
#endif
#include <Update.h>
#include "esp_ota_ops.h"
#include "esp_partition.h"
#include "esp_err.h"
extern Buffer buffer_obj;
extern Settings settings_obj;
#ifdef HAS_SCREEN
@@ -26,12 +36,19 @@ extern Settings settings_obj;
class SDInterface {
private:
#if (defined(MARAUDER_M5STICKC) || defined(HAS_CYD_TOUCH))
#if (defined(MARAUDER_M5STICKC) || defined(HAS_CYD_TOUCH) || defined(MARAUDER_CARDPUTER))
SPIClass *spiExt;
#elif defined(HAS_C5_SD)
SPIClass* _spi;
int _cs;
#endif
bool checkDetectPin();
public:
#ifdef HAS_C5_SD
SDInterface(SPIClass* spi, int cs);
#endif
uint8_t cardType;
//uint64_t cardSizeBT;
//uint64_t cardSizeKB;
@@ -48,7 +65,7 @@ class SDInterface {
void listDir(String str_dir);
void listDirToLinkedList(LinkedList<String>* file_names, String str_dir = "/", String ext = "");
File getFile(String path);
void runUpdate();
void runUpdate(String file_name = "");
void performUpdate(Stream &updateSource, size_t updateSize);
void main();
bool removeFile(String file_path);

View File

@@ -0,0 +1,402 @@
#include "TouchKeyboard.h"
#include <string.h>
#include <Arduino.h>
#ifdef HAS_TOUCH
extern Display display_obj;
// Keyboard will occupy the bottom half of the screen.
static inline int16_t kbHeight() { return TFT_HEIGHT / 2; }
static inline int16_t kbYStart() { return TFT_HEIGHT - kbHeight(); }
static inline int16_t kbWidth() { return TFT_WIDTH; }
static inline int16_t kbXStart() { return 0; }
static const int KEY_ROWS = 5;
static const char ROW0_ALPHA[] = "1234567890";
static const char ROW1_ALPHA[] = "qwertyuiop";
static const char ROW2_ALPHA[] = "asdfghjkl";
static const char ROW3_ALPHA[] = "zxcvbnm.";
static const char ROW0_SYM[] = "!@#$%^&*()";
static const char ROW1_SYM[] = "`~-_=+[]{}";
static const char ROW2_SYM[] = "\\|;:'\"";
static const char ROW3_SYM[] = ",.<>/?";
static const uint16_t TOUCH_THRESHOLD = 600;
enum KeyboardLayout {
LAYOUT_ALPHA = 0,
LAYOUT_SYMBOLS
};
static void drawTextArea(const char *title, const char *buffer) {
int16_t areaHeight = TFT_HEIGHT - kbHeight();
// Clear text area
display_obj.tft.fillRect(0, 0, TFT_WIDTH, areaHeight, TFT_BLACK);
int16_t cursorY = 2;
// Optional title
if (title && title[0] != '\0') {
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
display_obj.tft.print(title);
cursorY += 16;
}
// Draw current text
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
display_obj.tft.print(buffer ? buffer : "");
}
static void drawKeyboard(KeyboardLayout layout, bool caps) {
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
display_obj.tft.fillRect(kX, kY, kW, kH, TFT_DARKGREY);
display_obj.tft.setTextColor(TFT_BLACK, TFT_DARKGREY);
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Draw normal character rows (03)
for (int r = 0; r < 4; ++r) {
const char *row = rowsPtr[r];
// For alpha layout row 3, we will also draw CAPS on the rightmost 2 columns.
// The textual row only covers the first part.
int rowLen = strlen(row);
int16_t rowY = kY + r * cellH;
// For alpha row 3, we want row chars towards the left, leaving space for CAPS.
int16_t xOffset;
if (layout == LAYOUT_ALPHA && r == 3) {
// Use columns 0..7 for characters, 8..9 for CAPS
xOffset = 0;
} else {
int maxColsRow = maxCols;
xOffset = (maxColsRow - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2; // center row
}
for (int i = 0; i < rowLen; ++i) {
int16_t keyX = kX + xOffset + i * cellW;
int16_t keyY = rowY;
// Key border
display_obj.tft.drawRect(keyX, keyY, cellW, cellH, TFT_BLACK);
// Label
display_obj.tft.setCursor(keyX + cellW / 2 - 3, keyY + cellH / 2 - 4);
char c = row[i];
// Apply CAPS on alpha letters
if (layout == LAYOUT_ALPHA && r > 0) {
if (c >= 'a' && c <= 'z') {
if (caps) {
c = (char)(c - 'a' + 'A');
}
}
}
char s[2] = { c, '\0' };
display_obj.tft.print(s);
}
// Draw CAPS key for alpha layout on row 3 (rightmost two columns)
if (layout == LAYOUT_ALPHA && r == 3) {
int16_t capsX = kX + 8 * cellW;
int16_t capsW = 2 * cellW;
display_obj.tft.drawRect(capsX, rowY, capsW, cellH, TFT_BLACK);
display_obj.tft.setCursor(capsX + 4, rowY + cellH / 2 - 4);
// Show different label based on state
if (caps) {
display_obj.tft.print("caps");
} else {
display_obj.tft.print("CAPS");
}
}
}
// Special row (row index 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
int r = 4;
int16_t rowY = kY + r * cellH;
// Divide width into 6 segments:
// [CANCEL][SYMB][SPACE (2 segments)][BKSP][OK]
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
display_obj.tft.drawRect(x0, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x0 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("CANCEL");
// SYMB / ABC
display_obj.tft.drawRect(x1, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x1 + 4, rowY + cellH / 2 - 4);
if (layout == LAYOUT_ALPHA) {
display_obj.tft.print("SYMB");
} else {
display_obj.tft.print("ABC");
}
display_obj.tft.drawRect(x2, rowY, (x3 - x2), cellH, TFT_BLACK);
display_obj.tft.setCursor(x2 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("SPACE");
display_obj.tft.drawRect(x3, rowY, (x4 - x3), cellH, TFT_BLACK);
display_obj.tft.setCursor(x3 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("BKSP");
display_obj.tft.drawRect(x4, rowY, (x5 - x4), cellH, TFT_BLACK);
display_obj.tft.setCursor(x4 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("OK");
}
static bool appendChar(char *buffer, size_t bufLen, char c) {
size_t len = strlen(buffer);
if (len + 1 < bufLen) {
buffer[len] = c;
buffer[len + 1] = '\0';
return true;
}
return false;
}
static KeyboardResult handleKeyboardTouch(uint16_t tx, uint16_t ty,
char *buffer, size_t bufLen,
KeyboardLayout layout,
bool caps) {
if (!buffer || bufLen < 2) return KB_NONE;
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
if (ty < kY || ty >= (kY + kH)) {
// Touch is outside keyboard area
return KB_NONE;
}
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
int rowIndex = (ty - kY) / cellH;
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Normal rows (0..3)
if (rowIndex >= 0 && rowIndex <= 3) {
const char *row = rowsPtr[rowIndex];
int rowLen = strlen(row);
int16_t rowY = kY + rowIndex * cellH;
// Alpha row 3: characters on columns 0..7, CAPS on columns 8..9
if (layout == LAYOUT_ALPHA && rowIndex == 3) {
int16_t capsXStart = kX + 8 * cellW;
int16_t capsXEnd = capsXStart + 2 * cellW;
// Check CAPS region
if (tx >= capsXStart && tx < capsXEnd) {
return KB_TOGGLE_CAPS;
}
// Characters only in the columns before CAPS
int16_t xOffset = 0;
if (tx < kX || tx >= (kX + 8 * cellW)) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps mapping
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// All other rows
int16_t xOffset = (maxCols - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2;
if (tx < kX + xOffset || tx >= kX + xOffset + rowLen * cellW) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps on alpha letters (rows 1 and 2)
if (layout == LAYOUT_ALPHA && rowIndex > 0) {
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// Special row (rowIndex == 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
if (rowIndex == 4) {
int16_t rowY = kY + rowIndex * cellH;
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
if (tx >= x0 && tx < x1) {
return KB_CANCEL;
}
// SYMB / ABC toggle
if (tx >= x1 && tx < x2) {
return KB_TOGGLE_LAYOUT;
}
// SPACE (x2..x3)
if (tx >= x2 && tx < x3) {
if (appendChar(buffer, bufLen, ' ')) {
return KB_CHANGED;
}
return KB_NONE;
}
// BKSP (x3..x4)
if (tx >= x3 && tx < x4) {
size_t len = strlen(buffer);
if (len > 0) {
buffer[len - 1] = '\0';
return KB_CHANGED;
}
return KB_NONE;
}
// OK (x4..x5)
if (tx >= x4 && tx < x5) {
return KB_DONE;
}
}
return KB_NONE;
}
bool keyboardInput(char *buffer, size_t bufLen, const char *title) {
if (!buffer || bufLen < 2) {
return false;
}
// To force clear, uncomment this:
// buffer[0] = '\0';
KeyboardLayout layout = LAYOUT_ALPHA;
bool caps = false;
drawTextArea(title, buffer);
drawKeyboard(layout, caps);
uint32_t lastTouchTime = 0;
const uint32_t debounceMs = 120;
while (true) {
uint16_t x = 0, y = 0;
uint8_t touched = display_obj.updateTouch(&x, &y, TOUCH_THRESHOLD);
if (touched) {
uint32_t now = millis();
if (now - lastTouchTime < debounceMs) {
// "debounce"
continue;
}
lastTouchTime = now;
KeyboardResult r = handleKeyboardTouch(x, y, buffer, bufLen, layout, caps);
if (r == KB_CHANGED) {
drawTextArea(title, buffer);
} else if (r == KB_DONE) {
drawTextArea(title, buffer);
return true;
} else if (r == KB_CANCEL) {
// Optional: buffer[0] = '\0';
drawTextArea(title, buffer);
return false;
} else if (r == KB_TOGGLE_LAYOUT) {
layout = (layout == LAYOUT_ALPHA) ? LAYOUT_SYMBOLS : LAYOUT_ALPHA;
drawKeyboard(layout, caps);
} else if (r == KB_TOGGLE_CAPS) {
caps = !caps;
drawKeyboard(layout, caps);
}
}
delay(5);
yield();
}
return false;
}
#endif

View File

@@ -0,0 +1,31 @@
#pragma once
#include "configs.h"
#ifdef HAS_TOUCH
#include "Display.h"
#include <stddef.h>
#include <stdint.h>
enum KeyboardResult {
KB_NONE = 0,
KB_CHANGED,
KB_DONE,
KB_CANCEL,
KB_TOGGLE_LAYOUT,
KB_TOGGLE_CAPS
};
/**
* Blocking keyboard input.
*
* @param buffer Caller-provided char buffer to hold the text. Will be null-terminated.
* @param bufLen Total size of the buffer (including space for '\0').
* @param title Optional title displayed above the text box (can be nullptr).
*
* @return true if user pressed OK, false if user pressed CANCEL (or if buffer invalid).
*/
bool keyboardInput(char *buffer, size_t bufLen, const char *title = nullptr);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -11,15 +11,31 @@
#include <vector>
#ifdef HAS_BT
#include <NimBLEDevice.h>
#include <NimBLEDevice.h> // 1.3.8, 2.3.2
#endif
#ifdef HAS_DUAL_BAND
extern "C" {
#include "esp_netif.h"
#include "esp_netif_net_stack.h"
}
#endif
#include <WiFi.h>
#include <ESP32Ping.h>
#include "EvilPortal.h"
#include <math.h>
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#ifdef HAS_BT
#include <esp_timer.h>
#ifndef HAS_DUAL_BAND
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#endif
#ifdef HAS_DUAL_BAND
#include "esp_system.h"
#endif
#if defined(HAS_BT) && !defined(HAS_DUAL_BAND)
#include "esp_bt.h"
#endif
#ifdef HAS_SCREEN
@@ -104,6 +120,32 @@
#define WIFI_SCAN_AP_STA 49
#define WIFI_SCAN_PINESCAN 50
#define WIFI_SCAN_MULTISSID 51
#define WIFI_CONNECTED 52
#define WIFI_PING_SCAN 53
#define WIFI_PORT_SCAN_ALL 54
#define GPS_TRACKER 55
#define WIFI_ATTACK_BAD_MSG 56
#define WIFI_ATTACK_BAD_MSG_TARGETED 57
#define WIFI_SCAN_TELNET 58
#define WIFI_SCAN_SSH 59
#define WIFI_ARP_SCAN 60
#define WIFI_ATTACK_SLEEP 61
#define WIFI_ATTACK_SLEEP_TARGETED 62
#define GPS_POI 63
#define WIFI_SCAN_DNS 64
#define WIFI_SCAN_HTTP 65
#define WIFI_SCAN_HTTPS 66
#define WIFI_SCAN_SMTP 67
#define WIFI_SCAN_RDP 68
#define WIFI_HOSTSPOT 69 // Nice
#define BT_SCAN_AIRTAG_MON 70
#define WIFI_SCAN_CHAN_ACT 71
#define BT_SCAN_FLOCK 72
#define BT_SCAN_SIMPLE 73
#define BT_SCAN_SIMPLE_TWO 74
#define BT_SCAN_FLOCK_WARDRIVE 75
#define WIFI_ATTACK_FUNNY_BEACON 99
#define BASE_MULTIPLIER 4
@@ -118,6 +160,8 @@
#define MAX_CHANNEL 14
#define MAX_PORT 65535
#define WIFI_SECURITY_OPEN 0
#define WIFI_SECURITY_WEP 1
#define WIFI_SECURITY_WPA 2
@@ -171,38 +215,17 @@ extern Settings settings_obj;
esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
/*struct ssid {
String essid;
uint8_t channel;
int bssid[6];
bool selected;
};*/
/*struct AccessPoint {
String essid;
int channel;
int bssid[6];
bool selected;
LinkedList<char>* beacon;
int rssi;
LinkedList<int>* stations;
};*/
/*struct mac_addr {
unsigned char bytes[6];
};
struct Station {
uint8_t mac[6];
bool selected;
};*/
#ifdef HAS_DUAL_BAND
esp_err_t esp_base_mac_addr_set(uint8_t *Mac);
#endif
struct AirTag {
String mac; // MAC address of the AirTag
std::vector<uint8_t> payload; // Payload data
uint16_t payloadSize;
bool selected;
int8_t rssi;
uint32_t last_seen;
};
struct Flipper {
@@ -218,19 +241,23 @@ class WiFiScan
{
private:
// Wardriver thanks to https://github.com/JosephHewitt
int arp_count = 0;
#ifndef HAS_PSRAM
struct mac_addr mac_history[mac_history_len];
#endif
uint32_t chanActTime = 0;
uint8_t ap_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
uint8_t sta_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
uint8_t dual_band_channels[DUAL_BAND_CHANNELS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165, 169, 173, 177};
uint8_t dual_band_channel_index = 0;
// Settings
uint mac_history_cursor = 0;
uint8_t channel_hop_delay = 1;
bool force_pmkid = false;
bool force_probe = false;
bool save_pcap = false;
int x_pos; //position along the graph x axis
float y_pos_x; //current graph y axis position of X value
@@ -247,6 +274,8 @@ class WiFiScan
bool wsl_bypass_enabled = false;
bool scan_complete = false;
//int num_beacon = 0; // GREEN
//int num_probe = 0; // BLUE
//int num_deauth = 0; // RED
@@ -275,6 +304,22 @@ class WiFiScan
"08 and hurt you"
};
// H4W9 added Funny Beacon Spam
const char* funny_beacon[12] = {
"Abraham Linksys",
"Benjamin FrankLAN",
"Dora the Internet Explorer",
"FBI Surveillance Van 4",
"Get Off My LAN",
"Loading...",
"Martin Router King",
"404 Wi-Fi Unavailable",
"Test Wi-Fi Please Ignore",
"This LAN is My LAN",
"Titanic Syncing",
"Winternet is Coming"
};
char* prefix = "G";
typedef struct
@@ -392,6 +437,64 @@ class WiFiScan
0xf0, 0xff, 0x02, 0x00
};
uint8_t eapol_packet_bad_msg1[153] = {
0x08, 0x02, // Frame Control (EAPOL)
0x00, 0x00, // Duration
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination (Broadcast)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Source (BSSID)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BSSID
0x30, 0x00, // Sequence Control
/* LLC / SNAP */
0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00,
0x88, 0x8e, // Ethertype = EAPOL
/* -------- 802.1X Header -------- */
0x02, // Version 802.1X2004
0x03, // Type Key
0x00, 0x75, // Length 117 bytes
/* -------- EAPOLKey frame body (117 B) -------- */
0x02, // Desc Type 2 (AES/CCMP)
0x00, 0xCA, // Key Info (Install|Ack…)
0x00, 0x10, // Key Length = 16
/* Replay Counter (8) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
/* Nonce (32) */
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
/* KeyIV (16) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* KeyRSC (8) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* KeyID (8) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Key MIC (16) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* Key Data Len (2) */
0x00, 0x16,
/* Key Data (22 B) */
0xDD, 0x14, // Vendorspecific (PMKID IE)
0x00, 0x0F, 0xAC, 0x04, // OUI + Type (PMKID)
/* PMKID (16 byte zero) */
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11
};
uint8_t association_packet[200] = {
0x00, 0x10, // Frame Control (Association Request) PM=1
0x3a, 0x01, // Duration
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination (Broadcast)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Source (Fake Source or BSSID)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BSSID
0x00, 0x00, // Sequence Control
0x31, 0x00, // Capability Information (PM=1)
0x0a, 0x00, // Listen Interval
0x00, // SSID tag
0x00, // SSID length
};
enum EBLEPayloadType
{
Microsoft,
@@ -422,14 +525,21 @@ class WiFiScan
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
#endif
void showNetworkInfo();
void setNetworkInfo();
void fullARP();
bool readARP(IPAddress targ_ip);
bool singleARP(IPAddress ip_addr);
void pingScan(uint8_t scan_mode = WIFI_PING_SCAN);
void portScan(uint8_t scan_mode = WIFI_PORT_SCAN_ALL, uint16_t targ_port = 22);
bool isHostAlive(IPAddress ip);
bool checkHostPort(IPAddress ip, uint16_t port, uint16_t timeout = 100);
String extractManufacturer(const uint8_t* payload);
int checkMatchAP(char addr[]);
bool beaconHasWPS(const uint8_t* payload, int len);
uint8_t getSecurityType(const uint8_t* beacon, uint16_t len);
void addAnalyzerValue(int16_t value, int rssi_avg, int16_t target_array[], int array_size);
bool seen_mac(unsigned char* mac);
bool mac_cmp(struct mac_addr addr1, struct mac_addr addr2);
void save_mac(unsigned char* mac);
void clearMacHistory();
void executeWarDrive();
void executeSourApple();
@@ -444,6 +554,7 @@ class WiFiScan
void signalAnalyzerLoop(uint32_t tick);
void channelAnalyzerLoop(uint32_t tick);
void channelActivityLoop(uint32_t tick);
void packetRateLoop(uint32_t tick);
void packetMonitorMain(uint32_t currentTime);
void eapolMonitorMain(uint32_t currentTime);
@@ -455,14 +566,19 @@ class WiFiScan
void tftDrawGraphObjects();
void sendProbeAttack(uint32_t currentTime);
void sendDeauthAttack(uint32_t currentTime, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
void sendBadMsgAttack(uint32_t currentTime, bool all = false);
void sendAssocSleepAttack(uint32_t currentTime, bool all = false);
void sendDeauthFrame(uint8_t bssid[6], int channel, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
void sendDeauthFrame(uint8_t bssid[6], int channel, uint8_t mac[6]);
void sendEapolBagMsg1(uint8_t bssid[6], int channel, String dst_mac_str = "ff:ff:ff:ff:ff:ff", uint8_t sec = WIFI_SECURITY_WPA2);
void sendEapolBagMsg1(uint8_t bssid[6], int channel, uint8_t mac[6], uint8_t sec = WIFI_SECURITY_WPA2);
void sendAssociationSleep(const char* ESSID, uint8_t bssid[6], int channel, uint8_t mac[6]);
void sendAssociationSleep(const char* ESSID, uint8_t bssid[6], int channel, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
void broadcastRandomSSID(uint32_t currentTime);
void broadcastCustomBeacon(uint32_t current_time, ssid custom_ssid);
void broadcastCustomBeacon(uint32_t current_time, AccessPoint custom_ssid);
void broadcastSetSSID(uint32_t current_time, const char* ESSID);
void RunAPScan(uint8_t scan_mode, uint16_t color);
void RunGPSInfo();
void RunGPSNmea();
void RunMimicFlood(uint8_t scan_mode, uint16_t color);
void RunPwnScan(uint8_t scan_mode, uint16_t color);
@@ -478,10 +594,13 @@ class WiFiScan
void RunBluetoothScan(uint8_t scan_mode, uint16_t color);
void RunSourApple(uint8_t scan_mode, uint16_t color);
void RunSwiftpairSpam(uint8_t scan_mode, uint16_t color);
void RunLvJoinWiFi(uint8_t scan_mode, uint16_t color);
void RunEvilPortal(uint8_t scan_mode, uint16_t color);
void RunPingScan(uint8_t scan_mode, uint16_t color);
void RunPortScanAll(uint8_t scan_mode, uint16_t color);
bool checkMem();
void parseBSSID(const char* bssidStr, uint8_t* bssid);
void writeHeader(bool poi = false);
void writeFooter(bool poi = false);
public:
@@ -502,6 +621,29 @@ class WiFiScan
int8_t min_rssi = 0;
int8_t max_rssi = -128;
int bt_frames = 0;
bool force_pmkid = false;
bool force_probe = false;
bool save_pcap = false;
bool ep_deauth = false;
bool ble_scanning = false;
char* flock_ssid[4] = {
"flock",
"penguin",
"pigvision",
"fs ext battery"
};
#ifdef HAS_DUAL_BAND
uint8_t channel_activity[DUAL_BAND_CHANNELS] = {};
#else
uint8_t channel_activity[MAX_CHANNEL] = {};
#endif
uint8_t activity_page = 1;
String analyzer_name_string = "";
uint8_t analyzer_frames_recvd = 0;
@@ -517,11 +659,20 @@ class WiFiScan
bool orient_display = false;
bool wifi_initialized = false;
bool ble_initialized = false;
bool wifi_connected = false;
String free_ram = "";
String old_free_ram = "";
String connected_network = "";
IPAddress ip_addr;
IPAddress gateway;
IPAddress subnet;
IPAddress current_scan_ip;
uint16_t current_scan_port = 1;
String dst_mac = "ff:ff:ff:ff:ff:ff";
byte src_mac[6] = {};
@@ -536,37 +687,57 @@ class WiFiScan
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
wifi_init_config_t cfg2 = { \
.event_handler = &esp_event_send_internal, \
.osi_funcs = &g_wifi_osi_funcs, \
.wpa_crypto_funcs = g_wifi_default_wpa_crypto_funcs, \
.static_rx_buf_num = 6,\
.dynamic_rx_buf_num = 6,\
.tx_buf_type = 0,\
.static_tx_buf_num = 1,\
.dynamic_tx_buf_num = WIFI_DYNAMIC_TX_BUFFER_NUM,\
.cache_tx_buf_num = 0,\
.csi_enable = false,\
.ampdu_rx_enable = false,\
.ampdu_tx_enable = false,\
.amsdu_tx_enable = false,\
.nvs_enable = false,\
.nano_enable = WIFI_NANO_FORMAT_ENABLED,\
.rx_ba_win = 6,\
.wifi_task_core_id = WIFI_TASK_CORE_ID,\
.beacon_max_len = 752, \
.mgmt_sbuf_num = 8, \
.feature_caps = g_wifi_feature_caps, \
.sta_disconnected_pm = WIFI_STA_DISCONNECTED_PM_ENABLED, \
.espnow_max_encrypt_num = 0, \
.magic = WIFI_INIT_CONFIG_MAGIC\
};
#ifndef HAS_DUAL_BAND
wifi_init_config_t cfg2 = { \
.event_handler = &esp_event_send_internal, \
.osi_funcs = &g_wifi_osi_funcs, \
.wpa_crypto_funcs = g_wifi_default_wpa_crypto_funcs, \
.static_rx_buf_num = 6,\
.dynamic_rx_buf_num = 6,\
.tx_buf_type = 0,\
.static_tx_buf_num = 1,\
.dynamic_tx_buf_num = WIFI_DYNAMIC_TX_BUFFER_NUM,\
.cache_tx_buf_num = 0,\
.csi_enable = false,\
.ampdu_rx_enable = false,\
.ampdu_tx_enable = false,\
.amsdu_tx_enable = false,\
.nvs_enable = false,\
.nano_enable = WIFI_NANO_FORMAT_ENABLED,\
.rx_ba_win = 6,\
.wifi_task_core_id = WIFI_TASK_CORE_ID,\
.beacon_max_len = 752, \
.mgmt_sbuf_num = 8, \
.feature_caps = g_wifi_feature_caps, \
.sta_disconnected_pm = WIFI_STA_DISCONNECTED_PM_ENABLED, \
.espnow_max_encrypt_num = 0, \
.magic = WIFI_INIT_CONFIG_MAGIC\
};
#else
wifi_country_t country = {
.cc = "PH",
.schan = 1,
.nchan = 13,
.policy = WIFI_COUNTRY_POLICY_AUTO,
};
wifi_init_config_t cfg2 = WIFI_INIT_CONFIG_DEFAULT();
#endif
wifi_config_t ap_config;
void drawChannelLine();
#ifdef HAS_SCREEN
int8_t checkAnalyzerButtons(uint32_t currentTime);
#endif
bool seen_mac(unsigned char* mac);
void save_mac(unsigned char* mac);
#ifdef HAS_BT
void copyNimbleMac(const BLEAddress &addr, unsigned char out[6]);
#endif
bool filterActive();
bool RunGPSInfo(bool tracker = false, bool display = true, bool poi = false);
void logPoint(String lat, String lon, float alt, String datetime, bool poi = false);
void setMac();
void renderRawStats();
void renderPacketRate();
@@ -576,6 +747,7 @@ class WiFiScan
void RunSetup();
int clearSSIDs();
int clearAPs();
int clearIPs();
int clearAirtags();
int clearFlippers();
int clearStations();
@@ -586,7 +758,8 @@ class WiFiScan
bool shutdownWiFi();
bool shutdownBLE();
bool scanning();
//void joinWiFi(String ssid, String password);
bool joinWiFi(String ssid, String password, bool gui = true);
bool startWiFi(String ssid, String password, bool gui = true);
String getStaMAC();
String getApMAC();
String freeRAM();
@@ -607,7 +780,8 @@ class WiFiScan
void RunLoadAPList();
void RunSaveATList(bool save_as = true);
void RunLoadATList();
void channelHop();
void RunSetupGPSTracker(uint8_t scan_mode);
void channelHop(bool filtered = false, bool ranged = false);
uint8_t currentScanMode = 0;
void main(uint32_t currentTime);
void StartScan(uint8_t scan_mode, uint16_t color = 0);
@@ -618,17 +792,18 @@ class WiFiScan
bool save_serial = false;
void startPcap(String file_name);
void startLog(String file_name);
void startGPX(String file_name);
//String macToString(const Station& station);
static void getMAC(char *addr, uint8_t* data, uint16_t offset);
static void pwnSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void stationSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallbackFull(void* buf, wifi_promiscuous_pkt_type_t type);
static void deauthSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconListSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void activeEapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void eapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
@@ -636,58 +811,5 @@ class WiFiScan
static void pineScanSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // Pineapple
static int extractPineScanChannel(const uint8_t* payload, int len); // Pineapple
static void multiSSIDSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // MultiSSID
/*#ifdef HAS_BT
enum EBLEPayloadType
{
Microsoft,
Apple,
Samsung,
Google
};
struct BLEData
{
NimBLEAdvertisementData AdvData;
NimBLEAdvertisementData ScanData;
};
struct WatchModel
{
uint8_t value;
const char *name;
};
WatchModel* watch_models = nullptr;
const WatchModel watch_models[] = {
{0x1A, "Fallback Watch"},
{0x01, "White Watch4 Classic 44m"},
{0x02, "Black Watch4 Classic 40m"},
{0x03, "White Watch4 Classic 40m"},
{0x04, "Black Watch4 44mm"},
{0x05, "Silver Watch4 44mm"},
{0x06, "Green Watch4 44mm"},
{0x07, "Black Watch4 40mm"},
{0x08, "White Watch4 40mm"},
{0x09, "Gold Watch4 40mm"},
{0x0A, "French Watch4"},
{0x0B, "French Watch4 Classic"},
{0x0C, "Fox Watch5 44mm"},
{0x11, "Black Watch5 44mm"},
{0x12, "Sapphire Watch5 44mm"},
{0x13, "Purpleish Watch5 40mm"},
{0x14, "Gold Watch5 40mm"},
{0x15, "Black Watch5 Pro 45mm"},
{0x16, "Gray Watch5 Pro 45mm"},
{0x17, "White Watch5 44mm"},
{0x18, "White & Black Watch5"},
{0x1B, "Black Watch6 Pink 40mm"},
{0x1C, "Gold Watch6 Gold 40mm"},
{0x1D, "Silver Watch6 Cyan 44mm"},
{0x1E, "Black Watch6 Classic 43m"},
{0x20, "Green Watch6 Classic 43m"},
};
#endif*/
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -97,7 +97,7 @@ CommandLine cli_obj;
MenuFunctions menu_function_obj;
#endif
#ifdef HAS_SD
#if defined(HAS_SD) && !defined(HAS_C5_SD)
SDInterface sd_obj;
#endif
@@ -147,9 +147,22 @@ void backlightOff() {
#endif
}
#ifdef HAS_C5_SD
SPIClass sharedSPI(SPI);
SDInterface sd_obj = SDInterface(&sharedSPI, SD_CS);
#endif
void setup()
{
esp_spiram_init();
#ifndef HAS_DUAL_BAND
esp_spiram_init();
#endif
#ifdef HAS_C5_SD
Serial.println("Starting shared SPI for C5 SD configuration...");
sharedSPI.begin(SD_SCK, SD_MISO, SD_MOSI);
delay(100);
#endif
#ifdef defined(MARAUDER_M5STICKC) && !defined(MARAUDER_M5STICKCP2)
axp192_obj.begin();
@@ -175,7 +188,7 @@ void setup()
digitalWrite(TFT_CS, HIGH);
#endif
#ifdef HAS_SD
#if defined(HAS_SD) && !defined(HAS_C5_SD)
pinMode(SD_CS, OUTPUT);
delay(10);
@@ -207,29 +220,22 @@ void setup()
backlightOff();
// Draw the title screen
/*
#ifdef HAS_SCREEN
#ifndef MARAUDER_MINI
display_obj.drawJpeg("/marauder3L.jpg", 0 , 0); // 240 x 320 image
#ifndef MARAUDER_CARDPUTER
display_obj.tft.drawCentreString("ESP32 Marauder", TFT_WIDTH/2, TFT_HEIGHT * 0.33, 1);
display_obj.tft.drawCentreString("JustCallMeKoko", TFT_WIDTH/2, TFT_HEIGHT * 0.5, 1);
display_obj.tft.drawCentreString(display_obj.version_number, TFT_WIDTH/2, TFT_HEIGHT * 0.66, 1);
#else
display_obj.drawJpeg("/marauder3L.jpg", 0, 0);
display_obj.tft.drawCentreString("ESP32 Marauder", TFT_HEIGHT/2, TFT_WIDTH * 0.33, 1);
display_obj.tft.drawCentreString("JustCallMeKoko", TFT_HEIGHT/2, TFT_WIDTH * 0.5, 1);
display_obj.tft.drawCentreString(display_obj.version_number, TFT_HEIGHT/2, TFT_WIDTH * 0.66, 1);
#endif
#endif
*/
#ifdef HAS_SCREEN
display_obj.tft.drawCentreString("ESP32 Marauder", TFT_WIDTH/2, TFT_HEIGHT * 0.33, 1);
display_obj.tft.drawCentreString("JustCallMeKoko", TFT_WIDTH/2, TFT_HEIGHT * 0.5, 1);
display_obj.tft.drawCentreString(display_obj.version_number, TFT_WIDTH/2, TFT_HEIGHT * 0.66, 1);
#endif
backlightOn(); // Need this
#ifdef HAS_SCREEN
//delay(2000);
// Do some stealth mode stuff
#ifdef HAS_BUTTONS
if (c_btn.justPressed()) {
@@ -240,28 +246,10 @@ void setup()
Serial.println("Headless Mode enabled");
}
#endif
//display_obj.clearScreen();
//display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK);
//display_obj.tft.println(text_table0[0]);
//delay(2000);
//display_obj.tft.println("Marauder " + display_obj.version_number + "\n");
//display_obj.tft.println(text_table0[1]);
#endif
settings_obj.begin();
wifi_scan_obj.RunSetup();
//#ifdef HAS_SCREEN
// display_obj.tft.println(F(text_table0[2]));
//#endif
buffer_obj = Buffer();
#if defined(HAS_SD)
// Do some SD stuff
@@ -270,6 +258,8 @@ void setup()
#endif
wifi_scan_obj.RunSetup();
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
display_obj.tft.drawCentreString("Initializing...", TFT_WIDTH/2, TFT_HEIGHT * 0.82, 1);
@@ -280,14 +270,6 @@ void setup()
#ifdef HAS_BATTERY
battery_obj.RunSetup();
#endif
#ifdef HAS_SCREEN
//display_obj.tft.println(F(text_table0[5]));
#endif
#ifdef HAS_SCREEN
//display_obj.tft.println(F(text_table0[6]));
#endif
#ifdef HAS_BATTERY
battery_obj.battery_level = battery_obj.getBatteryLevel();
@@ -304,34 +286,28 @@ void setup()
led_obj.RunSetup();
#endif
#ifdef HAS_SCREEN
//display_obj.tft.println(F(text_table0[7]));
//delay(500);
#endif
#ifdef HAS_GPS
gps_obj.begin();
//#ifdef HAS_SCREEN
//if (gps_obj.getGpsModuleStatus())
//display_obj.tft.println("GPS Module connected");
//else
//display_obj.tft.println("GPS Module NOT connected");
//#endif
#endif
#ifdef HAS_SCREEN
//display_obj.tft.println(F(text_table0[8]));
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
//delay(2000);
#endif
#ifdef HAS_SCREEN
menu_function_obj.RunSetup();
#endif
/*char ssidBuf[64] = {0}; // or prefill with existing SSID
if (keyboardInput(ssidBuf, sizeof(ssidBuf), "Enter SSID")) {
// user pressed OK
Serial.println(ssidBuf);
} else {
Serial.println(F("User exited keyboard"));
}
menu_function_obj.changeMenu(menu_function_obj.current_menu);*/
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
Serial.println(F("CLI Ready"));

View File

@@ -105,6 +105,10 @@ PROGMEM const char text1_61[] = "Select Stations";
PROGMEM const char text1_62[] = "Deauth Targeted";
PROGMEM const char text1_63[] = "Detect Pineapple";
PROGMEM const char text1_64[] = "Detect MultiSSID";
PROGMEM const char text1_65[] = "Select probe SSIDs";
PROGMEM const char text1_66[] = "GPS"; // Text label for GPS Menu in Main Menu
PROGMEM const char text1_67[] = "Funny SSID Beacon";
//SDInterface.cpp texts
PROGMEM const char text2_0[] = "Error, could not find update.bin";
@@ -164,9 +168,9 @@ PROGMEM const char text4_28[] = "SD Card: Connected";
PROGMEM const char text4_29[] = "SD Card Size: ";
PROGMEM const char text4_30[] = "SD Card: Not Connected";
PROGMEM const char text4_31[] = "SD Card Size: 0";
PROGMEM const char text4_32[] = "IP5306 I2C: supported";
PROGMEM const char text4_32[] = "Battery Monitor: supported";
PROGMEM const char text4_33[] = "Battery Lvl: ";
PROGMEM const char text4_34[] = "IP5306 I2C: not supported";
PROGMEM const char text4_34[] = "Battery Monitor: not supported";
PROGMEM const char text4_35[] = "Internal temp: ";
PROGMEM const char text4_36[] = " Detect Espressif ";
PROGMEM const char text4_37[] = " Detect Pwnagotchi ";
@@ -185,7 +189,7 @@ PROGMEM const char text4_49[] = " Detect MultiSSID ";
//Making tables
PROGMEM const char *text_table0[] = {text0_0,text0_1, text0_2, text0_3, text0_4, text0_5, text0_6, text0_7, text0_8};
PROGMEM const char *text_table1[] = {text1_0,text1_1,text1_2,text1_3,text1_4,text1_5,text1_6,text1_7,text1_8,text1_9,text1_10,text1_11,text1_12,text1_13,text1_14,text1_15,text1_16,text1_17,text1_18,text1_19,text1_20,text1_21,text1_22,text1_23,text1_24,text1_25,text1_26,text1_27,text1_28,text1_29,text1_30,text1_31,text1_32,text1_33,text1_34,text1_35,text1_36,text1_37,text1_38,text1_39,text1_40,text1_41,text1_42,text1_43,text1_44,text1_45,text1_46,text1_47,text1_48,text1_49,text1_50,text1_51,text1_52,text1_53,text1_54,text1_55,text1_56,text1_57,text1_58,text1_59,text1_60,text1_61,text1_62,text1_63,text1_64};
PROGMEM const char *text_table1[] = {text1_0,text1_1,text1_2,text1_3,text1_4,text1_5,text1_6,text1_7,text1_8,text1_9,text1_10,text1_11,text1_12,text1_13,text1_14,text1_15,text1_16,text1_17,text1_18,text1_19,text1_20,text1_21,text1_22,text1_23,text1_24,text1_25,text1_26,text1_27,text1_28,text1_29,text1_30,text1_31,text1_32,text1_33,text1_34,text1_35,text1_36,text1_37,text1_38,text1_39,text1_40,text1_41,text1_42,text1_43,text1_44,text1_45,text1_46,text1_47,text1_48,text1_49,text1_50,text1_51,text1_52,text1_53,text1_54,text1_55,text1_56,text1_57,text1_58,text1_59,text1_60,text1_61,text1_62,text1_63,text1_64, text1_65, text1_66, text1_67};
PROGMEM const char *text_table2[] = {text2_0,text2_1,text2_2,text2_3,text2_4,text2_5,text2_6,text2_7,text2_8,text2_9,text2_10,text2_11,text2_12,text2_13,text2_14};
PROGMEM const char *text_table3[] = {text3_0,text3_1,text3_2,text3_3,text3_4,text3_5};
PROGMEM const char *text_table4[] = {text4_0,text4_1,text4_2,text4_3,text4_4,text4_5,text4_6,text4_7,text1_54,text4_9,text4_10,text4_11,text4_12,text4_13,text4_14,text4_15,text4_16,text4_17,text4_18,text4_19,text4_20,text4_21,text4_22,text4_23,text4_24,text4_25,text4_26,text4_27,text4_28,text4_29,text4_30,text4_31,text4_32,text4_33,text4_34,text4_35,text4_36,text4_37,text4_38,text4_39,text4_40,text4_41,text4_42,text4_43,text4_44,text4_45,text4_46,text4_47,text4_48,text4_49};

View File

@@ -82,6 +82,10 @@ String Settings::loadSetting<String>(String key) {
return json["Settings"][i]["value"];
}
Serial.println("Did not find setting named " + (String)key + ". Creating...");
if (this->createDefaultSettings(SPIFFS, true, json["Settings"].size(), "String", key))
return "";
return "";
}
@@ -91,7 +95,7 @@ bool Settings::loadSetting<bool>(String key) {
DynamicJsonDocument json(1024); // ArduinoJson v6
if (deserializeJson(json, this->json_settings_string)) {
Serial.println("\nCould not parse json");
Serial.println("Could not parse json to load");
}
for (int i = 0; i < json["Settings"].size(); i++) {
@@ -99,6 +103,10 @@ bool Settings::loadSetting<bool>(String key) {
return json["Settings"][i]["value"];
}
Serial.println("Did not find setting named " + (String)key + ". Creating...");
if (this->createDefaultSettings(SPIFFS, true, json["Settings"].size(), "bool", key))
return true;
return false;
}
@@ -165,6 +173,52 @@ bool Settings::saveSetting<bool>(String key, bool value) {
return false;
}
template <typename T>
T Settings::saveSetting(String key, String value) {}
template<>
bool Settings::saveSetting<bool>(String key, String value) {
DynamicJsonDocument json(1024); // ArduinoJson v6
if (deserializeJson(json, this->json_settings_string)) {
Serial.println("\nCould not parse json");
}
String settings_string;
for (int i = 0; i < json["Settings"].size(); i++) {
if (json["Settings"][i]["name"].as<String>() == key) {
json["Settings"][i]["value"] = value;
Serial.println("Saving setting...");
File settingsFile = SPIFFS.open("/settings.json", FILE_WRITE);
if (!settingsFile) {
Serial.println(F("Failed to create settings file"));
return false;
}
if (serializeJson(json, settingsFile) == 0) {
Serial.println(F("Failed to write to file"));
}
if (serializeJson(json, settings_string) == 0) {
Serial.println(F("Failed to write to string"));
}
// Close the file
settingsFile.close();
this->json_settings_string = settings_string;
this->printJsonSettings(settings_string);
return true;
}
}
return false;
}
bool Settings::toggleSetting(String key) {
DynamicJsonDocument json(1024); // ArduinoJson v6
@@ -239,7 +293,7 @@ void Settings::printJsonSettings(String json_string) {
}
}
bool Settings::createDefaultSettings(fs::FS &fs) {
bool Settings::createDefaultSettings(fs::FS &fs, bool spec, uint8_t index, String typeStr, String name) {
Serial.println(F("Creating default settings file: settings.json"));
File settingsFile = fs.open("/settings.json", FILE_WRITE);
@@ -249,51 +303,103 @@ bool Settings::createDefaultSettings(fs::FS &fs) {
return false;
}
DynamicJsonDocument jsonBuffer(1024);
String settings_string;
//jsonBuffer["Settings"][0]["name"] = "Channel";
//jsonBuffer["Settings"][0]["type"] = "uint8_t";
//jsonBuffer["Settings"][0]["value"] = 11;
//jsonBuffer["Settings"][0]["range"]["min"] = 1;
//jsonBuffer["Settings"][0]["range"]["max"] = 14;
if (!spec) {
DynamicJsonDocument jsonBuffer(1024);
//jsonBuffer["Settings"][1]["name"] = "Channel Hop Delay";
//jsonBuffer["Settings"][1]["type"] = "int";
//jsonBuffer["Settings"][1]["value"] = 1;
//jsonBuffer["Settings"][1]["range"]["min"] = 1;
//jsonBuffer["Settings"][1]["range"]["max"] = 10;
jsonBuffer["Settings"][0]["name"] = "ForcePMKID";
jsonBuffer["Settings"][0]["type"] = "bool";
jsonBuffer["Settings"][0]["value"] = false;
jsonBuffer["Settings"][0]["range"]["min"] = false;
jsonBuffer["Settings"][0]["range"]["max"] = true;
jsonBuffer["Settings"][0]["name"] = "ForcePMKID";
jsonBuffer["Settings"][0]["type"] = "bool";
jsonBuffer["Settings"][0]["value"] = true;
jsonBuffer["Settings"][0]["range"]["min"] = false;
jsonBuffer["Settings"][0]["range"]["max"] = true;
jsonBuffer["Settings"][1]["name"] = "ForceProbe";
jsonBuffer["Settings"][1]["type"] = "bool";
jsonBuffer["Settings"][1]["value"] = false;
jsonBuffer["Settings"][1]["range"]["min"] = false;
jsonBuffer["Settings"][1]["range"]["max"] = true;
jsonBuffer["Settings"][1]["name"] = "ForceProbe";
jsonBuffer["Settings"][1]["type"] = "bool";
jsonBuffer["Settings"][1]["value"] = true;
jsonBuffer["Settings"][1]["range"]["min"] = false;
jsonBuffer["Settings"][1]["range"]["max"] = true;
jsonBuffer["Settings"][2]["name"] = "SavePCAP";
jsonBuffer["Settings"][2]["type"] = "bool";
jsonBuffer["Settings"][2]["value"] = true;
jsonBuffer["Settings"][2]["range"]["min"] = false;
jsonBuffer["Settings"][2]["range"]["max"] = true;
jsonBuffer["Settings"][2]["name"] = "SavePCAP";
jsonBuffer["Settings"][2]["type"] = "bool";
jsonBuffer["Settings"][2]["value"] = true;
jsonBuffer["Settings"][2]["range"]["min"] = false;
jsonBuffer["Settings"][2]["range"]["max"] = true;
jsonBuffer["Settings"][3]["name"] = "EnableLED";
jsonBuffer["Settings"][3]["type"] = "bool";
jsonBuffer["Settings"][3]["value"] = true;
jsonBuffer["Settings"][3]["range"]["min"] = false;
jsonBuffer["Settings"][3]["range"]["max"] = true;
jsonBuffer["Settings"][3]["name"] = "EnableLED";
jsonBuffer["Settings"][3]["type"] = "bool";
jsonBuffer["Settings"][3]["value"] = true;
jsonBuffer["Settings"][3]["range"]["min"] = false;
jsonBuffer["Settings"][3]["range"]["max"] = true;
jsonBuffer["Settings"][4]["name"] = "EPDeauth";
jsonBuffer["Settings"][4]["type"] = "bool";
jsonBuffer["Settings"][4]["value"] = false;
jsonBuffer["Settings"][4]["range"]["min"] = false;
jsonBuffer["Settings"][4]["range"]["max"] = true;
//jsonBuffer.printTo(settingsFile);
if (serializeJson(jsonBuffer, settingsFile) == 0) {
Serial.println(F("Failed to write to file"));
jsonBuffer["Settings"][5]["name"] = "ClientSSID";
jsonBuffer["Settings"][5]["type"] = "String";
jsonBuffer["Settings"][5]["value"] = "";
jsonBuffer["Settings"][5]["range"]["min"] = "";
jsonBuffer["Settings"][5]["range"]["max"] = "";
jsonBuffer["Settings"][6]["name"] = "ClientPW";
jsonBuffer["Settings"][6]["type"] = "String";
jsonBuffer["Settings"][6]["value"] = "";
jsonBuffer["Settings"][6]["range"]["min"] = "";
jsonBuffer["Settings"][6]["range"]["max"] = "";
//jsonBuffer.printTo(settingsFile);
if (serializeJson(jsonBuffer, settingsFile) == 0) {
Serial.println(F("Failed to write to file"));
}
if (serializeJson(jsonBuffer, settings_string) == 0) {
Serial.println(F("Failed to write to string"));
}
}
if (serializeJson(jsonBuffer, settings_string) == 0) {
Serial.println(F("Failed to write to string"));
else {
DynamicJsonDocument json(1024); // ArduinoJson v6
if (deserializeJson(json, this->json_settings_string)) {
Serial.println("Could not parse json to create new setting");
return false;
}
if (typeStr == "bool") {
Serial.println("Creating bool setting...");
json["Settings"][index]["name"] = name;
json["Settings"][index]["type"] = typeStr;
json["Settings"][index]["value"] = false;
json["Settings"][index]["range"]["min"] = false;
json["Settings"][index]["range"]["max"] = true;
if (serializeJson(json, settings_string) == 0) {
Serial.println("Failed to write to string");
}
if (serializeJson(json, settingsFile) == 0) {
Serial.println("Failed to write to file");
}
}
else if (typeStr == "String") {
Serial.println("Creating String setting...");
json["Settings"][index]["name"] = name;
json["Settings"][index]["type"] = typeStr;
json["Settings"][index]["value"] = "";
json["Settings"][index]["range"]["min"] = "";
json["Settings"][index]["range"]["max"] = "";
if (serializeJson(json, settings_string) == 0) {
Serial.println("Failed to write to string");
}
if (serializeJson(json, settingsFile) == 0) {
Serial.println("Failed to write to file");
}
}
}
// Close the file

View File

@@ -31,6 +31,9 @@ class Settings {
template <typename T>
T saveSetting(String key, bool value);
template <typename T>
T saveSetting(String key, String value);
bool toggleSetting(String key);
String getSettingType(String key);
String setting_index_to_name(int i);
@@ -49,7 +52,7 @@ class Settings {
//uint8_t loadSetting<uint8_t>(String key);
String getSettingsString();
bool createDefaultSettings(fs::FS &fs);
bool createDefaultSettings(fs::FS &fs, bool spec = false, uint8_t index = 0, String typeStr = "bool", String name = "");
void printJsonSettings(String json_string);
void main(uint32_t currentTime);
};

View File

@@ -4,6 +4,7 @@
#include <Arduino.h>
#include <vector>
#include <WiFi.h>
#include "configs.h"
@@ -20,133 +21,10 @@ struct Station {
uint16_t ap;
};
const char apple_ouis[][9] PROGMEM = {
"00:17:F2", "00:1E:C2", "00:26:08", "F8:1E:DF", "BC:92:6B",
"28:E0:2C", "3C:07:54", "7C:D1:C3", "DC:A9:04", "F0:D1:A9",
"C0:2C:5C", "00:03:93", "00:03:94", "00:03:95", "00:03:96",
"00:03:97", "00:03:98", "00:03:99", "00:03:9A", "00:03:9B",
"00:03:9C", "00:03:9D", "00:03:9E", "00:03:9F", "00:03:A0",
"00:03:A1", "00:03:A2", "00:03:A3", "00:03:A4", "00:03:A5",
"00:03:A6", "00:03:A7", "00:03:A8", "00:03:A9", "00:03:AA",
"00:03:AB", "00:03:AC", "00:03:AD", "00:03:AE", "00:03:AF",
"00:03:B0", "00:03:B1", "00:03:B2", "00:03:B3", "00:03:B4",
"00:03:B5", "00:03:B6", "00:03:B7", "00:03:B8", "00:03:B9",
"00:03:BA", "00:03:BB", "00:03:BC", "00:03:BD", "00:03:BE",
"00:03:BF", "00:03:C0", "00:03:C1", "00:03:C2", "00:03:C3",
"00:03:C4", "00:03:C5", "00:03:C6", "00:03:C7", "00:03:C8",
"00:03:C9", "00:03:CA", "00:03:CB", "00:03:CC", "00:03:CD",
"00:03:CE", "00:03:CF", "00:03:D0", "00:03:D1", "00:03:D2",
"00:03:D3", "00:03:D4", "00:03:D5", "00:03:D6", "00:03:D7",
"00:03:D8", "00:03:D9", "00:03:DA", "00:03:DB", "00:03:DC",
"00:03:DD", "00:03:DE", "00:03:DF", "00:03:E0", "00:03:E1",
"00:03:E2", "00:03:E3", "00:03:E4", "00:03:E5", "00:03:E6",
"00:03:E7", "00:03:E8", "00:03:E9", "00:03:EA", "00:03:EB",
"00:03:EC", "00:03:ED", "00:03:EE", "00:03:EF", "00:03:F0",
"00:03:F1", "00:03:F2", "00:03:F3", "00:03:F4", "00:03:F5",
"00:03:F6", "00:03:F7", "00:03:F8", "00:03:F9", "00:03:FA",
"00:03:FB", "00:03:FC", "00:03:FD", "00:03:FE", "00:03:FF"
};
const char asus_ouis[][9] PROGMEM = {
"00:0C:6E", "00:0E:A6", "00:11:2F", "00:11:D8", "00:13:D4", "00:15:F2", "00:17:31", "00:18:F3", "00:1A:92",
"00:1B:FC", "00:1D:60", "00:1E:8C", "00:1F:C6", "00:22:15", "00:23:54", "00:24:8C", "00:26:18", "00:E0:18",
"04:42:1A", "04:92:26", "04:D4:C4", "04:D9:F5", "08:60:6E", "08:62:66", "08:BF:B8", "0C:9D:92", "10:7B:44",
"10:7C:61", "10:BF:48", "10:C3:7B", "14:DA:E9", "14:DD:A9", "18:31:BF", "1C:87:2C", "1C:B7:2C", "20:CF:30",
"24:4B:FE", "2C:4D:54", "2C:56:DC", "2C:FD:A1", "30:5A:3A", "30:85:A9", "34:97:F6", "38:2C:4A", "38:D5:47",
"3C:7C:3F", "40:16:7E", "40:B0:76", "48:5B:39", "4C:ED:FB", "50:46:5D", "50:EB:F6", "54:04:A6", "54:A0:50",
"58:11:22", "60:45:CB", "60:A4:4C", "60:CF:84", "70:4D:7B", "70:8B:CD", "74:D0:2B", "78:24:AF", "7C:10:C9",
"88:D7:F6", "90:E6:BA", "9C:5C:8E", "A0:36:BC", "A8:5E:45", "AC:22:0B", "AC:9E:17", "B0:6E:BF", "BC:AE:C5",
"BC:EE:7B", "C8:60:00", "C8:7F:54", "CC:28:AA", "D0:17:C2", "D4:5D:64", "D8:50:E6", "E0:3F:49", "E0:CB:4E",
"E8:9C:25", "F0:2F:74", "F0:79:59", "F4:6D:04", "F8:32:E4", "FC:34:97", "FC:C2:33"
};
const char belkin_ouis[][9] PROGMEM = {
"00:11:50", "00:17:3F", "00:30:BD", "08:BD:43", "14:91:82", "24:F5:A2", "30:23:03", "80:69:1A", "94:10:3E",
"94:44:52", "B4:75:0E", "C0:56:27", "C4:41:1E", "D8:EC:5E", "E8:9F:80", "EC:1A:59", "EC:22:80"
};
const char cisco_ouis[][9] PROGMEM = {
"00:1B:0D", "00:1D:45", "00:1E:7A", "00:25:9C", "00:50:56",
"40:55:39", "58:8D:09", "A4:4C:C8", "F8:0F:F9"
};
const char dlink_ouis[][9] PROGMEM = {
"00:05:5D", "00:0D:88", "00:0F:3D", "00:11:95", "00:13:46", "00:15:E9", "00:17:9A", "00:19:5B", "00:1B:11",
"00:1C:F0", "00:1E:58", "00:21:91", "00:22:B0", "00:24:01", "00:26:5A", "00:AD:24", "04:BA:D6", "08:5A:11",
"0C:0E:76", "0C:B6:D2", "10:62:EB", "10:BE:F5", "14:D6:4D", "18:0F:76", "1C:5F:2B", "1C:7E:E5", "1C:AF:F7",
"1C:BD:B9", "28:3B:82", "30:23:03", "34:08:04", "34:0A:33", "3C:1E:04", "3C:33:32", "40:86:CB", "40:9B:CD",
"54:B8:0A", "5C:D9:98", "60:63:4C", "64:29:43", "6C:19:8F", "6C:72:20", "74:44:01", "74:DA:DA", "78:32:1B",
"78:54:2E", "78:98:E8", "80:26:89", "84:C9:B2", "88:76:B9", "90:8D:78", "90:94:E4", "9C:D6:43", "A0:63:91",
"A0:AB:1B", "A4:2A:95", "A8:63:7D", "AC:F1:DF", "B4:37:D8", "B8:A3:86", "BC:0F:9A", "BC:22:28", "BC:F6:85",
"C0:A0:BB", "C4:A8:1D", "C4:E9:0A", "C8:78:7D", "C8:BE:19", "C8:D3:A3", "CC:B2:55", "D8:FE:E3", "DC:EA:E7",
"E0:1C:FC", "E4:6F:13", "E8:CC:18", "EC:22:80", "EC:AD:E0", "F0:7D:68", "F0:B4:D2", "F4:8C:EB", "F8:E9:03",
"FC:75:16"
};
const char google_ouis[][9] PROGMEM = {
"3C:5A:B4", "5C:BF:C0", "78:4F:43", "A4:77:33", "D4:97:0B", "F0:72:8C"
};
const char huawei_ouis[][9] PROGMEM = {
"00:1A:2B", "28:FF:3C", "5C:4C:A9", "8C:71:F8", "C8:D1:5E",
"E4:4C:A9", "F4:12:FA"
};
const char lg_ouis[][9] PROGMEM = {
"00:17:C0", "18:AF:8F", "38:2D:AE", "5C:87:9C", "68:27:37",
"78:5D:C8", "94:65:2D", "A4:77:33", "C4:43:8F"
};
const char linksys_ouis[][9] PROGMEM = {
"00:04:5A", "00:06:25", "00:0C:41", "00:0E:08", "00:0F:66", "00:12:17", "00:13:10", "00:14:BF", "00:16:B6",
"00:18:39", "00:18:F8", "00:1A:70", "00:1C:10", "00:1D:7E", "00:1E:E5", "00:21:29", "00:22:6B", "00:23:69",
"00:25:9C", "00:23:54", "00:24:B2", "00:31:92", "00:5F:67", "10:27:F5", "14:EB:B6", "1C:61:B4", "20:36:26",
"28:87:BA", "30:5A:3A", "2C:FD:A1", "30:23:03", "30:46:9A", "40:ED:00", "48:22:54", "50:91:E3", "54:AF:97",
"5C:A2:F4", "5C:A6:E6", "5C:E9:31", "60:A4:B7", "68:7F:F0", "6C:5A:B0", "78:8C:B5", "7C:C2:C6", "9C:53:22",
"9C:A2:F4", "A8:42:A1", "AC:15:A2", "B0:A7:B9", "B4:B0:24", "C0:06:C3", "CC:68:B6", "E8:48:B8", "F0:A7:31"
};
const char netgear_ouis[][9] PROGMEM = {
"00:09:5B", "00:0F:B5", "00:14:6C", "00:1B:2F", "00:1E:2A", "00:1F:33", "00:22:3F", "00:22:4B", "00:26:F2",
"00:8E:F2", "08:02:8E", "08:36:C9", "08:BD:43", "10:0C:6B", "10:0D:7F", "10:DA:43", "14:59:C0", "20:4E:7F",
"20:E5:2A", "28:80:88", "28:94:01", "28:C6:8E", "2C:30:33", "2C:B0:5D", "30:46:9A", "34:98:B5", "38:94:ED",
"3C:37:86", "40:5D:82", "44:A5:6E", "4C:60:DE", "50:4A:6E", "50:6A:03", "54:07:7D", "58:EF:68", "60:38:E0",
"6C:B0:CE", "6C:CD:D6", "74:44:01", "80:37:73", "84:1B:5E", "8C:3B:AD", "94:18:65", "9C:3D:CF", "9C:C9:EB",
"9C:D3:6D", "A0:04:60", "A0:21:B7", "A0:40:A0", "A4:2B:8C", "B0:39:56", "B0:7F:B9", "B0:B9:8A", "BC:A5:11",
"C0:3F:0E", "C0:FF:D4", "C4:04:15", "C4:3D:C7", "C8:9E:43", "CC:40:D0", "DC:EF:09", "E0:46:9A", "E0:46:EE",
"E0:91:F5", "E4:F4:C6", "E8:FC:AF", "F8:73:94"
};
const char oneplus_ouis[][9] PROGMEM = {
"08:EC:A9", "30:9C:23", "38:78:62", "64:A2:F9", "74:AC:B9",
"A8:14:51", "B4:86:55", "D8:CB:8A", "F4:8C:50"
};
const char samsung_ouis[][9] PROGMEM = {
"00:12:47", "00:15:99", "00:16:6B", "00:1B:FC", "10:5F:06",
"18:59:36", "20:02:AF", "24:4B:03", "38:2D:3D", "40:B8:37",
"00:1F:12", "00:1D:0F", "00:1A:9A", "00:19:E1", "00:18:FF",
"00:17:77", "00:16:72", "00:14:69", "00:13:65", "00:12:60",
"30:37:0D", "40:8C:47", "50:55:5F", "60:47:A1", "70:0A:AD",
"80:61:43", "90:48:F7", "A0:4C:CB", "B0:5E:93", "C0:3D:F5",
"D0:31:AA", "E0:4F:02", "F0:3B:94"
};
const char sony_ouis[][9] PROGMEM = {
"00:19:C5", "00:1B:59", "00:1E:DC", "10:68:3F", "54:42:49",
"A8:E3:EE", "B8:F9:34", "CC:5D:4E", "E8:89:2F"
};
const char tplink_ouis[][9] PROGMEM = {
"00:31:92", "00:5F:67", "10:27:F5", "14:EB:B6", "1C:61:B4", "20:36:26", "28:87:BA", "30:DE:4B", "34:60:F9",
"3C:52:A1", "40:ED:00", "48:22:54", "50:91:E3", "54:AF:97", "5C:62:8B", "5C:A6:E6", "5C:E9:31", "60:A4:B7",
"68:7F:F0", "6C:5A:B0", "78:8C:B5", "7C:C2:C6", "9C:53:22", "9C:A2:F4", "A8:42:A1", "AC:15:A2", "B0:A7:B9",
"B4:B0:24", "C0:06:C3", "CC:68:B6", "E8:48:B8", "F0:A7:31"
};
const char xiaomi_ouis[][9] PROGMEM = {
"04:CF:8C", "18:59:36", "38:1A:2D", "64:B4:73", "78:02:F8",
"90:4E:91", "C4:0B:CB", "D0:DB:32"
struct ProbeReqSsid {
String essid;
bool selected;
uint8_t requests;
};
uint8_t getDRAMUsagePercent() {
@@ -292,7 +170,7 @@ void convertMacStringToUint8(const String& macStr, uint8_t macAddr[6]) {
}
// Function to check if the given MAC address matches any known OUI
const char* getManufacturer(const char *addr) {
/*const char* getManufacturer(const char *addr) {
static char oui[9]; // Temporary buffer for extracted OUI
// Extract the first three bytes (OUI) from addr
@@ -309,7 +187,7 @@ const char* getManufacturer(const char *addr) {
for (uint8_t i = 0; i < sizeof(list) / sizeof(list[0]); i++) { \
char storedOUI[9]; \
strcpy_P(storedOUI, list[i]); \
/* Convert the stored OUI to lowercase */ \
\
for (int j = 0; j < 8; j++) { \
storedOUI[j] = tolower(storedOUI[j]); \
} \
@@ -348,6 +226,58 @@ String replaceOUIWithManufacturer(const char *sta_addr) {
// Construct the new address: manufacturer + the remaining MAC address (after the first 3 bytes)
return String(manufacturer) + mac_suffix;
}*/
IPAddress getNextIP(IPAddress currentIP, IPAddress subnetMask) {
// Convert IPAddress to uint32_t
uint32_t ipInt = (currentIP[0] << 24) | (currentIP[1] << 16) | (currentIP[2] << 8) | currentIP[3];
uint32_t maskInt = (subnetMask[0] << 24) | (subnetMask[1] << 16) | (subnetMask[2] << 8) | subnetMask[3];
uint32_t networkBase = ipInt & maskInt;
uint32_t broadcast = networkBase | ~maskInt;
uint32_t nextIP = ipInt + 1;
if (nextIP <= networkBase) {
nextIP = networkBase + 1;
}
if (nextIP >= broadcast) {
return IPAddress(0, 0, 0, 0); // no more IPs
}
return IPAddress(
(nextIP >> 24) & 0xFF,
(nextIP >> 16) & 0xFF,
(nextIP >> 8) & 0xFF,
nextIP & 0xFF
);
}
IPAddress getPrevIP(IPAddress currentIP, IPAddress subnetMask, uint16_t stepsBack) {
// Convert IPAddress to uint32_t
uint32_t ipInt = (currentIP[0] << 24) | (currentIP[1] << 16) | (currentIP[2] << 8) | currentIP[3];
uint32_t maskInt = (subnetMask[0] << 24) | (subnetMask[1] << 16) | (subnetMask[2] << 8) | subnetMask[3];
uint32_t networkBase = ipInt & maskInt;
uint32_t broadcast = networkBase | ~maskInt;
uint32_t prevIP = ipInt - stepsBack;
// Ensure prevIP is not below the usable range
if (prevIP <= networkBase) {
return IPAddress(0, 0, 0, 0); // No more IPs
}
return IPAddress(
(prevIP >> 24) & 0xFF,
(prevIP >> 16) & 0xFF,
(prevIP >> 8) & 0xFF,
prevIP & 0xFF
);
}
uint16_t getNextPort(uint16_t port) {
return port + 1;
}
#endif

BIN
mechanical/C5 Adapter/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
pictures/icons/flock_22.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
pictures/icons/force_16.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,9 @@
#define 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_width 22
#define 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_height 22
static char 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_bits[] = {
0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x3F, 0x3F, 0x9F, 0x3F, 0xBF, 0xBF, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x7B, 0x3F, 0xDF, 0x7F, 0x3F, 0xDF, 0x7F, 0x3F,
0xDF, 0x7F, 0x3F, 0xBF, 0xBF, 0x3F, 0xBF, 0xBB, 0x3F, 0x3F, 0x9B, 0x3F,
0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0xFF, 0xE0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, };

View File

@@ -0,0 +1,6 @@
#define 3f9b97ac7933453c85ec3a8adb49feeejQ9bt0wTgiC65w8g_width 16
#define 3f9b97ac7933453c85ec3a8adb49feeejQ9bt0wTgiC65w8g_height 16
static char 3f9b97ac7933453c85ec3a8adb49feeejQ9bt0wTgiC65w8g_bits[] = {
0xFF, 0xFF, 0x1F, 0xF8, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
0x67, 0xE6, 0x77, 0xEE, 0x87, 0xE0, 0x8F, 0xF1, 0x0F, 0xF0, 0x4F, 0xF5,
0x1F, 0xF8, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, };

View File

@@ -0,0 +1,6 @@
#define 67ae760eaaa64924c492c46151d37f46mewyG1NBArKDOITT_width 16
#define 67ae760eaaa64924c492c46151d37f46mewyG1NBArKDOITT_height 16
static char 67ae760eaaa64924c492c46151d37f46mewyG1NBArKDOITT_bits[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0x87, 0xF7,
0x7F, 0xEE, 0xFF, 0xED, 0xC7, 0xDD, 0xBF, 0xDB, 0x7F, 0xDB, 0x67, 0xDB,
0x67, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, };