// 确保在DOM加载完成后执行 window.addEventListener('DOMContentLoaded', function() { console.log('DOMContentLoaded - Record.js executing'); // 录制相关全局变量 window.isRecording = false; window.isPlaying = false; window.recordedActions = []; window.recordingStartTime = 0; // 获取录制和回放按钮 const recordBtn = document.getElementById('recordBtn'); const playbackBtn = document.getElementById('playbackBtn'); const status = document.getElementById('status'); // 获取轨迹管理相关元素 const pathNameInput = document.getElementById('pathName'); const savePathBtn = document.getElementById('savePathBtn'); const pathList = document.getElementById('pathList'); // 调试信息 console.log('Record.js loaded'); console.log('recordBtn:', recordBtn); console.log('playbackBtn:', playbackBtn); console.log('status:', status); console.log('pathNameInput:', pathNameInput); console.log('savePathBtn:', savePathBtn); console.log('pathList:', pathList); // 列出已保存的轨迹 function listPaths() { fetch('/list_paths') .then(response => response.json()) .then(data => { if (data.status === 'success') { // 清空路径列表 pathList.innerHTML = ''; // 添加路径到列表 data.paths.forEach(path => { const li = document.createElement('li'); li.innerHTML = ` ${path}
错误: ${data.message}
`; } }) .catch(error => { status.innerHTML = `通信错误: ${error.message}
`; }); } // 保存轨迹 function savePath() { const pathName = pathNameInput.value.trim(); if (!pathName) { status.innerHTML = '请输入轨迹名称
'; return; } if (window.recordedActions.length === 0) { status.innerHTML = '没有可保存的轨迹
'; return; } fetch('/save_path', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: pathName, actions: window.recordedActions }) }) .then(response => response.json()) .then(data => { if (data.status === 'success') { status.innerHTML = `${data.message}
`; // 清空输入框 pathNameInput.value = ''; // 更新轨迹列表 listPaths(); } else { status.innerHTML = `错误: ${data.message}
`; } }) .catch(error => { status.innerHTML = `通信错误: ${error.message}
`; }); } // 加载轨迹 function loadPath(pathName) { fetch(`/load_path?name=${pathName}`) .then(response => response.json()) .then(data => { if (data.status === 'success') { window.recordedActions = data.data.actions; status.innerHTML = `轨迹 ${pathName} 加载成功,共 ${window.recordedActions.length} 个操作
`; } else { status.innerHTML = `错误: ${data.message}
`; } }) .catch(error => { status.innerHTML = `通信错误: ${error.message}
`; }); } // 删除轨迹 function deletePath(pathName) { if (confirm(`确定要删除轨迹 ${pathName} 吗?`)) { fetch('/delete_path', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: pathName }) }) .then(response => response.json()) .then(data => { if (data.status === 'success') { status.innerHTML = `${data.message}
`; // 更新轨迹列表 listPaths(); } else { status.innerHTML = `错误: ${data.message}
`; } }) .catch(error => { status.innerHTML = `通信错误: ${error.message}
`; }); } } // 保存轨迹按钮点击事件 if (savePathBtn) { savePathBtn.addEventListener('click', savePath); } // 页面加载时列出已保存的轨迹 listPaths(); // 录制按钮点击事件 - 支持鼠标和触摸事件 function toggleRecording() { console.log('toggleRecording called, current isRecording:', window.isRecording); if (window.isPlaying) { alert('正在回放,不能录制'); return; } if (window.isRecording) { // 停止录制 window.isRecording = false; recordBtn.textContent = '开始录制'; status.innerHTML = `录制完成,共记录 ${window.recordedActions.length} 个操作
`; console.log('Recording stopped, actions:', window.recordedActions); } else { // 开始录制 window.isRecording = true; window.recordedActions = []; window.recordingStartTime = Date.now(); // 重置上一个记录的动作 if (window.lastRecordedAction !== undefined) { window.lastRecordedAction = null; } recordBtn.textContent = '停止录制'; status.innerHTML = `开始录制...
`; console.log('Recording started'); } } console.log('Adding click event listener to recordBtn'); recordBtn.addEventListener('click', toggleRecording); // 录制按钮 - 触摸事件 console.log('Adding touchstart event listener to recordBtn'); recordBtn.addEventListener('touchstart', (e) => { console.log('Touchstart event on recordBtn'); e.preventDefault(); // 防止默认行为 toggleRecording(); }); // 回放按钮点击事件 - 支持鼠标和触摸事件 function startPlayback() { console.log('startPlayback called, recordedActions:', window.recordedActions); if (window.isRecording) { alert('请先停止录制'); return; } if (window.recordedActions.length === 0) { status.innerHTML = `没有可回放的操作
`; console.log('No actions to playback'); return; } // 保存当前录制状态并禁用录制 const originalRecordingState = window.isRecording; window.isRecording = false; window.isPlaying = true; status.innerHTML = `开始回放...
`; console.log('Starting playback'); // 按时间顺序回放操作 let currentTime = 0; const totalDuration = window.recordedActions[window.recordedActions.length - 1].timestamp; // 执行所有操作 window.recordedActions.forEach((action, index) => { if (index === 0) { // 第一个操作立即执行 console.log('Executing action immediately:', action); controlMotor(action.direction); } else { // 计算与前一个操作的时间差 const prevAction = window.recordedActions[index - 1]; const delay = action.timestamp - prevAction.timestamp; currentTime += delay; console.log('Scheduling action:', action, 'at delay:', currentTime); setTimeout(() => { // 调用控制函数执行操作 console.log('Executing action:', action); controlMotor(action.direction); }, currentTime); } }); // 回放完成后,确保发送停止请求 setTimeout(() => { console.log('Playback completed, sending stop command'); controlMotor('stop'); status.innerHTML = `回放完成
`; console.log('Playback completed'); // 恢复原始录制状态 window.isRecording = originalRecordingState; window.isPlaying = false; }, totalDuration + 2000); // 增加延迟,确保所有动作都已执行 } console.log('Adding click event listener to playbackBtn'); playbackBtn.addEventListener('click', startPlayback); // 回放按钮 - 触摸事件 console.log('Adding touchstart event listener to playbackBtn'); playbackBtn.addEventListener('touchstart', (e) => { console.log('Touchstart event on playbackBtn'); e.preventDefault(); // 防止默认行为 startPlayback(); }); });