diff --git a/entry/src/main/ets/model/Judge.ets b/entry/src/main/ets/model/Judge.ets index 8a9cd510..be5ef8ba 100644 --- a/entry/src/main/ets/model/Judge.ets +++ b/entry/src/main/ets/model/Judge.ets @@ -86,6 +86,142 @@ interface JudgeFile { param?: JudgeFileParam[]; } +/** 扣分表 **/ +export interface Mark { + itemno; + string + markcatalog: string + markshow: string + markreal: string + markserial: string + kfxh: string +} + +/** lane **/ +export interface Lane { + num: number + count: number + road: number +} + +export interface Sensor { + aqd: number + mkg: number + ssc: number + jsc: number + fsc: number + lhq: number + lb: number + skd: number + jgd: number + ygd: number + zfxd: number + yfxd: number + shtd: number + wd: number + ygq: number + dh1: number + dh2: number + fdjzs: number + dw: number + cs: number + fxp: number + ljmc: number + lcmc: number + csbzh: number + csbyh: number + csbyq: number + csbzq: number + zy: number + tbp: number + hsj: number + dcj: number + gx: number + yl: number + yy: number + sde: number + xhd: string + rmndg: number + wav: number + mndg: string +} + +export interface Gps { + bklx: number + dwzt: number + jdzt?: number + sj?: number, + jd: number + wd: number + hxj: number + fyj: number + hbg: number + gdc: number + sd: number + age: number + jdyz: number + wdyz: number + dwsxs: number + jdsxs?: number +} + +export interface Vision { + sj: number + score: number + zyjd: number + sxjd: number + ytjd: number + fxp: number + ch: number + hld: number +} + +export interface Radar { + sj: number + zxh: number + qfsj: Qfsj[] + hfsj: Qfsj[] + zqsj: Qfsj[] + zhsj: Qfsj[] + zcsj: Qfsj[] + yqsj: Qfsj[] + yhsj: Qfsj[] + ycsj: Qfsj[] + fqsj: Qfsj[] + qfwt: Qfwt + rcyz: number + show: Show[] +} + +interface Qfwt { + xrjl: number + zawjl: number +} + +export interface Plc { + sensor: Sensor, + gps: Gps, + gps2: Gps, + vision: Vision, + radar: Radar, + extend: object +} + +interface Qfsj { + bh: number + lx: number + jl: number + sd: number +} +interface Show{ + bh: number + zb:Zb[] +} +interface Zb{ + x:number, + y:number +} + /** 考试过程数据 */ export interface DrvexamType extends BaseExamFields { lsh?: string; @@ -99,4 +235,22 @@ export interface DrvexamType extends BaseExamFields { ksxtbh?: string; ksysfzmhm?: string; Ksy2sfzmhm?: string; -} \ No newline at end of file +} + + +export interface DefaultJudgeConfigObj{ + param_302:string + param_332:string + param_342:string + param_343:string + param_344:string + param_348:string + param_353:string + param_369:string + param_375:string + param_387:string + param_432:string + +} + + diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ets b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ets index fd524a1d..833ab27d 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ets +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ets @@ -1,27 +1,17 @@ import { testMarkRules, testRealExam } from '../dataTest/index'; +import { GetCurrentTime, NumberToByteArray } from '../../../utils/Common'; import systemTime from '@ohos.systemDateTime'; import { Array2Byte } from './Common'; import { CarInfoType } from '../../../model'; +import { Gps, Lane,Plc,Vision,Radar, Sensor,DefaultJudgeConfigObj} from '../../../model/Judge' -//获取本地扣分项 -export const getTestMarkRules = () => { - testMarkRules.map((mark: any) => { - return { - itemno: mark.itemno * 1, - markcatalog: mark.markcatalog, - markshow: mark.markshow, - markreal: mark.markreal * 1, - markserial: mark.markserial, - kfxh: mark.kfxh - } - }) -} +interface Extend {} // 中心信号转换 -export const getTranslateSignals = (tempItems) => { +export const getTranslateSignals = (tempItems:number[]) => { const len = Math.floor(tempItems.length / 8); - const arr = []; + const arr:string[] = []; for (let i = 0; i < len; i++) { const temp = tempItems.slice(i * 8, (i + 1) * 8); arr.push(temp.join('')); @@ -45,7 +35,7 @@ export function getCarStatus(status: -1 | 0 | 1): string { } // 当前考车中心状态转换 -export function getCarStatusType(carzt) { +export function getCarStatusType(carzt?:number) { switch (carzt) { case -1: return [1, 0] @@ -59,7 +49,7 @@ export function getCarStatusType(carzt) { } // 获取档位信号 -export function getDwStatusType(dw) { +export function getDwStatusType(dw?:number) { switch (dw) { case 0: return [0, 0, 0, 0] @@ -82,7 +72,7 @@ export function getDwStatusType(dw) { // 中心实时项目状态转换 -export function getCenterProjectStatus(status) { +export function getCenterProjectStatus(status?:number) { switch (status) { //不考 case 0: @@ -104,27 +94,29 @@ export function getCenterProjectStatus(status) { //获取科目三开始项目、结束项目语音 export function getKmProjectVoice( - projectCode, + projectCode:string, // 1:项目开始 2:项目结束 type: 1 | 2, - judgeConfig, - lane, - xmxh + judgeConfig:object, + lane:Lane, + xmxh:number ) { const carInfo = AppStorage.get('carInfo'); - const { examSubject } = carInfo; - const param506Str = judgeConfig['506']?.split(',') || []; - const param512Str = judgeConfig['512']?.split(',') || []; - const param544Str = judgeConfig['544']?.split(',') || []; - const param405Str = judgeConfig['405'] || 0; + const examSubject = carInfo.examSubject; + const param506Str:number[] = ( Reflect.get(judgeConfig,'506')?.split(',') ) || [] + const param512Str:number[] = ( Reflect.get(judgeConfig,'512')?.split(',') ) || [] + const param544Str:number[] = ( Reflect.get(judgeConfig,'544')?.split(',') ) || [] + const param405Str:number = Reflect.get(judgeConfig,'405') || 0; console.info('surenjun => param544Str.length', param544Str.length) - const { num, count, road } = lane - if (examSubject == 2) { + const num = lane.num + const count = lane.count + const road = lane.road + if (examSubject == '2') { return projectCode } - switch (projectCode * 1) { + switch (Number(projectCode)) { //直线行驶 case 40300: return type === 1 ? 403001 : 403002 @@ -181,11 +173,11 @@ export function getKmProjectVoice( //获取科目三&科目三取消项目语音 -export function getKmProjectCancelVoice(examSubject, projectCode) { +export function getKmProjectCancelVoice(examSubject:number, projectCode:number) { if (examSubject == 2) { return 'xmqx' } - switch (projectCode * 1) { + switch (Number(projectCode)) { //变更车道 case 40500: return 405004 @@ -458,17 +450,66 @@ export function promptWxCode( // 获取plc数据 export const plcStrToJson = async (plc: string) => { - - const p = plc.split(',').map((val, key) => { + const plcArr = plc.split(',') + const p = plcArr.map((val, key) => { if (key !== 27 && key !== 92) { - return val * 1 - } else { - return val + return Number(val) } }); - let data: any = testRealExam; const time = await systemTime.getCurrentTime() - const tempData = { + + + const sensor:Sensor = { + //安全带 车门门开关 手刹 脚刹 副刹 离合器 喇叭 示宽灯 近光灯 远光灯 + aqd: p[19], + mkg: p[14], + ssc: p[13], + jsc: p[12], + fsc: p[18], + lhq: p[17], + lb: p[4], + skd: p[9], + jgd: p[7], + ygd: p[8], + //左方向灯 右方向灯 双跳灯 雾灯 雨刮器 点火1 点火2 发动机转速 档位 车速 + zfxd: p[2], + yfxd: p[3], + shtd: p[20], + wd: p[10], + ygq: p[11], + dh1: p[5], + dh2: p[6], + fdjzs: p[25], + dw: p[28], + cs: p[23], + // 方向盘 + fxp: Number(plcArr[27].split('_')[0]), + //累计脉冲 溜车脉冲 超声波左后 超声波右后 超声波右前 超声波左前 座椅 仪表盘 后视镜 倒车镜 光照 雨量 + ljmc: p[24], + lcmc: 0, + csbzh: p[32], + csbyh: p[30], + csbyq: p[31], + csbzq: p[29], + zy: 0, + tbp: 0, + hsj: 0, + dcj: 0, + gx: 0, + yl: 0, + //TODO 数据待替换 油压 闪灯 信号灯 + yy: 0, + sde: 0, + xhd: '', + rmndg: 0, + wav: 0, + mndg: '' + } + const gps2:Gps =testRealExam.gps2 + const radar:Radar =testRealExam.radar + const vision:Vision =testRealExam.vision + const extend:Extend = {}; + const tempData:Plc = { sensor: { //安全带 车门门开关 手刹 脚刹 副刹 离合器 喇叭 示宽灯 近光灯 远光灯 aqd: p[19], @@ -493,7 +534,7 @@ export const plcStrToJson = async (plc: string) => { dw: p[28], cs: p[23], // 方向盘 - fxp: p[27].split('_')[0] * 1, + fxp: Number(plcArr[27].split('_')[0]), //累计脉冲 溜车脉冲 超声波左后 超声波右后 超声波右前 超声波左前 座椅 仪表盘 后视镜 倒车镜 光照 雨量 ljmc: p[24], lcmc: 0, @@ -520,7 +561,7 @@ export const plcStrToJson = async (plc: string) => { bklx: p[56], dwzt: p[83], // 角度差分状态 - jdzt: p[92].split('-')[0] * 1, + jdzt: Number(plcArr[92].split('-')[0]), //gps数据 //gps时间 经度 纬度 航向角 俯仰角 海拔高 高度差 速度 sj: time, @@ -537,26 +578,25 @@ export const plcStrToJson = async (plc: string) => { wdyz: p[88], dwsxs: p[84] || 0, // 角度搜星数 - jdsxs: p[92].split('-')[1] * 1 || 0 + jdsxs: Number(plcArr[92].split('-')[1]) || 0 }, - gps2: data.gps, - vision: data.vision, - radar: data.radar, - extend: {} + gps2: gps2, + vision, + radar, + extend } return tempData } export const plcStrToWXJson = async (plc: string) => { + const plcArr = plc.split(',') const p = plc.split(',').map((val, key) => { if (key !== 27 && key !== 92) { - return val * 1 - } else { - return val + return Number(val) } }); const timeStr = p[93] + '' + p[94]; - const gps = { + const gps:Gps = { //办卡类型 定位差分状态 bklx: p[56], dwzt: p[83], @@ -580,35 +620,39 @@ export const plcStrToWXJson = async (plc: string) => { // 注车制动 行车制动 离合器 副制动 喇叭 雨刷 危险报警灯 示廓灯 系统未涉及的传感器信号 p[13], p[12], p[17], p[18], p[4], p[11], p[20], p[9], 0 ] + + const judgeSignalNum = Number(judgeSignal.join('')) const judgeAnotherSignal = [ // 低三挡位 左侧单边桥1 左侧单边桥2 右侧单边桥1 右侧单边桥2 雾灯 '000', '0', '0', '0', '0', p[10], // 桩杆全无信号 左后绕车 右后绕车 右前绕车 左前绕车 '000', '0', '0', '0', '0' ] + const judgeAnotherSignalNum = Number(judgeAnotherSignal.join('')) + const wuXiData = [ // 卫星时间 精度 纬度 高度 方位角 俯仰角 速度角 速度 横滚 卫星定位状态 '$KSXT', timeStr, gps.jd, gps.wd, gps.hbg, gps.hxj, gps.fyj, '', gps.sd, '', gps.dwzt, gps.dwzt, //前天线可用星数 后天线可用星数 东向坐标位置 北向位置坐标 天向位置坐标 东向速度 北向速度 天向速度 '', '', '', '', '', '', '', '', // 评判信号1 评判信号2 发动机转速 - (judgeSignal.join('') * 1).toString(16), (judgeAnotherSignal.join('') * 1).toString(16), p[25], + judgeSignalNum.toString(16),judgeAnotherSignalNum.toString(16), p[25], '0xFFFFFFF' ] const wuXiDataStr = wuXiData.join(',') return wuXiDataStr } -export const senorToWXDataStr = async (tempData) => { - const { sensor, gps } = tempData; +export const senorToWXDataStr = async (tempData:Plc) => { + const sensor = tempData.sensor + const gps = tempData.gps const timeStr = await getTimeStr() - const { mkg, aqd, dh1, dh2, zfxd, yfxd, jgd, ygd, ssc, jsc, lhq, fsc, lb, ygq, wd } = sensor - const judgeSignal = [ + const judgeSignal:number[] = [ //车门 安全带 熄火 发动机启动 左转向 右转向 前照灯近灯 前照灯远灯 - mkg, aqd, dh1, dh2, zfxd, yfxd, jgd, ygd, + sensor.mkg, sensor.aqd, sensor.dh1, sensor.dh2, sensor.zfxd, sensor.yfxd, sensor.jgd, sensor.ygd, // 注车制动 行车制动 离合器 副制动 喇叭 雨刷 危险报警灯 示廓灯 系统未涉及的传感器信号 - ssc, jsc, lhq, fsc, lb, ygq, 0, 0, 0 + sensor.ssc, sensor.jsc, sensor.lhq, sensor.fsc, sensor.lb, sensor.ygq, 0, 0, 0 ] const judgeAnotherSignal = [ @@ -618,8 +662,8 @@ export const senorToWXDataStr = async (tempData) => { '000', '0', '0', '0', '0', '0', '0' ] - const str1 = (judgeSignal.join('') * 1).toString(16); - const str2 = (judgeAnotherSignal.join('') * 1).toString(16); + const str1 = (Number(judgeSignal.join(''))).toString(16); + const str2 = (Number(judgeAnotherSignal.join(''))).toString(16); const wuXiData = [ // 卫星时间 精度 纬度 高度 方位角 俯仰角 速度角 速度 横滚 卫星定位状态 @@ -652,43 +696,44 @@ export const getTimeStr = async () => { export function sendBlue() { const arrBlue = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00]; const arrBlueBuffer = Array2Byte(arrBlue).buffer - globalThis.lightLineUdp.send(arrBlueBuffer); + // globalThis.lightLineUdp.send(arrBlueBuffer); } //绿灯 export function sendGreen() { const arrGreen = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x00, 0x03, 0x01]; const arrGreenBuffer = Array2Byte(arrGreen).buffer - globalThis.lightLineUdp.send(arrGreenBuffer); + // globalThis.lightLineUdp.send(arrGreenBuffer); } //红灯 export function sendRed() { const arrRed = [0x55, 0xaa, 0x01, 0x01, 0x02, 0x00, 0x03, 0x00]; const arrRedBuffer = Array2Byte(arrRed).buffer - globalThis.lightLineUdp.send(arrRedBuffer); + // globalThis.lightLineUdp.send(arrRedBuffer); } -export const defaultJudgeConfigObj = { + +export const defaultJudgeConfigObj:DefaultJudgeConfigObj = { //结束考试方式 0-不合格继续 1-考试不合格报靠边停车 2-不合格不报靠边 3-训练不合格报靠边 4-自动退出 5-不合格自动退出 - 302: '5', - 332: '', + param_302: '5', + param_332: '', //是否能进行人工操作 0-不能人工评判 1-不能人工进项目 3-都不能 - 342: '', + param_342: '', //有项目未结束时可以靠边停车 0-否 1-是 - 343: '1', + param_343: '1', //考试未结束且有扣分,是否可以退出 - 344: '0', + param_344: '0', //直线行驶中是否可以进其它项目 0-否 1-是 - 348: '0', + param_348: '0', //车上是否能点结束考试 0:否 1:是 - 353: '0', + param_353: '0', //是否启动断电续考 0:否 1:是 - 369: '1', + param_369: '1', //是否显示应考里程 - 375: '0', + param_375: '0', //里程不够允许手工点靠边停车 - 387: '0', + param_387: '0', //监管模式有扣分续考(0-否++1-是+把上次未考完的扣分带下来重新考试) - 432: '1' + param_432: '1' } \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ets b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ets new file mode 100644 index 00000000..d0d6fe3c --- /dev/null +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ets @@ -0,0 +1,58 @@ +import Prompt from '@system.prompt' + +const TAG = 'SURENJUN_JUDGE' + +interface DelayConfig{ + isDelay: boolean + delayTime: number +} + +interface QUEUE { + fn: Function, + delayConfig?: DelayConfig +} + +type GoTask = (currentTask:QUEUE)=>Promise + +export default class JudgeTask { + private queue?:QUEUE[] = [] + private status: string + + constructor() { + this.queue = [] + this.status = 'end' + } + + //执行任务 + goTask:GoTask = async (currentTask:QUEUE) => { + const fn = currentTask.fn; + const delayConfig = currentTask.delayConfig || {isDelay:false,delayTime:1000} + const isDelay = delayConfig.isDelay + const delayTime = delayConfig.delayTime + + return false + } + + executeQueue = async () => { + const queue = this.queue; + const executeQueue = this.executeQueue + if (queue.length) { + for (const currentTask of queue) { + await this.goTask(currentTask) + this.queue.shift() + await executeQueue() + } + } else { + this.status = 'end' + } + } + + addTask = async (fn:Function, delayConfig?: DelayConfig) => { + this.queue.push({ + fn, delayConfig + }); + if (this.status == 'end' && this.queue.length === 1) { + await this.executeQueue(); + } + } +} diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts deleted file mode 100644 index 4dbeec8f..00000000 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts +++ /dev/null @@ -1,67 +0,0 @@ -import Prompt from '@system.prompt' - -const TAG = 'SURENJUN_JUDGE' - -interface QUEUE { - fn: Function, - config?: { - isDelay: boolean - delayTime: number - } -} - -export default class JudgeTask { - private queue = [] - private status: string - - constructor() { - this.queue = [] - this.status = 'end' - } - - // - goTask = async (currentTask) => { - const {fn,delayConfig={}} = currentTask; - const { isDelay = false,delayTime = 1000} = delayConfig - return new Promise(async (res, rej) => { - setTimeout(async () => { - try { - await fn() - res(true) - } catch (e) { - console.info(TAG, '过程任务执行失败=>' + JSON.stringify(e)) - Prompt.showToast({ - message: '过程任务执行失败=>' + JSON.stringify(e), - duration: 3000 - }); - res(false) - } - }, isDelay ? delayTime : 0); - }) - } - - executeQueue = async () => { - const {queue,executeQueue} = this - if (queue.length) { - for (const currentTask of queue) { - await this.goTask(currentTask) - this.queue.shift() - await executeQueue() - } - } else { - this.status = 'end' - } - } - - addTask = async (fn, delayConfig?: { - isDelay: Boolean, - delayTime?: Number - }) => { - this.queue.push({ - fn, delayConfig - }); - if (this.status == 'end' && this.queue.length === 1) { - await this.executeQueue(); - } - } -} diff --git a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ets similarity index 83% rename from entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts rename to entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ets index 0f8cbaaf..702abd1e 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ets @@ -7,17 +7,18 @@ import common from '@ohos.app.ability.common'; const TAG = 'VoiceAnnounce' +interface Queue{ + url: string, + callback?: Function +} + +type PlayAudio = (urls: string[], shit?: boolean, callback?: Function) => Queue | void + export default class VoiceAnnounce { //队列时候立马终止 private isStopped: Boolean - private queue: { - url: string, - callback?: Function - }[] - private newQueue: { - url: string, - callback?: Function - }[] + private queue: Queue[] + private newQueue: Queue[] private pendingQueue: String[] private callback: Function; @@ -26,15 +27,18 @@ export default class VoiceAnnounce { this.queue = [] } - async playAudio(urls: string[], shit?: boolean, callback?: Function) { - const { isStopped, queue } = this; - const tempUrls = urls.map((url, index) => { - return { - url, - callback: (index === urls.length - 1) ? callback : undefined - } + async playAudio(urls: string[], shit?: boolean, callbackFn?: Function) { + const isStopped = this.isStopped; + const queue = this.queue; + + const tempUrls: Queue[] = urls.map((url, index) => { + const callback:Function|undefined = (index === urls.length - 1) ? callbackFn : undefined + const temp:Queue = {url, callback} + return temp }); + + if (shit) { //队列清空,重新初始化 this.isStopped = true; @@ -53,7 +57,9 @@ export default class VoiceAnnounce { async executeQueue() { const go = async () => { - const { queue, isStopped, newQueue } = this; + const queue = this.queue; + const isStopped = this.isStopped; + const newQueue = this.newQueue; const avPlayer = new AVPlayer(); if (isStopped) { //清空原来队列 @@ -77,8 +83,7 @@ export default class VoiceAnnounce { class AVPlayer { - public avPlayer: any = null; - + public avPlayer?: media.AVPlayer; private voiceUrl: string[]; private voiceStatus: 'completed' | 'playing' private endCallback: Function @@ -87,7 +92,7 @@ class AVPlayer { } // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 - async play(name, callback) { + async play(name:string, callback:Function):Promise { try { //检查SD中的语音 // console.info('surenjun name',name) @@ -123,7 +128,7 @@ class AVPlayer { this.avPlayer = await media.createAVPlayer(); return new Promise(async (resolve, reject) => { await this.setAVPlayerCallback(() => { - resolve() + resolve(true) }); try { const context: common.UIAbilityContext = AppStorage.get('context') @@ -133,34 +138,28 @@ class AVPlayer { message: `${name}语音文件不存在`, duration: 4000 }); - resolve(1) + resolve(true) } }) } - - } - async queryFile(displayName): Promise { + async queryFile(displayName:string): Promise { return new Promise(async (resolve, reject) => { - const context = AppStorage.get('context') + const context = AppStorage.get('context') const mediaLib = mediaLibrary.getMediaLibrary(context); - let ret - let fetchOp = { + let fileResult = await mediaLib.getFileAssets({ selections: `media_type=? AND display_name = ?`, selectionArgs: [`${mediaLibrary.MediaType.AUDIO}`, displayName], - }; - let fileResult = await mediaLib.getFileAssets(fetchOp); + }); let retCount = fileResult.getCount(); if (retCount > 0) { - ret = await fileResult.getFirstObject(); + let ret = await fileResult.getFirstObject(); return resolve(ret); } else { return reject(false); } }) - - } //音频播放队列 @@ -175,7 +174,7 @@ class AVPlayer { } // 注册avplayer回调函数 - setAVPlayerCallback(callBack) { + setAVPlayerCallback(callBack:Function) { this.avPlayer.on('error', (err) => { this.avPlayer && this.avPlayer.stop() this.avPlayer && this.avPlayer.reset() @@ -185,7 +184,7 @@ class AVPlayer { let num = 0; // 状态机变化回调函数 this.avPlayer.on('stateChange', async (state, reason) => { - const { endCallback } = this; + const endCallback = this.endCallback; switch (state) { case 'idle': // 成功调用reset接口后触发该状态机上报 break;