diff --git a/entry/src/main/ets/model/Judge.ets b/entry/src/main/ets/model/Judge.ets index b4ee395a..7a0f8809 100644 --- a/entry/src/main/ets/model/Judge.ets +++ b/entry/src/main/ets/model/Judge.ets @@ -554,7 +554,7 @@ export interface TKmItem { status: string } -export interface KmItems { +export interface JudgeConfigObjKmItems { '1'?: KmItem } @@ -601,12 +601,12 @@ export interface JudgeInitObj extends Km3JudgeInitConfig { } -export interface JudgeKsxm { +export interface JudgeKSXM { xmdm: number xmxh: string } -export interface JudgeKfxm { +export interface JudgeKFXM { xmdm: number kfdm: string } @@ -631,21 +631,21 @@ export interface JudgeBeginObj { czlx: number kskssj: number passing: number - ksxm: JudgeKsxm[] + ksxm: JudgeKSXM[] ddxk: 0 | 1 ddkssj: number ykxm: number[] - kfxm: JudgeKfxm[] + kfxm: JudgeKFXM[] yklc: number special?: number[] sczb?: 0 | 1 - sczbkf?: JudgeKfxm[] + sczbkf?: JudgeKFXM[] dmndg: boolean mfxx: boolean mfxxn: boolean } -export interface JudgeXmjs { +export interface JudgeXMJS { xmdm: number xmxh: string xmhg: 0 | 1 @@ -685,7 +685,7 @@ export interface JudgeEventKf { type?: 0 | 1 | 2 | 3 } -export interface JudgeKsjs { +export interface JudgeKSJS { type: 0 | 1 qjjl: number dcjl: number @@ -715,7 +715,7 @@ export interface JudgeLane { count: number } -export interface JudgeNongps { +export interface JudgeNonGPS { type: 0 | 1 | 2 | 3 | 4 } @@ -774,16 +774,16 @@ export interface JudgeCallBackData { event: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 sj: number carzt: -1 | 0 | 1 - xmks: JudgeKsxm - xmjs: JudgeXmjs + xmks: JudgeKSXM + xmjs: JudgeXMJS kf: JudgeKf - ksjs: JudgeKsjs - xmqx: JudgeKsxm + ksjs: JudgeKSJS + xmqx: JudgeKSXM sound: JudgeSound mndg: string lane: JudgeLane - precast: JudgeKsxm - nongps: JudgeNongps + precast: JudgeKSXM + nongps: JudgeNonGPS } export interface Km3JudgeInitConfig { diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index e370160b..8858543e 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -1,8 +1,7 @@ import common from '@ohos.app.ability.common'; import router from '@ohos.router'; -// import { initJudgeUdp } from '../common/utils/UdpJudge'; -import { judgeConfig } from './judgeSDK/utils/judgeConfig'; +import { JudgeConfig } from './judgeSDK/utils/judgeConfig'; import promptAction from '@ohos.promptAction'; import errorMsgDialog from './compontents/errorMsgDialog'; import imageBtn from './compontents/imageBtn'; @@ -23,8 +22,8 @@ import { GetCurrentTime } from '../utils/Common'; import { ObtainUdpBusinessInstance } from '../utils/business/ObtainUdpBusiness'; import { CenterUDPClientInstance } from '../utils/business/CenterUdpBusiness'; import { DrivingDataStorage } from '../utils/business/DrivingDataStorage'; -import { initJudgeUdp } from '../utils/business/UdpJudge'; -import { centerUDPClient, judgeUDPClient, lightUDPClient, objUDPClient } from '../utils/UdpUtils'; +import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness'; +import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; @Entry @@ -32,7 +31,7 @@ import { centerUDPClient, judgeUDPClient, lightUDPClient, objUDPClient } from '. struct Index { @State url: string = '' @State hasAuth: boolean = false; - @State dialogVisiable: boolean = false; + @State dialogVisible: boolean = false; @State singlePlay: boolean = false; @State baseInfo: BaseInfoType = {}; @State deviceId: string = ''; @@ -69,13 +68,14 @@ struct Index { this.ratio = AppStorage.get('ratio') this.initParamFlag = false this.delLoading = false - this.dialogVisiable = false + this.dialogVisible = false this.angle = 0 this.loading = false AppStorage.set('lsh', '1111111111111') // TODO 未改 // globalThis.errorDialog = this.errorDialog // globalThis.udpEvent = new UdpEvent(); + JudgeEmitterInstance.init() GetSyncData("MA_SYSSET").then((res: MASYSSETTableType[]) => { res.forEach((element) => { if (element.v_no === "305") { @@ -84,6 +84,10 @@ struct Index { } }); }); + + } + + async onPageShow(): Promise { this.singlePlay = AppStorage.get('singlePlay') this.baseInfo = AppStorage.get('baseInfo') @@ -96,12 +100,6 @@ struct Index { this.context.resourceManager.getRawFileContent("welcome.wav") .then(() => { this.avPlayer.playAudio(['welcome.wav']) - - // this.vocObj.playAudio({ - // type: 1, - // name: 'welcome.wav' - // }) - // let rawFile = value; }) .catch((error: BusinessError) => { console.log("getRawFileContent promise error is " + error); @@ -114,6 +112,15 @@ struct Index { AppStorage.setOrCreate('lsh', '1111111111111') } + @Styles + commStyle(){ + .width(220 * this.ratio * this.dialogRatio) + .height(69 * this.ratio * this.dialogRatio) + .backgroundImage($r('app.media.button_nor')) + .backgroundImageSize({ width: '100%', height: '100%' }) + // .margin({ bottom: 12 * this.ratio }) + } + async testXMLToJSONInWorker() { if (this.loading) { return @@ -225,7 +232,7 @@ struct Index { setTimeout(() => { this.initParamFlag = true }, 3000) - initJudgeUdp() + JudgeUdpBusinessInstance.init() // TODO 摄像头遮挡 // takePhotoFn(this.context) clearInterval(this.interval) @@ -239,15 +246,6 @@ struct Index { this.createAlbum() } - @Styles - commStyle(){ - .width(220 * this.ratio * this.dialogRatio) - .height(69 * this.ratio * this.dialogRatio) - .backgroundImage($r('app.media.button_nor')) - .backgroundImageSize({ width: '100%', height: '100%' }) - // .margin({ bottom: 12 * this.ratio }) - } - build() { Column() { Column() { @@ -274,7 +272,7 @@ struct Index { // type: 1, // name: 'button_media.wav' // }) - this.dialogVisiable = true + this.dialogVisible = true }) } } @@ -339,7 +337,7 @@ struct Index { // type: 1, // name: 'button_media.wav' // }) - if (judgeConfig.isTrajectoryOpen) { + if (JudgeConfig.isTrajectoryOpen) { router.pushUrl({ url: 'pages/UserInfo', }, router.RouterMode.Single) @@ -420,7 +418,7 @@ struct Index { } // - if (this.dialogVisiable) { + if (this.dialogVisible) { Flex({ justifyContent: FlexAlign.Center }) { Text('确认是否退出应用') .fontSize(28 * this.ratio * this.dialogRatio) @@ -434,7 +432,7 @@ struct Index { } .commStyle() .onClick(() => { - this.dialogVisiable = false + this.dialogVisible = false // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' diff --git a/entry/src/main/ets/pages/Judge.ets b/entry/src/main/ets/pages/Judge.ets index 52e96de5..9dc627c7 100644 --- a/entry/src/main/ets/pages/Judge.ets +++ b/entry/src/main/ets/pages/Judge.ets @@ -20,7 +20,7 @@ import { Project, SYSTEMPARMARR } from './judgeSDK/api/judgeSDK.d'; -import { judgeConfig } from './judgeSDK/utils/judgeConfig'; +import { JudgeConfig } from './judgeSDK/utils/judgeConfig'; import SignDisplayCom from './compontents/signDisplayCom'; import { @@ -191,8 +191,8 @@ struct Index { await this.initCar(); //是否开启轨迹回放模式 - if (judgeConfig.isTrajectoryOpen) { - this.initTrajectoryParam(judgeConfig.trajectoryPath) + if (JudgeConfig.isTrajectoryOpen) { + this.initTrajectoryParam(JudgeConfig.trajectoryPath) } else { await this.initSystemParam() await this.initMarkRules(); @@ -288,7 +288,7 @@ struct Index { const syssetJudgeConfigArr: SyssetConfig[] = [] syssetParams.forEach((sys: SYSSET) => { - if (judgeConfig.isTrajectoryOpen) { + if (JudgeConfig.isTrajectoryOpen) { sys.v_no = String(sys.key); sys.v_name = sys.name; sys.v_value = sys.value @@ -376,7 +376,7 @@ struct Index { // const { isTrajectoryOpen } = judgeConfig let carNo = '', allItems: string[] = []; systemParms.forEach((systemParm) => { - if (judgeConfig.isTrajectoryOpen) { + if (JudgeConfig.isTrajectoryOpen) { systemParm.no1 = systemParm.NO1 + ''; systemParm.no2 = systemParm.NO2 + ''; systemParm.no3 = systemParm.NO3 + ''; @@ -635,7 +635,7 @@ struct Index { // 初始化本地systemparam表、markrule表 async initTrajectoryParam(trajectoryPath: string) { - const isTrajectoryOpen = judgeConfig.isTrajectoryOpen + const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen //轨迹回放读取 systemparam表、markrule表 const fileUtil = new FileUtils(this.context); const folderPath = await fileUtil.initFolder(trajectoryPath); diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index 98dfe7ff..d609a5d7 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -13,7 +13,7 @@ import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup'; import LoadingPopup from './compontents/judge/LoadingPopup'; import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; -import { judgeConfig } from './judgeSDK/utils/judgeConfig'; +import { JudgeConfig } from './judgeSDK/utils/judgeConfig'; // import { initJudgeUdp } from '../common/utils/UdpJudge'; import errorMsgDialog from './compontents/errorMsgDialog'; import imageBtn from './compontents/imageBtn'; @@ -44,6 +44,7 @@ import dayTs from '../utils/Date'; import { GetCurrentTime, NumberToByteArray } from '../utils/Common'; import DB from '../utils/DbSql'; import { CenterUDPClientInstance } from '../utils/business/CenterUdpBusiness'; +import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; @Entry @Component @@ -309,14 +310,14 @@ struct UserInfo { // initJudgeUdp() // TODO UDP更改 //监听远程开始考试 - // globalThis.udpEvent.onBeginExam(async () => { - // console.info('surenjun', 'userInfo收到UdpEvent事件') - // if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) { - // await this.prePareSCZB() - // } else { - // await this.prePareExam() - // } - // }) + JudgeEmitterInstance.onBeginExam(async () => { + console.info('surenjun', 'userInfo收到UdpEvent事件') + if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) { + await this.prePareSCZB() + } else { + await this.prePareExam() + } + }) } @@ -925,7 +926,7 @@ struct UserInfo { return true } return new Promise((resolve, reject) => { - if (judgeConfig.isCheckFireOpen) { + if (JudgeConfig.isCheckFireOpen) { resolve(true) return } diff --git a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets index b25bf56f..479054f7 100644 --- a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets +++ b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets @@ -1,4 +1,4 @@ -import { judgeConfig } from '../../judgeSDK/utils/judgeConfig'; +import { JudgeConfig } from '../../judgeSDK/utils/judgeConfig'; import common from '@ohos.app.ability.common'; import VoiceAnnounce from '../../judgeSDK/utils/voiceAnnouncements'; @@ -90,7 +90,7 @@ export default struct DeductedPopup { //上车准备 // this.universalMarkRules = this.markRules.filter(item => this.currentItems.includes(item.itemno+'')) // const { isTrajectoryOpen } = judgeConfig; - if (judgeConfig.isTrajectoryOpen) { + if (JudgeConfig.isTrajectoryOpen) { await this.initDb() } else { await this.initSysset() @@ -113,7 +113,7 @@ export default struct DeductedPopup { const examSubject = this.carInfo.examSubject; //轨迹回放读取 systemparam表、markrule表 const fileUtil = new FileUtils(this.context); - const folderPath = await fileUtil.initFolder(judgeConfig.trajectoryPath); + const folderPath = await fileUtil.initFolder(JudgeConfig.trajectoryPath); const str = await fileUtil.readFile(folderPath); const strArr = str.split('\n'); // const [initData, beginData] = [strArr[0], strArr[1]]; @@ -121,7 +121,7 @@ export default struct DeductedPopup { const beginData = strArr[1]; // TODO 补全类型 const initDataObj: ESObject = JSON.parse(initData); - this.examSubject = Number(judgeConfig.isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject); + this.examSubject = Number(JudgeConfig.isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject); await this.initMarkRules(initDataObj.mark); await this.initSysset(initDataObj.sysset); await this.initStudent() @@ -153,7 +153,7 @@ export default struct DeductedPopup { kfdm: kf.kfdm, }))) - if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) { + if (judgeConfigObj['418'] == '1' || JudgeConfig.kfVoiceOpen) { avPlayer.playAudio([`voice/${mark.markcatalog}.mp3`, `voice/mark_${Math.abs(mark.score)}.mp3`], false, () => { this.closePopup(true) }); diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ets b/entry/src/main/ets/pages/judgeSDK/judge.ets index 5ededb25..dc75b64f 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ets +++ b/entry/src/main/ets/pages/judgeSDK/judge.ets @@ -9,7 +9,7 @@ import FileModel from './utils/fileModel'; import FilePhoto from './utils/filePhoto'; import FileLog from './utils/fileLog'; import JudgeTask from './utils/judgeTask'; -import { judgeConfig } from './utils/judgeConfig'; +import { JudgeConfig } from './utils/judgeConfig'; import { LANE } from '../judgeSDK/api/judgeSDK.d'; import { GetSyncData, SqlInsertTable } from '../../utils/table/Operation'; @@ -55,16 +55,16 @@ import { JudgeConfigObj, JudgeEventKf, JudgeInitObj, - JudgeKfxm, - JudgeKsjs, - JudgeKsxm, + JudgeKFXM, + JudgeKSJS, + JudgeKSXM, JudgePerformInfo, JudgeSound, JudgeUI, - JudgeXmjs, + JudgeXMJS, Km3JudgeInitConfig, KmItem, - KmItems, + JudgeConfigObjKmItems, MarkRule, Plc, ProjectInfo, @@ -402,10 +402,10 @@ export default class Judge { } } } - private ksjs: JudgeKsjs + private ksjs: JudgeKSJS private kfArr: JudgeEventKf[] //所有的科目考试项目(大车&小车) - private kmItems: KmItems + private kmItems: JudgeConfigObjKmItems private plcData: Plc // 获取plc数据 getPlcData = async (plc: string) => { @@ -686,9 +686,9 @@ export default class Judge { this.carztStr = ''; this.kmItems = {}; // 考试回放配置 - this.isTrajectoryOpen = judgeConfig.isTrajectoryOpen; - this.modelPath = judgeConfig.modelPath; - this.trajectoryPath = judgeConfig.trajectoryPath; + this.isTrajectoryOpen = JudgeConfig.isTrajectoryOpen; + this.modelPath = JudgeConfig.modelPath; + this.trajectoryPath = JudgeConfig.trajectoryPath; this.isExam = !this.judgeUI.singlePlay; (judgeUI.examSubject == '2' ? testKm2Items : testKm3Items).forEach(item => { @@ -794,8 +794,8 @@ export default class Judge { const ddxkKfArr = judgeUI.ddxkKfArr const passingScore = judgeUI.passingScore - const ksxm: JudgeKsxm[] = projects.map(project => { - const temp: JudgeKsxm = { + const ksxm: JudgeKSXM[] = projects.map(project => { + const temp: JudgeKSXM = { xmdm: Number(project.projectCode), xmxh: '' } return temp @@ -806,10 +806,10 @@ export default class Judge { return Number(currentProject.projectCode) })) || []; - const kfxm: JudgeKfxm[] = isDdxk ? (ddxkKfArr?.map(kf => { + const kfxm: JudgeKFXM[] = isDdxk ? (ddxkKfArr?.map(kf => { return { xmdm: Number(kf.split(',')[0]), kfdm: kf.split(',')[1] - } as JudgeKfxm + } as JudgeKFXM })) : [] const beginInfo: JudgeBeginObj = { @@ -1059,7 +1059,7 @@ export default class Judge { } // 更改考试状态 goVoiceAnnounce = - async (event: number, xmdm: number, kf: JudgeEventKf[], xmjs: JudgeXmjs, ksjs: JudgeKsjs, xmxh: string) => { + async (event: number, xmdm: number, kf: JudgeEventKf[], xmjs: JudgeXMJS, ksjs: JudgeKSJS, xmxh: string) => { const beginProject = this.beginProject const pointsDedute = this.pointsDedute @@ -1164,7 +1164,7 @@ export default class Judge { console.info('surenjun', '扣分开始') //扣分时实时播报语音(0-否+1-是) const currentKf = kf[kfLen -1]; - if (judgeConfig.kfVoiceOpen || (examSubject == '2' && judgeConfigObj['618'] == '1') || + if (JudgeConfig.kfVoiceOpen || (examSubject == '2' && judgeConfigObj['618'] == '1') || (examSubject == '3' && judgeConfigObj['418'] == '1')) { avPlayer.playAudio([`voice/${currentKf.markcatalog}.mp3`, `voice/mark_${Math.abs(currentKf.score)}.mp3`]) } diff --git a/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ets b/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ets index 14965b0c..de1311d7 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ets +++ b/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ets @@ -53,8 +53,7 @@ export default class FileModel { //获取文件内容 public getModelContent = (folderPath:string, fileName:string) => { try { - const content = this.fileUtil.getFileContent(`${folderPath}/${fileName}`) - return content; + return this.fileUtil.getFileContent(`${folderPath}/${fileName}`); } catch (e) { console.info('surenjun', JSON.stringify(e)) promptAction.showToast({ diff --git a/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ets b/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ets index 9818384d..7a3f8463 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ets +++ b/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ets @@ -1,6 +1,6 @@ import { takePhoto } from '../../../utils/Video'; import promptAction from '@ohos.promptAction'; -import { judgeConfig } from './judgeConfig'; +import { JudgeConfig } from './judgeConfig'; import FileUtils from '../../../utils/FileUtils'; import {VideoConfig} from '../../../model/Common' import common from '@ohos.app.ability.common'; @@ -9,7 +9,7 @@ export default class FilePhoto { private params: VideoConfig private context:common.UIAbilityContext public getPhoto = async () => { - if (!judgeConfig.isPhotoOpen) { + if (!JudgeConfig.isPhotoOpen) { return '' } else { try { diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts index a8e1b4f1..4b673a1f 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -1,5 +1,5 @@ //考试回放开关 -export const judgeConfig = { +export const JudgeConfig = { //本地目录开关 isTrajectoryOpen: false, //是否开启拍照 diff --git a/entry/src/main/ets/utils/UdpUtils.ets b/entry/src/main/ets/utils/UdpUtils.ets index 9418d22c..6f5fcfa3 100644 --- a/entry/src/main/ets/utils/UdpUtils.ets +++ b/entry/src/main/ets/utils/UdpUtils.ets @@ -41,6 +41,22 @@ export default class UdpClient { private errorEvents: Array = [] private dealMethod: DealMethod + private bindEvent() { + this.udp?.on("message", value => { + let result = this.dealMethod(value.message) + this.messageEvents.forEach(cb => { + cb(result) + }) + }) + this.udp.on("error", (err) => { + console.log(UDPTag, 'udp error', JSON.stringify(err)) + this.errorEvents.forEach(cb => { + cb(err) + }) + }) + } + + bindUdp(): Promise { return this.udp.bind({ address: this.localIp, port: parseInt(this.localIpPort), family: 1 @@ -55,8 +71,11 @@ export default class UdpClient { } close(): Promise { - this.udp.off("message") - this.udp.off("error") + this.messageEvents = [] + this.errorEvents = [] + this.dealMethod = null + this.udp?.off("message") + this.udp?.off("error") return this.udp?.close() } @@ -88,7 +107,8 @@ export default class UdpClient { this.sendMsg(msgData) } - create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) { + async create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) { + await this.close() this.localIp = udpLocalIp this.oppositeIp = udpOppositeIp this.localIpPort = udpLocalIpPort @@ -112,21 +132,6 @@ export default class UdpClient { offMsg(callback: Function) { this.messageEvents = this.messageEvents.filter(cb => cb !== callback) } - - private bindEvent() { - this.udp?.on("message", value => { - let result = this.dealMethod(value.message) - this.messageEvents.forEach(cb => { - cb(result) - }) - }) - this.udp.on("error", (err) => { - console.log(UDPTag, 'udp error', JSON.stringify(err)) - this.errorEvents.forEach(cb => { - cb(err) - }) - }) - } } // 获取后置机信号 diff --git a/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets b/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets index 4a6b1e72..fa0f2856 100644 --- a/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets +++ b/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets @@ -1,7 +1,7 @@ import { CarInfoType, EnvironmentConfigurationType, Gps, Sensor, UDPParamType } from '../../model' import { testKm2Items, testKm3Items } from '../../pages/judgeSDK/dataTest'; import { fillZero, } from '../../pages/judgeSDK/utils/Common'; -import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig'; +import { JudgeConfig } from '../../pages/judgeSDK/utils/judgeConfig'; import { FillZero, StringToASCII } from '../Common'; import UdpClient from '../UdpUtils' import { CenterUDPClientInstance } from './CenterUdpBusiness'; @@ -49,8 +49,8 @@ function string2Bytes(num: number | string, len: number) { class JudgeUdpBusiness { private static instance: JudgeUdpBusiness private udp: UdpClient - private udpIndex = 0; private currentUdpIndex = 0; + public udpIndex = 0; constructor() { if (!JudgeUdpBusiness.instance) { @@ -203,7 +203,6 @@ class JudgeUdpBusiness { dwsxs: p[84], jdsxs: Number(origin[92].split('-')[1]) } - return { sensor, gps, @@ -231,9 +230,9 @@ class JudgeUdpBusiness { } } - private async getMessageHeartbeat(msg: string): Promise { + async getMessageHeartbeat(msg: string): Promise { const carInfo: CarInfoType = AppStorage.get('carInfo') - let gpsDigit = judgeConfig.fourInOneScreen.gpsDigit + let gpsDigit = JudgeConfig.fourInOneScreen.gpsDigit const asclshArr = StringToASCII(FillZero( AppStorage.get("singlePlay") ? '1111111111111' diff --git a/entry/src/main/ets/utils/business/UdpEvent.ets b/entry/src/main/ets/utils/business/UdpEvent.ets index 86c0c482..7e6949fc 100644 --- a/entry/src/main/ets/utils/business/UdpEvent.ets +++ b/entry/src/main/ets/utils/business/UdpEvent.ets @@ -14,7 +14,7 @@ enum EventId { endExamEventId = 12 } -export default class JudgeEmitter { +class JudgeEmitter { private beginExamCallBack: Function = () => { } private endExamCallBack: Function = () => { @@ -23,10 +23,6 @@ export default class JudgeEmitter { } private directives: string - constructor() { - this.init() - } - //监听开始考试 public onBeginExam(callBack?: Function) { console.info('surenjun', '注册远程开始考试事件') @@ -124,3 +120,5 @@ export default class JudgeEmitter { } } +export const JudgeEmitterInstance = new JudgeEmitter() + diff --git a/entry/src/main/ets/utils/business/UdpJudge.ets b/entry/src/main/ets/utils/business/UdpJudge.ets deleted file mode 100644 index 0aa0a3fb..00000000 --- a/entry/src/main/ets/utils/business/UdpJudge.ets +++ /dev/null @@ -1,314 +0,0 @@ -import systemTime from '@ohos.systemDateTime'; - -import { testKm2Items, testKm3Items } from '../../pages/judgeSDK/dataTest/index'; -import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig'; -import { examCalcGpsDistance } from '../../pages/judgeSDK/api'; -import { judgeUDPClient, lightUDPClient, objUDPClient } from '../UdpUtils'; -import { CarInfoType, Gps, Sensor } from '../../model'; -import { FillZero, StringToASCII } from '../Common'; - -interface PLCDataType { - sensor: Sensor, - gps: Gps, -} - -interface ProjectDataType { - code: string - status: number -} - -interface ProjectItemType { - code: ProjectDataType - status: string -} - -function convertGpsCoord2(num: number) { - const tempNum = Math.floor(num); - const du = Math.floor(tempNum / 100); - const fen = tempNum % 100 + num - tempNum; - return du + fen / 60 -} - -function string2Bytes(num: number | string, len: number) { - let str = (Math.floor(Number(num))).toString(2); - if (str.length > len) { - console.log('数据长度不对~~'); - return - } - let byteString = FillZero(str, len); - - let arrBytes: number[] = []; - for (let i = byteString.length; i > 0; ) { - let j = i - 8; - if (j < 0) { - j = 0 - } - let s = byteString.slice(j, i); - let v = parseInt(s, 2); - arrBytes.push(v); - i = i - 8 - } - return arrBytes; -} - -// 中心plc实时信号转换成字节 -function getTranslateSignals(tempItems: number[]) { - const len = Math.floor(tempItems.length / 8); - const arr: string[] = []; - for (let i = 0; i < len; i++) { - arr.push(tempItems.slice(i * 8, (i + 1) * 8).join('')); - } - return arr.map(numStr => parseInt(numStr, 2)).map(item => string2Bytes(item, 8)[0]) -} - -// 中心所有项目转换 -function getTranslateProject(): string[] { - const examSubject = AppStorage.get("examSubject"); - const tempItems: ProjectItemType[] = - (examSubject === '2' ? testKm2Items : testKm3Items).map((code: ProjectDataType) => { - let data: ProjectItemType = { - code, - status: '0' - } - return data - }) - const arr: string[] = []; - for (let i = 0; i <= 4; i++) { - const temp = tempItems.slice(i * 4, (i + 1) * 4); - let tempArr = temp.map(item => item.status) - if (i === 4) { - tempArr = examSubject === '2' - //bit36-bit39保留 - ? tempArr.concat(['00', '00']) - //bit30-bit39保留 - : tempArr.concat(['00', '00', '00']) - } - - arr.push(tempArr.join('')); - } - return arr -} - -// plc数据转换成对象 -async function getPlcData(plc: string): Promise { - const time = await systemTime.getCurrentTime() - let origin = plc.split(",") - let p = origin.map(item => Number(item)) - let 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(origin[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, - yy: 0, - sde: 0, - xhd: '', - rmndg: 0, - wav: 0, - mndg: '' - } - let gps: Gps = { - bklx: p[56], - dwzt: p[83], - jdzt: Number(origin[92].split('-')[0]), - sj: time, - jd: p[96], - wd: p[95], - hxj: p[90], - fyj: p[91], - hbg: p[85], - gdc: p[86], - sd: p[97], - age: p[87], - jdyz: p[89], - wdyz: p[88], - dwsxs: p[84], - jdsxs: Number(origin[92].split('-')[1]) - } - - return { - sensor, - gps, - } -} - -function getDwStatusType(dw: number) { - switch (dw) { - case 0: - return [0, 0, 0, 0] - case 1: - return [0, 0, 0, 1] - case 2: - return [0, 0, 1, 0] - case 3: - return [0, 0, 1, 1] - case 4: - return [0, 1, 0, 0] - case 5: - return [0, 1, 0, 1] - case 9: - return [1, 0, 0, 1] - default: - return [0, 0, 0, 0] - } -} - -export async function initJudgeUdp() { - AppStorage.setOrCreate("serialIndex", 0) - AppStorage.setOrCreate("udpIndex", 0) - const arrBlue = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00]; - const arrBlueBuffer = new Uint8Array(arrBlue).buffer - lightUDPClient.sendMsg(arrBlueBuffer); - let prevJd = 0, preWd = 0 - objUDPClient.onMsg(async (msg: string) => { - const stashArr = msg.split(',') - if (stashArr[0] != '#DN_GD') { - return - } - const udpIndex = AppStorage.get("udpIndex"); - const isJudge = AppStorage.get("isJudge"); - if (udpIndex % 5 === 0 && !isJudge) { - const bytes = await getMessageHeartbeat(msg); - const msgArr: string[] = msg.split(','); - const jd = convertGpsCoord2(Number(msgArr[96])); - const wd = convertGpsCoord2(Number(msgArr[95]) || 0); - judgeUDPClient.send(bytes) - if (prevJd && Number(msgArr[83]) === 4) { - const distance = await examCalcGpsDistance({ - jd1: prevJd, - wd1: preWd, - jd2: jd, - wd2: wd, - h: Number(msgArr[90]) || 1, - }) - //@ts-ignore - // globalThis.distanceClass?.setTimeData(((distance / 100).toFixed(2)) * 1) - } - prevJd = jd; - preWd = wd; - } - AppStorage.set("udpIndex", udpIndex + 1) - }) -} - -export async function getMessageHeartbeat(msg: string): Promise { - const carInfo: CarInfoType = AppStorage.get('carInfo') - let gpsDigit = judgeConfig.fourInOneScreen.gpsDigit - const asclshArr = StringToASCII(FillZero( - AppStorage.get("singlePlay") - ? '1111111111111' - : AppStorage.get("lsh"), - 13)); - const ascksyhArr = StringToASCII(carInfo.examSubject === '2' ? '0000000000000' : '1111111111111') - const ascsbxhArr = StringToASCII('00000000') - const serialIndex = AppStorage.get("serialIndex") - const plcData = await getPlcData(msg); - let param: number[] = Object.entries(plcData.sensor) - .filter((item: [string, number]) => { - let keys = - ["zfxd", "yfxd", "shtd", "ygd", "jgd", "skd", "dh1", "dh2", "lhq", "jsc", "ssc", "fsc", "lb", "mkg", "aqd"] - return keys.indexOf(item[0]) - }) - .map((item: [string, number]) => item[1]) - .concat(getDwStatusType(plcData.sensor.dw)) - .concat([0, 0, plcData.sensor.ygq, plcData.sensor.wd, 0]) - const translateSignals = getTranslateSignals(param) - const translateProject = getTranslateProject(); - const translateJd = Number(convertGpsCoord2(plcData.gps.wd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit); - const translateWd = Number(convertGpsCoord2(plcData.gps.jd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit) - const translateProjects = translateProject.map(numStr => string2Bytes(parseInt(numStr, 2), 8)[0]) - let tempSd = Number((plcData.gps.sd * 1.852).toFixed(0)) - if (tempSd < 1) { - tempSd = 0 - } - const arr: number[][] = [ - //考生号 - asclshArr.map(lsh => string2Bytes(lsh, 8)[0]), - //考试员号 - ascksyhArr.map(ksyh => string2Bytes(ksyh, 8)[0]), - //科目类型(0:未考试 1:科目二 2:科目三) + 考试开始时间 - string2Bytes(`${0}${'00:00:000'}`, 4 * 8), - // 消息序号 - string2Bytes(serialIndex, 2 * 8), - translateSignals, - string2Bytes(tempSd * 100, 2 * 8), - string2Bytes(plcData.sensor.fdjzs / 100, 8), - string2Bytes(translateJd, 4 * 8), - string2Bytes(translateWd, 4 * 8), string2Bytes(1, 8), - //GPS东向距离 - string2Bytes(0, 4 * 8), - //GPS北向距离 - string2Bytes(0, 4 * 8), - //航向角 - string2Bytes(plcData.gps.hxj * 100, 2 * 8), - //俯仰角 - string2Bytes(plcData.gps.fyj * 100, 2 * 8), - // 高程(海拔) - string2Bytes(plcData.gps.hbg * 100, 4 * 8), - //dddd - translateProjects, - //当前项目编号 - string2Bytes(0, 8), - //场地设备编号 - ascsbxhArr.map(sbxh => string2Bytes(sbxh, 8)[0]), - //本次考试行驶距离 - string2Bytes(0, 2 * 8), - //扣分值 - string2Bytes(0, 2 * 8), - //扣分数 - string2Bytes(0, 2 * 8), - //扣分项数量 - string2Bytes(0, 8), - //n个扣分序号 - // [].map(kf => string2Bytes(kf.markcatalog, 8)), - [], - //牵引车第二gps精度、纬度 - string2Bytes(0, 4 * 8), string2Bytes(0, 4 * 8), - //牵引车第二航向角 - string2Bytes(0, 2 * 8), - //摩托压线 Byte[20], - string2Bytes(0, 20 * 8), - //考试用时 - string2Bytes(FillZero(0, 4), 4 * 8), - //项目用时 - string2Bytes(FillZero(0, 2), 2 * 8), - //设备信号状态 - string2Bytes(0, 4 * 8), - ] - let result: number[] = []; - arr.forEach(itemArr => { - result = result.concat(itemArr) - }) - AppStorage.setOrCreate("serialIndex", 0) - return [...new Uint8Array(result)] -}