diff --git a/Makefile b/Makefile index 8ef29e0914..c083a61906 100644 --- a/Makefile +++ b/Makefile @@ -536,15 +536,6 @@ endif ifneq ($(filter VCP,$(FEATURES)),) TARGET_SRC += $(VCP_SRC) endif - -ifneq ($(filter VTX_SOFT, $(FEATURES)),) -TARGET_SRC += $(SRC_DIR)/drivers/rtc6705_soft_spi.c -endif - -ifneq ($(filter MAX_OSD, $(FEATURES)),) -TARGET_SRC += $(SRC_DIR)/drivers/max7456.c \ - $(SRC_DIR)/io/osd.c -endif # end target specific make file checks diff --git a/src/main/config/config.c b/src/main/config/config.c index 8f94f7de61..6cc4d50188 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -424,12 +424,6 @@ static void resetConf(void) resetOsdConfig(); #endif -#ifdef USE_RTC6705 - featureSet(FEATURE_VTX); - masterConfig.vtx_channel = 19; // default to Boscam E channel 4 - masterConfig.vtx_power = 1; -#endif - #ifdef BOARD_HAS_VOLTAGE_DIVIDER // only enable the VBAT feature by default if the board has a voltage divider otherwise // the user may see incorrect readings and unexpected issues with pin mappings may occur. diff --git a/src/main/drivers/max7456.c b/src/main/drivers/max7456.c index f82473cba6..b8a59bcfc9 100644 --- a/src/main/drivers/max7456.c +++ b/src/main/drivers/max7456.c @@ -36,8 +36,6 @@ #define DISABLE_MAX7456 IOHi(max7456CsPin) #define ENABLE_MAX7456 IOLo(max7456CsPin) -static IO_t max7456CsPin = IO_NONE; - /** Artificial Horizon limits **/ #define AHIPITCHMAX 200 // Specify maximum AHI pitch value displayed. Default 200 = 20.0 degrees #define AHIROLLMAX 400 // Specify maximum AHI roll value displayed. Default 400 = 40.0 degrees @@ -45,10 +43,11 @@ static IO_t max7456CsPin = IO_NONE; #define AHISIDEBARHEIGHTPOSITION 3 uint16_t max_screen_size; -uint8_t video_signal_type = 0; -uint8_t max7456_lock = 0; char max7456_screen[VIDEO_BUFFER_CHARS_PAL]; +static uint8_t video_signal_type = 0; +static uint8_t max7456_lock = 0; +static IO_t max7456CsPin = IO_NONE; uint8_t max7456_send(uint8_t add, uint8_t data) { spiTransferByte(MAX7456_SPI_INSTANCE, add); @@ -113,19 +112,6 @@ void max7456_init(uint8_t video_system) { DISABLE_MAX7456; delay(100); - - // display logo - x = 160; - for (int i = 1; i < 5; i++) { - for (int j = 3; j < 27; j++) - max7456_screen[i * LINE + j] = (char)x++; - } - tfp_sprintf(buf, "BF VERSION: %s", FC_VERSION_STRING); - max7456_write_string(buf, LINE06+5); - max7456_write_string("MENU: THRT MID", LINE07+7); - max7456_write_string("YAW RIGHT", LINE08+13); - max7456_write_string("PITCH UP", LINE09+13); - max7456_draw_screen(); } // Copy string from ram into screen buffer diff --git a/src/main/drivers/max7456.h b/src/main/drivers/max7456.h index cd33eae5e9..1e04320a88 100644 --- a/src/main/drivers/max7456.h +++ b/src/main/drivers/max7456.h @@ -143,7 +143,7 @@ enum VIDEO_TYPES { AUTO = 0, PAL, NTSC }; extern uint16_t max_screen_size; -char max7456_screen[VIDEO_BUFFER_CHARS_PAL]; +extern char max7456_screen[VIDEO_BUFFER_CHARS_PAL]; void max7456_init(uint8_t system); diff --git a/src/main/drivers/vtx_soft_spi_rtc6705.c b/src/main/drivers/vtx_soft_spi_rtc6705.c index 9dbd17d856..cdeb23d5b4 100644 --- a/src/main/drivers/vtx_soft_spi_rtc6705.c +++ b/src/main/drivers/vtx_soft_spi_rtc6705.c @@ -38,21 +38,13 @@ #define RTC6705_SPILE_ON IOHi(rtc6705LePin) #define RTC6705_SPILE_OFF IOLo(rtc6705LePin) -char *vtx_bands[] = { - "BOSCAM A", - "BOSCAM B", - "BOSCAM E", - "FATSHARK", - "RACEBAND", -}; - -uint16_t vtx_freq[] = +const uint16_t vtx_freq[] = { - 5865, 5845, 5825, 5805, 5785, 5765, 5745, 5725, - 5733, 5752, 5771, 5790, 5809, 5828, 5847, 5866, - 5705, 5685, 5665, 5645, 5885, 5905, 5925, 5945, - 5740, 5760, 5780, 5800, 5820, 5840, 5860, 5880, - 5658, 5695, 5732, 5769, 5806, 5843, 5880, 5917, + 5865, 5845, 5825, 5805, 5785, 5765, 5745, 5725, // Boacam A + 5733, 5752, 5771, 5790, 5809, 5828, 5847, 5866, // Boscam B + 5705, 5685, 5665, 5645, 5885, 5905, 5925, 5945, // Boscam E + 5740, 5760, 5780, 5800, 5820, 5840, 5860, 5880, // FatShark + 5658, 5695, 5732, 5769, 5806, 5843, 5880, 5917, // RaceBand }; uint16_t current_vtx_channel; @@ -127,8 +119,8 @@ void rtc6705_soft_spi_set_channel(uint16_t channel_freq) { rtc6705_write_register(1, (N << 7) | A); } -void rtc6705_soft_spi_set_rf_power(uint8_t power) { - rtc6705_write_register(7, (power ? PA_CONTROL_DEFAULT : (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK)))); +void rtc6705_soft_spi_set_rf_power(uint8_t reduce_power) { + rtc6705_write_register(7, (reduce_power ? (PA_CONTROL_DEFAULT | PD_Q5G_MASK) & (~(PA5G_PW_MASK | PA5G_BS_MASK)) : PA_CONTROL_DEFAULT)); } #endif diff --git a/src/main/drivers/vtx_soft_spi_rtc6705.h b/src/main/drivers/vtx_soft_spi_rtc6705.h index 5f4314de1d..9d67786c3a 100644 --- a/src/main/drivers/vtx_soft_spi_rtc6705.h +++ b/src/main/drivers/vtx_soft_spi_rtc6705.h @@ -17,21 +17,22 @@ #pragma once -#define DP_5G_MASK 0x7000 -#define PA5G_BS_MASK 0x0E00 -#define PA5G_PW_MASK 0x0180 -#define PD_Q5G_MASK 0x0040 -#define QI_5G_MASK 0x0038 -#define PA_BS_MASK 0x0007 +#define DP_5G_MASK 0x7000 +#define PA5G_BS_MASK 0x0E00 +#define PA5G_PW_MASK 0x0180 +#define PD_Q5G_MASK 0x0040 +#define QI_5G_MASK 0x0038 +#define PA_BS_MASK 0x0007 -#define PA_CONTROL_DEFAULT 0x4FBD +#define PA_CONTROL_DEFAULT 0x4FBD +#define CHANNELS_PER_BAND 8 +#define BANDS_NUMBER 5 -extern char* vtx_bands[]; -extern uint16_t vtx_freq[]; +extern uint16_t const vtx_freq[]; extern uint16_t current_vtx_channel; void rtc6705_soft_spi_init(void); void rtc6705_soft_spi_set_channel(uint16_t channel_freq); -void rtc6705_soft_spi_set_rf_power(uint8_t power); +void rtc6705_soft_spi_set_rf_power(uint8_t reduce_power); diff --git a/src/main/io/osd.c b/src/main/io/osd.c index f23134d89f..db4c8ad4e0 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -22,6 +22,7 @@ #include #include "platform.h" +#include "version.h" #include "scheduler/scheduler.h" #include "common/axis.h" @@ -123,57 +124,73 @@ static uint32_t next_osd_update_at = 0; -static uint32_t armed_seconds = 0; -static uint32_t armed_at = 0; -static bool armed = false; +static uint32_t armed_seconds = 0; +static uint32_t armed_at = 0; +static uint8_t armed = 0; + +static uint8_t current_page = 0; +static uint8_t sticks[] = {0,0,0,0}; + +static uint8_t cursor_row = 255; +static uint8_t cursor_col = 0; +static uint8_t in_menu = 0; +static uint8_t activating_menu = 0; -static uint8_t current_page = 0; -static uint8_t sticks[] = {0,0,0,0}; static char string_buffer[30]; -static uint8_t cursor_row = 255; -static uint8_t cursor_col = 0; -static bool in_menu = false; -static bool activating_menu = false; + extern uint16_t rssi; +enum { + MENU_VALUE_DECREASE = 0, + MENU_VALUE_INCREASE, +}; #ifdef USE_RTC6705 -void update_vtx_band(bool increase, uint8_t col) { - (void)col; - if (increase) { - if (current_vtx_channel < 32) - current_vtx_channel += 8; + +static const char *vtx_bands[] = { + "BOSCAM A", + "BOSCAM B", + "BOSCAM E", + "FATSHARK", + "RACEBAND", +}; + +void update_vtx_band(int value_change_direction, uint8_t col) { + UNUSED(col); + if (value_change_direction) { + if (current_vtx_channel < (BANDS_NUMBER * CHANNELS_PER_BAND - CHANNELS_PER_BAND)) + current_vtx_channel += CHANNELS_PER_BAND; } else { - if (current_vtx_channel > 7) - current_vtx_channel -= 8; + if (current_vtx_channel >= CHANNELS_PER_BAND) + current_vtx_channel -= CHANNELS_PER_BAND; } } void print_vtx_band(uint16_t pos, uint8_t col) { - (void)col; - sprintf(string_buffer, "%s", vtx_bands[current_vtx_channel / 8]); + UNUSED(col); + sprintf(string_buffer, "%s", vtx_bands[current_vtx_channel / CHANNELS_PER_BAND]); max7456_write_string(string_buffer, pos); } -void update_vtx_channel(bool increase, uint8_t col) { - (void)col; - if (increase) { - if ((current_vtx_channel % 8) < 7) +void update_vtx_channel(int value_change_direction, uint8_t col) { + UNUSED(col); + if (value_change_direction) { + if ((current_vtx_channel % CHANNELS_PER_BAND) < (CHANNELS_PER_BAND - 1)) current_vtx_channel++; } else { - if ((current_vtx_channel % 8) > 0) + if ((current_vtx_channel % CHANNELS_PER_BAND) > 0) current_vtx_channel--; } } void print_vtx_channel(uint16_t pos, uint8_t col) { - (void)col; - sprintf(string_buffer, "%d", current_vtx_channel % 8 + 1); + UNUSED(col); + sprintf(string_buffer, "%d", current_vtx_channel % CHANNELS_PER_BAND + 1); max7456_write_string(string_buffer, pos); } void print_vtx_freq(uint16_t pos, uint8_t col) { - (void)col; + UNUSED(col); sprintf(string_buffer, "%d M", vtx_freq[current_vtx_channel]); max7456_write_string(string_buffer, pos); } @@ -243,8 +260,9 @@ void print_tpa_brkpt(uint16_t pos, uint8_t col) { } } -void update_int_pid(bool inc, uint8_t col, int pid_term) { +void update_int_pid(int value_change_direction, uint8_t col, int pid_term) { void* ptr; + switch(col) { case 0: ptr = ¤tProfile->pidProfile.P8[pid_term]; @@ -259,7 +277,7 @@ void update_int_pid(bool inc, uint8_t col, int pid_term) { return; } - if (inc) { + if (value_change_direction) { if (*(uint8_t*)ptr < 200) *(uint8_t*)ptr += 1; } else { @@ -268,21 +286,22 @@ void update_int_pid(bool inc, uint8_t col, int pid_term) { } } -void update_roll_pid(bool inc, uint8_t col) { - update_int_pid(inc, col, ROLL); +void update_roll_pid(int value_change_direction, uint8_t col) { + update_int_pid(value_change_direction, col, ROLL); } -void update_pitch_pid(bool inc, uint8_t col) { - update_int_pid(inc, col, PITCH); +void update_pitch_pid(int value_change_direction, uint8_t col) { + update_int_pid(value_change_direction, col, PITCH); } -void update_yaw_pid(bool inc, uint8_t col) { - update_int_pid(inc, col, YAW); +void update_yaw_pid(int value_change_direction, uint8_t col) { + update_int_pid(value_change_direction, col, YAW); } -void update_roll_rate(bool inc, uint8_t col) { - (void)col; - if (inc) { +void update_roll_rate(int value_change_direction, uint8_t col) { + UNUSED(col); + + if (value_change_direction) { if (currentControlRateProfile->rates[FD_ROLL] < CONTROL_RATE_CONFIG_ROLL_PITCH_RATE_MAX) currentControlRateProfile->rates[FD_ROLL]++; } else { @@ -291,9 +310,10 @@ void update_roll_rate(bool inc, uint8_t col) { } } -void update_pitch_rate(bool increase, uint8_t col) { - (void)col; - if (increase) { +void update_pitch_rate(int value_change_direction, uint8_t col) { + UNUSED(col); + + if (value_change_direction) { if (currentControlRateProfile->rates[FD_PITCH] < CONTROL_RATE_CONFIG_ROLL_PITCH_RATE_MAX) currentControlRateProfile->rates[FD_PITCH]++; } else { @@ -302,9 +322,10 @@ void update_pitch_rate(bool increase, uint8_t col) { } } -void update_yaw_rate(bool increase, uint8_t col) { - (void)col; - if (increase) { +void update_yaw_rate(int value_change_direction, uint8_t col) { + UNUSED(col); + + if (value_change_direction) { if (currentControlRateProfile->rates[FD_YAW] < CONTROL_RATE_CONFIG_YAW_RATE_MAX) currentControlRateProfile->rates[FD_YAW]++; } else { @@ -313,9 +334,10 @@ void update_yaw_rate(bool increase, uint8_t col) { } } -void update_tpa_rate(bool increase, uint8_t col) { - (void)col; - if (increase) { +void update_tpa_rate(int value_change_direction, uint8_t col) { + UNUSED(col); + + if (value_change_direction) { if (currentControlRateProfile->dynThrPID < CONTROL_RATE_CONFIG_TPA_MAX) currentControlRateProfile->dynThrPID++; } else { @@ -324,9 +346,10 @@ void update_tpa_rate(bool increase, uint8_t col) { } } -void update_tpa_brkpt(bool increase, uint8_t col) { - (void)col; - if (increase) { +void update_tpa_brkpt(int value_change_direction, uint8_t col) { + UNUSED(col); + + if (value_change_direction) { if (currentControlRateProfile->tpa_breakpoint < PWM_RANGE_MAX) currentControlRateProfile->tpa_breakpoint++; } else { @@ -336,13 +359,15 @@ void update_tpa_brkpt(bool increase, uint8_t col) { } void print_average_system_load(uint16_t pos, uint8_t col) { - (void)col; + UNUSED(col); + sprintf(string_buffer, "%d", averageSystemLoadPercent); max7456_write_string(string_buffer, pos); } void print_batt_voltage(uint16_t pos, uint8_t col) { - (void)col; + UNUSED(col); + sprintf(string_buffer, "%d.%1d", vbat / 10, vbat % 10); max7456_write_string(string_buffer, pos); } @@ -503,7 +528,7 @@ void show_menu(void) { } } else { if (menu_pages[current_page].rows[cursor_row].update) - menu_pages[current_page].rows[cursor_row].update(true, cursor_col); + menu_pages[current_page].rows[cursor_row].update(MENU_VALUE_INCREASE, cursor_col); } } @@ -514,7 +539,7 @@ void show_menu(void) { } } else { if (menu_pages[current_page].rows[cursor_row].update) - menu_pages[current_page].rows[cursor_row].update(false, cursor_col); + menu_pages[current_page].rows[cursor_row].update(MENU_VALUE_DECREASE, cursor_col); } } @@ -697,10 +722,24 @@ void updateOsd(void) } } - void osdInit(void) { + uint16_t x; + max7456_init(masterConfig.osdProfile.video_system); + + // display logo and help + x = 160; + for (int i = 1; i < 5; i++) { + for (int j = 3; j < 27; j++) + max7456_screen[i * LINE + j] = (char)x++; + } + sprintf(string_buffer, "BF VERSION: %s", FC_VERSION_STRING); + max7456_write_string(string_buffer, LINE06 + 5); + max7456_write_string("MENU: THRT MID", LINE07 + 7); + max7456_write_string("YAW RIGHT", LINE08 + 13); + max7456_write_string("PITCH UP", LINE09 + 13); + max7456_draw_screen(); } void resetOsdConfig(void) diff --git a/src/main/io/osd.h b/src/main/io/osd.h index 82932b14c7..e348e4573c 100644 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -25,7 +25,7 @@ typedef struct { typedef struct { const char* title; - void (*update)(bool increase, uint8_t col); + void (*update)(int value_change_direction, uint8_t col); void (*print)(uint16_t pos, uint8_t col); } osd_row_t; diff --git a/src/main/main.c b/src/main/main.c index 6ab9e369f7..5aa3151e39 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -471,7 +471,7 @@ void init(void) #endif #ifdef USE_RTC6705 - if (feature(feature(FEATURE_VTX))) { + if (feature(FEATURE_VTX)) { rtc6705_soft_spi_init(); current_vtx_channel = masterConfig.vtx_channel; rtc6705_soft_spi_set_channel(vtx_freq[current_vtx_channel]); diff --git a/src/main/target/SIRINFPV/target.h b/src/main/target/SIRINFPV/target.h index 667f6d173b..c27b1ec689 100644 --- a/src/main/target/SIRINFPV/target.h +++ b/src/main/target/SIRINFPV/target.h @@ -135,7 +135,7 @@ // Performance logging for SD card operations: // #define AFATFS_USE_INTROSPECTIVE_LOGGING - +#define DEFAULT_FEATURES (FEATURE_BLACKBOX | FEATURE_RX_SERIAL | FEATURE_OSD | FEATURE_VTX) #define USE_ADC #define BOARD_HAS_VOLTAGE_DIVIDER diff --git a/src/main/target/SIRINFPV/target.mk b/src/main/target/SIRINFPV/target.mk index 39004bec7e..945fb1fe9d 100644 --- a/src/main/target/SIRINFPV/target.mk +++ b/src/main/target/SIRINFPV/target.mk @@ -1,5 +1,5 @@ F3_TARGETS += $(TARGET) -FEATURES = VCP SDCARD MAX_OSD SOFT_VTX +FEATURES = VCP SDCARD TARGET_SRC = \ drivers/accgyro_mpu.c \ @@ -12,5 +12,7 @@ TARGET_SRC = \ drivers/flash_m25p16.c \ drivers/light_ws2811strip.c \ drivers/light_ws2811strip_stm32f30x.c \ - drivers/vtx_soft_spi_rtc6705.c + drivers/vtx_soft_spi_rtc6705.c \ + drivers/max7456.c \ + io/osd.c