From 73099ee876742c07101496c1e245d0eb70f7bc08 Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Sun, 1 Oct 2023 11:26:25 +0200 Subject: [PATCH 1/9] Add support for VTX MSP Implement VTX MSP protocol support so the video channel can be changed from Betaflight, ELRS Lua Script or any other system that uses VTX MPS protocol. The plan is be able to change algo power and badnwidth. --- dev_air.sh | 6 +++ dev_goggles.sh | 4 ++ ipk/airunit/control/control | 2 +- .../data/opt/etc/dinit.d/msp-osd-airside | 2 +- ipk/goggle/control/control | 2 +- jni/msp/msp.h | 6 ++- jni/msp_displayport_mux.c | 32 +++++++++++- jni/net/data_protocol.h | 1 + jni/osd_dji_overlay_udp.c | 5 +- jni/util/vtx_manager.c | 51 +++++++++++++++++++ 10 files changed, 105 insertions(+), 6 deletions(-) create mode 100755 dev_air.sh create mode 100755 dev_goggles.sh create mode 100644 jni/util/vtx_manager.c diff --git a/dev_air.sh b/dev_air.sh new file mode 100755 index 0000000..b475376 --- /dev/null +++ b/dev_air.sh @@ -0,0 +1,6 @@ +ndk-build +adb push libs/armeabi-v7a/msp_displayport_mux /blackbox +adb shell setprop dji.hdvt_uav_service 0 +adb shell mv /dev/ttyS1 /dev/ttyS1_moved +adb shell nohup /blackbox/msp_displayport_mux 192.168.41.2 /dev/ttyS1_moved /dev/ttyS1 & +adb shell setprop dji.hdvt_uav_service 1 \ No newline at end of file diff --git a/dev_goggles.sh b/dev_goggles.sh new file mode 100755 index 0000000..2172501 --- /dev/null +++ b/dev_goggles.sh @@ -0,0 +1,4 @@ +ndk-build +adb shell setprop dji.glasses_wm150_service 0 +adb push libs/armeabi-v7a/libdisplayport_osd_shim.so /tmp +adb shell LD_PRELOAD=/tmp/libdisplayport_osd_shim.so dji_gls_wm150_original -g \ No newline at end of file diff --git a/ipk/airunit/control/control b/ipk/airunit/control/control index 79e3559..014dc37 100644 --- a/ipk/airunit/control/control +++ b/ipk/airunit/control/control @@ -1,5 +1,5 @@ Package: msp-osd -Version: 0.10.1 +Version: 0.10.2 Maintainer: bri3d Description: MSP OSD service for the DJI HD FPV airunit. Architecture: pigeon-airside diff --git a/ipk/airunit/data/opt/etc/dinit.d/msp-osd-airside b/ipk/airunit/data/opt/etc/dinit.d/msp-osd-airside index e592674..62be5b3 100644 --- a/ipk/airunit/data/opt/etc/dinit.d/msp-osd-airside +++ b/ipk/airunit/data/opt/etc/dinit.d/msp-osd-airside @@ -1,4 +1,4 @@ type = bgprocess command = /opt/bin/airunit-osd-start.sh pid-file = /opt/var/run/airunit-osd-dji.pid -restart = true +restart = true \ No newline at end of file diff --git a/ipk/goggle/control/control b/ipk/goggle/control/control index 22ae07e..cad63bc 100644 --- a/ipk/goggle/control/control +++ b/ipk/goggle/control/control @@ -1,5 +1,5 @@ Package: msp-osd -Version: 0.11.1 +Version: 0.11.2 Maintainer: bri3d Description: MSP OSD service for the DJI HD FPV goggles. Architecture: pigeon-glasses diff --git a/jni/msp/msp.h b/jni/msp/msp.h index e25b35b..585a2be 100644 --- a/jni/msp/msp.h +++ b/jni/msp/msp.h @@ -17,6 +17,10 @@ #define MSP_CMD_DISPLAYPORT 182 #define MSP_CMD_SET_OSD_CANVAS 188 +// https://github.com/betaflight/betaflight/blob/master/src/main/msp/msp_protocol.h#L201C1-L202C50 +#define MSP_CMD_VTX_CONFIG 88 // from FC +#define MSP_CMD_SET_VTX_CONFIG 89 // to FC + typedef enum { MSP_ERR_NONE, MSP_ERR_HDR, @@ -58,4 +62,4 @@ typedef struct msp_state_s { uint16_t msp_data_from_msg(uint8_t message_buffer[], msp_msg_t *msg); msp_error_e construct_msp_command(uint8_t message_buffer[], uint8_t command, uint8_t payload[], uint8_t size, msp_direction_e direction); -msp_error_e msp_process_data(msp_state_t *msp_state, uint8_t dat); \ No newline at end of file +msp_error_e msp_process_data(msp_state_t *msp_state, uint8_t dat); diff --git a/jni/msp_displayport_mux.c b/jni/msp_displayport_mux.c index 4a71648..cfb0ca3 100644 --- a/jni/msp_displayport_mux.c +++ b/jni/msp_displayport_mux.c @@ -74,6 +74,8 @@ static uint8_t serial_passthrough = 1; static uint8_t compress = 0; static uint8_t no_btfl_hd = 0; +int8_t fc_vtx_channel = -1; + static void sig_handler(int _) { quit = 1; @@ -142,6 +144,20 @@ static void send_version_request(int serial_fd) { write(serial_fd, &buffer, sizeof(buffer)); } +static void send_vtx_config_request(int serial_fd) { + DEBUG_PRINT("Sending VTX CONFIG requests message...\n"); + uint8_t buffer[6]; + construct_msp_command(buffer, MSP_CMD_VTX_CONFIG, NULL, 0, MSP_OUTBOUND); + write(serial_fd, &buffer, sizeof(buffer)); +} + +static void send_vtx_set_config_request(int serial_fd) { + DEBUG_PRINT("Sending VTX READY message...\n"); + uint8_t buffer[6]; + construct_msp_command(buffer, MSP_CMD_SET_VTX_CONFIG, NULL, 0, MSP_OUTBOUND); + write(serial_fd, &buffer, sizeof(buffer)); +} + static void copy_to_msp_frame_buffer(void *buffer, uint16_t size) { memcpy(&frame_buffer[fb_cursor], buffer, size); fb_cursor += size; @@ -208,6 +224,15 @@ static void rx_msp_callback(msp_msg_t *msp_message) } break; } + case MSP_CMD_VTX_CONFIG: { + DEBUG_PRINT("Received VTX CONFIG message...\n"); + printf("data: %d %d %d \n", msp_message->payload[0], msp_message->payload[1], msp_message->payload[2]); + // TODO: Damage control accessing to index 2 if not exists + fc_vtx_channel = msp_message->payload[2]; + } + case MSP_CMD_SET_VTX_CONFIG: { + DEBUG_PRINT("Received SET VTX CONFIG message...\n"); + } default: { uint16_t size = msp_data_from_msg(message_buffer, msp_message); if(serial_passthrough || cache_msp_message(msp_message)) { @@ -249,8 +274,9 @@ static void send_data_packet(int data_socket_fd, dji_shm_state_t *dji_shm) { data.version_specifier = 0xFFFF; data.tx_temperature = get_int_from_fs(CPU_TEMP_PATH); data.tx_voltage = get_int_from_fs(AU_VOLTAGE_PATH); + data.fc_vtx_channel = fc_vtx_channel; memcpy(data.fc_variant, current_fc_identifier, sizeof(current_fc_identifier)); - DEBUG_PRINT("got voltage %f V temp %d C variant %.4s\n", (float)(data.tx_voltage / 64.0f), data.tx_temperature, data.fc_variant); + DEBUG_PRINT("got voltage %f V temp %d C variant %.4s and channel %d\n", (float)(data.tx_voltage / 64.0f), data.tx_temperature, data.fc_variant, data.fc_vtx_channel); write(data_socket_fd, &data, sizeof(data)); } @@ -390,6 +416,8 @@ int main(int argc, char *argv[]) { clock_gettime(CLOCK_MONOTONIC, &last_data); clock_gettime(CLOCK_MONOTONIC, &last_frame); + send_vtx_set_config_request(serial_fd); + while (!quit) { poll_fds[0].fd = serial_fd; poll_fds[1].fd = pty_fd; @@ -431,6 +459,8 @@ int main(int argc, char *argv[]) { if(current_fc_identifier[0] == 0) { send_variant_request(serial_fd); } + //INFO: For testing purpose, request VTX_CONFIG + send_vtx_config_request(serial_fd); } if(compress && (timespec_subtract_ns(&now, &last_frame) > (NSEC_PER_SEC / update_rate_hz))) { send_compressed_screen(compressed_fd); diff --git a/jni/net/data_protocol.h b/jni/net/data_protocol.h index 125121b..4427e22 100644 --- a/jni/net/data_protocol.h +++ b/jni/net/data_protocol.h @@ -4,6 +4,7 @@ typedef struct packet_data_s { uint16_t tx_temperature; uint16_t version_specifier; // Used to be bitrate! Danger! 0xFFFF means V2 (no bitrate) for now. uint16_t tx_voltage; + int8_t fc_vtx_channel; char fc_variant[4]; } __attribute__((packed)) packet_data_t; diff --git a/jni/osd_dji_overlay_udp.c b/jni/osd_dji_overlay_udp.c index e9ef091..93b9e74 100644 --- a/jni/osd_dji_overlay_udp.c +++ b/jni/osd_dji_overlay_udp.c @@ -34,6 +34,8 @@ #include "rec/rec.h" #include "rec/rec_pb.h" +#include "util/vtx_manager.c" + #define MSP_PORT 7654 #define DATA_PORT 7655 #define COMPRESSED_DATA_PORT 7656 @@ -485,7 +487,7 @@ static void check_is_au_overlay_enabled() static void process_data_packet(uint8_t *buf, int len, dji_shm_state_t *radio_shm) { packet_data_t *packet = (packet_data_t *)buf; - DEBUG_PRINT("got data %04X version spec %d C %f V variant %.4s\n", packet->version_specifier, packet->tx_temperature, packet->tx_voltage / 64.0f, packet->fc_variant); + DEBUG_PRINT("got data %04X version spec %d C %f V variant %.4s and vtx channel %d\n", packet->version_specifier, packet->tx_temperature, packet->tx_voltage / 64.0f, packet->fc_variant, packet->fc_vtx_channel); char str[8]; clear_overlay(); if(au_overlay_enabled) { @@ -494,6 +496,7 @@ static void process_data_packet(uint8_t *buf, int len, dji_shm_state_t *radio_sh snprintf(str, 8, "A %2.1fV", packet->tx_voltage / 64.0f); display_print_string(overlay_display_info.char_width - 7, overlay_display_info.char_height - 7, str, 7); } + changeChannel(packet->fc_vtx_channel); if(len > 6) { DEBUG_PRINT("Got new packet with variant %.4s\n", packet->fc_variant); // should have FC type diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c new file mode 100644 index 0000000..ebce62c --- /dev/null +++ b/jni/util/vtx_manager.c @@ -0,0 +1,51 @@ +#include +#include +#include "util/debug.h" + + + +static void *tp1801_gui_lib = NULL; +static uint32_t (* setChannelPilotOriginal)(void *this,unsigned short param_1, bool param_2) = 0; +static uint32_t (* userSettingsGetInstanceOriginal)() = 0; +static uint32_t userSettingsInstance = 0; +static int8_t currentChannel = -1; + +void changeChannel(int8_t channel) { + //Load SetPilotChannel original + setChannelPilotOriginal = dlsym (RTLD_NEXT, "_ZN17GlassUserSettings15setPilotChannelEtb"); + if (setChannelPilotOriginal == NULL) { + if(!tp1801_gui_lib){ + tp1801_gui_lib = dlopen("/system/lib/libtp1801_gui.so", 1); + } + setChannelPilotOriginal = dlsym (tp1801_gui_lib, "_ZN17GlassUserSettings15setPilotChannelEtb"); + if (setChannelPilotOriginal == NULL) + { + printf("dlsym: %s\n", dlerror()); + return; + } + } + + //Load UserSettingGetInstance original + userSettingsGetInstanceOriginal = dlsym (tp1801_gui_lib, "_ZN17GlassUserSettings11getInstanceEv"); + if (userSettingsGetInstanceOriginal == NULL) + { + printf("dlsym: %s\n", dlerror()); + return; + } + + if (channel <= 0 || channel > 8) { + printf("VTX_MANAGER Error:, invalid channel index: %d\n", channel); + return; + } + + if(currentChannel == channel) { + return; + } + currentChannel = channel; + + // if 8, need to set to public + DEBUG_PRINT("VTX_MANAGER: requesting to the goggles to set channel %d\n", channel); + + int8_t channelIdx = channel - 1; + setChannelPilotOriginal(userSettingsGetInstanceOriginal(), channelIdx, true); +} \ No newline at end of file From 1c72eff09d416656ad5be9a2bf6f8c48b513a095 Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Sun, 1 Oct 2023 11:26:34 +0200 Subject: [PATCH 2/9] Add configuration to enable/disable VTX MSP. Default: disabled --- config/goggles/config.json | 3 ++- config/goggles/schema.json | 4 ++++ config/goggles/schemaV2.json | 11 ++++++++++- config/goggles/uiSchemaV2.json | 5 ++++- jni/util/vtx_manager.c | 7 ++++++- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/config/goggles/config.json b/config/goggles/config.json index 5529de8..34ba612 100644 --- a/config/goggles/config.json +++ b/config/goggles/config.json @@ -10,5 +10,6 @@ "fakehd_columns": "S", "fakehd_rows": "WWWWWWCCWWWWWWWD", "rec_enabled": true, - "rec_pb_enabled": true + "rec_pb_enabled": true, + "vtx_msp": false } diff --git a/config/goggles/schema.json b/config/goggles/schema.json index 4127e4e..4477c81 100644 --- a/config/goggles/schema.json +++ b/config/goggles/schema.json @@ -60,6 +60,10 @@ "hide_diagnostics": { "name": "Hide diagnostic information", "widget": "checkbox" + }, + "vtx_msp": { + "name": "Enable VTX MSP", + "widget": "checkbox" } }, "units": [ diff --git a/config/goggles/schemaV2.json b/config/goggles/schemaV2.json index 8c6f246..a25c206 100644 --- a/config/goggles/schemaV2.json +++ b/config/goggles/schemaV2.json @@ -58,7 +58,16 @@ true, false ] - } + }, + "vtx_msp": { + "type": "boolean", + "title": "Enable VTX MSP", + "description": "Control video channel from Betaflight or ELRS Lua script VTX admin", + "enum": [ + true, + false + ] + } }, "dependencies": { "fakehd_enable": { diff --git a/config/goggles/uiSchemaV2.json b/config/goggles/uiSchemaV2.json index 5184fb8..12735de 100644 --- a/config/goggles/uiSchemaV2.json +++ b/config/goggles/uiSchemaV2.json @@ -31,5 +31,8 @@ }, "fakehd_rows": { "ui:help": "FakeHD row alignment config, each character configures the alignment for one row. [Read more](https://github.com/fpv-wtf/msp-osd#customising-the-default-fakehd-grid)" - } + }, + "vtx_msp": { + "ui:help": "Enable VTX MSP protocol to control the video channel from Betaflight or ELRS Lua script VTX admin" + }, } \ No newline at end of file diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index ebce62c..3223d89 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -1,8 +1,9 @@ #include #include +#include "json/osd_config.h" #include "util/debug.h" - +#define VTX_MPS_CONFIG_KEY "vtx_msp" static void *tp1801_gui_lib = NULL; static uint32_t (* setChannelPilotOriginal)(void *this,unsigned short param_1, bool param_2) = 0; @@ -11,6 +12,10 @@ static uint32_t userSettingsInstance = 0; static int8_t currentChannel = -1; void changeChannel(int8_t channel) { + if(!get_boolean_config_value(VTX_MPS_CONFIG_KEY)) { + return; + } + //Load SetPilotChannel original setChannelPilotOriginal = dlsym (RTLD_NEXT, "_ZN17GlassUserSettings15setPilotChannelEtb"); if (setChannelPilotOriginal == NULL) { From de084d882917a55e95b8289c0d51f6fde27bc444 Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Sun, 1 Oct 2023 11:26:39 +0200 Subject: [PATCH 3/9] Adding public channel selection Need to refactor the .h - testing for now --- jni/util/vtx_manager.c | 35 +++-- jni/util/vtx_manager.h | 312 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 338 insertions(+), 9 deletions(-) create mode 100644 jni/util/vtx_manager.h diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index 3223d89..b5f2237 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -2,20 +2,19 @@ #include #include "json/osd_config.h" #include "util/debug.h" +#include "vtx_manager.h" #define VTX_MPS_CONFIG_KEY "vtx_msp" +#define CHANNEL_PUBLIC 8 static void *tp1801_gui_lib = NULL; static uint32_t (* setChannelPilotOriginal)(void *this,unsigned short param_1, bool param_2) = 0; static uint32_t (* userSettingsGetInstanceOriginal)() = 0; static uint32_t userSettingsInstance = 0; +static __gs_gui_config *gs_gui_config = 0; static int8_t currentChannel = -1; -void changeChannel(int8_t channel) { - if(!get_boolean_config_value(VTX_MPS_CONFIG_KEY)) { - return; - } - +void setupManager() { //Load SetPilotChannel original setChannelPilotOriginal = dlsym (RTLD_NEXT, "_ZN17GlassUserSettings15setPilotChannelEtb"); if (setChannelPilotOriginal == NULL) { @@ -38,6 +37,21 @@ void changeChannel(int8_t channel) { return; } + userSettingsInstance = userSettingsGetInstanceOriginal(); + if(userSettingsInstance == NULL) { + printf("dlsym: error loading user setting instance"); + return; + } + gs_gui_config = (__gs_gui_config *)*(uint32_t *)((int)userSettingsInstance + 0xe4); +} + +void changeChannel(int8_t channel) { + if(!get_boolean_config_value(VTX_MPS_CONFIG_KEY)) { + return; + } + + setupManager(); + if (channel <= 0 || channel > 8) { printf("VTX_MANAGER Error:, invalid channel index: %d\n", channel); return; @@ -48,9 +62,12 @@ void changeChannel(int8_t channel) { } currentChannel = channel; - // if 8, need to set to public DEBUG_PRINT("VTX_MANAGER: requesting to the goggles to set channel %d\n", channel); - - int8_t channelIdx = channel - 1; - setChannelPilotOriginal(userSettingsGetInstanceOriginal(), channelIdx, true); + + if(channel == CHANNEL_PUBLIC){ + gs_gui_config->gs_modem_set_public_chnl(gs_gui_config->gs_info); + } else { + int8_t channelIdx = channel - 1; + setChannelPilotOriginal(userSettingsGetInstanceOriginal(), channelIdx, true); + } } \ No newline at end of file diff --git a/jni/util/vtx_manager.h b/jni/util/vtx_manager.h new file mode 100644 index 0000000..38c678c --- /dev/null +++ b/jni/util/vtx_manager.h @@ -0,0 +1,312 @@ +#include + + +typedef struct GlassRacingChnlUI GlassRacingChnlUI, *PGlassRacingChnlUI; +typedef struct GlassRacingChnlUI GlassRacingChnlUI_t; + +struct GlassRacingChnlUI { + char dummy[0x4a0]; + float gs_voltage; + char dummy2[0xa]; + uint16_t gs_bitrate; + char dummy3[0x200]; //ends at 0x6b0 + +}__attribute__((packed, aligned(1))); + +static GlassRacingChnlUI *chnl_ui; + +typedef enum gs_link_stat_t { + GS_LINK_STAT_NORMAL=0, + GS_LINK_STAT_WEAK=1, + GS_LINK_STAT_LOST=2, + GS_LINK_STAT_UKNOWN=3 +} gs_link_stat_t; + +typedef enum Record_sender { + RECORD_BUTTON=0, + RECORD_DISARM=1 +} Record_sender; + +typedef enum record_state { + RECORD_STATE_IDLE=0, + RECORD_STATE_RECORDING=1, + RECORD_STATE_STOP_ERROR=2, + RECORD_STATE_STOP_FULL=3, + RECORD_STATE_STOP_WRITE_SLOW=4, + RECORD_STATE_STARTING=5, + RECORD_STATE_STOPPING=6 +} record_state; + +typedef enum record_state record_state_t; + +typedef struct __gs_queue __gs_queue, *P__gs_queue; +typedef struct __gs_queue gs_queue_t; + +struct __gs_queue { + uint32_t * addr; + uint32_t size; + uint32_t num; + uint32_t writer; + uint32_t reader; +}; + +typedef struct __gs_gui_config __gs_gui_config, *P__gs_gui_config; +typedef struct __gs_gui_config gs_gui_config_t; + +struct __gs_gui_config { + gs_queue_t * osd_gen_data_queue; + gs_queue_t * osd_home_data_queue; + gs_queue_t * file_del_queue; + gs_queue_t * camera_stat_queue; + gs_queue_t * camera_cap_param_queue; + gs_queue_t * camera_pb_param_queue; + gs_queue_t * camera_file_info_queue; + gs_queue_t * camera_dcf_abstract_queue; + gs_queue_t * camera_fov_param_queue; + gs_queue_t * rc_bat_stat_queue; + gs_queue_t * signal_quality_queue; + gs_queue_t * uav_bat_common_info_queue; + gs_queue_t * sdr_wl_env_queue; + gs_queue_t * sdr_uav_data_queue; + gs_queue_t * sdr_gnd_data_queue; + gs_queue_t * rc_param_queue; + gs_queue_t * rc_pushed_gps_queue; + gs_queue_t * racing_drone_fc_osd_queue; + bool * touchpadLockState; + void * gs_info; + int (* gs_ext_fc_get_craft_name)(void *ctx,char *craft_name); + int (* gs_ext_fc_get_pid)(void *ctx,uint8_t type,uint8_t *value); + int (* gs_ext_fc_get_rate)(void *ctx,uint8_t type,uint8_t *value); + int (* gs_ext_fc_get_osd_profile_index)(void *ctx,uint8_t *osd_index); + int (* gs_ext_fc_select_file)(void *ctx,uint8_t type,uint8_t index); + int (* gs_ext_fc_copy_file)(void *ctx,uint8_t type,uint8_t src_index,uint8_t dst_index); + int (* gs_ext_fc_write_eeprom)(void *ctx); + int (* gs_ext_fc_get_rc_channel)(void *ctx,uint8_t chnl_index,uint16_t *value); + int (* gs_ext_fc_get_aux_mode_id_by_index)(void *ctx,uint8_t *aux_id,uint8_t aux_index,uint8_t *start_step,uint8_t *end_step); + int (* gs_ext_fc_get_aux_mode)(void *ctx,uint8_t aux_id,uint8_t *aux_index,uint8_t *start_step,uint8_t *end_step); + int (* gs_ext_fc_set_aux_mode)(void *ctx,uint8_t aux_id,uint8_t aux_index,uint8_t start_step,uint8_t end_step); + int (* gs_ext_fc_set_request_type)(void *ctx,uint8_t type); + int (* gs_ext_fc_get_request_type)(void *ctx,uint8_t *type); + int (* gs_ext_fc_get_ag_gain)(void *ctx,uint16_t *ag_gain); + int (* gs_ext_fc_set_ag_gain)(void *ctx,uint16_t ag_gain); + int (* gs_ext_fc_get_ag_thr)(void *ctx,uint16_t *thr); + int (* gs_ext_fc_set_ag_thr)(void *ctx,uint16_t thr); + int (* gs_ext_fc_get_thr_boost)(void *ctx,uint8_t *boost); + int (* gs_ext_fc_set_thr_boost)(void *ctx,uint8_t boost); + int (* gs_ext_fc_get_ff_trans)(void *ctx,uint8_t *ff_trans); + int (* gs_ext_fc_set_ff_trans)(void *ctx,uint8_t ff_trans); + int (* gs_ext_fc_get_filter)(void *ctx,uint8_t filter_type,uint16_t *value); + int (* gs_ext_fc_set_filter)(void *ctx,uint8_t filter_type,uint16_t value); + int (* gs_ext_fc_get_rate_profile_index)(void *ctx,uint8_t *rate_index); + int (* gs_ext_fc_set_rate)(void *ctx,uint8_t type,uint8_t value); + int (* gs_ext_fc_get_super_rate)(void *ctx,uint8_t type,uint8_t *value); + int (* gs_ext_fc_set_super_rate)(void *ctx,uint8_t type,uint8_t value); + int (* gs_ext_fc_get_expo)(void *ctx,uint8_t type,uint8_t *value); + int (* gs_ext_fc_set_expo)(void *ctx,uint8_t type,uint8_t value); + int (* gs_ext_fc_get_dyn_thr)(void *ctx,uint8_t *value); + int (* gs_ext_fc_set_dyn_thr)(void *ctx,uint8_t value); + int (* gs_ext_fc_get_thr_mid)(void *ctx,uint8_t *value); + int (* gs_ext_fc_set_thr_mid)(void *ctx,uint8_t value); + int (* gs_ext_fc_get_thr_expo)(void *ctx,uint8_t *value); + int (* gs_ext_fc_set_thr_expo)(void *ctx,uint8_t value); + int (* gs_ext_fc_get_tpa)(void *ctx,uint16_t *value); + int (* gs_ext_fc_set_tpa)(void *ctx,uint16_t value); + int (* gs_ext_fc_get_pid_f)(void *ctx,uint8_t type,uint16_t *ff); + int (* gs_ext_fc_set_pid_f)(void *ctx,uint8_t type,uint16_t ff); + int (* gs_ext_fc_get_pid_profile_index)(void *ctx,uint8_t *pid_index); + int (* gs_ext_fc_set_pid)(void *ctx,uint8_t type,uint8_t value); + int (* gs_ext_fc_get_battery_state)(void *ctx,void *state);//(void *ctx,batteryState_e *state); + int (* gs_ext_fc_get_battery_voltage)(void *ctx,uint16_t *batt_voltage); + int (* gs_ext_fc_get_battery_avg_voltage)(void *ctx,uint16_t *avg_batt_voltage); + int (* gs_ext_fc_get_battery_amperage)(void *ctx,uint16_t *batt_amperage); + int (* gs_ext_fc_get_battery_mah)(void *ctx,uint16_t *mah); + int (* gs_ext_fc_get_battery_usage)(void *ctx,uint16_t *percent); + int (* gs_ext_fc_get_battery_power)(void *ctx,uint16_t *power); + int (* gs_ext_fc_set_arming_disabled)(void *ctx,uint8_t arming_disabled); + int (* gs_ext_fc_get_arming_disabled)(void *ctx,uint32_t *arming_disabled); + int (* gs_ext_fc_get_version)(void *ctx,uint8_t *major,uint8_t *minor,uint8_t *patch_level); + int (* gs_ext_fc_set_sbus_mode)(void *ctx,uint8_t sbus_mode); + int (* gs_ext_fc_get_racing_osd_info)(void *ctx,void *osdInfo);//(void *ctx,DUSS_MSG_FC_RACING_DRONE_OSD_PUSH_t *osdInfo); + int (* gs_ext_fc_get_osd_position)(void *ctx,int num,bool *activated,int *x,int *y); + int (* gs_ext_fc_get_units)(void *ctx,uint8_t *units); + int (* gs_ext_fc_get_fly_mode)(void *ctx,uint16_t *fly_mode); + int (* gs_ext_fc_get_rtc_date)(void *ctx,void *rtc);//(void *ctx,DUSS_MSG_EXT_FC_RTC_t *rtc); + int (* gs_ext_fc_get_esc_temperature)(void *ctx,uint8_t *temp); + void (* dummy_1)(void); + void (* dummy_2)(void); + int (* gs_media_adjust_fov)(void *ctx,uint32_t scaling,int16_t x,int16_t y); + int (* gs_bl_set_brightness_value)(void *ctx,uint8_t value); + int (* gs_bl_get_brightness_value)(void *ctx,uint8_t *value); + void (* get_device_volume)(void); + void (* set_device_volume)(void); + void (* gs_imu_acc_gyro_calibrate)(char *configfile); + void (* gs_imu_initialize)(void); + void (* gs_imu_destroy)(void); + void (* gs_imu_start)(void); + void (* gs_imu_stop)(void); + void (* gs_imu_get_init_status)(void); + void (* gs_imu_get_attitude)(void); + int (* gs_sd_format_wrap)(void *ctx); + int (* gs_sd_get_info_wrap)(void *ctx,void *sd_info);//(void *ctx,gs_local_sd_info_t *sd_info) + int (* gs_get_battery_info)(void *ctx,void *bat_info);//(void *ctx,DUSS_MSG_RC_BAT_INFO_t *bat_info); + int (* gs_get_device_active_state)(void *ctx,int device_type); + int (* gs_av_in_us_get_brightness)(void *ctx,uint8_t *value); + int (* gs_av_in_us_set_brightness)(void *ctx,uint8_t value); + void (* dummy_3)(void); + int (* gs_av_in_us_get_satutation)(void *ctx,uint8_t *value); + int (* gs_av_in_us_set_saturaton)(void *ctx,uint8_t value); + int (* gs_reset_user_settings)(void *ctx); + int (* gs_ui_event_tracking)(void *ctx,int32_t value,uint8_t event_type,uint8_t event_sub_id); + void (* gs_get_real_flight_stat)(uint8_t *stat); + void (* gs_set_flight_stat)(uint8_t stat); + int (* gs_watermarker_us_get_flag)(void *ctx,uint8_t *value); + int (* gs_watermarker_us_set_flag)(void *ctx,uint8_t value); + int (* gs_watermarker_us_reset)(void *ctx); + int (* gs_player_open)(void *ctx,char *filename); + int (* gs_player_close)(void *ctx); + int (* gs_player_stop)(void *ctx); + int (* gs_player_pause)(void *ctx); + int (* gs_player_resume)(void *ctx); + int (* gs_player_seek_time)(void *ctx,uint32_t time); + int (* gs_player_seek)(void *ctx,uint32_t pos); + int (* gs_player_get_duration)(char *filename,uint32_t *duration); + int (* gs_player_get_cur_time)(void *ctx,uint32_t *cur_time,uint32_t *duration); + int (* gs_player_get_state)(void *ctx,uint32_t *state); + int (* gs_player_get_fileinfo)(char *filename,void *file_info);//(char *filename,vdec_video_file_info_t *file_info); + int (* gs_player_is_playing)(void *ctx,bool *is_playing); + int (* gs_player_delete_file)(char *filename); + int (* gs_send_camera_cmd_async)(void *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_id);//(duss_event_client *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_ id) + int (* gs_set_camera_param)(void *ctx,uint8_t param_type,uint8_t param); + int (* gs_uav_camera_get_rec_time)(void *ctx,int *mode,int *rec_time); + int (* gs_modem_pairing_control_wrap)(void *ctx,uint32_t ctrl); + void (* dummy_4)(void); + void (* dummy_5)(void); + void (* dummy_6)(void); + void (* dummy_7)(void); + void (* dummy_8)(void); + void (* dummy_9)(void); + void (* dummy_10)(void); + void (* dummy_11)(void); + void (* dummy_12)(void); + void (* dummy_13)(void); + void (* dummy_14)(void); + void (* dummy_15)(void); + void (* dummy_16)(void); + int (* gs_modem_get_link_state_wrap)(void *ctx,gs_link_stat_t *link_stat); + int (* gs_modem_get_bandwidth)(void *ctx,uint16_t *bandwidth); + int (* gs_modem_set_bandwidth)(void *ctx,uint16_t bandwidth); + int (* gs_modem_get_chnl)(void *ctx,uint16_t *chnl_id); + int (* gs_modem_set_chnl_scan_info)(void *ctx,uint8_t chnl_num,uint8_t bandwidth); + int (* gs_modem_rob_chnl_cancel)(void *ctx); + int (* gs_modem_rob_chnl)(void *ctx,uint16_t chnl_id); + int (* gs_modem_get_rob_left_time)(void *ctx,uint8_t *left_time); + int (* gs_modem_get_rob_flag)(void *ctx,uint8_t *flag); + int (* gs_modem_clear_rob_flag)(void *ctx); + int (* gs_modem_set_public_chnl)(void *ctx); + int (* gs_modem_is_drone_broadcast)(void *ctx,uint16_t *is_brdcst); + int (* gs_modem_enable_drone_broadcast)(void *ctx,uint16_t enable); + int (* gs_modem_listen_broadcast)(void *ctx,uint16_t chnl_id); + int (* gs_modem_is_silent)(void *ctx,uint16_t *is_silent); + int (* gs_modem_set_chnl)(void *ctx,uint16_t chnl_id); + int (* gs_modem_scan_chnl_x)(void *ctx,uint8_t chnl_id,uint8_t bandwidth); + int (* gs_modem_check_ant_status)(void *ctx); + int (* gs_modem_if_new_chnl_scan_info)(void *ctx,uint8_t *flag); + int (* gs_modem_if_new_phy_check_info)(void *ctx,uint8_t *flag); + int (* gs_modem_if_update_bandwidth_pending)(void *ctx,uint8_t *pending); + int (* gs_modem_clear_scan_flag)(void *ctx); + int (* gs_modem_clear_check_flag)(void *ctx); + int (* gs_modem_get_chnl_scan_info)(void *ctx,uint8_t chnl_id,uint8_t *occupied,uint8_t *work_ind,uint32_t *ipsd ); + int (* gs_modem_get_ant_status)(void *ctx,uint8_t *tx_ant,uint8_t *rx_ant); + int (* gs_modem_get_dbg_mcs)(void *ctx,uint16_t *mcs); + int (* gs_modem_set_dbg_mcs)(void *ctx,uint16_t mcs); + int (* gs_modem_get_dbg_harq)(void *ctx,uint16_t *harq); + int (* gs_modem_set_dbg_harq)(void *ctx,uint16_t harq); + int (* gs_modem_get_dbg_codec_rate)(void *ctx,uint16_t *codec_rate); + int (* gs_modem_set_dbg_codec_rate)(void *ctx,uint16_t codec_rate); + int (* gs_modem_get_signal_quality)(void *ctx,void *signal_quality);//(void *ctx,glass_signal_quality_t *signal_quality); + int (* gs_modem_get_rc_signal_quality)(void *ctx,void *rc_signal_quality);//(void *ctx,glass_signal_quality_t *rc_signal_quality) + int (* gs_modem_set_bandwidth_mode)(void *ctx,uint16_t bandwidth_id); + int (* gs_modem_change_silent_mode)(void *ctx,uint8_t mode); + int (* gs_modem_get_chnl_cnt_wrap)(void *ctx,uint16_t *chnl_cnt); + int (* gs_modem_get_freq_by_index_wrap)(void *ctx,uint16_t *freqByIndex,uint16_t chnlId); + int (* gs_modem_get_scan_type_wrap)(void *ctx,uint8_t *scanType); + int (* gs_modem_get_wireless_area_id)(void *ctx,uint8_t *area_id); + int (* gs_modem_get_pairing_finish_flag)(void *ctx,uint8_t *pairing_finish); + int (* gs_modem_check_conf_items)(void *ctx); + int (* gs_rc_get_version)(void *ctx,char *ap_ver,char *board_sn,int8_t *valid); + int (* gs_rc_get_version_async)(void *ctx); + int (* gs_rc_set_subtrim)(void *ctx,uint8_t stick,int16_t st); + int (* gs_rc_set_subtrim_async)(void *ctx,uint8_t stick,int16_t st); + int (* gs_rc_get_subtrim_sync)(void *ctx,void *subtrim);//(void *ctx,rc_set_all_st_t *subtrim) + int (* gs_rc_get_subtrim_async)(void *ctx); + int (* gs_rc_set_reverse)(void *ctx,uint8_t stick,uint8_t rev); + int (* gs_rc_get_reverse_sync)(void *ctx,void *reverse);//(void *ctx,rc_set_reverse_t *reverse) + int (* gs_rc_get_reverse_async)(void *ctx); + int (* gs_rc_set_endpoint)(void *ctx,uint8_t stick_ch,uint8_t ep_min,uint8_t ep_max); + int (* gs_rc_set_endpoint_async)(void *ctx,uint8_t stick_ch,uint8_t ep_min,uint8_t ep_max); + int (* gs_rc_get_endpoint_sync)(void *ctx,void *ep);//(void *ctx,rc_set_all_ep_t *ep) + int (* gs_rc_get_endpoint_async)(void *ctx); + int (* gs_rc_set_function_mode)(void *ctx,uint8_t func,uint8_t stick,uint8_t set_val); + int (* gs_rc_get_function_mode)(void *ctx,void *func_mode);//(void *ctx,rc_set_function_pack_t *func_mode) + int (* gs_rc_set_stick_mode)(void *ctx,uint8_t stick_mode); + int (* gs_rc_get_stick_mode_async)(void *ctx); + int (* gs_rc_get_stick_mode_ext)(void *ctx,uint8_t *mode); + int (* gs_rc_get_stick_mode_sync)(void *ctx,uint8_t *mode); + int (* gs_rc_set_stick_cali_stage)(void *ctx,uint8_t tid,uint8_t stage,uint8_t *rc_stage); + int (* gs_rc_get_stick_cali_value)(void *ctx,uint8_t tid,int8_t *x1_pct,int8_t *y1_pct,int8_t *x2_pct,int8_t *y2_pct); + int (* gs_rc_set_warning_mode)(void *ctx,int warn);//(void *ctx,rc_set_warning_mode_pack_t warn) + int (* gs_rc_get_warning_mode)(void *ctx,void *warn);//(void *ctx,rc_set_warning_mode_pack_t *warn) + int (* gs_rc_monitor_setup)(void *ctx,void *monitor);//(void *ctx,rc_monitor_pack_t *monitor) + int (* gs_rc_reset_all_get_status)(void *ctx); + int (* gs_rc_reset_default_async)(void *ctx,uint8_t resetType); + uint8_t (* gs_rc_get_lock_state)(void *ctx); + uint8_t (* gs_rc_get_link_state)(void *ctx); + int (* gs_vcm_register_channel_switch_callback_wrap)(void *ctx,int callback,void *data);//(void *ctx,gs_video_channel_switch_callback_t callback,void *data) + int (* gs_vcm_register_channel_push_callback_wrap)(void *ctx,int callback,void *data);//(void *ctx,gs_video_channel_push_callback_t callback,void *data) + int (* gs_vcm_query_current_channel_wrap)(void *ctx,void *chnl_id);//(void *ctx,gs_video_channel_id_t *chnl_id) + int (* gs_vcm_enable_channel_wrap)(void *ctx,int chnl_id);//(void *ctx,gs_main_channel_id_t chnl_id) + int (* gs_vcm_disable_channel_wrap)(void *ctx,int chnl_id);//(void *ctx,gs_main_channel_id_t chnl_id) + int (* gs_vcm_enable_sub_channel_wrap)(void *ctx,void *sub_chnl_id);//(void *ctx,gs_video_channel_id_t *sub_chnl_id) + int (* gs_vcm_disable_sub_channel_wrap)(void *ctx,void *sub_chnl_id);//(void *ctx,gs_video_channel_id_t *sub_chnl_id) + int (* gs_vcm_local_playback_on_wrap)(void *ctx,char *video_path); + int (* gs_vcm_local_playback_off_wrap)(void *ctx); + int (* gs_vcm_rc_setting_on_wrap)(void *ctx); + int (* gs_vcm_rc_setting_off_wrap)(void *ctx); + int (* gs_common_send_cmd)(void *ctx,void *cmd,bool sync);//(void *ctx,gs_common_cmd_t *cmd,bool sync) + int (* gs_get_codec_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_codec_osd_info_t *info) + int (* gs_get_cam_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_cam_osd_info_t *info) + int (* gs_get_temp_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_temp_osd_info_t *info) + int (* gs_get_uav_max_temp)(void *ctx,int32_t *uav_temp); + int (* gs_get_cp_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_cp_osd_info_t *info) + int (* gs_set_racing_enc_strategy)(void *ctx,uint8_t strategy); + int (* gs_debug_is_camera_in_record)(void *ctx,int *record_state); + int (* gs_get_cparm_version)(void *ctx,char *arm_ver); + int (* gs_get_dsp_version)(void *ctx,char *dsp_ver); + int (* gs_get_flight_time)(void *ctx,uint64_t *flight_time); + int (* gs_get_arm_status)(void *ctx,uint8_t *flag); + int (* gs_clear_adb_log_info)(void *ctx); + int (* gs_reset_camera_param)(void *ctx); + int (* gs_set_low_power_mode)(void *ctx,bool mode); + int (* gs_get_uav_version)(void *ctx,char *ap_ver,char *board_sn); + int (* gs_get_uav_hardware_version)(void *ctx,char *hw_ver); + int (* gs_get_uav_power_status)(void *ctx,uint8_t *power_status,uint8_t *arm_flag); + int (* gs_get_uav_camera_type)(void *ctx,uint8_t *cam_type); + int (* gs_get_liveview_fps)(void *ctx,uint8_t *lv_fps); + int (* gs_fbdev_open)(void); + int (* gs_fbdev_disp_frame)(int *frm_id); + int (* gs_fbdev_close)(void); + int (* gs_record_liveview)(void *ctx,bool b_record); + int (* gs_liveview_get_state)(void *ctx,int *lv_rec_state); + int (* gs_lv_transcode_get_looping_mode)(void *ctx); + int (* gs_lv_transcode_set_looping_mode)(void *ctx,int rec_mode);//(void *ctx,record_mode_t rec_mode) + int (* gs_lv_transcode_get_state)(void *ctx); + int (* gs_lv_transcode_record)(void *ctx,bool b_record,Record_sender sender); + int (* gs_lv_transcode_get_rec_time)(void *ctx,int *rec_time); + int (* gs_enable_audio_liveview)(void *ctx,bool b_enable); + int (* gs_get_frame_delay_e2e)(void *ctx,uint16_t *delay); + int (* gs_get_chnl_status)(void *ctx,uint16_t *chnl_status); + int (* gs_get_pigeon_battery_info)(void *ctx,void *vol);//(void *ctx,gs_battery_voltage_t *vol) + int (* gs_get_sd_status)(void *ctx,int type,uint8_t *sd_status,uint32_t *total_kbytes,uint32_t *free_kbytes); + int (* gs_pwm_buzzer_playback)(void *ctx,int freq,int duty,int delay_ms); + int (* gs_pwm_buzzer_enable_bat)(void *ctx,bool enable); +}; From 362eb5ebdf8347493c034e848a3362be15d3857c Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Sun, 1 Oct 2023 11:25:37 +0200 Subject: [PATCH 4/9] Improve VTX manager init and config --- jni/osd_dji_overlay_udp.c | 10 +++++++++- jni/util/vtx_manager.c | 16 ++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/jni/osd_dji_overlay_udp.c b/jni/osd_dji_overlay_udp.c index 93b9e74..7367e67 100644 --- a/jni/osd_dji_overlay_udp.c +++ b/jni/osd_dji_overlay_udp.c @@ -79,6 +79,9 @@ typedef enum #define BACK_BUTTON_DELAY 4 +#define VTX_MPS_CONFIG_KEY "vtx_msp" +static u_int8_t vtx_manager_enabled; + #define SWAP32(data) \ ( (((data) >> 24) & 0x000000FF) | (((data) >> 8) & 0x0000FF00) | \ (((data) << 8) & 0x00FF0000) | (((data) << 24) & 0xFF000000) ) @@ -496,7 +499,9 @@ static void process_data_packet(uint8_t *buf, int len, dji_shm_state_t *radio_sh snprintf(str, 8, "A %2.1fV", packet->tx_voltage / 64.0f); display_print_string(overlay_display_info.char_width - 7, overlay_display_info.char_height - 7, str, 7); } - changeChannel(packet->fc_vtx_channel); + if(vtx_manager_enabled == 1) { + changeChannel(packet->fc_vtx_channel); + } if(len > 6) { DEBUG_PRINT("Got new packet with variant %.4s\n", packet->fc_variant); // should have FC type @@ -755,6 +760,9 @@ void osd_directfb(duss_disp_instance_handle_t *disp, duss_hal_obj_handle_t ion_h int compression_dict_size = 0; void *compression_dict = open_dict(DICTIONARY_VERSION, &compression_dict_size); + vtx_manager_enabled = get_boolean_config_value(VTX_MPS_CONFIG_KEY); + setupVTXManager(); + uint64_t event_number; while (!quit) { diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index b5f2237..35a61b3 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -1,10 +1,8 @@ #include #include -#include "json/osd_config.h" #include "util/debug.h" #include "vtx_manager.h" -#define VTX_MPS_CONFIG_KEY "vtx_msp" #define CHANNEL_PUBLIC 8 static void *tp1801_gui_lib = NULL; @@ -14,7 +12,11 @@ static uint32_t userSettingsInstance = 0; static __gs_gui_config *gs_gui_config = 0; static int8_t currentChannel = -1; -void setupManager() { +void setupVTXManager() { + if(setChannelPilotOriginal != NULL) { + return; + } + //Load SetPilotChannel original setChannelPilotOriginal = dlsym (RTLD_NEXT, "_ZN17GlassUserSettings15setPilotChannelEtb"); if (setChannelPilotOriginal == NULL) { @@ -46,12 +48,6 @@ void setupManager() { } void changeChannel(int8_t channel) { - if(!get_boolean_config_value(VTX_MPS_CONFIG_KEY)) { - return; - } - - setupManager(); - if (channel <= 0 || channel > 8) { printf("VTX_MANAGER Error:, invalid channel index: %d\n", channel); return; @@ -70,4 +66,4 @@ void changeChannel(int8_t channel) { int8_t channelIdx = channel - 1; setChannelPilotOriginal(userSettingsGetInstanceOriginal(), channelIdx, true); } -} \ No newline at end of file +} From 1a82bcedec15176ac6efc985946f222bade51236 Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Mon, 1 Jan 2024 12:55:58 +0100 Subject: [PATCH 5/9] setting vtx wip --- jni/msp/msp.h | 2 + jni/msp/msp_vtx.c | 86 +++++++++++++++++++++++++++++++++++++++ jni/msp_displayport_mux.c | 27 ++++++++---- 3 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 jni/msp/msp_vtx.c diff --git a/jni/msp/msp.h b/jni/msp/msp.h index 585a2be..59d978a 100644 --- a/jni/msp/msp.h +++ b/jni/msp/msp.h @@ -20,6 +20,8 @@ // https://github.com/betaflight/betaflight/blob/master/src/main/msp/msp_protocol.h#L201C1-L202C50 #define MSP_CMD_VTX_CONFIG 88 // from FC #define MSP_CMD_SET_VTX_CONFIG 89 // to FC +#define MSP_CMD_SET_VTXTABLE_BAND 227 // to FC set vtxTable band/channel data (one band at a time) +#define MSP_CMD_SET_VTXTABLE_POWERLEVEL 228 // to FC set vtxTable powerLevel data (one powerLevel at a time) typedef enum { MSP_ERR_NONE, diff --git a/jni/msp/msp_vtx.c b/jni/msp/msp_vtx.c new file mode 100644 index 0000000..e7aee53 --- /dev/null +++ b/jni/msp/msp_vtx.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include "msp.h" + +static uint8_t message_buffer[256]; + +uint8_t total_bands = 1; +uint8_t total_channels = 8; +uint8_t total_powers = 6; + +uint8_t * resetVTXTableMessage() { + uint8_t payload_size = 15; + uint8_t default_table[15] = { + 0, // idx LSB + 0, // idx MSB + 0, // 25mW Power idx + 0, // pitmode + 0, // lowPowerDisarm + 0, // pitModeFreq LSB + 0, // pitModeFreq MSB + 0, // band + 0, // channel + 0, // newFreq LSB + 0, // newFreq MSB + total_bands, // bandCount, + total_channels, // channelCount + total_powers, // powerCount + 1 // vtxtable should be cleared + }; + + construct_msp_command(message_buffer, MSP_CMD_SET_VTX_CONFIG, default_table, payload_size, MSP_OUTBOUND); + + return message_buffer; +} + +uint8_t * setupVTXPowerMessage(int index, int value, char name[]) { + uint8_t name_size = sizeof(name); + uint8_t payload_size = 4 + name_size; + uint8_t vtx_power[4 + 3] = { + index, // idx + value & 0xFF, // powerValue LSB + (value >> 8) & 0xFF, // powerValue MSB + sizeof(name), // label lenght + }; + + for(int i = 0; i < sizeof(name); i++) { + vtx_power[i] = name[i]; + } + /*txPacket[8] = idx; + txPacket[9] = saPowerLevelsLut[idx - 1] & 0xFF; // powerValue LSB + txPacket[10] = (saPowerLevelsLut[idx - 1] >> 8) & 0xFF; // powerValue MSB + txPacket[11] = POWER_LEVEL_LABEL_LENGTH; + txPacket[12] = saPowerLevelsLabel[((idx - 1) * POWER_LEVEL_LABEL_LENGTH) + 0]; + txPacket[13] = saPowerLevelsLabel[((idx - 1) * POWER_LEVEL_LABEL_LENGTH) + 1]; + txPacket[14] = saPowerLevelsLabel[((idx - 1) * POWER_LEVEL_LABEL_LENGTH) + 2];*/ + + construct_msp_command(message_buffer, MSP_CMD_SET_VTXTABLE_POWERLEVEL, vtx_power, payload_size, MSP_OUTBOUND); + + return message_buffer; +} + +uint8_t * setupVTXBandMessage() { + uint8_t payload_size = 8 + total_channels; + uint8_t vtx_band[8 + 8] = { + 0, // band + 3, // label lenght + 'D', + 'J', + 'I', + 'D', // band letter + 0, // is factory band + total_channels, // total channel + }; + + for(int i = 8; i < total_channels; i++) { + vtx_band[i] = i & 0xFF; + i++; + vtx_band[i] = (i >> 8) & 0xFF; + } + + construct_msp_command(message_buffer, MSP_CMD_SET_VTXTABLE_POWERLEVEL, vtx_band, payload_size, MSP_OUTBOUND); + + return message_buffer; +} diff --git a/jni/msp_displayport_mux.c b/jni/msp_displayport_mux.c index cfb0ca3..a1294ef 100644 --- a/jni/msp_displayport_mux.c +++ b/jni/msp_displayport_mux.c @@ -16,6 +16,7 @@ #include "util/debug.h" #include "util/time_util.h" #include "util/fs_util.h" +#include "./msp/msp_vtx.c" #define CPU_TEMP_PATH "/sys/devices/platform/soc/f0a00000.apb/f0a71000.omc/temp1" #define AU_VOLTAGE_PATH "/sys/devices/platform/soc/f0a00000.apb/f0a71000.omc/voltage4" @@ -153,9 +154,21 @@ static void send_vtx_config_request(int serial_fd) { static void send_vtx_set_config_request(int serial_fd) { DEBUG_PRINT("Sending VTX READY message...\n"); - uint8_t buffer[6]; - construct_msp_command(buffer, MSP_CMD_SET_VTX_CONFIG, NULL, 0, MSP_OUTBOUND); - write(serial_fd, &buffer, sizeof(buffer)); + + uint8_t *buffer = resetVTXTableMessage(); + write(serial_fd, buffer, sizeof(buffer)); + + buffer = setupVTXPowerMessage(0, 25, "25 "); + write(serial_fd, buffer, sizeof(buffer)); + buffer = setupVTXPowerMessage(0, 200, "200 "); + write(serial_fd, buffer, sizeof(buffer)); + buffer = setupVTXPowerMessage(0, 500, "500 "); + write(serial_fd, buffer, sizeof(buffer)); + buffer = setupVTXPowerMessage(0, 700, "700 "); + write(serial_fd, buffer, sizeof(buffer)); + + buffer = setupVTXBandMessage(); + write(serial_fd, buffer, sizeof(buffer)); } static void copy_to_msp_frame_buffer(void *buffer, uint16_t size) { @@ -236,7 +249,7 @@ static void rx_msp_callback(msp_msg_t *msp_message) default: { uint16_t size = msp_data_from_msg(message_buffer, msp_message); if(serial_passthrough || cache_msp_message(msp_message)) { - // Either serial passthrough was on, or the cache was enabled but missed (a response was not available). + // Either serial passthrough was on, or the cache was enabled but missed (a response was not available). // Either way, this means we need to send the message through to DJI. write(pty_fd, message_buffer, size); } @@ -390,8 +403,8 @@ int main(int argc, char *argv[]) { printf("Allocated PTY %s\n", pty_name_ptr); if ((argc - optind) > 2) { unlink(argv[optind + 2]); - symlink(pty_name_ptr, argv[optind + 2]); - printf("Relinked %s to %s\n", argv[optind + 2], pty_name_ptr); + symlink(pty_name_ptr, argv[optind + 2]); + printf("Relinked %s to %s\n", argv[optind + 2], pty_name_ptr); } socket_fd = connect_to_server(ip_address, MSP_PORT); compressed_fd = connect_to_server(ip_address, COMPRESSED_DATA_PORT); @@ -425,7 +438,7 @@ int main(int argc, char *argv[]) { poll_fds[1].events = POLLIN; poll(poll_fds, 2, ((MSEC_PER_SEC / update_rate_hz) / 2)); - + // We got inbound serial data, process it as MSP data. if (0 < (serial_data_size = read(serial_fd, serial_data, sizeof(serial_data)))) { DEBUG_PRINT("RECEIVED data! length %d\n", serial_data_size); From 57d700b4a72404f9d2df7e047e187ca5cb5b7bbb Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Mon, 1 Jan 2024 12:56:09 +0100 Subject: [PATCH 6/9] Only load the VTX Manager if enable on settings Also some minor warnings corrections --- jni/msp/msp_vtx.c | 6 +++--- jni/msp_displayport_mux.c | 6 +++--- jni/osd_dji_overlay_udp.c | 7 +++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/jni/msp/msp_vtx.c b/jni/msp/msp_vtx.c index e7aee53..e910bac 100644 --- a/jni/msp/msp_vtx.c +++ b/jni/msp/msp_vtx.c @@ -36,16 +36,16 @@ uint8_t * resetVTXTableMessage() { } uint8_t * setupVTXPowerMessage(int index, int value, char name[]) { - uint8_t name_size = sizeof(name); + uint8_t name_size = strlen(name); uint8_t payload_size = 4 + name_size; uint8_t vtx_power[4 + 3] = { index, // idx value & 0xFF, // powerValue LSB (value >> 8) & 0xFF, // powerValue MSB - sizeof(name), // label lenght + strlen(name), // label lenght }; - for(int i = 0; i < sizeof(name); i++) { + for(int i = 0; i < strlen(name); i++) { vtx_power[i] = name[i]; } /*txPacket[8] = idx; diff --git a/jni/msp_displayport_mux.c b/jni/msp_displayport_mux.c index a1294ef..febc87b 100644 --- a/jni/msp_displayport_mux.c +++ b/jni/msp_displayport_mux.c @@ -239,9 +239,9 @@ static void rx_msp_callback(msp_msg_t *msp_message) } case MSP_CMD_VTX_CONFIG: { DEBUG_PRINT("Received VTX CONFIG message...\n"); - printf("data: %d %d %d \n", msp_message->payload[0], msp_message->payload[1], msp_message->payload[2]); - // TODO: Damage control accessing to index 2 if not exists - fc_vtx_channel = msp_message->payload[2]; + if(sizeof(msp_message->payload) > 2) { + fc_vtx_channel = msp_message->payload[2]; + } } case MSP_CMD_SET_VTX_CONFIG: { DEBUG_PRINT("Received SET VTX CONFIG message...\n"); diff --git a/jni/osd_dji_overlay_udp.c b/jni/osd_dji_overlay_udp.c index 7367e67..590cf01 100644 --- a/jni/osd_dji_overlay_udp.c +++ b/jni/osd_dji_overlay_udp.c @@ -499,7 +499,7 @@ static void process_data_packet(uint8_t *buf, int len, dji_shm_state_t *radio_sh snprintf(str, 8, "A %2.1fV", packet->tx_voltage / 64.0f); display_print_string(overlay_display_info.char_width - 7, overlay_display_info.char_height - 7, str, 7); } - if(vtx_manager_enabled == 1) { + if(vtx_manager_enabled == true) { changeChannel(packet->fc_vtx_channel); } if(len > 6) { @@ -760,8 +760,11 @@ void osd_directfb(duss_disp_instance_handle_t *disp, duss_hal_obj_handle_t ion_h int compression_dict_size = 0; void *compression_dict = open_dict(DICTIONARY_VERSION, &compression_dict_size); + // VTX Manager vtx_manager_enabled = get_boolean_config_value(VTX_MPS_CONFIG_KEY); - setupVTXManager(); + if(vtx_manager_enabled == true) { + setupVTXManager(); + } uint64_t event_number; while (!quit) From c6f8d6c8dd3dd0ba9c67b6785ae4659019923192 Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Mon, 1 Jan 2024 12:56:13 +0100 Subject: [PATCH 7/9] Update to support latest NDK version Based on @mmosca PR changes I have also enable latest NDK support. --- jni/Android.mk | 5 ++++- jni/hw/dji_display.c | 1 + jni/hw/dji_radio_shm.c | 1 + jni/lz4/lz4.c | 1 - jni/util/fs_util.c | 2 +- jni/util/vtx_manager.c | 5 ++++- 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/jni/Android.mk b/jni/Android.mk index 1bb053e..9796258 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -7,7 +7,8 @@ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) -LOCAL_CFLAGS += -fPIC -std=c99 -O3 +LOCAL_CFLAGS += -fPIC -std=c99 -O3 -I. +LOCAL_CXXFLAGS += -fPIC -std=c99 -O3 -I. LOCAL_LDFLAGS += -fPIC LOCAL_LDLIBS := -llog LOCAL_ARM_NEON := true @@ -36,6 +37,8 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) +LOCAL_CFLAGS += -fPIC -std=c99 -O3 -I. -DLZ4_STATIC_LINKING_ONLY +LOCAL_CXXFLAGS += -fPIC -std=c99 -O3 -I. LOCAL_SRC_FILES:= \ hw/dji_radio_shm.c \ json/osd_config.c \ diff --git a/jni/hw/dji_display.c b/jni/hw/dji_display.c index 9f40d6c..5bc2668 100644 --- a/jni/hw/dji_display.c +++ b/jni/hw/dji_display.c @@ -1,4 +1,5 @@ #include +#include #include "dji_display.h" #include "util/debug.h" diff --git a/jni/hw/dji_radio_shm.c b/jni/hw/dji_radio_shm.c index 6afbb1b..a151f15 100644 --- a/jni/hw/dji_radio_shm.c +++ b/jni/hw/dji_radio_shm.c @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/jni/lz4/lz4.c b/jni/lz4/lz4.c index 8796f78..9f9f41e 100644 --- a/jni/lz4/lz4.c +++ b/jni/lz4/lz4.c @@ -114,7 +114,6 @@ #define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ #endif -#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ #include "lz4.h" /* see also "memory routines" below */ diff --git a/jni/util/fs_util.c b/jni/util/fs_util.c index f1769e0..3570c77 100644 --- a/jni/util/fs_util.c +++ b/jni/util/fs_util.c @@ -34,7 +34,7 @@ void *open_dict(int dict_version, int *size) { size_t filesize = st.st_size; int fd = open(file_path, O_RDONLY, 0); if (!fd) { - return -1; + return (void *)-1; } void* dict = malloc(filesize); void* mmappedData = mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, 0); diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index 35a61b3..7cd8dbc 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -6,7 +6,9 @@ #define CHANNEL_PUBLIC 8 static void *tp1801_gui_lib = NULL; -static uint32_t (* setChannelPilotOriginal)(void *this,unsigned short param_1, bool param_2) = 0; +// static uint32_t (* setChannelPilotOriginal)(void *this,unsigned short param_1, bool param_2) = 0; +// or +static uint32_t (* setChannelPilotOriginal)(uint32_t this, unsigned short param_1, bool param_2) = 0; static uint32_t (* userSettingsGetInstanceOriginal)() = 0; static uint32_t userSettingsInstance = 0; static __gs_gui_config *gs_gui_config = 0; @@ -14,6 +16,7 @@ static int8_t currentChannel = -1; void setupVTXManager() { if(setChannelPilotOriginal != NULL) { + //Already setup return; } From f3b73611a06b4ea9486510e44ccb76e2cb5cc24c Mon Sep 17 00:00:00 2001 From: jesuslg123 Date: Mon, 1 Jan 2024 12:56:19 +0100 Subject: [PATCH 8/9] Remove duplciated header redeclaration --- jni/Android.mk | 3 +- jni/osd_dji_overlay_udp.c | 2 +- jni/rec/rec_shim.h | 2 + jni/util/vtx_manager.c | 2 + jni/util/vtx_manager.h | 314 +------------------------------------- 5 files changed, 10 insertions(+), 313 deletions(-) diff --git a/jni/Android.mk b/jni/Android.mk index 9796258..c311674 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -32,7 +32,8 @@ LOCAL_SRC_FILES := \ rec/rec_util.c \ rec/rec.c \ toast/toast.c \ - util/fs_util.c + util/fs_util.c \ + util/vtx_manager.c include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) diff --git a/jni/osd_dji_overlay_udp.c b/jni/osd_dji_overlay_udp.c index 590cf01..ad98ee6 100644 --- a/jni/osd_dji_overlay_udp.c +++ b/jni/osd_dji_overlay_udp.c @@ -34,7 +34,7 @@ #include "rec/rec.h" #include "rec/rec_pb.h" -#include "util/vtx_manager.c" +#include "util/vtx_manager.h" #define MSP_PORT 7654 #define DATA_PORT 7655 diff --git a/jni/rec/rec_shim.h b/jni/rec/rec_shim.h index 636831d..0bbc93b 100644 --- a/jni/rec/rec_shim.h +++ b/jni/rec/rec_shim.h @@ -5649,6 +5649,8 @@ struct __gs_gui_config int (*get_sd_status)(void *, int, uint8_t *, uint32_t *, uint32_t *); int (*play_pwm_buzzer)(void *, int, int, int); int (*buzzer_enable_bat)(void *, _Bool); + void * gs_info; + int (*gs_modem_set_public_chnl)(void *ctx); }; struct AVCodecParserContext diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index 7cd8dbc..bd3c22e 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -2,6 +2,8 @@ #include #include "util/debug.h" #include "vtx_manager.h" +#include "../rec/rec_shim.h" + #define CHANNEL_PUBLIC 8 diff --git a/jni/util/vtx_manager.h b/jni/util/vtx_manager.h index 38c678c..eaf780a 100644 --- a/jni/util/vtx_manager.h +++ b/jni/util/vtx_manager.h @@ -1,312 +1,4 @@ -#include +#pragma once - -typedef struct GlassRacingChnlUI GlassRacingChnlUI, *PGlassRacingChnlUI; -typedef struct GlassRacingChnlUI GlassRacingChnlUI_t; - -struct GlassRacingChnlUI { - char dummy[0x4a0]; - float gs_voltage; - char dummy2[0xa]; - uint16_t gs_bitrate; - char dummy3[0x200]; //ends at 0x6b0 - -}__attribute__((packed, aligned(1))); - -static GlassRacingChnlUI *chnl_ui; - -typedef enum gs_link_stat_t { - GS_LINK_STAT_NORMAL=0, - GS_LINK_STAT_WEAK=1, - GS_LINK_STAT_LOST=2, - GS_LINK_STAT_UKNOWN=3 -} gs_link_stat_t; - -typedef enum Record_sender { - RECORD_BUTTON=0, - RECORD_DISARM=1 -} Record_sender; - -typedef enum record_state { - RECORD_STATE_IDLE=0, - RECORD_STATE_RECORDING=1, - RECORD_STATE_STOP_ERROR=2, - RECORD_STATE_STOP_FULL=3, - RECORD_STATE_STOP_WRITE_SLOW=4, - RECORD_STATE_STARTING=5, - RECORD_STATE_STOPPING=6 -} record_state; - -typedef enum record_state record_state_t; - -typedef struct __gs_queue __gs_queue, *P__gs_queue; -typedef struct __gs_queue gs_queue_t; - -struct __gs_queue { - uint32_t * addr; - uint32_t size; - uint32_t num; - uint32_t writer; - uint32_t reader; -}; - -typedef struct __gs_gui_config __gs_gui_config, *P__gs_gui_config; -typedef struct __gs_gui_config gs_gui_config_t; - -struct __gs_gui_config { - gs_queue_t * osd_gen_data_queue; - gs_queue_t * osd_home_data_queue; - gs_queue_t * file_del_queue; - gs_queue_t * camera_stat_queue; - gs_queue_t * camera_cap_param_queue; - gs_queue_t * camera_pb_param_queue; - gs_queue_t * camera_file_info_queue; - gs_queue_t * camera_dcf_abstract_queue; - gs_queue_t * camera_fov_param_queue; - gs_queue_t * rc_bat_stat_queue; - gs_queue_t * signal_quality_queue; - gs_queue_t * uav_bat_common_info_queue; - gs_queue_t * sdr_wl_env_queue; - gs_queue_t * sdr_uav_data_queue; - gs_queue_t * sdr_gnd_data_queue; - gs_queue_t * rc_param_queue; - gs_queue_t * rc_pushed_gps_queue; - gs_queue_t * racing_drone_fc_osd_queue; - bool * touchpadLockState; - void * gs_info; - int (* gs_ext_fc_get_craft_name)(void *ctx,char *craft_name); - int (* gs_ext_fc_get_pid)(void *ctx,uint8_t type,uint8_t *value); - int (* gs_ext_fc_get_rate)(void *ctx,uint8_t type,uint8_t *value); - int (* gs_ext_fc_get_osd_profile_index)(void *ctx,uint8_t *osd_index); - int (* gs_ext_fc_select_file)(void *ctx,uint8_t type,uint8_t index); - int (* gs_ext_fc_copy_file)(void *ctx,uint8_t type,uint8_t src_index,uint8_t dst_index); - int (* gs_ext_fc_write_eeprom)(void *ctx); - int (* gs_ext_fc_get_rc_channel)(void *ctx,uint8_t chnl_index,uint16_t *value); - int (* gs_ext_fc_get_aux_mode_id_by_index)(void *ctx,uint8_t *aux_id,uint8_t aux_index,uint8_t *start_step,uint8_t *end_step); - int (* gs_ext_fc_get_aux_mode)(void *ctx,uint8_t aux_id,uint8_t *aux_index,uint8_t *start_step,uint8_t *end_step); - int (* gs_ext_fc_set_aux_mode)(void *ctx,uint8_t aux_id,uint8_t aux_index,uint8_t start_step,uint8_t end_step); - int (* gs_ext_fc_set_request_type)(void *ctx,uint8_t type); - int (* gs_ext_fc_get_request_type)(void *ctx,uint8_t *type); - int (* gs_ext_fc_get_ag_gain)(void *ctx,uint16_t *ag_gain); - int (* gs_ext_fc_set_ag_gain)(void *ctx,uint16_t ag_gain); - int (* gs_ext_fc_get_ag_thr)(void *ctx,uint16_t *thr); - int (* gs_ext_fc_set_ag_thr)(void *ctx,uint16_t thr); - int (* gs_ext_fc_get_thr_boost)(void *ctx,uint8_t *boost); - int (* gs_ext_fc_set_thr_boost)(void *ctx,uint8_t boost); - int (* gs_ext_fc_get_ff_trans)(void *ctx,uint8_t *ff_trans); - int (* gs_ext_fc_set_ff_trans)(void *ctx,uint8_t ff_trans); - int (* gs_ext_fc_get_filter)(void *ctx,uint8_t filter_type,uint16_t *value); - int (* gs_ext_fc_set_filter)(void *ctx,uint8_t filter_type,uint16_t value); - int (* gs_ext_fc_get_rate_profile_index)(void *ctx,uint8_t *rate_index); - int (* gs_ext_fc_set_rate)(void *ctx,uint8_t type,uint8_t value); - int (* gs_ext_fc_get_super_rate)(void *ctx,uint8_t type,uint8_t *value); - int (* gs_ext_fc_set_super_rate)(void *ctx,uint8_t type,uint8_t value); - int (* gs_ext_fc_get_expo)(void *ctx,uint8_t type,uint8_t *value); - int (* gs_ext_fc_set_expo)(void *ctx,uint8_t type,uint8_t value); - int (* gs_ext_fc_get_dyn_thr)(void *ctx,uint8_t *value); - int (* gs_ext_fc_set_dyn_thr)(void *ctx,uint8_t value); - int (* gs_ext_fc_get_thr_mid)(void *ctx,uint8_t *value); - int (* gs_ext_fc_set_thr_mid)(void *ctx,uint8_t value); - int (* gs_ext_fc_get_thr_expo)(void *ctx,uint8_t *value); - int (* gs_ext_fc_set_thr_expo)(void *ctx,uint8_t value); - int (* gs_ext_fc_get_tpa)(void *ctx,uint16_t *value); - int (* gs_ext_fc_set_tpa)(void *ctx,uint16_t value); - int (* gs_ext_fc_get_pid_f)(void *ctx,uint8_t type,uint16_t *ff); - int (* gs_ext_fc_set_pid_f)(void *ctx,uint8_t type,uint16_t ff); - int (* gs_ext_fc_get_pid_profile_index)(void *ctx,uint8_t *pid_index); - int (* gs_ext_fc_set_pid)(void *ctx,uint8_t type,uint8_t value); - int (* gs_ext_fc_get_battery_state)(void *ctx,void *state);//(void *ctx,batteryState_e *state); - int (* gs_ext_fc_get_battery_voltage)(void *ctx,uint16_t *batt_voltage); - int (* gs_ext_fc_get_battery_avg_voltage)(void *ctx,uint16_t *avg_batt_voltage); - int (* gs_ext_fc_get_battery_amperage)(void *ctx,uint16_t *batt_amperage); - int (* gs_ext_fc_get_battery_mah)(void *ctx,uint16_t *mah); - int (* gs_ext_fc_get_battery_usage)(void *ctx,uint16_t *percent); - int (* gs_ext_fc_get_battery_power)(void *ctx,uint16_t *power); - int (* gs_ext_fc_set_arming_disabled)(void *ctx,uint8_t arming_disabled); - int (* gs_ext_fc_get_arming_disabled)(void *ctx,uint32_t *arming_disabled); - int (* gs_ext_fc_get_version)(void *ctx,uint8_t *major,uint8_t *minor,uint8_t *patch_level); - int (* gs_ext_fc_set_sbus_mode)(void *ctx,uint8_t sbus_mode); - int (* gs_ext_fc_get_racing_osd_info)(void *ctx,void *osdInfo);//(void *ctx,DUSS_MSG_FC_RACING_DRONE_OSD_PUSH_t *osdInfo); - int (* gs_ext_fc_get_osd_position)(void *ctx,int num,bool *activated,int *x,int *y); - int (* gs_ext_fc_get_units)(void *ctx,uint8_t *units); - int (* gs_ext_fc_get_fly_mode)(void *ctx,uint16_t *fly_mode); - int (* gs_ext_fc_get_rtc_date)(void *ctx,void *rtc);//(void *ctx,DUSS_MSG_EXT_FC_RTC_t *rtc); - int (* gs_ext_fc_get_esc_temperature)(void *ctx,uint8_t *temp); - void (* dummy_1)(void); - void (* dummy_2)(void); - int (* gs_media_adjust_fov)(void *ctx,uint32_t scaling,int16_t x,int16_t y); - int (* gs_bl_set_brightness_value)(void *ctx,uint8_t value); - int (* gs_bl_get_brightness_value)(void *ctx,uint8_t *value); - void (* get_device_volume)(void); - void (* set_device_volume)(void); - void (* gs_imu_acc_gyro_calibrate)(char *configfile); - void (* gs_imu_initialize)(void); - void (* gs_imu_destroy)(void); - void (* gs_imu_start)(void); - void (* gs_imu_stop)(void); - void (* gs_imu_get_init_status)(void); - void (* gs_imu_get_attitude)(void); - int (* gs_sd_format_wrap)(void *ctx); - int (* gs_sd_get_info_wrap)(void *ctx,void *sd_info);//(void *ctx,gs_local_sd_info_t *sd_info) - int (* gs_get_battery_info)(void *ctx,void *bat_info);//(void *ctx,DUSS_MSG_RC_BAT_INFO_t *bat_info); - int (* gs_get_device_active_state)(void *ctx,int device_type); - int (* gs_av_in_us_get_brightness)(void *ctx,uint8_t *value); - int (* gs_av_in_us_set_brightness)(void *ctx,uint8_t value); - void (* dummy_3)(void); - int (* gs_av_in_us_get_satutation)(void *ctx,uint8_t *value); - int (* gs_av_in_us_set_saturaton)(void *ctx,uint8_t value); - int (* gs_reset_user_settings)(void *ctx); - int (* gs_ui_event_tracking)(void *ctx,int32_t value,uint8_t event_type,uint8_t event_sub_id); - void (* gs_get_real_flight_stat)(uint8_t *stat); - void (* gs_set_flight_stat)(uint8_t stat); - int (* gs_watermarker_us_get_flag)(void *ctx,uint8_t *value); - int (* gs_watermarker_us_set_flag)(void *ctx,uint8_t value); - int (* gs_watermarker_us_reset)(void *ctx); - int (* gs_player_open)(void *ctx,char *filename); - int (* gs_player_close)(void *ctx); - int (* gs_player_stop)(void *ctx); - int (* gs_player_pause)(void *ctx); - int (* gs_player_resume)(void *ctx); - int (* gs_player_seek_time)(void *ctx,uint32_t time); - int (* gs_player_seek)(void *ctx,uint32_t pos); - int (* gs_player_get_duration)(char *filename,uint32_t *duration); - int (* gs_player_get_cur_time)(void *ctx,uint32_t *cur_time,uint32_t *duration); - int (* gs_player_get_state)(void *ctx,uint32_t *state); - int (* gs_player_get_fileinfo)(char *filename,void *file_info);//(char *filename,vdec_video_file_info_t *file_info); - int (* gs_player_is_playing)(void *ctx,bool *is_playing); - int (* gs_player_delete_file)(char *filename); - int (* gs_send_camera_cmd_async)(void *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_id);//(duss_event_client *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_ id) - int (* gs_set_camera_param)(void *ctx,uint8_t param_type,uint8_t param); - int (* gs_uav_camera_get_rec_time)(void *ctx,int *mode,int *rec_time); - int (* gs_modem_pairing_control_wrap)(void *ctx,uint32_t ctrl); - void (* dummy_4)(void); - void (* dummy_5)(void); - void (* dummy_6)(void); - void (* dummy_7)(void); - void (* dummy_8)(void); - void (* dummy_9)(void); - void (* dummy_10)(void); - void (* dummy_11)(void); - void (* dummy_12)(void); - void (* dummy_13)(void); - void (* dummy_14)(void); - void (* dummy_15)(void); - void (* dummy_16)(void); - int (* gs_modem_get_link_state_wrap)(void *ctx,gs_link_stat_t *link_stat); - int (* gs_modem_get_bandwidth)(void *ctx,uint16_t *bandwidth); - int (* gs_modem_set_bandwidth)(void *ctx,uint16_t bandwidth); - int (* gs_modem_get_chnl)(void *ctx,uint16_t *chnl_id); - int (* gs_modem_set_chnl_scan_info)(void *ctx,uint8_t chnl_num,uint8_t bandwidth); - int (* gs_modem_rob_chnl_cancel)(void *ctx); - int (* gs_modem_rob_chnl)(void *ctx,uint16_t chnl_id); - int (* gs_modem_get_rob_left_time)(void *ctx,uint8_t *left_time); - int (* gs_modem_get_rob_flag)(void *ctx,uint8_t *flag); - int (* gs_modem_clear_rob_flag)(void *ctx); - int (* gs_modem_set_public_chnl)(void *ctx); - int (* gs_modem_is_drone_broadcast)(void *ctx,uint16_t *is_brdcst); - int (* gs_modem_enable_drone_broadcast)(void *ctx,uint16_t enable); - int (* gs_modem_listen_broadcast)(void *ctx,uint16_t chnl_id); - int (* gs_modem_is_silent)(void *ctx,uint16_t *is_silent); - int (* gs_modem_set_chnl)(void *ctx,uint16_t chnl_id); - int (* gs_modem_scan_chnl_x)(void *ctx,uint8_t chnl_id,uint8_t bandwidth); - int (* gs_modem_check_ant_status)(void *ctx); - int (* gs_modem_if_new_chnl_scan_info)(void *ctx,uint8_t *flag); - int (* gs_modem_if_new_phy_check_info)(void *ctx,uint8_t *flag); - int (* gs_modem_if_update_bandwidth_pending)(void *ctx,uint8_t *pending); - int (* gs_modem_clear_scan_flag)(void *ctx); - int (* gs_modem_clear_check_flag)(void *ctx); - int (* gs_modem_get_chnl_scan_info)(void *ctx,uint8_t chnl_id,uint8_t *occupied,uint8_t *work_ind,uint32_t *ipsd ); - int (* gs_modem_get_ant_status)(void *ctx,uint8_t *tx_ant,uint8_t *rx_ant); - int (* gs_modem_get_dbg_mcs)(void *ctx,uint16_t *mcs); - int (* gs_modem_set_dbg_mcs)(void *ctx,uint16_t mcs); - int (* gs_modem_get_dbg_harq)(void *ctx,uint16_t *harq); - int (* gs_modem_set_dbg_harq)(void *ctx,uint16_t harq); - int (* gs_modem_get_dbg_codec_rate)(void *ctx,uint16_t *codec_rate); - int (* gs_modem_set_dbg_codec_rate)(void *ctx,uint16_t codec_rate); - int (* gs_modem_get_signal_quality)(void *ctx,void *signal_quality);//(void *ctx,glass_signal_quality_t *signal_quality); - int (* gs_modem_get_rc_signal_quality)(void *ctx,void *rc_signal_quality);//(void *ctx,glass_signal_quality_t *rc_signal_quality) - int (* gs_modem_set_bandwidth_mode)(void *ctx,uint16_t bandwidth_id); - int (* gs_modem_change_silent_mode)(void *ctx,uint8_t mode); - int (* gs_modem_get_chnl_cnt_wrap)(void *ctx,uint16_t *chnl_cnt); - int (* gs_modem_get_freq_by_index_wrap)(void *ctx,uint16_t *freqByIndex,uint16_t chnlId); - int (* gs_modem_get_scan_type_wrap)(void *ctx,uint8_t *scanType); - int (* gs_modem_get_wireless_area_id)(void *ctx,uint8_t *area_id); - int (* gs_modem_get_pairing_finish_flag)(void *ctx,uint8_t *pairing_finish); - int (* gs_modem_check_conf_items)(void *ctx); - int (* gs_rc_get_version)(void *ctx,char *ap_ver,char *board_sn,int8_t *valid); - int (* gs_rc_get_version_async)(void *ctx); - int (* gs_rc_set_subtrim)(void *ctx,uint8_t stick,int16_t st); - int (* gs_rc_set_subtrim_async)(void *ctx,uint8_t stick,int16_t st); - int (* gs_rc_get_subtrim_sync)(void *ctx,void *subtrim);//(void *ctx,rc_set_all_st_t *subtrim) - int (* gs_rc_get_subtrim_async)(void *ctx); - int (* gs_rc_set_reverse)(void *ctx,uint8_t stick,uint8_t rev); - int (* gs_rc_get_reverse_sync)(void *ctx,void *reverse);//(void *ctx,rc_set_reverse_t *reverse) - int (* gs_rc_get_reverse_async)(void *ctx); - int (* gs_rc_set_endpoint)(void *ctx,uint8_t stick_ch,uint8_t ep_min,uint8_t ep_max); - int (* gs_rc_set_endpoint_async)(void *ctx,uint8_t stick_ch,uint8_t ep_min,uint8_t ep_max); - int (* gs_rc_get_endpoint_sync)(void *ctx,void *ep);//(void *ctx,rc_set_all_ep_t *ep) - int (* gs_rc_get_endpoint_async)(void *ctx); - int (* gs_rc_set_function_mode)(void *ctx,uint8_t func,uint8_t stick,uint8_t set_val); - int (* gs_rc_get_function_mode)(void *ctx,void *func_mode);//(void *ctx,rc_set_function_pack_t *func_mode) - int (* gs_rc_set_stick_mode)(void *ctx,uint8_t stick_mode); - int (* gs_rc_get_stick_mode_async)(void *ctx); - int (* gs_rc_get_stick_mode_ext)(void *ctx,uint8_t *mode); - int (* gs_rc_get_stick_mode_sync)(void *ctx,uint8_t *mode); - int (* gs_rc_set_stick_cali_stage)(void *ctx,uint8_t tid,uint8_t stage,uint8_t *rc_stage); - int (* gs_rc_get_stick_cali_value)(void *ctx,uint8_t tid,int8_t *x1_pct,int8_t *y1_pct,int8_t *x2_pct,int8_t *y2_pct); - int (* gs_rc_set_warning_mode)(void *ctx,int warn);//(void *ctx,rc_set_warning_mode_pack_t warn) - int (* gs_rc_get_warning_mode)(void *ctx,void *warn);//(void *ctx,rc_set_warning_mode_pack_t *warn) - int (* gs_rc_monitor_setup)(void *ctx,void *monitor);//(void *ctx,rc_monitor_pack_t *monitor) - int (* gs_rc_reset_all_get_status)(void *ctx); - int (* gs_rc_reset_default_async)(void *ctx,uint8_t resetType); - uint8_t (* gs_rc_get_lock_state)(void *ctx); - uint8_t (* gs_rc_get_link_state)(void *ctx); - int (* gs_vcm_register_channel_switch_callback_wrap)(void *ctx,int callback,void *data);//(void *ctx,gs_video_channel_switch_callback_t callback,void *data) - int (* gs_vcm_register_channel_push_callback_wrap)(void *ctx,int callback,void *data);//(void *ctx,gs_video_channel_push_callback_t callback,void *data) - int (* gs_vcm_query_current_channel_wrap)(void *ctx,void *chnl_id);//(void *ctx,gs_video_channel_id_t *chnl_id) - int (* gs_vcm_enable_channel_wrap)(void *ctx,int chnl_id);//(void *ctx,gs_main_channel_id_t chnl_id) - int (* gs_vcm_disable_channel_wrap)(void *ctx,int chnl_id);//(void *ctx,gs_main_channel_id_t chnl_id) - int (* gs_vcm_enable_sub_channel_wrap)(void *ctx,void *sub_chnl_id);//(void *ctx,gs_video_channel_id_t *sub_chnl_id) - int (* gs_vcm_disable_sub_channel_wrap)(void *ctx,void *sub_chnl_id);//(void *ctx,gs_video_channel_id_t *sub_chnl_id) - int (* gs_vcm_local_playback_on_wrap)(void *ctx,char *video_path); - int (* gs_vcm_local_playback_off_wrap)(void *ctx); - int (* gs_vcm_rc_setting_on_wrap)(void *ctx); - int (* gs_vcm_rc_setting_off_wrap)(void *ctx); - int (* gs_common_send_cmd)(void *ctx,void *cmd,bool sync);//(void *ctx,gs_common_cmd_t *cmd,bool sync) - int (* gs_get_codec_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_codec_osd_info_t *info) - int (* gs_get_cam_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_cam_osd_info_t *info) - int (* gs_get_temp_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_temp_osd_info_t *info) - int (* gs_get_uav_max_temp)(void *ctx,int32_t *uav_temp); - int (* gs_get_cp_debug_osd_info)(void *ctx,void *info);//(void *ctx,debug_cp_osd_info_t *info) - int (* gs_set_racing_enc_strategy)(void *ctx,uint8_t strategy); - int (* gs_debug_is_camera_in_record)(void *ctx,int *record_state); - int (* gs_get_cparm_version)(void *ctx,char *arm_ver); - int (* gs_get_dsp_version)(void *ctx,char *dsp_ver); - int (* gs_get_flight_time)(void *ctx,uint64_t *flight_time); - int (* gs_get_arm_status)(void *ctx,uint8_t *flag); - int (* gs_clear_adb_log_info)(void *ctx); - int (* gs_reset_camera_param)(void *ctx); - int (* gs_set_low_power_mode)(void *ctx,bool mode); - int (* gs_get_uav_version)(void *ctx,char *ap_ver,char *board_sn); - int (* gs_get_uav_hardware_version)(void *ctx,char *hw_ver); - int (* gs_get_uav_power_status)(void *ctx,uint8_t *power_status,uint8_t *arm_flag); - int (* gs_get_uav_camera_type)(void *ctx,uint8_t *cam_type); - int (* gs_get_liveview_fps)(void *ctx,uint8_t *lv_fps); - int (* gs_fbdev_open)(void); - int (* gs_fbdev_disp_frame)(int *frm_id); - int (* gs_fbdev_close)(void); - int (* gs_record_liveview)(void *ctx,bool b_record); - int (* gs_liveview_get_state)(void *ctx,int *lv_rec_state); - int (* gs_lv_transcode_get_looping_mode)(void *ctx); - int (* gs_lv_transcode_set_looping_mode)(void *ctx,int rec_mode);//(void *ctx,record_mode_t rec_mode) - int (* gs_lv_transcode_get_state)(void *ctx); - int (* gs_lv_transcode_record)(void *ctx,bool b_record,Record_sender sender); - int (* gs_lv_transcode_get_rec_time)(void *ctx,int *rec_time); - int (* gs_enable_audio_liveview)(void *ctx,bool b_enable); - int (* gs_get_frame_delay_e2e)(void *ctx,uint16_t *delay); - int (* gs_get_chnl_status)(void *ctx,uint16_t *chnl_status); - int (* gs_get_pigeon_battery_info)(void *ctx,void *vol);//(void *ctx,gs_battery_voltage_t *vol) - int (* gs_get_sd_status)(void *ctx,int type,uint8_t *sd_status,uint32_t *total_kbytes,uint32_t *free_kbytes); - int (* gs_pwm_buzzer_playback)(void *ctx,int freq,int duty,int delay_ms); - int (* gs_pwm_buzzer_enable_bat)(void *ctx,bool enable); -}; +void setupVTXManager(); +void changeChannel(int8_t channel); \ No newline at end of file From cc1be2107bf6be43a54f7c32516192e328500a2c Mon Sep 17 00:00:00 2001 From: Jesus Lopez Garcia Date: Sun, 21 Jan 2024 11:57:39 +0100 Subject: [PATCH 9/9] Experimental: Trying to make public chnl method available --- jni/rec/rec_shim.h | 86 +++++++++++++++++++++++++++++++++++++++++- jni/util/vtx_manager.c | 2 +- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/jni/rec/rec_shim.h b/jni/rec/rec_shim.h index 0bbc93b..09132d7 100644 --- a/jni/rec/rec_shim.h +++ b/jni/rec/rec_shim.h @@ -5649,8 +5649,90 @@ struct __gs_gui_config int (*get_sd_status)(void *, int, uint8_t *, uint32_t *, uint32_t *); int (*play_pwm_buzzer)(void *, int, int, int); int (*buzzer_enable_bat)(void *, _Bool); - void * gs_info; - int (*gs_modem_set_public_chnl)(void *ctx); + int (* gs_ext_fc_get_battery_mah)(void *ctx,uint16_t *mah); + int (* gs_ext_fc_get_battery_usage)(void *ctx,uint16_t *percent); + int (* gs_ext_fc_get_battery_power)(void *ctx,uint16_t *power); + int (* gs_ext_fc_set_arming_disabled)(void *ctx,uint8_t arming_disabled); + int (* gs_ext_fc_get_arming_disabled)(void *ctx,uint32_t *arming_disabled); + int (* gs_ext_fc_get_version)(void *ctx,uint8_t *major,uint8_t *minor,uint8_t *patch_level); + int (* gs_ext_fc_set_sbus_mode)(void *ctx,uint8_t sbus_mode); + int (* gs_ext_fc_get_racing_osd_info)(void *ctx,void *osdInfo);//(void *ctx,DUSS_MSG_FC_RACING_DRONE_OSD_PUSH_t *osdInfo); + int (* gs_ext_fc_get_osd_position)(void *ctx,int num,bool *activated,int *x,int *y); + int (* gs_ext_fc_get_units)(void *ctx,uint8_t *units); + int (* gs_ext_fc_get_fly_mode)(void *ctx,uint16_t *fly_mode); + int (* gs_ext_fc_get_rtc_date)(void *ctx,void *rtc);//(void *ctx,DUSS_MSG_EXT_FC_RTC_t *rtc); + int (* gs_ext_fc_get_esc_temperature)(void *ctx,uint8_t *temp); + void (* dummy_1)(void); + void (* dummy_2)(void); + int (* gs_media_adjust_fov)(void *ctx,uint32_t scaling,int16_t x,int16_t y); + int (* gs_bl_set_brightness_value)(void *ctx,uint8_t value); + int (* gs_bl_get_brightness_value)(void *ctx,uint8_t *value); + void (* get_device_volume)(void); + void (* set_device_volume)(void); + void (* gs_imu_acc_gyro_calibrate)(char *configfile); + void (* gs_imu_initialize)(void); + void (* gs_imu_destroy)(void); + void (* gs_imu_start)(void); + void (* gs_imu_stop)(void); + void (* gs_imu_get_init_status)(void); + void (* gs_imu_get_attitude)(void); + int (* gs_sd_format_wrap)(void *ctx); + int (* gs_sd_get_info_wrap)(void *ctx,void *sd_info);//(void *ctx,gs_local_sd_info_t *sd_info) + int (* gs_get_battery_info)(void *ctx,void *bat_info);//(void *ctx,DUSS_MSG_RC_BAT_INFO_t *bat_info); + int (* gs_get_device_active_state)(void *ctx,int device_type); + int (* gs_av_in_us_get_brightness)(void *ctx,uint8_t *value); + int (* gs_av_in_us_set_brightness)(void *ctx,uint8_t value); + void (* dummy_3)(void); + int (* gs_av_in_us_get_satutation)(void *ctx,uint8_t *value); + int (* gs_av_in_us_set_saturaton)(void *ctx,uint8_t value); + int (* gs_reset_user_settings)(void *ctx); + int (* gs_ui_event_tracking)(void *ctx,int32_t value,uint8_t event_type,uint8_t event_sub_id); + void (* gs_get_real_flight_stat)(uint8_t *stat); + void (* gs_set_flight_stat)(uint8_t stat); + int (* gs_watermarker_us_get_flag)(void *ctx,uint8_t *value); + int (* gs_watermarker_us_set_flag)(void *ctx,uint8_t value); + int (* gs_watermarker_us_reset)(void *ctx); + int (* gs_player_open)(void *ctx,char *filename); + int (* gs_player_close)(void *ctx); + int (* gs_player_stop)(void *ctx); + int (* gs_player_pause)(void *ctx); + int (* gs_player_resume)(void *ctx); + int (* gs_player_seek_time)(void *ctx,uint32_t time); + int (* gs_player_seek)(void *ctx,uint32_t pos); + int (* gs_player_get_duration)(char *filename,uint32_t *duration); + int (* gs_player_get_cur_time)(void *ctx,uint32_t *cur_time,uint32_t *duration); + int (* gs_player_get_state)(void *ctx,uint32_t *state); + int (* gs_player_get_fileinfo)(char *filename,void *file_info);//(char *filename,vdec_video_file_info_t *file_info); + int (* gs_player_is_playing)(void *ctx,bool *is_playing); + int (* gs_player_delete_file)(char *filename); + int (* gs_send_camera_cmd_async)(void *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_id);//(duss_event_client *event_obj,int cam_cmd,void *msg,uint32_t msg_len,uint16_t seq_ id) + int (* gs_set_camera_param)(void *ctx,uint8_t param_type,uint8_t param); + int (* gs_uav_camera_get_rec_time)(void *ctx,int *mode,int *rec_time); + int (* gs_modem_pairing_control_wrap)(void *ctx,uint32_t ctrl); + void (* dummy_4)(void); + void (* dummy_5)(void); + void (* dummy_6)(void); + void (* dummy_7)(void); + void (* dummy_8)(void); + void (* dummy_9)(void); + void (* dummy_10)(void); + void (* dummy_11)(void); + void (* dummy_12)(void); + void (* dummy_13)(void); + void (* dummy_14)(void); + void (* dummy_15)(void); + void (* dummy_16)(void); + int (* gs_modem_get_link_state_wrap)(void *ctx,gs_link_stat_t *link_stat); + int (* gs_modem_get_bandwidth)(void *ctx,uint16_t *bandwidth); + int (* gs_modem_set_bandwidth)(void *ctx,uint16_t bandwidth); + int (* gs_modem_get_chnl)(void *ctx,uint16_t *chnl_id); + int (* gs_modem_set_chnl_scan_info)(void *ctx,uint8_t chnl_num,uint8_t bandwidth); + int (* gs_modem_rob_chnl_cancel)(void *ctx); + int (* gs_modem_rob_chnl)(void *ctx,uint16_t chnl_id); + int (* gs_modem_get_rob_left_time)(void *ctx,uint8_t *left_time); + int (* gs_modem_get_rob_flag)(void *ctx,uint8_t *flag); + int (* gs_modem_clear_rob_flag)(void *ctx); + int (* gs_modem_set_public_chnl)(void *ctx); }; struct AVCodecParserContext diff --git a/jni/util/vtx_manager.c b/jni/util/vtx_manager.c index bd3c22e..44c30d3 100644 --- a/jni/util/vtx_manager.c +++ b/jni/util/vtx_manager.c @@ -66,7 +66,7 @@ void changeChannel(int8_t channel) { DEBUG_PRINT("VTX_MANAGER: requesting to the goggles to set channel %d\n", channel); if(channel == CHANNEL_PUBLIC){ - gs_gui_config->gs_modem_set_public_chnl(gs_gui_config->gs_info); + gs_gui_config->gs_modem_set_public_chnl(gs_gui_config->ctx); } else { int8_t channelIdx = channel - 1; setChannelPilotOriginal(userSettingsGetInstanceOriginal(), channelIdx, true);