diff --git a/core.js b/core.js index d333413..a041a5b 100644 --- a/core.js +++ b/core.js @@ -6,6 +6,9 @@ var mode = 0; var disable_btn = 0; var last_disable_btn = 0; +// 1 if there is any change that can be stored permanently +var has_changes_to_write = 0; + var lang_orig_text = {}; var lang_cur = {}; var lang_disabled = true; @@ -143,7 +146,8 @@ async function ds4_info() { ''; append_info(l("Board Model:"), ds4_hw_to_bm(hw_ver_minor) + b_info); - // All ok, safe to query NVS Status and BD Addr + // All ok, safe to lock NVS, query it and get BD Addr + await ds4_nvlock(); await ds4_nvstatus(); await ds4_getbdaddr(); @@ -158,6 +162,31 @@ async function ds4_info() { return true; } +async function ds4_flash() { + la("ds4_flash"); + try { + await ds4_nvunlock(); + await ds4_nvlock(); + + show_popup(l("Changes saved successfully")); + + } catch(error) { + show_popup(l("Error while saving changes:") + " " + str(error)); + } +} + +async function ds5_flash() { + la("ds5_flash"); + try { + await ds5_nvunlock(); + await ds5_nvlock(); + + show_popup(l("Changes saved successfully")); + } catch(error) { + show_popup(l("Error while saving changes: ") + str(error)); + } +} + async function ds4_reset() { la("ds4_reset"); try { @@ -174,19 +203,10 @@ async function ds5_reset() { } } -async function ds4_calibrate_range_begin(perm_ch) { - la("ds4_calibrate_range_begin", {"p": perm_ch}); +async function ds4_calibrate_range_begin() { + la("ds4_calibrate_range_begin"); var err = l("Range calibration failed: "); try { - if(perm_ch) { - await ds4_nvunlock(); - if(await ds4_nvstatus() != 0) { - la("ds4_calibrate_range_begin_failed", {"r": "nvunlock"}); - close_calibrate_window(); - return show_popup(err + l("Cannot unlock NVS")); - } - } - // Begin await device.sendFeatureReport(0x90, alloc_req(0x90, [1,1,2])) @@ -208,8 +228,8 @@ async function ds4_calibrate_range_begin(perm_ch) { } } -async function ds4_calibrate_range_end(perm_ch) { - la("ds4_calibrate_range_end", {"p": perm_ch}); +async function ds4_calibrate_range_end() { + la("ds4_calibrate_range_end"); var err = l("Range calibration failed: "); try { // Write @@ -225,15 +245,7 @@ async function ds4_calibrate_range_end(perm_ch) { return show_popup(err + l("Error 3")); } - if(perm_ch) { - await ds4_nvlock(); - if(await ds4_nvstatus() != 1) { - la("ds4_calibrate_range_end_failed", {"r": "nvlock"}); - close_calibrate_window(); - return show_popup(err + l("Cannot relock NVS")); - } - } - + update_nvs_changes_status(1); close_calibrate_window(); show_popup(l("Range calibration completed")); } catch(e) { @@ -244,19 +256,10 @@ async function ds4_calibrate_range_end(perm_ch) { } } -async function ds4_calibrate_sticks_begin(has_perm_changes) { - la("ds4_calibrate_sticks_begin", {"p": has_perm_changes}); +async function ds4_calibrate_sticks_begin() { + la("ds4_calibrate_sticks_begin"); var err = l("Stick calibration failed: "); try { - if(has_perm_changes) { - await ds4_nvunlock(); - if(await ds4_nvstatus() != 0) { - la("ds4_calibrate_sticks_begin_failed", {"r": "nvunlock"}); - show_popup(err + l("Cannot unlock NVS")); - return false; - } - } - // Begin await device.sendFeatureReport(0x90, alloc_req(0x90, [1,1,1])) @@ -306,8 +309,8 @@ async function ds4_calibrate_sticks_sample() { } } -async function ds4_calibrate_sticks_end(has_perm_changes) { - la("ds4_calibrate_sticks_end", {"p": has_perm_changes}); +async function ds4_calibrate_sticks_end() { + la("ds4_calibrate_sticks_end"); var err = l("Stick calibration failed: "); try { // Write @@ -320,15 +323,7 @@ async function ds4_calibrate_sticks_end(has_perm_changes) { return false; } - if(has_perm_changes) { - await ds4_nvlock(); - if(await ds4_nvstatus() != 1) { - la("ds4_calibrate_sticks_end_failed", {"r": "nvlock"}); - show_popup(err + l("Cannot relock NVS")); - return false; - } - } - + update_nvs_changes_status(1); return true; } catch(e) { la("ds4_calibrate_sticks_end_failed", {"r": e}); @@ -444,7 +439,7 @@ async function ds4_getbdaddr() { out = "" for(i=0;i<6;i++) { if(i >= 1) out += ":"; - out += dec2hex8(data.getUint8(i, false)); + out += dec2hex8(data.getUint8(6-i, false)); } $("#d-bdaddr").text(out); return out; @@ -528,6 +523,7 @@ async function ds5_info() { return true; } + await ds5_nvlock(); await ds5_nvstatus(); await ds5_getbdaddr(); } catch(e) { @@ -538,18 +534,10 @@ async function ds5_info() { return true; } -async function ds5_calibrate_sticks_begin(has_perm_changes) { - la("ds5_calibrate_sticks_begin", {"p": has_perm_changes}); +async function ds5_calibrate_sticks_begin() { + la("ds5_calibrate_sticks_begin"); var err = l("Range calibration failed: "); try { - if(has_perm_changes) { - await ds5_nvunlock(); - if(await ds5_nvstatus() != 0) { - la("ds5_calibrate_sticks_begin_failed", {"r": "nvunlock"}); - show_popup(err + l("Cannot unlock NVS")); - return false; - } - } // Begin await device.sendFeatureReport(0x82, alloc_req(0x82, [1,1,1])) @@ -594,8 +582,8 @@ async function ds5_calibrate_sticks_sample() { } } -async function ds5_calibrate_sticks_end(has_perm_changes) { - la("ds5_calibrate_sticks_end", {"p": has_perm_changes}); +async function ds5_calibrate_sticks_end() { + la("ds5_calibrate_sticks_end"); var err = l("Stick calibration failed: "); try { // Write @@ -609,14 +597,7 @@ async function ds5_calibrate_sticks_end(has_perm_changes) { return false; } - if(has_perm_changes) { - await ds5_nvlock(); - if(await ds5_nvstatus() != 1) { - la("ds5_calibrate_sticks_end_failed", {"r": "nvlock"}); - show_popup(err + l("Cannot relock NVS")); - return false; - } - } + update_nvs_changes_status(1); return true; } catch(e) { la("ds5_calibrate_sticks_end_failed", {"r": e}); @@ -680,6 +661,7 @@ async function ds5_calibrate_sticks() { } set_progress(100); + update_nvs_changes_status(1); await new Promise(r => setTimeout(r, 500)); close_calibrate_window() @@ -693,19 +675,10 @@ async function ds5_calibrate_sticks() { } } -async function ds5_calibrate_range_begin(perm_ch) { - la("ds5_calibrate_range_begin", {"p": perm_ch}); +async function ds5_calibrate_range_begin() { + la("ds5_calibrate_range_begin"); var err = l("Range calibration failed: "); try { - if(perm_ch) { - await ds5_nvunlock(); - if(await ds5_nvstatus() != 0) { - la("ds5_calibrate_range_begin_failed", {"r": "nvunlock"}); - close_calibrate_window(); - return show_popup(err + l("Cannot unlock NVS")); - } - } - // Begin await device.sendFeatureReport(0x82, alloc_req(0x82, [1,1,2])) @@ -725,8 +698,8 @@ async function ds5_calibrate_range_begin(perm_ch) { } } -async function ds5_calibrate_range_end(perm_ch) { - la("ds5_calibrate_range_end", {"p": perm_ch}); +async function ds5_calibrate_range_end() { + la("ds5_calibrate_range_end"); var err = l("Range calibration failed: "); try { // Write @@ -741,15 +714,7 @@ async function ds5_calibrate_range_end(perm_ch) { return show_popup(err + l("Error 1") + " (" + d1 + ")."); } - if(perm_ch) { - await ds5_nvlock(); - if(await ds5_nvstatus() != 1) { - la("ds5_calibrate_range_end_failed", {"r": "nvlock"}); - close_calibrate_window(); - return show_popup(err + l("Cannot relock NVS")); - } - } - + update_nvs_changes_status(1); close_calibrate_window(); show_popup(l("Range calibration completed")); } catch(e) { @@ -789,6 +754,7 @@ async function disconnect() { if(device == null) return; gj = 0; + update_nvs_changes_status(0); mode = 0; device.close(); device = null; @@ -1156,6 +1122,20 @@ function bat_percent_to_text(bat_charge, is_charging, is_error) { return bat_txt; } +function update_nvs_changes_status(new_value) { + if (new_value == has_changes_to_write) + return; + + if (new_value == 1) { + has_changes_to_write = 1; + $("#savechanges").prop("disabled", false); + $("#savechanges").addClass("btn-success").removeClass("btn-outline-secondary"); + } else { + $("#savechanges").prop("disabled", true); + $("#savechanges").removeClass("btn-success").addClass("btn-outline-secondary"); + } +} + function update_battery_status(bat_capacity, cable_connected, is_charging, is_error) { var bat_txt = bat_percent_to_text(bat_capacity, is_charging); var can_use_tool = (bat_capacity >= 30 && cable_connected && !is_error); @@ -1224,7 +1204,6 @@ function process_ds4_input(data) { update_battery_status(bat_capacity, cable_connected, is_charging, is_error); } - function process_ds_input(data) { var lx = data.data.getUint8(0); var ly = data.data.getUint8(1); @@ -1378,6 +1357,11 @@ function update_disable_btn() { async function connect() { gj = crypto.randomUUID(); + + // This trigger default disable + has_changes_to_write = -1; + update_nvs_changes_status(0); + reset_circularity(); la("begin"); last_bat_txt = ""; @@ -1427,6 +1411,14 @@ async function connect() { var curModal = null +async function multi_flash() { + if(mode == 1) + ds4_flash(); + else + ds5_flash(); + update_nvs_changes_status(0); +} + async function multi_reset() { if(mode == 1) ds4_reset(); @@ -1468,18 +1460,18 @@ async function multi_nvslock() { } } -async function multi_calib_sticks_begin(pc) { +async function multi_calib_sticks_begin() { if(mode == 1) - return ds4_calibrate_sticks_begin(pc); + return ds4_calibrate_sticks_begin(); else - return ds5_calibrate_sticks_begin(pc); + return ds5_calibrate_sticks_begin(); } -async function multi_calib_sticks_end(pc) { +async function multi_calib_sticks_end() { if(mode == 1) - await ds4_calibrate_sticks_end(pc); + await ds4_calibrate_sticks_end(); else - await ds5_calibrate_sticks_end(pc); + await ds5_calibrate_sticks_end(); on_circ_check_change(); } @@ -1490,8 +1482,7 @@ async function multi_calib_sticks_sample() { return ds5_calibrate_sticks_sample(); } -var last_perm_ch = 0 -async function multi_calibrate_range(perm_ch) { +async function multi_calibrate_range() { if(mode == 0) return; @@ -1499,21 +1490,19 @@ async function multi_calibrate_range(perm_ch) { curModal = new bootstrap.Modal(document.getElementById('rangeModal'), {}) curModal.show(); - last_perm_ch = perm_ch - await new Promise(r => setTimeout(r, 1000)); if(mode == 1) - ds4_calibrate_range_begin(perm_ch); + ds4_calibrate_range_begin(); else - ds5_calibrate_range_begin(perm_ch); + ds5_calibrate_range_begin(); } async function multi_calibrate_range_on_close() { if(mode == 1) - await ds4_calibrate_range_end(last_perm_ch); + await ds4_calibrate_range_end(); else - await ds5_calibrate_range_end(last_perm_ch); + await ds5_calibrate_range_end(); on_circ_check_change(); } @@ -1591,12 +1580,6 @@ function board_model_info() { show_popup(l3 + "

" + l1 + " " + l2, true); } -function calib_perm_changes() { return $("#calibPermanentChanges").is(':checked') } - -function reset_calib_perm_changes() { - $("#calibPermanentChanges").prop("checked", false).parent().removeClass('active'); -} - function close_new_calib() { $("#calibCenterModal").modal("hide"); cur_calib = 0; @@ -1606,7 +1589,6 @@ async function calib_step(i) { la("calib_step", {"i": i}) if(i < 1 || i > 7) return; - var pc = calib_perm_changes(); var ret = true; if(i >= 2 && i <= 6) { $("#btnSpinner").show(); @@ -1616,7 +1598,7 @@ async function calib_step(i) { if(i == 2) { $("#calibNextText").text(l("Initializing...")); await new Promise(r => setTimeout(r, 100)); - ret = await multi_calib_sticks_begin(pc); + ret = await multi_calib_sticks_begin(); } else if(i == 6) { $("#calibNextText").text(l("Sampling...")); await new Promise(r => setTimeout(r, 100)); @@ -1624,7 +1606,7 @@ async function calib_step(i) { await new Promise(r => setTimeout(r, 100)); $("#calibNextText").text(l("Storing calibration...")); await new Promise(r => setTimeout(r, 100)); - ret = await multi_calib_sticks_end(pc); + ret = await multi_calib_sticks_end(); } else if(i > 2 && i < 6){ $("#calibNextText").text(l("Sampling...")); await new Promise(r => setTimeout(r, 100)); @@ -1672,7 +1654,6 @@ var cur_calib = 0; async function calib_open() { la("calib_open"); cur_calib = 0; - reset_calib_perm_changes(); await calib_next(); new bootstrap.Modal(document.getElementById('calibCenterModal'), {}).show() } diff --git a/index.html b/index.html index 7a7f639..3967cc8 100644 --- a/index.html +++ b/index.html @@ -126,12 +126,10 @@
- -
- - -
- + + + +
Joystick Info
@@ -211,7 +209,6 @@
-
@@ -274,21 +271,7 @@

Please be aware that, once the calibration is running, it cannot be canceled. Do not close this page or disconnect your controller until is completed.

-
Calibration storage
- -

By default the calibration is only saved in a volatile storage, so that if you (or this tool) mess something up, a reset of the controller is enough to make it work again.

- -

If you wish to store the calibration permanently in the controller, tick the checkbox below:

- - - - -
- -

Warning: Do not store the calibration permanently if the controller battery is low or disconnected. It will damage your controller.

-

Press Start to begin calibration.

-