mirror of
https://github.com/justcallmekoko/ESP32Marauder.git
synced 2025-12-22 23:26:45 -08:00
Compare commits
222 Commits
v1.8.2
...
nightly_1d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dd5502c1d | ||
|
|
1862a5b812 | ||
|
|
f5375eedaf | ||
|
|
2910addb8a | ||
|
|
be3971d081 | ||
|
|
86e2fb206a | ||
|
|
431fa175a0 | ||
|
|
976687980c | ||
|
|
1d419605f7 | ||
|
|
1624d98183 | ||
|
|
dfd556da30 | ||
|
|
9681076542 | ||
|
|
86d35cba6a | ||
|
|
03623e2985 | ||
|
|
fb2b33d538 | ||
|
|
5e47927969 | ||
|
|
4e7f48a036 | ||
|
|
d7d2b28f9e | ||
|
|
722b9ad88e | ||
|
|
5d188bfa62 | ||
|
|
576601fd21 | ||
|
|
dc2dd414eb | ||
|
|
5439fc7ceb | ||
|
|
84416970e7 | ||
|
|
ba67c63010 | ||
|
|
e4458ad1e6 | ||
|
|
6c996a489f | ||
|
|
d3ce284ea4 | ||
|
|
eab60701d5 | ||
|
|
30893adaa5 | ||
|
|
2c0868e893 | ||
|
|
0a5e200294 | ||
|
|
0fba6966a6 | ||
|
|
b714f274b5 | ||
|
|
e5c6c6906e | ||
|
|
ccf7cd1493 | ||
|
|
a1ff26a9d2 | ||
|
|
57f867a8ec | ||
|
|
c901ade02c | ||
|
|
aee56f879f | ||
|
|
0535646ba8 | ||
|
|
cd3ab51080 | ||
|
|
b6d1ce7a37 | ||
|
|
9d51b91ad3 | ||
|
|
018bddae6a | ||
|
|
b014332169 | ||
|
|
5079a05458 | ||
|
|
c002aee646 | ||
|
|
5afcb9da61 | ||
|
|
a874375fb0 | ||
|
|
22f4dc66ec | ||
|
|
31baacac3e | ||
|
|
601aee9b8a | ||
|
|
93ac8b3cde | ||
|
|
08d1682ae4 | ||
|
|
1343c91064 | ||
|
|
7f741d75fb | ||
|
|
de2a916ad6 | ||
|
|
5a928a7ae8 | ||
|
|
b5bb65f76b | ||
|
|
09b519d0a2 | ||
|
|
3fc18d642b | ||
|
|
7460b40543 | ||
|
|
0b6dc40fa6 | ||
|
|
6331e43db1 | ||
|
|
9819a6ba1b | ||
|
|
f170caa9d2 | ||
|
|
3838296173 | ||
|
|
8526e49189 | ||
|
|
a3aff9afd6 | ||
|
|
50033af120 | ||
|
|
2ccb8675dc | ||
|
|
05eb6d74a5 | ||
|
|
c06e104485 | ||
|
|
0a8d9d2d41 | ||
|
|
ab9870219a | ||
|
|
941532eba0 | ||
|
|
c515873fd5 | ||
|
|
1bf0b0e2c1 | ||
|
|
9ea5fbc3eb | ||
|
|
0e8e698254 | ||
|
|
630687359d | ||
|
|
5070b9785d | ||
|
|
b0c8dd5cb4 | ||
|
|
5fa046b599 | ||
|
|
48164bc4ec | ||
|
|
68085fc6a7 | ||
|
|
0f62303018 | ||
|
|
dc7992d040 | ||
|
|
0764625eb1 | ||
|
|
748afc99e8 | ||
|
|
c4e78293a6 | ||
|
|
74cd774718 | ||
|
|
feaae672da | ||
|
|
ba9ec4023e | ||
|
|
7045ce9380 | ||
|
|
69a7d9b24f | ||
|
|
11f2cec1fd | ||
|
|
828d0b1760 | ||
|
|
fc903cc66b | ||
|
|
e3d3d8276c | ||
|
|
72951397d8 | ||
|
|
e5f2466c41 | ||
|
|
d70d141662 | ||
|
|
4bd3a1d4b1 | ||
|
|
510e5692b0 | ||
|
|
4b5339bf89 | ||
|
|
2efcb63d19 | ||
|
|
871fc356c6 | ||
|
|
0e1a289678 | ||
|
|
a1f4c9dc28 | ||
|
|
762f6f7ec9 | ||
|
|
ffcb2585d5 | ||
|
|
b2cd8efe38 | ||
|
|
174885dff5 | ||
|
|
8e523ed237 | ||
|
|
faf1bbb620 | ||
|
|
71c0d2e616 | ||
|
|
3e09d2d816 | ||
|
|
3ce7d45341 | ||
|
|
e86f16934e | ||
|
|
4042e9d43b | ||
|
|
8a0817e547 | ||
|
|
02febc63c6 | ||
|
|
969a2fff30 | ||
|
|
8831927580 | ||
|
|
72ed6de7dc | ||
|
|
ad4b660dd4 | ||
|
|
f25e2b90d5 | ||
|
|
c44be1ecdc | ||
|
|
d74a22b297 | ||
|
|
79cbd91b60 | ||
|
|
7448c266e4 | ||
|
|
5088e0bfb4 | ||
|
|
08517d7587 | ||
|
|
d1ad247dd3 | ||
|
|
71cd5859f4 | ||
|
|
24f3e18b69 | ||
|
|
74f09ee86f | ||
|
|
20242245ab | ||
|
|
e8f0c1317e | ||
|
|
d52b2922e6 | ||
|
|
ecfdcd3bdc | ||
|
|
8e54de7b2d | ||
|
|
77f3fa7025 | ||
|
|
b86929256f | ||
|
|
16d0101ce6 | ||
|
|
e3668645e3 | ||
|
|
ea0be07c91 | ||
|
|
e4d483d736 | ||
|
|
c2aba77cc0 | ||
|
|
78b73f4ca2 | ||
|
|
ef4ec4edad | ||
|
|
c6daeb5517 | ||
|
|
dcd493d474 | ||
|
|
68bd55b162 | ||
|
|
90db402b6b | ||
|
|
e064c3beed | ||
|
|
18d71769da | ||
|
|
a259cbcc6d | ||
|
|
482f4114e0 | ||
|
|
a917ff2211 | ||
|
|
92e1795ce5 | ||
|
|
605086ea59 | ||
|
|
554d358cba | ||
|
|
614c7099f9 | ||
|
|
d131491bbf | ||
|
|
dcf3b13552 | ||
|
|
4b6cb6582d | ||
|
|
7a41d4be14 | ||
|
|
2d195ea697 | ||
|
|
b1c256036f | ||
|
|
ac3e4ab427 | ||
|
|
3ca777e711 | ||
|
|
938a691010 | ||
|
|
3c61198d09 | ||
|
|
bbf245859a | ||
|
|
fbf2e9ab18 | ||
|
|
de05c9be2b | ||
|
|
4e88212e2f | ||
|
|
ef5d9527ef | ||
|
|
7f522d8e15 | ||
|
|
f35d88122c | ||
|
|
fc8f9629fa | ||
|
|
5a1269d062 | ||
|
|
3c093f6c9c | ||
|
|
6840d4c7ac | ||
|
|
d5c5e0e011 | ||
|
|
2f9d70b725 | ||
|
|
06293a0a4c | ||
|
|
c51171df76 | ||
|
|
030035f68d | ||
|
|
9a265f805b | ||
|
|
6497e741d6 | ||
|
|
e5387b80fc | ||
|
|
53613de14b | ||
|
|
3cf7702e23 | ||
|
|
e8f449ad01 | ||
|
|
b2ed6c70e1 | ||
|
|
d8b9e3b138 | ||
|
|
ba35343600 | ||
|
|
02f0ecf85b | ||
|
|
57fde11782 | ||
|
|
f5ecde8278 | ||
|
|
1964072b99 | ||
|
|
2d8403b090 | ||
|
|
27c37a489d | ||
|
|
34ccdbaa14 | ||
|
|
b85ce8b071 | ||
|
|
db75cd7d91 | ||
|
|
76b06792f5 | ||
|
|
3ea48c35e5 | ||
|
|
74d952dc5f | ||
|
|
b490b5968f | ||
|
|
7e2646e889 | ||
|
|
a75e1d7891 | ||
|
|
8c56181871 | ||
|
|
34157d93cd | ||
|
|
387d277e02 | ||
|
|
1ae345234d | ||
|
|
399b8d6c38 | ||
|
|
3c51ae4e4d |
114
.github/workflows/build_parallel.yml
vendored
114
.github/workflows/build_parallel.yml
vendored
@@ -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
32
.github/workflows/close_stale.yml
vendored
Normal 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
409
.github/workflows/nightly_build.yml
vendored
Normal file
@@ -0,0 +1,409 @@
|
||||
name: Build and (Nightly) Pre-release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# daily at 03:00 UTC (adjust to your preferred time)
|
||||
- cron: '0 3 * * *'
|
||||
|
||||
jobs:
|
||||
decide:
|
||||
name: Detect new commits on default branch
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
should_build: ${{ steps.decide.outputs.should_build }}
|
||||
default_branch: ${{ steps.decide.outputs.default_branch }}
|
||||
head_sha: ${{ steps.decide.outputs.head_sha }}
|
||||
short_sha: ${{ steps.decide.outputs.short_sha }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with: { fetch-depth: 0 }
|
||||
|
||||
- id: decide
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
|
||||
// Find default branch and its HEAD
|
||||
const repoInfo = await github.rest.repos.get({ owner, repo });
|
||||
const defaultBranch = repoInfo.data.default_branch;
|
||||
const head = await github.rest.repos.getBranch({ owner, repo, branch: defaultBranch });
|
||||
const headSha = head.data.commit.sha;
|
||||
const shortSha = headSha.slice(0,7);
|
||||
|
||||
// Try get the existing nightly release (single static tag)
|
||||
let nightlyRelease = null;
|
||||
try {
|
||||
nightlyRelease = await github.rest.repos.getReleaseByTag({
|
||||
owner, repo, tag: 'nightly'
|
||||
});
|
||||
} catch (e) {
|
||||
if (e.status !== 404) throw e;
|
||||
}
|
||||
|
||||
// Decide if we need to rebuild: compare short SHA in the release name
|
||||
// Name format we set: "<shortsha>_nightly"
|
||||
let shouldBuild = true;
|
||||
if (nightlyRelease) {
|
||||
const name = nightlyRelease.data.name || '';
|
||||
const m = name.match(/^([0-9a-f]{7})_nightly$/i);
|
||||
if (m && m[1] === shortSha) {
|
||||
shouldBuild = false; // no new commits since last nightly
|
||||
}
|
||||
}
|
||||
|
||||
core.setOutput('should_build', String(shouldBuild));
|
||||
core.setOutput('default_branch', defaultBranch);
|
||||
core.setOutput('head_sha', headSha);
|
||||
core.setOutput('short_sha', shortSha);
|
||||
|
||||
compile_sketch:
|
||||
name: build ${{ matrix.board.name }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board:
|
||||
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Flipper Zero Multi Board S3", flag: "MARAUDER_MULTIBOARD_S3", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=4M", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "2.3.6", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install Arduino CLI
|
||||
run: |
|
||||
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
|
||||
echo "/home/runner/work/ESP32Marauder/ESP32Marauder/bin" >> $GITHUB_PATH
|
||||
export PATH=$PATH:/home/runner/work/ESP32Marauder/ESP32Marauder/bin
|
||||
arduino-cli version
|
||||
|
||||
- name: Verify Installed Cores
|
||||
run: arduino-cli core list
|
||||
|
||||
- name: Build TestFile with ESP32 v${{ matrix.board.idf_ver }}
|
||||
uses: ArminJo/arduino-test-compile@v3.2.1
|
||||
with:
|
||||
sketch-names: TestFile.ino
|
||||
arduino-board-fqbn: esp32:esp32:esp32s2
|
||||
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
|
||||
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
|
||||
|
||||
- name: Verify Installed Cores Again
|
||||
run: arduino-cli core list
|
||||
|
||||
- name: Show Arduino dir structure
|
||||
run: |
|
||||
find /home/runner/.arduino15/packages/esp32/hardware/
|
||||
|
||||
- name: Install ESP32Ping
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: marian-craciunescu/ESP32Ping
|
||||
ref: 1.6
|
||||
path: CustomESP32Ping
|
||||
|
||||
- name: Install AsyncTCP
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ESP32Async/AsyncTCP
|
||||
ref: v3.4.8
|
||||
path: CustomAsyncTCP
|
||||
|
||||
- name: Install MicroNMEA
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: stevemarple/MicroNMEA
|
||||
ref: v2.0.6
|
||||
path: CustomMicroNMEA
|
||||
|
||||
- name: Install ESPAsyncWebServer
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ESP32Async/ESPAsyncWebServer
|
||||
ref: v3.8.1
|
||||
path: CustomESPAsyncWebServer
|
||||
|
||||
- name: Install TFT_eSPI
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: Bodmer/TFT_eSPI
|
||||
ref: V2.5.34
|
||||
path: CustomTFT_eSPI
|
||||
|
||||
- name: Install XPT2046_Touchscreen
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: PaulStoffregen/XPT2046_Touchscreen
|
||||
ref: v1.4
|
||||
path: CustomXPT2046_Touchscreen
|
||||
|
||||
- name: Install lv_arduino
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: lvgl/lv_arduino
|
||||
ref: 3.0.0
|
||||
path: Customlv_arduino
|
||||
|
||||
- name: Install JPEGDecoder
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: Bodmer/JPEGDecoder
|
||||
ref: 1.8.0
|
||||
path: CustomJPEGDecoder
|
||||
|
||||
- name: Install NimBLE-Arduino
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: h2zero/NimBLE-Arduino
|
||||
ref: ${{ matrix.board.nimble_ver }}
|
||||
path: CustomNimBLE-Arduino
|
||||
|
||||
- name: Install Adafruit_NeoPixel
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/Adafruit_NeoPixel
|
||||
ref: 1.12.0
|
||||
path: CustomAdafruit_NeoPixel
|
||||
|
||||
- name: Install ArduinoJson
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: bblanchon/ArduinoJson
|
||||
ref: v6.18.2
|
||||
path: CustomArduinoJson
|
||||
|
||||
- name: Install LinkedList
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ivanseidel/LinkedList
|
||||
ref: v1.3.3
|
||||
path: CustomLinkedList
|
||||
|
||||
- name: Install EspSoftwareSerial
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: plerup/espsoftwareserial
|
||||
ref: 8.1.0
|
||||
path: CustomEspSoftwareSerial
|
||||
|
||||
- name: Install Adafruit_BusIO
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/Adafruit_BusIO
|
||||
ref: 1.15.0
|
||||
path: CustomAdafruit_BusIO
|
||||
|
||||
- name: Install Adafruit_MAX1704X
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/Adafruit_MAX1704X
|
||||
ref: 1.0.2
|
||||
path: CustomAdafruit_MAX1704X
|
||||
|
||||
- name: Show Libraries
|
||||
run: |
|
||||
find /home/runner/ -name "Custom*"
|
||||
|
||||
- name: Configure TFT_eSPI
|
||||
run: |
|
||||
rm -f CustomTFT_eSPI/User_Setup_Select.h
|
||||
cp User*.h CustomTFT_eSPI/
|
||||
pwd
|
||||
ls -la
|
||||
ls -la CustomTFT_eSPI
|
||||
|
||||
- name: Install Esptool
|
||||
run: |
|
||||
pip install esptool
|
||||
|
||||
- name: Modify platform.txt
|
||||
run: |
|
||||
if [[ ${{ matrix.board.idf_ver }} == "2.0.11" ]]; then
|
||||
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
|
||||
sed -i 's/compiler.c.elf.libs.esp32c3=/compiler.c.elf.libs.esp32c3=-zmuldefs /' "$i"
|
||||
sed -i 's/compiler.c.elf.libs.esp32s3=/compiler.c.elf.libs.esp32s3=-zmuldefs /' "$i"
|
||||
sed -i 's/compiler.c.elf.libs.esp32s2=/compiler.c.elf.libs.esp32s2=-zmuldefs /' "$i"
|
||||
sed -i 's/compiler.c.elf.libs.esp32=/compiler.c.elf.libs.esp32=-zmuldefs /' "$i"
|
||||
cat "$i" | grep compiler.c.elf.libs.esp32c3
|
||||
cat "$i" | grep compiler.c.elf.libs.esp32s3
|
||||
cat "$i" | grep compiler.c.elf.libs.esp32s2
|
||||
cat "$i" | grep compiler.c.elf.libs.esp32
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${{ matrix.board.idf_ver }} == "3.3.4" ]]; then
|
||||
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
|
||||
sed -i 's/compiler.c.elf.extra_flags=/compiler.c.elf.extra_flags=-Wl,-zmuldefs /' "$i"
|
||||
done
|
||||
fi
|
||||
|
||||
- name: Configure TFT_eSPI (if needed)
|
||||
run: |
|
||||
pwd
|
||||
if [[ ${{ matrix.board.tft }} == true ]]; then
|
||||
find /home/runner/ -name "*TFT_eSPI*"
|
||||
sed -i 's/^\/\/#include <${{ matrix.board.tft_file }}>/#include <${{ matrix.board.tft_file }}>/' /home/runner/work/ESP32Marauder/ESP32Marauder/CustomTFT_eSPI/User_Setup_Select.h
|
||||
fi
|
||||
|
||||
- name: Build Marauder for ${{ matrix.board.name }}
|
||||
uses: ArminJo/arduino-test-compile@v3.3.0
|
||||
with:
|
||||
sketch-names: esp32_marauder.ino
|
||||
arduino-board-fqbn: ${{ matrix.board.fbqn }}
|
||||
extra-arduino-cli-args: "--warnings none --build-property compiler.cpp.extra_flags='-D${{ matrix.board.flag }}'"
|
||||
arduino-platform: esp32:esp32@${{ matrix.board.idf_ver }}
|
||||
platform-url: https://github.com/espressif/arduino-esp32/releases/download/${{ matrix.board.idf_ver }}/package_esp32_dev_index.json
|
||||
|
||||
- name: Rename and Upload ${{ matrix.board.name }} Artifact
|
||||
run: |
|
||||
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
|
||||
DATE=$(date +%Y%m%d)
|
||||
|
||||
BUILD_DIR=./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}
|
||||
INPUT_BIN=$BUILD_DIR/esp32_marauder.ino.bin
|
||||
|
||||
OUTPUT_BIN=esp32_marauder_${VERSION}_beta_${DATE}_${{ matrix.board.file_name }}.bin
|
||||
|
||||
mv "$INPUT_BIN" "$BUILD_DIR/$OUTPUT_BIN"
|
||||
|
||||
echo "artifact_name=$OUTPUT_BIN" >> $GITHUB_ENV
|
||||
echo "artifact_path=$BUILD_DIR/$OUTPUT_BIN" >> $GITHUB_ENV
|
||||
echo "wild_card=esp32_marauder_${VERSION}_beta_${DATE}_*.bin" >> $GITHUB_ENV
|
||||
|
||||
- name: Upload ${{ matrix.board.name }} Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.artifact_name }}
|
||||
path: ${{ env.artifact_path }}
|
||||
retention-days: 5
|
||||
|
||||
post_compile_steps:
|
||||
name: Create Nightly Release
|
||||
runs-on: ubuntu-latest
|
||||
needs: [compile_sketch, decide]
|
||||
# create release if manual dispatch OR should_release decided true for scheduled run
|
||||
if: ${{ needs.decide.outputs.should_build == 'true' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
merge-multiple: true
|
||||
|
||||
- name: Compute release title/tag
|
||||
id: meta
|
||||
shell: bash
|
||||
run: |
|
||||
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
|
||||
DATE=$(date +%Y%m%d)
|
||||
SHORT_SHA="$(git rev-parse --short HEAD)"
|
||||
if [[ "${{ github.event_name }}" == "schedule" ]]; then
|
||||
echo "name=${SHORT_SHA}_nightly" >> $GITHUB_OUTPUT
|
||||
# keep your existing tag, or set one here:
|
||||
echo "tag=nightly-$(date -u +'%Y%m%d')-${SHORT_SHA}" >> $GITHUB_OUTPUT
|
||||
echo "prerelease=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "name=${SHORT_SHA}" >> $GITHUB_OUTPUT
|
||||
echo "tag=manual-$(date -u +'%Y%m%d')-${SHORT_SHA}" >> $GITHUB_OUTPUT
|
||||
echo "prerelease=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
echo "wild_card=esp32_marauder_${VERSION}_beta_${DATE}_*.bin" >> $GITHUB_ENV
|
||||
|
||||
echo ${{ env.wild_card }}
|
||||
|
||||
- name: Delete old assets on nightly release (if any)
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
|
||||
let rel;
|
||||
try {
|
||||
rel = await github.rest.repos.getReleaseByTag({ owner, repo, tag: 'nightly' });
|
||||
} catch (e) {
|
||||
if (e.status === 404) {
|
||||
// No release yet — nothing to delete
|
||||
return;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
const assets = rel.data.assets || [];
|
||||
for (const a of assets) {
|
||||
await github.rest.repos.deleteReleaseAsset({ owner, repo, asset_id: a.id });
|
||||
core.info(`Deleted old asset: ${a.name}`);
|
||||
}
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: ${{ needs.decide.outputs.short_sha }}_nightly
|
||||
tag_name: nightly_${{ needs.decide.outputs.short_sha }}
|
||||
prerelease: true
|
||||
generate_release_notes: false
|
||||
draft: false
|
||||
files: |
|
||||
${{ env.wild_card }}
|
||||
body: |
|
||||
[justcallmekokollc.com](https://justcallmekokollc.com)
|
||||
|
||||
### This is an automated pre-release / beta created by CI.
|
||||
|
||||
### Please see [GPS Modification](https://github.com/justcallmekoko/ESP32Marauder/wiki/gps-modification) to find out how to add GPS capabilities to your Marauder.
|
||||
**Flipper Zero Marauder Companion App:**
|
||||
**Be sure to install the latest version of the [Marauder Companion](https://github.com/0xchocolate/flipperzero-wifi-marauder/releases/latest) to use these new features on your Flipper Zero**
|
||||
|
||||
**Additional Resources**
|
||||
**[Project Issues](https://github.com/justcallmekoko/ESP32Marauder/issues)**
|
||||
**[Install/Update Instructions](https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware)**
|
||||
**[ESP32 Marauder companion app](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion/releases/latest)**
|
||||
**[My Discord](https://discord.com/servers/willstunforfood-776211399918878760)**
|
||||
|
||||
**Note:** Nightly pre-releases are for testing and evaluation. Use them at your own risk.
|
||||
|
||||
| Hardware | Binary Version |
|
||||
| -------- | -------------- |
|
||||
| v4 (OG) | `_old_hardware.bin` |
|
||||
| v6 | `_new_hardware.bin`/`_v6.bin` |
|
||||
| v6.1/v6.2 | `_v6_1.bin` |
|
||||
| v7 | `_v7.bin` |
|
||||
| Kit | `_kit.bin` |
|
||||
| Mini | `_mini.bin` |
|
||||
| Flipper Zero | `_flipper.bin` |
|
||||
| MutliBoard S3 | `_multiboardS3.bin` |
|
||||
| LDDB/NodeMCU/Wemos | `_lddb.bin` |
|
||||
| Dev Board Pro | `_marauder_dev_board_pro.bin` |
|
||||
| BFFB | `_marauder_dev_board_pro.bin` |
|
||||
| ESP32-S2 Reverse Feather | `_rev_feather.bin` |
|
||||
| CYD 2432S028(R) | `_cyd_2432S028.bin` |
|
||||
| RL Phantom | `_cyd_2432S024_guition.bin` |
|
||||
| CYD 2432S028 2 USB | `_cyd_2432S028_2usb.bin` |
|
||||
| M5 Cardputer | `_m5cardputer.bin` (Available on M5 Burner) |
|
||||
| ESP32-C5 DevKit | [`_esp32c5_devkit.bin`](https://github.com/justcallmekoko/ESP32Marauder/wiki/ESP32%E2%80%90C5%E2%80%90DevKitC%E2%80%901) |
|
||||
| AWOK V2/V3 screen (white usb) | `_v6_1.bin` |
|
||||
| AWOK V2 flipper (orange usb) | `_flipper.bin` |
|
||||
| AWOK V3 flipper (orange usb) | `_marauder_dev_board_pro.bin` |
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
C5_Py_Flasher/bins/esp32_marauder_v1_8_5_esp32c5devkitc1.bin
Normal file
BIN
C5_Py_Flasher/bins/esp32_marauder_v1_8_5_esp32c5devkitc1.bin
Normal file
Binary file not shown.
1
FlashFiles/flash_cmd.txt
Normal file
1
FlashFiles/flash_cmd.txt
Normal 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
|
||||
@@ -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
299
User_Setup_cyd_3_5_inch.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "ESPAsyncWebServer.h"
|
||||
#include <AsyncTCP.h>
|
||||
#include <DNSServer.h>
|
||||
#include <WiFi.h>
|
||||
|
||||
#include "configs.h"
|
||||
#include "settings.h"
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
402
esp32_marauder/TouchKeyboard.cpp
Normal file
402
esp32_marauder/TouchKeyboard.cpp
Normal 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 (0–3)
|
||||
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
|
||||
31
esp32_marauder/TouchKeyboard.h
Normal file
31
esp32_marauder/TouchKeyboard.h
Normal 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
@@ -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, // Vendor‑specific (PMKID IE)
|
||||
0xDD, 0x14, // Vendor‑specific (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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
BIN
mechanical/C5 Adapter/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
mechanical/C5 Adapter/Extra designs/.DS_Store
vendored
Normal file
BIN
mechanical/C5 Adapter/Extra designs/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
mechanical/C5 Adapter/Extra designs/c5 adapter back - SMA.stl
Normal file
BIN
mechanical/C5 Adapter/Extra designs/c5 adapter back - SMA.stl
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mechanical/C5 Adapter/Extra designs/c5 adapter front - SMA.stl
Normal file
BIN
mechanical/C5 Adapter/Extra designs/c5 adapter front - SMA.stl
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mechanical/C5 Adapter/c5 adapter back.stl
Normal file
BIN
mechanical/C5 Adapter/c5 adapter back.stl
Normal file
Binary file not shown.
BIN
mechanical/C5 Adapter/c5 adapter front.stl
Normal file
BIN
mechanical/C5 Adapter/c5 adapter front.stl
Normal file
Binary file not shown.
BIN
mechanical/C5 Adapter/c5 adapter pin cover.stl
Normal file
BIN
mechanical/C5 Adapter/c5 adapter pin cover.stl
Normal file
Binary file not shown.
BIN
pictures/icons/flock_22.bmp
Normal file
BIN
pictures/icons/flock_22.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
BIN
pictures/icons/funny_beacon_22.bmp
Normal file
BIN
pictures/icons/funny_beacon_22.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
9
pictures/xbm/flock_22.xbm
Normal file
9
pictures/xbm/flock_22.xbm
Normal 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, };
|
||||
Reference in New Issue
Block a user