diff --git a/README.md b/README.md index 61d3d2c..497f09a 100644 --- a/README.md +++ b/README.md @@ -1,381 +1,12 @@ # GoPro Controller -這是一個透過 GUI 控制 GoPro 的專案 +Tool for control multiple GoPro Cameras, The design is for above 100 cameras connection. -## 開發需求 +## Application Requirement -* Debine OS / Windows OS +* Operating System: Debine / Windows -### Debine 需要配置 +## Protocol -* 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 - -## 協定 - -可以參考 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) diff --git a/src/common/camera_code.h b/src/common/camera_code.h index ec7309b..60edc21 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,13 @@ #include "camera_status.h" #include "camera_other.h" -#define GOPRO_SETTING_SIZE 56 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 +43,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,69 +65,83 @@ 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, }; +#define GOPRO_SETTING_SIZE sizeof(GOPRO_SETTING_IDS)/sizeof(int32_t) -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, +}; +#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, + BIT_DEPTH_ID, + VIDEO_BIT_RATE_ID, + VIDEO_FRAMING_ID, + SYSTEM_VIDEO_MODE_ID, + VIDEO_PERFORMANCE_MODE_ID, + + VIDEO_EASY_MODE_ID, + + HYPERSMOOTH_ID, + BEEP_VOLUME_ID, + SETUP_SCREEN_SAVER_ID, +}; +#define GOPRO_VIDEO_SETTING_SIZE sizeof(GOPRO_VIDEO_SETTING_IDS)/sizeof(int32_t) + +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, }; +#define GOPRO_VIDEO_PROTUNE_SETTING_SIZE sizeof(GOPRO_VIDEO_PROTUNE_SETTING_IDS)/sizeof(int32_t) + +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[] = { + ISO_MIN_PHOTO_ID, + ISO_MAX_PHOTO_ID, + WHITE_BALANCE_ID, + SHARPNESS_ID, + EXPOSURE_ID, + 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, @@ -213,315 +219,396 @@ 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) { 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_model.h b/src/common/camera_model.h index ce0f44f..295d985 100644 --- a/src/common/camera_model.h +++ b/src/common/camera_model.h @@ -11,23 +11,23 @@ /** 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 */ -#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 39b152b..e14d44a 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 @@ -96,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}, @@ -229,46 +231,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 @@ -523,7 +485,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", @@ -541,83 +503,15 @@ 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 }; #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 @@ -655,13 +549,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 +564,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,159 +586,234 @@ 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 Format #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 +#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", @@ -857,15 +827,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_SUPPORT[] = { + 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", @@ -879,55 +873,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 + 2, // 15 Sec + 3, // 30 Sec + 4, // Off }; - -#define SCHEDULED_CAPTURE_ID 168 -#define SCHEDULED_CAPTURE_SIZE 2 -#define SCHEDULED_CAPTURE_NAME "Scheduled Capture" - -const static char* SCHEDULED_CAPTURE_STRING[] = { - "Off", - "On" -}; - -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", @@ -940,15 +959,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", @@ -961,42 +1002,78 @@ 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 +#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_AVA MODEL_13|MODEL_12|MODEL_11_BLACK const static char* EASY_MODE_SPEED_STRING[] = { "8X Ultra Slo-Mo", "4X Super Slo-Mo", @@ -1087,59 +1164,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", @@ -1147,72 +1418,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", @@ -1225,15 +1542,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", @@ -1248,158 +1587,813 @@ 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 +#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_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" + "High", }; - const static int32_t BEEP_VOLUME_VALUE[] = { - 0, 1, 2, 3 + 70, // Low + 85, // Medium + 100, // High }; +const static int32_t BEEP_VOLUME_SUPPORT[] = { + 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_AVA 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_AVA 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_AVA 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_AVA 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 + +#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_SUPPORT[] = { + MODEL_MAX2, // Off + MODEL_MAX2, // On +}; +#pragma endregion + +// Another Reference: https://github.com/KonradIT/goprowifihack/blob/master/HERO11/HERO11-Commands.md + +#pragma region White Balance +#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[] = { + "Auto", + "5500K", + "6500K", + "Native", + "4000K", + "6000K", + "2300K", + "2800K", + "3200K", + "4500K", + "5000K", +}; +const static int32_t WHITE_BALANCE_VALUE[] = { + 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 + +#pragma region Sharpness +#define SHARPNESS_ID 117 +#define SHARPNESS_SIZE 3 +#define SHARPNESS_NAME "Sharpness" +#define SHARPNESS_AVA MODEL_MAX2_ALL +const static char* SHARPNESS_STRING[] = { + "High", + "Midium", + "Low" +}; +const static int32_t SHARPNESS_VALUE[] = { + 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 "EV Comp" +#define EXPOSURE_AVA MODEL_MAX2_ALL +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, // -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 Color #define COLOR_ID 116 +#define COLOR_SIZE 3 +#define COLOR_NAME "Color" +#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 -#define LENS_ID 121 -#define BITRATE_ID 124 +#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", + "1600", + "400", + "3200", + "800", + "200", + "100", + "Auto", +}; +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 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 Photo +#define ISO_MIN_PHOTO_ID 75 +#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[] = { + "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 Photo +#define ISO_MAX_PHOTO_ID 24 +#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[] = { + "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_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 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", + "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_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 + +#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 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/GoProMaster.cpp b/src/master/GoProMaster.cpp index e94b536..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; } @@ -531,6 +535,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 +543,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; } @@ -558,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/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 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 598873c..d9267b1 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); @@ -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); @@ -209,11 +210,18 @@ 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); 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 +363,32 @@ 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"; + 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()){ @@ -499,10 +523,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(); } diff --git a/src/master/windows/inspector.cpp b/src/master/windows/inspector.cpp index fc9595c..274e79a 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_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(); @@ -61,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]); @@ -82,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()){ + photo_setting_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(); + } } } } @@ -105,32 +156,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,84 +204,38 @@ void InspectorWindow::render(){ ImGui::End(); } -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; +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()); +} - const int32_t* values_id = GET_SETTING_VALUE_BY_ID(id); +void InspectorWindow::draw_system(){ + _draw_setting(system_list_ordered); +} - 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(); +void InspectorWindow::draw_setting(){ + 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(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(); +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); } } - 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_status(){ @@ -361,9 +373,29 @@ 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]; + 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]; } } @@ -372,3 +404,157 @@ void InspectorWindow::reset_status_order(){ status_list_ordered[i] = GOPRO_STATUS_IDS[i]; } } + +void InspectorWindow::_draw_setting(std::vector& ordered){ + 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; + } + 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); + 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; + } + if(!conditional_filter(model_enum, id, n)){ + 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 + 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(); + } +} + +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; +} + +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 c9acd29..4277eed 100644 --- a/src/master/windows/inspector.h +++ b/src/master/windows/inspector.h @@ -19,14 +19,28 @@ 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(); +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 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; 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;