diff --git a/flight/modules/UAVOHottBridge/inc/uavohottbridge.h b/flight/modules/UAVOHottBridge/inc/uavohottbridge.h index 51d8473da..7d2403aa5 100644 --- a/flight/modules/UAVOHottBridge/inc/uavohottbridge.h +++ b/flight/modules/UAVOHottBridge/inc/uavohottbridge.h @@ -147,6 +147,16 @@ #define HOTT_TONE_X 24 // maximum input voltage #define HOTT_TONE_Y 25 // maximum rpm #define HOTT_TONE_Z 26 // maximum height +#define HOTT_TONE_27 27 // sudden descent +#define HOTT_TONE_28 28 // fast descent +#define HOTT_TONE_29 29 // normal descent +#define HOTT_TONE_30 30 // slow descent +#define HOTT_TONE_31 31 // very slow descent +#define HOTT_TONE_32 32 // very slow rise +#define HOTT_TONE_33 33 // slow rise +#define HOTT_TONE_34 34 // normal rise +#define HOTT_TONE_35 35 // fast rise +#define HOTT_TONE_36 36 // sudden rise #define HOTT_TONE_20M 37 // 20 meters #define HOTT_TONE_40M 38 // 40 meters #define HOTT_TONE_60M 39 // 60 meters @@ -158,7 +168,7 @@ #define HOTT_TONE_400M 47 // 400 meters #define HOTT_TONE_600M 48 // 600 meters #define HOTT_TONE_800M 49 // 800 meters -#define HOTT_TONE_1000M 50 // 10000 meters +#define HOTT_TONE_1000M 50 // 1000 meters #define HOTT_TONE_51 51 // maximum servo temperature #define HOTT_TONE_52 52 // maximum servo position difference @@ -215,9 +225,11 @@ struct telemetrydata { // HoTT menu static const char *const hottTextPageTitle[] = { - "***LIBREPILOT Hott***", + "**LIBREPILOT HoTT****", + "**LIBREPILOT CONFIG**", "*****GPS CONFIG******", - "-----VARIO PAGE------", + "---VARIO WARNINGS----", + "----VARIO LIMITS-----", "------GPS PAGE-------", "--GENERAL AIR PAGE---", "--ELECTRIC AIR PAGE--", @@ -225,16 +237,18 @@ static const char *const hottTextPageTitle[] = { }; typedef enum { - HOTTTEXT_PAGE_MAIN = 0, - HOTTTEXT_PAGE_GPSCONFIG = 1, - HOTTTEXT_PAGE_VARIO = 2, - HOTTTEXT_PAGE_GPS = 3, - HOTTTEXT_PAGE_GENERAL = 4, - HOTTTEXT_PAGE_ELECTRIC = 5, - HOTTTEXT_PAGE_ESC = 6, + HOTTTEXT_PAGE_MAIN = 0, + HOTTTEXT_PAGE_MAINCONFIG = 1, + HOTTTEXT_PAGE_GPSCONFIG = 2, + HOTTTEXT_PAGE_VARIOWARNINGS = 3, + HOTTTEXT_PAGE_VARIOLIMITS = 4, + HOTTTEXT_PAGE_GPS = 5, + HOTTTEXT_PAGE_GENERAL = 6, + HOTTTEXT_PAGE_ELECTRIC = 7, + HOTTTEXT_PAGE_ESC = 8, } hottTextPageElem; -#define HOTTTEXT_PAGE_NUMELEM 7 +#define HOTTTEXT_PAGE_NUMELEM 9 typedef enum { HOTTTEXT_EDITSTATUS_STEP1 = 0, @@ -245,6 +259,18 @@ typedef enum { HOTTTEXT_EDITSTATUS_DONE = 5, } hottTextEditStatusElem; +static const char *const hottTextADCpinNames[] = { + "----", + "ADC0", + "ADC1", + "ADC2", + "ADC3", + "ADC4", + "ADC5", + "ADC6", + "ADC7" +}; + // VARIO Module message structure struct hott_vario_message { uint8_t start; // start byte diff --git a/flight/modules/UAVOHottBridge/uavohottbridge.c b/flight/modules/UAVOHottBridge/uavohottbridge.c index 89cd0a68e..25dde6197 100644 --- a/flight/modules/UAVOHottBridge/uavohottbridge.c +++ b/flight/modules/UAVOHottBridge/uavohottbridge.c @@ -53,6 +53,8 @@ #include "velocitystate.h" #include "hottbridgestatus.h" #include "hottbridgesettings.h" +#include "flightbatterysettings.h" +#include "hwsettings.h" #include "revosettings.h" #include "gpssettings.h" #include "homelocation.h" @@ -65,11 +67,13 @@ #if defined(PIOS_INCLUDE_HOTT_BRIDGE) #if defined(PIOS_HoTT_STACK_SIZE) -#define STACK_SIZE_BYTES PIOS_HoTT_STACK_SIZE +#define STACK_SIZE_BYTES PIOS_HoTT_STACK_SIZE #else -#define STACK_SIZE_BYTES 2048 +#define STACK_SIZE_BYTES 2048 #endif -#define TASK_PRIORITY CALLBACK_TASK_AUXILIARY +#define TASK_PRIORITY CALLBACK_TASK_AUXILIARY + +#define ADC_XX_PIN_NOTFOUND -1 static bool module_enabled = false; @@ -91,9 +95,10 @@ static uint8_t get_page(uint8_t page, bool next); static uint8_t enable_disable_warning(uint8_t value); static uint8_t enable_disable_sensor(uint8_t value); static int16_t get_new_value(int16_t current_value, int8_t value_change, uint8_t step, int16_t min, int16_t max); +static int8_t get_newADCPin_value(uint8_t *adcRouting, int8_t from_pin, int8_t value_change); static uint8_t calc_checksum(uint8_t *data, uint16_t size); static uint8_t generate_warning(); -static void store_settings(uint8_t page); +static void store_settings(uint8_t page, uint8_t current_line); static void update_telemetrydata(); static void convert_long2gps(int32_t value, uint8_t *dir, uword_t *min, uword_t *sec); static uint8_t scale_float2uint8(float value, float scale, float offset); @@ -219,9 +224,9 @@ static void uavoHoTTBridgeTask(__attribute__((unused)) void *parameters) int8_t value_change = 0; static uint8_t step_change = 0; - // define allowed edited lines for Main, GPS config, Vario, Gps, General, Electric and Esc pages - uint8_t min_line[] = { 2, 2, 2, 2, 2, 2, 2 }; - uint8_t max_line[] = { 6, 5, 7, 7, 7, 7, 7 }; + // define allowed edited lines for Main, Main Config, GPS config, VarioWarnings, VarioLimits, GPS, General, Electric and Esc pages + uint8_t min_line[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2 }; + uint8_t max_line[] = { 6, 7, 5, 8, 7, 7, 7, 7, 7 }; static uint8_t page = HOTTTEXT_PAGE_MAIN; static uint8_t edit_status = HOTTTEXT_EDITSTATUS_DONE; @@ -251,7 +256,7 @@ static void uavoHoTTBridgeTask(__attribute__((unused)) void *parameters) value_change = 0; step_change = 0; if (edit_status != HOTTTEXT_EDITSTATUS_DONE) { - store_settings(page); + store_settings(page, current_line); edit_line = false; // exit edit mode } break; @@ -285,7 +290,7 @@ static void uavoHoTTBridgeTask(__attribute__((unused)) void *parameters) // (this inhibit normal page browsing and give direct access to sensor page) switch (id_sensor) { case (HOTT_VARIO_ID & 0x0f): - page = HOTTTEXT_PAGE_VARIO; + page = HOTTTEXT_PAGE_VARIOWARNINGS; break; case (HOTT_GPS_ID & 0x0f): page = HOTTTEXT_PAGE_GPS; @@ -319,7 +324,7 @@ static void uavoHoTTBridgeTask(__attribute__((unused)) void *parameters) message_size = sizeof(tx_buffer); if (edit_status == HOTTTEXT_EDITSTATUS_DONE) { // Save and exit edit mode - store_settings(page); + store_settings(page, current_line); edit_line = false; } else if (edit_line) { step_change = edit_status; @@ -704,6 +709,8 @@ uint16_t build_ESC_message(struct hott_esc_message *msg) uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t current_line, int8_t value_change, uint8_t step, bool edit_mode, bool exit_menu) { + update_telemetrydata(); + // clear message buffer memset(msg, 0, sizeof(*msg)); @@ -717,31 +724,30 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t HoTTBridgeSettingsLimitData alarmLimits; HoTTBridgeSettingsWarningData alarmWarning; RevoSettingsFusionAlgorithmOptions revoFusionAlgo; + FlightBatterySettingsSensorCalibrationsData battSensorCalibration; HomeLocationSetOptions homeSet; GPSSettingsData gpsSettings; + uint8_t adcRouting[HWSETTINGS_ADCROUTING_NUMELEM]; uint8_t edit_status = step; - bool ekf_enabled = false; // page title snprintf(msg->text[0], HOTT_TEXT_COLUMNS, "%s", hottTextPageTitle[page]); // line 1 // compute page content switch (page) { - case HOTTTEXT_PAGE_VARIO: // Vario page - if (RevoSettingsHandle() != NULL) { - RevoSettingsFusionAlgorithmGet(&revoFusionAlgo); - } + case HOTTTEXT_PAGE_VARIOWARNINGS: // Vario page (Warnings) if (HoTTBridgeSettingsHandle() != NULL) { HoTTBridgeSettingsWarningGet(&alarmWarning); - HoTTBridgeSettingsLimitGet(&alarmLimits); } - bool edit_altitudebeep = (edit_mode && (current_line == 2)); - bool edit_maxheight = (edit_mode && (current_line == 3)); - bool edit_minheight = (edit_mode && (current_line == 4)); - bool edit_maxheight_value = (edit_mode && (current_line == 5)); - bool edit_minheight_value = (edit_mode && (current_line == 6)); + bool edit_altitudebeep = (edit_mode && (current_line == 2)); + bool edit_maxheight = (edit_mode && (current_line == 3)); + bool edit_minheight = (edit_mode && (current_line == 4)); + bool edit_sinkrate1s = (edit_mode && (current_line == 5)); + bool edit_climbrate1s = (edit_mode && (current_line == 6)); + bool edit_sinkrate3s = (edit_mode && (current_line == 7)); + bool edit_climbrate3s = (edit_mode && (current_line == 8)); if (edit_altitudebeep) { alarmWarning.AltitudeBeep = enable_disable_warning(alarmWarning.AltitudeBeep); @@ -759,6 +765,50 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t edit_status = HOTTTEXT_EDITSTATUS_DONE; } + if (edit_sinkrate1s) { + alarmWarning.NegDifference1 = enable_disable_warning(alarmWarning.NegDifference1); + HoTTBridgeSettingsWarningSet(&alarmWarning); + edit_status = HOTTTEXT_EDITSTATUS_DONE; + } + if (edit_climbrate1s) { + alarmWarning.PosDifference1 = enable_disable_warning(alarmWarning.PosDifference1); + HoTTBridgeSettingsWarningSet(&alarmWarning); + edit_status = HOTTTEXT_EDITSTATUS_DONE; + } + if (edit_sinkrate3s) { + alarmWarning.NegDifference2 = enable_disable_warning(alarmWarning.NegDifference2); + HoTTBridgeSettingsWarningSet(&alarmWarning); + edit_status = HOTTTEXT_EDITSTATUS_DONE; + } + if (edit_climbrate3s) { + alarmWarning.PosDifference2 = enable_disable_warning(alarmWarning.PosDifference2); + HoTTBridgeSettingsWarningSet(&alarmWarning); + edit_status = HOTTTEXT_EDITSTATUS_DONE; + } + + snprintf(msg->text[1], HOTT_TEXT_COLUMNS, " Altitude speak [%1s] ", ((alarmWarning.AltitudeBeep == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 2 + snprintf(msg->text[2], HOTT_TEXT_COLUMNS, " MaxHeight [%1s] ", ((alarmWarning.MaxHeight == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 3 + snprintf(msg->text[3], HOTT_TEXT_COLUMNS, " MinHeight [%1s] ", ((alarmWarning.MinHeight == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 4 + snprintf(msg->text[4], HOTT_TEXT_COLUMNS, " Instant Sink [%1s] ", ((alarmWarning.NegDifference1 == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 5 + snprintf(msg->text[5], HOTT_TEXT_COLUMNS, " Instant Climb [%1s] ", ((alarmWarning.PosDifference1 == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 6 + snprintf(msg->text[6], HOTT_TEXT_COLUMNS, " Fast Sink [%1s] ", ((alarmWarning.NegDifference2 == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 7 + snprintf(msg->text[7], HOTT_TEXT_COLUMNS, " Fast Climb [%1s] ", ((alarmWarning.PosDifference2 == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 8 + if (current_line > 1) { + msg->text[current_line - 1][0] = '>'; + } + break; + case HOTTTEXT_PAGE_VARIOLIMITS: // Vario page (Limits) + if (HoTTBridgeSettingsHandle() != NULL) { + HoTTBridgeSettingsLimitGet(&alarmLimits); + } + + bool edit_maxheight_value = (edit_mode && (current_line == 2)); + bool edit_minheight_value = (edit_mode && (current_line == 3)); + bool edit_sinkrate1s_value = (edit_mode && (current_line == 4)); + bool edit_climbrate1s_value = (edit_mode && (current_line == 5)); + bool edit_sinkrate3s_value = (edit_mode && (current_line == 6)); + bool edit_climbrate3s_value = (edit_mode && (current_line == 7)); + if (edit_minheight_value) { step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; // -500 to 500m @@ -771,65 +821,50 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t alarmLimits.MaxHeight = get_new_value((int16_t)alarmLimits.MaxHeight, value_change, step, -500, 1500); HoTTBridgeSettingsLimitSet(&alarmLimits); } - - char *txt_fusionalgo = ""; - // check current algo status - switch (revoFusionAlgo) { - case REVOSETTINGS_FUSIONALGORITHM_INS13INDOOR: - case REVOSETTINGS_FUSIONALGORITHM_TESTINGINSINDOORCF: - txt_fusionalgo = "* EKF INDOOR NOGPS * "; - ekf_enabled = true; - break; - case REVOSETTINGS_FUSIONALGORITHM_GPSNAVIGATIONINS13: - case REVOSETTINGS_FUSIONALGORITHM_GPSNAVIGATIONINS13CF: - txt_fusionalgo = " * EKF OUTDOOR GPS * "; - ekf_enabled = true; - break; - case REVOSETTINGS_FUSIONALGORITHM_BASICCOMPLEMENTARY: - case REVOSETTINGS_FUSIONALGORITHM_COMPLEMENTARYMAG: - case REVOSETTINGS_FUSIONALGORITHM_COMPLEMENTARYMAGGPSOUTDOOR: - default: - txt_fusionalgo = " * BASIC ALGO * "; - ekf_enabled = false; + if (edit_sinkrate1s_value) { + step = (step > HOTTTEXT_EDITSTATUS_STEP10) ? HOTTTEXT_EDITSTATUS_STEP10 : step; + // 0 to -50m + alarmLimits.NegDifference1 = get_new_value((int16_t)alarmLimits.NegDifference1, value_change, step, -50, 0); + HoTTBridgeSettingsLimitSet(&alarmLimits); } - if (edit_mode && (current_line == 7)) { - // check if a GPS is available - bool gps_ok = (telestate->SysAlarms.Alarm.GPS != SYSTEMALARMS_ALARM_UNINITIALISED) && (telestate->SysAlarms.Alarm.GPS != SYSTEMALARMS_ALARM_ERROR); - if (gps_ok) { - if (ekf_enabled) { - revoFusionAlgo = REVOSETTINGS_FUSIONALGORITHM_BASICCOMPLEMENTARY; // move to Basic (no mag needed) - } else { - revoFusionAlgo = REVOSETTINGS_FUSIONALGORITHM_GPSNAVIGATIONINS13CF; // move to ekf - } - } else { - // without GPS - if (ekf_enabled) { - revoFusionAlgo = REVOSETTINGS_FUSIONALGORITHM_BASICCOMPLEMENTARY; // move to Basic (no mag needed) - } else { - revoFusionAlgo = REVOSETTINGS_FUSIONALGORITHM_TESTINGINSINDOORCF; // move to ekf - } - } - RevoSettingsFusionAlgorithmSet(&revoFusionAlgo); - UAVObjSave(RevoSettingsHandle(), 0); - edit_status = HOTTTEXT_EDITSTATUS_DONE; + if (edit_climbrate1s_value) { + step = (step > HOTTTEXT_EDITSTATUS_STEP10) ? HOTTTEXT_EDITSTATUS_STEP10 : step; + // 0 to 50m + alarmLimits.PosDifference1 = get_new_value((int16_t)alarmLimits.PosDifference1, value_change, step, 0, 50); + HoTTBridgeSettingsLimitSet(&alarmLimits); + } + if (edit_sinkrate3s_value) { + step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; + // 0 to -500m + alarmLimits.NegDifference2 = get_new_value((int16_t)alarmLimits.NegDifference2, value_change, step, -500, 0); + HoTTBridgeSettingsLimitSet(&alarmLimits); + } + if (edit_climbrate3s_value) { + step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; + // 0 to 500m + alarmLimits.PosDifference2 = get_new_value((int16_t)alarmLimits.PosDifference2, value_change, step, 0, 500); + HoTTBridgeSettingsLimitSet(&alarmLimits); } - snprintf(msg->text[1], HOTT_TEXT_COLUMNS, " Altitude speak [%1s] ", ((alarmWarning.AltitudeBeep == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 2 - snprintf(msg->text[2], HOTT_TEXT_COLUMNS, " MaxHeight warn [%1s] ", ((alarmWarning.MaxHeight == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 3 - snprintf(msg->text[3], HOTT_TEXT_COLUMNS, " MinHeight warn [%1s] ", ((alarmWarning.MinHeight == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 4 - snprintf(msg->text[4], HOTT_TEXT_COLUMNS, " Max height %4d ", (int16_t)alarmLimits.MaxHeight); // line 5 - snprintf(msg->text[5], HOTT_TEXT_COLUMNS, " Min height %4d ", (int16_t)alarmLimits.MinHeight); // line 6 - snprintf(msg->text[6], HOTT_TEXT_COLUMNS, " Use EKF algo [%1s] ", ((ekf_enabled) ? "*" : " ")); // line 7 - snprintf(msg->text[7], HOTT_TEXT_COLUMNS, "%s", txt_fusionalgo); // line 8 + snprintf(msg->text[1], HOTT_TEXT_COLUMNS, " Max height %4d ", (int16_t)alarmLimits.MaxHeight); // line 2 + snprintf(msg->text[2], HOTT_TEXT_COLUMNS, " Min height %4d ", (int16_t)alarmLimits.MinHeight); // line 3 + snprintf(msg->text[3], HOTT_TEXT_COLUMNS, " Inst. Sink m/s %3d ", (int16_t)alarmLimits.NegDifference1); // line 4 + snprintf(msg->text[4], HOTT_TEXT_COLUMNS, " Inst. Climb m/s %3d ", (int16_t)alarmLimits.PosDifference1); // line 5 + snprintf(msg->text[5], HOTT_TEXT_COLUMNS, " Fast Sink m/3s %4d ", (int16_t)alarmLimits.NegDifference2); // line 6 + snprintf(msg->text[6], HOTT_TEXT_COLUMNS, " Fast Climb m/3s%4d ", (int16_t)alarmLimits.PosDifference2); // line 7 + snprintf(msg->text[7], HOTT_TEXT_COLUMNS, " "); // line 8 if (current_line > 1) { msg->text[current_line - 1][0] = '>'; } - if (edit_minheight_value) { + if (edit_minheight_value || edit_maxheight_value) { reverse_pixels((char *)msg->text[current_line - 1], 16 + (3 - step), 20 - step); } - if (edit_maxheight_value) { - reverse_pixels((char *)msg->text[current_line - 1], 16 + (3 - step), 20 - step); + if (edit_sinkrate1s_value || edit_climbrate1s_value) { + reverse_pixels((char *)msg->text[current_line - 1], 18 + (1 - step), 20 - step); + } + if (edit_sinkrate3s_value || edit_climbrate3s_value) { + reverse_pixels((char *)msg->text[current_line - 1], 17 + (2 - step), 20 - step); } break; case HOTTTEXT_PAGE_GPS: // GPS page @@ -860,6 +895,7 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t HoTTBridgeSettingsWarningSet(&alarmWarning); edit_status = HOTTTEXT_EDITSTATUS_DONE; } + if (edit_maxdistance_value) { step = (step > HOTTTEXT_EDITSTATUS_STEP1K) ? HOTTTEXT_EDITSTATUS_STEP1K : step; // 10m to 9000m @@ -867,18 +903,17 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t HoTTBridgeSettingsLimitSet(&alarmLimits); } if (edit_maxspeed_value) { - // 0kmh to 600kmh + // 0kmh to 1000kmh step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; - alarmLimits.MaxSpeed = get_new_value((int16_t)alarmLimits.MaxSpeed, value_change, step, 0, 600); + alarmLimits.MaxSpeed = get_new_value((int16_t)alarmLimits.MaxSpeed, value_change, step, 0, 1000); HoTTBridgeSettingsLimitSet(&alarmLimits); } if (edit_minspeed_value) { - // 0kmh to 150kmh + // 0kmh to 1000kmh step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; - alarmLimits.MinSpeed = get_new_value((int16_t)alarmLimits.MinSpeed, value_change, step, 0, 600); + alarmLimits.MinSpeed = get_new_value((int16_t)alarmLimits.MinSpeed, value_change, step, 0, 1000); HoTTBridgeSettingsLimitSet(&alarmLimits); } - snprintf(msg->text[1], HOTT_TEXT_COLUMNS, " MaxDist warn [%1s] ", ((alarmWarning.MaxDistance == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 2 snprintf(msg->text[2], HOTT_TEXT_COLUMNS, " MaxSpeed warn [%1s] ", ((alarmWarning.MaxSpeed == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 3 snprintf(msg->text[3], HOTT_TEXT_COLUMNS, " MinSpeed warn [%1s] ", ((alarmWarning.MinSpeed == HOTTBRIDGESETTINGS_WARNING_DISABLED) ? " " : "*")); // line 4 @@ -1010,7 +1045,6 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t snprintf(msg->text[5], HOTT_TEXT_COLUMNS, " "); // line 6 snprintf(msg->text[6], HOTT_TEXT_COLUMNS, " "); // line 7 snprintf(msg->text[7], HOTT_TEXT_COLUMNS, " "); // line 8 - if (current_line > 1) { msg->text[current_line - 1][0] = '>'; } @@ -1034,6 +1068,129 @@ uint8_t build_TEXT_message(struct hott_text_message *msg, uint8_t page, uint8_t reverse_pixels((char *)msg->text[current_line - 1], 18, 20); } break; + case HOTTTEXT_PAGE_MAINCONFIG: + if (RevoSettingsHandle() != NULL) { + RevoSettingsFusionAlgorithmGet(&revoFusionAlgo); + } + if (FlightBatterySettingsHandle() != NULL) { + FlightBatterySettingsSensorCalibrationsGet(&battSensorCalibration); + } + if (HwSettingsHandle() != NULL) { + HwSettingsADCRoutingArrayGet(adcRouting); + } + if (edit_mode && (current_line == 2)) { + if ((value_change > 0) && (revoFusionAlgo < REVOSETTINGS_FUSIONALGORITHM_ACRONOSENSORS)) { + revoFusionAlgo++; + } else if ((value_change < 0) && (revoFusionAlgo > REVOSETTINGS_FUSIONALGORITHM_NONE)) { + revoFusionAlgo--; + } + RevoSettingsFusionAlgorithmSet(&revoFusionAlgo); + } + if (edit_mode && (current_line == 3)) { + step = (step > HOTTTEXT_EDITSTATUS_STEP1K) ? HOTTTEXT_EDITSTATUS_STEP1K : step; + // 1.00 to 30.00 + battSensorCalibration.VoltageFactor = (float)(get_new_value((uint16_t)roundf(battSensorCalibration.VoltageFactor * 100), value_change, step, 100, 3000) / 100.0f); + FlightBatterySettingsSensorCalibrationsSet(&battSensorCalibration); + } + if (edit_mode && (current_line == 4)) { + step = (step > HOTTTEXT_EDITSTATUS_STEP1K) ? HOTTTEXT_EDITSTATUS_STEP1K : step; + // 1.00 to 30.00 + battSensorCalibration.CurrentFactor = (float)(get_new_value((uint16_t)roundf(battSensorCalibration.CurrentFactor * 100), value_change, step, 100, 3000) / 100.0f); + FlightBatterySettingsSensorCalibrationsSet(&battSensorCalibration); + } + if (edit_mode && (current_line == 5)) { + step = (step > HOTTTEXT_EDITSTATUS_STEP100) ? HOTTTEXT_EDITSTATUS_STEP100 : step; + // -9.00 to 9.00 + battSensorCalibration.CurrentZero = (float)(get_new_value((int16_t)roundf(battSensorCalibration.CurrentZero * 100), value_change, step, -900, 900) / 100.0f); + FlightBatterySettingsSensorCalibrationsSet(&battSensorCalibration); + } + + int8_t voltageADCPin = ADC_XX_PIN_NOTFOUND; + int8_t currentADCPin = ADC_XX_PIN_NOTFOUND; + int8_t newADCPin = ADC_XX_PIN_NOTFOUND; + + for (int i = 0; i < HWSETTINGS_ADCROUTING_NUMELEM; i++) { + if (adcRouting[i] == HWSETTINGS_ADCROUTING_BATTERYVOLTAGE) { + voltageADCPin = i; + } + if (adcRouting[i] == HWSETTINGS_ADCROUTING_BATTERYCURRENT) { + currentADCPin = i; + } + } + + if (edit_mode && (current_line == 6)) { + newADCPin = get_newADCPin_value(adcRouting, voltageADCPin, value_change); + adcRouting[voltageADCPin] = HWSETTINGS_ADCROUTING_DISABLED; + if (newADCPin > ADC_XX_PIN_NOTFOUND) { + adcRouting[newADCPin] = HWSETTINGS_ADCROUTING_BATTERYVOLTAGE; + } + HwSettingsADCRoutingArraySet(adcRouting); + } + if (edit_mode && (current_line == 7)) { + newADCPin = get_newADCPin_value(adcRouting, currentADCPin, value_change); + adcRouting[currentADCPin] = HWSETTINGS_ADCROUTING_DISABLED; + if (newADCPin > ADC_XX_PIN_NOTFOUND) { + adcRouting[newADCPin] = HWSETTINGS_ADCROUTING_BATTERYCURRENT; + } + HwSettingsADCRoutingArraySet(adcRouting); + } + + char *txt_fusionalgo = ""; + // check current algo status + switch (revoFusionAlgo) { + case REVOSETTINGS_FUSIONALGORITHM_INS13INDOOR: + txt_fusionalgo = " INS NOGPS "; + break; + case REVOSETTINGS_FUSIONALGORITHM_TESTINGINSINDOORCF: + txt_fusionalgo = "INS+CFNOGPS"; + break; + case REVOSETTINGS_FUSIONALGORITHM_GPSNAVIGATIONINS13: + txt_fusionalgo = " INS GPS "; + break; + case REVOSETTINGS_FUSIONALGORITHM_GPSNAVIGATIONINS13CF: + txt_fusionalgo = " INS+CF GPS"; + break; + case REVOSETTINGS_FUSIONALGORITHM_BASICCOMPLEMENTARY: + txt_fusionalgo = " BASIC "; + break; + case REVOSETTINGS_FUSIONALGORITHM_COMPLEMENTARYMAG: + txt_fusionalgo = " BASIC+MAG "; + break; + case REVOSETTINGS_FUSIONALGORITHM_COMPLEMENTARYMAGGPSOUTDOOR: + txt_fusionalgo = "BASICMAGGPS"; + break; + case REVOSETTINGS_FUSIONALGORITHM_ACRONOSENSORS: + txt_fusionalgo = " ??ACRO?? "; + break; + case REVOSETTINGS_FUSIONALGORITHM_NONE: + txt_fusionalgo = " ??NONE?? "; + break; + default: + txt_fusionalgo = "!UNDEFINED!"; + } + + snprintf(msg->text[1], HOTT_TEXT_COLUMNS, " EstAlgo %s ", txt_fusionalgo); // line 2 + snprintf(msg->text[2], HOTT_TEXT_COLUMNS, " Volt. Factor %2d.%02d ", (uint16_t)(battSensorCalibration.VoltageFactor), (uint16_t)(battSensorCalibration.VoltageFactor * 100) % 100); // line 3 + snprintf(msg->text[3], HOTT_TEXT_COLUMNS, " Curr. Factor %2d.%02d ", (uint16_t)(battSensorCalibration.CurrentFactor), (uint16_t)(battSensorCalibration.CurrentFactor * 100) % 100); // line 4 + snprintf(msg->text[4], HOTT_TEXT_COLUMNS, " Curr. Zero %s%d.%02d ", (battSensorCalibration.CurrentZero < 0 ? "-" : " "), (uint16_t)(fabsf(battSensorCalibration.CurrentZero)), (uint16_t)(fabsf(battSensorCalibration.CurrentZero * 100)) % 100); // line 5 + snprintf(msg->text[5], HOTT_TEXT_COLUMNS, " VoltagePin %s ", hottTextADCpinNames[voltageADCPin + 1]); // line 6 + snprintf(msg->text[6], HOTT_TEXT_COLUMNS, " CurrentPin %s ", hottTextADCpinNames[currentADCPin + 1]); // line 7 + snprintf(msg->text[7], HOTT_TEXT_COLUMNS, "%2d.%02dV %3d.%02dA ", + (uint16_t)(telestate->Battery.Voltage), (uint16_t)(telestate->Battery.Voltage * 100) % 100, + (uint16_t)(telestate->Battery.Current), (uint16_t)(telestate->Battery.Current * 100) % 100); // line 8 + if (current_line > 1) { + msg->text[current_line - 1][0] = '>'; + } + if (edit_mode && (current_line == 2)) { + reverse_pixels((char *)msg->text[current_line - 1], 9, 20); + } + if (edit_mode && ((current_line == 3) || (current_line == 4) || (current_line == 5))) { + reverse_pixels((char *)msg->text[current_line - 1], 14 + (5 - (step > 1 ? step + 1 : step)), 20 - (step > 1 ? step + 1 : step)); + } + if (edit_mode && ((current_line == 6) || (current_line == 7))) { + reverse_pixels((char *)msg->text[current_line - 1], 16, 20); + } + break; default: case HOTTTEXT_PAGE_MAIN: // Main page where HoTT modules can be started if (HoTTBridgeSettingsHandle() != NULL) { @@ -1105,16 +1262,28 @@ uint8_t get_page(uint8_t page, bool next) if (next) { switch (page) { case HOTTTEXT_PAGE_MAIN: + page = HOTTTEXT_PAGE_MAINCONFIG; + break; + case HOTTTEXT_PAGE_MAINCONFIG: if (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED) { page = HOTTTEXT_PAGE_GPSCONFIG; break; } case HOTTTEXT_PAGE_GPSCONFIG: - if (sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) { - page = HOTTTEXT_PAGE_VARIO; + if ((sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GAM == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED)) { + page = HOTTTEXT_PAGE_VARIOWARNINGS; break; } - case HOTTTEXT_PAGE_VARIO: + case HOTTTEXT_PAGE_VARIOWARNINGS: + if ((sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GAM == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED)) { + page = HOTTTEXT_PAGE_VARIOLIMITS; + break; + } + case HOTTTEXT_PAGE_VARIOLIMITS: if (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED) { page = HOTTTEXT_PAGE_GPS; break; @@ -1157,16 +1326,28 @@ uint8_t get_page(uint8_t page, bool next) break; } case HOTTTEXT_PAGE_GPS: - if (sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) { - page = HOTTTEXT_PAGE_VARIO; + if ((sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GAM == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED)) { + page = HOTTTEXT_PAGE_VARIOLIMITS; break; } - case HOTTTEXT_PAGE_VARIO: + case HOTTTEXT_PAGE_VARIOLIMITS: + if ((sensor.VARIO == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GAM == HOTTBRIDGESETTINGS_SENSOR_ENABLED) || + (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED)) { + page = HOTTTEXT_PAGE_VARIOWARNINGS; + break; + } + case HOTTTEXT_PAGE_VARIOWARNINGS: if (sensor.GPS == HOTTBRIDGESETTINGS_SENSOR_ENABLED) { page = HOTTTEXT_PAGE_GPSCONFIG; break; } case HOTTTEXT_PAGE_GPSCONFIG: + page = HOTTTEXT_PAGE_MAINCONFIG; + break; + case HOTTTEXT_PAGE_MAINCONFIG: page = HOTTTEXT_PAGE_MAIN; break; case HOTTTEXT_PAGE_MAIN: @@ -1203,6 +1384,36 @@ uint8_t enable_disable_sensor(uint8_t value) return value; } + +/** + * get new ADCPin for edited field + */ +int8_t get_newADCPin_value(uint8_t *adcRouting, int8_t from_pin, int8_t value_change) +{ + int8_t newADCPin = from_pin; + + if (value_change > 0) { + for (int i = from_pin + 1; i < HWSETTINGS_ADCROUTING_NUMELEM; i++) { + if (adcRouting[i] == HWSETTINGS_ADCROUTING_DISABLED) { + newADCPin = i; + break; + } + } + } else if (value_change < 0) { + for (int i = from_pin - 1; i > ADC_XX_PIN_NOTFOUND - 1; i--) { + if (i < 0) { + newADCPin = ADC_XX_PIN_NOTFOUND; + break; + } + if (adcRouting[i] == HWSETTINGS_ADCROUTING_DISABLED) { + newADCPin = i; + break; + } + } + } + return newADCPin; +} + /** * get new value for edited field */ @@ -1224,11 +1435,12 @@ int16_t get_new_value(int16_t current_value, int8_t value_change, uint8_t step, /** * store settings to onboard flash */ -void store_settings(uint8_t page) +void store_settings(uint8_t page, uint8_t current_line) { switch (page) { case HOTTTEXT_PAGE_MAIN: - case HOTTTEXT_PAGE_VARIO: + case HOTTTEXT_PAGE_VARIOWARNINGS: + case HOTTTEXT_PAGE_VARIOLIMITS: case HOTTTEXT_PAGE_GPS: case HOTTTEXT_PAGE_GENERAL: case HOTTTEXT_PAGE_ELECTRIC: @@ -1238,6 +1450,21 @@ void store_settings(uint8_t page) case HOTTTEXT_PAGE_GPSCONFIG: UAVObjSave(GPSSettingsHandle(), 0); break; + case HOTTTEXT_PAGE_MAINCONFIG: + switch (current_line) { + case 2: + UAVObjSave(RevoSettingsHandle(), 0); + break; + case 3: + case 4: + case 5: + UAVObjSave(FlightBatterySettingsHandle(), 0); + break; + case 6: + case 7: + UAVObjSave(HwSettingsHandle(), 0); + break; + } } } @@ -1494,11 +1721,12 @@ uint8_t generate_warning() } if ((telestate->Settings.Warning.NegDifference2 == HOTTBRIDGESETTINGS_WARNING_ENABLED) && (telestate->Settings.Limit.NegDifference2 > telestate->climbrate3s)) { - return HOTT_TONE_B; // sink rate 3s + return HOTT_TONE_28; // fast descent } if ((telestate->Settings.Warning.NegDifference1 == HOTTBRIDGESETTINGS_WARNING_ENABLED) && - (telestate->Settings.Limit.NegDifference1 > telestate->climbrate1s)) { - return HOTT_TONE_C; // sink rate 1s + (telestate->Settings.Limit.NegDifference1 > telestate->climbrate1s) && + ((telestate->Settings.Limit.NegDifference1 * 3) < telestate->climbrate3s)) { + return HOTT_TONE_27; // sudden descent } if ((telestate->Settings.Warning.MaxDistance == HOTTBRIDGESETTINGS_WARNING_ENABLED) && (telestate->Settings.Limit.MaxDistance < telestate->homedistance) && gps_ok) { @@ -1525,12 +1753,13 @@ uint8_t generate_warning() return HOTT_TONE_L; // maximum speed } if ((telestate->Settings.Warning.PosDifference2 == HOTTBRIDGESETTINGS_WARNING_ENABLED) && - (telestate->Settings.Limit.PosDifference2 > telestate->climbrate3s)) { - return HOTT_TONE_M; // climb rate 3s + (telestate->Settings.Limit.PosDifference2 < telestate->climbrate3s)) { + return HOTT_TONE_35; // fast rise } if ((telestate->Settings.Warning.PosDifference1 == HOTTBRIDGESETTINGS_WARNING_ENABLED) && - (telestate->Settings.Limit.PosDifference1 > telestate->climbrate1s)) { - return HOTT_TONE_N; // climb rate 1s + (telestate->Settings.Limit.PosDifference1 < telestate->climbrate1s) && + ((telestate->Settings.Limit.PosDifference1 * 3) > telestate->climbrate3s)) { + return HOTT_TONE_36; // sudden rise } if ((telestate->Settings.Warning.MinHeight == HOTTBRIDGESETTINGS_WARNING_ENABLED) && (telestate->Settings.Limit.MinHeight > telestate->altitude)) {