// let lastProgress = 0; // socket.on("download_progress", function (message) { // const version = localStorage.getItem("downloading_version"); // // 监听进度更新事件 // const progress = parseFloat(message.data); // if (document.getElementById("popup-modal").style.display === "none") { // showPopup(`正在下载并安装 ${version},当前进度:${progress}%`, { // confirm: false, // cancel: false, // }); // } else { // if (progress > lastProgress) { // lastProgress = progress; // 只允许进度递增 // updatePopupMessage( // `正在下载并安装 ${version},当前进度:${progress}%`, // false, // false // ); // } // } // }); let lastProgress = 0; function setupSocketListeners() { socket.on("download_progress", async function (message) { // const version = localStorage.getItem("downloading_version") || "未知版本"; let version; if (localStorage.getItem("downloading_version")) { version = localStorage.getItem("downloading_version"); } else { version = await getPopupText("unknownVersionText"); } const progress = parseFloat(message.progress); const speed = parseFloat(message.speed); if (progress < 100) { let downloadingText = await getPopupText("downloadingText"); let downloadProgressText = await getPopupText("downloadProgressText"); let downloadSpeedText = await getPopupText("downloadSpeedText"); if (document.getElementById("popup-modal").style.display === "none") { showPopup( `${downloadingText} ${version},${downloadProgressText}:${progress}%,${downloadSpeedText}:${speed}KB/s`, { confirm: false, cancel: false, } ); } else { if (progress > lastProgress) { lastProgress = progress; // 只允许进度递增 updatePopupMessage( `${downloadingText} ${version},${downloadProgressText}:${progress}%,${downloadSpeedText}:${speed}KB/s`, false, false ); } } } else if (progress >= 100) { if (document.getElementById("popup-modal").style.display === "none") { let installingText = await getPopupText("installingText"); showPopup( installingText, { confirm: false, cancel: false, } ); } else { if (progress > lastProgress) { lastProgress = progress; // 只允许进度递增 updatePopupMessage( installingText, false, false ); } } } }); } function getAwaken() { fetch("/get_awaken") .then((response) => response.json()) .then((data) => { const awakenTxt = document.getElementById("awaken-txt"); awakenTxt.innerText = data.awaken; const awakenSelector = document.getElementById("awaken-selector"); awakenSelector.value = data.awaken; }) .catch((error) => console.error("Error getting awaken:", error)); } let currentVersion = "default"; const pwdModal = document.getElementById("pwd-modal"); const pwdInput = document.getElementById("pwd-input"); let pwdResolve; function showPwdModal() { pwdModal.style.display = "flex"; pwdInput.value = ""; pwdInput.focus(); // 返回Promise,等待用户选择 return new Promise((resolve) => { pwdResolve = resolve; // 保存 resolve 函数 }); } // 绑定 keydown 事件 pwdInput.addEventListener('keydown', function (event) { // 检查按下的键是否是 Enter 键 if (event.key === 'Enter' || event.keyCode === 13) { // 回车键按下时的逻辑 pwdConfirm() } }); function pwdConfirm() { pwdModal.style.display = "none"; pwdResolve(true); } function pwdCancel() { pwdModal.style.display = "none"; pwdResolve(false); } document.addEventListener("DOMContentLoaded", function () { // 加载当前版本 fetchCurrentVersion(); // 加载已下载的版本 fetchDownloadedVersions(); // 加载可更新的版本 fetchRemoteVersions(); // 加载当前版本 fetchVortXDBCurrentVersion(); // 加载已下载的版本 fetchVortXDBDownloadedVersions(); // 加载可更新的版本 fetchVortXDBRemoteVersions(); // checkDownloadStatus(); setupSocketListeners(); getAwaken(); fetch('/get_serial_number') .then(response => response.json()) // 假设返回的是 JSON 格式的数据 .then(data => { // 假设接口返回的 JSON 数据中包含序列号字段,例如 data.serial_number const serialNumber = data.serial_number; // 将获取到的序列号插入到页面的 #serial-number 元素中 document.getElementById('serial-number').textContent = serialNumber; }) .catch(async error => { console.error('获取序列号失败:', error); // 处理错误,比如可以设置一个默认值或提示用户 let getSnFailedText = await getPopupText("getSnFailedText"); document.getElementById('serial-number').textContent = getSnFailedText; }); // 监听已下载版本选择的变化 document .getElementById("downloaded-versions") .addEventListener("change", async function () { const selectedVersion = this.value; // 如果选择的版本和当前版本相同,直接返回,不做任何操作 if (selectedVersion === currentVersion) { let useIngText = await getPopupText("useIngText"); let notNeedChangeText = await getPopupText("notNeedChangeText"); showPopup(`${useIngText} ${selectedVersion}${notNeedChangeText}`, { confirm: true, cancel: false, }); let selectDownloadText = await getPopupText("selectDownloadText"); this.value = selectDownloadText; return; } if (selectedVersion) { const dropdown = this; // 保存当前选择框 let askChangeVersionText = await getPopupText("askChangeVersionText"); showPopup(`${askChangeVersionText} ${selectedVersion} ?`).then(async (confirmed) => { if (confirmed) { switchVersion(selectedVersion); let changeVersionText = await getPopupText("changeVersionText"); let changeVersionWaitText = await getPopupText("changeVersionWaitText"); showPopup(`${changeVersionText} ${selectedVersion}${changeVersionWaitText}`, { confirm: false, cancel: false, }); } else { dropdown.value = currentVersion; // 用户取消时,还原选择框为当前版本 } }); } }); // 监听可更新版本选择的变化 document .getElementById("remote-versions") .addEventListener("change", async function () { const selectedVersion = this.value; if (selectedVersion) { const dropdown = this; // 保存当前选择框 let askSureVersionText = await getPopupText("askSureVersionText"); showPopup(`${askSureVersionText} ${selectedVersion} ?`).then( async (confirmed) => { if (confirmed) { let downloadingText = await getPopupText("downloadingText"); let downloadSpeedText = await getPopupText("downloadSpeedText"); showPopup(`${downloadingText} ${selectedVersion}${downloadSpeedText}`, { confirm: false, cancel: false, }); downloadAndInstallVersion(selectedVersion); } else { let selectUpdateText = await getPopupText("selectUpdateText"); dropdown.value = selectUpdateText; // 用户取消时,还原选择框为空 } } ); } }); // 监听已下载版本选择的变化 document .getElementById("downloaded-vtx-versions") .addEventListener("change", async function () { const selectedVersion = this.value; // 如果选择的版本和当前版本相同,直接返回,不做任何操作 if (selectedVersion === currentVersion) { let useIngText = await getPopupText("useIngText"); let notNeedChangeText = await getPopupText("notNeedChangeText"); showPopup(`${useIngText} ${selectedVersion}${notNeedChangeText}`, { confirm: true, cancel: false, }); let selectDownloadText = await getPopupText("selectDownloadText"); this.value = selectDownloadText; return; } if (selectedVersion) { const dropdown = this; // 保存当前选择框 let askChangeVersionText = await getPopupText("askChangeVersionText"); showPopup(`${askChangeVersionText} ${selectedVersion} ?`).then(async (confirmed) => { if (confirmed) { switchVortXDBVersion(selectedVersion); let changeVersionText = await getPopupText("changeVersionText"); let changeVersionWaitText = await getPopupText("changeVersionWaitText"); showPopup(`${changeVersionText} ${selectedVersion}${changeVersionWaitText}`, { confirm: false, cancel: false, }); } else { dropdown.value = currentVersion; // 用户取消时,还原选择框为当前版本 } }); } }); // 监听可更新版本选择的变化 document .getElementById("remote-vtx-versions") .addEventListener("change", async function () { const selectedVersion = this.value; if (selectedVersion) { const dropdown = this; // 保存当前选择框 let askSureVersionText = await getPopupText("askSureVersionText"); showPopup(`${askSureVersionText} ${selectedVersion} ?`).then( async (confirmed) => { if (confirmed) { let downloadingText = await getPopupText("downloadingText"); let downloadSpeedText = await getPopupText("downloadSpeedText"); showPopup(`${downloadingText} ${selectedVersion}${downloadSpeedText}`, { confirm: false, cancel: false, }); downloadAndInstallVortXDBVersion(selectedVersion); } else { let selectUpdateText = await getPopupText("selectUpdateText"); dropdown.value = selectUpdateText; // 用户取消时,还原选择框为空 } } ); } }); document .getElementById("awaken-selector") .addEventListener("change", async function (e) { const oldAwaken = document.getElementById("awaken-txt").innerText; const selectedAwaken = this.value; if (selectedAwaken) { const dropdown = this; // 保存当前选择框 let askChangeAwakenText = await getPopupText("askChangeAwakenText"); showPopup(`${askChangeAwakenText} ${selectedAwaken} ?`).then( async (confirmed) => { if (confirmed) { let changeAwakenText = await getPopupText("changeAwakenText"); showPopup(changeAwakenText, { confirm: false, cancel: false, }); socket.emit("change_awaken", `change_awaken:${selectedAwaken}`); document.getElementById("awaken-txt").innerText = selectedAwaken; setTimeout(async () => { let newAwakenText = await getPopupText("newAwakenText"); showPopup( `${newAwakenText}“${selectedAwaken}”。`, { confirm: true, } ); }, 5000); } else { dropdown.value = oldAwaken; // 用户取消时,还原选择框为空 } } ); } }); // 机器人演示功能 const robotDemoBtn = document.getElementById("robot-demo-btn"); if (robotDemoBtn) { robotDemoBtn.addEventListener("click", async function () { // 如果按钮已经禁用,不执行任何操作 if (robotDemoBtn.disabled) { return; } let beginVisitText = await getPopupText("beginVisitText"); if (robotDemoBtn.textContent === beginVisitText) { let headerText = await getPopupText("headerText"); let notSupportText = await getPopupText("notSupportText"); let notSupportToggleText = await getPopupText("notSupportToggleText"); let beginWaitText = await getPopupText("beginWaitText"); showPopup(`${headerText}!
${notSupportText}!
${beginWaitText}
${notSupportToggleText}`).then( async (confirmed) => { if (confirmed) { // 立即改变按钮状态 let initializationText = await getPopupText("initializationText"); robotDemoBtn.textContent = initializationText; robotDemoBtn.disabled = true; robotDemoBtn.style.opacity = "0.6"; robotDemoBtn.style.cursor = "not-allowed"; // 发送开始演示请求 fetch("/start_robot_demo", { method: "POST", }) .then(response => response.json()) .then(async data => { if (data.status === "success") { let stopVisitText = await getPopupText("stopVisitText"); robotDemoBtn.textContent = stopVisitText; } else { let RobotStartFailText = await getPopupText("RobotStartFailText"); showPopup(RobotStartFailText + data.message); robotDemoBtn.textContent = beginVisitText; } // 恢复按钮可点击状态 robotDemoBtn.disabled = false; robotDemoBtn.style.opacity = ""; robotDemoBtn.style.cursor = ""; }) .catch(async error => { let requestFail = await getPopupText("requestFail"); showPopup(requestFail + error); // 发生错误时也恢复按钮状态 robotDemoBtn.textContent = beginVisitText; robotDemoBtn.disabled = false; robotDemoBtn.style.opacity = ""; robotDemoBtn.style.cursor = ""; }); } } ); } else { // 立即改变按钮状态 let stopIngText = await getPopupText("stopIngText"); robotDemoBtn.textContent = stopIngText; robotDemoBtn.disabled = true; robotDemoBtn.style.opacity = "0.6"; robotDemoBtn.style.cursor = "not-allowed"; // 发送停止演示请求 fetch("/stop_robot_demo", { method: "POST", }) .then(response => response.json()) .then(async data => { if (data.status === "success") { let beginVisitText = await getPopupText("beginVisitText"); robotDemoBtn.textContent = beginVisitText; } else { let RobotStopFailText = await getPopupText("RobotStopFailText"); let stopVisitText = await getPopupText("stopVisitText"); showPopup(RobotStopFailText + data.message); robotDemoBtn.textContent = stopVisitText; } // 恢复按钮可点击状态 robotDemoBtn.disabled = false; robotDemoBtn.style.opacity = ""; robotDemoBtn.style.cursor = ""; }) .catch(async error => { let requestFail = await getPopupText("requestFail"); showPopup(requestFail + error); // 发生错误时也恢复按钮状态 let stopVisitText = await getPopupText("stopVisitText"); robotDemoBtn.textContent = stopVisitText; robotDemoBtn.disabled = false; robotDemoBtn.style.opacity = ""; robotDemoBtn.style.cursor = ""; }); } }); } }); async function fetchCurrentVersion() { let currentVersion = document.getElementById("current-version"); let loadingText = await getPopupText("loadingText"); currentVersion.textContent = loadingText; fetch("/get_current_version") .then((response) => response.json()) .then((data) => { currentVersion.textContent = data.current_version; currentVersion = data.current_version; }) .catch((error) => console.error("Error fetching current version:", error)); } function fetchDownloadedVersions() { fetch("/get_versions") .then((response) => response.json()) .then((data) => { const select = document.getElementById("downloaded-versions"); select.innerHTML = ''; // 添加默认选项 data.versions.forEach((version) => { const option = document.createElement("option"); option.value = version; option.textContent = version; select.appendChild(option); }); translateElement("#change_select_version", lang); }) .catch((error) => console.error("Error fetching downloaded versions:", error) ); } function fetchRemoteVersions() { fetch("/get_remote_versions") .then((response) => response.json()) .then((data) => { const select = document.getElementById("remote-versions"); select.innerHTML = ''; // 添加默认选项 data.versions.forEach((version) => { const option = document.createElement("option"); option.value = version; option.textContent = version; select.appendChild(option); }); translateElement("#change_update_version", lang); }) .catch((error) => console.error("Error fetching remote versions:", error)); } function switchVersion(version) { fetch("/switch_version", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ version: version }), }) .then((response) => response.json()) .then((data) => { // alert(`切换到版本 ${version} 成功`); fetchCurrentVersion(); // 更新当前版本显示 }) .catch((error) => console.error("Error switching version:", error)); } function downloadAndInstallVersion(version) { lastProgress = 0; // 重置前端进度状态 fetch("/download_package", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ version: version }), }) .then((response) => response.json()) .then((data) => { // alert(`下载并安装版本 ${version} 成功`); fetchDownloadedVersions(); // 更新已下载的版本列表 localStorage.setItem("downloading_version", version); // 记录正在下载的版本 }) .catch((error) => console.error("Error downloading version:", error)); } const staticUpdateBtn = document.getElementById("static-update-btn"); staticUpdateBtn.addEventListener("click", async function () { let askUpdateUIText = await getPopupText("askUpdateUIText"); showPopup(askUpdateUIText).then( (confirmed) => { if (confirmed) { if (typeof AndroidInterface !== "undefined") { AndroidInterface.sendMessageToAndroid("Update Static Resources"); console.log("发送Android消息: Update Static Resources"); } else { console.log("AndroidInterface未定义,仅作测试") } } } ); }) async function fetchVortXDBCurrentVersion() { let currentVtxVersion = document.getElementById("current-vtx-version"); let loadingText = await getPopupText("loadingText"); currentVtxVersion.textContent = loadingText; fetch("/get_vtx_current_version") .then((response) => response.json()) .then((data) => { currentVtxVersion.textContent = data.current_version; currentVersion = data.current_version; }) .catch((error) => console.error("Error fetching current version:", error)); } function fetchVortXDBDownloadedVersions() { fetch("/get_vtx_versions") .then((response) => response.json()) .then((data) => { const select = document.getElementById("downloaded-vtx-versions"); select.innerHTML = ''; // 添加默认选项 data.versions.forEach((version) => { const option = document.createElement("option"); option.value = version; option.textContent = version; select.appendChild(option); }); translateElement("#change_select_version", lang); }) .catch((error) => console.error("Error fetching downloaded versions:", error) ); } function fetchVortXDBRemoteVersions() { fetch("/get_vtx_remote_versions") .then((response) => response.json()) .then((data) => { const select = document.getElementById("remote-vtx-versions"); select.innerHTML = ''; // 添加默认选项 data.versions.forEach((version) => { const option = document.createElement("option"); option.value = version; option.textContent = version; select.appendChild(option); }); translateElement("#vtx_change_update_version", lang); }) .catch((error) => console.error("Error fetching remote versions:", error)); } function switchVortXDBVersion(version) { fetch("/switch_vtx_version", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ version: version }), }) .then((response) => response.json()) .then((data) => { // alert(`切换到版本 ${version} 成功`); fetchVortXDBCurrentVersion(); // 更新当前版本显示 }) .catch((error) => console.error("Error switching version:", error)); } function downloadAndInstallVortXDBVersion(version) { lastProgress = 0; // 重置前端进度状态 fetch("/download_vtx_package", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ version: version }), }) .then((response) => response.json()) .then((data) => { // alert(`下载并安装版本 ${version} 成功`); fetchVortXDBDownloadedVersions(); // 更新已下载的版本列表 localStorage.setItem("downloading_version", version); // 记录正在下载的版本 }) .catch((error) => console.error("Error downloading version:", error)); } const resetBtn = document.getElementById("reset-btn"); resetBtn.addEventListener("click", async function () { if (massageServiceStarted && massageServiceStarted !== null) { let notSetZeroText = await getPopupText("notSetZeroText"); showPopup(notSetZeroText); return; } else { let askSetZeroText = await getPopupText("askSetZeroText"); showPopup(askSetZeroText).then( async (confirm) => { if (confirm) { let headerText = await getPopupText("headerText"); showPopup(headerText).then(async (confirm) => { if (confirm) { let isSettingZeroText = await getPopupText("isSettingZeroText"); showPopup(isSettingZeroText, { confirm: false, cancel: false, }); fetch("/set_zero", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((response) => response.json()) .then(async (data) => { if (data.message === "Set zero success") { let setZeroText = await getPopupText("setZeroText"); showPopup(setZeroText, { confirm: true, cancel: false, }); } else { showPopup(data.message, { confirm: true, cancel: false, }); } }) .catch((error) => console.error("Error sending control command:", error) ); } }); } } ); } }); // 语音重置按钮 const resetLanguageBtn = document.getElementById("reset-language-btn"); resetLanguageBtn.addEventListener("click", function () { fetch("/reset-language", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((response) => response.json()) .then((data) => { console.log(data); }) .catch((error) => { console.error("Error:", error); }); }); // 机械臂上电按钮 const robotPowerOnBtn = document.getElementById("robot-power-on-btn"); robotPowerOnBtn.addEventListener("click", async function () { let askPowerOnText = await getPopupText("askPowerOnText"); showPopup(askPowerOnText).then( async (confirm) => { if (confirm) { let powerOnIngText = await getPopupText("powerOnIngText"); showPopup(powerOnIngText, { confirm: false, cancel: false }); // 上电 do power on fetch("/power_toggle", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", // 表单数据类型 }, body: new URLSearchParams({ power_state: "power_on", // 传递的参数 }), }) .then((response) => response.json()) .then(async (data) => { // let popupStr = `

请手动将机械臂移动到安全位置,移动完毕后点击“ 确定 ”按钮,确定后机械臂将会重新断电。

//

如果需要重新调整机械臂位置,请重新点击上电按钮。

//

如果拖动过程中发现机械臂无法继续拖动,可能是因为拖动速度过快或者拖动角度不对,触发安全机制,请按确定键断电后再重复上电调整操作。

`; let powerOnHintText = await getPopupText("powerOnHintText"); let popupStr = powerOnHintText; let popup = showPopup(popupStr, { confirm: true, cancel: false, }); // 选择已下载的版本 const confirmBtn = document.getElementById("confirm-btn"); confirmBtn.disabled = true; confirmBtn.style.background = "gray"; let num = 10; let confirmText = await getPopupText("confirmText"); confirmBtn.innerText = `${confirmText} (${num})`; let timer = setInterval(() => { num--; confirmBtn.innerText = `${confirmText} (${num})`; if (num === 0) { confirmBtn.innerText = `${confirmText}`; confirmBtn.style.setProperty( "background", "linear-gradient(to right bottom, rgb(212, 96, 241), rgba(145, 66, 197, 0.5))", "important" ); confirmBtn.disabled = false; clearInterval(timer); } }, 1000); popup.then(async (confirm) => { if (confirm) { let powerOffText = await getPopupText("powerOffText"); showPopup(powerOffText, { confirm: false, cancel: false, }); powerOff(); } }); }) .catch((error) => { console.error("Error:", error); alert("An error occurred: " + error); showPopup(error, { confirm: true, cancel: false }); }); } } ); }); function powerOff() { fetch("/power_toggle", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", // 表单数据类型 }, body: new URLSearchParams({ power_state: "power_off", // 传递的参数 }), }) .then((response) => response.json()) .then(async (data) => { let powerOffIngText = await getPopupText("powerOffIngText"); let popupStr = powerOffIngText; let popup = showPopup(popupStr, { confirm: true, cancel: false, }); const confirmBtn = document.getElementById("confirm-btn"); confirmBtn.disabled = true; confirmBtn.style.background = "gray"; let num = 10; let confirmText = await getPopupText("confirmText"); confirmBtn.innerText = `${confirmText} (${num})`; let timer = setInterval(() => { num--; confirmBtn.innerText = `${confirmText} (${num})`; if (num === 0) { confirmBtn.innerText = `${confirmText}`; confirmBtn.style.setProperty( "background", "linear-gradient(to right bottom, rgb(212, 96, 241), rgba(145, 66, 197, 0.5))", "important" ); confirmBtn.disabled = false; clearInterval(timer); } }, 1000); }) .catch((error) => { console.error("Error:", error); alert("An error occurred: " + error); showPopup(error, { confirm: true, cancel: false }); }); } const robotInfoTitle = document.getElementById('robot-info-title'); // 获取“开发者模式”按钮元素 const developerModeBtn = document.getElementById('developer-mode-btn'); // 用于存储点击次数 let clickCount = 0; // 用于存储最后一次点击的时间 let lastClickTime = 0; // 定义点击间隔时间(单位:毫秒) const clickInterval = 500; // 500毫秒内点击3次 // 监听点击事件 robotInfoTitle.addEventListener('click', function () { // 如果点击事件的目标是“开发者模式”按钮,则不执行逻辑 if (event.target === developerModeBtn || event.target.closest('.btn')) { return; } const currentTime = new Date().getTime(); // 如果当前点击时间与上次点击时间间隔大于设定的间隔时间,则重置点击次数 if (currentTime - lastClickTime > clickInterval) { clickCount = 0; } // 增加点击次数 clickCount++; // 更新最后一次点击时间 lastClickTime = currentTime; // 如果点击次数达到3次,则执行相应的方法 if (clickCount === 3) { toggleDeveloperMode(); clickCount = 0; // 重置点击次数 } }); function toggleDeveloperMode() { const developerMode = document.getElementById('developer-mode-btn'); if (developerMode.style.display === 'none') { developerMode.style.display = 'block'; // localStorage.setItem("developerModeFlag", true); } else { developerMode.style.display = 'none'; // localStorage.setItem("developerModeFlag", false); } } // 监听“开发者模式”按钮的点击事件 developerModeBtn.addEventListener('click', function () { // 显示密码框 showPwdModal().then(async (confirm) => { if (confirm) { if (pwdInput.value === "") { let pwdEmptyText = await getPopupText("pwdEmptyText"); showPopup(pwdEmptyText); return; } else { fetch("/develop_login", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ password: pwdInput.value, }), }) .then((response) => response.json()) .then(async (data) => { if (data.success) { window.location.href = "/developer"; } else { let pwdErrorText = await getPopupText("pwdErrorText"); showPopup(pwdErrorText); } }) .catch((error) => { console.error("Error:", error); }); } } }); }); // const developerModeBtnStatus = localStorage.getItem("developerModeFlag") || false; // if (developerModeBtnStatus) { // developerModeBtn.style.display = 'block'; // } else { // developerModeBtn.style.display = 'none'; // }