This commit is contained in:
wangzhongjie 2025-03-27 13:13:16 +08:00
commit 1336100978
5 changed files with 365 additions and 176 deletions

View File

@ -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;
}
}
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
}

View File

@ -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<CarInfoType>('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'
}

View File

@ -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<boolean>
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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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<boolean> {
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<mediaLibrary.FileAsset> {
async queryFile(displayName:string): Promise<mediaLibrary.FileAsset> {
return new Promise(async (resolve, reject) => {
const context = AppStorage.get('context')
const context = AppStorage.get<common.UIAbilityContext>('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;