任务执行
This commit is contained in:
@@ -16,6 +16,11 @@ createApp({
|
||||
logs: [],
|
||||
showQrModal: false,
|
||||
qrValue: '',
|
||||
// 错误弹窗 / 单步执行
|
||||
waitingError: false,
|
||||
errorMsg: '',
|
||||
waitingStep: false,
|
||||
stepLabel: '',
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -25,7 +30,9 @@ createApp({
|
||||
running: '任务运行中',
|
||||
paused: '已暂停',
|
||||
completed: '已完成',
|
||||
waiting_qr: '等待输入二维码'
|
||||
waiting_qr: '等待输入二维码',
|
||||
waiting_error: '⚠️ 执行错误',
|
||||
waiting_step: '🦶 等待步骤确认',
|
||||
}
|
||||
return map[this.missionState] || '未知'
|
||||
},
|
||||
@@ -53,6 +60,22 @@ createApp({
|
||||
this.progress = data.progress || 0
|
||||
if (data.tasks) this.tasks = data.tasks
|
||||
|
||||
// 错误弹窗
|
||||
if (data.waiting_error) {
|
||||
this.waitingError = true
|
||||
this.errorMsg = data.error_msg || '任务执行出错'
|
||||
} else {
|
||||
this.waitingError = false
|
||||
}
|
||||
|
||||
// 步骤确认弹窗
|
||||
if (data.waiting_step) {
|
||||
this.waitingStep = true
|
||||
this.stepLabel = data.step_label || ''
|
||||
} else {
|
||||
this.waitingStep = false
|
||||
}
|
||||
|
||||
// QR 弹窗
|
||||
if (this.missionState === 'waiting_qr' && !this.showQrModal) {
|
||||
this.showQrModal = true
|
||||
@@ -68,7 +91,7 @@ createApp({
|
||||
} catch (e) {}
|
||||
},
|
||||
async pollLogs() {
|
||||
if (this.missionState !== 'running' && this.missionState !== 'waiting_qr') return
|
||||
if (this.missionState !== 'running' && this.missionState !== 'waiting_qr' && this.missionState !== 'waiting_error' && this.missionState !== 'waiting_step') return
|
||||
try {
|
||||
const res = await fetch(API + '/api/mission/log')
|
||||
const data = await res.json()
|
||||
@@ -91,6 +114,40 @@ createApp({
|
||||
await fetch(API + '/api/mission/start', { method: 'POST' })
|
||||
this.missionState = 'running'
|
||||
},
|
||||
async startSingleStep() {
|
||||
if (this.missionState !== 'idle') return
|
||||
this.logs = []
|
||||
this.progress = 0
|
||||
this.report = null
|
||||
this.showQrModal = false
|
||||
await fetch(API + '/api/mission/start', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ single_step: true })
|
||||
})
|
||||
if (this.polling) clearInterval(this.polling)
|
||||
this.poll()
|
||||
},
|
||||
async skipError() {
|
||||
await fetch(API + '/api/mission/error-skip', { method: 'POST' })
|
||||
this.waitingError = false
|
||||
},
|
||||
async abortError() {
|
||||
await fetch(API + '/api/mission/error-abort', { method: 'POST' })
|
||||
this.waitingError = false
|
||||
},
|
||||
async confirmStep() {
|
||||
await fetch(API + '/api/mission/singlestep/confirm', { method: 'POST' })
|
||||
this.waitingStep = false
|
||||
},
|
||||
async retryStep() {
|
||||
await fetch(API + '/api/mission/singlestep/retry', { method: 'POST' })
|
||||
this.waitingStep = false
|
||||
},
|
||||
async abortStep() {
|
||||
await fetch(API + '/api/mission/singlestep/abort', { method: 'POST' })
|
||||
this.waitingStep = false
|
||||
},
|
||||
async pauseMission() {
|
||||
await fetch(API + '/api/mission/pause', { method: 'POST' })
|
||||
this.missionState = 'paused'
|
||||
@@ -104,6 +161,8 @@ createApp({
|
||||
await fetch(API + '/api/mission/stop', { method: 'POST' })
|
||||
this.missionState = 'idle'
|
||||
this.showQrModal = false
|
||||
this.waitingError = false
|
||||
this.waitingStep = false
|
||||
},
|
||||
async submitQr() {
|
||||
const val = this.qrValue.trim()
|
||||
|
||||
@@ -59,6 +59,7 @@ createApp({
|
||||
qrScanningId: null,
|
||||
armCameraUrl: API + '/api/camera/arm_refresh',
|
||||
newQrName: '',
|
||||
armInitialPose: [0, 0, 0, 0, 0, 0],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -489,6 +490,7 @@ createApp({
|
||||
this.missionConfig.cols = data.config.cols || 3
|
||||
this.missionConfig.grid = data.config.grid || []
|
||||
this.missionConfig.positions = data.config.positions || []
|
||||
this.armInitialPose = data.config.arm_initial_pose || [0, 0, 0, 0, 0, 0]
|
||||
}
|
||||
} catch (e) { console.error('加载任务配置失败', e) }
|
||||
},
|
||||
@@ -520,7 +522,8 @@ createApp({
|
||||
body: JSON.stringify({
|
||||
rows: this.missionConfig.rows,
|
||||
cols: this.missionConfig.cols,
|
||||
grid: this.missionConfig.grid
|
||||
grid: this.missionConfig.grid,
|
||||
arm_initial_pose: this.armInitialPose
|
||||
})
|
||||
})
|
||||
const data = await res.json()
|
||||
@@ -529,6 +532,33 @@ createApp({
|
||||
}
|
||||
} catch (e) { alert('保存失败: ' + e.message) }
|
||||
},
|
||||
async saveArmInitialPose() {
|
||||
try {
|
||||
const res = await fetch(API + '/api/mission/config', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
rows: this.missionConfig.rows,
|
||||
cols: this.missionConfig.cols,
|
||||
grid: this.missionConfig.grid,
|
||||
arm_initial_pose: this.armInitialPose
|
||||
})
|
||||
})
|
||||
const data = await res.json()
|
||||
if (data.ok) alert('✅ 机械臂初始姿态已保存')
|
||||
else alert('❌ 保存失败')
|
||||
} catch (e) { alert('保存失败: ' + e.message) }
|
||||
},
|
||||
async loadArmCurrentAngles() {
|
||||
if (!this.armConnected) { alert('机械臂未连接'); return }
|
||||
try {
|
||||
const res = await fetch(API + '/api/arm/get_angles')
|
||||
const data = await res.json()
|
||||
if (data.ok && data.angles) {
|
||||
this.armInitialPose = [...data.angles]
|
||||
}
|
||||
} catch (e) { alert('读取角度失败: ' + e.message) }
|
||||
},
|
||||
async loadAllMachines() {
|
||||
try {
|
||||
const res = await fetch(API + '/api/mission/machines')
|
||||
|
||||
Reference in New Issue
Block a user