Compare commits
	
		
			6 Commits
		
	
	
		
			4c6f25ee3a
			...
			b0a490441d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b0a490441d | ||
|  | c06a122de4 | ||
|  | 158f6260db | ||
|  | 50c16cb56a | ||
|  | 4fa6ad0544 | ||
|  | b5c641c16b | 
| @ -9,12 +9,17 @@ | ||||
|       ], | ||||
|       "path": "./src/main/cpp/CMakeLists.txt", | ||||
|       "arguments": "", | ||||
|       "cppFlags": "", | ||||
|       "cppFlags": "" | ||||
|     }, | ||||
|     "sourceOption": { | ||||
|       "workers": [ | ||||
|         './src/main/ets/workers/worker.ts' | ||||
|       ] | ||||
|     }, | ||||
|     "arkOptions": { | ||||
|       "types": [ | ||||
|         "./src/main/ets/common/lidar/type" | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   "targets": [ | ||||
|  | ||||
							
								
								
									
										108
									
								
								entry/src/main/ets/common/newkm3/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								entry/src/main/ets/common/newkm3/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | ||||
| import emitter from '@ohos.events.emitter'; | ||||
| import radarClient from './radar/index' | ||||
| import visionClient from './vision/index' | ||||
| import FileUtil from '../../common/utils/File'; | ||||
| import { GlobalConfig } from '../../config/index'; | ||||
| import { messageIds } from './type' | ||||
| 
 | ||||
| 
 | ||||
| class Lidar { | ||||
|   public localRadarUdp: radarClient | ||||
|   public localVisionUdp: visionClient | ||||
|   //是否新科目三设备
 | ||||
|   private isNewKm3: Boolean | ||||
|   //雷达消息Ids
 | ||||
|   private radarMessageIds: messageIds = {} | ||||
|   ///视觉消息Ids
 | ||||
|   private senseMessageIds: messageIds = {} | ||||
| 
 | ||||
|   constructor() { | ||||
|     this.init() | ||||
|   } | ||||
| 
 | ||||
|   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') { | ||||
|       //雷达UDP
 | ||||
|       this.localRadarUdp = new radarClient({ | ||||
|         deviceIpArr, devicePortArr, udplocalIp | ||||
|       }) | ||||
|       this.localRadarUdp.onRadarClientMessage(async (obj) => { | ||||
|         //广播注册的radar消息
 | ||||
|         Reflect.ownKeys(this.radarMessageIds).forEach((messageId: string) => { | ||||
|           emitter.emit({ eventId: this.radarMessageIds[messageId] }, { data: obj }) | ||||
|         }) | ||||
|       }) | ||||
|       // this.localRadarUdp.onMessage((obj) => {
 | ||||
|       //   //广播注册的radar消息
 | ||||
|       //   Reflect.ownKeys(this.radarMessageIds).forEach((messageId:string) => {
 | ||||
|       //     emitter.emit({eventId:this.radarMessageIds[messageId]},{data:obj})
 | ||||
|       //   })
 | ||||
|       // })
 | ||||
|       //
 | ||||
|       // this.localVisionUdp.onMessage((obj) => {
 | ||||
|       //   //广播注册的sense消息
 | ||||
|       //   Reflect.ownKeys(this.senseMessageIds).forEach((messageId:string) => {
 | ||||
|       //     emitter.emit({eventId:this.radarMessageIds[messageId]},{data:obj})
 | ||||
|       //   })
 | ||||
|       // })
 | ||||
|       this.isNewKm3 = true; | ||||
|     } | ||||
|     //安全员&新科目三均需要视觉
 | ||||
|     this.localVisionUdp = new visionClient({ | ||||
|       deviceIpArr, devicePortArr, udplocalIp | ||||
|     }) | ||||
|     //TODO 初始化视觉设备
 | ||||
|     this.localVisionUdp.visionInit(); | ||||
|     this.localVisionUdp.onVisionClientMessage(async (obj) => { | ||||
|       //广播注册的sense消息
 | ||||
|       Reflect.ownKeys(this.senseMessageIds).forEach((messageId: string) => { | ||||
|         emitter.emit({ eventId: this.senseMessageIds[messageId] }, { data: obj }) | ||||
|       }) | ||||
|     }) | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   //监听雷达信息
 | ||||
|   async onRadarMsg(messageId: string, callback: Function) { | ||||
|     if (this.radarMessageIds[messageId] === undefined) { | ||||
|       const eventId = this.generateRandomNumber(); | ||||
|       emitter.on({ eventId }, (data) => { | ||||
|         callback(data) | ||||
|       }); | ||||
|       this.radarMessageIds[messageId] = eventId; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //监听视觉信息
 | ||||
|   async onSenseMsg(messageId: string, callback: Function) { | ||||
|     if (this.senseMessageIds[messageId] === undefined) { | ||||
|       const eventId = this.generateRandomNumber(); | ||||
|       emitter.on({ eventId }, (data) => { | ||||
|         callback(data) | ||||
|       }); | ||||
|       this.senseMessageIds[messageId] = eventId; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //关闭消息
 | ||||
|   async offMsg(type: 'radar' | 'vision', messageId: string) { | ||||
|     emitter.off( | ||||
|       [type === 'radar' ? this.radarMessageIds[messageId] : this.senseMessageIds][messageId] | ||||
|     ) | ||||
|     delete [type === 'radar' ? this.radarMessageIds[messageId] : this.senseMessageIds][messageId] | ||||
|   } | ||||
| 
 | ||||
|   //随机生成6位的id
 | ||||
|   generateRandomNumber() { | ||||
|     let num = ''; | ||||
|     for (let i = 0; i < 6; i++) { | ||||
|       num += Math.floor(Math.random() * 10); | ||||
|     } | ||||
|     return Number(num); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										90
									
								
								entry/src/main/ets/common/newkm3/radar/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								entry/src/main/ets/common/newkm3/radar/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
| import UdpClient from '../udpClient/index' | ||||
| import emitter from '@ohos.events.emitter'; | ||||
| import {Machine,messageIds} from '../type' | ||||
| import systemTime from '@ohos.systemDateTime'; | ||||
| 
 | ||||
| //雷达消息Ids
 | ||||
| export default class RadarClient{ | ||||
| 
 | ||||
|   public localRadarUdp: UdpClient | ||||
| 
 | ||||
|   constructor(params:{ | ||||
|     deviceIpArr:string[], | ||||
|     devicePortArr:number[], | ||||
|     udplocalIp:string | ||||
|   }) { | ||||
|     const {deviceIpArr,devicePortArr,udplocalIp} = params; | ||||
|     //雷达UDP
 | ||||
|     this.localRadarUdp = new UdpClient('radar', { | ||||
|       deviceIpArr, devicePortArr, udplocalIp | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   //雷达信息监听
 | ||||
|   async onRadarClientMessage(callback){ | ||||
|     this.localRadarUdp.onClientMessage((radarStr)=>{ | ||||
|       const radarObj = this.radarStrToObj(radarStr) | ||||
|       callback(radarObj) | ||||
|       console.log(radarStr+''); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   // 雷达数据解析
 | ||||
|   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 } ]
 | ||||
|     const [machine, visual, obj] = str.split('+'); | ||||
|     const machineArr = machine.split(','); | ||||
|     let tempObj:Machine = {}; | ||||
|     tempObj.sj = await systemTime.getCurrentTime(); | ||||
|     tempObj.xh = Number(machineArr[10]); | ||||
|     ['qf', 'hf', 'zq', 'zh', 'yq', 'yh', 'zc', 'yc', 'zf'].forEach((c,index) => { | ||||
|       tempObj[c] = this.getMachineItem(machineArr[index + 1]); | ||||
|     }); | ||||
|     ['lq', 'lz', 'ly'].forEach((c,index) => { | ||||
|       tempObj[c] = this.getMachineItem(machineArr[index + 13]); | ||||
|     }); | ||||
|     tempObj.wt = this.getMachineWt(machineArr[10]) | ||||
|     tempObj.rc = this.getMachineRc(machineArr[12]) | ||||
|   } | ||||
| 
 | ||||
|   getMachineItem(str){ | ||||
|     const strArr = str.split('_'); | ||||
|     return { | ||||
|       //对象编号
 | ||||
|       bh:strArr[2], | ||||
|       //车类型
 | ||||
|       lx:strArr[3], | ||||
|       //纵向距离
 | ||||
|       jz:strArr[0].split('^')[0], | ||||
|       //横向距离
 | ||||
|       jh:strArr[0].split('^')[1], | ||||
|       //速度
 | ||||
|       sd:strArr[1] | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //获取前方数据
 | ||||
|   getMachineWt(str){ | ||||
|     return { | ||||
|       xz:str.split('_')[0].split('^')[0], | ||||
|       xh:str.split('_')[0].split('^')[1], | ||||
|       zz:str.split('_')[1].split('^')[0], | ||||
|       zh:str.split('_')[1].split('^')[1], | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //获取绕车一周数据
 | ||||
|   getMachineRc(str){ | ||||
|     return { | ||||
|       zh:str.split('_')[0], | ||||
|       yh:str.split('_')[1], | ||||
|       yq:str.split('_')[2], | ||||
|       zq:str.split('_')[3] | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async offMessage(){ | ||||
|     this.localRadarUdp.closeUdp() | ||||
|   } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										106
									
								
								entry/src/main/ets/common/newkm3/type.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								entry/src/main/ets/common/newkm3/type.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,106 @@ | ||||
| interface visionType1 { | ||||
|   sj?: number | ||||
|   //置信度
 | ||||
|   df?: 0 | 1 | ||||
|   //摇头旋转角度
 | ||||
|   yt?: number | ||||
|   //左右旋转角度
 | ||||
|   zy?: number | ||||
|   //上下点头角度
 | ||||
|   sx?: number | ||||
| } | ||||
| 
 | ||||
| interface visionType2 { | ||||
|   sj?: number | ||||
|   //控制方向盘
 | ||||
|   fx?: number | ||||
|   //手伸出窗外
 | ||||
|   ch?: number | ||||
| } | ||||
| 
 | ||||
| interface visionType3 { | ||||
|   sj?: number | ||||
|   //信号灯
 | ||||
|   xd?: string | ||||
|   //识别前方物体
 | ||||
|   wt: 0 | 1 | 2 | 3 | 4 | ||||
|   //中心隔离设施或中心线
 | ||||
|   zx: 0 | 1 | -1 | ||||
|   //后车超车信号灯
 | ||||
|   hc: string | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| interface MachineItem { | ||||
|   //对象编号
 | ||||
|   bh: number | ||||
|   //车类型
 | ||||
|   lx: number | ||||
|   //纵向距离
 | ||||
|   jz: number | ||||
|   //横向距离
 | ||||
|   jh: number | ||||
|   //速度
 | ||||
|   sd: number | ||||
| } | ||||
| 
 | ||||
| export interface Machine { | ||||
|   sj?: number | ||||
|   //帧数
 | ||||
|   xh?: number | ||||
|   //本车道前方数据
 | ||||
|   qf?: MachineItem | ||||
|   //本车道后方数据
 | ||||
|   hf?: MachineItem | ||||
|   //左侧车道前方
 | ||||
|   zq?: MachineItem | ||||
|   //左侧车道后方
 | ||||
|   zh?: MachineItem | ||||
|   //右侧车道前方
 | ||||
|   yq?: MachineItem | ||||
|   //右侧车道后方
 | ||||
|   yh?: MachineItem | ||||
|   //左侧车道
 | ||||
|   zc?: MachineItem | ||||
|   //右侧车道
 | ||||
|   yc?: MachineItem | ||||
|   //左侧方向车道
 | ||||
|   zf?: MachineItem | ||||
|   //前方数据
 | ||||
|   wt?: { | ||||
|     //行人距离本车的距离(纵向距离)
 | ||||
|     xz: number | ||||
|     //行人距离本车的距离(横向向距离)
 | ||||
|     xh: number | ||||
|     //障碍物距离本车的距离(纵向距离)
 | ||||
|     zz: number | ||||
|     //障碍物距离本车的距离(横向距离)
 | ||||
|     zh: number | ||||
|   } | ||||
|   //绕车一车数据
 | ||||
|   rc?: { | ||||
|     //左后
 | ||||
|     zh: number | ||||
|     //右后
 | ||||
|     yh: number | ||||
|     //右前
 | ||||
|     yq: number | ||||
|     //左前
 | ||||
|     zq: number | ||||
|   }, | ||||
| 
 | ||||
|   //路口前方来车数据
 | ||||
|   lq?: MachineItem, | ||||
| 
 | ||||
|   //路口左侧来车
 | ||||
|   lz?: MachineItem, | ||||
| 
 | ||||
|   //路口右侧来车
 | ||||
|   ly?: MachineItem | ||||
| 
 | ||||
|   [k: string]: any | ||||
| } | ||||
| 
 | ||||
| export interface messageIds { | ||||
|   [k: string]: number; | ||||
| } | ||||
							
								
								
									
										106
									
								
								entry/src/main/ets/common/newkm3/udpClient/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								entry/src/main/ets/common/newkm3/udpClient/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,106 @@ | ||||
| import socket from '@ohos.net.socket'; | ||||
| import FileUtil from '../../../common/utils/File'; | ||||
| import { GlobalConfig } from '../../../config/index'; | ||||
| import {Machine} from '../type' | ||||
| import promptAction from '@ohos.promptAction' | ||||
| import systemTime from '@ohos.systemDateTime'; | ||||
| 
 | ||||
| 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 onClientMessage(callback){ | ||||
|     this.offMessage() | ||||
|     //message
 | ||||
|     this.udpClient.on('message',(buffer)=>{ | ||||
|       const dataStr =  this.arrayBuffetToStr(buffer.message); | ||||
|       callback(dataStr) | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   //arrayBuffer转string
 | ||||
|   arrayBuffetToStr(arrayBuffer){ | ||||
|     let dataView = new DataView(arrayBuffer) | ||||
|     let str = "" | ||||
|     for (let i = 0; i < dataView?.byteLength; ++i) { | ||||
|       let c = String.fromCharCode(dataView?.getUint8(i)) | ||||
|       if (c !== "\n") { | ||||
|         str += c | ||||
|       } | ||||
|     } | ||||
|     return str | ||||
|   } | ||||
| 
 | ||||
|   //获取对应的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 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 | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										106
									
								
								entry/src/main/ets/common/newkm3/vision/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								entry/src/main/ets/common/newkm3/vision/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,106 @@ | ||||
| import UdpClient from '../udpClient/index' | ||||
| import emitter from '@ohos.events.emitter'; | ||||
| import {messageIds} from '../type' | ||||
| import systemTime from '@ohos.systemDateTime'; | ||||
| 
 | ||||
| export default class VisionClient{ | ||||
| 
 | ||||
|   public localVisionUdp: UdpClient | ||||
| 
 | ||||
|   constructor(params:{ | ||||
|     deviceIpArr:string[], | ||||
|     devicePortArr:number[], | ||||
|     udplocalIp:string | ||||
|   }) { | ||||
|     const {deviceIpArr,devicePortArr,udplocalIp} = params; | ||||
| 
 | ||||
|     //视觉UDP
 | ||||
|     this.localVisionUdp = new UdpClient('vision', { | ||||
|       deviceIpArr, devicePortArr, udplocalIp | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   // 视觉信息监听
 | ||||
|   public async onVisionClientMessage(callback){ | ||||
|     this.localVisionUdp.onClientMessage((str) => { | ||||
|       const data = this.visionStrToObj(str) | ||||
|       callback(data) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   // 视觉数据解析
 | ||||
|   async visionStrToObj(visionStr:string){ | ||||
|     const visionDataArr = visionStr.split(','); | ||||
|     const [dataType, message] = [visionDataArr[3] , visionDataArr[4]]; | ||||
|     const messageArr = (message || '').split('@') | ||||
|     const sj = await systemTime.getCurrentTime(); | ||||
|     switch (dataType){ | ||||
|       //头部姿态
 | ||||
|       case 'A204':return { | ||||
|         //系统时间戳
 | ||||
|         sj, | ||||
|         //置信度
 | ||||
|         df:Number(messageArr[0]), | ||||
|         //摇头旋转角度
 | ||||
|         yt:Number(messageArr[1]), | ||||
|         //左右旋转角度
 | ||||
|         zy:Number(messageArr[2]), | ||||
|         //上下点头角度
 | ||||
|         sx:Number(messageArr[3]), | ||||
|       } | ||||
|       //驾驶行为
 | ||||
|       case 'A206':return { | ||||
|         //系统时间戳
 | ||||
|         sj, | ||||
|         //控制方向盘
 | ||||
|         fx:Number(messageArr[0]), | ||||
|         //手伸出窗外
 | ||||
|         ch:Number(messageArr[1]), | ||||
|       } | ||||
|       //前方障碍物
 | ||||
|       case 'A205':return { | ||||
|         //系统时间戳
 | ||||
|         sj, | ||||
|         //信号灯
 | ||||
|         xd:messageArr[0], | ||||
|         //识别前方物体
 | ||||
|         wt:Number(messageArr[1]), | ||||
|         //中心隔离设施或中心线
 | ||||
|         zx:Number(messageArr[2]), | ||||
|         //后车超车信号
 | ||||
|         hc:messageArr[3] | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     //头部姿态 驾驶行为 前方障碍物
 | ||||
|     //$SBXS,85,20250603115529563,B202,赣A78QK6@360803200602253517@1@20250603115523132@@@@@李从星@001@@001@2506455453517,05,*SBJS
 | ||||
|     //$SBXS,213,20250603090553562,B207,邓凯倩@@320250603085259@000000100000001001001000@14@870@28520185@115902060@1@828@4294943473@359.8704@0@0@1111111111011111111111111111111100000000@0@0000000000@3142@0@0@@C1@赣A78QK6@0@001-001@360121200401040528,01,*SBJS
 | ||||
|   } | ||||
| 
 | ||||
|   // 初始化指令
 | ||||
|   public async visionInit(){ | ||||
|       //车牌号@时间戳@空@空@空@空@空
 | ||||
|   } | ||||
|   // 开始考试指令
 | ||||
|   async visionExamStart(){ | ||||
|       //车牌号@考试身份证号@考试状态(1-考试考试0-结束考试)@开始考试时间@考试次数@考车信息@窗户标注信息@方向盘标注信息@考生姓名@安全员编号@是否合格(1-合格0-不合格)@安全员姓名@流水号
 | ||||
|   } | ||||
|   // 结束考试指令
 | ||||
|   async visionExamEnd(){} | ||||
|   // 开始录像
 | ||||
|   async visionStartRecord(){ | ||||
|     //考车号_流水号_时间_扣分项目_扣分序号_倒退时长_顺延时长_是否扣分@关键值1_关键字2_关键字3@
 | ||||
|   } | ||||
|   // 结束录像
 | ||||
|   async visionEndRecord(){} | ||||
|   // 安全员信号传输
 | ||||
|   public async visionSignalSend(){ | ||||
|     /* | ||||
|      * 考生号@考试员号@考车车型@车牌号@科目类型+考试开始时间@设备信号状态@速度@发动机转速@GPS 纬度(主天线)@GPS 经度(主天线) | ||||
|      * @主天线位置@GPS 东向距离(主天线)@GPS 北向距离(主天线)@航向角@俯仰角@高程@项目状态@当前项目编号 | ||||
|      * @场地设备编号@本次考试行驶总距离@扣分值@扣分项数量@n个扣分项序号@考车车型@车牌号 | ||||
|      * @工控机是否在播报语音@安全员姓名 | ||||
|      */ | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -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,128 @@ 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 == 1 || 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%') | ||||
|               } | ||||
|               // 安全员设备 | ||||
|               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[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 +298,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 +376,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) | ||||
|  | ||||
| @ -1 +1,86 @@ | ||||
|  {"code":1,"data":{"videoChapterList":[{"chapterId":"8","chapterName":"第一章:驾驶证的基本信息、申领和使用","code":"1001","name":"驾驶证申领与使用机动车登记","subjectType":"1","count":"4","chapterVideoList":[{"videoId":"95","name":"第一课:准驾车型","title":"准驾车型是指什么样的驾驶证能开什么样的车,我国总计有16种驾照,按照ABCD的顺序划分。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822259WBGURTDW.png","videoUrl":"https://ddjdvideo.duolunxc.com/d8cca146136b4036a193ec1c72a1ad84/2e2c2ed873d24f239cd5ca1cb9756bd1-81fdf63dd56b4dfce8ee63e8807d291f-ld.m3u8?auth_key=1726196458-4dd8bdf313b945808f2a62032d00d846-0-14b7843e2ba491a1918177784e37d772","viewCount":50766,"questCount":0,"isView":"0"},{"videoId":"61","name":"第二课:驾驶证的申请条件","title":"驾驶证申请条件,分为年龄条件、身体条件和禁止条件。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/16588222718TK8QETW.png","videoUrl":"https://ddjdvideo.duolunxc.com/b95873736b3e4f1dbd94159c4f88d3c2/fb0562a3d19b40189f7dc2ce8d2b18f6-b8ca137e222c55292b19abeb9472f7b4-ld.m3u8?auth_key=1726196458-185f9fc53e614fd7bc117f2f16e87066-0-9b40a712d59de2385daf195af77df644","viewCount":55988,"questCount":0,"isView":"0"},{"videoId":"96","name":"第三课:初次申请及增加准驾车型","title":"准驾车型的16种车型中有三种是不可以初次申请的,包括大型客车A1、牵引车A2、中型客车B1。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822248BLOG5F77.png","videoUrl":"https://ddjdvideo.duolunxc.com/583e26489a714e0c9713de49e297cd52/f8a0eb3a29924468a2be4278b82e84d1-39adbbdba4e730b4615416e186981d91-ld.m3u8?auth_key=1726196459-f37ddff500984ad9913a457914d4b7d9-0-33fa677f8c8e2f2c384d5a133a5a7511","viewCount":19449,"questCount":0,"isView":"0"},{"videoId":"97","name":"第四课:驾驶考试","title":"驾驶考试的内容及标准。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822237ECGG1PQV.png","videoUrl":"https://ddjdvideo.duolunxc.com/84b4a019330b41b48b93818596e1baa2/6a0b423ba95f41f5834ea3c6c4e7e6ab-184dc5731e236cb26fe1a6abf890ae4f-ld.m3u8?auth_key=1726196459-a1daf329320a49b0a19d36c16fbcd398-0-a99a54448590acfde0d26fa0de3dcdd3","viewCount":18434,"questCount":0,"isView":"0"}]},{"chapterId":"10","chapterName":"第一章:文明驾驶","code":"4001","name":"安全文明驾驶常识","subjectType":"4","count":"3","chapterVideoList":[{"videoId":"111","name":"第一课:安全驾驶基础知识","title":"驾驶机动车上道路行驶,驾驶人首先要确保自己处于良好的驾驶状态,避免不文明的驾驶状态和行为会为自己和他人的生命安全埋下隐患。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822228B0QUTOS9.png","videoUrl":"https://ddjdvideo.duolunxc.com/a9c572ca6fb24c0b86c4bb822bc9559d/3b9c3452052d48c695d3bc7701b7e0d2-beb7fa718d09f342c0343f248501ec10-ld.m3u8?auth_key=1726196459-c79a4890ea2745ceb312469186afdfa0-0-47b4001a778636678c70c2feb4d42586","viewCount":22494,"questCount":0,"isView":"0"},{"videoId":"112","name":"第二课:常见的不文明驾驶行为","title":"不遵守交通法律法规的行为,既属于违法行为,也是不文明的驾驶行为,驾驶人应该增加文明驾驶意识,自觉遵守交通规则,安全第一。","photoUrl":"https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822219GA9GTG2J.png","videoUrl":"https://ddjdvideo.duolunxc.com/1bdea813f93a456e890defd3f6d24a42/178aa73b657444989b543dfcd386b4ab-2045d439a68331e4c7b8b1a511d698e1-ld.m3u8?auth_key=1726196459-6d161bab98394c8f981a5df4b07ff77f-0-9527085c0efc3ca3befcb4025b1db1a5","viewCount":10562,"questCount":0,"isView":"0"},{"videoId":"113","name":"第三课:文明礼让驾驶","title":"文明驾驶是驾驶人良好行为习惯和道德修养的表现,也是保障道路交通安全和谐的基础 | ||||
| { | ||||
|   "code": 1, | ||||
|   "data": { | ||||
|     "videoChapterList": [ | ||||
|       { | ||||
|         "chapterId": "8", | ||||
|         "chapterName": "第一章:驾驶证的基本信息、申领和使用", | ||||
|         "code": "1001", | ||||
|         "name": "驾驶证申领与使用机动车登记", | ||||
|         "subjectType": "1", | ||||
|         "count": "4", | ||||
|         "chapterVideoList": [ | ||||
|           { | ||||
|             "videoId": "95", | ||||
|             "name": "第一课:准驾车型", | ||||
|             "title": "准驾车型是指什么样的驾驶证能开什么样的车,我国总计有16种驾照,按照ABCD的顺序划分。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822259WBGURTDW.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/d8cca146136b4036a193ec1c72a1ad84/2e2c2ed873d24f239cd5ca1cb9756bd1-81fdf63dd56b4dfce8ee63e8807d291f-ld.m3u8?auth_key=1726196458-4dd8bdf313b945808f2a62032d00d846-0-14b7843e2ba491a1918177784e37d772", | ||||
|             "viewCount": 50766, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           }, | ||||
|           { | ||||
|             "videoId": "61", | ||||
|             "name": "第二课:驾驶证的申请条件", | ||||
|             "title": "驾驶证申请条件,分为年龄条件、身体条件和禁止条件。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/16588222718TK8QETW.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/b95873736b3e4f1dbd94159c4f88d3c2/fb0562a3d19b40189f7dc2ce8d2b18f6-b8ca137e222c55292b19abeb9472f7b4-ld.m3u8?auth_key=1726196458-185f9fc53e614fd7bc117f2f16e87066-0-9b40a712d59de2385daf195af77df644", | ||||
|             "viewCount": 55988, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           }, | ||||
|           { | ||||
|             "videoId": "96", | ||||
|             "name": "第三课:初次申请及增加准驾车型", | ||||
|             "title": "准驾车型的16种车型中有三种是不可以初次申请的,包括大型客车A1、牵引车A2、中型客车B1。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822248BLOG5F77.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/583e26489a714e0c9713de49e297cd52/f8a0eb3a29924468a2be4278b82e84d1-39adbbdba4e730b4615416e186981d91-ld.m3u8?auth_key=1726196459-f37ddff500984ad9913a457914d4b7d9-0-33fa677f8c8e2f2c384d5a133a5a7511", | ||||
|             "viewCount": 19449, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           }, | ||||
|           { | ||||
|             "videoId": "97", | ||||
|             "name": "第四课:驾驶考试", | ||||
|             "title": "驾驶考试的内容及标准。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822237ECGG1PQV.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/84b4a019330b41b48b93818596e1baa2/6a0b423ba95f41f5834ea3c6c4e7e6ab-184dc5731e236cb26fe1a6abf890ae4f-ld.m3u8?auth_key=1726196459-a1daf329320a49b0a19d36c16fbcd398-0-a99a54448590acfde0d26fa0de3dcdd3", | ||||
|             "viewCount": 18434, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       { | ||||
|         "chapterId": "10", | ||||
|         "chapterName": "第一章:文明驾驶", | ||||
|         "code": "4001", | ||||
|         "name": "安全文明驾驶常识", | ||||
|         "subjectType": "4", | ||||
|         "count": "3", | ||||
|         "chapterVideoList": [ | ||||
|           { | ||||
|             "videoId": "111", | ||||
|             "name": "第一课:安全驾驶基础知识", | ||||
|             "title": "驾驶机动车上道路行驶,驾驶人首先要确保自己处于良好的驾驶状态,避免不文明的驾驶状态和行为会为自己和他人的生命安全埋下隐患。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822228B0QUTOS9.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/a9c572ca6fb24c0b86c4bb822bc9559d/3b9c3452052d48c695d3bc7701b7e0d2-beb7fa718d09f342c0343f248501ec10-ld.m3u8?auth_key=1726196459-c79a4890ea2745ceb312469186afdfa0-0-47b4001a778636678c70c2feb4d42586", | ||||
|             "viewCount": 22494, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           }, | ||||
|           { | ||||
|             "videoId": "112", | ||||
|             "name": "第二课:常见的不文明驾驶行为", | ||||
|             "title": "不遵守交通法律法规的行为,既属于违法行为,也是不文明的驾驶行为,驾驶人应该增加文明驾驶意识,自觉遵守交通规则,安全第一。", | ||||
|             "photoUrl": "https://duolunstorage.oss-cn-hangzhou.aliyuncs.com/archive/ddjd/202207/1658822219GA9GTG2J.png", | ||||
|             "videoUrl": "https://ddjdvideo.duolunxc.com/1bdea813f93a456e890defd3f6d24a42/178aa73b657444989b543dfcd386b4ab-2045d439a68331e4c7b8b1a511d698e1-ld.m3u8?auth_key=1726196459-6d161bab98394c8f981a5df4b07ff77f-0-9527085c0efc3ca3befcb4025b1db1a5", | ||||
|             "viewCount": 10562, | ||||
|             "questCount": 0, | ||||
|             "isView": "0" | ||||
|           }, | ||||
|           { | ||||
|             "videoId": "113", | ||||
|             "name": "第三课:文明礼让驾驶", | ||||
|             "title": "文明驾驶是驾驶人良好行为习惯和道德修养的表现,也是保障道路交通安全和谐的基础 | ||||
| @ -209,6 +209,18 @@ export async function examCalcGpsDistance(param:{ | ||||
|   return await temp; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @desc 视觉分析类 | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * @desc 交通视觉感知类 | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* | ||||
|  * @desc通用处理函数 | ||||
|  | ||||
| @ -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:{} | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/sound_green_to.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/sound_green_to.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user