From d185530e2d79351eb94fe0be283ce16be26de0fa Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 11:17:36 +0800 Subject: [PATCH 01/21] First commit --- src/common/camera_setting.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 39b152b..ee4bade 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -731,6 +731,7 @@ const static int32_t PHOTO_OUTPUT_VALUE[] = { 0, 1, 2, 3 }; +#pragma region Media #define MEDIA_FORMAT_ID 128 #define MEDIA_FORMAT_SIZE 4 #define MEDIA_FORMAT_NAME "Media Format" @@ -745,6 +746,7 @@ const static char* MEDIA_FORMAT_STRING[] = { const static int32_t MEDIA_FORMAT_VALUE[] = { 13, 20, 21, 26 }; +#pragma endregion #define ANTI_FLICKER_ID 134 #define ANTI_FLICKER_SIZE 4 From e82c24c9aa546eb5efe05965ee05ae7392ea6090 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 13:53:06 +0800 Subject: [PATCH 02/21] Update readme --- README.md | 322 +----------------------------------------------------- 1 file changed, 3 insertions(+), 319 deletions(-) diff --git a/README.md b/README.md index 61d3d2c..c98bd35 100644 --- a/README.md +++ b/README.md @@ -1,327 +1,11 @@ # GoPro Controller -這是一個透過 GUI 控制 GoPro 的專案 +Tool for control multiple GoPro Cameras, The design is for above 100 cameras connection. -## 開發需求 +## System Requirement -* Debine OS / Windows OS +* Operating System: Debine / Windows -### Debine 需要配置 - -* CMake -```bash -sudo apt update -sudo apt install cmake -``` -* ARM64 C++編譯器 -可以透過以下指令下載 -```bash -sudo apt update -sudo apt install g++-aarch64-linux-gnu -``` -* Master 解碼器, OpenCV 會用到 ffmpeg, Linux 需要以下的庫 -```bash -sudo apt-get update -sudo apt-get install libopencv-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev -sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly -sudo apt install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev -``` - -* [SDL3](https://wiki.libsdl.org/SDL3/README-linux) - -### Windows 需要配置 - -* [7Z](https://www.7-zip.org/) -* [CMake](https://cmake.org/) -* [MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/) -* [GStreamer](https://gstreamer.freedesktop.org/) - * Please install in C://Program Files/gstreamer - -* 如果 Compile 碰到 zlib 找不到的問題, 進入專案細節直接從 library input 刪掉 zlib (應該會在最下面). - -總共有兩個輸出的應用程式 -* Master - * AMD64 (WIN/LINUX) -* Server - * ARM64 (LINUX) - -#### Master - -附有 UI 介面的控制器, 可以透過這個介面跟其他 Websocket 或是 Go-Pro 直接連結. - -#### Server - -Websocket, Go-Pro 的中繼站, 會把訊息轉發到 Master. - -## 架構圖 - -Raspberry pi 用於負載分散, 如果性能不夠也可以改用 mini pc 或是 desktop pc 承擔 - -```mermaid ---- -title: 結構 ---- -graph LR - subgraph 攝影機群A - CAMA1[Go Pro 攝影機]; - CAMA2[Go Pro 攝影機]; - CAMA3[Go Pro 攝影機]; - CAMAH[USB HUB]; - CAMAR[樹莓派]; - - CAMAH-->CAMA1; - CAMAH-->CAMA2; - CAMAH-->CAMA3; - CAMAR-->CAMAH; - end - subgraph 攝影機群B - CAMB1[Go Pro 攝影機]; - CAMB2[Go Pro 攝影機]; - CAMB3[Go Pro 攝影機]; - CAMBH[USB HUB]; - CAMBR[樹莓派]; - - CAMBH-->CAMB1; - CAMBH-->CAMB2; - CAMBH-->CAMB3; - CAMBR-->CAMBH; - end - subgraph 攝影機群C - CAMC1[Go Pro 攝影機]; - CAMC2[Go Pro 攝影機]; - CAMC3[Go Pro 攝影機]; - CAMCH[USB HUB]; - - CAMCH-->CAMC1; - CAMCH-->CAMC2; - CAMCH-->CAMC3; - end - L[筆電控制]; - L-->|Websocket|CAMAR; - L-->|Websocket|CAMBR; - L-->|USB|CAMCH; -``` - -## Raspberry 建構 - -```mermaid ---- -title: 開發結構 ---- -graph LR - C[開發用電腦]; - PI[Raspberry PI]; - G[Go Pro 攝影機]; - C-->|網路線|PI; - G-->|USB|PI; -``` - -#### IP Setup - -通常希望開發的機器使用 -* 192.168.10.10, gw 192.168.10.1, netmask 255.255.255.0 - -PI 則是 -* 192.168.10.(2-9), gw 192.168.10.1, netmask 255.255.255.0 - -這個就是為了方便而已, 當然你可以改你自己喜歡的 IP 結構. - -```bash -# SSH 進去你的 PI -# 介面化 PI 網路管理 -sudo nmtui -``` - -#### 安裝程式 - -需要在 Repo Root 開啟 http-server 建議工具: [http-server](https://www.npmjs.com/package/http-server) - -```bash -# 在 Repo 本地開啟 -http-server -p 8080 -``` - -```mermaid ---- -title: 動作 ---- -graph LR - PI[Raspberry]; - C[開發用電腦 - 端口開放 8080 - 給別人連進來]; -``` - -接著開啟另一個 Terminal - -```bash -# SSH 到你的 PI -sudo systemctl stop startup.service -sudo curl http://192.168.10.10:8080/build_server/server -o /usr/local/bin/server -sudo systemctl start startup.service -sudo systemctl status startup.service -``` - -```mermaid ---- -title: 動作 ---- -graph LR - PI[Raspberry]; - C[開發用電腦]; - PI-->|透過 Http 拉檔案|C; -``` - -用 ldd 查看依賴性 - -```bash -ldd server -# Output: -# linux-vdso.so.1 (0x0000007fb8ded000) -# libhv.so => /lib/libhv.so (0x0000007fb8a50000) 這一行 !! -# libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007fb87e0000) -# libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007fb87a0000) -# libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007fb85e0000) -# /lib/ld-linux-aarch64.so.1 (0x0000007fb8da0000) -# libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007fb8530000) -``` - -你會看到 libhv.so 依賴於 /lib 資料夾, 如果還沒有安裝依賴庫 - -```bash -# 快速解決依賴問題 -sudo curl http://192.168.10.10:8080/build_server/lib/libhv.so -o /lib/libhv.so -sudo curl http://192.168.10.10:8080/build_server/_deps/curl-build/lib/libcurl-d.so.4 -o /lib/libcurl-d.so.4 -sudo curl http://192.168.10.10:8080/build_server/_deps/curl-build/lib/libcurl-d.so -o /lib/libcurl-d.so -``` - -#### 開機自動執行 - -弄一個 Bash script -```bash -sudo nano /usr/local/bin/startup.sh -``` - -打上啟動程式的腳本 - -下面這一大串就是為了一開機就可以把程式 run 起來的設定. - -```bash -#!/bin/bash -cd /home/ellly -# 讓我們的程序 只跑在 CPU 3 -taskset -c 3 /usr/local/bin/server -``` - -建議一個 Service 在 /lib/system/lib/systemd/system/startup.service -```bash -sudo nano /lib/systemd/system/startup.service -``` - -```bash -[Unit] -Description=My Websocket Server -After=network.target - -[Service] -ExecStart=/usr/local/bin/startup.sh -Restart=on-failure -RestartSec=2s - -[Install] -WantedBy=multi-user.target -``` - -重製 systemd -```bash -sudo chmod +x /usr/local/bin/startup.sh -sudo systemctl daemon-reload -sudo systemctl enable startup.service -sudo systemctl start startup.service - -# 用這一行看執行 log -sudo systemctl status startup.service - -# 用這一行重啟動 -sudo systemctl restart startup.service -``` - -### Hardware 探索問題 - -![udev_issue](./docs/udev_issue.png) - -當樹莓派直接連結到 USB HUB, 會產生 udev worker 無限的去抓 hardware...\ -這些執行序會燒光你的 CPU 資源.\ -我們必須去透過設定, 讓 udev 最高執行序被設定 (預設是沒有上限) - -```bash -# 編輯 udev config -sudo nano /etc/udev/udev.conf -``` - -```bash -# 給它 2 個子執行序上限 -udev_children_max=2 -``` - -```bash -# 重開服務 -sudo systemctl restart systemd-udevd -``` - -確保 SSH 不會卡 - -```bash -sudo nano /etc/ssh/sshd_config -``` - -加這一行 - -```bash -IPQoS throughput lowdelay -``` - -然後重開 ssh 服務 - -```bash -sudo systemctl restart ssh -``` - -讓 udev 跑在 0, 1, 2 執行序 - -```bash -sudo taskset -p -a 7 $(pidof systemd-udevd) -``` - -在 /boot/firmware/cmdline.txt 加上這幾個 - -```bash -sudo nano /boot/cmdline.txt -``` - -```bash -dwc_otg.fiq_fix_enable=1 dwc_otg.fiq_fsm_enable=1 dwc_otg.nak_holdoff=1,isolcpus=3 -``` - -* fiq_fix_enable=1 - * USB 加速, CPU 優化性能 -* fiq_fsm_enable=1 - * Kernal 排序上的優化 -* nak_holdoff=1 - * 如果沒資料, 不會主動 request, CPU 優化 -* isolcpus=3 - * 隔離 CPU 核心 3 - -之所以需要以上的設定是因為這個 - -這個是連結 Hub 的時候 -![lsusb](./docs/lsusb.png) - -這個是網路上對於 cdc_ncm 協定的解釋 -![cdc_ncm](./docs/cdc_ncm.png) - -每個 Go Pro USB 連結, 建立 3 個協定. 所以才灌爆 Kernal...\ -上面做的事情基本上就是, 我的程式要跑在 CPU 3, 其他 USB 什麼鬼的給我去 CPU 1, 2, 3 ## 協定 From 11585d410517154e531bbbfc8468233f3c581983 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 14:06:08 +0800 Subject: [PATCH 03/21] Update too media format setting (id 128) --- src/common/camera_model.h | 2 +- src/common/camera_setting.h | 113 ++++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 24 deletions(-) diff --git a/src/common/camera_model.h b/src/common/camera_model.h index ce0f44f..f8e0a48 100644 --- a/src/common/camera_model.h +++ b/src/common/camera_model.h @@ -28,6 +28,6 @@ /** Fron 11 to all the versions below includes */ #define MODEL_11_ALL MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 /** Fron 10 to all the versions below includes */ -#define MODEL_10_ALL MODEL_11|MODEL_10|MODEL_9 +#define MODEL_10_ALL MODEL_10|MODEL_9 #endif \ No newline at end of file diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index ee4bade..bfd6ed7 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -655,13 +655,13 @@ const static int32_t VIDEO_LENS_VALUE[] = { }; const static int32_t VIDEO_LENS_SUPPORT[] = { MODEL_MAX2_ALL, // Wide", - 2, // Narrow", - 3, // Superview", - MODEL_MAX2_ALL, // Linear", - 7, // Max Superview", - 8, // Linear + Horizon Leveling", - 9, // HyperView", - 10, // Linear + Horizon Lock", + MODEL_13|MODEL_10_ALL, // Narrow", + MODEL_13_ALL, // Superview", + MODEL_MAX2_ALL&(~MODEL_13), // Linear", + MODEL_MAX2_ALL, // Max Superview", + MODEL_13_ALL, // Linear + Horizon Leveling", + MODEL_13|MODEL_12|MODEL_11S, // HyperView", + MODEL_13|MODEL_12|MODEL_11S, // Linear + Horizon Lock", MODEL_MAX2|MODEL_12, // Max HyperView", MODEL_13, // Ultra SuperView", MODEL_MAX2|MODEL_13, // Ultra Wide", @@ -670,10 +670,11 @@ const static int32_t VIDEO_LENS_SUPPORT[] = { }; #pragma endregion +#pragma region Photo Lens #define PHOTO_LENS_ID 122 #define PHOTO_LENS_SIZE 17 #define PHOTO_LENS_NAME "Photo Lens" - +#define PHOTO_LENS_AVA MODEL_MAX2_ALL&(~MODEL_11) const static char* PHOTO_LENS_STRING[] = { "Wide 12 MP", "Linear 12 MP", @@ -691,60 +692,126 @@ const static char* PHOTO_LENS_STRING[] = { "13MP Ultra Linear", "Max SuperView", "Wide", - "Linear" + "Linear", }; - const static int32_t PHOTO_LENS_VALUE[] = { - 0, 10, 15, 19, 27, 28, 31, 32, 37, 38, 39, 40, 41, 44, - 100, 101, 102 + 0, // Wide 12 MP + 10, // Linear 12 MP + 15, // 9MP Wide + 19, // Narrow + 27, // Wide 23 MP + 28, // Linear 23 MP + 31, // Wide 27 MP + 32, // Linear 27 MP + 37, // 9MP Linear + 38, // 13MP Linear + 39, // 13MP Wide + 40, // 13MP Ultra Wide + 41, // Ultra Wide 12 MP + 44, // 13MP Ultra Linear + 100, // Max SuperView + 101, // Wide + 102, // Linear +}; +const static int32_t PHOTO_LENS_SUPPORT[] = { + MODEL_13, // Wide 12 MP + MODEL_13, // Linear 12 MP + MODEL_MAX2, // 9MP Wide + MODEL_10_ALL, // Narrow + MODEL_13, // Wide 23 MP + MODEL_13, // Linear 23 MP + MODEL_13, // Wide 27 MP + MODEL_13, // Linear 27 MP + MODEL_MAX2, // 9MP Linear + MODEL_13, // 13MP Linear + MODEL_13, // 13MP Wide + MODEL_13, // 13MP Ultra Wide + MODEL_MAX2|MODEL_13, // Ultra Wide 12 MP + MODEL_13, // 13MP Ultra Linear + MODEL_12_ALL&(~MODEL_11), // Max SuperView + MODEL_12_ALL&(~MODEL_11), // Wide + MODEL_12_ALL&(~MODEL_11), // Linear }; +#pragma endregion +#pragma region Time Lapse Digital Lenses #define TIME_LAPSE_DIGITAL_LENSES_ID 123 #define TIME_LAPSE_DIGITAL_LENSES_SIZE 6 #define TIME_LAPSE_DIGITAL_LENSES_NAME "Time Lapse Digital Lenses" - +#define TIME_LAPSE_DIGITAL_LENSES_AVA MODEL_13_ALL&(~MODEL_11) const static char* TIME_LAPSE_DIGITAL_LENSES_STRING[] = { "Narrow", "Wide 27 MP", "Linear 27 MP", "Max SuperView", "Wide", - "Linear" + "Linear", }; - const static int32_t TIME_LAPSE_DIGITAL_LENSES_VALUE[] = { - 19, 31, 32, 100, 101, 102 + 19, // Narrow + 31, // Wide 27 MP + 32, // Linear 27 MP + 100, // Max SuperView + 101, // Wide + 102, // Linear +}; +const static int32_t TIME_LAPSE_DIGITAL_LENSES_SUPPORT[] = { + MODEL_10_ALL, // Narrow + MODEL_13, // Wide 27 MP + MODEL_13, // Linear 27 MP + MODEL_10, // Max SuperView + MODEL_12_ALL&(~MODEL_11), // Wide + MODEL_12_ALL&(~MODEL_11), // Linear }; +#pragma endregion +#pragma region Photo Output #define PHOTO_OUTPUT_ID 125 #define PHOTO_OUTPUT_SIZE 4 #define PHOTO_OUTPUT_NAME "Photo Output" - +#define PHOTO_OUTPUT_AVA MODEL_MAX2_ALL&(~MODEL_11) const static char* PHOTO_OUTPUT_STRING[] = { "Standard", "RAW", "HDR", - "SuperPhoto" + "SuperPhoto", }; - const static int32_t PHOTO_OUTPUT_VALUE[] = { - 0, 1, 2, 3 + 0, // Standard + 1, // RAW + 2, // HDR + 3, // SuperPhoto +}; +const static int32_t PHOTO_OUTPUT_SUPPORT[] = { + MODEL_MAX2_ALL&(~MODEL_11), // Standard + MODEL_MAX2_ALL&(~MODEL_11), // RAW + MODEL_13_ALL&(~MODEL_11), // HDR + MODEL_13_ALL&(~MODEL_11), // SuperPhoto }; +#pragma endregion #pragma region Media #define MEDIA_FORMAT_ID 128 #define MEDIA_FORMAT_SIZE 4 #define MEDIA_FORMAT_NAME "Media Format" - +#define MEDIA_FORMAT_AVA MODEL_MAX2_ALL&(~MODEL_11) const static char* MEDIA_FORMAT_STRING[] = { "Time Lapse Video", "Time Lapse Photo", "Night Lapse Photo", "Night Lapse Video" }; - const static int32_t MEDIA_FORMAT_VALUE[] = { - 13, 20, 21, 26 + 13, // Time Lapse Video + 20, // Time Lapse Photo + 21, // Night Lapse Photo + 26, // Night Lapse Video +}; +const static int32_t MEDIA_FORMAT_SUPPORT[] = { + MODEL_MAX2_ALL&(~MODEL_11), // Time Lapse Video + MODEL_MAX2_ALL&(~MODEL_11), // Time Lapse Photo + MODEL_MAX2_ALL&(~MODEL_11), // Night Lapse Photo + MODEL_MAX2_ALL&(~MODEL_11), // Night Lapse Video }; #pragma endregion From ec06254e56fdf0b610372891c8003247bdc56e1b Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 14:30:13 +0800 Subject: [PATCH 04/21] Update setting to video performance mode (id 173) --- src/common/camera_setting.h | 394 ++++++++++++++++++++++++------------ 1 file changed, 269 insertions(+), 125 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index bfd6ed7..5f467ba 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -229,46 +229,6 @@ const static int32_t VIDEO_TIMELAPSE_RATE_SUPPORT[] = { }; #pragma endregion -#pragma region ISO Min 1 -#define ISO_MIN_1_ID 102 -#define ISO_MIN_1_SIZE 8 -#define ISO_MIN_1_NAME "ISO Minimum" -#define ISO_MIN_1_AVA MODEL_MAX2_ALL -const static char* ISO_MIN_1_STRING[] = { - "Auto", - "6400", - "3200", - "1600", - "800", - "400", - "200", - "100", -}; -const static int32_t ISO_VALUE[] = { - 9, 0, 3, 1, 4, 2, 7, 8 -}; -#pragma endregion - -#pragma region ISO Max 1 -#define ISO_MAX_1_ID 13 -#pragma endregion - -#pragma region ISO Min 2 -#define ISO_MIN_2_ID 75 -#pragma endregion - -#pragma region ISO Max 2 -#define ISO_MAX_2_ID 37 -#pragma endregion - -#pragma region ISO Min 3 -#define ISO_MIN_3_ID 76 -#pragma endregion - -#pragma region ISO Max 3 -#define ISO_MAX_3_ID 24 -#pragma endregion - #pragma region Photo Time Lapse #define PHOTO_TIMELAPSE_RATE_ID 30 #define PHOTO_TIMELAPSE_RATE_SIZE 12 @@ -815,104 +775,111 @@ const static int32_t MEDIA_FORMAT_SUPPORT[] = { }; #pragma endregion +#pragma region Anti Flicker #define ANTI_FLICKER_ID 134 #define ANTI_FLICKER_SIZE 4 #define ANTI_FLICKER_NAME "Anti-Flicker" - +#define ANTI_FLICKER_AVA MODEL_13_ALL const static char* ANTI_FLICKER_STRING[] = { "NTSC", "PAL", "60Hz", - "50Hz" + "50Hz", }; - const static int32_t ANTI_FLICKER_VALUE[] = { - 0, 1, 2, 3 + 0, // NTSC + 1, // PAL + 2, // 60Hz + 3, // 50Hz +}; +const static int32_t ANTI_FLICKER_SUPPORT[] = { + MODEL_13, // NTSC + MODEL_13, // PAL + MODEL_12_ALL, // 60Hz + MODEL_12_ALL, // 50Hz }; +#pragma endregion +#pragma region HyperSmooth #define HYPERSMOOTH_ID 135 #define HYPERSMOOTH_SIZE 6 #define HYPERSMOOTH_NAME "Hypersmooth" - +#define HYPERSMOOTH_AVA MODEL_MAX2_ALL const static char* HYPERSMOOTH_STRING[] = { "Off", "Low", "High", "Boost", "Auto Boost", - "Standard" + "Standard", }; - const static int32_t HYPERSMOOTH_VALUE[] = { - 0, 1, 2, 3, 4, 100 -}; - -#define SHUTTER_SPEED_ID 145 -#define SHUTTER_SPEED_SIZE 22 -#define SHUTTER_SPEED_NAME "Shutter Speed" - -const static char* SHUTTER_SPEED_STRING[] = { - "Auto", - "1/24", - "1/25", - "1/30", - "1/48", - "1/50", - "1/60", - "1/96", - "1/100", - "1/120", - "1/192", - "1/200", - "1/240", - "1/384", - "1/400", - "1/480", - "1/800", - "1/900", - "1/1600", - "1/1920", - "1/3200", - "1/3840", -}; - -const static int32_t SHUTTER_SPEED_VALUE[] = { - 0, 3, 4, 5, 6, 7, 8, 11, 12, 13, 16, 17, 18, 25, 21, 22, 28, - 23, 29, 24, 30, 31 + 0, // Off + 1, // Low + 2, // High + 3, // Boost + 4, // Auto Boost + 100, // Standard +}; +const static int32_t HYPERSMOOTH_SUPPORT[] = { + MODEL_MAX2_ALL, // Off + MODEL_MAX2_ALL&(~MODEL_10), // Low + MODEL_10_ALL, // High + MODEL_11_ALL, // Boost + MODEL_MAX2_ALL&(~MODEL_10_ALL), // Auto Boost + MODEL_10, // Standard }; +#pragma endregion +#pragma region Video Horizon leveling #define VIDEO_HORIZON_LEVELING_ID 150 #define VIDEO_HORIZON_LEVELING_SIZE 3 #define VIDEO_HORIZON_LEVELING_NAME "Video Horizon Leveling" - +#define VIDEO_HORIZON_LEVELING_AVA MODEL_11_BLACK const static char* VIDEO_HORIZON_LEVELING_STRING[] = { "Off", "On", - "Locked" + "Locked", }; - const static int32_t VIDEO_HORIZON_LEVELING_VALUE[] = { - 0, 1, 2 + 0, // Off + 1, // On + 2, // Locked +}; +const static int32_t VIDEO_HORIZON_LEVELING_SUPPORT[] = { + MODEL_11_BLACK, // Off + MODEL_11_BLACK, // On + MODEL_11_BLACK, // Locked }; +#pragma endregion +#pragma region Photo Horizon leveling #define PHOTO_HORIZON_LEVELING_ID 151 #define PHOTO_HORIZON_LEVELING_SIZE 3 #define PHOTO_HORIZON_LEVELING_NAME "Photo Horizon Leveling" - +#define PHOTO_HORIZON_LEVELING_AVA MODEL_11_BLACK const static char* PHOTO_HORIZON_LEVELING_STRING[] = { "Off", "On", - "Locked" + "Locked", }; - const static int32_t PHOTO_HORIZON_LEVELING_VALUE[] = { - 0, 1, 2 + 0, // Off + 1, // On + 2, // Locked +}; +const static int32_t PHOTO_HORIZON_LEVELING_SUPPORT[] = { + MODEL_11_BLACK, // Off + MODEL_11_BLACK, // On + MODEL_11_BLACK, // Locked }; +#pragma endregion +#pragma region Video Duration #define VIDEO_DURATION_ID 156 #define VIDEO_DURATION_SIZE 11 #define VIDEO_DURATION_NAME "Video Duration" - +#define VIDEO_DURATION_AVA MODEL_MAX2_ALL&(~MODEL_11) const static char* VIDEO_DURATION_STRING[] = { "15 Sec", "30 Sec", @@ -926,15 +893,39 @@ const static char* VIDEO_DURATION_STRING[] = { "5 Sec", "No Limit", }; - const static int32_t VIDEO_DURATION_VALUE[] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100 + 1, // 15 Sec + 2, // 30 Sec + 3, // 1 Min + 4, // 5 Min + 5, // 15 Min + 6, // 30 Min + 7, // 1 Hour + 8, // 2 Hour + 9, // 3 Hour + 10,// 5 Sec + 100, // No Limit +}; +const static int32_t VIDEO_DURATION_VALUE[] = { + MODEL_MAX2_ALL&(~MODEL_11), // 15 Sec + MODEL_MAX2_ALL&(~MODEL_11), // 30 Sec + MODEL_MAX2_ALL&(~MODEL_11), // 1 Min + MODEL_MAX2_ALL&(~MODEL_11), // 5 Min + MODEL_MAX2_ALL&(~MODEL_11), // 15 Min + MODEL_MAX2_ALL&(~MODEL_11), // 30 Min + MODEL_MAX2_ALL&(~MODEL_11), // 1 Hour + MODEL_MAX2_ALL&(~MODEL_11), // 2 Hour + MODEL_MAX2_ALL&(~MODEL_11), // 3 Hour + MODEL_13,// 5 Sec + MODEL_MAX2_ALL&(~MODEL_11), // No Limit }; +#pragma endregion +#pragma region Multi Shot Duration #define MULTISHOT_DURATION_ID 157 #define MULTISHOT_DURATION_SIZE 11 #define MULTISHOT_DURATION_NAME "Multi Shot Duration" - +#define MULTISHOT_DURATION_AVA MODEL_MAX2_ALL&(~MODEL_11) const static char* MULTISHOT_DURATION_STRING[] = { "Off", "15 Sec", @@ -948,55 +939,80 @@ const static char* MULTISHOT_DURATION_STRING[] = { "3 Hour", "No Limit", }; - const static int32_t MULTISHOT_DURATION_VALUE[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100 + 0, // Off + 1, // 15 Sec + 2, // 30 Sec + 3, // 1 Min + 4, // 5 Min + 5, // 15 Min + 6, // 30 Min + 7, // 1 Hour + 8, // 2 Hour + 9, // 3 Hour + 100, // No Limit +}; +const static int32_t MULTISHOT_DURATION_SUPPORT[] = { + MODEL_MAX2, // Off + MODEL_MAX2_ALL&(~MODEL_11), // 15 Sec + MODEL_MAX2_ALL&(~MODEL_11), // 30 Sec + MODEL_MAX2_ALL&(~MODEL_11), // 1 Min + MODEL_MAX2_ALL&(~MODEL_11), // 5 Min + MODEL_MAX2_ALL&(~MODEL_11), // 15 Min + MODEL_MAX2_ALL&(~MODEL_11), // 30 Min + MODEL_MAX2_ALL&(~MODEL_11), // 1 Hour + MODEL_MAX2_ALL&(~MODEL_11), // 2 Hour + MODEL_MAX2_ALL&(~MODEL_11), // 3 Hour + MODEL_13_ALL&(~MODEL_11), // No Limit }; +#pragma endregion +#pragma region Max Lens #define MAX_LENS_ID 162 #define MAX_LENS_SIZE 2 #define MAX_LENS_NAME "Max Lens" - +#define MAX_LENS_AVA MODEL_11_BLACK|MODEL_10|MODEL_9 const static char* MAX_LENS_STRING[] = { "Off", - "On" + "On", }; - const static int32_t MAX_LENS_VALUE[] = { - 0, 1 + 0, // Off + 1, // On" +}; +const static int32_t MAX_LENS_SUPPORT[] = { + MODEL_11_BLACK|MODEL_10|MODEL_9, // Off + MODEL_11_BLACK|MODEL_10|MODEL_9, // On" }; +#pragma endregion +#pragma region Hind Sight #define HINDSIGHT_ID 167 #define HINDSIGHT_SIZE 3 #define HINDSIGHT_NAME "HindSight" - +#define HINDSIGHT_AVA MODEL_13_ALL&(~MODEL_11) const static char* HINDSIGHT_STRING[] = { "15 Sec", "30 Sec", "Off", }; - const static int32_t HINDSIGHT_VALUE[] = { - 2, 3, 4 -}; - -#define SCHEDULED_CAPTURE_ID 168 -#define SCHEDULED_CAPTURE_SIZE 2 -#define SCHEDULED_CAPTURE_NAME "Scheduled Capture" - -const static char* SCHEDULED_CAPTURE_STRING[] = { - "Off", - "On" + 2, // 15 Sec + 3, // 30 Sec + 4, // Off }; - -const static int32_t SCHEDULED_CAPTURE_VALUE[] = { - 0, 1 +const static int32_t HINDSIGHT_SUPPORT[] = { + MODEL_13_ALL&(~MODEL_11), // 15 Sec + MODEL_13_ALL&(~MODEL_11), // 30 Sec + MODEL_13_ALL&(~MODEL_11), // Off }; +#pragma endregion +#pragma region Photo Single Interval #define PHOTO_SINGLE_INTERVAL_ID 171 #define PHOTO_SINGLE_INTERVAL_SIZE 10 #define PHOTO_SINGLE_INTERVAL_NAME "Photo Single Interval" - +#define PHOTO_SINGLE_INTERVAL_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* PHOTO_SINGLE_INTERVAL_STRING[] = { "Off", "0.5s", @@ -1009,15 +1025,37 @@ const static char* PHOTO_SINGLE_INTERVAL_STRING[] = { "120s", "3s", }; - const static int32_t PHOTO_SINGLE_INTERVAL_VALUE[] = { - 0, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 0, // Off + 2, // 0.5s + 3, // 1s + 4, // 2s + 5, // 5s + 6, // 10s + 7, // 30s + 8, // 60s + 9, // 120s + 10, // 3s +}; +const static int32_t PHOTO_SINGLE_INTERVAL_SUPPORT[] = { + MODEL_MAX2|MODEL_13|MODEL_12, // Off + MODEL_MAX2|MODEL_13|MODEL_12, // 0.5s + MODEL_MAX2|MODEL_13|MODEL_12, // 1s + MODEL_MAX2|MODEL_13|MODEL_12, // 2s + MODEL_MAX2|MODEL_13|MODEL_12, // 5s + MODEL_MAX2|MODEL_13|MODEL_12, // 10s + MODEL_MAX2|MODEL_13|MODEL_12, // 30s + MODEL_MAX2|MODEL_13|MODEL_12, // 60s + MODEL_MAX2|MODEL_13|MODEL_12, // 120s + MODEL_MAX2|MODEL_13|MODEL_12, // 3s }; +#pragma endregion +#pragma region Photo single duration #define PHOTO_SINGLE_DURATION_ID 172 #define PHOTO_SINGLE_DURATION_SIZE 10 #define PHOTO_SINGLE_DURATION_NAME "Photo Single Duration" - +#define PHOTO_SINGLE_DURATION_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* PHOTO_SINGLE_DURATION_STRING[] = { "Off", "15 Sec", @@ -1030,24 +1068,53 @@ const static char* PHOTO_SINGLE_DURATION_STRING[] = { "2 Hour", "3 Hour", }; - const static int32_t PHOTO_SINGLE_DURATION_VALUE[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + 0, // Off + 1, // 15 Sec + 2, // 30 Sec + 3, // 1 Min + 4, // 5 Min + 5, // 15 Min + 6, // 30 Min + 7, // 1 Hour + 8, // 2 Hour + 9, // 3 Hour +}; +const static int32_t PHOTO_SINGLE_DURATION_SUPPORT[] = { + MODEL_MAX2|MODEL_13|MODEL_12, // Off + MODEL_MAX2|MODEL_13|MODEL_12, // 15 Sec + MODEL_MAX2|MODEL_13|MODEL_12, // 30 Sec + MODEL_MAX2|MODEL_13|MODEL_12, // 1 Min + MODEL_MAX2|MODEL_13|MODEL_12, // 5 Min + MODEL_MAX2|MODEL_13|MODEL_12, // 15 Min + MODEL_MAX2|MODEL_13|MODEL_12, // 30 Min + MODEL_MAX2|MODEL_13|MODEL_12, // 1 Hour + MODEL_MAX2|MODEL_13|MODEL_12, // 2 Hour + MODEL_MAX2|MODEL_13|MODEL_12, // 3 Hour }; +#pragma endregion +#pragma region Video Performance Mode #define VIDEO_PERFORMANCE_MODE_ID 173 #define VIDEO_PERFORMANCE_MODE_SIZE 3 #define VIDEO_PERFORMANCE_MODE_NAME "Video Performance Mode" - +#define VIDEO_PERFORMANCE_MODE_AVA MODEL_10 const static char* VIDEO_PERFORMANCE_MODE_STRING[] = { "Maximum Video Performance", "Extended Battery", - "Tripod / Stationary Video" + "Tripod / Stationary Video", }; - const static int32_t VIDEO_PERFORMANCE_MODE_VALUE[] = { - 0, 1, 2 + 0, // Maximum Video Performance", + 1, // Extended Battery", + 2, // Tripod / Stationary Video", +}; +const static int32_t VIDEO_PERFORMANCE_MODE_SUPPORT[] = { + MODEL_10, // Maximum Video Performance", + MODEL_10, // Extended Battery", + MODEL_10, // Tripod / Stationary Video", }; +#pragma endregion #define CONTROL_MODE_ID 175 #define CONTROL_MODE_SIZE 2 @@ -1471,4 +1538,81 @@ const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_VALUE[] = { #define LENS_ID 121 #define BITRATE_ID 124 + +#pragma region ISO Min 1 +#define ISO_MIN_1_ID 102 +#define ISO_MIN_1_SIZE 8 +#define ISO_MIN_1_NAME "ISO Minimum" +#define ISO_MIN_1_AVA MODEL_MAX2_ALL +const static char* ISO_MIN_1_STRING[] = { + "Auto", + "6400", + "3200", + "1600", + "800", + "400", + "200", + "100", +}; +const static int32_t ISO_VALUE[] = { + 9, 0, 3, 1, 4, 2, 7, 8 +}; +#pragma endregion + +#pragma region ISO Max 1 +#define ISO_MAX_1_ID 13 +#pragma endregion + +#pragma region ISO Min 2 +#define ISO_MIN_2_ID 75 +#pragma endregion + +#pragma region ISO Max 2 +#define ISO_MAX_2_ID 37 +#pragma endregion + +#pragma region ISO Min 3 +#define ISO_MIN_3_ID 76 +#pragma endregion + +#pragma region ISO Max 3 +#define ISO_MAX_3_ID 24 +#pragma endregion + +#pragma region Shutter Speed +#define SHUTTER_SPEED_ID 145 +#define SHUTTER_SPEED_SIZE 22 +#define SHUTTER_SPEED_NAME "Shutter Speed" + +const static char* SHUTTER_SPEED_STRING[] = { + "Auto", + "1/24", + "1/25", + "1/30", + "1/48", + "1/50", + "1/60", + "1/96", + "1/100", + "1/120", + "1/192", + "1/200", + "1/240", + "1/384", + "1/400", + "1/480", + "1/800", + "1/900", + "1/1600", + "1/1920", + "1/3200", + "1/3840", +}; + +const static int32_t SHUTTER_SPEED_VALUE[] = { + 0, 3, 4, 5, 6, 7, 8, 11, 12, 13, 16, 17, 18, 25, 21, 22, 28, + 23, 29, 24, 30, 31 +}; +#pragma endregion + #endif \ No newline at end of file From bd5f9ee7a54cea880a03d0bc9478d74806d74a56 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 15:06:34 +0800 Subject: [PATCH 05/21] Update to framing which is ID 193 And fixed defined string typo --- src/common/camera_model.h | 10 +- src/common/camera_setting.h | 494 ++++++++++++++++++++++++++++++------ 2 files changed, 422 insertions(+), 82 deletions(-) diff --git a/src/common/camera_model.h b/src/common/camera_model.h index f8e0a48..295d985 100644 --- a/src/common/camera_model.h +++ b/src/common/camera_model.h @@ -11,20 +11,20 @@ /** GoPro Model 11 Black ID */ #define MODEL_11_BLACK 8 /** GoPro Model 12 ID */ -#define MODEL_12_BLACK 16 +#define MODEL_12 16 /** GoPro Model 13 ID */ -#define MODEL_13_BLACK 32 +#define MODEL_13 32 /** GoPro Model MAX2 ID */ #define MODEL_MAX2 64 /** Two model 11 includes */ #define MODEL_11S MODEL_11|MODEL_11_BLACK /** Fron Max2 to all the versions below includes */ -#define MODEL_MAX2_ALL MODEL_MAX2|MODEL_13_BLACK|MODEL_12_BLACK|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 +#define MODEL_MAX2_ALL MODEL_MAX2|MODEL_13|MODEL_12|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 /** Fron 13 to all the versions below includes */ -#define MODEL_13_ALL MODEL_13_BLACK|MODEL_12_BLACK|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 +#define MODEL_13_ALL MODEL_13|MODEL_12|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 /** Fron 12 to all the versions below includes */ -#define MODEL_12_ALL MODEL_12_BLACK|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 +#define MODEL_12_ALL MODEL_12|MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 /** Fron 11 to all the versions below includes */ #define MODEL_11_ALL MODEL_11_BLACK|MODEL_11|MODEL_10|MODEL_9 /** Fron 10 to all the versions below includes */ diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 5f467ba..5f5a821 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -483,7 +483,7 @@ const static int32_t LED_SUPPORT[] = { #define VIDEO_ASPECT_RATIO_ID 108 #define VIDEO_ASPECT_RATIO_SIZE 6 #define VIDEO_ASPECT_RATIO_NAME "Video Aspect Ratio" -#define VIDEO_ASPECT_RATIO_AVA MODEL_MAX2|MODEL_13|MODEL_12_BLACK +#define VIDEO_ASPECT_RATIO_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* VIDEO_ASPECT_RATIO_STRING[] = { "4:3", "16:9", @@ -501,10 +501,10 @@ const static int32_t VIDEO_ASPECT_RATIO_VALUE[] = { 6, // 1:1 }; const static int32_t VIDEO_ASPECT_RATIO_SUPPORT[] = { - MODEL_MAX2|MODEL_13|MODEL_12_BLACK, // 4:3 - MODEL_MAX2|MODEL_13|MODEL_12_BLACK, // 16:9 - MODEL_13|MODEL_12_BLACK, // 8:7 - MODEL_MAX2|MODEL_13|MODEL_12_BLACK, // 9:16 + MODEL_MAX2|MODEL_13|MODEL_12, // 4:3 + MODEL_MAX2|MODEL_13|MODEL_12, // 16:9 + MODEL_13|MODEL_12, // 8:7 + MODEL_MAX2|MODEL_13|MODEL_12, // 9:16 MODEL_13, // 21:9 MODEL_13, // 1:1 }; @@ -1116,23 +1116,30 @@ const static int32_t VIDEO_PERFORMANCE_MODE_SUPPORT[] = { }; #pragma endregion +#pragma region Control Mode #define CONTROL_MODE_ID 175 #define CONTROL_MODE_SIZE 2 #define CONTROL_MODE_NAME "Control Mode" - +#define CONTROL_MODE_AVA MODEL_13|MODEL_12|MODEL_11_BLACK const static char* CONTROL_MODE_STRING[] = { "Easy", - "Pro" + "Pro", }; - const static int32_t CONTROL_MODE_VALUE[] = { - 0, 1 + 0, // Easy + 1, // Pro" }; +const static int32_t CONTROL_MODE_SUPPORT[] = { + MODEL_13|MODEL_12|MODEL_11_BLACK, // Easy + MODEL_13|MODEL_12|MODEL_11_BLACK, // Pro" +}; +#pragma endregion +#pragma region Easy Mode Speed #define EASY_MODE_SPEED_ID 176 #define EASY_MODE_SPEED_SIZE 88 #define EASY_MODE_SPEED_NAME "Easy Mode Speed" - +#define EASY_MODE_SPEED_NAME MODEL_13|MODEL_12|MODEL_11_BLACK const static char* EASY_MODE_SPEED_STRING[] = { "8X Ultra Slo-Mo", "4X Super Slo-Mo", @@ -1223,59 +1230,253 @@ const static char* EASY_MODE_SPEED_STRING[] = { "120 4X Super Slo-Mo Speed (2.7K) (4:3) (V2)", "100 4X Super Slo-Mo Speed (2.7K) (4:3) (V2)", }; - const static int32_t EASY_MODE_SPEED_VALUE[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 + 0, // 8X Ultra Slo-Mo + 1, // 4X Super Slo-Mo + 2, // 2X Slo-Mo + 3, // 1X Speed (Low Light) + 4, // 4X Super Slo-Mo (Ext. Batt.) + 5, // 2X Slo-Mo (Ext. Batt.) + 6, // 1X Speed (Ext. Batt.) (Low Light) + 7, // 8X Ultra Slo-Mo (50Hz) + 8, // 4X Super Slo-Mo (50Hz) + 9, // 2X Slo-Mo (50Hz) + 10, // 1X Speed (50Hz) (Low Light) + 11, // 4X Super Slo-Mo (50Hz) (Ext. Batt.) + 12, // 2X Slo-Mo (50Hz) (Ext. Batt.) + 13, // 1X Speed (50Hz) (Ext. Batt.) (Low Light) + 14, // 8X Ultra Slo-Mo (Ext. Batt.) + 15, // 8X Ultra Slo-Mo (50Hz) (Ext. Batt.) + 16, // 8X Ultra Slo-Mo (Long. Batt.) + 17, // 4X Super Slo-Mo (Long. Batt.) + 18, // 2X Slo-Mo (Long. Batt.) + 19, // 1X Speed (Long. Batt.) (Low Light) + 20, // 8X Ultra Slo-Mo (50Hz) (Long. Batt.) + 21,// 4X Super Slo-Mo (50Hz) (Long. Batt.) + 22, // 2X Slo-Mo (50Hz) (Long. Batt.) + 23, // 1X Speed (50Hz) (Long. Batt.) (Low Light) + 24, // 2X Slo-Mo (4K) + 25, // 4X Super Slo-Mo (2.7K) + 26, // 2X Slo-Mo (4K) (50Hz) + 27, // 4X Super Slo-Mo (2.7K) (50Hz) + 100, // 8X Ultra Slo-Mo (V2) + 101, // 4X Super Slo-Mo (V2) + 102, // 2X Slo-Mo (V2) + 103, // 1X Speed (Low Light) (V2) + 104, // 8X Ultra Slo-Mo (50Hz) (V2) + 105, // 4X Super Slo-Mo (50Hz) (V2) + 106, // 2X Slo-Mo (50Hz) (V2) + 107, // 1X Speed (50Hz) (Low Light) (V2) + 108, // 8X Ultra Slo-Mo (Long. Batt.) (V2) + 109, // 4X Super Slo-Mo (Long. Batt.) (V2) + 110, // 2X Slo-Mo (Long. Batt.) (V2) + 111,// 1X Speed (Long. Batt.) (Low Light) (V2) + 112, // 8X Ultra Slo-Mo (50Hz) (Long. Batt.) (V2) + 113, // 4X Super Slo-Mo (50Hz) (Long. Batt.) (V2) + 114, // 2X Slo-Mo (50Hz) (Long. Batt.) (V2) + 115, // 1X Speed (50Hz) (Long. Batt.) (Low Light) (V2) + 116, // 2X Slo-Mo (4K) (V2) + 117, // 2X Slo-Mo (4K) (50Hz) (V2) + 118, // 1X Speed (Low Light) (V2) (Vertical) + 119, // 1X Speed (50Hz) (Low Light) (V2) (Vertical) + 120, // 2X Slo-Mo (V2) (Vertical) + 121, // 2X Slo-Mo (50Hz) (V2) (Vertical) + 122, // 1X Speed (Full Frame) (Low Light) (V2) + 123, // 1X Speed (50Hz) (Full Frame) (Low Light) (V2) + 124, // 2X Slo-Mo (Full Frame) (V2) + 125, // 2X Slo-Mo (50Hz) (Full Frame) (V2) + 126, // 1X Speed (4K) (Low Light) (V2) + 127, // 1X Speed (4K) (50Hz) (Low Light) (V2) + 128,// 1X Speed (2.7K) (Low Light) (V2) + 129, // 1X Speed (2.7K) (50Hz) (Low Light) (V2) + 130, // 2X Slo-Mo (2.7K) (V2) + 131, // 2X Slo-Mo (2.7K) (50Hz) (V2) + 132, // 2X Slo-Mo (Long. Batt.) (V2) (Vertical) + 133, // 2X Slo-Mo (50Hz) (Long. Batt.) (V2) (Vertical) + 134, // 1X Speed (Long. Batt.) (Low Light) (V2) (Vertical) + 135, // 1X Speed (50Hz) (Long. Batt.) (Low Light) (V2) (Vertical) + 136, // 1X Speed (4K) (Full Frame) (Low Light) (V2) + 137, // 1X Speed (4K) (50Hz) (Full Frame) (Low Light) (V2) + 138, // 1X Normal Speed (1:1) (30 Fps) (4K) (V2) + 139, // 1X Normal Speed (1:1) (25 Fps) (4K) (V2) + 140, // 2X Slo-Mo Speed (1:1) (4K) (60 Fps) (V2) + 141, // 2X Slo-Mo Speed (1:1) (4K) (50 Fps) (V2) + 142, // 1X Normal Speed (21:9) (30 Fps) (5.3K) (V2) + 143, // 1X Normal Speed (21:9) (25 Fps) (5.3K) (V2) + 144, // 2X Slo-Mo Speed (21:9) (5.3K) (60 Fps) (V2) + 145, // 2X Slo-Mo Speed (21:9) (5.3K) (50 Fps) (V2) + 146, // 1X Normal Speed (21:9) (30 Fps) (4K) (V2) + 147, // 1X Normal Speed (21:9) (25 Fps) (4K) (V2) + 148, // 2X Slo-Mo Speed (21:9) (4K) (60 Fps) (V2) + 149, // 2X Slo-Mo Speed (21:9) (4K) (50 Fps) (V2) + 150, // 120 4X Super Slo-Mo Speed (21:9) (4K) (V2) + 151, // 100 4X Super Slo-Mo Speed (21:9) (4K) (V2) + 152, // 1X Normal Speed (30 Fps) (4:3) (5.3K) (V2) + 153, // 1X Normal Speed (25 Fps) (4:3) (5.3K) (V2) + 154, // 1X Normal Speed (30 Fps) (4:3) (4K) (V2) + 155, // 1X Normal Speed (25 Fps) (4:3) (4K) (V2) + 156, // 2X Slo-Mo Speed (4:3) (4K) (60 Fps) (V2) + 157, // 2X Slo-Mo Speed (4:3) (4K) (50 Fps) (V2) + 158, // 120 4X Super Slo-Mo Speed (2.7K) (4:3) (V2) + 159, // 100 4X Super Slo-Mo Speed (2.7K) (4:3) (V2) +}; +const static int32_t EASY_MODE_SPEED_SUPPORT[] = { + MODEL_11_BLACK, // 8X Ultra Slo-Mo + MODEL_11_BLACK, // 4X Super Slo-Mo + MODEL_11_BLACK, // 2X Slo-Mo + MODEL_11_BLACK, // 1X Speed (Low Light) + MODEL_11_BLACK, // 4X Super Slo-Mo (Ext. Batt.) + MODEL_11_BLACK, // 2X Slo-Mo (Ext. Batt.) + MODEL_11_BLACK, // 1X Speed (Ext. Batt.) (Low Light) + MODEL_11_BLACK, // 8X Ultra Slo-Mo (50Hz) + MODEL_11_BLACK, // 4X Super Slo-Mo (50Hz) + MODEL_11_BLACK, // 2X Slo-Mo (50Hz) + MODEL_11_BLACK, // 1X Speed (50Hz) (Low Light) + MODEL_11_BLACK, // 4X Super Slo-Mo (50Hz) (Ext. Batt.) + MODEL_11_BLACK, // 2X Slo-Mo (50Hz) (Ext. Batt.) + MODEL_11_BLACK, // 1X Speed (50Hz) (Ext. Batt.) (Low Light) + MODEL_11_BLACK, // 8X Ultra Slo-Mo (Ext. Batt.) + MODEL_11_BLACK, // 8X Ultra Slo-Mo (50Hz) (Ext. Batt.) + MODEL_11_BLACK, // 8X Ultra Slo-Mo (Long. Batt.) + MODEL_11_BLACK, // 4X Super Slo-Mo (Long. Batt.) + MODEL_11_BLACK, // 2X Slo-Mo (Long. Batt.) + MODEL_11_BLACK, // 1X Speed (Long. Batt.) (Low Light) + MODEL_11_BLACK, // 8X Ultra Slo-Mo (50Hz) (Long. Batt.) + MODEL_11_BLACK,// 4X Super Slo-Mo (50Hz) (Long. Batt.) + MODEL_11_BLACK, // 2X Slo-Mo (50Hz) (Long. Batt.) + MODEL_11_BLACK, // 1X Speed (50Hz) (Long. Batt.) (Low Light) + MODEL_11_BLACK, // 2X Slo-Mo (4K) + MODEL_11_BLACK, // 4X Super Slo-Mo (2.7K) + MODEL_11_BLACK, // 2X Slo-Mo (4K) (50Hz) + MODEL_11_BLACK, // 4X Super Slo-Mo (2.7K) (50Hz) + MODEL_13|MODEL_12, // 8X Ultra Slo-Mo (V2) + MODEL_13|MODEL_12, // 4X Super Slo-Mo (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (V2) + MODEL_13|MODEL_12, // 1X Speed (Low Light) (V2) + MODEL_13|MODEL_12, // 8X Ultra Slo-Mo (50Hz) (V2) + MODEL_13|MODEL_12, // 4X Super Slo-Mo (50Hz) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (50Hz) (V2) + MODEL_13|MODEL_12, // 1X Speed (50Hz) (Low Light) (V2) + MODEL_13|MODEL_12, // 8X Ultra Slo-Mo (Long. Batt.) (V2) + MODEL_13|MODEL_12, // 4X Super Slo-Mo (Long. Batt.) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (Long. Batt.) (V2) + MODEL_13|MODEL_12,// 1X Speed (Long. Batt.) (Low Light) (V2) + MODEL_13|MODEL_12, // 8X Ultra Slo-Mo (50Hz) (Long. Batt.) (V2) + MODEL_13|MODEL_12, // 4X Super Slo-Mo (50Hz) (Long. Batt.) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (50Hz) (Long. Batt.) (V2) + MODEL_13|MODEL_12, // 1X Speed (50Hz) (Long. Batt.) (Low Light) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (4K) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (4K) (50Hz) (V2) + MODEL_13|MODEL_12, // 1X Speed (Low Light) (V2) (Vertical) + MODEL_13|MODEL_12, // 1X Speed (50Hz) (Low Light) (V2) (Vertical) + MODEL_13|MODEL_12, // 2X Slo-Mo (V2) (Vertical) + MODEL_13|MODEL_12, // 2X Slo-Mo (50Hz) (V2) (Vertical) + MODEL_13|MODEL_12, // 1X Speed (Full Frame) (Low Light) (V2) + MODEL_13|MODEL_12, // 1X Speed (50Hz) (Full Frame) (Low Light) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (Full Frame) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (50Hz) (Full Frame) (V2) + MODEL_13|MODEL_12, // 1X Speed (4K) (Low Light) (V2) + MODEL_13|MODEL_12, // 1X Speed (4K) (50Hz) (Low Light) (V2) + MODEL_12,// 1X Speed (2.7K) (Low Light) (V2) + MODEL_12, // 1X Speed (2.7K) (50Hz) (Low Light) (V2) + MODEL_12, // 2X Slo-Mo (2.7K) (V2) + MODEL_12, // 2X Slo-Mo (2.7K) (50Hz) (V2) + MODEL_13|MODEL_12, // 2X Slo-Mo (Long. Batt.) (V2) (Vertical) + MODEL_13|MODEL_12, // 2X Slo-Mo (50Hz) (Long. Batt.) (V2) (Vertical) + MODEL_13|MODEL_12, // 1X Speed (Long. Batt.) (Low Light) (V2) (Vertical) + MODEL_13|MODEL_12, // 1X Speed (50Hz) (Long. Batt.) (Low Light) (V2) (Vertical) + MODEL_13|MODEL_12, // 1X Speed (4K) (Full Frame) (Low Light) (V2) + MODEL_13|MODEL_12, // 1X Speed (4K) (50Hz) (Full Frame) (Low Light) (V2) + MODEL_13, // 1X Normal Speed (1:1) (30 Fps) (4K) (V2) + MODEL_13, // 1X Normal Speed (1:1) (25 Fps) (4K) (V2) + MODEL_13, // 2X Slo-Mo Speed (1:1) (4K) (60 Fps) (V2) + MODEL_13, // 2X Slo-Mo Speed (1:1) (4K) (50 Fps) (V2) + MODEL_13, // 1X Normal Speed (21:9) (30 Fps) (5.3K) (V2) + MODEL_13, // 1X Normal Speed (21:9) (25 Fps) (5.3K) (V2) + MODEL_13, // 2X Slo-Mo Speed (21:9) (5.3K) (60 Fps) (V2) + MODEL_13, // 2X Slo-Mo Speed (21:9) (5.3K) (50 Fps) (V2) + MODEL_13, // 1X Normal Speed (21:9) (30 Fps) (4K) (V2) + MODEL_13, // 1X Normal Speed (21:9) (25 Fps) (4K) (V2) + MODEL_13, // 2X Slo-Mo Speed (21:9) (4K) (60 Fps) (V2) + MODEL_13, // 2X Slo-Mo Speed (21:9) (4K) (50 Fps) (V2) + MODEL_13, // 120 4X Super Slo-Mo Speed (21:9) (4K) (V2) + MODEL_13, // 100 4X Super Slo-Mo Speed (21:9) (4K) (V2) + MODEL_13, // 1X Normal Speed (30 Fps) (4:3) (5.3K) (V2) + MODEL_13, // 1X Normal Speed (25 Fps) (4:3) (5.3K) (V2) + MODEL_13, // 1X Normal Speed (30 Fps) (4:3) (4K) (V2) + MODEL_13, // 1X Normal Speed (25 Fps) (4:3) (4K) (V2) + MODEL_13, // 2X Slo-Mo Speed (4:3) (4K) (60 Fps) (V2) + MODEL_13, // 2X Slo-Mo Speed (4:3) (4K) (50 Fps) (V2) + MODEL_13, // 120 4X Super Slo-Mo Speed (2.7K) (4:3) (V2) + MODEL_13, // 100 4X Super Slo-Mo Speed (2.7K) (4:3) (V2) }; +#pragma endregion +#pragma region Enable Night Photo #define ENABLE_NIGHT_PHOTO_ID 177 #define ENABLE_NIGHT_PHOTO_SIZE 2 #define ENABLE_NIGHT_PHOTO_NAME "Enable Night Photo" - +#define ENABLE_NIGHT_PHOTO_AVA MODEL_11_BLACK const static char* ENABLE_NIGHT_PHOTO_STRING[] = { "Off", - "On" + "On", }; - const static int32_t ENABLE_NIGHT_PHOTO_VALUE[] = { - 0, 1 + 0, // Off + 1, // On +}; +const static int32_t ENABLE_NIGHT_PHOTO_SUPPORT[] = { + MODEL_11_BLACK, // Off + MODEL_11_BLACK, // On }; +#pragma endregion +#pragma region Wireless Band #define WIRELESS_BAND_ID 178 #define WIRELESS_BAND_SIZE 2 #define WIRELESS_BAND_NAME "Wireless Band" - +#define WIRELESS_BAND_AVA MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)) const static char* WIRELESS_BAND_STRING[] = { "2.4 GHz", "5 GHz" }; - const static int32_t WIRELESS_BAND_VALUE[] = { - 0, 1 + 0, // 2.4 GHz + 1, // 5 GH +}; +const static int32_t WIRELESS_BAND_SUPPORT[] = { + MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)), // 2.4 GHz + MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)), // 5 GH }; +#pragma endregion +#pragma region Star Trails Length #define STAR_TRAILS_LENGTH_ID 179 #define STAR_TRAILS_LENGTH_SIZE 3 #define STAR_TRAILS_LENGTH_NAME "Star Trails Length" - +#define STAR_TRAILS_LENGTH_AVA MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)) const static char* STAR_TRAILS_LENGTH_STRING[] = { "Short", "Long", - "Max" + "Max", }; - const static int32_t STAR_TRAILS_LENGTH_VALUE[] = { - 1, 2, 3 + 1, // Short", + 2, // Long", + 3, // Max", }; +const static int32_t STAR_TRAILS_LENGTH_SUPPORT[] = { + MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)), // Short", + MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)), // Long", + MODEL_MAX2_ALL&(~(MODEL_10|MODEL_9)), // Max", +}; +#pragma endregion +#pragma region System Video Mode #define SYSTEM_VIDEO_MODE_ID 180 #define SYSTEM_VIDEO_MODE_SIZE 5 #define SYSTEM_VIDEO_MODE_NAME "System Video Mode" - +#define SYSTEM_VIDEO_MODE_AVA MODEL_13|MODEL_11_BLACK const static char* SYSTEM_VIDEO_MODE_STRING[] = { "Highest Quality", "Extended Battery", @@ -1283,72 +1484,118 @@ const static char* SYSTEM_VIDEO_MODE_STRING[] = { "Standard Quality", "Basic Quality", }; - const static int32_t SYSTEM_VIDEO_MODE_VALUE[] = { - 0, 101, 102, 111, 112 + 0, // Highest Quality + 101, // Extended Battery + 102, // Longest Battery + 111, // Standard Quality + 112, // Basic Quality +}; +const static int32_t SYSTEM_VIDEO_MODE_SUPPORT[] = { + MODEL_13|MODEL_11_BLACK, // Highest Quality + MODEL_11_BLACK, // Extended Battery + MODEL_11_BLACK, // Longest Battery + MODEL_13, // Standard Quality + MODEL_13, // Basic Quality }; +#pragma endregion +#pragma region Video Bit Rate #define VIDEO_BIT_RATE_ID 182 #define VIDEO_BIT_RATE_SIZE 2 #define VIDEO_BIT_RATE_NAME "Video Bit Rate" - +#define VIDEO_BIT_RATE_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* VIDEO_BIT_RATE_STRING[] = { "Standard", - "High" + "High", }; - const static int32_t VIDEO_BIT_RATE_VALUE[] = { - 0, 1 + 0, // Standard + 1, // High +}; +const static int32_t VIDEO_BIT_RATE_SUPPORT[] = { + MODEL_MAX2|MODEL_13|MODEL_12, // Standard + MODEL_MAX2|MODEL_13|MODEL_12, // High }; +#pragma endregion +#pragma region Bit Depth #define BIT_DEPTH_ID 183 #define BIT_DEPTH_SIZE 2 #define BIT_DEPTH_NAME "Bit Depth" - +#define BIT_DEPTH_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* BIT_DEPTH_STRING[] = { "8-bit", - "10-bit" + "10-bit", }; - const static int32_t BIT_DEPTH_VALUE[] = { - 0, 2 + 0, // 8-bit + 2, // 10-bit +}; +const static int32_t BIT_DEPTH_SUPPORT[] = { + MODEL_MAX2|MODEL_13|MODEL_12, // 8-bit + MODEL_MAX2|MODEL_13|MODEL_12, // 10-bit }; +#pragma endregion +#pragma region Profiles #define PROFILES_ID 184 #define PROFILES_SIZE 3 #define PROFILES_NAME "Profiles" - +#define PROFILES_AVA MODEL_MAX2|MODEL_13|MODEL_12 const static char* PROFILES_STRING[] = { "Standard", "HDR", "Log", "HLG HDR" }; - const static int32_t PROFILES_VALUE[] = { - 0, 1, 2, 101 + 0, // Standard + 1, // HDR + 2, // Log + 101, // HLG HD }; +const static int32_t PROFILES_SUPPORT[] = { + MODEL_MAX2|MODEL_13|MODEL_12, // Standard + MODEL_13|MODEL_12, // HDR + MODEL_MAX2|MODEL_13|MODEL_12, // Log + MODEL_13, // HLG HD +}; +#pragma endregion +#pragma region Video Easy Mode #define VIDEO_EASY_MODE_ID 186 #define VIDEO_EASY_MODE_SIZE 5 #define VIDEO_EASY_MODE_NAME "Video Easy Mode" - +#define VIDEO_EASY_MODE_AVA MODEL_13|MODEL_12 const static char* VIDEO_EASY_MODE_STRING[] = { "Highest Quality", "Standard Quality", "Basic Quality", "Standard Video", - "HDR Video" + "HDR Video", }; - const static int32_t VIDEO_EASY_MODE_VALUE[] = { - 0, 1, 2, 3, 4 + 0, // Highest Quality + 1, // Standard Quality + 2, // Basic Quality + 3, // Standard Video + 4, // HDR Video +}; +const static int32_t VIDEO_EASY_MODE_SUPPORT[] = { + MODEL_12, // Highest Quality + MODEL_12, // Standard Quality + MODEL_12, // Basic Quality + MODEL_13, // Standard Video + MODEL_13, // HDR Video }; +#pragma endregion +#pragma region Lapse Mode #define LAPSE_MODE_ID 187 #define LAPSE_MODE_SIZE 5 #define LAPSE_MODE_NAME "Lapse Mode" - +#define LAPSE_MODE_AVA MODEL_13|MODEL_12 const static char* LAPSE_MODE_STRING[] = { "TimeWarp", "Star Trails", @@ -1361,15 +1608,37 @@ const static char* LAPSE_MODE_STRING[] = { "Time Lapse Video", "Night Lapse Video", }; - const static int32_t LAPSE_MODE_VALUE[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + 0, // TimeWarp + 1, // Star Trails + 2, // Light Painting + 3, // Vehicle Lights + 4, // Max TimeWarp + 5, // Max Star Trails + 6, // Max Light Painting + 7, // Max Vehicle Lights + 8, // Time Lapse Video + 9, // Night Lapse Video +}; +const static int32_t LAPSE_MODE_SUPPORT[] = { + MODEL_13|MODEL_12, // TimeWarp + MODEL_13|MODEL_12, // Star Trails + MODEL_13|MODEL_12, // Light Painting + MODEL_13|MODEL_12, // Vehicle Lights + MODEL_12, // Max TimeWarp + MODEL_12, // Max Star Trails + MODEL_12, // Max Light Painting + MODEL_12, // Max Vehicle Lights + MODEL_13, // Time Lapse Video + MODEL_13, // Night Lapse Video }; +#pragma endregion +#pragma region Max Lens Mod #define MAX_LENS_MOD_ID 189 #define MAX_LENS_MOD_SIZE 12 #define MAX_LENS_MOD_NAME "Max Lens Mod" - +#define MAX_LENS_MOD_AVA MODEL_13|MODEL_12 const static char* MAX_LENS_MOD_STRING[] = { "None", "Max Lens 1.0", @@ -1384,70 +1653,141 @@ const static char* MAX_LENS_MOD_STRING[] = { "Standard Lens", "Auto Detect", }; - const static int32_t MAX_LENS_MOD_VALUE[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100 + 0, // None + 1, // Max Lens 1.0 + 2, // Max Lens 2.0 + 3, // Max Lens 2.5 + 4, // Macro + 5, // Anamorphic + 6, // ND 4 + 7, // ND 8 + 8, // ND 16 + 9, // ND 32 + 10, // Standard Lens + 100, // Auto Detect +}; +const static int32_t MAX_LENS_MOD_SUPPORT[] = { + MODEL_12, // None + MODEL_12, // Max Lens 1.0 + MODEL_13|MODEL_12, // Max Lens 2.0 + MODEL_13, // Max Lens 2.5 + MODEL_13, // Macro + MODEL_13, // Anamorphic + MODEL_13, // ND 4 + MODEL_13, // ND 8 + MODEL_13, // ND 16 + MODEL_13, // ND 32 + MODEL_13, // Standard Lens + MODEL_13, // Auto Detect }; +#pragma endregion +#pragma region Max Lens Mod Enable #define MAX_LENS_MOD_ENABLE_ID 190 #define MAX_LENS_MOD_ENABLE_SIZE 2 #define MAX_LENS_MOD_ENABLE_NAME "Max Lens Mod Enable" - -enum class MAX_LENS_MOD_ENABLE_ { - OFF, - ON -}; - +#define MAX_LENS_MOD_ENABLE_AVA MODEL_12 const static char* MAX_LENS_MOD_ENABLE_STRING[] = { "Off", - "On" + "On", }; - const static int32_t MAX_LENS_MOD_ENABLE_VALUE[] = { - 0, 1 + 0, // Off + 1, // On +}; +const static int32_t MAX_LENS_MOD_ENABLE_SUPPORT[] = { + MODEL_12, // Off + MODEL_12, // On }; +#pragma endregion +#pragma region Easy Night Photo #define EASY_NIGHT_PHOTO_ID 191 -#define EASY_NIGHT_PHOTO_SIZE 2 +#define EASY_NIGHT_PHOTO_SIZE 3 #define EASY_NIGHT_PHOTO_NAME "Easy Night Photo" - +#define EASY_NIGHT_PHOTO_AVA MODEL_13|MODEL_12 const static char* EASY_NIGHT_PHOTO_STRING[] = { - "Off", - "On" + "Single Photo", + "Night Photo", + "Burst", }; - const static int32_t EASY_NIGHT_PHOTO_VALUE[] = { - 0, 1 + 0, // Single Photo + 1, // Night Photo + 2, // Burst }; +const static int32_t EASY_NIGHT_PHOTO_SUPPORT[] = { + MODEL_13|MODEL_12, // Single Photo + MODEL_13|MODEL_12, // Night Photo + MODEL_13, // Burst +}; +#pragma endregion +#pragma region Multi Shot Aspect Ratio #define MULTI_SHOT_ASPECT_RATIO_ID 192 #define MULTI_SHOT_ASPECT_RATIO_SIZE 4 #define MULTI_SHOT_ASPECT_RATIO_NAME "Multi Shot Aspect Ratio" - +#define MULTI_SHOT_ASPECT_RATIO_AVA MODEL_13|MODEL_12 const static char* MULTI_SHOT_ASPECT_RATIO_STRING[] = { "4:3", "16:9", "8:7", - "9:16" + "9:16", }; - const static int32_t MULTI_SHOT_ASPECT_RATIO_VALUE[] = { - 0, 1, 3, 4 + 0, // 4:3 + 1, // 16:9 + 3, // 8:7 + 4, // 9:16 }; +const static int32_t MULTI_SHOT_ASPECT_RATIO_SUPPORT[] = { + MODEL_13|MODEL_12, // 4:3 + MODEL_13|MODEL_12, // 16:9 + MODEL_13|MODEL_12, // 8:7 + MODEL_13, // 9:16 +}; +#pragma endregion +#pragma region Framing #define FRAMING_ID 193 -#define FRAMING_SIZE 3 +#define FRAMING_SIZE 9 #define FRAMING_NAME "Framing" - -const static int32_t FRAMING_VALUE[] = { - 0, 1, 2 -}; - +#define FRAMING_AVA MODEL_13|MODEL_12 const static char* FRAMING_STRING[] = { "Widescreen", "Vertical", - "Full Frame" + "Full Frame", + "Traditional 4:3 v2", + "Widescreen 16:9 v2", + "Full Frame 8:7 v2", + "Vertical 9:16 v2", + "Ultra Widescreen 21:9 v2", + "Full Frame 1:1 v2", }; +const static int32_t FRAMING_VALUE[] = { + 0, // Widescreen + 1, // Vertical + 2, // Full Frame + 100, // Traditional 4:3 v2 + 101, // Widescreen 16:9 v2 + 103, // Full Frame 8:7 v2 + 104, // Vertical 9:16 v2 + 105, // Ultra Widescreen 21:9 v2 + 106, // Full Frame 1:1 v2 +}; +const static int32_t FRAMING_SUPPORT[] = { + MODEL_12, // Widescreen + MODEL_12, // Vertical + MODEL_12, // Full Frame + MODEL_13, // Traditional 4:3 v2 + MODEL_13, // Widescreen 16:9 v2 + MODEL_13, // Full Frame 8:7 v2 + MODEL_13, // Vertical 9:16 v2 + MODEL_13, // Ultra Widescreen 21:9 v2 + MODEL_13, // Full Frame 1:1 v2 +}; +#pragma endregion #define CAMERA_MODE_ID 194 #define CAMERA_MODE_SIZE 2 From 3fcab32fd8fef320d8c5270235d25dc8f5a49079 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 15:28:04 +0800 Subject: [PATCH 06/21] Finish 234 setting the end --- src/common/camera_setting.h | 255 ++++++++++++++++++++++++++++++++---- 1 file changed, 232 insertions(+), 23 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 5f5a821..7c5f3d4 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -1789,76 +1789,285 @@ const static int32_t FRAMING_SUPPORT[] = { }; #pragma endregion +#pragma region Camera Mode #define CAMERA_MODE_ID 194 #define CAMERA_MODE_SIZE 2 #define CAMERA_MODE_NAME "Camera Mode" - +#define CAMERA_MODE_AVA MODEL_MAX2 const static char* CAMERA_MODE_STRING[] = { "Single Lens", - "360" + "360", }; - const static int32_t CAMERA_MODE_VALUE[] = { - 0, 1 + 0, // Single Lens + 1, // 360" }; +const static int32_t CAMERA_MODE_SUPPORT[] = { + MODEL_MAX2, // Single Lens + MODEL_MAX2, // 360" +}; +#pragma endregion +#pragma region _360 Photo files extension #define _360_PHOTO_FILES_EXTENSION_ID 196 #define _360_PHOTO_FILES_EXTENSION_SIZE 2 #define _360_PHOTO_FILES_EXTENSION_NAME "360 Photo Files Extension" - +#define _360_PHOTO_FILES_EXTENSION_AVA MODEL_MAX2 const static char* _360_PHOTO_FILES_EXTENSION_STRING[] = { ".360", - ".jpg" + ".jpg", }; - const static int32_t _360_PHOTO_FILES_EXTENSION_VALUE[] = { - 0, 1 + 0, // .360 + 1, // .jpg +}; +const static int32_t _360_PHOTO_FILES_EXTENSION_SUPPORT[] = { + MODEL_MAX2, // .360 + MODEL_MAX2, // .jpg }; +#pragma endregion +#pragma region Beep Volume #define BEEP_VOLUME_ID 216 #define BEEP_VOLUME_SIZE 4 #define BEEP_VOLUME_NAME "Beep Volume" - +#define BEEP_VOLUME_AVA MODEL_MAX2|MODEL_13 const static char* BEEP_VOLUME_STRING[] = { "Off", "Low", "Medium", - "High" + "High", }; - const static int32_t BEEP_VOLUME_VALUE[] = { - 0, 1, 2, 3 + 0, // Off + 1, // Low + 2, // Medium + 3, // High }; +const static int32_t BEEP_VOLUME_SUPPORT[] = { + MODEL_MAX2|MODEL_13, // Off + MODEL_MAX2|MODEL_13, // Low + MODEL_MAX2|MODEL_13, // Medium + MODEL_MAX2|MODEL_13, // High +}; +#pragma endregion +#pragma region Setup Screen Saver #define SETUP_SCREEN_SAVER_ID 219 #define SETUP_SCREEN_SAVER_SIZE 5 #define SETUP_SCREEN_SAVER_NAME "Setup Screen Saver" - +#define SETUP_SCREEN_SAVER_AvA MODEL_MAX2|MODEL_13 const static char* SETUP_SCREEN_SAVER_STRING[] = { "Never", "1 Min", "2 Min", "3 Min", - "5 Min" + "5 Min", }; - const static int32_t SETUP_SCREEN_SAVER_VALUE[] = { - 0, 1, 2, 3, 4 + 0, // Never + 1, // 1 Min + 2, // 2 Min + 3, // 3 Min + 4, // 5 Min +}; +const static int32_t SETUP_SCREEN_SAVER_SUPPORt[] = { + MODEL_MAX2, // Never + MODEL_MAX2|MODEL_13, // 1 Min + MODEL_MAX2|MODEL_13, // 2 Min + MODEL_MAX2|MODEL_13, // 3 Min + MODEL_MAX2|MODEL_13, // 5 Min }; +#pragma endregion + +#pragma region Setup Language +#define SETUP_LANGUAGE_ID 223 +#define SETUP_LANGUAGE_SIZE 15 +#define SETUP_LANGUAGE_NAME "Setup Language" +#define SETUP_LANGUAGE_AVA MODEL_MAX2|MODEL_13 +const static char* SETUP_LANGUAGE_STRING[] = { + "English - US", + "English - UK", + "English - AUS", + "German", + "French", + "Italian", + "Spanish", + "Spanish - NA", + "Chinese", + "Japanese", + "Korean", + "Portuguese", + "Russian", + "English - IND", + "Swedish", +}; +const static int32_t SETUP_LANGUAGE_VALUE[] = { + 0, // English - US + 1, // English - UK + 2, // English - AUS + 3, // German + 4, // French + 5, // Italian + 6, // Spanish + 7, // Spanish - NA + 8, // Chinese + 9, // Japanese + 10, // Korean + 11, // Portuguese + 12, // Russian + 13, // English - IND + 14, // Swedish +}; +const static int32_t SETUP_LANGUAGE_SUPPORT[] = { + MODEL_MAX2|MODEL_13, // English - US + MODEL_MAX2|MODEL_13, // English - UK + MODEL_MAX2|MODEL_13, // English - AUS + MODEL_MAX2|MODEL_13, // German + MODEL_MAX2|MODEL_13, // French + MODEL_MAX2|MODEL_13, // Italian + MODEL_MAX2|MODEL_13, // Spanish + MODEL_MAX2|MODEL_13, // Spanish - NA + MODEL_MAX2|MODEL_13, // Chinese + MODEL_MAX2|MODEL_13, // Japanese + MODEL_MAX2|MODEL_13, // Korean + MODEL_MAX2|MODEL_13, // Portuguese + MODEL_MAX2|MODEL_13, // Russian + MODEL_MAX2|MODEL_13, // English - IND + MODEL_MAX2|MODEL_13, // Swedish +}; +#pragma endregion + +#pragma region Photo Mode +#define PHOTO_MODE_ID 227 +#define PHOTO_MODE_SIZE 3 +#define PHOTO_MODE_NAME "Photo Mode" +#define PHOTO_MODE_NAME MODEL_13 +const static char* PHOTO_MODE_STRING[] = { + "Super Photo", + "Night Photo", + "Burst", +}; +const static int32_t PHOTO_MODE_VALUE[] = { + 0, // Super Photo + 1, // Night Photo + 2, // Burst +}; +const static int32_t PHOTO_MODE_SUPPORt[] = { + MODEL_13, // Super Photo + MODEL_13, // Night Photo + MODEL_13, // Burst +}; +#pragma endregion +#pragma region Video Framing #define VIDEO_FRAMING_ID 232 -#define VIDEO_FRAMING_SIZE 3 +#define VIDEO_FRAMING_SIZE 6 #define VIDEO_FRAMING_NAME "Video Framing" - +#define VIDEO_FRAMING_NAME MODEL_13 const static char* VIDEO_FRAMING_STRING[] = { - "Widescreen", - "Vertical", - "Full Frame" + "4:3", + "16:9", + "8:7", + "9:16", + "21:9", + "1:1", }; - const static int32_t VIDEO_FRAMING_VALUE[] = { - 0, 1, 3 + 0, // 4:3 + 1, // 16:9 + 3, // 8:7 + 4, // 9:16 + 5, // 21:9 + 6, // 1:1 +}; +const static int32_t VIDEO_FRAMING_SUPPORt[] = { + MODEL_13, // 4:3 + MODEL_13, // 16:9 + MODEL_13, // 8:7 + MODEL_13, // 9:16 + MODEL_13, // 21:9 + MODEL_13, // 1:1 +}; +#pragma endregion + +#pragma region Multi Shot Framing +#define MULTISHOT_FRAMING_ID 233 +#define MULTISHOT_FRAMING_SIZE 4 +#define MULTISHOT_FRAMING_NAME "Multi Shot Framing" +#define MULTISHOT_FRAMING_NAME MODEL_13 +const static char* MULTISHOT_FRAMING_STRING[] = { + "4:3", + "16:9", + "8:7", + "9:16", +}; +const static int32_t MULTISHOT_FRAMING_VALUE[] = { + 0, // 4:3 + 1, // 16:9 + 3, // 8:7 + 4, // 9:16 +}; +const static int32_t MULTISHOT_FRAMING_SUPPORt[] = { + MODEL_13, // 4:3 + MODEL_13, // 16:9 + MODEL_13, // 8:7 + MODEL_13, // 9:16 }; +#pragma endregion + +#pragma region Frame Rate +#define FRAMERATE_ID 234 +#define FRAMERATE_SIZE 6 +#define FRAMERATE_NAME "Frame Rate" +#define FRAMERATE_NAME MODEL_MAX2|MODEL_13 +const static char* FRAMERATE_STRING[] = { + "240.0", + "120.0", + "100.0", + "90.0", + "60.0", + "50.0", + "30.0", + "25.0", + "24.0", + "200.0", + "400.0", + "360.0", + "300.0", +}; +const static int32_t FRAMERATE_VALUE[] = { + 0, // 240.0 + 1, // 120.0 + 2, // 100.0 + 3, // 90.0 + 5, // 60.0 + 6, // 50.0 + 8, // 30.0 + 9, // 25.0 + 10, // 24.0 + 13, // 200.0 + 15, // 400.0 + 16, // 360.0 + 17, // 300.0 +}; +const static int32_t FRAMERATE_SUPPORt[] = { + MODEL_13, // 240.0 + MODEL_13, // 120.0 + MODEL_MAX2|MODEL_13, // 100.0 + MODEL_MAX2, // 90.0 + MODEL_MAX2|MODEL_13, // 60.0 + MODEL_MAX2|MODEL_13, // 50.0 + MODEL_MAX2|MODEL_13, // 30.0 + MODEL_MAX2|MODEL_13, // 25.0 + MODEL_MAX2|MODEL_13, // 24.0 + MODEL_13, // 200.0 + MODEL_13, // 400.0 + MODEL_13, // 360.0 + MODEL_13, // 300.0 +}; +#pragma endregion + #define AUTOMATIC_WI_FI_ACCESS_POINT_ID 236 #define AUTOMATIC_WI_FI_ACCESS_POINT_SIZE 2 From 4fa6d6ae3774e6c601527e512b7f2474d320da5b Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 15:29:13 +0800 Subject: [PATCH 07/21] Added wifi one, max2 last one setting --- src/common/camera_setting.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 7c5f3d4..ed6106f 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -2068,19 +2068,24 @@ const static int32_t FRAMERATE_SUPPORt[] = { }; #pragma endregion - +#pragma region Automatic Wifi Access Point #define AUTOMATIC_WI_FI_ACCESS_POINT_ID 236 #define AUTOMATIC_WI_FI_ACCESS_POINT_SIZE 2 #define AUTOMATIC_WI_FI_ACCESS_POINT_NAME "Automatic Wi-Fi Access Point" - +#define AUTOMATIC_WI_FI_ACCESS_POINT_AVA MODEL_MAX2 const static char* AUTOMATIC_WI_FI_ACCESS_POINT_STRING[] = { "Off", - "On" + "On", }; - const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_VALUE[] = { - 0, 1 + 0, // Off + 1, // On }; +const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPPORT[] = { + MODEL_MAX2, // Off + MODEL_MAX2, // On +}; +#pragma endregion #define COLOR_ID 116 From eda7365e76af092ea977cf69d4e7b8d53d4de67f Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 15:33:28 +0800 Subject: [PATCH 08/21] Moving extra setting to bottom of the files --- src/common/camera_setting.h | 143 ++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index ed6106f..3fd7640 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -510,74 +510,6 @@ const static int32_t VIDEO_ASPECT_RATIO_SUPPORT[] = { }; #pragma endregion -#pragma region White Balance -#define WHITE_BALANCE_ID 115 -#define WHITE_BALANCE_SIZE 11 -#define WHITE_BALANCE_NAME "White Balance" -const static char* WHITE_BALANCE_STRING[] = { - "6500K", - "6000K", - "5500K", - "5000K", - "4500K", - "Auto", - "Native", - "4000K", - "3200K", - "2800K", - "2300K", -}; -const static int32_t WHITE_BALANCE_VALUE[] = { - 3, - 7, - 2, - 12, - 11, - 0, - 4, - 5, - 10, - 9, - , -}; -#pragma endregion - -#pragma region Sharpness -#define SHARPNESS_ID 117 -#define SHARPNESS_SIZE 3 -#define SHARPNESS_NAME "Sharpness" -#define SHARPNESS_AVA -const static char* SHARPNESS_STRING[] = { - "High", - "Midium", - "Low" -}; -const static int32_t SHARPNESS_VALUE[] = { - 0, 1, 2 -}; -#pragma endregion - -#pragma region Exposure -#define EXPOSURE_ID 118 -#define EXPOSURE_SIZE 9 -#define EXPOSURE_NAME "Exposure" -#define EXPOSURE_AVA -const static char* EXPOSURE_STRING[] = { - "-2.0", - "-1.5", - "-1.0", - "-0.5", - "0.0", - "0.5", - "1.0", - "1.5", - "2.0", -}; -const static int32_t EXPOSURE_VALUE[] = { - 8, 7, 6, 5, 4, 3, 2, 1, 0 -}; -#pragma endregion - #pragma region Video Lens #define VIDEO_LENS_ID 121 #define VIDEO_LENS_SIZE 13 @@ -2087,11 +2019,75 @@ const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPPORT[] = { }; #pragma endregion -#define COLOR_ID 116 +// Another -#define LENS_ID 121 -#define BITRATE_ID 124 +#pragma region White Balance +#define WHITE_BALANCE_ID 115 +#define WHITE_BALANCE_SIZE 11 +#define WHITE_BALANCE_NAME "White Balance" +const static char* WHITE_BALANCE_STRING[] = { + "6500K", + "6000K", + "5500K", + "5000K", + "4500K", + "Auto", + "Native", + "4000K", + "3200K", + "2800K", + "2300K", +}; +const static int32_t WHITE_BALANCE_VALUE[] = { + 3, + 7, + 2, + 12, + 11, + 0, + 4, + 5, + 10, + 9, + , +}; +#pragma endregion +#pragma region Sharpness +#define SHARPNESS_ID 117 +#define SHARPNESS_SIZE 3 +#define SHARPNESS_NAME "Sharpness" +#define SHARPNESS_AVA +const static char* SHARPNESS_STRING[] = { + "High", + "Midium", + "Low" +}; +const static int32_t SHARPNESS_VALUE[] = { + 0, 1, 2 +}; +#pragma endregion + +#pragma region Exposure +#define EXPOSURE_ID 118 +#define EXPOSURE_SIZE 9 +#define EXPOSURE_NAME "Exposure" +#define EXPOSURE_AVA +const static char* EXPOSURE_STRING[] = { + "-2.0", + "-1.5", + "-1.0", + "-0.5", + "0.0", + "0.5", + "1.0", + "1.5", + "2.0", +}; +const static int32_t EXPOSURE_VALUE[] = { + 8, 7, 6, 5, 4, 3, 2, 1, 0 +}; +#pragma endregion #pragma region ISO Min 1 #define ISO_MIN_1_ID 102 @@ -2169,4 +2165,9 @@ const static int32_t SHUTTER_SPEED_VALUE[] = { }; #pragma endregion +#define COLOR_ID 116 + +#define LENS_ID 121 +#define BITRATE_ID 124 + #endif \ No newline at end of file From f4d3ad2fcfe26da307ac97b00b32d1ea73aa3c93 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Tue, 7 Apr 2026 15:34:27 +0800 Subject: [PATCH 09/21] Added reference --- src/common/camera_setting.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 3fd7640..932fda6 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -5,6 +5,8 @@ #include #include "camera_model.h" +// Reference: https://gopro.github.io/OpenGoPro/http#schema/State + #pragma region Resolution #define VIDEO_RESOLUTION_ID 2 #define VIDEO_RESOLUTION_SIZE 27 @@ -2019,7 +2021,7 @@ const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPPORT[] = { }; #pragma endregion -// Another +// Another Reference: https://github.com/KonradIT/goprowifihack/blob/master/HERO11/HERO11-Commands.md #pragma region White Balance #define WHITE_BALANCE_ID 115 From b3b6769a4e152950d94be0eb0f156e8202a44e8c Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 10:06:26 +0800 Subject: [PATCH 10/21] Trying modify the query state in the server side, so it support hardware information query function. and combine it with normal status response json object --- src/server/GoProController.cpp | 17 +++++++++++++++-- src/server/GoProController.h | 2 ++ src/server/GoProController_Private.cpp | 8 ++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/server/GoProController.cpp b/src/server/GoProController.cpp index d7dbe8d..8948424 100644 --- a/src/server/GoProController.cpp +++ b/src/server/GoProController.cpp @@ -195,6 +195,7 @@ std::string GoProController::getAllModel(){ std::string GoProController::queryStatus(std::string target){ json arr = json::array(); json res = json::object(); + json hw = json::object(); std::string address; if(target.size() > 0){ try{ @@ -204,23 +205,35 @@ std::string GoProController::queryStatus(std::string target){ }catch(const std::exception& ex){ res = json::object(); } - json i; + try{ + std::pair result = _queryHW(target); + address = result.first; + hw = json::parse(result.second); + }catch(const std::exception& ex){ + hw = json::object(); + } + json i = json::object(); i["ip"] = address; i["status"] = res; + i["hw"] = hw; arr.push_back(i); }else{ std::lock_guard lock(ips_mutex); std::vector> results = _queryAllStatus(camera_ips); + std::vector> hresults = _queryAllHW(camera_ips); for(int32_t i = 0; i < results.size(); i++){ try{ address = results[i].first; res = json::parse(results[i].second); + hw = json::parse(hresults[i].second); }catch(const std::exception& ex){ res = json::object(); + hw = json::object(); } - json j; + json j = json::object(); j["ip"] = address; j["status"] = res; + j["hw"] = hw; arr.push_back(j); } } diff --git a/src/server/GoProController.h b/src/server/GoProController.h index 65a9a28..2f73595 100644 --- a/src/server/GoProController.h +++ b/src/server/GoProController.h @@ -91,6 +91,8 @@ class GoProController { // Status part of calls std::vector> _queryAllStatus(std::vector targets); std::pair _queryStatus(std::string target); + std::vector> _queryAllHW(std::vector targets); + std::pair _queryHW(std::string target); std::vector> _setAllSetting(std::vector targets, int32_t ID, std::string value); std::pair _setSetting(std::string target, int32_t ID, std::string value); // Webcam part of calls diff --git a/src/server/GoProController_Private.cpp b/src/server/GoProController_Private.cpp index 40a2f0a..e6c3a40 100644 --- a/src/server/GoProController_Private.cpp +++ b/src/server/GoProController_Private.cpp @@ -233,6 +233,14 @@ std::pair GoProController::_queryStatus(std::string ta return _getSingleResponse(target, "/gopro/camera/state"); } +std::vector> GoProController::_queryAllHW(std::vector targets){ + return _getAllResponse(targets, "/gopro/camera/info"); +} + +std::pair GoProController::_queryHW(std::string target){ + return _getSingleResponse(target, "/gopro/camera/info"); +} + std::vector> GoProController::_setAllSetting(std::vector targets, int32_t ID, std::string value){ std::string url = "/gopro/camera/setting?option="; url += value; From 88aa8c8f2ee4bbd38e71aee1cc4e10346ebe590b Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 10:09:13 +0800 Subject: [PATCH 11/21] Added hw json field in the master side camera data structure --- src/master/GoProMaster.cpp | 2 ++ src/master/data/camera_info.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/master/GoProMaster.cpp b/src/master/GoProMaster.cpp index e94b536..d15a4f3 100644 --- a/src/master/GoProMaster.cpp +++ b/src/master/GoProMaster.cpp @@ -531,6 +531,7 @@ void GoProMaster::processMessage(const std::string& server, const std::string& m if(found == -1){ auto cam = std::make_shared(); cam->state = ip.value()["status"]; + cam->hw = ip.value()["hw"]; cam->connected = true; _cam = *cam; cameras.push_back(cam); @@ -538,6 +539,7 @@ void GoProMaster::processMessage(const std::string& server, const std::string& m }else{ auto cam = cameras[found]; cam->state = ip.value()["status"]; + cam->hw = ip.value()["hw"]; cam->connected = cam->state["settings"]["2"].is_number_integer(); _cam = *cam; } diff --git a/src/master/data/camera_info.h b/src/master/data/camera_info.h index 972eea4..558ae38 100644 --- a/src/master/data/camera_info.h +++ b/src/master/data/camera_info.h @@ -30,4 +30,5 @@ struct CameraInfo { * The json states */ json state; + json hw; }; \ No newline at end of file From ec60f34e5ee7e3c3050ac17e84adb7f40ed260cb Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 12:07:58 +0800 Subject: [PATCH 12/21] Finish gpControl hack setting part, and apply in the camera_code.h --- src/common/camera_code.h | 800 ++++++++++++++++++++---------------- src/common/camera_setting.h | 353 +++++++++++++--- 2 files changed, 731 insertions(+), 422 deletions(-) diff --git a/src/common/camera_code.h b/src/common/camera_code.h index ec7309b..d85c913 100644 --- a/src/common/camera_code.h +++ b/src/common/camera_code.h @@ -1,12 +1,12 @@ /* - * Copyright (c) [2026] [Elly/Funique] - * - * This software is licensed under the [MIT License]. - * See the LICENSE file in the project root for more information. - * - * AUTO-GENERATED FILE - DO NOT EDIT MANUALLY - * Generated from GoPro OpenGoPro HTTP API Documentation - * Source: gopro_settings.json +* Copyright (c) [2026] [Elly/Funique] +* +* This software is licensed under the [MIT License]. +* See the LICENSE file in the project root for more information. +* +* AUTO-GENERATED FILE - DO NOT EDIT MANUALLY +* Generated from GoPro OpenGoPro HTTP API Documentation +* Source: gopro_settings.json */ #pragma once #ifndef CAMERACODE_GENERATED_H @@ -16,20 +16,14 @@ #include "camera_status.h" #include "camera_other.h" -#define GOPRO_SETTING_SIZE 56 +#define GOPRO_SETTING_SIZE 59 const static int32_t GOPRO_SETTING_IDS[] = { VIDEO_RESOLUTION_ID, FRAMES_PER_SECOND_ID, - SHUTTER_SPEED_ID, - ISO_MAX_ID, - ISO_MIN_ID, VIDEO_LENS_ID, VIDEO_ASPECT_RATIO_ID, BIT_DEPTH_ID, VIDEO_BIT_RATE_ID, - WHITE_BALANCE_ID, - SHARPNESS_ID, - EXPOSURE_ID, PHOTO_LENS_ID, PHOTO_OUTPUT_ID, VIDEO_TIMELAPSE_RATE_ID, @@ -50,7 +44,6 @@ const static int32_t GOPRO_SETTING_IDS[] = { MULTISHOT_DURATION_ID, MAX_LENS_ID, HINDSIGHT_ID, - SCHEDULED_CAPTURE_ID, PHOTO_SINGLE_INTERVAL_ID, PHOTO_SINGLE_DURATION_ID, VIDEO_PERFORMANCE_MODE_ID, @@ -73,66 +66,75 @@ const static int32_t GOPRO_SETTING_IDS[] = { BEEP_VOLUME_ID, SETUP_SCREEN_SAVER_ID, VIDEO_FRAMING_ID, - AUTOMATIC_WI_FI_ACCESS_POINT_ID + AUTOMATIC_WI_FI_ACCESS_POINT_ID, + WHITE_BALANCE_ID, + SHARPNESS_ID, + EXPOSURE_ID, + COLOR_ID, + ISO_MIN_VIDEO_ID, + ISO_MAX_VIDEO_ID, + ISO_MIN_PHOTO_ID, + ISO_MAX_PHOTO_ID, + SHUTTER_SPEED_VIDEO_ID, + SHUTTER_SPEED_PHOTO_ID, }; -const static int32_t GOPRO_SETTING_IDS[] = { - VIDEO_RESOLUTION_AVA, - FRAMES_PER_SECOND_AVA, - SHUTTER_SPEED_AVA, - ISO_MAX_AVA, - ISO_MIN_AVA, - VIDEO_LENS_AVA, - VIDEO_ASPECT_RATIO_AVA, - BIT_DEPTH_AVA, - VIDEO_BIT_RATE_AVA, - WHITE_BALANCE_AVA, - SHARPNESS_AVA, - EXPOSURE_AVA, - PHOTO_LENS_AVA, - PHOTO_OUTPUT_AVA, - VIDEO_TIMELAPSE_RATE_AVA, - PHOTO_TIMELAPSE_RATE_AVA, - NIGHTLAPSE_RATE_AVA, - WEBCAM_DIGITAL_LENSES_AVA, - AUTO_POWER_DOWN_AVA, - GPS_AVA, - LCD_BRIGHTNESS_AVA, - LED_AVA, - TIME_LAPSE_DIGITAL_LENSES_AVA, - MEDIA_FORMAT_AVA, - ANTI_FLICKER_AVA, - HYPERSMOOTH_AVA, - VIDEO_HORIZON_LEVELING_AVA, - PHOTO_HORIZON_LEVELING_AVA, - VIDEO_DURATION_AVA, - MULTISHOT_DURATION_AVA, - MAX_LENS_AVA, - HINDSIGHT_AVA, - SCHEDULED_CAPTURE_AVA, - PHOTO_SINGLE_INTERVAL_AVA, - PHOTO_SINGLE_DURATION_AVA, - VIDEO_PERFORMANCE_MODE_AVA, - CONTROL_MODE_AVA, - EASY_MODE_SPEED_AVA, - ENABLE_NIGHT_PHOTO_AVA, - WIRELESS_BAND_AVA, - STAR_TRAILS_LENGTH_AVA, - SYSTEM_VIDEO_MODE_AVA, - PROFILES_AVA, - VIDEO_EASY_MODE_AVA, - LAPSE_MODE_AVA, - MAX_LENS_MOD_AVA, - MAX_LENS_MOD_ENABLE_AVA, - EASY_NIGHT_PHOTO_AVA, - MULTI_SHOT_ASPECT_RATIO_AVA, - FRAMING_AVA, - CAMERA_MODE_AVA, - _360_PHOTO_FILES_EXTENSION_AVA, - BEEP_VOLUME_AVA, - SETUP_SCREEN_SAVER_AVA, - VIDEO_FRAMING_AVA, - AUTOMATIC_WI_FI_ACCESS_POINT_AVA, +const static int32_t GOPRO_SYSTEM_SETTING_IDS = { + CONTROL_MODE_ID, + AUTO_POWER_DOWN_ID, + GPS_ID, + LCD_BRIGHTNESS_ID, + LED_ID, + WIRELESS_BAND_ID, + PHOTO_OUTPUT_ID, + BEEP_VOLUME_ID, +}; + +const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { + VIDEO_RESOLUTION_ID, + FRAMES_PER_SECOND_ID, + VIDEO_LENS_ID, + VIDEO_ASPECT_RATIO_ID, + BIT_DEPTH_ID, + VIDEO_BIT_RATE_ID, + VIDEO_FRAMING_ID, + SYSTEM_VIDEO_MODE_ID, + VIDEO_PERFORMANCE_MODE_ID, + + PROFILES_ID, + VIDEO_EASY_MODE_ID, + + HYPERSMOOTH_ID, + BEEP_VOLUME_ID, + SETUP_SCREEN_SAVER_ID, + VIDEO_FRAMING_ID, +}; + +const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { + ISO_MIN_VIDEO_ID, + ISO_MAX_VIDEO_ID, + WHITE_BALANCE_ID, + SHARPNESS_ID, + EXPOSURE_ID, + COLOR_ID, + SHUTTER_SPEED_VIDEO_ID, +}; + +const static int32_t GOPRO_PHOTO_SETTING_IDS = { + PHOTO_LENS_ID, + PHOTO_OUTPUT_ID, + FRAMING_ID, + ENABLE_NIGHT_PHOTO_ID, +}; + +const static int32_t GOPRO_PHOTO_PROTUNE_SETTING_IDS = { + ISO_MIN_PHOTO_ID, + ISO_MAX_PHOTO_ID, + WHITE_BALANCE_ID, + SHARPNESS_ID, + EXPOSURE_ID, + COLOR_ID, + SHUTTER_SPEED_PHOTO_ID, }; #define GOPRO_STATUS_SIZE 76 @@ -217,311 +219,391 @@ const static int32_t GOPRO_STATUS_IDS[] = { // Lookup functions inline const int32_t GET_SETTING_SIZE_BY_ID(int32_t x) { switch(x) { - case 2: return VIDEO_RESOLUTION_SIZE; - case 3: return FRAMES_PER_SECOND_SIZE; - case 5: return VIDEO_TIMELAPSE_RATE_SIZE; - case 13: return ISO_SIZE; - case 30: return PHOTO_TIMELAPSE_RATE_SIZE; - case 32: return NIGHTLAPSE_RATE_SIZE; - case 43: return WEBCAM_DIGITAL_LENSES_SIZE; - case 59: return AUTO_POWER_DOWN_SIZE; - case 83: return GPS_SIZE; - case 88: return LCD_BRIGHTNESS_SIZE; - case 91: return LED_SIZE; - case 102: return ISO_SIZE; - case 108: return VIDEO_ASPECT_RATIO_SIZE; - case 115: return WHITE_BALANCE_SIZE; - case 117: return SHARPNESS_SIZE; - case 118: return EXPOSURE_SIZE; - case 121: return VIDEO_LENS_SIZE; - case 122: return PHOTO_LENS_SIZE; - case 123: return TIME_LAPSE_DIGITAL_LENSES_SIZE; - case 125: return PHOTO_OUTPUT_SIZE; - case 128: return MEDIA_FORMAT_SIZE; - case 134: return ANTI_FLICKER_SIZE; - case 135: return HYPERSMOOTH_SIZE; - case 145: return SHUTTER_SPEED_SIZE; - case 150: return VIDEO_HORIZON_LEVELING_SIZE; - case 151: return PHOTO_HORIZON_LEVELING_SIZE; - case 156: return VIDEO_DURATION_SIZE; - case 157: return MULTISHOT_DURATION_SIZE; - case 162: return MAX_LENS_SIZE; - case 167: return HINDSIGHT_SIZE; - case 168: return SCHEDULED_CAPTURE_SIZE; - case 171: return PHOTO_SINGLE_INTERVAL_SIZE; - case 172: return PHOTO_SINGLE_DURATION_SIZE; - case 173: return VIDEO_PERFORMANCE_MODE_SIZE; - case 175: return CONTROL_MODE_SIZE; - case 176: return EASY_MODE_SPEED_SIZE; - case 177: return ENABLE_NIGHT_PHOTO_SIZE; - case 178: return WIRELESS_BAND_SIZE; - case 179: return STAR_TRAILS_LENGTH_SIZE; - case 180: return SYSTEM_VIDEO_MODE_SIZE; - case 182: return VIDEO_BIT_RATE_SIZE; - case 183: return BIT_DEPTH_SIZE; - case 184: return PROFILES_SIZE; - case 186: return VIDEO_EASY_MODE_SIZE; - case 187: return LAPSE_MODE_SIZE; - case 189: return MAX_LENS_MOD_SIZE; - case 190: return MAX_LENS_MOD_ENABLE_SIZE; - case 191: return EASY_NIGHT_PHOTO_SIZE; - case 192: return MULTI_SHOT_ASPECT_RATIO_SIZE; - case 193: return FRAMING_SIZE; - case 194: return CAMERA_MODE_SIZE; - case 196: return _360_PHOTO_FILES_EXTENSION_SIZE; - case 216: return BEEP_VOLUME_SIZE; - case 219: return SETUP_SCREEN_SAVER_SIZE; - case 232: return VIDEO_FRAMING_SIZE; - case 236: return AUTOMATIC_WI_FI_ACCESS_POINT_SIZE; - default: return 0; + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_SIZE; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_SIZE; + case VIDEO_LENS_ID : return VIDEO_LENS_SIZE; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_SIZE; + case BIT_DEPTH_ID : return BIT_DEPTH_SIZE; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_SIZE; + case PHOTO_LENS_ID : return PHOTO_LENS_SIZE; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_SIZE; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_SIZE; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_SIZE; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_SIZE; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_SIZE; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_SIZE; + case GPS_ID : return GPS_SIZE; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_SIZE; + case LED_ID : return LED_SIZE; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_SIZE; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_SIZE; + case ANTI_FLICKER_ID : return ANTI_FLICKER_SIZE; + case HYPERSMOOTH_ID : return HYPERSMOOTH_SIZE; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_SIZE; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_SIZE; + case VIDEO_DURATION_ID : return VIDEO_DURATION_SIZE; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_SIZE; + case MAX_LENS_ID : return MAX_LENS_SIZE; + case HINDSIGHT_ID : return HINDSIGHT_SIZE; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_SIZE; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_SIZE; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_SIZE; + case CONTROL_MODE_ID : return CONTROL_MODE_SIZE; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_SIZE; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_SIZE; + case WIRELESS_BAND_ID : return WIRELESS_BAND_SIZE; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_SIZE; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_SIZE; + case PROFILES_ID : return PROFILES_SIZE; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_SIZE; + case LAPSE_MODE_ID : return LAPSE_MODE_SIZE; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_SIZE; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_SIZE; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_SIZE; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_SIZE; + case FRAMING_ID : return FRAMING_SIZE; + case CAMERA_MODE_ID : return CAMERA_MODE_SIZE; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_SIZE; + case BEEP_VOLUME_ID : return BEEP_VOLUME_SIZE; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_SIZE; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_SIZE; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_SIZE; + case WHITE_BALANCE_ID : return WHITE_BALANCE_SIZE; + case SHARPNESS_ID : return SHARPNESS_SIZE; + case EXPOSURE_ID : return EXPOSURE_SIZE; + case COLOR_ID : return COLOR_SIZE; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_SIZE; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_SIZE; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_SIZE; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_SIZE; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_SIZE; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_SIZE; + default : return 0; + } +} + +inline const int32_t GET_SETTING_AVA_BY_ID(int32_t x) { + switch(x) { + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_AVA; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_AVA; + case VIDEO_LENS_ID : return VIDEO_LENS_AVA; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_AVA; + case BIT_DEPTH_ID : return BIT_DEPTH_AVA; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_AVA; + case PHOTO_LENS_ID : return PHOTO_LENS_AVA; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_AVA; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_AVA; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_AVA; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_AVA; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_AVA; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_AVA; + case GPS_ID : return GPS_AVA; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_AVA; + case LED_ID : return LED_AVA; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_AVA; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_AVA; + case ANTI_FLICKER_ID : return ANTI_FLICKER_AVA; + case HYPERSMOOTH_ID : return HYPERSMOOTH_AVA; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_AVA; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_AVA; + case VIDEO_DURATION_ID : return VIDEO_DURATION_AVA; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_AVA; + case MAX_LENS_ID : return MAX_LENS_AVA; + case HINDSIGHT_ID : return HINDSIGHT_AVA; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_AVA; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_AVA; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_AVA; + case CONTROL_MODE_ID : return CONTROL_MODE_AVA; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_AVA; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_AVA; + case WIRELESS_BAND_ID : return WIRELESS_BAND_AVA; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_AVA; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_AVA; + case PROFILES_ID : return PROFILES_AVA; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_AVA; + case LAPSE_MODE_ID : return LAPSE_MODE_AVA; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_AVA; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_AVA; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_AVA; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_AVA; + case FRAMING_ID : return FRAMING_AVA; + case CAMERA_MODE_ID : return CAMERA_MODE_AVA; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_AVA; + case BEEP_VOLUME_ID : return BEEP_VOLUME_AVA; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_AVA; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_AVA; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_AVA; + case WHITE_BALANCE_ID : return WHITE_BALANCE_AVA; + case SHARPNESS_ID : return SHARPNESS_AVA; + case EXPOSURE_ID : return EXPOSURE_AVA; + case COLOR_ID : return COLOR_AVA; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_AVA; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_AVA; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_AVA; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_AVA; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_AVA; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_AVA; + default : return 0; } } inline const char* GET_SETTING_NAME_BY_ID(int32_t x) { switch(x) { - case 2: return VIDEO_RESOLUTION_NAME; - case 3: return FRAMES_PER_SECOND_NAME; - case 5: return VIDEO_TIMELAPSE_RATE_NAME; - case 13: return ISO_MIN_NAME; - case 30: return PHOTO_TIMELAPSE_RATE_NAME; - case 32: return NIGHTLAPSE_RATE_NAME; - case 43: return WEBCAM_DIGITAL_LENSES_NAME; - case 59: return AUTO_POWER_DOWN_NAME; - case 83: return GPS_NAME; - case 88: return LCD_BRIGHTNESS_NAME; - case 91: return LED_NAME; - case 102: return ISO_MAX_NAME; - case 108: return VIDEO_ASPECT_RATIO_NAME; - case 115: return WHITE_BALANCE_NAME; - case 117: return SHARPNESS_NAME; - case 118: return EXPOSURE_NAME; - case 121: return VIDEO_LENS_NAME; - case 122: return PHOTO_LENS_NAME; - case 123: return TIME_LAPSE_DIGITAL_LENSES_NAME; - case 125: return PHOTO_OUTPUT_NAME; - case 128: return MEDIA_FORMAT_NAME; - case 134: return ANTI_FLICKER_NAME; - case 135: return HYPERSMOOTH_NAME; - case 145: return SHUTTER_SPEED_NAME; - case 150: return VIDEO_HORIZON_LEVELING_NAME; - case 151: return PHOTO_HORIZON_LEVELING_NAME; - case 156: return VIDEO_DURATION_NAME; - case 157: return MULTISHOT_DURATION_NAME; - case 162: return MAX_LENS_NAME; - case 167: return HINDSIGHT_NAME; - case 168: return SCHEDULED_CAPTURE_NAME; - case 171: return PHOTO_SINGLE_INTERVAL_NAME; - case 172: return PHOTO_SINGLE_DURATION_NAME; - case 173: return VIDEO_PERFORMANCE_MODE_NAME; - case 175: return CONTROL_MODE_NAME; - case 176: return EASY_MODE_SPEED_NAME; - case 177: return ENABLE_NIGHT_PHOTO_NAME; - case 178: return WIRELESS_BAND_NAME; - case 179: return STAR_TRAILS_LENGTH_NAME; - case 180: return SYSTEM_VIDEO_MODE_NAME; - case 182: return VIDEO_BIT_RATE_NAME; - case 183: return BIT_DEPTH_NAME; - case 184: return PROFILES_NAME; - case 186: return VIDEO_EASY_MODE_NAME; - case 187: return LAPSE_MODE_NAME; - case 189: return MAX_LENS_MOD_NAME; - case 190: return MAX_LENS_MOD_ENABLE_NAME; - case 191: return EASY_NIGHT_PHOTO_NAME; - case 192: return MULTI_SHOT_ASPECT_RATIO_NAME; - case 193: return FRAMING_NAME; - case 194: return CAMERA_MODE_NAME; - case 196: return _360_PHOTO_FILES_EXTENSION_NAME; - case 216: return BEEP_VOLUME_NAME; - case 219: return SETUP_SCREEN_SAVER_NAME; - case 232: return VIDEO_FRAMING_NAME; - case 236: return AUTOMATIC_WI_FI_ACCESS_POINT_NAME; - default: return ""; + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_NAME; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_NAME; + case VIDEO_LENS_ID : return VIDEO_LENS_NAME; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_NAME; + case BIT_DEPTH_ID : return BIT_DEPTH_NAME; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_NAME; + case PHOTO_LENS_ID : return PHOTO_LENS_NAME; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_NAME; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_NAME; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_NAME; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_NAME; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_NAME; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_NAME; + case GPS_ID : return GPS_NAME; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_NAME; + case LED_ID : return LED_NAME; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_NAME; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_NAME; + case ANTI_FLICKER_ID : return ANTI_FLICKER_NAME; + case HYPERSMOOTH_ID : return HYPERSMOOTH_NAME; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_NAME; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_NAME; + case VIDEO_DURATION_ID : return VIDEO_DURATION_NAME; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_NAME; + case MAX_LENS_ID : return MAX_LENS_NAME; + case HINDSIGHT_ID : return HINDSIGHT_NAME; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_NAME; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_NAME; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_NAME; + case CONTROL_MODE_ID : return CONTROL_MODE_NAME; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_NAME; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_NAME; + case WIRELESS_BAND_ID : return WIRELESS_BAND_NAME; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_NAME; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_NAME; + case PROFILES_ID : return PROFILES_NAME; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_NAME; + case LAPSE_MODE_ID : return LAPSE_MODE_NAME; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_NAME; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_NAME; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_NAME; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_NAME; + case FRAMING_ID : return FRAMING_NAME; + case CAMERA_MODE_ID : return CAMERA_MODE_NAME; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_NAME; + case BEEP_VOLUME_ID : return BEEP_VOLUME_NAME; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_NAME; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_NAME; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_NAME; + case WHITE_BALANCE_ID : return WHITE_BALANCE_NAME; + case SHARPNESS_ID : return SHARPNESS_NAME; + case EXPOSURE_ID : return EXPOSURE_NAME; + case COLOR_ID : return COLOR_NAME; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_NAME; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_NAME; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_NAME; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_NAME; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_NAME; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_NAME; + default : return ""; } } inline const char** GET_SETTING_STRING_BY_ID(int32_t x) { switch(x) { - case 2: return VIDEO_RESOLUTION_STRING; - case 3: return FRAMES_PER_SECOND_STRING; - case 5: return VIDEO_TIMELAPSE_RATE_STRING; - case 13: return ISO_STRING; - case 30: return PHOTO_TIMELAPSE_RATE_STRING; - case 32: return NIGHTLAPSE_RATE_STRING; - case 43: return WEBCAM_DIGITAL_LENSES_STRING; - case 59: return AUTO_POWER_DOWN_STRING; - case 83: return GPS_STRING; - case 88: return LCD_BRIGHTNESS_STRING; - case 91: return LED_STRING; - case 102: return ISO_STRING; - case 108: return VIDEO_ASPECT_RATIO_STRING; - case 115: return WHITE_BALANCE_STRING; - case 117: return SHARPNESS_STRING; - case 118: return EXPOSURE_STRING; - case 121: return VIDEO_LENS_STRING; - case 122: return PHOTO_LENS_STRING; - case 123: return TIME_LAPSE_DIGITAL_LENSES_STRING; - case 125: return PHOTO_OUTPUT_STRING; - case 128: return MEDIA_FORMAT_STRING; - case 134: return ANTI_FLICKER_STRING; - case 135: return HYPERSMOOTH_STRING; - case 145: return SHUTTER_SPEED_STRING; - case 150: return VIDEO_HORIZON_LEVELING_STRING; - case 151: return PHOTO_HORIZON_LEVELING_STRING; - case 156: return VIDEO_DURATION_STRING; - case 157: return MULTISHOT_DURATION_STRING; - case 162: return MAX_LENS_STRING; - case 167: return HINDSIGHT_STRING; - case 168: return SCHEDULED_CAPTURE_STRING; - case 171: return PHOTO_SINGLE_INTERVAL_STRING; - case 172: return PHOTO_SINGLE_DURATION_STRING; - case 173: return VIDEO_PERFORMANCE_MODE_STRING; - case 175: return CONTROL_MODE_STRING; - case 176: return EASY_MODE_SPEED_STRING; - case 177: return ENABLE_NIGHT_PHOTO_STRING; - case 178: return WIRELESS_BAND_STRING; - case 179: return STAR_TRAILS_LENGTH_STRING; - case 180: return SYSTEM_VIDEO_MODE_STRING; - case 182: return VIDEO_BIT_RATE_STRING; - case 183: return BIT_DEPTH_STRING; - case 184: return PROFILES_STRING; - case 186: return VIDEO_EASY_MODE_STRING; - case 187: return LAPSE_MODE_STRING; - case 189: return MAX_LENS_MOD_STRING; - case 190: return MAX_LENS_MOD_ENABLE_STRING; - case 191: return EASY_NIGHT_PHOTO_STRING; - case 192: return MULTI_SHOT_ASPECT_RATIO_STRING; - case 193: return FRAMING_STRING; - case 194: return CAMERA_MODE_STRING; - case 196: return _360_PHOTO_FILES_EXTENSION_STRING; - case 216: return BEEP_VOLUME_STRING; - case 219: return SETUP_SCREEN_SAVER_STRING; - case 232: return VIDEO_FRAMING_STRING; - case 236: return AUTOMATIC_WI_FI_ACCESS_POINT_STRING; - default: return nullptr; + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_STRING; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_STRING; + case VIDEO_LENS_ID : return VIDEO_LENS_STRING; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_STRING; + case BIT_DEPTH_ID : return BIT_DEPTH_STRING; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_STRING; + case PHOTO_LENS_ID : return PHOTO_LENS_STRING; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_STRING; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_STRING; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_STRING; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_STRING; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_STRING; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_STRING; + case GPS_ID : return GPS_STRING; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_STRING; + case LED_ID : return LED_STRING; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_STRING; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_STRING; + case ANTI_FLICKER_ID : return ANTI_FLICKER_STRING; + case HYPERSMOOTH_ID : return HYPERSMOOTH_STRING; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_STRING; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_STRING; + case VIDEO_DURATION_ID : return VIDEO_DURATION_STRING; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_STRING; + case MAX_LENS_ID : return MAX_LENS_STRING; + case HINDSIGHT_ID : return HINDSIGHT_STRING; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_STRING; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_STRING; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_STRING; + case CONTROL_MODE_ID : return CONTROL_MODE_STRING; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_STRING; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_STRING; + case WIRELESS_BAND_ID : return WIRELESS_BAND_STRING; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_STRING; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_STRING; + case PROFILES_ID : return PROFILES_STRING; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_STRING; + case LAPSE_MODE_ID : return LAPSE_MODE_STRING; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_STRING; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_STRING; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_STRING; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_STRING; + case FRAMING_ID : return FRAMING_STRING; + case CAMERA_MODE_ID : return CAMERA_MODE_STRING; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_STRING; + case BEEP_VOLUME_ID : return BEEP_VOLUME_STRING; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_STRING; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_STRING; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_STRING; + case WHITE_BALANCE_ID : return WHITE_BALANCE_STRING; + case SHARPNESS_ID : return SHARPNESS_STRING; + case EXPOSURE_ID : return EXPOSURE_STRING; + case COLOR_ID : return COLOR_STRING; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_STRING; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_STRING; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_STRING; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_STRING; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_STRING; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_STRING; + default : return nullptr; } } inline const int32_t* GET_SETTING_VALUE_BY_ID(int32_t x) { switch(x) { - case 2: return VIDEO_RESOLUTION_VALUE; - case 3: return FRAMES_PER_SECOND_VALUE; - case 5: return VIDEO_TIMELAPSE_RATE_VALUE; - case 13: return ISO_VALUE; - case 30: return PHOTO_TIMELAPSE_RATE_VALUE; - case 32: return NIGHTLAPSE_RATE_VALUE; - case 43: return WEBCAM_DIGITAL_LENSES_VALUE; - case 59: return AUTO_POWER_DOWN_VALUE; - case 83: return GPS_VALUE; - case 88: return LCD_BRIGHTNESS_VALUE; - case 91: return LED_VALUE; - case 102: return ISO_VALUE; - case 108: return VIDEO_ASPECT_RATIO_VALUE; - case 115: return WHITE_BALANCE_VALUE; - case 117: return SHARPNESS_VALUE; - case 118: return EXPOSURE_VALUE; - case 121: return VIDEO_LENS_VALUE; - case 122: return PHOTO_LENS_VALUE; - case 123: return TIME_LAPSE_DIGITAL_LENSES_VALUE; - case 125: return PHOTO_OUTPUT_VALUE; - case 128: return MEDIA_FORMAT_VALUE; - case 134: return ANTI_FLICKER_VALUE; - case 135: return HYPERSMOOTH_VALUE; - case 145: return SHUTTER_SPEED_VALUE; - case 150: return VIDEO_HORIZON_LEVELING_VALUE; - case 151: return PHOTO_HORIZON_LEVELING_VALUE; - case 156: return VIDEO_DURATION_VALUE; - case 157: return MULTISHOT_DURATION_VALUE; - case 162: return MAX_LENS_VALUE; - case 167: return HINDSIGHT_VALUE; - case 168: return SCHEDULED_CAPTURE_VALUE; - case 171: return PHOTO_SINGLE_INTERVAL_VALUE; - case 172: return PHOTO_SINGLE_DURATION_VALUE; - case 173: return VIDEO_PERFORMANCE_MODE_VALUE; - case 175: return CONTROL_MODE_VALUE; - case 176: return EASY_MODE_SPEED_VALUE; - case 177: return ENABLE_NIGHT_PHOTO_VALUE; - case 178: return WIRELESS_BAND_VALUE; - case 179: return STAR_TRAILS_LENGTH_VALUE; - case 180: return SYSTEM_VIDEO_MODE_VALUE; - case 182: return VIDEO_BIT_RATE_VALUE; - case 183: return BIT_DEPTH_VALUE; - case 184: return PROFILES_VALUE; - case 186: return VIDEO_EASY_MODE_VALUE; - case 187: return LAPSE_MODE_VALUE; - case 189: return MAX_LENS_MOD_VALUE; - case 190: return MAX_LENS_MOD_ENABLE_VALUE; - case 191: return EASY_NIGHT_PHOTO_VALUE; - case 192: return MULTI_SHOT_ASPECT_RATIO_VALUE; - case 193: return FRAMING_VALUE; - case 194: return CAMERA_MODE_VALUE; - case 196: return _360_PHOTO_FILES_EXTENSION_VALUE; - case 216: return BEEP_VOLUME_VALUE; - case 219: return SETUP_SCREEN_SAVER_VALUE; - case 232: return VIDEO_FRAMING_VALUE; - case 236: return AUTOMATIC_WI_FI_ACCESS_POINT_VALUE; - default: return nullptr; + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_VALUE; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_VALUE; + case VIDEO_LENS_ID : return VIDEO_LENS_VALUE; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_VALUE; + case BIT_DEPTH_ID : return BIT_DEPTH_VALUE; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_VALUE; + case PHOTO_LENS_ID : return PHOTO_LENS_VALUE; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_VALUE; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_VALUE; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_VALUE; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_VALUE; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_VALUE; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_VALUE; + case GPS_ID : return GPS_VALUE; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_VALUE; + case LED_ID : return LED_VALUE; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_VALUE; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_VALUE; + case ANTI_FLICKER_ID : return ANTI_FLICKER_VALUE; + case HYPERSMOOTH_ID : return HYPERSMOOTH_VALUE; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_VALUE; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_VALUE; + case VIDEO_DURATION_ID : return VIDEO_DURATION_VALUE; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_VALUE; + case MAX_LENS_ID : return MAX_LENS_VALUE; + case HINDSIGHT_ID : return HINDSIGHT_VALUE; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_VALUE; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_VALUE; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_VALUE; + case CONTROL_MODE_ID : return CONTROL_MODE_VALUE; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_VALUE; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_VALUE; + case WIRELESS_BAND_ID : return WIRELESS_BAND_VALUE; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_VALUE; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_VALUE; + case PROFILES_ID : return PROFILES_VALUE; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_VALUE; + case LAPSE_MODE_ID : return LAPSE_MODE_VALUE; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_VALUE; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_VALUE; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_VALUE; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_VALUE; + case FRAMING_ID : return FRAMING_VALUE; + case CAMERA_MODE_ID : return CAMERA_MODE_VALUE; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_VALUE; + case BEEP_VOLUME_ID : return BEEP_VOLUME_VALUE; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_VALUE; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_VALUE; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_VALUE; + case WHITE_BALANCE_ID : return WHITE_BALANCE_VALUE; + case SHARPNESS_ID : return SHARPNESS_VALUE; + case EXPOSURE_ID : return EXPOSURE_VALUE; + case COLOR_ID : return COLOR_VALUE; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_VALUE; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_VALUE; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_VALUE; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_VALUE; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_VALUE; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_VALUE; + default : return nullptr; } } inline const int32_t* GET_SETTING_SUPPORT_BY_ID(int32_t x) { switch(x) { - case 2: return VIDEO_RESOLUTION_SUPPORT; - case 3: return FRAMES_PER_SECOND_SUPPORT; - case 5: return VIDEO_TIMELAPSE_RATE_SUPPORT; - case 13: return ISO_SUPPORT; - case 30: return PHOTO_TIMELAPSE_RATE_SUPPORT; - case 32: return NIGHTLAPSE_RATE_SUPPORT; - case 43: return WEBCAM_DIGITAL_LENSES_SUPPORT; - case 59: return AUTO_POWER_DOWN_SUPPORT; - case 83: return GPS_SUPPORT; - case 88: return LCD_BRIGHTNESS_SUPPORT; - case 91: return LED_SUPPORT; - case 102: return ISO_SUPPORT; - case 108: return VIDEO_ASPECT_RATIO_SUPPORT; - case 115: return WHITE_BALANCE_SUPPORT; - case 117: return SHARPNESS_SUPPORT; - case 118: return EXPOSURE_SUPPORT; - case 121: return VIDEO_LENS_SUPPORT; - case 122: return PHOTO_LENS_SUPPORT; - case 123: return TIME_LAPSE_DIGITAL_LENSES_SUPPORT; - case 125: return PHOTO_OUTPUT_SUPPORT; - case 128: return MEDIA_FORMAT_SUPPORT; - case 134: return ANTI_FLICKER_SUPPORT; - case 135: return HYPERSMOOTH_SUPPORT; - case 145: return SHUTTER_SPEED_SUPPORT; - case 150: return VIDEO_HORIZON_LEVELING_SUPPORT; - case 151: return PHOTO_HORIZON_LEVELING_SUPPORT; - case 156: return VIDEO_DURATION_SUPPORT; - case 157: return MULTISHOT_DURATION_SUPPORT; - case 162: return MAX_LENS_SUPPORT; - case 167: return HINDSIGHT_SUPPORT; - case 168: return SCHEDULED_CAPTURE_SUPPORT; - case 171: return PHOTO_SINGLE_INTERVAL_SUPPORT; - case 172: return PHOTO_SINGLE_DURATION_SUPPORT; - case 173: return VIDEO_PERFORMANCE_MODE_SUPPORT; - case 175: return CONTROL_MODE_SUPPORT; - case 176: return EASY_MODE_SPEED_SUPPORT; - case 177: return ENABLE_NIGHT_PHOTO_SUPPORT; - case 178: return WIRELESS_BAND_SUPPORT; - case 179: return STAR_TRAILS_LENGTH_SUPPORT; - case 180: return SYSTEM_VIDEO_MODE_SUPPORT; - case 182: return VIDEO_BIT_RATE_SUPPORT; - case 183: return BIT_DEPTH_SUPPORT; - case 184: return PROFILES_SUPPORT; - case 186: return VIDEO_EASY_MODE_SUPPORT; - case 187: return LAPSE_MODE_SUPPORT; - case 189: return MAX_LENS_MOD_SUPPORT; - case 190: return MAX_LENS_MOD_ENABLE_SUPPORT; - case 191: return EASY_NIGHT_PHOTO_SUPPORT; - case 192: return MULTI_SHOT_ASPECT_RATIO_SUPPORT; - case 193: return FRAMING_SUPPORT; - case 194: return CAMERA_MODE_SUPPORT; - case 196: return _360_PHOTO_FILES_EXTENSION_SUPPORT; - case 216: return BEEP_VOLUME_SUPPORT; - case 219: return SETUP_SCREEN_SAVER_SUPPORT; - case 232: return VIDEO_FRAMING_SUPPORT; - case 236: return AUTOMATIC_WI_FI_ACCESS_POINT_SUPPORT; - default: return nullptr; + case VIDEO_RESOLUTION_ID : return VIDEO_RESOLUTION_SUPPORT; + case FRAMES_PER_SECOND_ID : return FRAMES_PER_SECOND_SUPPORT; + case VIDEO_LENS_ID : return VIDEO_LENS_SUPPORT; + case VIDEO_ASPECT_RATIO_ID : return VIDEO_ASPECT_RATIO_SUPPORT; + case BIT_DEPTH_ID : return BIT_DEPTH_SUPPORT; + case VIDEO_BIT_RATE_ID : return VIDEO_BIT_RATE_SUPPORT; + case PHOTO_LENS_ID : return PHOTO_LENS_SUPPORT; + case PHOTO_OUTPUT_ID : return PHOTO_OUTPUT_SUPPORT; + case VIDEO_TIMELAPSE_RATE_ID : return VIDEO_TIMELAPSE_RATE_SUPPORT; + case PHOTO_TIMELAPSE_RATE_ID : return PHOTO_TIMELAPSE_RATE_SUPPORT; + case NIGHTLAPSE_RATE_ID : return NIGHTLAPSE_RATE_SUPPORT; + case WEBCAM_DIGITAL_LENSES_ID : return WEBCAM_DIGITAL_LENSES_SUPPORT; + case AUTO_POWER_DOWN_ID : return AUTO_POWER_DOWN_SUPPORT; + case GPS_ID : return GPS_SUPPORT; + case LCD_BRIGHTNESS_ID : return LCD_BRIGHTNESS_SUPPORT; + case LED_ID : return LED_SUPPORT; + case TIME_LAPSE_DIGITAL_LENSES_ID : return TIME_LAPSE_DIGITAL_LENSES_SUPPORT; + case MEDIA_FORMAT_ID : return MEDIA_FORMAT_SUPPORT; + case ANTI_FLICKER_ID : return ANTI_FLICKER_SUPPORT; + case HYPERSMOOTH_ID : return HYPERSMOOTH_SUPPORT; + case VIDEO_HORIZON_LEVELING_ID : return VIDEO_HORIZON_LEVELING_SUPPORT; + case PHOTO_HORIZON_LEVELING_ID : return PHOTO_HORIZON_LEVELING_SUPPORT; + case VIDEO_DURATION_ID : return VIDEO_DURATION_SUPPORT; + case MULTISHOT_DURATION_ID : return MULTISHOT_DURATION_SUPPORT; + case MAX_LENS_ID : return MAX_LENS_SUPPORT; + case HINDSIGHT_ID : return HINDSIGHT_SUPPORT; + case PHOTO_SINGLE_INTERVAL_ID : return PHOTO_SINGLE_INTERVAL_SUPPORT; + case PHOTO_SINGLE_DURATION_ID : return PHOTO_SINGLE_DURATION_SUPPORT; + case VIDEO_PERFORMANCE_MODE_ID : return VIDEO_PERFORMANCE_MODE_SUPPORT; + case CONTROL_MODE_ID : return CONTROL_MODE_SUPPORT; + case EASY_MODE_SPEED_ID : return EASY_MODE_SPEED_SUPPORT; + case ENABLE_NIGHT_PHOTO_ID : return ENABLE_NIGHT_PHOTO_SUPPORT; + case WIRELESS_BAND_ID : return WIRELESS_BAND_SUPPORT; + case STAR_TRAILS_LENGTH_ID : return STAR_TRAILS_LENGTH_SUPPORT; + case SYSTEM_VIDEO_MODE_ID : return SYSTEM_VIDEO_MODE_SUPPORT; + case PROFILES_ID : return PROFILES_SUPPORT; + case VIDEO_EASY_MODE_ID : return VIDEO_EASY_MODE_SUPPORT; + case LAPSE_MODE_ID : return LAPSE_MODE_SUPPORT; + case MAX_LENS_MOD_ID : return MAX_LENS_MOD_SUPPORT; + case MAX_LENS_MOD_ENABLE_ID : return MAX_LENS_MOD_ENABLE_SUPPORT; + case EASY_NIGHT_PHOTO_ID : return EASY_NIGHT_PHOTO_SUPPORT; + case MULTI_SHOT_ASPECT_RATIO_ID : return MULTI_SHOT_ASPECT_RATIO_SUPPORT; + case FRAMING_ID : return FRAMING_SUPPORT; + case CAMERA_MODE_ID : return CAMERA_MODE_SUPPORT; + case _360_PHOTO_FILES_EXTENSION_ID : return _360_PHOTO_FILES_EXTENSION_SUPPORT; + case BEEP_VOLUME_ID : return BEEP_VOLUME_SUPPORT; + case SETUP_SCREEN_SAVER_ID : return SETUP_SCREEN_SAVER_SUPPORT; + case VIDEO_FRAMING_ID : return VIDEO_FRAMING_SUPPORT; + case AUTOMATIC_WI_FI_ACCESS_POINT_ID: return AUTOMATIC_WI_FI_ACCESS_POINT_SUPPORT; + case WHITE_BALANCE_ID : return WHITE_BALANCE_SUPPORT; + case SHARPNESS_ID : return SHARPNESS_SUPPORT; + case EXPOSURE_ID : return EXPOSURE_SUPPORT; + case COLOR_ID : return COLOR_SUPPORT; + case ISO_MIN_VIDEO_ID : return ISO_MIN_VIDEO_SUPPORT; + case ISO_MAX_VIDEO_ID : return ISO_MAX_VIDEO_SUPPORT; + case ISO_MIN_PHOTO_ID : return ISO_MIN_PHOTO_SUPPORT; + case ISO_MAX_PHOTO_ID : return ISO_MAX_PHOTO_SUPPORT; + case SHUTTER_SPEED_VIDEO_ID : return SHUTTER_SPEED_VIDEO_SUPPORT; + case SHUTTER_SPEED_PHOTO_ID : return SHUTTER_SPEED_PHOTO_SUPPORT; + default : return nullptr; } } diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 932fda6..80e5fff 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -684,7 +684,7 @@ const static int32_t PHOTO_OUTPUT_SUPPORT[] = { }; #pragma endregion -#pragma region Media +#pragma region Media Format #define MEDIA_FORMAT_ID 128 #define MEDIA_FORMAT_SIZE 4 #define MEDIA_FORMAT_NAME "Media Format" @@ -2027,31 +2027,45 @@ const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPPORT[] = { #define WHITE_BALANCE_ID 115 #define WHITE_BALANCE_SIZE 11 #define WHITE_BALANCE_NAME "White Balance" +#define WHITE_BALANCE_AVA MODEL_MAX2_ALL const static char* WHITE_BALANCE_STRING[] = { - "6500K", - "6000K", - "5500K", - "5000K", - "4500K", "Auto", + "5500K", + "6500K", "Native", "4000K", - "3200K", - "2800K", + "6000K", "2300K", + "2800K", + "3200K", + "4500K", + "5000K", }; const static int32_t WHITE_BALANCE_VALUE[] = { - 3, - 7, - 2, - 12, - 11, - 0, - 4, - 5, - 10, - 9, - , + 0, // Auto + 2, // 5500K + 3, // 6500K + 4, // Native + 5, // 4000K + 7, // 6000K + 8, // 2300K + 9, // 2800K + 10, // 3200K + 11, // 4500K + 12, // 5000K +}; +const static int32_t WHITE_BALANCE_SUPPORT[] = { + MODEL_MAX2_ALL, // Auto + MODEL_MAX2_ALL, // 5500K + MODEL_MAX2_ALL, // 6500K + MODEL_MAX2_ALL, // Native + MODEL_MAX2_ALL, // 4000K + MODEL_MAX2_ALL, // 6000K + MODEL_MAX2_ALL, // 2300K + MODEL_MAX2_ALL, // 2800K + MODEL_MAX2_ALL, // 3200K + MODEL_MAX2_ALL, // 4500K + MODEL_MAX2_ALL, // 5000K }; #pragma endregion @@ -2059,22 +2073,29 @@ const static int32_t WHITE_BALANCE_VALUE[] = { #define SHARPNESS_ID 117 #define SHARPNESS_SIZE 3 #define SHARPNESS_NAME "Sharpness" -#define SHARPNESS_AVA +#define SHARPNESS_AVA MODEL_MAX2_ALL const static char* SHARPNESS_STRING[] = { "High", "Midium", "Low" }; const static int32_t SHARPNESS_VALUE[] = { - 0, 1, 2 + 0, // High + 1, // Midium + 2, // Lo +}; +const static int32_t SHARPNESS_SUPPORT[] = { + MODEL_MAX2_ALL, // High + MODEL_MAX2_ALL, // Midium + MODEL_MAX2_ALL, // Lo }; #pragma endregion #pragma region Exposure #define EXPOSURE_ID 118 #define EXPOSURE_SIZE 9 -#define EXPOSURE_NAME "Exposure" -#define EXPOSURE_AVA +#define EXPOSURE_NAME "EV Comp" +#define EXPOSURE_AVA MODEL_MAX2_ALL const static char* EXPOSURE_STRING[] = { "-2.0", "-1.5", @@ -2087,56 +2108,193 @@ const static char* EXPOSURE_STRING[] = { "2.0", }; const static int32_t EXPOSURE_VALUE[] = { - 8, 7, 6, 5, 4, 3, 2, 1, 0 + 8, // -2.0 + 7, // -1.5 + 6, // -1.0 + 5, // -0.5 + 4, // 0.0 + 3, // 0.5 + 2, // 1.0 + 1, // 1.5 + 0, // 2.0 +}; +const static int32_t EXPOSURE_SUPPORT[] = { + 8, // -2.0 + 7, // -1.5 + 6, // -1.0 + 5, // -0.5 + 4, // 0.0 + 3, // 0.5 + 2, // 1.0 + 1, // 1.5 + 0, // 2.0 }; #pragma endregion -#pragma region ISO Min 1 -#define ISO_MIN_1_ID 102 -#define ISO_MIN_1_SIZE 8 -#define ISO_MIN_1_NAME "ISO Minimum" -#define ISO_MIN_1_AVA MODEL_MAX2_ALL -const static char* ISO_MIN_1_STRING[] = { - "Auto", +#pragma region Color +#define COLOR_ID 116 +#define COLOR_SIZE 3 +#define COLOR_NAME "EV Comp" +#define COLOR_AVA MODEL_MAX2_ALL +const static char* COLOR_STRING[] = { + "Vibrant", + "Natural", + "Flat", +}; +const static int32_t COLOR_VALUE[] = { + 100, // Vibrant + 2, // Natural + 1, // Flat +}; +const static int32_t COLOR_SUPPORT[] = { + MODEL_MAX2_ALL, // Vibrant + MODEL_MAX2_ALL, // Natural + MODEL_MAX2_ALL, // Flat +}; +#pragma endregion + +#pragma region ISO Min Video +#define ISO_MIN_VIDEO_ID 102 +#define ISO_MIN_VIDEO_SIZE 8 +#define ISO_MIN_VIDEO_NAME "ISO Minimum" +#define ISO_MIN_VIDEO_AVA MODEL_MAX2_ALL +const static char* ISO_MIN_VIDEO_STRING[] = { "6400", - "3200", "1600", - "800", "400", + "3200", + "800", "200", "100", + "Auto", }; -const static int32_t ISO_VALUE[] = { - 9, 0, 3, 1, 4, 2, 7, 8 +const static int32_t ISO_MIN_VIDEO_VALUE[] = { + 0, // 6400 + 1, // 1600 + 2, // 400 + 3, // 3200 + 4, // 800 + 7, // 200 + 8, // 100 + 9, // Auto +}; +const static int32_t ISO_MIN_VIDEO_SUPPORT[] = { + MODEL_MAX2_ALL, // 6400 + MODEL_MAX2_ALL, // 1600 + MODEL_MAX2_ALL, // 400 + MODEL_MAX2_ALL, // 3200 + MODEL_MAX2_ALL, // 800 + MODEL_MAX2_ALL, // 200 + MODEL_MAX2_ALL, // 100 + MODEL_MAX2_ALL, // Auto }; #pragma endregion -#pragma region ISO Max 1 -#define ISO_MAX_1_ID 13 -#pragma endregion - -#pragma region ISO Min 2 -#define ISO_MIN_2_ID 75 -#pragma endregion - -#pragma region ISO Max 2 -#define ISO_MAX_2_ID 37 +#pragma region ISO Max Video +#define ISO_MAX_VIDEO_ID 13 +#define ISO_MAX_VIDEO_SIZE 8 +#define ISO_MAX_VIDEO_NAME "ISO Maximum" +#define ISO_MAX_VIDEO_AVA MODEL_MAX2_ALL +const static char* ISO_MAX_VIDEO_STRING[] = { + "6400", + "1600", + "400", + "3200", + "800", + "200", + "100", + "Auto", +}; +const static int32_t ISO_MAX_VIDEO_VALUE[] = { + 0, // 6400 + 1, // 1600 + 2, // 400 + 3, // 3200 + 4, // 800 + 7, // 200 + 8, // 100 + 9, // Auto +}; +const static int32_t ISO_MAX_VIDEO_SUPPORT[] = { + MODEL_MAX2_ALL, // 6400 + MODEL_MAX2_ALL, // 1600 + MODEL_MAX2_ALL, // 400 + MODEL_MAX2_ALL, // 3200 + MODEL_MAX2_ALL, // 800 + MODEL_MAX2_ALL, // 200 + MODEL_MAX2_ALL, // 100 + MODEL_MAX2_ALL, // Auto +}; #pragma endregion -#pragma region ISO Min 3 -#define ISO_MIN_3_ID 76 +#pragma region ISO Min Photo +#define ISO_MIN_PHOTO_ID 75 +#define ISO_MIN_PHOTO_SIZE 8 +#define ISO_MIN_PHOTO_NAME "ISO Minimum" +#define ISO_MIN_PHOTO_AVA MODEL_MAX2_ALL +const static char* ISO_MIN_PHOTO_STRING[] = { + "800", + "400", + "200", + "100", + "1600", + "3200", +}; +const static int32_t ISO_MIN_PHOTO_VALUE[] = { + 0, // 800 + 1, // 400 + 2, // 200 + 3, // 100 + 4, // 1600 + 5, // 3200 +}; +const static int32_t ISO_MIN_PHOTO_SUPPORT[] = { + MODEL_MAX2_ALL, // 800 + MODEL_MAX2_ALL, // 400 + MODEL_MAX2_ALL, // 200 + MODEL_MAX2_ALL, // 100 + MODEL_MAX2_ALL, // 1600 + MODEL_MAX2_ALL, // 3200 +}; #pragma endregion -#pragma region ISO Max 3 -#define ISO_MAX_3_ID 24 +#pragma region ISO Max Photo +#define ISO_MAX_PHOTO_ID 24 +#define ISO_MAX_PHOTO_SIZE 8 +#define ISO_MAX_PHOTO_NAME "ISO Maximum" +#define ISO_MAX_PHOTO_AVA MODEL_MAX2_ALL +const static char* ISO_MAX_PHOTO_STRING[] = { + "800", + "400", + "200", + "100", + "1600", + "3200", +}; +const static int32_t ISO_MAX_PHOTO_VALUE[] = { + 0, // 800 + 1, // 400 + 2, // 200 + 3, // 100 + 4, // 1600 + 5, // 3200 +}; +const static int32_t ISO_MAX_PHOTO_VALUE[] = { + MODEL_MAX2_ALL, // 800 + MODEL_MAX2_ALL, // 400 + MODEL_MAX2_ALL, // 200 + MODEL_MAX2_ALL, // 100 + MODEL_MAX2_ALL, // 1600 + MODEL_MAX2_ALL, // 3200 +}; #pragma endregion -#pragma region Shutter Speed -#define SHUTTER_SPEED_ID 145 -#define SHUTTER_SPEED_SIZE 22 -#define SHUTTER_SPEED_NAME "Shutter Speed" - -const static char* SHUTTER_SPEED_STRING[] = { +#pragma region Shutter Speed Video +#define SHUTTER_SPEED_VIDEO_ID 145 +#define SHUTTER_SPEED_VIDEO_SIZE 22 +#define SHUTTER_SPEED_VIDEO_NAME "Shutter Speed" +#define SHUTTER_SPEED_VIDEO_AVA MODEL_MAX2_ALL +const static char* SHUTTER_SPEED_VIDEO_STRING[] = { "Auto", "1/24", "1/25", @@ -2160,16 +2318,85 @@ const static char* SHUTTER_SPEED_STRING[] = { "1/3200", "1/3840", }; - -const static int32_t SHUTTER_SPEED_VALUE[] = { - 0, 3, 4, 5, 6, 7, 8, 11, 12, 13, 16, 17, 18, 25, 21, 22, 28, - 23, 29, 24, 30, 31 +const static int32_t SHUTTER_SPEED_VIDEO_VALUE[] = { + 0, // Auto + 3, // 1/24 + 4, // 1/25 + 5, // 1/30 + 6, // 1/48 + 7, // 1/50 + 8, // 1/60 + 11, // 1/96 + 12, // 1/100 + 13, // 1/120 + 16, // 1/192 + 17, // 1/200 + 18, // 1/240 + 25, // 1/384 + 21, // 1/400 + 22, // 1/480 + 28, // 1/800 + 23, // 1/900 + 29, // 1/1600 + 24, // 1/1920 + 30, // 1/3200 + 31, // 1/3840 +}; +const static int32_t SHUTTER_SPEED_VIDEO_SUPPORt[] = { + MODEL_MAX2_ALL, // Auto + MODEL_MAX2_ALL, // 1/24 + MODEL_MAX2_ALL, // 1/25 + MODEL_MAX2_ALL, // 1/30 + MODEL_MAX2_ALL, // 1/48 + MODEL_MAX2_ALL, // 1/50 + MODEL_MAX2_ALL, // 1/60 + MODEL_MAX2_ALL, // 1/96 + MODEL_MAX2_ALL, // 1/100 + MODEL_MAX2_ALL, // 1/120 + MODEL_MAX2_ALL, // 1/192 + MODEL_MAX2_ALL, // 1/200 + MODEL_MAX2_ALL, // 1/240 + MODEL_MAX2_ALL, // 1/384 + MODEL_MAX2_ALL, // 1/400 + MODEL_MAX2_ALL, // 1/480 + MODEL_MAX2_ALL, // 1/800 + MODEL_MAX2_ALL, // 1/900 + MODEL_MAX2_ALL, // 1/1600 + MODEL_MAX2_ALL, // 1/1920 + MODEL_MAX2_ALL, // 1/3200 + MODEL_MAX2_ALL, // 1/3840 }; #pragma endregion -#define COLOR_ID 116 - -#define LENS_ID 121 -#define BITRATE_ID 124 +#pragma region Shutter Speed Photo +#define SHUTTER_SPEED_PHOTO_ID 146 +#define SHUTTER_SPEED_PHOTO_SIZE 6 +#define SHUTTER_SPEED_PHOTO_NAME "Shutter Speed" +#define SHUTTER_SPEED_PHOTO_AVA MODEL_MAX2_ALL +const static char* SHUTTER_SPEED_PHOTO_STRING[] = { + "Auto", + "1/125", + "1/250", + "1/500", + "1/1000", + "1/2000", +}; +const static int32_t SHUTTER_SPEED_PHOTO_VALUE[] = { + 0, // Auto + 1, // 1/125 + 2, // 1/250 + 3, // 1/500 + 4, // 1/1000 + 5, // 1/2000 +}; +const static int32_t SHUTTER_SPEED_PHOTO_SUPPORT[] = { + MODEL_MAX2_ALL, // Auto + MODEL_MAX2_ALL, // 1/125 + MODEL_MAX2_ALL, // 1/250 + MODEL_MAX2_ALL, // 1/500 + MODEL_MAX2_ALL, // 1/1000 + MODEL_MAX2_ALL, // 1/2000 +}; +#pragma endregion #endif \ No newline at end of file From 9e4dfeef918302f9749b8f7f0bf98031d60174e8 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 13:39:22 +0800 Subject: [PATCH 13/21] Fix typo --- src/common/camera_setting.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 80e5fff..532c2d6 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -840,7 +840,7 @@ const static int32_t VIDEO_DURATION_VALUE[] = { 10,// 5 Sec 100, // No Limit }; -const static int32_t VIDEO_DURATION_VALUE[] = { +const static int32_t VIDEO_DURATION_SUPPORT[] = { MODEL_MAX2_ALL&(~MODEL_11), // 15 Sec MODEL_MAX2_ALL&(~MODEL_11), // 30 Sec MODEL_MAX2_ALL&(~MODEL_11), // 1 Min @@ -1073,7 +1073,7 @@ const static int32_t CONTROL_MODE_SUPPORT[] = { #define EASY_MODE_SPEED_ID 176 #define EASY_MODE_SPEED_SIZE 88 #define EASY_MODE_SPEED_NAME "Easy Mode Speed" -#define EASY_MODE_SPEED_NAME MODEL_13|MODEL_12|MODEL_11_BLACK +#define EASY_MODE_SPEED_AVA MODEL_13|MODEL_12|MODEL_11_BLACK const static char* EASY_MODE_SPEED_STRING[] = { "8X Ultra Slo-Mo", "4X Super Slo-Mo", @@ -1790,7 +1790,7 @@ const static int32_t BEEP_VOLUME_SUPPORT[] = { #define SETUP_SCREEN_SAVER_ID 219 #define SETUP_SCREEN_SAVER_SIZE 5 #define SETUP_SCREEN_SAVER_NAME "Setup Screen Saver" -#define SETUP_SCREEN_SAVER_AvA MODEL_MAX2|MODEL_13 +#define SETUP_SCREEN_SAVER_AVA MODEL_MAX2|MODEL_13 const static char* SETUP_SCREEN_SAVER_STRING[] = { "Never", "1 Min", @@ -1805,7 +1805,7 @@ const static int32_t SETUP_SCREEN_SAVER_VALUE[] = { 3, // 3 Min 4, // 5 Min }; -const static int32_t SETUP_SCREEN_SAVER_SUPPORt[] = { +const static int32_t SETUP_SCREEN_SAVER_SUPPORT[] = { MODEL_MAX2, // Never MODEL_MAX2|MODEL_13, // 1 Min MODEL_MAX2|MODEL_13, // 2 Min @@ -1887,7 +1887,7 @@ const static int32_t PHOTO_MODE_VALUE[] = { 1, // Night Photo 2, // Burst }; -const static int32_t PHOTO_MODE_SUPPORt[] = { +const static int32_t PHOTO_MODE_SUPPORT[] = { MODEL_13, // Super Photo MODEL_13, // Night Photo MODEL_13, // Burst @@ -1898,7 +1898,7 @@ const static int32_t PHOTO_MODE_SUPPORt[] = { #define VIDEO_FRAMING_ID 232 #define VIDEO_FRAMING_SIZE 6 #define VIDEO_FRAMING_NAME "Video Framing" -#define VIDEO_FRAMING_NAME MODEL_13 +#define VIDEO_FRAMING_AVA MODEL_13 const static char* VIDEO_FRAMING_STRING[] = { "4:3", "16:9", @@ -1915,7 +1915,7 @@ const static int32_t VIDEO_FRAMING_VALUE[] = { 5, // 21:9 6, // 1:1 }; -const static int32_t VIDEO_FRAMING_SUPPORt[] = { +const static int32_t VIDEO_FRAMING_SUPPORT[] = { MODEL_13, // 4:3 MODEL_13, // 16:9 MODEL_13, // 8:7 @@ -1942,7 +1942,7 @@ const static int32_t MULTISHOT_FRAMING_VALUE[] = { 3, // 8:7 4, // 9:16 }; -const static int32_t MULTISHOT_FRAMING_SUPPORt[] = { +const static int32_t MULTISHOT_FRAMING_SUPPORT[] = { MODEL_13, // 4:3 MODEL_13, // 16:9 MODEL_13, // 8:7 @@ -1985,7 +1985,7 @@ const static int32_t FRAMERATE_VALUE[] = { 16, // 360.0 17, // 300.0 }; -const static int32_t FRAMERATE_SUPPORt[] = { +const static int32_t FRAMERATE_SUPPORT[] = { MODEL_13, // 240.0 MODEL_13, // 120.0 MODEL_MAX2|MODEL_13, // 100.0 @@ -2015,7 +2015,7 @@ const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_VALUE[] = { 0, // Off 1, // On }; -const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPPORT[] = { +const static int32_t AUTOMATIC_WI_FI_ACCESS_POINT_SUPPORT[] = { MODEL_MAX2, // Off MODEL_MAX2, // On }; @@ -2279,7 +2279,7 @@ const static int32_t ISO_MAX_PHOTO_VALUE[] = { 4, // 1600 5, // 3200 }; -const static int32_t ISO_MAX_PHOTO_VALUE[] = { +const static int32_t ISO_MAX_PHOTO_SUPPORT[] = { MODEL_MAX2_ALL, // 800 MODEL_MAX2_ALL, // 400 MODEL_MAX2_ALL, // 200 @@ -2342,7 +2342,7 @@ const static int32_t SHUTTER_SPEED_VIDEO_VALUE[] = { 30, // 1/3200 31, // 1/3840 }; -const static int32_t SHUTTER_SPEED_VIDEO_SUPPORt[] = { +const static int32_t SHUTTER_SPEED_VIDEO_SUPPORT[] = { MODEL_MAX2_ALL, // Auto MODEL_MAX2_ALL, // 1/24 MODEL_MAX2_ALL, // 1/25 From 1dfa55563b96cc21980ba14b79ad357429bac491 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 13:54:06 +0800 Subject: [PATCH 14/21] Fixed build error, and some typo. --- src/common/camera_code.h | 19 ++++++++++++------- src/common/camera_setting.h | 8 ++++---- src/master/windows/camera_list.cpp | 22 +++++++++++++++++++--- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/common/camera_code.h b/src/common/camera_code.h index d85c913..a5bf88d 100644 --- a/src/common/camera_code.h +++ b/src/common/camera_code.h @@ -16,7 +16,6 @@ #include "camera_status.h" #include "camera_other.h" -#define GOPRO_SETTING_SIZE 59 const static int32_t GOPRO_SETTING_IDS[] = { VIDEO_RESOLUTION_ID, FRAMES_PER_SECOND_ID, @@ -78,8 +77,9 @@ const static int32_t GOPRO_SETTING_IDS[] = { SHUTTER_SPEED_VIDEO_ID, SHUTTER_SPEED_PHOTO_ID, }; +#define GOPRO_SETTING_SIZE sizeof(GOPRO_SETTING_IDS)/sizeof(int32_t) -const static int32_t GOPRO_SYSTEM_SETTING_IDS = { +const static int32_t GOPRO_SYSTEM_SETTING_IDS[] = { CONTROL_MODE_ID, AUTO_POWER_DOWN_ID, GPS_ID, @@ -89,8 +89,9 @@ const static int32_t GOPRO_SYSTEM_SETTING_IDS = { PHOTO_OUTPUT_ID, BEEP_VOLUME_ID, }; +#define GOPRO_SYSTEM_SETTING_SIZE sizeof(GOPRO_SYSTEM_SETTING_IDS)/sizeof(int32_t) -const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { +const static int32_t GOPRO_VIDEO_SETTING_IDS[] = { VIDEO_RESOLUTION_ID, FRAMES_PER_SECOND_ID, VIDEO_LENS_ID, @@ -109,8 +110,9 @@ const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { SETUP_SCREEN_SAVER_ID, VIDEO_FRAMING_ID, }; +#define GOPRO_VIDEO_SETTING_SIZE sizeof(GOPRO_VIDEO_SETTING_IDS)/sizeof(int32_t) -const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { +const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS[] = { ISO_MIN_VIDEO_ID, ISO_MAX_VIDEO_ID, WHITE_BALANCE_ID, @@ -119,15 +121,17 @@ const static int32_t GOPRO_VIDEO_PROTUNE_SETTING_IDS = { COLOR_ID, SHUTTER_SPEED_VIDEO_ID, }; +#define GOPRO_VIDEO_PROTUNE_SETTING_SIZE sizeof(GOPRO_VIDEO_PROTUNE_SETTING_IDS)/sizeof(int32_t) -const static int32_t GOPRO_PHOTO_SETTING_IDS = { +const static int32_t GOPRO_PHOTO_SETTING_IDS[] = { PHOTO_LENS_ID, PHOTO_OUTPUT_ID, FRAMING_ID, ENABLE_NIGHT_PHOTO_ID, }; +#define GOPRO_PHOTO_SETTING_SIZE sizeof(GOPRO_PHOTO_SETTING_IDS)/sizeof(int32_t) -const static int32_t GOPRO_PHOTO_PROTUNE_SETTING_IDS = { +const static int32_t GOPRO_PHOTO_PROTUNE_SETTING_IDS[] = { ISO_MIN_PHOTO_ID, ISO_MAX_PHOTO_ID, WHITE_BALANCE_ID, @@ -136,8 +140,8 @@ const static int32_t GOPRO_PHOTO_PROTUNE_SETTING_IDS = { COLOR_ID, SHUTTER_SPEED_PHOTO_ID, }; +#define GOPRO_PHOTO_PROTUNE_SETTING_SIZE sizeof(GOPRO_PHOTO_PROTUNE_SETTING_IDS)/sizeof(int32_t) -#define GOPRO_STATUS_SIZE 76 const static int32_t GOPRO_STATUS_IDS[] = { BATTERY_PRESENT_ID, INTERNAL_BATTERY_BARS_ID, @@ -215,6 +219,7 @@ const static int32_t GOPRO_STATUS_IDS[] = { USE_CONTROLLED_ID, SD_CARD_CAPACITY_ID }; +#define GOPRO_STATUS_SIZE sizeof(GOPRO_STATUS_IDS)/sizeof(int32_t) // Lookup functions inline const int32_t GET_SETTING_SIZE_BY_ID(int32_t x) { diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 532c2d6..85849d2 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -98,7 +98,7 @@ const static int32_t VIDEO_RESOLUTION_SUPPORT[] = { MODEL_13|MODEL_12, // 2.7K 4:3 V2 MODEL_13|MODEL_12, // 4K 4:3 V2 MODEL_13 // 5.3K 4:3 V -} +}; const static int32_t VIDEO_RESOLUTION_RES[][2] = { {3840, 2160}, {2704, 1520}, @@ -1876,7 +1876,7 @@ const static int32_t SETUP_LANGUAGE_SUPPORT[] = { #define PHOTO_MODE_ID 227 #define PHOTO_MODE_SIZE 3 #define PHOTO_MODE_NAME "Photo Mode" -#define PHOTO_MODE_NAME MODEL_13 +#define PHOTO_MODE_AVA MODEL_13 const static char* PHOTO_MODE_STRING[] = { "Super Photo", "Night Photo", @@ -1929,7 +1929,7 @@ const static int32_t VIDEO_FRAMING_SUPPORT[] = { #define MULTISHOT_FRAMING_ID 233 #define MULTISHOT_FRAMING_SIZE 4 #define MULTISHOT_FRAMING_NAME "Multi Shot Framing" -#define MULTISHOT_FRAMING_NAME MODEL_13 +#define MULTISHOT_FRAMING_AVA MODEL_13 const static char* MULTISHOT_FRAMING_STRING[] = { "4:3", "16:9", @@ -1954,7 +1954,7 @@ const static int32_t MULTISHOT_FRAMING_SUPPORT[] = { #define FRAMERATE_ID 234 #define FRAMERATE_SIZE 6 #define FRAMERATE_NAME "Frame Rate" -#define FRAMERATE_NAME MODEL_MAX2|MODEL_13 +#define FRAMERATE_AVA MODEL_MAX2|MODEL_13 const static char* FRAMERATE_STRING[] = { "240.0", "120.0", diff --git a/src/master/windows/camera_list.cpp b/src/master/windows/camera_list.cpp index 598873c..cb00e8b 100644 --- a/src/master/windows/camera_list.cpp +++ b/src/master/windows/camera_list.cpp @@ -191,6 +191,7 @@ void CameraListWindow::draw_line(const std::shared_ptr& c){ void CameraListWindow::draw_group(const std::shared_ptr& c){ json status = json::object(); json setting = json::object(); + int preset = 0; master->getStatusFromCamera(*c, status); master->getSettingsFromCamera(*c, setting); @@ -214,6 +215,12 @@ void CameraListWindow::draw_group(const std::shared_ptr& c){ uint32_t col_orange_dark = IM_COL32(80, 80, 10, 255); uint32_t col_greed = IM_COL32(10, 230, 10, 255); + { + if(status[std::to_string(PRESET_ID)].is_number_integer()){ + preset = status[std::to_string(PRESET_ID)].get(); + } + } + // Drawing outline { uint32_t col = col_red; @@ -355,16 +362,25 @@ void CameraListWindow::draw_group(const std::shared_ptr& c){ ); draw_list->AddText(camera_title_min, col_white, camera_title.c_str()); if(c->connected) { + int32_t SHUTTER_SPEED_ID = SHUTTER_SPEED_PHOTO_ID; + int32_t ISO_MIN_ID = ISO_MIN_PHOTO_ID; + int32_t ISO_MAX_ID = ISO_MAX_PHOTO_ID; + if(preset == 0){ + SHUTTER_SPEED_ID = SHUTTER_SPEED_VIDEO_ID; + ISO_MIN_ID = ISO_MIN_VIDEO_ID; + ISO_MAX_ID = ISO_MAX_VIDEO_ID; + } + if(setting[std::to_string(SHUTTER_SPEED_ID)].is_number_integer()){ int32_t re = setting[std::to_string(SHUTTER_SPEED_ID)].get(); - shutter_speed = SHUTTER_SPEED_STRING[re]; + shutter_speed = SHUTTER_SPEED_VIDEO_STRING[re]; shutter_speed = "S: " + shutter_speed; } if(setting[std::to_string(ISO_MIN_ID)].is_number() && setting[std::to_string(ISO_MAX_ID)].is_number()){ int32_t iso_min = setting[std::to_string(ISO_MIN_ID)].get(); int32_t iso_max = setting[std::to_string(ISO_MAX_ID)].get(); - std::string iso_min_text = ISO_STRING[iso_min]; - std::string iso_max_text = ISO_STRING[iso_max]; + std::string iso_min_text = ISO_MIN_VIDEO_STRING[iso_min]; + std::string iso_max_text = ISO_MAX_VIDEO_STRING[iso_max]; iso_setting = "I: " + iso_min_text + " " + iso_max_text; } if(setting[std::to_string(WHITE_BALANCE_ID)].is_number()){ From 58367684407a88650728511d8c87bfd5dd87dad4 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 14:10:02 +0800 Subject: [PATCH 15/21] Update setting ui --- src/master/windows/inspector.cpp | 67 +++++++++++++++++++++++--------- src/master/windows/inspector.h | 5 +++ 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index fc9595c..6af336e 100644 --- a/src/master/windows/inspector.cpp +++ b/src/master/windows/inspector.cpp @@ -105,32 +105,39 @@ void InspectorWindow::render(){ int32_t camera_ip = master->findCamera(state->current_camera_item); bool should_disabled = state->current_camera_item.size() < 10 || camera_ip == -1 || !state->current_setting_items_bind; - ImGui::InputText("Camera Name", &state->current_camera_name); - if(ImGui::Button("Rename Camera")){ - master->command_with_value("rename", state->current_camera_item, state->current_camera_name); - } - ImGui::Text("Name: %s, IP: %s", state->current_camera_name.c_str(), state->current_camera_item.c_str()); - + draw_header(); ImGui::BeginDisabled(should_disabled); - if(ImGui::Button("Reset Setting Order")){ - reset_setting_order(); - state->update_server(); - } - ImGui::SameLine(); - if(ImGui::Button("Reset Status Order")){ - reset_status_order(); - state->update_server(); - } - ImGui::Separator(); - if(ImGui::BeginTabBar("Inspector_Bar")){ + if(ImGui::BeginTabBar("Inspector_Bar##Top")){ if(ImGui::BeginTabItem("Setting##Inspector_Bar_Item")){ - draw_setting(); + if(ImGui::Button("Reset Setting Order")){ + reset_setting_order(); + state->update_server(); + } + if(ImGui::BeginTabBar("Inspector_Bar##Second")){ + if(ImGui::BeginTabItem("System##Inspector_Bar_Item")){ + draw_system(); + ImGui::EndTabItem(); + } + if(ImGui::BeginTabItem("Setting##Inspector_Bar_Item")){ + draw_setting(); + ImGui::EndTabItem(); + } + if(ImGui::BeginTabItem("Protune##Inspector_Bar_Item")){ + draw_protune(); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } ImGui::EndTabItem(); } if(ImGui::BeginTabItem("Status##Inspector_Bar_Item")){ + if(ImGui::Button("Reset Status Order")){ + reset_status_order(); + state->update_server(); + } draw_status(); ImGui::EndTabItem(); } @@ -146,6 +153,18 @@ void InspectorWindow::render(){ ImGui::End(); } +void InspectorWindow::draw_header(){ + ImGui::InputText("Camera Name", &state->current_camera_name); + if(ImGui::Button("Rename Camera")){ + master->command_with_value("rename", state->current_camera_item, state->current_camera_name); + } + ImGui::Text("Name: %s, IP: %s", state->current_camera_name.c_str(), state->current_camera_item.c_str()); +} + +void InspectorWindow::draw_system(){ + +} + void InspectorWindow::draw_setting(){ int move_from = -1, move_to = -1; for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ @@ -226,6 +245,10 @@ void InspectorWindow::draw_setting(){ } } +void InspectorWindow::draw_protune(){ + +} + void InspectorWindow::draw_status(){ int move_from = -1, move_to = -1; for(int32_t i = 0; i < GOPRO_STATUS_SIZE; i++){ @@ -361,6 +384,14 @@ void InspectorWindow::draw_media(){ } } +void InspectorWindow::draw_command_local(){ + +} + +void InspectorWindow::draw_command_global(){ + +} + void InspectorWindow::reset_setting_order(){ for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ setting_list_ordered[i] = GOPRO_SETTING_IDS[i]; diff --git a/src/master/windows/inspector.h b/src/master/windows/inspector.h index c9acd29..77695f3 100644 --- a/src/master/windows/inspector.h +++ b/src/master/windows/inspector.h @@ -19,9 +19,14 @@ class InspectorWindow : public BaseWindow { void set_window_data(json data) override; virtual void render() override; + virtual void draw_header(); + virtual void draw_system(); virtual void draw_setting(); + virtual void draw_protune(); virtual void draw_status(); virtual void draw_media(); + virtual void draw_command_local(); + virtual void draw_command_global(); void reset_setting_order(); void reset_status_order(); From 25bb79ada58278196625faa5f52e32ac3191d3dd Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 14:18:15 +0800 Subject: [PATCH 16/21] Fixed camera list group rounding width calculation --- src/master/windows/camera_list.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/master/windows/camera_list.cpp b/src/master/windows/camera_list.cpp index cb00e8b..0eccb5a 100644 --- a/src/master/windows/camera_list.cpp +++ b/src/master/windows/camera_list.cpp @@ -143,9 +143,9 @@ void CameraListWindow::render(){ } } - ImVec2 rect_size = get_rect_size(); - float width = ImGui::GetWindowSize().x; - int32_t limit = static_cast(width / rect_size.x); + ImVec2 rect_size = get_rect_size(); // Single cell size + float width = ImGui::GetWindowSize().x; // Total space size + int32_t limit = static_cast((width / rect_size.x) - 0.5f); int32_t counter = 0; std::vector> ciss = get_filtering_result(); ImGui::Text("Cal: %f/%f, Total: %d, Line: %d", width, rect_size.x, size, limit); @@ -210,6 +210,7 @@ void CameraListWindow::draw_group(const std::shared_ptr& c){ ImVec2 image_pos_max = image_pos + rect_size; uint32_t col_white = IM_COL32(255, 255, 255, 255); uint32_t col_grey = IM_COL32(210, 210, 210, 255); + uint32_t col_grey_light = IM_COL32(210, 210, 210, 50); uint32_t col_red = IM_COL32(230, 10, 10, 255); uint32_t col_orange = IM_COL32(230, 230, 10, 255); uint32_t col_orange_dark = IM_COL32(80, 80, 10, 255); @@ -515,10 +516,14 @@ void CameraListWindow::draw_group(const std::shared_ptr& c){ ImGui::PopID(); ImGui::Dummy(rect_size); + bool is_select = state->current_camera_item == c->ip; if(ImGui::IsItemHovered()){ ImGui::SetItemTooltip("%s", "Test\nTest"); draw_list->AddRect(image_pos, image_pos_max, col_grey, 2.0F, 0, 5.0F); } + else if(is_select){ + draw_list->AddRect(image_pos, image_pos_max, col_grey_light, 2.0F, 0, 5.0F); + } item_event( c); ImGui::EndGroup(); } From f1d28bc48b72c85f752283099f9d0e4123dc5b07 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 14:39:45 +0800 Subject: [PATCH 17/21] Attempt to apply the setting field in inspector window --- src/common/camera_setting.h | 11 +- src/master/windows/inspector.cpp | 178 +++++++++++++++++-------------- src/master/windows/inspector.h | 9 +- 3 files changed, 112 insertions(+), 86 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index 85849d2..e62b05b 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -1763,23 +1763,20 @@ const static int32_t _360_PHOTO_FILES_EXTENSION_SUPPORT[] = { #pragma region Beep Volume #define BEEP_VOLUME_ID 216 -#define BEEP_VOLUME_SIZE 4 +#define BEEP_VOLUME_SIZE 3 #define BEEP_VOLUME_NAME "Beep Volume" #define BEEP_VOLUME_AVA MODEL_MAX2|MODEL_13 const static char* BEEP_VOLUME_STRING[] = { - "Off", "Low", "Medium", "High", }; const static int32_t BEEP_VOLUME_VALUE[] = { - 0, // Off - 1, // Low - 2, // Medium - 3, // High + 70, // Low + 85, // Medium + 100, // High }; const static int32_t BEEP_VOLUME_SUPPORT[] = { - MODEL_MAX2|MODEL_13, // Off MODEL_MAX2|MODEL_13, // Low MODEL_MAX2|MODEL_13, // Medium MODEL_MAX2|MODEL_13, // High diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index 6af336e..edf098f 100644 --- a/src/master/windows/inspector.cpp +++ b/src/master/windows/inspector.cpp @@ -46,7 +46,11 @@ InspectorWindow::InspectorWindow( ) : BaseWindow(_setting, _state, _master) { title = "Inspector"; - setting_list_ordered = std::vector(GOPRO_SETTING_SIZE); + system_list_ordered = std::vector(GOPRO_SYSTEM_SETTING_SIZE); + video_setting_list_ordered = std::vector(GOPRO_VIDEO_SETTING_IDS); + photo_setting_list_ordered = std::vector(GOPRO_PHOTO_SETTING_IDS); + video_protune_list_ordered = std::vector(GOPRO_VIDEO_PROTUNE_SETTING_IDS); + photo_protune_list_ordered = std::vector(GOPRO_PHOTO_PROTUNE_SETTING_IDS); status_list_ordered = std::vector(GOPRO_STATUS_SIZE); reset_setting_order(); reset_status_order(); @@ -162,91 +166,29 @@ void InspectorWindow::draw_header(){ } void InspectorWindow::draw_system(){ - + _draw_setting(system_list_ordered); } void InspectorWindow::draw_setting(){ - int move_from = -1, move_to = -1; - for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ - int32_t id = setting_list_ordered[i]; - std::string name = GET_SETTING_NAME_BY_ID(id); - size_t size = GET_SETTING_SIZE_BY_ID(id); - if (!state->current_setting_items[std::to_string(id)].is_number()) { - continue; - } - if (name.size() == 0) { - continue; - } - - name += "##InspectorTitle"; - int32_t select_index = state->current_setting_items[std::to_string(id)].get(); - const char** select_string_list = GET_SETTING_STRING_BY_ID(id); - if(select_string_list == nullptr) { - std::cerr << "Inspector: select_string_list == nullptr" << std::endl; - continue; - } - if(select_index >= size) { - std::cerr << "Inspector: select_index >= size..." << id << "..." << select_index << "..." << size << std::endl; - continue; - } - const char* select_string = select_string_list[select_index]; - if(select_string == nullptr) continue; - - const int32_t* values_id = GET_SETTING_VALUE_BY_ID(id); - - if(ImGui::BeginCombo(name.c_str(), select_string)){ - for (int n = 0; n < size; n++) - { - std::string option = GET_SETTING_STRING_BY_ID(id)[n]; - if(option.size() == 0) continue; - bool is_selected = (state->current_setting_items[std::to_string(id)] == n); // You can store your selection however you want, outside or inside your objects - option += ("##InspectorOption_" + name); - if (ImGui::Selectable(option.c_str(), is_selected)) - { - state->current_setting_items[std::to_string(id)] = n; // Change index - master->apply(state->current_camera_item, id, values_id[n]); - } - if (is_selected) - ImGui::SetItemDefaultFocus(); // You may set the initial focus when opening the combo (scrolling + for keyboard navigation support) - } - ImGui::EndCombo(); - } - - ImGuiDragDropFlags src_flags = 0; - src_flags |= ImGuiDragDropFlags_SourceNoDisableHover; - src_flags |= ImGuiDragDropFlags_SourceNoHoldToOpenOthers; - //src_flags |= ImGuiDragDropFlags_SourceNoPreviewTooltip; - if(ImGui::BeginDragDropSource(src_flags)){ - if (!(src_flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - ImGui::Text("Moving \"%s\"", name.c_str()); - ImGui::SetDragDropPayload("INSPECTOR_SETTING", &i, sizeof(int)); - ImGui::EndDragDropSource(); - } - - if(ImGui::BeginDragDropTarget()){ - ImGuiDragDropFlags target_flags = 0; - target_flags |= ImGuiDragDropFlags_AcceptBeforeDelivery; - target_flags |= ImGuiDragDropFlags_AcceptNoDrawDefaultRect; - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("INSPECTOR_SETTING", target_flags)) - { - move_from = *(const int*)payload->Data; - move_to = i; - } - ImGui::EndDragDropTarget(); + if (state->current_status_items[std::to_string(PRESET_ID)].is_number()) { + int32_t preset = state->current_status_items[std::to_string(PRESET_ID)].get(); + if(preset == 0){ + _draw_setting(video_setting_list_ordered); + }else{ + _draw_setting(photo_setting_list_ordered); } } - if (move_from != -1 && move_to != -1) - { - const int32_t tmp = setting_list_ordered[move_from]; - setting_list_ordered[move_from] = setting_list_ordered[move_to]; - setting_list_ordered[move_to] = tmp; - //ImGui::SetDragDropPayload("INSPECTOR_SETTING", &move_to, sizeof(int)); - state->update_server(); - } } void InspectorWindow::draw_protune(){ - + if (state->current_status_items[std::to_string(PRESET_ID)].is_number()) { + int32_t preset = state->current_status_items[std::to_string(PRESET_ID)].get(); + if(preset == 0){ + _draw_setting(video_protune_list_ordered); + }else{ + _draw_setting(photo_protune_list_ordered); + } + } } void InspectorWindow::draw_status(){ @@ -403,3 +345,83 @@ void InspectorWindow::reset_status_order(){ status_list_ordered[i] = GOPRO_STATUS_IDS[i]; } } + +void InspectorWindow::_draw_setting(std::vector& ordered){ + int move_from = -1, move_to = -1; + for(int32_t i = 0; i < ordered.size(); i++){ + int32_t id = ordered[i]; + std::string name = GET_SETTING_NAME_BY_ID(id); + size_t size = GET_SETTING_SIZE_BY_ID(id); + if (!state->current_setting_items[std::to_string(id)].is_number()) { + continue; + } + if (name.size() == 0) { + continue; + } + + name += "##InspectorTitle"; + int32_t select_index = state->current_setting_items[std::to_string(id)].get(); + const char** select_string_list = GET_SETTING_STRING_BY_ID(id); + if(select_string_list == nullptr) { + std::cerr << "Inspector: select_string_list == nullptr" << std::endl; + continue; + } + if(select_index >= size) { + std::cerr << "Inspector: select_index >= size..." << id << "..." << select_index << "..." << size << std::endl; + continue; + } + const char* select_string = select_string_list[select_index]; + if(select_string == nullptr) continue; + + const int32_t* values_id = GET_SETTING_VALUE_BY_ID(id); + + if(ImGui::BeginCombo(name.c_str(), select_string)){ + for (int n = 0; n < size; n++) + { + std::string option = GET_SETTING_STRING_BY_ID(id)[n]; + if(option.size() == 0) continue; + bool is_selected = (state->current_setting_items[std::to_string(id)] == n); // You can store your selection however you want, outside or inside your objects + option += ("##InspectorOption_" + name); + if (ImGui::Selectable(option.c_str(), is_selected)) + { + state->current_setting_items[std::to_string(id)] = n; // Change index + master->apply(state->current_camera_item, id, values_id[n]); + } + if (is_selected) + ImGui::SetItemDefaultFocus(); // You may set the initial focus when opening the combo (scrolling + for keyboard navigation support) + } + ImGui::EndCombo(); + } + + ImGuiDragDropFlags src_flags = 0; + src_flags |= ImGuiDragDropFlags_SourceNoDisableHover; + src_flags |= ImGuiDragDropFlags_SourceNoHoldToOpenOthers; + //src_flags |= ImGuiDragDropFlags_SourceNoPreviewTooltip; + if(ImGui::BeginDragDropSource(src_flags)){ + if (!(src_flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + ImGui::Text("Moving \"%s\"", name.c_str()); + ImGui::SetDragDropPayload("INSPECTOR_SETTING", &i, sizeof(int)); + ImGui::EndDragDropSource(); + } + + if(ImGui::BeginDragDropTarget()){ + ImGuiDragDropFlags target_flags = 0; + target_flags |= ImGuiDragDropFlags_AcceptBeforeDelivery; + target_flags |= ImGuiDragDropFlags_AcceptNoDrawDefaultRect; + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("INSPECTOR_SETTING", target_flags)) + { + move_from = *(const int*)payload->Data; + move_to = i; + } + ImGui::EndDragDropTarget(); + } + } + if (move_from != -1 && move_to != -1) + { + const int32_t tmp = ordered[move_from]; + ordered[move_from] = ordered[move_to]; + ordered[move_to] = tmp; + //ImGui::SetDragDropPayload("INSPECTOR_SETTING", &move_to, sizeof(int)); + state->update_server(); + } +} \ No newline at end of file diff --git a/src/master/windows/inspector.h b/src/master/windows/inspector.h index 77695f3..f75117a 100644 --- a/src/master/windows/inspector.h +++ b/src/master/windows/inspector.h @@ -30,8 +30,15 @@ class InspectorWindow : public BaseWindow { void reset_setting_order(); void reset_status_order(); +protected: + virtual void _draw_setting(std::vector& ordered); + private: - std::vector setting_list_ordered; + std::vector system_list_ordered; + std::vector video_setting_list_ordered; + std::vector photo_setting_list_ordered; + std::vector video_protune_list_ordered; + std::vector photo_protune_list_ordered; std::vector status_list_ordered; bool create_date_folder; bool put_finish; From dd2524c5d0a1ca135266c97cd5d6fe6dad1772f8 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 14:45:31 +0800 Subject: [PATCH 18/21] Update gopro controoler readme file --- README.md | 61 ++++--------------------------------------------------- 1 file changed, 4 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index c98bd35..497f09a 100644 --- a/README.md +++ b/README.md @@ -2,64 +2,11 @@ Tool for control multiple GoPro Cameras, The design is for above 100 cameras connection. -## System Requirement +## Application Requirement * Operating System: Debine / Windows +## Protocol -## 協定 - -可以參考 GoPro Http API 協定的 [Docs](https://gopro.github.io/OpenGoPro/http#tag/Webcam/operation/GPCAMERA_WEBCAM_START_OGP) - -你的 GoPro 必須要用 USB 連著 (沒錯, GoPro 可以用 Http 控制, 當用 USB 接著) - -透過 {IP}:9090/ 進入 websocket server - -接著透過這個方式傳輸訊息, websocket server 會有 analysis header 的 key, 把訊息丟到對的 processer. - -需求物件結構 -```json -{ - "key": "command | query | webcam | media | preview | preset", - "value": { - "name": "label" - } -} -``` -需求樹狀圖 - -* key: command - * value-name: reboot - * value-name: shutdown - * value-name: keep_alive - * value-name: usb_on - * value-name: usb_off - * value-name: datetime - * value-name: zoom - * value-name: shutter_on - * value-name: shutter_off - * value-name: ip - * value-name: scan - * value-name: clean - * value-name: add - * value-name: delete - * value-name: rename -* key: query - * value-name: get - * value-name: getall - * value-name: set - * value-name: setall -* key: webcam - * value-name: preview - * value-name: exit - * value-name: start - * value-name: stop - * value-name: status - * value-name: version -* key: media - * value-name: lastmedia -* key: preview - * value-name: start - * value-name: stop -* key: preset - * value-name: set +* [Open GoPro Docs](https://gopro.github.io/OpenGoPro/http#tag/Webcam/operation/GPCAMERA_WEBCAM_START_OGP) +* [gpControl Hack](https://github.com/KonradIT/goprowifihack/blob/master/HERO11/HERO11-Commands.md) From 6eee878a114743c59be7755b0b9430bce0717065 Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 15:06:09 +0800 Subject: [PATCH 19/21] Update inspector list records --- src/master/windows/inspector.cpp | 85 +++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index edf098f..189ed3b 100644 --- a/src/master/windows/inspector.cpp +++ b/src/master/windows/inspector.cpp @@ -47,10 +47,10 @@ InspectorWindow::InspectorWindow( : BaseWindow(_setting, _state, _master) { title = "Inspector"; system_list_ordered = std::vector(GOPRO_SYSTEM_SETTING_SIZE); - video_setting_list_ordered = std::vector(GOPRO_VIDEO_SETTING_IDS); - photo_setting_list_ordered = std::vector(GOPRO_PHOTO_SETTING_IDS); - video_protune_list_ordered = std::vector(GOPRO_VIDEO_PROTUNE_SETTING_IDS); - photo_protune_list_ordered = std::vector(GOPRO_PHOTO_PROTUNE_SETTING_IDS); + video_setting_list_ordered = std::vector(GOPRO_VIDEO_SETTING_SIZE); + photo_setting_list_ordered = std::vector(GOPRO_PHOTO_SETTING_SIZE); + video_protune_list_ordered = std::vector(GOPRO_VIDEO_PROTUNE_SETTING_SIZE); + photo_protune_list_ordered = std::vector(GOPRO_PHOTO_PROTUNE_SETTING_SIZE); status_list_ordered = std::vector(GOPRO_STATUS_SIZE); reset_setting_order(); reset_status_order(); @@ -65,10 +65,27 @@ json InspectorWindow::get_window_data() { data["put_finish"] = put_finish; data["create_date_folder"] = create_date_folder; data["current_download_location"] = state->current_download_location; - data["setting_order"] = json::array(); + data["setting_order"] = json::object(); data["status_order"] = json::array(); - for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ - data["setting_order"].push_back(setting_list_ordered[i]); + data["setting_order"]["system_list_ordered"] = json::array(); + data["setting_order"]["video_setting_list_ordered"] = json::array(); + data["setting_order"]["photo_setting_list_ordered"] = json::array(); + data["setting_order"]["video_protune_list_ordered"] = json::array(); + data["setting_order"]["photo_protune_list_ordered"] = json::array(); + for(int32_t i = 0; i < system_list_ordered.size(); i++){ + data["setting_order"]["system_list_ordered"].push_back(system_list_ordered[i]); + } + for(int32_t i = 0; i < video_setting_list_ordered.size(); i++){ + data["setting_order"]["video_setting_list_ordered"].push_back(video_setting_list_ordered[i]); + } + for(int32_t i = 0; i < photo_setting_list_ordered.size(); i++){ + data["setting_order"]["photo_setting_list_ordered"].push_back(photo_setting_list_ordered[i]); + } + for(int32_t i = 0; i < video_protune_list_ordered.size(); i++){ + data["setting_order"]["video_protune_list_ordered"].push_back(video_protune_list_ordered[i]); + } + for(int32_t i = 0; i < photo_protune_list_ordered.size(); i++){ + data["setting_order"]["photo_protune_list_ordered"].push_back(photo_protune_list_ordered[i]); } for(int32_t i = 0; i < GOPRO_STATUS_SIZE; i++){ data["status_order"].push_back(status_list_ordered[i]); @@ -86,10 +103,40 @@ void InspectorWindow::set_window_data(json data) { if(data["current_download_location"].is_string()){ state->current_download_location = data["current_download_location"].get(); } - if(data["setting_order"].is_array() && data["setting_order"].size() == GOPRO_SETTING_SIZE){ - for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ - if(data["setting_order"].at(i).is_number_integer()){ - setting_list_ordered[i] = data["setting_order"].at(i).get(); + if(data["setting_order"].is_object()){ + if(data["setting_order"]["system_list_ordered"].is_array() && data["setting_order"]["system_list_ordered"].size() == system_list_ordered.size()){ + for(int32_t i = 0; i < system_list_ordered.size(); i++){ + if(data["setting_order"]["system_list_ordered"].at(i).is_number_integer()){ + system_list_ordered[i] = data["setting_order"]["system_list_ordered"].at(i).get(); + } + } + } + if(data["setting_order"]["video_setting_list_ordered"].is_array() && data["setting_order"]["video_setting_list_ordered"].size() == video_setting_list_ordered.size()){ + for(int32_t i = 0; i < system_list_ordered.size(); i++){ + if(data["setting_order"]["video_setting_list_ordered"].at(i).is_number_integer()){ + video_setting_list_ordered[i] = data["setting_order"]["video_setting_list_ordered"].at(i).get(); + } + } + } + if(data["setting_order"]["photo_setting_list_ordered"].is_array() && data["setting_order"]["photo_setting_list_ordered"].size() == photo_setting_list_ordered.size()){ + for(int32_t i = 0; i < photo_setting_list_ordered.size(); i++){ + if(data["setting_order"]["photo_setting_list_ordered"].at(i).is_number_integer()){ + system_list_ordered[i] = data["setting_order"]["photo_setting_list_ordered"].at(i).get(); + } + } + } + if(data["setting_order"]["video_protune_list_ordered"].is_array() && data["setting_order"]["video_protune_list_ordered"].size() == video_protune_list_ordered.size()){ + for(int32_t i = 0; i < video_protune_list_ordered.size(); i++){ + if(data["setting_order"]["video_protune_list_ordered"].at(i).is_number_integer()){ + video_protune_list_ordered[i] = data["setting_order"]["video_protune_list_ordered"].at(i).get(); + } + } + } + if(data["setting_order"]["photo_protune_list_ordered"].is_array() && data["setting_order"]["photo_protune_list_ordered"].size() == photo_protune_list_ordered.size()){ + for(int32_t i = 0; i < photo_protune_list_ordered.size(); i++){ + if(data["setting_order"]["photo_protune_list_ordered"].at(i).is_number_integer()){ + photo_protune_list_ordered[i] = data["setting_order"]["photo_protune_list_ordered"].at(i).get(); + } } } } @@ -335,8 +382,20 @@ void InspectorWindow::draw_command_global(){ } void InspectorWindow::reset_setting_order(){ - for(int32_t i = 0; i < GOPRO_SETTING_SIZE; i++){ - setting_list_ordered[i] = GOPRO_SETTING_IDS[i]; + for(int32_t i = 0; i < system_list_ordered.size(); i++){ + system_list_ordered[i] = GOPRO_SYSTEM_SETTING_IDS[i]; + } + for(int32_t i = 0; i < video_setting_list_ordered.size(); i++){ + video_setting_list_ordered[i] = GOPRO_VIDEO_SETTING_IDS[i]; + } + for(int32_t i = 0; i < photo_setting_list_ordered.size(); i++){ + photo_setting_list_ordered[i] = GOPRO_PHOTO_SETTING_IDS[i]; + } + for(int32_t i = 0; i < video_protune_list_ordered.size(); i++){ + video_protune_list_ordered[i] = GOPRO_VIDEO_PROTUNE_SETTING_IDS[i]; + } + for(int32_t i = 0; i < photo_protune_list_ordered.size(); i++){ + photo_protune_list_ordered[i] = GOPRO_PHOTO_PROTUNE_SETTING_IDS[i]; } } From 5ad22d72ca91361ca99bb3558b05b78d97cabc7f Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 15:51:14 +0800 Subject: [PATCH 20/21] Added filter for model --- src/common/camera_setting.h | 2 +- src/master/GoProMaster.cpp | 9 +++++++++ src/master/GoProMaster.h | 3 +++ src/master/data/state.h | 7 ++++++- src/master/main.cpp | 7 +++++++ src/master/windows/camera_list.cpp | 11 +++++++++-- src/master/windows/inspector.cpp | 31 +++++++++++++++++++++++++++--- src/master/windows/inspector.h | 1 + 8 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index e62b05b..ad2f64b 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -2131,7 +2131,7 @@ const static int32_t EXPOSURE_SUPPORT[] = { #pragma region Color #define COLOR_ID 116 #define COLOR_SIZE 3 -#define COLOR_NAME "EV Comp" +#define COLOR_NAME "Color" #define COLOR_AVA MODEL_MAX2_ALL const static char* COLOR_STRING[] = { "Vibrant", diff --git a/src/master/GoProMaster.cpp b/src/master/GoProMaster.cpp index d15a4f3..39a80bd 100644 --- a/src/master/GoProMaster.cpp +++ b/src/master/GoProMaster.cpp @@ -372,6 +372,10 @@ void GoProMaster::registerCameraStatusFeedback(camera_status_feedback v){ _camera_status_feedback = v; } +void GoProMaster::registerCameraHWFeedback(camera_hw_feedback v){ + _camera_hw_feedback = v; +} + void GoProMaster::registerCameraLogFeedback(camera_log_feedback v){ _camera_log_feedback = v; } @@ -560,6 +564,11 @@ void GoProMaster::processMessage(const std::string& server, const std::string& m }else{ std::cout << "Skip status feedback: Detect function pointer is NULL" << std::endl; } + if(_camera_hw_feedback != NULL){ + _camera_hw_feedback(_cam.ip, _cam.hw); + }else{ + std::cout << "Skip hw feedback: Detect function pointer is NULL" << std::endl; + } count++; } } diff --git a/src/master/GoProMaster.h b/src/master/GoProMaster.h index 595a83b..26274ff 100644 --- a/src/master/GoProMaster.h +++ b/src/master/GoProMaster.h @@ -19,6 +19,7 @@ typedef void (*camera_setting_feedback)(std::string ip, json setting); typedef void (*camera_status_feedback)(std::string ip, json status); +typedef void (*camera_hw_feedback)(std::string ip, json hw); typedef void (*camera_log_feedback)(std::string key, std::string value); @@ -106,6 +107,7 @@ class GoProMaster { * Called when fetch Monitor data */ void registerCameraStatusFeedback(camera_status_feedback v); + void registerCameraHWFeedback(camera_hw_feedback v); void registerCameraLogFeedback(camera_log_feedback v); /** @@ -159,6 +161,7 @@ class GoProMaster { std::unordered_map mediaQueryFinish = std::unordered_map(); camera_setting_feedback _camera_setting_feedback = NULL; camera_status_feedback _camera_status_feedback = NULL; + camera_hw_feedback _camera_hw_feedback = NULL; camera_log_feedback _camera_log_feedback = NULL; /** * Is app exit or not flag diff --git a/src/master/data/state.h b/src/master/data/state.h index 51a2b16..440b9d3 100644 --- a/src/master/data/state.h +++ b/src/master/data/state.h @@ -31,7 +31,12 @@ struct GlobalState { bool current_setting_items_bind = false; json current_status_items; bool current_status_items_bind = false; - // Current select camera IP address + json current_hw_items; + bool current_hw_items_bind = false; + /** + * Current select camera IP address + * {server_ip}_{camera_ip} + */ std::string current_camera_item = ""; // Apply state std::string apply_all_item_string = "Video Resolution"; diff --git a/src/master/main.cpp b/src/master/main.cpp index 5988b4c..e9f6526 100644 --- a/src/master/main.cpp +++ b/src/master/main.cpp @@ -97,6 +97,12 @@ void statusGetterFeedback(std::string ip, json status){ global_state->current_status_items_bind = true; } } +void hwGetterFeedback(std::string ip, json hw){ + if(global_state->current_camera_item == ip){ + global_state->current_hw_items = hw; + global_state->current_hw_items_bind = true; + } +} void updateServerList(){ json data = json::object(); @@ -167,6 +173,7 @@ int main(int, char**) // Register event for master master->registerCameraSettingFeedback(settingGetterFeedback); master->registerCameraStatusFeedback(statusGetterFeedback); + master->registerCameraHWFeedback(hwGetterFeedback); master->registerCameraLogFeedback(assign_log); global_state->update_server = updateServerList; global_state->command_sender = pushCommand; diff --git a/src/master/windows/camera_list.cpp b/src/master/windows/camera_list.cpp index 0eccb5a..d9267b1 100644 --- a/src/master/windows/camera_list.cpp +++ b/src/master/windows/camera_list.cpp @@ -380,8 +380,15 @@ void CameraListWindow::draw_group(const std::shared_ptr& c){ if(setting[std::to_string(ISO_MIN_ID)].is_number() && setting[std::to_string(ISO_MAX_ID)].is_number()){ int32_t iso_min = setting[std::to_string(ISO_MIN_ID)].get(); int32_t iso_max = setting[std::to_string(ISO_MAX_ID)].get(); - std::string iso_min_text = ISO_MIN_VIDEO_STRING[iso_min]; - std::string iso_max_text = ISO_MAX_VIDEO_STRING[iso_max]; + std::string iso_min_text = "ISO MIN"; + std::string iso_max_text = "ISO MAX"; + if(preset == 0){ + iso_min_text = ISO_MIN_VIDEO_STRING[iso_min]; + iso_max_text = ISO_MAX_VIDEO_STRING[iso_max]; + }else{ + iso_min_text = ISO_MIN_PHOTO_STRING[iso_min]; + iso_max_text = ISO_MAX_PHOTO_STRING[iso_max]; + } iso_setting = "I: " + iso_min_text + " " + iso_max_text; } if(setting[std::to_string(WHITE_BALANCE_ID)].is_number()){ diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index 189ed3b..86bfa49 100644 --- a/src/master/windows/inspector.cpp +++ b/src/master/windows/inspector.cpp @@ -121,7 +121,7 @@ void InspectorWindow::set_window_data(json data) { if(data["setting_order"]["photo_setting_list_ordered"].is_array() && data["setting_order"]["photo_setting_list_ordered"].size() == photo_setting_list_ordered.size()){ for(int32_t i = 0; i < photo_setting_list_ordered.size(); i++){ if(data["setting_order"]["photo_setting_list_ordered"].at(i).is_number_integer()){ - system_list_ordered[i] = data["setting_order"]["photo_setting_list_ordered"].at(i).get(); + photo_setting_list_ordered[i] = data["setting_order"]["photo_setting_list_ordered"].at(i).get(); } } } @@ -406,11 +406,16 @@ void InspectorWindow::reset_status_order(){ } void InspectorWindow::_draw_setting(std::vector& ordered){ - int move_from = -1, move_to = -1; + int32_t move_from = -1, move_to = -1; + int32_t model_enum = _get_current_model(); for(int32_t i = 0; i < ordered.size(); i++){ int32_t id = ordered[i]; std::string name = GET_SETTING_NAME_BY_ID(id); size_t size = GET_SETTING_SIZE_BY_ID(id); + int32_t ava = GET_SETTING_AVA_BY_ID(id); + if((model_enum&ava) == 0){ + continue; + } if (!state->current_setting_items[std::to_string(id)].is_number()) { continue; } @@ -433,10 +438,16 @@ void InspectorWindow::_draw_setting(std::vector& ordered){ if(select_string == nullptr) continue; const int32_t* values_id = GET_SETTING_VALUE_BY_ID(id); + const int32_t* support_id = GET_SETTING_SUPPORT_BY_ID(id); if(ImGui::BeginCombo(name.c_str(), select_string)){ for (int n = 0; n < size; n++) { + int32_t supp = support_id[n]; + if((model_enum&supp) == 0){ + continue; + } + std::string option = GET_SETTING_STRING_BY_ID(id)[n]; if(option.size() == 0) continue; bool is_selected = (state->current_setting_items[std::to_string(id)] == n); // You can store your selection however you want, outside or inside your objects @@ -483,4 +494,18 @@ void InspectorWindow::_draw_setting(std::vector& ordered){ //ImGui::SetDragDropPayload("INSPECTOR_SETTING", &move_to, sizeof(int)); state->update_server(); } -} \ No newline at end of file +} + +int32_t InspectorWindow::_get_current_model(){ + if(state->current_hw_items["model_name"].is_string()){ + std::string model_name = state->current_hw_items["model_name"].get(); + if(model_name == "MAX 2") return MODEL_MAX2; + else if(model_name == "HERO13 Black") return MODEL_13; + else if(model_name == "HERO12 Black") return MODEL_12; + else if(model_name == "HERO11 Black") return MODEL_11_BLACK; + else if(model_name == "HERO11 Black Mini") return MODEL_11; + else if(model_name == "HERO10 Black") return MODEL_10; + else if(model_name == "HERO9 Black") return MODEL_9; + } + else return 0; +} diff --git a/src/master/windows/inspector.h b/src/master/windows/inspector.h index f75117a..739db60 100644 --- a/src/master/windows/inspector.h +++ b/src/master/windows/inspector.h @@ -32,6 +32,7 @@ class InspectorWindow : public BaseWindow { void reset_status_order(); protected: virtual void _draw_setting(std::vector& ordered); + int32_t _get_current_model(); private: std::vector system_list_ordered; From 546e553becdecd774299d3be42d028bfb72c4b3f Mon Sep 17 00:00:00 2001 From: elly-funique Date: Wed, 8 Apr 2026 17:21:55 +0800 Subject: [PATCH 21/21] Discover cache issue with setting apply, when one of the camera offline. it will cause lag --- src/common/camera_code.h | 6 ++-- src/common/camera_setting.h | 4 +-- src/common/iphelper.h | 5 ++-- src/master/windows/inspector.cpp | 49 ++++++++++++++++++++++++++++++++ src/master/windows/inspector.h | 1 + 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/common/camera_code.h b/src/common/camera_code.h index a5bf88d..60edc21 100644 --- a/src/common/camera_code.h +++ b/src/common/camera_code.h @@ -92,23 +92,23 @@ const static int32_t GOPRO_SYSTEM_SETTING_IDS[] = { #define GOPRO_SYSTEM_SETTING_SIZE sizeof(GOPRO_SYSTEM_SETTING_IDS)/sizeof(int32_t) const static int32_t GOPRO_VIDEO_SETTING_IDS[] = { + PROFILES_ID, + VIDEO_ASPECT_RATIO_ID, VIDEO_RESOLUTION_ID, FRAMES_PER_SECOND_ID, + VIDEO_LENS_ID, - VIDEO_ASPECT_RATIO_ID, BIT_DEPTH_ID, VIDEO_BIT_RATE_ID, VIDEO_FRAMING_ID, SYSTEM_VIDEO_MODE_ID, VIDEO_PERFORMANCE_MODE_ID, - PROFILES_ID, VIDEO_EASY_MODE_ID, HYPERSMOOTH_ID, BEEP_VOLUME_ID, SETUP_SCREEN_SAVER_ID, - VIDEO_FRAMING_ID, }; #define GOPRO_VIDEO_SETTING_SIZE sizeof(GOPRO_VIDEO_SETTING_IDS)/sizeof(int32_t) diff --git a/src/common/camera_setting.h b/src/common/camera_setting.h index ad2f64b..e14d44a 100644 --- a/src/common/camera_setting.h +++ b/src/common/camera_setting.h @@ -2226,7 +2226,7 @@ const static int32_t ISO_MAX_VIDEO_SUPPORT[] = { #pragma region ISO Min Photo #define ISO_MIN_PHOTO_ID 75 -#define ISO_MIN_PHOTO_SIZE 8 +#define ISO_MIN_PHOTO_SIZE 6 #define ISO_MIN_PHOTO_NAME "ISO Minimum" #define ISO_MIN_PHOTO_AVA MODEL_MAX2_ALL const static char* ISO_MIN_PHOTO_STRING[] = { @@ -2257,7 +2257,7 @@ const static int32_t ISO_MIN_PHOTO_SUPPORT[] = { #pragma region ISO Max Photo #define ISO_MAX_PHOTO_ID 24 -#define ISO_MAX_PHOTO_SIZE 8 +#define ISO_MAX_PHOTO_SIZE 6 #define ISO_MAX_PHOTO_NAME "ISO Maximum" #define ISO_MAX_PHOTO_AVA MODEL_MAX2_ALL const static char* ISO_MAX_PHOTO_STRING[] = { diff --git a/src/common/iphelper.h b/src/common/iphelper.h index f48f924..06903f6 100644 --- a/src/common/iphelper.h +++ b/src/common/iphelper.h @@ -243,7 +243,7 @@ inline std::string exec(std::string cmd) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_pure); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result); curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 1500L); - + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 1000L); res = curl_easy_perform(curl); curl_easy_cleanup(curl); @@ -273,6 +273,7 @@ inline std::vector execs(std::vector cmds) { curl_easy_setopt(curlb, CURLOPT_WRITEFUNCTION, write_callback_pure); curl_easy_setopt(curlb, CURLOPT_WRITEDATA, &result[i]); curl_easy_setopt(curlb, CURLOPT_TIMEOUT_MS, 1500L); + curl_easy_setopt(curlb, CURLOPT_CONNECTTIMEOUT_MS, 1000L); curl_multi_add_handle(curlm, curlb); } @@ -280,7 +281,7 @@ inline std::vector execs(std::vector cmds) { do { int32_t numfds = 0; - resm = curl_multi_wait(curlm, NULL, 0, 1500, &numfds); + resm = curl_multi_wait(curlm, NULL, 0, 50, &numfds); if(res != CURLE_OK) { //std::cerr << "GET failed curl_multi_wait: " << numfds << "/" << cmds.size() << std::endl; diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index 86bfa49..274e79a 100644 --- a/src/master/windows/inspector.cpp +++ b/src/master/windows/inspector.cpp @@ -447,6 +447,9 @@ void InspectorWindow::_draw_setting(std::vector& ordered){ if((model_enum&supp) == 0){ continue; } + if(!conditional_filter(model_enum, id, n)){ + continue; + } std::string option = GET_SETTING_STRING_BY_ID(id)[n]; if(option.size() == 0) continue; @@ -509,3 +512,49 @@ int32_t InspectorWindow::_get_current_model(){ } else return 0; } + +bool InspectorWindow::conditional_filter(int32_t mymodel, int32_t setting_id, int32_t value_index){ + if(setting_id == VIDEO_RESOLUTION_ID){ + int32_t aspect = 0; + if(state->current_setting_items[std::to_string(VIDEO_ASPECT_RATIO_ID)].is_number()){ + aspect = state->current_setting_items[std::to_string(VIDEO_ASPECT_RATIO_ID)].get(); + } + int32_t res_id = VIDEO_RESOLUTION_VALUE[value_index]; + int32_t aspect_id = VIDEO_ASPECT_RATIO_VALUE[aspect]; + if(aspect_id == 0){ // "4:3" + if(res_id != 6 && + res_id != 18 && res_id != 25 && res_id != 27 && + res_id != 111 && res_id != 112 && res_id != 113){ + return false; + } + } + else if(aspect_id == 1){ // "16:9" + if(res_id != 1 && res_id != 4 && res_id != 9 && + res_id != 100){ + return false; + } + } + else if(aspect_id == 3){ // "8:7" + if(res_id != 26 && res_id != 28 && res_id != 107 && + res_id != 108){ + return false; + } + } + else if(aspect_id == 4){ // "9:16" + if(res_id != 109 && res_id != 110){ + return false; + } + } + else if(aspect_id == 5){ // "21:9" + if(res_id != 35 && res_id != 36){ + return false; + } + } + else if(aspect_id == 6){ // "1:1" + if(res_id != 37){ + return false; + } + } + } + return true; +} diff --git a/src/master/windows/inspector.h b/src/master/windows/inspector.h index 739db60..4277eed 100644 --- a/src/master/windows/inspector.h +++ b/src/master/windows/inspector.h @@ -33,6 +33,7 @@ class InspectorWindow : public BaseWindow { protected: virtual void _draw_setting(std::vector& ordered); int32_t _get_current_model(); + bool conditional_filter(int32_t mymodel, int32_t setting_id, int32_t value_index); private: std::vector system_list_ordered;