Skip to content

Commit f3fd4c4

Browse files
committed
feat: Implement saveConfig with reboot and fix HTML rendering
1 parent 032a71e commit f3fd4c4

File tree

1 file changed

+94
-43
lines changed

1 file changed

+94
-43
lines changed

src/components/tabs/ConfigurationTab.vue

Lines changed: 94 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</a>
1515
</div>
1616
<div class="note">
17-
<p>{{ $t("configurationFeaturesHelp") }}</p>
17+
<p v-html="$t('configurationFeaturesHelp')"></p>
1818
</div>
1919

2020
<div class="grid-row grid-box col2">
@@ -27,7 +27,7 @@
2727
</div>
2828
<div class="spacer_box">
2929
<div class="note">
30-
<p class="systemconfigNote">{{ $t("configurationLoopTimeHelp") }}</p>
30+
<p class="systemconfigNote" v-html="$t('configurationLoopTimeHelp')"></p>
3131
</div>
3232
<div class="select">
3333
<input type="text" class="gyroFrequency" readonly :value="gyroFrequencyDisplay" />
@@ -518,13 +518,14 @@ import GUI from "../../js/gui";
518518
import FC from "../../js/fc";
519519
import MSP from "../../js/msp";
520520
import MSPCodes from "../../js/msp/MSPCodes";
521-
import mspHelper from "../../js/msp/MSPHelper";
521+
import { mspHelper } from "../../js/msp/MSPHelper";
522522
import { i18n } from "../../js/localization";
523523
import { sensorTypes } from "../../js/sensor_types"; // Import for dropdown lists
524524
import { have_sensor } from "../../js/sensor_helpers";
525525
import semver from "semver";
526526
import { API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from "../../js/data_storage";
527527
import { bit_check, bit_set, bit_clear } from "../../js/bit";
528+
import { updateTabList } from "../../js/utils/updateTabList";
528529
529530
export default defineComponent({
530531
name: "ConfigurationTab",
@@ -630,6 +631,7 @@ export default defineComponent({
630631
feature.bit,
631632
);
632633
}
634+
updateTabList(FC.FEATURE_CONFIG.features);
633635
};
634636
635637
const isBeeperEnabled = (beeper) => {
@@ -878,58 +880,107 @@ export default defineComponent({
878880
pidDenomOptions.value = options;
879881
};
880882
881-
const saveConfig = () => {
882-
// Logic placeholder
883-
console.log("Saving configuration (partial)...");
883+
const saveConfig = async () => {
884+
try {
885+
console.log("Saving configuration...");
884886
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;
887889
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;
891893
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;
895897
896-
FC.RX_CONFIG.fpvCamAngleDegrees = fpvCamAngleDegrees.value;
898+
FC.RX_CONFIG.fpvCamAngleDegrees = fpvCamAngleDegrees.value;
897899
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+
}
904906
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+
}
908910
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+
}
914916
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;
917919
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;
922924
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+
}
926928
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+
}
931933
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+
}
933984
};
934985
935986
onMounted(() => {

0 commit comments

Comments
 (0)