|
14 | 14 | </a> |
15 | 15 | </div> |
16 | 16 | <div class="note"> |
17 | | - <p>{{ $t("configurationFeaturesHelp") }}</p> |
| 17 | + <p v-html="$t('configurationFeaturesHelp')"></p> |
18 | 18 | </div> |
19 | 19 |
|
20 | 20 | <div class="grid-row grid-box col2"> |
|
27 | 27 | </div> |
28 | 28 | <div class="spacer_box"> |
29 | 29 | <div class="note"> |
30 | | - <p class="systemconfigNote">{{ $t("configurationLoopTimeHelp") }}</p> |
| 30 | + <p class="systemconfigNote" v-html="$t('configurationLoopTimeHelp')"></p> |
31 | 31 | </div> |
32 | 32 | <div class="select"> |
33 | 33 | <input type="text" class="gyroFrequency" readonly :value="gyroFrequencyDisplay" /> |
@@ -518,13 +518,14 @@ import GUI from "../../js/gui"; |
518 | 518 | import FC from "../../js/fc"; |
519 | 519 | import MSP from "../../js/msp"; |
520 | 520 | import MSPCodes from "../../js/msp/MSPCodes"; |
521 | | -import mspHelper from "../../js/msp/MSPHelper"; |
| 521 | +import { mspHelper } from "../../js/msp/MSPHelper"; |
522 | 522 | import { i18n } from "../../js/localization"; |
523 | 523 | import { sensorTypes } from "../../js/sensor_types"; // Import for dropdown lists |
524 | 524 | import { have_sensor } from "../../js/sensor_helpers"; |
525 | 525 | import semver from "semver"; |
526 | 526 | import { API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from "../../js/data_storage"; |
527 | 527 | import { bit_check, bit_set, bit_clear } from "../../js/bit"; |
| 528 | +import { updateTabList } from "../../js/utils/updateTabList"; |
528 | 529 |
|
529 | 530 | export default defineComponent({ |
530 | 531 | name: "ConfigurationTab", |
@@ -630,6 +631,7 @@ export default defineComponent({ |
630 | 631 | feature.bit, |
631 | 632 | ); |
632 | 633 | } |
| 634 | + updateTabList(FC.FEATURE_CONFIG.features); |
633 | 635 | }; |
634 | 636 |
|
635 | 637 | const isBeeperEnabled = (beeper) => { |
@@ -878,58 +880,107 @@ export default defineComponent({ |
878 | 880 | pidDenomOptions.value = options; |
879 | 881 | }; |
880 | 882 |
|
881 | | - const saveConfig = () => { |
882 | | - // Logic placeholder |
883 | | - console.log("Saving configuration (partial)..."); |
| 883 | + const saveConfig = async () => { |
| 884 | + try { |
| 885 | + console.log("Saving configuration..."); |
884 | 886 |
|
885 | | - FC.PID_ADVANCED_CONFIG.gyro_sync_denom = pidAdvancedConfig.gyro_sync_denom; |
886 | | - FC.PID_ADVANCED_CONFIG.pid_process_denom = pidAdvancedConfig.pid_process_denom; |
| 887 | + FC.PID_ADVANCED_CONFIG.gyro_sync_denom = pidAdvancedConfig.gyro_sync_denom; |
| 888 | + FC.PID_ADVANCED_CONFIG.pid_process_denom = pidAdvancedConfig.pid_process_denom; |
887 | 889 |
|
888 | | - FC.SENSOR_CONFIG.acc_hardware = sensorConfig.acc_hardware; |
889 | | - FC.SENSOR_CONFIG.baro_hardware = sensorConfig.baro_hardware; |
890 | | - FC.SENSOR_CONFIG.mag_hardware = sensorConfig.mag_hardware; |
| 890 | + FC.SENSOR_CONFIG.acc_hardware = sensorConfig.acc_hardware; |
| 891 | + FC.SENSOR_CONFIG.baro_hardware = sensorConfig.baro_hardware; |
| 892 | + FC.SENSOR_CONFIG.mag_hardware = sensorConfig.mag_hardware; |
891 | 893 |
|
892 | | - FC.BOARD_ALIGNMENT_CONFIG.roll = boardAlignment.roll; |
893 | | - FC.BOARD_ALIGNMENT_CONFIG.pitch = boardAlignment.pitch; |
894 | | - FC.BOARD_ALIGNMENT_CONFIG.yaw = boardAlignment.yaw; |
| 894 | + FC.BOARD_ALIGNMENT_CONFIG.roll = boardAlignment.roll; |
| 895 | + FC.BOARD_ALIGNMENT_CONFIG.pitch = boardAlignment.pitch; |
| 896 | + FC.BOARD_ALIGNMENT_CONFIG.yaw = boardAlignment.yaw; |
895 | 897 |
|
896 | | - FC.RX_CONFIG.fpvCamAngleDegrees = fpvCamAngleDegrees.value; |
| 898 | + FC.RX_CONFIG.fpvCamAngleDegrees = fpvCamAngleDegrees.value; |
897 | 899 |
|
898 | | - if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) { |
899 | | - FC.CONFIG.craftName = craftName.value; |
900 | | - FC.CONFIG.pilotName = pilotName.value; |
901 | | - } else { |
902 | | - FC.CONFIG.name = craftName.value; |
903 | | - } |
| 900 | + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) { |
| 901 | + FC.CONFIG.craftName = craftName.value; |
| 902 | + FC.CONFIG.pilotName = pilotName.value; |
| 903 | + } else { |
| 904 | + FC.CONFIG.name = craftName.value; |
| 905 | + } |
904 | 906 |
|
905 | | - if (FC.BEEPER_CONFIG) { |
906 | | - FC.BEEPER_CONFIG.dshotBeaconTone = dshotBeaconTone.value; |
907 | | - } |
| 907 | + if (FC.BEEPER_CONFIG) { |
| 908 | + FC.BEEPER_CONFIG.dshotBeaconTone = dshotBeaconTone.value; |
| 909 | + } |
908 | 910 |
|
909 | | - FC.ARMING_CONFIG.small_angle = armingConfig.small_angle; |
910 | | - if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) { |
911 | | - FC.ARMING_CONFIG.gyro_cal_on_first_arm = armingConfig.gyro_cal_on_first_arm_bool ? 1 : 0; |
912 | | - FC.ARMING_CONFIG.auto_disarm_delay = armingConfig.auto_disarm_delay; |
913 | | - } |
| 911 | + FC.ARMING_CONFIG.small_angle = armingConfig.small_angle; |
| 912 | + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) { |
| 913 | + FC.ARMING_CONFIG.gyro_cal_on_first_arm = armingConfig.gyro_cal_on_first_arm_bool ? 1 : 0; |
| 914 | + FC.ARMING_CONFIG.auto_disarm_delay = armingConfig.auto_disarm_delay; |
| 915 | + } |
914 | 916 |
|
915 | | - FC.CONFIG.accelerometerTrims[0] = accelTrims.pitch; |
916 | | - FC.CONFIG.accelerometerTrims[1] = accelTrims.roll; |
| 917 | + FC.CONFIG.accelerometerTrims[0] = accelTrims.pitch; |
| 918 | + FC.CONFIG.accelerometerTrims[1] = accelTrims.roll; |
917 | 919 |
|
918 | | - FC.SENSOR_ALIGNMENT.gyro_to_use = sensorAlignment.gyro_to_use; |
919 | | - FC.SENSOR_ALIGNMENT.gyro_1_align = sensorAlignment.gyro_1_align; |
920 | | - FC.SENSOR_ALIGNMENT.gyro_2_align = sensorAlignment.gyro_2_align; |
921 | | - FC.SENSOR_ALIGNMENT.align_mag = sensorAlignment.align_mag; |
| 920 | + FC.SENSOR_ALIGNMENT.gyro_to_use = sensorAlignment.gyro_to_use; |
| 921 | + FC.SENSOR_ALIGNMENT.gyro_1_align = sensorAlignment.gyro_1_align; |
| 922 | + FC.SENSOR_ALIGNMENT.gyro_2_align = sensorAlignment.gyro_2_align; |
| 923 | + FC.SENSOR_ALIGNMENT.align_mag = sensorAlignment.align_mag; |
922 | 924 |
|
923 | | - if (showMagDeclination.value) { |
924 | | - FC.COMPASS_CONFIG.mag_declination = magDeclination.value; |
925 | | - } |
| 925 | + if (showMagDeclination.value) { |
| 926 | + FC.COMPASS_CONFIG.mag_declination = magDeclination.value; |
| 927 | + } |
926 | 928 |
|
927 | | - if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) { |
928 | | - FC.SENSOR_CONFIG.sonar_hardware = sensorConfig.sonar_hardware; |
929 | | - FC.SENSOR_CONFIG.opticalflow_hardware = sensorConfig.opticalflow_hardware; |
930 | | - } |
| 929 | + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) { |
| 930 | + FC.SENSOR_CONFIG.sonar_hardware = sensorConfig.sonar_hardware; |
| 931 | + FC.SENSOR_CONFIG.opticalflow_hardware = sensorConfig.opticalflow_hardware; |
| 932 | + } |
931 | 933 |
|
932 | | - // TODO: Call proper save chain |
| 934 | + // Send MSP commands |
| 935 | + await MSP.promise(MSPCodes.MSP_SET_FEATURE_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FEATURE_CONFIG)); |
| 936 | +
|
| 937 | + if (FC.BEEPER_CONFIG) { |
| 938 | + await MSP.promise(MSPCodes.MSP_SET_BEEPER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BEEPER_CONFIG)); |
| 939 | + } |
| 940 | +
|
| 941 | + await MSP.promise( |
| 942 | + MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG, |
| 943 | + mspHelper.crunch(MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG), |
| 944 | + ); |
| 945 | + await MSP.promise(MSPCodes.MSP_SET_ACC_TRIM, mspHelper.crunch(MSPCodes.MSP_SET_ACC_TRIM)); |
| 946 | + await MSP.promise(MSPCodes.MSP_SET_ARMING_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ARMING_CONFIG)); |
| 947 | + await MSP.promise(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG)); |
| 948 | + await MSP.promise( |
| 949 | + MSPCodes.MSP_SET_SENSOR_ALIGNMENT, |
| 950 | + mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_ALIGNMENT), |
| 951 | + ); |
| 952 | +
|
| 953 | + if (semver.lt(FC.CONFIG.apiVersion, API_VERSION_1_45)) { |
| 954 | + await MSP.promise(MSPCodes.MSP_SET_NAME, mspHelper.crunch(MSPCodes.MSP_SET_NAME)); |
| 955 | + } else { |
| 956 | + await MSP.promise( |
| 957 | + MSPCodes.MSP2_SET_TEXT, |
| 958 | + mspHelper.crunch(MSPCodes.MSP2_SET_TEXT, MSPCodes.CRAFT_NAME), |
| 959 | + ); |
| 960 | + await MSP.promise( |
| 961 | + MSPCodes.MSP2_SET_TEXT, |
| 962 | + mspHelper.crunch(MSPCodes.MSP2_SET_TEXT, MSPCodes.PILOT_NAME), |
| 963 | + ); |
| 964 | + } |
| 965 | +
|
| 966 | + await MSP.promise(MSPCodes.MSP_SET_RX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_RX_CONFIG)); |
| 967 | + await MSP.promise(MSPCodes.MSP_SET_ADVANCED_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ADVANCED_CONFIG)); |
| 968 | +
|
| 969 | + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) { |
| 970 | + await MSP.promise( |
| 971 | + MSPCodes.MSP_SET_COMPASS_CONFIG, |
| 972 | + mspHelper.crunch(MSPCodes.MSP_SET_COMPASS_CONFIG), |
| 973 | + ); |
| 974 | + } |
| 975 | +
|
| 976 | + GUI.log(i18n.getMessage("configurationSaved")); |
| 977 | +
|
| 978 | + // Save to EEPROM and Reboot |
| 979 | + mspHelper.writeConfiguration(true); |
| 980 | + } catch (e) { |
| 981 | + console.error("Failed to save configuration", e); |
| 982 | + GUI.log(i18n.getMessage("configurationSaveFailed")); |
| 983 | + } |
933 | 984 | }; |
934 | 985 |
|
935 | 986 | onMounted(() => { |
|
0 commit comments