Compare commits

...

222 Commits

Author SHA1 Message Date
Just Call Me Koko
1dd5502c1d Merge pull request #1012 from justcallmekoko/develop
Fix crash during BT wardrive
2025-12-12 18:11:10 -05:00
Just Call Me Koko
1862a5b812 Fix crash during BT wardrive 2025-12-12 18:06:07 -05:00
Just Call Me Koko
f5375eedaf Merge pull request #1006 from justcallmekoko/develop
Wardriving is asynchronous now
2025-12-08 16:45:31 -05:00
Just Call Me Koko
2910addb8a Ensure async wardrive 2025-12-08 16:32:25 -05:00
Just Call Me Koko
be3971d081 Wardriving is async 2025-12-08 15:40:24 -05:00
Just Call Me Koko
86e2fb206a Merge pull request #1005 from justcallmekoko/develop
Add wifi to flock wardrive
2025-12-08 15:10:53 -05:00
Just Call Me Koko
431fa175a0 Update WiFiScan.cpp 2025-12-08 15:04:09 -05:00
Just Call Me Koko
976687980c Add wifi to flock wardrive 2025-12-08 14:53:55 -05:00
Just Call Me Koko
1d419605f7 Merge pull request #1001 from justcallmekoko/develop
Fix menu navigation for back button
2025-12-04 18:36:50 -05:00
Just Call Me Koko
1624d98183 Fix menu navigation for back button 2025-12-04 18:12:28 -05:00
Just Call Me Koko
dfd556da30 Merge pull request #999 from justcallmekoko/develop
Update NimBLE version in actions
2025-12-02 01:09:42 -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
03623e2985 Merge pull request #998 from justcallmekoko/develop
Update arduino esp32
2025-12-02 00:14:12 -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
4e7f48a036 Merge pull request #997 from justcallmekoko/develop
Add 5ghz channels for c5 packet injection
2025-12-01 18:44:52 -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
722b9ad88e Merge pull request #996 from justcallmekoko/develop
Merge develop
2025-12-01 01:44:59 -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
0a5e200294 Merge pull request #990 from justcallmekoko/develop
Add Flock wardriving
2025-11-24 13:27:21 -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
49 changed files with 7083 additions and 2842 deletions

View File

@@ -19,7 +19,7 @@ jobs:
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: "og", 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: "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" }
@@ -33,9 +33,10 @@ jobs:
- { 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:PartitionScheme=min_spiffs", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.0", nimble_ver: "2.3.0", 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
@@ -81,8 +82,8 @@ jobs:
- 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
@@ -92,16 +93,16 @@ jobs:
ref: v2.0.6
path: CustomMicroNMEA
#- name: Install ESPAsyncWebServer
# uses: actions/checkout@v2
# with:
# repository: ${{ matrix.board.esp_async }}
# ref: ${{ matrix.board.esp_async_ver }}
# path: CustomESPAsyncWebServer
- name: Install ESPAsyncWebServer
run: |
cp -r libraries/ESPAsyncWebServer ./CustomESPAsyncWebServer
uses: actions/checkout@v2
with:
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
@@ -142,7 +143,7 @@ jobs:
uses: actions/checkout@v2
with:
repository: adafruit/Adafruit_NeoPixel
ref: 1.10.7
ref: 1.12.0
path: CustomAdafruit_NeoPixel
- name: Install ArduinoJson
@@ -211,7 +212,7 @@ jobs:
done
fi
if [[ ${{ matrix.board.idf_ver }} == "3.3.0" ]]; then
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
@@ -234,21 +235,29 @@ jobs:
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:
@@ -261,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.

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

@@ -35,6 +35,7 @@
//#include <User_Setup_cyd_guition.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

@@ -227,7 +227,19 @@ PROGMEM static const unsigned char menu_icons[][66] = {
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}
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

@@ -217,12 +217,15 @@ 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);
@@ -259,6 +262,10 @@ void CommandLine::runCommand(String input) {
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
@@ -301,15 +308,15 @@ void CommandLine::runCommand(String input) {
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
}
@@ -368,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);
@@ -384,7 +391,7 @@ 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;
@@ -394,9 +401,9 @@ void CommandLine::runCommand(String input) {
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
}
@@ -406,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);
}
@@ -437,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
@@ -446,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
}
@@ -517,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;
}
@@ -529,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();
}
@@ -562,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();
@@ -571,18 +595,11 @@ 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
@@ -590,14 +607,14 @@ void CommandLine::runCommand(String input) {
int pr_sw = this->argSearch(&cmd_args, "-p");
if (pr_sw == -1) {
Serial.println("You did not provide a target index");
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("The provided index was not in range");
Serial.println(F("The provided index was not in range"));
return;
}
@@ -611,7 +628,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.setMac();
}
else {
Serial.println("Unable to set AP ESSID");
Serial.println(F("Unable to set AP ESSID"));
return;
}
@@ -806,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) {
@@ -818,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 {
@@ -829,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
@@ -839,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) {
@@ -894,6 +986,26 @@ void CommandLine::runCommand(String input) {
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
@@ -955,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;
}
}
@@ -991,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 {
@@ -1002,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) {
@@ -1047,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") {
@@ -1059,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") {
@@ -1071,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") {
@@ -1083,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") {
@@ -1095,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") {
@@ -1107,11 +1235,11 @@ 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"));
}
}
}
@@ -1139,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
}
@@ -1158,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
}
@@ -1180,13 +1308,13 @@ 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
}
@@ -1204,10 +1332,72 @@ void CommandLine::runCommand(String input) {
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) {
@@ -1228,12 +1418,44 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("The IP index specified is out of range");
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("You did not specify an IP index");
Serial.println(F("You did not specify an IP index"));
return;
}
}
@@ -1315,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;
}
}
@@ -1337,6 +1559,7 @@ void CommandLine::runCommand(String input) {
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();
@@ -1351,8 +1574,22 @@ void CommandLine::runCommand(String input) {
#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("You did not provide the proper args");
Serial.println(F("You did not provide the proper args"));
return;
}
}
@@ -1522,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;
}
}
@@ -1581,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
@@ -1594,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

@@ -53,6 +53,8 @@ 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";
@@ -75,14 +77,17 @@ 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";
@@ -92,6 +97,10 @@ 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";
@@ -116,7 +125,9 @@ 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
@@ -137,12 +148,13 @@ 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 [-f]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s]";
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>";
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/badmsg [-c]>";
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";
@@ -157,10 +169,14 @@ 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>";
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

@@ -109,6 +109,47 @@ bool Display::isTouchHeld(uint16_t threshold) {
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()
{
@@ -136,12 +177,7 @@ void Display::RunSetup()
#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
#elif defined(TFT_DIY)
uint16_t calData[5] = { 339, 3470, 237, 3438, 2 }; // tft.setRotation(0); // Portrait with DIY TFT
#endif
tft.setTouch(calData);
this->setCalData();
#endif
#endif
@@ -201,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()
@@ -397,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);
}
@@ -408,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);
@@ -570,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);
@@ -589,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
@@ -997,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

@@ -12,7 +12,7 @@
//#include <JPEGDecoder.h>
#include <LinkedList.h>
#include <SPI.h>
#include <lvgl.h>
//#include <lvgl.h>
#include <Ticker.h>
#include "SPIFFS.h"
#include "Assets.h"
@@ -124,7 +124,7 @@ class Display
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);
@@ -140,6 +140,7 @@ class Display
//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);
@@ -149,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

@@ -61,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
@@ -71,7 +71,7 @@ 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
@@ -125,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() {
@@ -145,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
@@ -157,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;
@@ -165,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;
@@ -317,14 +316,14 @@ bool EvilPortal::setAP(String essid) {
strncpy(apName, essid.c_str(), MAX_AP_NAME_SIZE);
this->has_ap = true;
Serial.println("ap config set");
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);
@@ -335,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
@@ -371,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"

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;
}

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,10 @@
#include "Keyboard.h"
#endif
#ifdef HAS_TOUCH
#include "TouchKeyboard.h"
#endif
#ifdef HAS_SCREEN
#define BATTERY_ANALOG_ON 0
@@ -92,41 +96,13 @@ extern Settings settings_obj;
#define MULTISSID_SNIFF 37 // Use blanks icon
#define JOINED 38
#define FORCE 39
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 join_wifi_keyboard_event_cb(lv_obj_t * keyboard, 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 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;
@@ -165,17 +141,20 @@ 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
@@ -189,9 +168,9 @@ class MenuFunctions
Menu wifiAPMenu;
Menu wifiIPMenu;
Menu ssidsMenu;
#ifdef HAS_BT
Menu airtagMenu;
#endif
//#ifdef HAS_BT
// Menu airtagMenu;
//#endif
//#ifndef HAS_ILI9341
Menu wifiStationMenu;
//#endif
@@ -218,13 +197,23 @@ class MenuFunctions
// 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 = "");
@@ -237,7 +226,9 @@ class MenuFunctions
void buttonSelected(int b, int x = -1);
void buttonNotSelected(int b, int x = -1);
//#if (!defined(HAS_ILI9341) && defined(HAS_BUTTONS))
#ifdef HAS_MINI_KB
String miniKeyboard(Menu * targetMenu, bool do_pass = false);
#endif
//#endif
#ifdef MARAUDER_CARDPUTER
@@ -263,6 +254,7 @@ class MenuFunctions
#ifdef HAS_GPS
// GPS Menu
Menu gpsInfoMenu;
Menu gpsPOIMenu;
#endif
Menu infoMenu;
@@ -277,17 +269,12 @@ class MenuFunctions
String loaded_file = "";
void joinWiFiGFX(String essid);
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);
@@ -298,3 +285,4 @@ class MenuFunctions
#endif
#endif

View File

@@ -37,7 +37,7 @@ bool SDInterface::initSD() {
*/
#if defined(MARAUDER_M5STICKC)
enum { SPI_SCK = 0, SPI_MISO = 36, SPI_MOSI = 26 };
#elif defined(HAS_CYD_TOUCH) || defined(MARAUDER_CARDPUTER)
#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 };
@@ -82,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
}
@@ -165,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);
@@ -173,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
@@ -275,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
@@ -294,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

@@ -65,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,7 +11,14 @@
#include <vector>
#ifdef HAS_BT
#include <NimBLEDevice.h> // 1.3.8
#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>
@@ -20,10 +27,15 @@
#include <math.h>
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#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
#ifdef HAS_BT
#if defined(HAS_BT) && !defined(HAS_DUAL_BAND)
#include "esp_bt.h"
#endif
#ifdef HAS_SCREEN
@@ -114,6 +126,26 @@
#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
@@ -192,6 +224,8 @@ struct AirTag {
std::vector<uint8_t> payload; // Payload data
uint16_t payloadSize;
bool selected;
int8_t rssi;
uint32_t last_seen;
};
struct Flipper {
@@ -207,10 +241,13 @@ 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};
@@ -267,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
@@ -390,7 +443,7 @@ class WiFiScan
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination (Broadcast)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Source (BSSID)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BSSID
0x00, 0x00, // Sequence Control
0x30, 0x00, // Sequence Control
/* LLC / SNAP */
0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00,
0x88, 0x8e, // Ethertype = EAPOL
@@ -422,11 +475,24 @@ class WiFiScan
/* Key Data Len (2) */
0x00, 0x16,
/* Key Data (22 B) */
0xDD, 0x16, // Vendorspecific (PMKID IE)
0xDD, 0x14, // Vendorspecific (PMKID IE)
0x00, 0x0F, 0xAC, 0x04, // OUI + Type (PMKID)
/* PMKID (16 byte zero) */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
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
@@ -459,8 +525,13 @@ class WiFiScan
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
#endif
void pingScan();
void portScan(uint8_t scan_mode = WIFI_PORT_SCAN_ALL);
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);
@@ -468,9 +539,7 @@ class WiFiScan
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();
@@ -485,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);
@@ -497,16 +567,18 @@ class WiFiScan
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(bool tracker = false);
void RunGPSNmea();
void RunMimicFlood(uint8_t scan_mode, uint16_t color);
void RunPwnScan(uint8_t scan_mode, uint16_t color);
@@ -522,15 +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 logPoint(String lat, String lon, float alt, String datetime);
void writeHeader();
void writeFooter();
void writeHeader(bool poi = false);
void writeFooter(bool poi = false);
public:
@@ -551,10 +621,28 @@ 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 = "";
@@ -638,9 +726,18 @@ class WiFiScan
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();
@@ -662,6 +759,7 @@ class WiFiScan
bool shutdownBLE();
bool scanning();
bool joinWiFi(String ssid, String password, bool gui = true);
bool startWiFi(String ssid, String password, bool gui = true);
String getStaMAC();
String getApMAC();
String freeRAM();
@@ -682,8 +780,8 @@ class WiFiScan
void RunLoadAPList();
void RunSaveATList(bool save_as = true);
void RunLoadATList();
void RunSetupGPSTracker();
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);
@@ -700,12 +798,12 @@ class WiFiScan
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);
@@ -713,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

View File

@@ -26,11 +26,13 @@
//#define MARAUDER_CYD_MICRO // 2432S028
//#define MARAUDER_CYD_2USB // Another 2432S028 but it has tWo UsBs OoOoOoO
//#define MARAUDER_CYD_GUITION // ESP32-2432S024 GUITION
//#define MARAUDER_CYD_3_5_INCH
//#define MARAUDER_C5
//#define MARAUDER_CARDPUTER
//#define MARAUDER_V8
//// END BOARD TARGETS
#define MARAUDER_VERSION "v1.8.2"
#define MARAUDER_VERSION "v1.9.0"
#define GRAPH_REFRESH 100
@@ -60,7 +62,9 @@
#elif defined(MARAUDER_CYD_MICRO)
#define HARDWARE_NAME "CYD 2432S028"
#elif defined(MARAUDER_CYD_2USB)
#define HARDWARE_NAME "CYD 2432S028 2USB"
#define HARDWARE_NAME "CYD 2432S028 2USB"
#elif defined(MARAUDER_CYD_3_5_INCH)
#define HARDWARE_NAME "CYD 3.5inch"
#elif defined(MARAUDER_CYD_GUITION)
#define HARDWARE_NAME "CYD 2432S024 GUITION"
#elif defined(MARAUDER_KIT)
@@ -77,6 +81,8 @@
#define HARDWARE_NAME "XIAO ESP32 S3"
#elif defined(MARAUDER_C5)
#define HARDWARE_NAME "ESP32-C5 DevKit"
#elif defined(MARAUDER_V8)
#define HARDWARE_NAME "Marauder v8"
#else
#define HARDWARE_NAME "ESP32"
#endif
@@ -220,7 +226,7 @@
#define HAS_TOUCH
#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
//#define HAS_BATTERY
#define HAS_BT
#define HAS_BT_REMOTE
#define HAS_BUTTONS
@@ -239,7 +245,7 @@
#define HAS_TOUCH
#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
//#define HAS_BATTERY
#define HAS_BT
#define HAS_BT_REMOTE
#define HAS_BUTTONS
@@ -255,6 +261,27 @@
#define HAS_CYD_PORTRAIT
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define HAS_TOUCH
#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
//#define HAS_BATTERY
#define HAS_BT
#define HAS_BT_REMOTE
#define HAS_BUTTONS
//#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
#define HAS_SCREEN
#define HAS_FULL_SCREEN
#define HAS_SD
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
//#define HAS_CYD_TOUCH
#define HAS_SEPARATE_SD
#define HAS_CYD_PORTRAIT
#endif
#ifdef MARAUDER_CYD_GUITION
#define HAS_TOUCH
#define HAS_FLIPPER_LED
@@ -380,9 +407,9 @@
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
//#define HAS_BATTERY
//#define HAS_BT
#define HAS_BT
//#define HAS_BUTTONS
//#define HAS_NEOPIXEL_LED
#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
//#define HAS_SCREEN
#define HAS_GPS
@@ -393,6 +420,26 @@
//#define HAS_PSRAM
//#define HAS_TEMP_SENSOR
#endif
#ifdef MARAUDER_V8
#define HAS_TOUCH
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
#define HAS_BT
//#define HAS_BUTTONS
//#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
#define HAS_SCREEN
#define HAS_FULL_SCREEN
#define HAS_GPS
#define HAS_C5_SD
#define HAS_SD
#define USE_SD
#define HAS_DUAL_BAND
#define HAS_PSRAM
//#define HAS_TEMP_SENSOR
#endif
//// END BOARD FEATURES
//// POWER MANAGEMENT
@@ -617,6 +664,26 @@
#define D_PULL true
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define L_BTN -1
#define C_BTN 0
#define U_BTN -1
#define R_BTN -1
#define D_BTN -1
//#define HAS_L
//#define HAS_R
//#define HAS_U
//#define HAS_D
#define HAS_C
#define L_PULL true
#define C_PULL true
#define U_PULL true
#define R_PULL true
#define D_PULL true
#endif
#ifdef MARAUDER_CYD_GUITION
#define L_BTN -1
#define C_BTN 0
@@ -644,6 +711,8 @@
#ifdef HAS_SCREEN
#ifdef MARAUDER_M5STICKC
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
//#define TFT_MISO 19
#define TFT_MOSI 15
@@ -669,7 +738,7 @@
#define TFT_HEIGHT 240
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 0
@@ -718,6 +787,8 @@
#endif
#if defined(MARAUDER_M5STICKCP2)
#define CHAN_PER_PAGE 7
#define MARAUDER_M5STICKC // From now on, everything is the same, except for one check in esp32_marauder.ino amd stickc_led.cpp/h
#define SCREEN_CHAR_WIDTH 40
@@ -743,7 +814,7 @@
#define TFT_HEIGHT 240
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 0
@@ -792,6 +863,8 @@
#endif
#ifdef MARAUDER_CARDPUTER
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
//#define TFT_MISO -1
#define TFT_MOSI 35
@@ -816,7 +889,7 @@
#define TFT_HEIGHT 240
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 0
@@ -865,6 +938,8 @@
#endif
#ifdef MARAUDER_V4
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
#define BANNER_TEXT_SIZE 2
@@ -879,7 +954,7 @@
#define TFT_SHIELD
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
@@ -929,6 +1004,8 @@
#endif
#if defined(MARAUDER_V6) || defined(MARAUDER_V6_1)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
@@ -943,10 +1020,84 @@
#endif
#ifndef MARAUDER_CYD_MICRO
#define TFT_DIY
#define TFT_DIY
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
#define SCREEN_BUFFER
#define MAX_SCREEN_BUFFER 22
#define SCREEN_ORIENTATION 0
#define CHAR_WIDTH 12
#define SCREEN_WIDTH TFT_WIDTH
#define SCREEN_HEIGHT TFT_HEIGHT
#define HEIGHT_1 TFT_WIDTH
#define WIDTH_1 TFT_HEIGHT
#define STANDARD_FONT_CHAR_LIMIT (TFT_WIDTH/6) // number of characters on a single line with normal font
#define TEXT_HEIGHT 16 // Height of text to be printed and scrolled
#define BOT_FIXED_AREA 0 // Number of lines in bottom fixed area (lines counted from bottom of screen)
#define TOP_FIXED_AREA 48 // Number of lines in top fixed area (lines counted from top of screen)
#define YMAX 320 // Bottom of screen area
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
//#define MENU_FONT NULL
#define MENU_FONT &FreeMono9pt7b // Winner
//#define MENU_FONT &FreeMonoBold9pt7b
//#define MENU_FONT &FreeSans9pt7b
//#define MENU_FONT &FreeSansBold9pt7b
#define BUTTON_SCREEN_LIMIT 12
#define BUTTON_ARRAY_LEN BUTTON_SCREEN_LIMIT
#define STATUS_BAR_WIDTH 16
#define LVGL_TICK_PERIOD 6
#define FRAME_X 100
#define FRAME_Y 64
#define FRAME_W 120
#define FRAME_H 50
// Red zone size
#define REDBUTTON_X FRAME_X
#define REDBUTTON_Y FRAME_Y
#define REDBUTTON_W (FRAME_W/2)
#define REDBUTTON_H FRAME_H
// Green zone size
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
#define GREENBUTTON_Y FRAME_Y
#define GREENBUTTON_W (FRAME_W/2)
#define GREENBUTTON_H FRAME_H
#define STATUSBAR_COLOR 0x4A49
#define KIT_LED_BUILTIN 13
#endif
#if defined(MARAUDER_V8)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
#define BANNER_TEXT_SIZE 2
#ifndef TFT_WIDTH
#define TFT_WIDTH 240
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 320
#endif
//#ifndef MARAUDER_CYD_MICRO
//#define TFT_DIY
//#define TFT_SHIELD
//#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
@@ -1000,6 +1151,8 @@
#endif
#if defined(MARAUDER_CYD_MICRO)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
@@ -1013,7 +1166,7 @@
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
@@ -1067,6 +1220,8 @@
#endif
#if defined(MARAUDER_CYD_2USB)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
#define HAS_ST7789
@@ -1081,7 +1236,7 @@
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
@@ -1134,7 +1289,81 @@
#define KIT_LED_BUILTIN 13
#endif
#if defined(MARAUDER_CYD_3_5_INCH)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
#define HAS_ST7796
#define BANNER_TEXT_SIZE 2
#ifndef TFT_WIDTH
#define TFT_WIDTH 320
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 480
#endif
#define TFT_DIY
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
#define SCREEN_BUFFER
#define MAX_SCREEN_BUFFER 33
#define SCREEN_ORIENTATION 0
#define CHAR_WIDTH 12
#define SCREEN_WIDTH TFT_WIDTH
#define SCREEN_HEIGHT TFT_HEIGHT
#define HEIGHT_1 TFT_WIDTH
#define WIDTH_1 TFT_HEIGHT
#define STANDARD_FONT_CHAR_LIMIT (TFT_WIDTH/6) // number of characters on a single line with normal font
#define TEXT_HEIGHT 16 // Height of text to be printed and scrolled
#define BOT_FIXED_AREA 0 // Number of lines in bottom fixed area (lines counted from bottom of screen)
#define TOP_FIXED_AREA 48 // Number of lines in top fixed area (lines counted from top of screen)
#define YMAX 480 // Bottom of screen area
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
//#define MENU_FONT NULL
#define MENU_FONT &FreeMono9pt7b // Winner
//#define MENU_FONT &FreeMonoBold9pt7b
//#define MENU_FONT &FreeSans9pt7b
//#define MENU_FONT &FreeSansBold9pt7b
#define BUTTON_SCREEN_LIMIT 12
#define BUTTON_ARRAY_LEN BUTTON_SCREEN_LIMIT
#define STATUS_BAR_WIDTH 16
#define LVGL_TICK_PERIOD 6
#define FRAME_X 100
#define FRAME_Y 64
#define FRAME_W TFT_WIDTH / 2
#define FRAME_H 50
// Red zone size
#define REDBUTTON_X FRAME_X
#define REDBUTTON_Y FRAME_Y
#define REDBUTTON_W (FRAME_W/2)
#define REDBUTTON_H FRAME_H
// Green zone size
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
#define GREENBUTTON_Y FRAME_Y
#define GREENBUTTON_W (FRAME_W/2)
#define GREENBUTTON_H FRAME_H
#define STATUSBAR_COLOR 0x4A49
#define KIT_LED_BUILTIN 13
#endif
#if defined(MARAUDER_CYD_GUITION)
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
@@ -1150,7 +1379,7 @@
#define TFT_DIY
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 20
@@ -1204,6 +1433,8 @@
#endif
#ifdef MARAUDER_V7
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
//#define HAS_ILI9341
@@ -1217,7 +1448,7 @@
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define TFT_DIY
@@ -1273,6 +1504,8 @@
#endif
#ifdef MARAUDER_V7_1
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
//#define HAS_ILI9341
@@ -1286,7 +1519,7 @@
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define TFT_DIY
@@ -1342,6 +1575,8 @@
#endif
#ifdef MARAUDER_KIT
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
@@ -1355,7 +1590,7 @@
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define TFT_DIY
#define KIT
@@ -1408,6 +1643,8 @@
#endif
#ifdef MARAUDER_MINI
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
#define TFT_MISO 19
#define TFT_MOSI 23
@@ -1433,7 +1670,7 @@
#define TFT_HEIGHT 128
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 0
@@ -1481,6 +1718,8 @@
#endif
#ifdef MARAUDER_REV_FEATHER
#define CHAN_PER_PAGE 7
#define SCREEN_CHAR_WIDTH 40
//#define TFT_MISO 37
//#define TFT_MOSI 35
@@ -1506,7 +1745,7 @@
#define TFT_HEIGHT 135
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define GRAPH_VERT_LIM TFT_HEIGHT/2 - 1
#define EXT_BUTTON_WIDTH 0
@@ -1595,6 +1834,25 @@
//#define BUTTON_ARRAY_LEN 5
#endif
#if defined(MARAUDER_V8)
#define BANNER_TIME 100
#define COMMAND_PREFIX "!"
// Keypad start position, key sizes and spacing
#define KEY_X 120 // Centre of key
#define KEY_Y 50
#define KEY_W 240 // Width and height
#define KEY_H 22
#define KEY_SPACING_X 0 // X and Y gap
#define KEY_SPACING_Y 1
#define KEY_TEXTSIZE 1 // Font size multiplier
#define ICON_W 22
#define ICON_H 22
#define BUTTON_PADDING 22
//#define BUTTON_ARRAY_LEN 5
#endif
#if defined(MARAUDER_CYD_MICRO)
#define BANNER_TIME 100
@@ -1633,6 +1891,25 @@
//#define BUTTON_ARRAY_LEN 5
#endif
#if defined(MARAUDER_CYD_3_5_INCH)
#define BANNER_TIME 100
#define COMMAND_PREFIX "!"
// Keypad start position, key sizes and spacing
#define KEY_X 160 // Centre of key
#define KEY_Y 50
#define KEY_W 320 // Width and height
#define KEY_H 22
#define KEY_SPACING_X 0 // X and Y gap
#define KEY_SPACING_Y 1
#define KEY_TEXTSIZE 1 // Font size multiplier
#define ICON_W 22
#define ICON_H 22
#define BUTTON_PADDING 22
//#define BUTTON_ARRAY_LEN 5
#endif
#if defined(MARAUDER_CYD_GUITION)
#define BANNER_TIME 100
@@ -1805,6 +2082,10 @@
#define SD_CS 5
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define SD_CS 5
#endif
#ifdef MARAUDER_CYD_GUITION
#define SD_CS 5
#endif
@@ -1865,6 +2146,10 @@
#define SD_CS 10
#endif
#ifdef MARAUDER_V8
#define SD_CS 10
#endif
#endif
//// END SD DEFINITIONS
@@ -1911,6 +2196,8 @@
#define STANDARD_FONT_CHAR_LIMIT 40
#define FLASH_BUTTON -1
#define CHAN_PER_PAGE 7
#include <FS.h>
#include <functional>
#include <LinkedList.h>
@@ -1942,6 +2229,8 @@
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_CYD_2USB)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_CYD_3_5_INCH)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_CYD_GUITION)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_KIT)
@@ -1960,6 +2249,8 @@
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_C5)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_V8)
#define MEM_LOWER_LIM 10000
#endif
//// END MEMORY LOWER LIMIT STUFF
@@ -1976,6 +2267,12 @@
#define PIN 4
#elif defined(MARAUDER_CYD_2USB)
#define PIN 4
#elif defined(MARAUDER_CYD_3_5_INCH)
#define PIN 22
#elif defined(MARAUDER_C5)
#define PIN 27
#elif defined(MARAUDER_V8)
#define PIN 27
#else
#define PIN 25
#endif
@@ -2007,12 +2304,16 @@
#define GPS_RX 13
#elif defined(MARAUDER_CYD_MICRO)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 1 // Community pinout matching old forks and even bruce firmware allowing for hardware standardization
#define GPS_RX 3
#define GPS_TX 22 // Whoever thought it would be a good idea to use UART0 for GPS...
#define GPS_RX 27 // Now maybe we will be able to use CLI
#elif defined(MARAUDER_CYD_2USB)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 1 // Community pinout matching old forks and even bruce firmware allowing for hardware standardization
#define GPS_RX 3
#define GPS_TX 22 // Whoever thought it would be a good idea to use UART0 for GPS...
#define GPS_RX 27 // Now maybe we will be able to use CLI
#elif defined(MARAUDER_CYD_3_5_INCH)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 21
#define GPS_RX 25
#elif defined(MARAUDER_CYD_GUITION)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 21 // Fits the extended I/O
@@ -2065,6 +2366,10 @@
#define GPS_SERIAL_INDEX 1
#define GPS_TX 14
#define GPS_RX 13
#elif defined(MARAUDER_V8)
#define GPS_SERIAL_INDEX 1
#define GPS_TX 14
#define GPS_RX 13
#endif
#else
#define mac_history_len 100
@@ -2124,6 +2429,21 @@
#define I2C_SCL 27
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define I2C_SDA 32
#define I2C_SCL 25
#endif
#ifdef MARAUDER_CYD_GUITION
#define I2C_SDA 22
#define I2C_SCL 21
#endif
#ifdef MARAUDER_V8
#define I2C_SCL 4
#define I2C_SDA 5
#endif
#endif
//// MARAUDER TITLE STUFF
@@ -2135,6 +2455,8 @@
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_CYD_2USB)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_CYD_3_5_INCH)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_CYD_GUITION)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_KIT)
@@ -2149,6 +2471,8 @@
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_C5)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_V8)
#define MARAUDER_TITLE_BYTES 13578
#else
#define MARAUDER_TITLE_BYTES 13578
#endif
@@ -2170,7 +2494,7 @@
//// PCAP BUFFER STUFF
//// STUPID CYD STUFF
#if defined(HAS_CYD_TOUCH) || defined(HAS_C5_SD)
#if defined(HAS_CYD_TOUCH) || defined(HAS_C5_SD) || defined(HAS_SEPARATE_SD)
#ifdef MARAUDER_CYD_MICRO
#define XPT2046_IRQ 36
#define XPT2046_MOSI 32
@@ -2195,11 +2519,23 @@
#define SD_SCK 18
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define SD_MISO 19
#define SD_MOSI 23
#define SD_SCK 18
#endif
#ifdef MARAUDER_C5
#define SD_MISO 2
#define SD_MOSI 7
#define SD_SCK 6
#endif
#ifdef MARAUDER_V8
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#endif
//// END STUPID CYD STUFF
@@ -2230,6 +2566,12 @@
#define R_PIN 4
#endif
#ifdef MARAUDER_CYD_3_5_INCH
#define B_PIN 17
#define G_PIN 16
#define R_PIN 22
#endif
#ifdef MARAUDER_CYD_GUITION
#define B_PIN 17
#define G_PIN 16
@@ -2244,6 +2586,6 @@
#ifndef HAS_DUAL_BAND
#define HOP_DELAY 1000
#else
#define HOP_DELAY 100
#define HOP_DELAY 250
#endif
#endif

View File

@@ -236,8 +236,6 @@ void setup()
backlightOn(); // Need this
#ifdef HAS_SCREEN
//delay(2000);
// Do some stealth mode stuff
#ifdef HAS_BUTTONS
if (c_btn.justPressed()) {
@@ -248,18 +246,6 @@ 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();
@@ -312,6 +298,16 @@ void setup()
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

@@ -106,6 +106,9 @@ 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";
@@ -165,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 ";
@@ -186,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, text1_65};
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 "";
}
@@ -169,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
@@ -288,6 +338,18 @@ bool Settings::createDefaultSettings(fs::FS &fs, bool spec, uint8_t index, Strin
jsonBuffer["Settings"][4]["range"]["min"] = false;
jsonBuffer["Settings"][4]["range"]["max"] = true;
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"));
@@ -321,6 +383,23 @@ bool Settings::createDefaultSettings(fs::FS &fs, bool spec, uint8_t index, Strin
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);

View File

@@ -27,135 +27,6 @@ struct ProbeReqSsid {
uint8_t requests;
};
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"
};
uint8_t getDRAMUsagePercent() {
//size_t total = heap_caps_get_total_size(MALLOC_CAP_8BIT);
//size_t free = heap_caps_get_free_size(MALLOC_CAP_8BIT);
@@ -299,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
@@ -316,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]); \
} \
@@ -355,7 +226,7 @@ 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
@@ -382,6 +253,29 @@ IPAddress getNextIP(IPAddress currentIP, IPAddress subnetMask) {
);
}
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;
}

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.

BIN
pictures/icons/flock_22.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 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, };