Commit a2410eaa authored by 高晓帆's avatar 高晓帆

change:softDrivingPattern

parent 528d0460
cmake_minimum_required(VERSION 3.5)
project (TruckMonitorView)
set (CMAKE_CXX_STANDARD 11)
# Version.
set (MAJOR_VERSION "1")
set (MINOR_VERSION "1")
set (PATCH_VERSION "3")
# Import cmake modules.
list (APPEND CMAKE_MODULE_PATH "$ENV{HT_BUILDSYS_CMAKE_MODULES}")
include (HtCMakePub)
install_system_packages (
PACKAGES "nodejs"
)
add_custom_command (
OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/dist"
COMMAND "npm" "install" "--force"
COMMAND "npm" "run" "build"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
add_custom_target ("${PROJECT_NAME}" ALL
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dist"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/dist"
DESTINATION "/var/www/${PROJECT_NAME}"
)
# Pack.
set (CPACK_PACKAGE_NAME "ht-${PROJECT_NAME}")
set (CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}")
set (CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}")
set (CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}")
set (CPACK_PACKAGE_CONTACT "Fan Jianping <jianping.fan@waytous.com>, Li Lingyan <lingyan.li@waytous.com>, Gao Xiaofan <xiaofan.gao@waytous.com>")
set (CPACK_DEBIAN_PACKAGE_DESCRIPTION "webtruckview. Branch: ${GIT_BRANCH}. Commit: ${GIT_LAST_COMMIT}.")
include(HtCMakeDeb)
cmake_minimum_required(VERSION 3.5)
project (TruckMonitorView)
set (CMAKE_CXX_STANDARD 11)
# Version.
set (MAJOR_VERSION "2")
set (MINOR_VERSION "1")
set (PATCH_VERSION "1")
# Import cmake modules.
list (APPEND CMAKE_MODULE_PATH "$ENV{HT_BUILDSYS_CMAKE_MODULES}")
include (HtCMakePub)
install_system_packages (
PACKAGES "nodejs"
)
add_custom_command (
OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/dist"
COMMAND "npm" "install" "--force"
COMMAND "npm" "run" "build"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
add_custom_target ("${PROJECT_NAME}" ALL
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dist"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/dist"
DESTINATION "/var/www/${PROJECT_NAME}"
)
# Pack.
set (CPACK_PACKAGE_NAME "ht-${PROJECT_NAME}")
set (CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}")
set (CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}")
set (CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}")
set (CPACK_PACKAGE_CONTACT "Fan Jianping <jianping.fan@waytous.com>, Li Lingyan <lingyan.li@waytous.com>, Gao Xiaofan <xiaofan.gao@waytous.com>")
set (CPACK_DEBIAN_PACKAGE_DESCRIPTION "webtruckview. Branch: ${GIT_BRANCH}. Commit: ${GIT_LAST_COMMIT}.")
include(HtCMakeDeb)
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div class="log-out">
<p>{{ tipsLogout }}</p>
<div class="footer">
<Button type="info" class="btn" @click="doSureLogout">确定</Button>
<Button type="error" @click="doCancelLogout">取消</Button>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
import { useVehicleStore } from '../store/VehicleStore';
import { useStateStore } from '../store/StateStore';
import { storeToRefs } from 'pinia';
import writeLog from '../js/writeLog.js'
const props = defineProps({
isShow: Boolean
})
const tipsLogout = ref('退出当前系统')
const logoutStep = ref(0)
const vehicleStore = useVehicleStore()
const vehicleStoreToRefs = storeToRefs(vehicleStore)
const { pattern } = vehicleStoreToRefs
const stateStore = useStateStore()
const emits = defineEmits(['handleSend', 'closeModal'])
function doCancelLogout() {
logoutStep.value = 0
emits('closeModal')
}
function closeSystem() {
logoutStep.value = 0
window.state = 'logout'
emits('handleSend', {
type: '/btn/quitApp',
msg: {}
})
stateStore.setData('loginAck', null)
}
function doSureLogout() {
if (pattern.value === 1 && logoutStep.value === 0) {
tipsLogout.value = '当前是无人模式,确定退出程序'
logoutStep.value = 1
} else {
closeSystem()
}
}
watch(() => props.isShow, (value) => {
if (value) {
writeLog('INFO',"退出系统")
tipsLogout.value = '退出当前系统'
}
}, {
immediate: true
})
</script>
<style lang="less" scoped>
.log-out {
&>p {
margin-bottom: 20px;
}
.footer {
text-align: end;
.btn {
margin-right: 10px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="log-out">
<p>{{ tipsLogout }}</p>
<div class="footer">
<Button type="info" class="btn" @click="doSureLogout">确定</Button>
<Button type="error" @click="doCancelLogout">取消</Button>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
import { useVehicleStore } from '../store/VehicleStore';
import { useStateStore } from '../store/StateStore';
import { storeToRefs } from 'pinia';
import writeLog from '../js/writeLog.js'
const props = defineProps({
isShow: Boolean
})
const tipsLogout = ref('退出当前系统')
const logoutStep = ref(0)
const vehicleStore = useVehicleStore()
const vehicleStoreToRefs = storeToRefs(vehicleStore)
const { pattern ,softDrivingPattern} = vehicleStoreToRefs
const stateStore = useStateStore()
const emits = defineEmits(['handleSend', 'closeModal'])
function doCancelLogout() {
logoutStep.value = 0
emits('closeModal')
}
function closeSystem() {
logoutStep.value = 0
window.state = 'logout'
emits('handleSend', {
type: '/btn/quitApp',
msg: {}
})
stateStore.setData('loginAck', null)
}
function doSureLogout() {
if (softDrivingPattern.value === 1 && logoutStep.value === 0) {
tipsLogout.value = '当前是无人模式,确定退出程序'
logoutStep.value = 1
} else {
closeSystem()
}
}
watch(() => props.isShow, (value) => {
if (value) {
writeLog('INFO',"退出系统")
tipsLogout.value = '退出当前系统'
}
}, {
immediate: true
})
</script>
<style lang="less" scoped>
.log-out {
&>p {
margin-bottom: 20px;
}
.footer {
text-align: end;
.btn {
margin-right: 10px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="mode-switch">
<div class="content">
<p>{{content}}</p>
<p>{{contentTip}}</p>
</div>
<div class="footer">
<Button class="btn" type="info" @click="doSure" v-show="isShowSure">{{sureText}}</Button>
<Button type="error" @click="doCancel">{{cancelText}}</Button>
</div>
</div>
</template>
<script setup>
import { watch, ref } from 'vue'
import { useVehicleStore } from '../store/VehicleStore';
import { storeToRefs } from 'pinia';
let modeTimer = null
const CLOSE_MODE_TIME = 5 * 1000
const props = defineProps({
isShow: Boolean
})
const content = ref('')
const contentTip = ref('')
const isShowSure = ref(true)
const sureText = ref('确定')
const cancelText = ref('取消')
const step = ref(0)
const vehicleStore = useVehicleStore()
const vehicleStoreToRefs = storeToRefs(vehicleStore)
const { pattern, patternAck, singleTrackAck } = vehicleStoreToRefs
const emits = defineEmits(['handleSend', 'closeModal'])
function doSure() {
let type = null, iscontinue = null
// 有人——无人
if (pattern.value === 0) {
if (step.value === 1) {
type = 0
content.value = '正在等待机群批准模式切换请求'
step.value = 2
} else if (step.value === 3) {
type = 2
iscontinue = 1
content.value = '模式切换审批成功,正在接管无人驾驶'
step.value = 4
}
} else {
// 有人——无人
if (step.value === 1) {
type = 2
content.value = '正在取消无人驾驶接管'
step.value = 4
}
}
isShowSure.value = false
cancelText.value = '取消'
const changePattern = pattern.value === 0 ? 1 : 0
emits('handleSend', {
type: '/pattern/req',
msg: {
type,
pattern: changePattern,
iscontinue
}
})
}
function doCancel() {
if ([2, 3, 4].includes(step.value)) {
// type === 1:取消云端请求;type === 3:取消车端请求
let type = step.value === 2 ? 1 : 3
let iscontinue = null
// 切换为无人驾驶,并且不继续上一次任务
if (pattern.value === 0 && step.value === 3) {
iscontinue = 0
type = 2
content.value = '模式切换审批成功,正在接管无人驾驶'
step.value = 4
isShowSure.value = false
cancelText.value = '取消'
}
const changePattern = pattern.value === 0 ? 1 : 0
emits('handleSend', {
type: '/pattern/req',
msg: {
type,
pattern: changePattern,
iscontinue
}
})
} else {
emits('closeModal')
}
}
function doCloseMode() {
emits('closeModal')
if (modeTimer) {
clearTimeout(modeTimer)
modeTimer = null
}
}
watch(() => props.isShow, (value) => {
if (value) {
step.value = 1
isShowSure.value = true
sureText.value = '确定'
cancelText.value = '取消'
// 有人——无人
if (pattern.value === 0) {
const { singleTrackEnable } = singleTrackAck.value || {}
if (singleTrackEnable) {
content.value = '当前处于单机循迹模式,是否切换无人模式'
contentTip.value = '(确保当前位置处于路线中)'
} else {
content.value = '切换为无人驾驶模式需要发送机群确认'
contentTip.value = ''
}
} else {
content.value = '是否切换为有人驾驶模式'
contentTip.value = ''
}
}
}, {
immediate: true
})
watch(patternAck, (result) => {
console.log(result)
if (!result) return
contentTip.value = ''
const { singleTrackEnable } = singleTrackAck.value || {}
if (modeTimer) {
clearTimeout(modeTimer)
modeTimer = null
}
const {type, pattern: resultPattern, status} = result
if (step.value === 2) {
isShowSure.value = false
cancelText.value = '确定'
if (type === 0) {
switch (status) {
case 0:
if (singleTrackEnable) {
emits('handleSend', {
type: '/pattern/req',
msg: {
type: 2,
pattern: 1,
iscontinue: 0
}
})
} else {
content.value = '是否继续上一次任务(确保车辆位置未变动)'
step.value = 3
isShowSure.value = true
sureText.value = '是'
cancelText.value = '否'
}
break
case 1:
content.value = '模式切换请求未获得批准'
break
case 2:
content.value = '请先完成此设备的点检工作'
break
case 200:
content.value = '参数校验失败'
break
}
} else {
switch (status) {
case 0:
content.value = '成功'
break
case 1:
content.value = '失败'
break
case 200:
content.value = '参数校验失败'
break
}
step.value = 0
modeTimer = setTimeout(doCloseMode, CLOSE_MODE_TIME)
}
} else if (step.value === 4) {
isShowSure.value = false
cancelText.value = '确定'
if (type === 2) {
switch (status) {
case 0:
content.value = resultPattern === 1 ? '接管成功' : '取消接管成功'
break
case 1:
content.value = resultPattern === 1 ? '接管失败' : '取消接管失败'
break
case 200:
content.value = '参数校验失败'
break
}
} else {
switch (status) {
case 0:
content.value = '成功'
break
case 1:
content.value = '失败'
break
case 200:
content.value = '参数校验失败'
break
}
}
step.value = 0
modeTimer = setTimeout(doCloseMode, CLOSE_MODE_TIME)
}
}, {
deep: true
})
</script>
<style lang="less" scoped>
.mode-switch {
.content {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 30px;
}
.footer {
text-align: end;
.btn {
margin-right: 10px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="mode-switch">
<div class="content">
<p>{{content}}</p>
<p>{{contentTip}}</p>
</div>
<div class="footer">
<Button class="btn" type="info" @click="doSure" v-show="isShowSure">{{sureText}}</Button>
<Button type="error" @click="doCancel">{{cancelText}}</Button>
</div>
</div>
</template>
<script setup>
import { watch, ref } from 'vue'
import { useVehicleStore } from '../store/VehicleStore';
import { storeToRefs } from 'pinia';
let modeTimer = null
const CLOSE_MODE_TIME = 5 * 1000
const props = defineProps({
isShow: Boolean
})
const content = ref('')
const contentTip = ref('')
const isShowSure = ref(true)
const sureText = ref('确定')
const cancelText = ref('取消')
const step = ref(0)
const vehicleStore = useVehicleStore()
const vehicleStoreToRefs = storeToRefs(vehicleStore)
const { pattern,softDrivingPattern, patternAck, singleTrackAck } = vehicleStoreToRefs
const emits = defineEmits(['handleSend', 'closeModal'])
function doSure() {
let type = null, iscontinue = null
// 有人——无人
if (softDrivingPattern.value === 0) {
if (step.value === 1) {
type = 0
content.value = '正在等待机群批准模式切换请求'
step.value = 2
} else if (step.value === 3) {
type = 2
iscontinue = 1
content.value = '模式切换审批成功,正在接管无人驾驶'
step.value = 4
}
} else {
// 有人——无人
if (step.value === 1) {
type = 2
content.value = '正在取消无人驾驶接管'
step.value = 4
}
}
isShowSure.value = false
cancelText.value = '取消'
const changePattern = softDrivingPattern.value === 0 ? 1 : 0
emits('handleSend', {
type: '/pattern/req',
msg: {
type,
pattern: changePattern,
iscontinue
}
})
}
function doCancel() {
if ([2, 3, 4].includes(step.value)) {
// type === 1:取消云端请求;type === 3:取消车端请求
let type = step.value === 2 ? 1 : 3
let iscontinue = null
// 切换为无人驾驶,并且不继续上一次任务
if (softDrivingPattern.value === 0 && step.value === 3) {
iscontinue = 0
type = 2
content.value = '模式切换审批成功,正在接管无人驾驶'
step.value = 4
isShowSure.value = false
cancelText.value = '取消'
}
const changePattern = softDrivingPattern.value === 0 ? 1 : 0
emits('handleSend', {
type: '/pattern/req',
msg: {
type,
pattern: changePattern,
iscontinue
}
})
} else {
emits('closeModal')
}
}
function doCloseMode() {
emits('closeModal')
if (modeTimer) {
clearTimeout(modeTimer)
modeTimer = null
}
}
watch(() => props.isShow, (value) => {
if (value) {
step.value = 1
isShowSure.value = true
sureText.value = '确定'
cancelText.value = '取消'
// 有人——无人
if (softDrivingPattern.value === 0) {
const { singleTrackEnable } = singleTrackAck.value || {}
if (singleTrackEnable) {
content.value = '当前处于单机循迹模式,是否切换无人模式'
contentTip.value = '(确保当前位置处于路线中)'
} else {
content.value = '切换为无人驾驶模式需要发送机群确认'
contentTip.value = ''
}
} else {
content.value = '是否切换为有人驾驶模式'
contentTip.value = ''
}
}
}, {
immediate: true
})
watch(patternAck, (result) => {
console.log(result)
if (!result) return
contentTip.value = ''
const { singleTrackEnable } = singleTrackAck.value || {}
if (modeTimer) {
clearTimeout(modeTimer)
modeTimer = null
}
const {type, pattern: resultPattern, status} = result
if (step.value === 2) {
isShowSure.value = false
cancelText.value = '确定'
if (type === 0) {
switch (status) {
case 0:
if (singleTrackEnable) {
emits('handleSend', {
type: '/pattern/req',
msg: {
type: 2,
pattern: 1,
iscontinue: 0
}
})
} else {
content.value = '是否继续上一次任务(确保车辆位置未变动)'
step.value = 3
isShowSure.value = true
sureText.value = '是'
cancelText.value = '否'
}
break
case 1:
content.value = '模式切换请求未获得批准'
break
case 2:
content.value = '请先完成此设备的点检工作'
break
case 200:
content.value = '参数校验失败'
break
}
} else {
switch (status) {
case 0:
content.value = '成功'
break
case 1:
content.value = '失败'
break
case 200:
content.value = '参数校验失败'
break
}
step.value = 0
modeTimer = setTimeout(doCloseMode, CLOSE_MODE_TIME)
}
} else if (step.value === 4) {
isShowSure.value = false
cancelText.value = '确定'
if (type === 2) {
switch (status) {
case 0:
content.value = resultPattern === 1 ? '接管成功' : '取消接管成功'
break
case 1:
content.value = resultPattern === 1 ? '接管失败' : '取消接管失败'
break
case 200:
content.value = '参数校验失败'
break
}
} else {
switch (status) {
case 0:
content.value = '成功'
break
case 1:
content.value = '失败'
break
case 200:
content.value = '参数校验失败'
break
}
}
step.value = 0
modeTimer = setTimeout(doCloseMode, CLOSE_MODE_TIME)
}
}, {
deep: true
})
</script>
<style lang="less" scoped>
.mode-switch {
.content {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 30px;
}
.footer {
text-align: end;
.btn {
margin-right: 10px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="side-bar">
<ul class="side-list">
<li v-if="isBasic"
data-name="basic_message"
class="active"
@click="doCheck">
<i :style="`background-image: url('/image/Info_white.png')`"></i>
<span>基本信息</span>
</li>
<li v-else
data-name="mode_information"
class="active"
@click="doCheck">
<i :style="`background-image: url('/image/debug_white.png')`"></i>
<span>调试信息</span>
</li>
<li v-for="item in list"
:key="item.index"
:data-name="item.name"
:class="active === item.name ? 'active' : ''"
@click="changeActive">
<i :class="item.name === 'mode_switch' ? isDisable : ''"
:style="`background-image: url('/image/${item.icon}${active === item.name ? '_white' : '_blue'}.png')`"></i>
<span :class="item.name === 'mode_switch' ? isDisable : ''">{{item.label}}</span>
</li>
</ul>
</div>
</template>
<script setup>
import { markRaw, ref, computed } from 'vue';
import { useVehicleStore } from '@/store/VehicleStore.js'
import { storeToRefs } from 'pinia'
import { Message } from 'view-ui-plus'
const SIDE_BAR = [
{
name: 'mode_switch',
label: '模式切换',
icon: 'pattern'
},
{
name: 'log',
label: '终端信息',
icon: 'log'
},
{
name: 'set',
label: '设置',
icon: 'set'
},
{
name: 'logout',
label: '退出',
icon: 'quit'
},
]
/**
* defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。
* 他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉。
* defineProps 接收与 props 选项相同的值,defineEmits 接收与 emits 选项相同的值
*/
const emit = defineEmits(['changeTab'])
const list = markRaw(SIDE_BAR)
const active = ref('basic_message')
const isBasic = ref(true)
const vehicleStore = useVehicleStore()
const vehicleStoreToRefs = storeToRefs(vehicleStore)
const isDisable = computed(() => {
const {isError, pattern} = vehicleStoreToRefs
if (isError.value === 'fault' && pattern.value === 0) {
return 'disabled'
}
return ''
})
function doCheck(evt) {
isBasic.value = !isBasic.value
const target = evt.currentTarget
const {name} = target.dataset
active.value = name === 'basic_message' ? 'mode_information' : 'basic_message'
emit('changeTab', active.value)
}
function changeActive(evt) {
const target = evt.currentTarget
const {name} = target.dataset
const {debuginfo} = vehicleStoreToRefs
const {Current_Gear,loadBrakeStatus}=debuginfo.value;
if (name === 'mode_switch' && isDisable.value === 'disabled') {
return
}
if(name=='mode_switch'){
if (!(['P', 126].includes(Current_Gear) || (['N', 0].includes(Current_Gear) && loadBrakeStatus != 0))) {
Message.error('不能切换无人模式')
return
}
}
active.value = name
emit('changeTab', name)
}
function changeMode() {
active.value = 'basic_message'
}
defineExpose({
changeMode
})
</script>
<style lang="less" scoped>
.side-list {
background: #202634;
color: #5490D6;
height: 100%;
overflow: auto;
li {
display: flex;
flex-direction: column;
align-items: center;
padding: .1rem;
cursor: pointer;
i {
display: inline-block;
width: 2.5vw;
height: 2.5vw;
background-size: cover;
}
&.active {
color: #fff;
}
}
.disabled {
cursor: not-allowed;
}
}
</style>
\ No newline at end of file
......@@ -11,7 +11,7 @@
<div class="basic-top">
<i :class="['vehicle-state', vehicleState]" @click="showStates"></i>
<span class="vehicle-msg">
<span>{{pattern == 0 ? '司机' : '安全员'}}{{name}}</span>
<span>{{softDrivingPattern == 0 ? '司机' : '安全员'}}{{name}}</span>
<span>工号:{{number}}</span>
</span>
</div>
......@@ -190,8 +190,8 @@
})
const pattern = computed(() => {
const {pattern} = vehicleStoreToRefs
return pattern.value
const {softDrivingPattern} = vehicleStoreToRefs
return softDrivingPattern.value
})
function handleClose() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment