window.onload = function () { function getStatus() { return new Promise((resolve, reject) => { fetch("/get_status") .then((response) => { if (!response.ok) { reject(new Error("Network response was not ok")); } return response.json(); }) .then((data) => resolve(data)) // 如果成功,返回数据 .catch((error) => { console.error("There was a problem with the fetch operation:", error); reject(error); // 如果发生错误,返回错误 }); }); } // 虚拟模式 const developBtn = document.getElementById("develop-btn"); const modeRealText = document.getElementById("mode-real-text"); const changePower = document.getElementById("change-power"); const changePowerText = document.getElementById("change-power-text"); const loadBtn = document.getElementById("load-btn"); const loadText = document.getElementById("load-text"); // 虚拟模式显示 modeRealText.innerText = parseInt(localStorage.getItem("modeReal")) === 0 ? "开" : "关"; // 力控方式按钮显示 changePower.style.display = parseInt(localStorage.getItem("modeReal")) === 0 ? "flex" : "none"; loadText.innerText = parseInt(localStorage.getItem("loadMode")) === 1 ? "开" : "关"; developBtn.addEventListener("click", function () { getStatus() .then(async (data) => { if (data.is_massaging || data.is_pause) { let stopPleaseText = await getPopupText("stopPleaseText"); showPopup(stopPleaseText, { confirm: true, cancel: false }); return; } else { if (parseInt(localStorage.getItem("loadMode")) === 1) { let noToggleText = await getPopupText("noToggleText"); showPopup(noToggleText); return; } else { const modeReal = parseInt(localStorage.getItem("modeReal")) === 0 ? 0 : 1; if (modeReal === 1) { localStorage.setItem("modeReal", 0); modeRealText.innerText = "开"; changePower.style.display = "flex"; changePowerText.innerText = localStorage.getItem("powerControl") ? localStorage.getItem("powerControl") : "导纳"; } else { localStorage.setItem("modeReal", 1); modeRealText.innerText = "关"; changePower.style.display = "none"; } } } }) .catch((error) => { console.error("Error:", error); showPopup(error, { confirm: true, cancel: false }); }); }); loadBtn.addEventListener("click", function () { getStatus() .then((data) => { if (data.is_massaging || data.is_pause) { showPopup("请先停止按摩...", { confirm: true, cancel: false }); return; } else { if (parseInt(localStorage.getItem("modeReal")) === 0) { showPopup("循环模式下和虚拟模式无法同时开启", { confirm: true, cancel: false }); return; } else { const loadMode = parseInt(localStorage.getItem("loadMode")) === 1 ? 1 : 0; if (loadMode === 0) { localStorage.setItem("loadMode", 1); loadText.innerText = "开"; } else { localStorage.setItem("loadMode", 0); loadText.innerText = "关"; } } } }) .catch((error) => { console.error("Error:", error); showPopup(error, { confirm: true, cancel: false }); }); }); const changePowerBtn = document.getElementById("change-power-btn"); changePowerText.innerText = localStorage.getItem("powerControl") ? localStorage.getItem("powerControl") : "导纳"; changePowerBtn.addEventListener("click", function () { let powerControl = localStorage.getItem("powerControl"); if (powerControl === "导纳" || !powerControl) { localStorage.setItem("powerControl", "力位混合"); changePowerText.innerText = "力位混合"; } else { localStorage.setItem("powerControl", "导纳"); changePowerText.innerText = "导纳"; } }); // 机械臂打包按钮 const robotPackBtn = document.getElementById("robot-pack-btn"); robotPackBtn.addEventListener("click", function () { getStatus() .then((data) => { if (data.is_massaging || data.is_pause) { showPopup("请先停止按摩...", { confirm: true, cancel: false }); return; } else { showPopup("准备运动到打包位置,请确定是否已经取下按摩头!").then( (confirm) => { if (confirm) { fetch("/pack_mode", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", // 表单数据类型 }, }); localStorage.setItem("modeReal", 1); modeRealText.innerText = "关"; changePower.style.display = "none"; localStorage.setItem("loadMode", 0); loadText.innerText = "关"; } } ); } }) .catch((error) => { console.error("Error:", error); showPopup(error, { confirm: true, cancel: false }); }); }); let jumpModeInterval = null; const massageLog = document.getElementById("massage-log-btn"); const uiLog = document.getElementById("ui-log-btn"); const langLog = document.getElementById("language-log-btn"); massageLog.addEventListener("click", function () { loadLogData("show", "massage"); // showLogModal(); }) uiLog.addEventListener("click", function () { loadLogData("show", "ui"); // showLogModal(); }) langLog.addEventListener("click", function () { loadLogData("show", "language"); // showLogModal(); }) const logModal = document.getElementById("log-modal"); const logBg = document.getElementById("log-bg"); const logInput = document.getElementById("log-input"); const logSearch = document.getElementById("log-search"); const logRefresh = document.getElementById("log-refresh"); const logText = document.getElementById("log-text"); logBg.addEventListener("click", function () { logModal.style.display = "none"; logInput.value = ""; logText.innerHTML = ""; }); // 自定义日志高亮规则 Prism.languages.log = { 'info': /INFO/, 'error': /ERROR/, 'warning': /WARNING/, 'timestamp': /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/ }; let currentPage = 1; // 当前页码 let totalPages = 1; // 总页数 let currentLogType = ""; // 当前日志类型 let currentKeyword = ""; // 当前搜索关键字 let isLoading = false; // 是否正在加载数据 // 加载日志数据 function loadLogData(clickType, type, keyword = "", page = 1) { if (isLoading) return; // 如果正在加载,则退出 isLoading = true; currentLogType = type; currentKeyword = keyword; currentPage = page; // 显示加载指示器 document.getElementById("loading-indicator").style.display = "block"; getLog(type, keyword, page) .then((data) => { if (clickType === 'show') { showLogModal(); } // 如果是第一页,清空内容 if (page === 1) { logText.innerHTML = `
${data.data.join("\n")}
`;
} else {
// 追加新内容
const existingContent = logText.querySelector("code").textContent;
logText.innerHTML = `${existingContent}\n${data.data.join("\n")}
`;
}
// 调用 Prism.js 高亮
Prism.highlightAll();
// 更新总页数
totalPages = Math.ceil(data.total / data.pageSize);
// 隐藏加载指示器
document.getElementById("loading-indicator").style.display = "none";
isLoading = false;
})
.catch((error) => {
console.error("加载日志失败:", error);
document.getElementById("loading-indicator").style.display = "none";
isLoading = false;
});
}
logText.addEventListener("scroll", () => {
if (
logText.scrollTop + logText.clientHeight >=
logText.scrollHeight - 10 // 接近底部时触发
) {
if (currentPage < totalPages) {
loadLogData('scroll', currentLogType, currentKeyword, currentPage + 1);
}
}
});
logSearch.addEventListener("click", () => {
const keyword = logInput.value.trim();
loadLogData('search', currentLogType, keyword, 1); // 搜索时重置到第一页
});
logRefresh.addEventListener("click", () => {
logInput.value = currentKeyword;
loadLogData('refresh', currentLogType, currentKeyword, currentPage);
});
logInput.addEventListener("keyup", (event) => {
if (event.keyCode === 13) {
const keyword = logInput.value.trim();
loadLogData('search', currentLogType, keyword, 1); // 按下回车时搜索
}
});
// 显示日志弹窗
function showLogModal() {
logModal.style.display = "block";
}
function getLog(type, keyword = "", page = 1, pageSize = 400) {
return new Promise((resolve, reject) => {
fetch(`/get_log?type=${type}&keyword=${keyword}&page=${page}&pageSize=${pageSize}`)
.then((response) => response.json())
.then((data) => {
if (data.error) {
showPopup(data.error, { confirm: true, cancel: false });
reject(data.error); // 如果有错误,拒绝 Promise
} else {
resolve(data); // 如果成功,返回数据
}
})
.catch((error) => {
console.error(error);
showPopup(error, { confirm: true, cancel: false });
reject(error); // 捕获错误并拒绝 Promise
});
});
}
// 获取按摩头配置
function loadMassageHeads() {
fetch('/get_massage_heads')
.then(response => response.json())
.then(data => {
if (data.status === 'success') {
updateHeadCheckboxes(data.data);
} else {
showPopup('获取按摩头配置失败: ' + data.message, {confirm: true, cancel: false});
}
})
.catch(error => {
showPopup('请求出错: ' + error, {confirm: true, cancel: false});
});
}
const saveBtn = document.getElementById('save-heads-btn');
document.querySelectorAll('input[name="head-option"]').forEach(checkbox => {
checkbox.addEventListener('change', updateSaveButtonState);
});
// 更新保存按钮状态
function updateSaveButtonState() {
const hasSelected = Array.from(document.querySelectorAll('input[name="head-option"]:checked')).length > 0;
if (!hasSelected) {
saveBtn.disabled = true;
saveBtn.style.opacity = '0.4';
showPopup('请至少选择一个按摩头', { confirm: true, cancel: false })
} else {
saveBtn.disabled = false;
saveBtn.style.opacity = '1';
}
}
// 保存按摩头配置
function saveMassageHeads() {
if(saveBtn.style.opacity == '0.4') {
return;
}
getStatus()
.then((data) => {
if (data.is_massaging || data.is_pause) {
showPopup("按摩中无法设置", { confirm: true, cancel: false });
return;
} else {
const headsConfig = {};
document.querySelectorAll('input[name="head-option"]').forEach(checkbox => {
const headId = checkbox.value;
headsConfig[headId] = {
display: checkbox.checked,
name: document.querySelector(`label[for="head-${headId}"]`).textContent
};
});
fetch('/set_massage_heads', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ heads_config: headsConfig })
})
.then(response => response.json())
.then(data => {
if (data.status === 'success') {
showPopup('按摩头设置已保存', {confirm: true, cancel: false});
} else {
showPopup('保存失败: ' + data.message, {confirm: true, cancel: false});
}
})
.catch(error => {
showPopup('保存出错: ' + error, {confirm: true, cancel: false});
});
}
})
.catch((error) => {
console.error("Error:", error);
showPopup(error, { confirm: true, cancel: false });
});
}
async function getJumpMode() {
try {
const response = await fetch('/get_jump_mode');
const { data } = await response.json();
document.getElementById('jump-text').textContent =
data.enabled ? '已开启' : '已关闭';
jumpModeInterval = data.enabled;
} catch (error) {
console.error('获取跳跃模式失败:', error);
showPopup('获取跳跃模式失败');
}
}
// 切换跳跃模式
document.getElementById('jump-toggle-btn').addEventListener('click', async () => {
getStatus()
.then(async (data) => {
if (data.is_massaging || data.is_pause) {
showPopup("请先停止按摩...", { confirm: true, cancel: false });
return;
} else {
if(jumpModeInterval === null || jumpModeInterval === undefined) {
try {
const current = await fetch('/get_jump_mode').then(res => res.json());
const newState = !current.data.enabled;
toggleJumpMode(newState);
} catch (error) {
console.error('切换跳跃模式失败:', error);
showPopup('切换跳跃模式失败');
}
} else {
const newState = !jumpModeInterval;
toggleJumpMode(newState);
}
}
})
.catch((error) => {
console.error("Error:", error);
showPopup(error, { confirm: true, cancel: false });
});
});
async function toggleJumpMode(newState) {
// 设置新状态
const response = await fetch('/set_jump_mode', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ enabled: newState })
});
const result = await response.json();
if (result.status === 'success') {
document.getElementById('jump-text').textContent = newState ? '已开启' : '已关闭';
jumpModeInterval = newState;
showPopup(`跳跃模式已${newState ? '开启' : '关闭'}`);
} else {
showPopup('操作失败: ' + result.message);
}
}
// 更新复选框状态
function updateHeadCheckboxes(headsConfig) {
for (const [headId, config] of Object.entries(headsConfig)) {
const checkbox = document.getElementById(`head-${headId}`);
if (checkbox) {
checkbox.checked = config.display;
}
}
}
// 绑定保存按钮事件
saveBtn.addEventListener('click', saveMassageHeads);
loadMassageHeads();
getJumpMode();
};
const wifiModal = document.getElementById("wifi-modal");
function getWifiStatus() {
fetch("/is_connected")
.then((response) => response.json())
.then((data) => {
const myWifi = document.getElementById("my-wifi");
if (data.is_connected) {
myWifi.style.display = "flex";
getWifiInfo();
} else {
myWifi.style.display = "none";
showPopup("星耀按摩机器人未连接网络,请检查网络连接后重试。", {confirm: true, cancel: false});
}
});
}
const wifiName = document.getElementById("wifi-name");
function getWifiInfo() {
fetch("/get_current_connection")
.then((response) => response.json())
.then((data) => {
const wifiTxt = document.getElementById("wifi-txt");
if (data.connection_info[0].name) {
wifiTxt.innerText = data.connection_info[0].name;
wifiName.innerText = data.connection_info[0].name;
} else {
wifiTxt.innerText = "未知网络或未连接";
wifiTxt.style.color = "rgba(145, 66, 197, 1)";
}
});
}
let isAllowClick = true;
let selectedSsid = ""; // 全局变量,用于存储当前选择的 SSID
let selectedWifiImg = ""; // 全局变量,用于存储当前选择的 Wi-Fi 信号强度图片
let selectedWifiImgElement = null;
function scanWifi() {
const wifiList = document.getElementById("wifi-list");
wifiList.innerHTML = `