feat:新科目三开发
This commit is contained in:
parent
4c6f25ee3a
commit
b5c641c16b
72
entry/src/main/ets/common/lidar/index.ts
Normal file
72
entry/src/main/ets/common/lidar/index.ts
Normal file
@ -0,0 +1,72 @@
|
||||
import UdpClient from './udpClient/index'
|
||||
import FileUtil from '../../common/utils/File';
|
||||
import { GlobalConfig } from '../../config/index';
|
||||
import emitter from '@ohos.events.emitter';
|
||||
|
||||
interface messageIds {
|
||||
[k:string]:number;
|
||||
}
|
||||
|
||||
class Lidar {
|
||||
public localRadarUdp: UdpClient
|
||||
public localVisionUdp: UdpClient
|
||||
private isNewKm3: Boolean
|
||||
private messageIds:messageIds = {}
|
||||
|
||||
constructor() {
|
||||
this.init()
|
||||
}
|
||||
|
||||
//监听雷达信息
|
||||
async onRadarMsg(messageId:string,callback:Function) {
|
||||
if(this.messageIds[messageId] === undefined){
|
||||
let timer = setInterval(()=>{
|
||||
callback(this.radarObj)
|
||||
},200)
|
||||
this.messageIds[messageId] = timer;
|
||||
}
|
||||
}
|
||||
|
||||
//监听视觉信息
|
||||
async onSenseMsg(messageId:string,callback:Function) {
|
||||
if(this.messageIds[messageId] === undefined){
|
||||
let timer = setInterval(()=>{
|
||||
callback(this.senseObj)
|
||||
},200)
|
||||
this.messageIds[messageId] = timer;
|
||||
}
|
||||
}
|
||||
|
||||
//关闭消息
|
||||
async offVisionMsg(eventId) {
|
||||
clearInterval(this.messageIds[eventId])
|
||||
delete this.messageIds[eventId]
|
||||
}
|
||||
|
||||
async init() {
|
||||
const fileUtil = new FileUtil(globalThis.context)
|
||||
const addressStr = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||
const {deviceType,deviceIpArr,devicePortArr,udplocalIp} = JSON.parse(addressStr);
|
||||
|
||||
//新科目三设备
|
||||
if (deviceType == '2') {
|
||||
//雷达数据
|
||||
this.localRadarUdp = new UdpClient('radar', {
|
||||
deviceIpArr, devicePortArr, udplocalIp
|
||||
});
|
||||
|
||||
//视觉数据
|
||||
this.localVisionUdp = new UdpClient('vision', {
|
||||
deviceIpArr, devicePortArr, udplocalIp
|
||||
})
|
||||
|
||||
this.localRadarUdp.onMessage((obj) => {
|
||||
this.radarObj = obj
|
||||
})
|
||||
this.localVisionUdp.onMessage((obj) => {
|
||||
this.visionObj = obj
|
||||
})
|
||||
this.isNewKm3 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
10
entry/src/main/ets/common/lidar/sense/index.ts
Normal file
10
entry/src/main/ets/common/lidar/sense/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
|
||||
export default class SenseUtil{
|
||||
constructor() {}
|
||||
|
||||
//扣分
|
||||
//开始考试
|
||||
//结束考试
|
||||
|
||||
}
|
||||
112
entry/src/main/ets/common/lidar/udpClient/index.ts
Normal file
112
entry/src/main/ets/common/lidar/udpClient/index.ts
Normal file
@ -0,0 +1,112 @@
|
||||
import socket from '@ohos.net.socket';
|
||||
import FileUtil from '../../../common/utils/File';
|
||||
import { GlobalConfig } from '../../../config/index';
|
||||
import promptAction from '@ohos.promptAction'
|
||||
|
||||
const TAG = 'LIDAUDP'
|
||||
type TYPE = 'vision' | 'radar'
|
||||
|
||||
interface IPAPORT{
|
||||
address:string,
|
||||
port:number
|
||||
}
|
||||
|
||||
interface Params{
|
||||
deviceIpArr:string[],
|
||||
devicePortArr:number[],
|
||||
udplocalIp:string
|
||||
}
|
||||
|
||||
export default class LidaUdpClient{
|
||||
// 0: 视觉 1: 雷达
|
||||
public type:TYPE
|
||||
private udpClient:socket.UDPSocket
|
||||
private localIp:string
|
||||
private localSensePort: 33313
|
||||
private localVisionPort: 33314
|
||||
private params:Params
|
||||
public message:string
|
||||
|
||||
constructor(type:TYPE,params:Params) {
|
||||
this.type = type;
|
||||
this.params = params
|
||||
this.localIp = params.udplocalIp
|
||||
}
|
||||
|
||||
async init(){
|
||||
const {address,port} = await this.getIpAPort()
|
||||
this.udpClient = socket.constructUDPSocketInstance();
|
||||
|
||||
//bind
|
||||
await this.safeFn(async()=>{
|
||||
await this.udpClient.bind({
|
||||
address: this.localIp,
|
||||
port: port,
|
||||
family: 1
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
async onMessage(callback){
|
||||
this.offMessage()
|
||||
//message
|
||||
this.udpClient.on('message',(val)=>{
|
||||
//TODO 消息解析
|
||||
switch (this.type){
|
||||
//激光雷达
|
||||
case 'radar':
|
||||
this.radarStrToObj(val)
|
||||
break;
|
||||
//视觉
|
||||
case 'vision':
|
||||
this.visionStrToObj(val)
|
||||
break;
|
||||
}
|
||||
console.log(val+'');
|
||||
});
|
||||
}
|
||||
|
||||
//获取对应的IP和端口
|
||||
async getIpAPort(): Promise<IPAPORT>{
|
||||
const fileUtil = new FileUtil(globalThis.context)
|
||||
const addressStr = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||
const {deviceIpArr,devicePortArr,udplocalIp} = JSON.parse(addressStr);
|
||||
this.localIp = udplocalIp
|
||||
return {
|
||||
address:this.type === 'radar' ? deviceIpArr[0] : deviceIpArr[1],
|
||||
port: Number(this.type === 'vision' ? devicePortArr[1] : devicePortArr[1])
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
async radarStrToObj(str:string){
|
||||
//$MachineVision,30.950^0_-1_1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1^-1,43083,0_0_0_0,-1^-1_-1_-1_1,-1^-1_-1_-1_1,-1^-1_-1_-1_1,10102264201.69632,1.1.1.2,0*+$VisualInfo,1_-7205_3480_-7300_3350_-7655_3610_-7560_3735_,*+[ { "bodyangle": "1.00", "bodyx": "0.490", "bodyy": "31.300", "elevation": "2.403", "geoangle": "323.90", "geolat": "29.92678975", "geolon": "119.89823128", "id": 1, "type": 2 } ]
|
||||
|
||||
}
|
||||
|
||||
async visionStrToObj(str:string){
|
||||
|
||||
}
|
||||
|
||||
async offMessage(){
|
||||
this.udpClient.off('message')
|
||||
}
|
||||
|
||||
async closeUdp(){
|
||||
this.offMessage();
|
||||
this.udpClient.close()
|
||||
}
|
||||
|
||||
async safeFn(fn:Function){
|
||||
try {
|
||||
await fn()
|
||||
} catch (e) {
|
||||
console.info(TAG + JSON.stringify(e))
|
||||
promptAction.showToast({
|
||||
message: TAG + JSON.stringify(e),
|
||||
duration: 3000
|
||||
});
|
||||
throw e
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -218,6 +218,7 @@ export async function takePhoto(param, context, dir, flag = 1, callback?) {
|
||||
// @ts-ignore
|
||||
// var snapResult = rtsp_server.getVideoSnapshot(context, video_uri, '', dir);
|
||||
if (flag == 0) {
|
||||
//@ts-ignore
|
||||
rtsp_server.detectVideoSnapshotSize(video_uri, fileName, (err, snapResult) => {
|
||||
console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize);
|
||||
callback({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode })
|
||||
|
||||
@ -85,3 +85,7 @@ export const RoadData = [
|
||||
{name:'形状',key:['InShapeAttr','ShapeNo','']},
|
||||
{name:'路段点',key:['CrossPointNo']},
|
||||
]
|
||||
|
||||
export const radarData = [
|
||||
|
||||
]
|
||||
|
||||
@ -1121,6 +1121,9 @@ struct Index {
|
||||
case '4':
|
||||
return '#FF7566';
|
||||
break;
|
||||
case '5':
|
||||
return '#FF7566';
|
||||
break;
|
||||
default:
|
||||
return '#E6DECF';
|
||||
break;
|
||||
|
||||
@ -23,10 +23,15 @@ struct Index {
|
||||
@State terTextList: string[] = ['一型机', '二型机', '三型机', '一体机']
|
||||
@State cardTextList: string[] = ['北云', '天宝MB2']
|
||||
@State netTextList: string[] = ['否', '是']
|
||||
@State deviceTypeSelect: string[] = ['正常', '安全员','新科目三']
|
||||
@State selectedTerType: number = 0
|
||||
@State selectedCardType: number = 0
|
||||
//是否启用网络差分
|
||||
@State netOpen: number = 0
|
||||
//设备应用类型
|
||||
@State deviceType: number = 0
|
||||
@State deviceIpArr: string[] = ['192.168.7.173', '192.168.7.173']
|
||||
@State devicePortArr: string[] = ['8052', '8053']
|
||||
// @State inputTextList2: string[] = []
|
||||
// 112.80.35.83 11052
|
||||
// @State inputTextList1: string[] = ['192.168.36.2','8084','192.168.36.200','20122','255.255.255.0','192.168.36.1','','','114.114.114.114','192.168.36.139','8000']
|
||||
@ -118,7 +123,6 @@ struct Index {
|
||||
})
|
||||
}.width('51%').height('14%')
|
||||
|
||||
|
||||
Row(){
|
||||
Text('板卡类型')
|
||||
.width('40%')
|
||||
@ -140,6 +144,124 @@ struct Index {
|
||||
})
|
||||
}.width('49%').height('14%')
|
||||
|
||||
Row() {
|
||||
Text('设备应用场景')
|
||||
.width('40%')
|
||||
.height('100%')
|
||||
.fontColor('#E5CBA1')
|
||||
.padding({ 'left': '35px' })
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
|
||||
ForEach(this.deviceTypeSelect, (netText, index) => {
|
||||
Radio({ value: netText, group: 'deviceRadioGroup' })
|
||||
.borderColor('#E5CBA1')
|
||||
.checked(index === this.deviceType)
|
||||
.onChange((value: boolean) => {
|
||||
if(value){
|
||||
this.deviceType = index
|
||||
}
|
||||
})
|
||||
Text(netText).fontSize(20).fontColor('#FFF')
|
||||
})
|
||||
}.width('52%').height('14%')
|
||||
|
||||
if(this.deviceType == 2){
|
||||
Row() {
|
||||
Text('雷达设备IP')
|
||||
.width('40%')
|
||||
.height('100%')
|
||||
.fontColor('#E5CBA1')
|
||||
.padding({ 'left': '35px' })
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
TextInput({ 'text':this.deviceIpArr[0] })
|
||||
.width('50%')
|
||||
.height('50%')
|
||||
.fontColor('#fff')
|
||||
.borderColor('#E6E0D8')
|
||||
.borderRadius('10px')
|
||||
.borderWidth('2px')
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
.padding({ top: 0, bottom: 0 })
|
||||
.linearGradient({angle: 0,colors: [[0x403C36, 0.0], [0x4D473D, 0.34], [0x3D3A34, 1.0]] })
|
||||
.onChange((value: string) => {
|
||||
this.deviceIpArr[0] = value
|
||||
})
|
||||
}.width('50%').height('14%')
|
||||
Row() {
|
||||
Text('响应端口')
|
||||
.width('40%')
|
||||
.height('100%')
|
||||
.fontColor('#E5CBA1')
|
||||
.padding({ 'left': '35px' })
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
TextInput({ 'text':this.devicePortArr[0] })
|
||||
.width('50%')
|
||||
.height('50%')
|
||||
.fontColor('#fff')
|
||||
.borderColor('#E6E0D8')
|
||||
.borderRadius('10px')
|
||||
.borderWidth('2px')
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
.padding({ top: 0, bottom: 0 })
|
||||
.linearGradient({
|
||||
angle: 0,
|
||||
colors: [[0x403C36, 0.0], [0x4D473D, 0.34], [0x3D3A34, 1.0]]
|
||||
})
|
||||
.onChange((value: string) => {
|
||||
this.devicePortArr[0] = value
|
||||
})
|
||||
}.width('50%').height('14%')
|
||||
Row() {
|
||||
Text('视觉设备IP')
|
||||
.width('40%')
|
||||
.height('100%')
|
||||
.fontColor('#E5CBA1')
|
||||
.padding({ 'left': '35px' })
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
TextInput({ 'text': this.deviceIpArr[1] })
|
||||
.width('50%')
|
||||
.height('50%')
|
||||
.fontColor('#fff')
|
||||
.borderColor('#E6E0D8')
|
||||
.borderRadius('10px')
|
||||
.borderWidth('2px')
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
.padding({ top: 0, bottom: 0 })
|
||||
.linearGradient({
|
||||
angle: 0,
|
||||
colors: [[0x403C36, 0.0], [0x4D473D, 0.34], [0x3D3A34, 1.0]]
|
||||
})
|
||||
.onChange((value: string) => {
|
||||
this.deviceIpArr[1] = value
|
||||
})
|
||||
}.width('50%').height('14%')
|
||||
Row() {
|
||||
Text('响应端口')
|
||||
.width('40%')
|
||||
.height('100%')
|
||||
.fontColor('#E5CBA1')
|
||||
.padding({ 'left': '35px' })
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
TextInput({ 'text': this.devicePortArr[1] })
|
||||
.width('50%')
|
||||
.height('50%')
|
||||
.fontColor('#fff')
|
||||
.borderColor('#E6E0D8')
|
||||
.borderRadius('10px')
|
||||
.borderWidth('2px')
|
||||
.fontSize(this.inputFontSize * this.ratio)
|
||||
.padding({ top: 0, bottom: 0 })
|
||||
.linearGradient({
|
||||
angle: 0,
|
||||
colors: [[0x403C36, 0.0], [0x4D473D, 0.34], [0x3D3A34, 1.0]]
|
||||
|
||||
})
|
||||
.onChange((value: string) => {
|
||||
this.devicePortArr[1] = value;
|
||||
})
|
||||
}.width('50%').height('14%')
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
.width('95%')
|
||||
@ -172,7 +294,10 @@ struct Index {
|
||||
centerPort: this.inputTextList1[3],
|
||||
terType: this.selectedTerType,
|
||||
cardType: this.selectedCardType,
|
||||
netOpen: this.netOpen
|
||||
netOpen: this.netOpen,
|
||||
deviceType: this.deviceType,
|
||||
deviceIpArr: this.deviceIpArr,
|
||||
devicePortArr: this.devicePortArr,
|
||||
}
|
||||
fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param), '')
|
||||
// upDateTableByArray('IpConfigTable',[])
|
||||
@ -247,6 +372,9 @@ struct Index {
|
||||
this.selectedTerType = result.terType
|
||||
this.selectedCardType = result.cardType
|
||||
this.netOpen= result.netOpen
|
||||
this.deviceType= result.deviceType || 0
|
||||
this.deviceIpArr= result.deviceIpArr || ['','']
|
||||
this.devicePortArr= result.devicePortArr || ['','']
|
||||
console.log('surenjun', this.selectedTerType + '');
|
||||
}
|
||||
|
||||
|
||||
@ -69,6 +69,18 @@ export default struct SignDisplayCom {
|
||||
})
|
||||
}
|
||||
|
||||
Row() {
|
||||
Text('雷达数据').fontColor(this.active == 3 ? '#FFAD33' : '#e7cba3').fontSize(20 * this.ratio)
|
||||
}
|
||||
.backgroundImage(this.active == 3 ? $r('app.media.signal_tabS') : $r('app.media.signal_tab'))
|
||||
.width(144 * this.ratio)
|
||||
.height(50 * this.ratio)
|
||||
.backgroundImageSize({ width: '100%', height: '100%' })
|
||||
.justifyContent(FlexAlign.Center)
|
||||
.onClick(() => {
|
||||
this.active = 3
|
||||
})
|
||||
|
||||
Row() {
|
||||
Text('原始数据').fontColor(this.active == 2 ? '#FFAD33' : '#e7cba3').fontSize(20 * this.ratio)
|
||||
}
|
||||
@ -314,6 +326,30 @@ export default struct SignDisplayCom {
|
||||
.backgroundImage($r('app.media.km_open'))
|
||||
.backgroundImageSize({ width: '100%', height: '100%' })
|
||||
.visibility(this.active == 1 ? Visibility.Visible : Visibility.None)
|
||||
|
||||
Row(){
|
||||
Column() {
|
||||
Column(){
|
||||
Text('雷达').fontColor('#fff')
|
||||
}
|
||||
Column(){
|
||||
Text('视觉').fontColor('#fff')
|
||||
}
|
||||
.height(436 * this.ratio)
|
||||
|
||||
}
|
||||
.backgroundColor('#282828')
|
||||
.width(this.ratio * 880)
|
||||
.height(415 * this.ratio)
|
||||
.margin({ left: 15 * this.ratio, top: 15 * this.ratio })
|
||||
}
|
||||
.width(936 * this.ratio)
|
||||
.height(460 * this.ratio)
|
||||
.margin({ left: 10 * this.ratio })
|
||||
.padding({ left: 10 * this.ratio, right: 10 * this.ratio })
|
||||
.backgroundImage($r('app.media.km_open'))
|
||||
.backgroundImageSize({ width: '100%', height: '100%' })
|
||||
.visibility(this.active == 3 ? Visibility.Visible : Visibility.None)
|
||||
}
|
||||
.width('100%')
|
||||
.height('100%')
|
||||
@ -323,6 +359,8 @@ export default struct SignDisplayCom {
|
||||
|
||||
aboutToDisappear() {
|
||||
clearInterval(this.interval)
|
||||
//TODO
|
||||
console.info('surenjun','123')
|
||||
}
|
||||
|
||||
async aboutToAppear() {
|
||||
|
||||
@ -44,7 +44,7 @@ export default struct RealTime {
|
||||
Row() {
|
||||
Column() {
|
||||
Row() {
|
||||
Text('车道信息').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff').fontSize(20)
|
||||
Text('车道信息').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff').fontSize(14)
|
||||
}
|
||||
.width('100%')
|
||||
.height(37)
|
||||
|
||||
@ -934,6 +934,8 @@ export default class Judge {
|
||||
this.judgeUI.totalScore += thisKf.score * 1;
|
||||
if (kf.xmdm != 20) {
|
||||
const type = judgeUI.projectsObj[kf.xmdm].type;
|
||||
console.info('surejun kf=>',JSON.stringify(kf))
|
||||
console.info('surejun kf_type=>',type)
|
||||
judgeUI.projectsObj[kf.xmdm].type = (type == 3 || type == 4) ? '4' : '5';
|
||||
}
|
||||
break;
|
||||
@ -956,11 +958,11 @@ export default class Judge {
|
||||
console.info(judgeTag, '项目取消');
|
||||
const {examSubject} = this.judgeUI
|
||||
const xmdm = xmqx.xmdm;
|
||||
const xmmcCode = judgeUI.projectsObj[xmdm].projectCodeCenter;
|
||||
const xmmcCode1 = judgeUI.projectsObj[xmdm].projectCodeCenter;
|
||||
// const voiceCode = getKmProjectCancelVoice(examSubject, xmmcCode);
|
||||
// avPlayer.playAudio([`voice/${voiceCode}.mp3`],true)
|
||||
this.judgeUI.projectsObj[xmdm].type = '1';
|
||||
this.testKmItems[xmmcCode].status = '1';
|
||||
this.testKmItems[xmmcCode1].status = '1';
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
export const judgeConfig = {
|
||||
version:'2024.08.21.01',
|
||||
//本地目录开关
|
||||
isTrajectoryOpen: false,
|
||||
isTrajectoryOpen: true,
|
||||
//是否开启拍照
|
||||
isPhotoOpen: true,
|
||||
isPhotoOpen: false,
|
||||
//扣分语音是否强制开启
|
||||
kfVoiceOpen: false,
|
||||
//忽略的考试项目
|
||||
@ -16,14 +16,12 @@ export const judgeConfig = {
|
||||
// 本地模型地址
|
||||
// modelPath: 'models/model_enc',
|
||||
// 济南科目三
|
||||
trajectoryPath: 'logs/2025_04_23_09_50_55_2504755332926_320924199111132926_陈静/judge_exam_data.txt',
|
||||
trajectoryPath: 'logs/2025_06_20_08_20_09_2250107217821_340823199508126112_左江辉/judge_exam_data.txt',
|
||||
//四合一画面配置
|
||||
fourInOneScreen:{
|
||||
//gps位数
|
||||
gpsDigit:7
|
||||
},
|
||||
// 杭州科目二
|
||||
// trajectoryPath: 'logs/2024_07_19/0000000000001_342323199501470011_测试学员1_2024_07_19_06_49_12/judge_exam_data.txt',
|
||||
//TODO 济南临时特殊配置
|
||||
systemParamConfig:{}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user