296 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import systemTime from '@ohos.systemDateTime';
 | |
| import { testKm2Items, testKm3Items } from '../../pages/judgeSDK/dataTest/index';
 | |
| import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig';
 | |
| import { setJudgeUdp, setTopLineUdp } from './GlobalUdp';
 | |
| import { examCalcGpsDistance } from '../../pages/judgeSDK/api';
 | |
| 
 | |
| export const initJudgeUdp = async () => {
 | |
|   AppStorage.setOrCreate('serialIndex', 0)
 | |
|   AppStorage.setOrCreate('udpIndex', 0)
 | |
|   const udp = await setJudgeUdp()
 | |
|   globalThis.judgeUdp = udp
 | |
| 
 | |
|   const arrBlue = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00];
 | |
|   const arrBlueBuffer = Array2Byte(arrBlue).buffer
 | |
| 
 | |
|   const lightLineUdp = await setTopLineUdp();
 | |
|   if (lightLineUdp) {
 | |
|     lightLineUdp.send(arrBlueBuffer);
 | |
|   }
 | |
|   globalThis.lightLineUdp = lightLineUdp
 | |
| 
 | |
|   let [prevJd, preWd] = [0, 0]
 | |
|   globalThis.udpClient.onMessage_1(async (msg) => {
 | |
|     const stachArr = msg.split(',')
 | |
|     if (stachArr[0] != '#DN_GD') {
 | |
|       return
 | |
|     }
 | |
|     let udpIndex = AppStorage.get('udpIndex') as number;
 | |
|     const isJudge = AppStorage.get('isJudge');
 | |
|     if (udpIndex % 5 === 0 && !isJudge) {
 | |
|       const bytes = await getMessageHeartbeat(msg);
 | |
|       const msgArr = msg.split(',');
 | |
|       const jd = convertGpsCoord2(msgArr[96] * 1);
 | |
|       const wd = convertGpsCoord2(msgArr[95] * 1 || 0);
 | |
|       udp.send(bytes)
 | |
|       if (prevJd && msgArr[83] == 4) {
 | |
|         const distance = await examCalcGpsDistance({
 | |
|           jd1: prevJd,
 | |
|           wd1: preWd,
 | |
|           jd2: jd,
 | |
|           wd2: wd,
 | |
|           h: msgArr[90] * 1 || 1,
 | |
|         })
 | |
|         // globalThis.distanceClass?.setTimeData(((distance / 100).toFixed(2)) * 1)
 | |
|       }
 | |
|       prevJd = jd;
 | |
|       preWd = wd;
 | |
|     }
 | |
|     AppStorage.setOrCreate('udpIndex', udpIndex++)
 | |
|   })
 | |
| }
 | |
| 
 | |
| export const getMessageHeartbeat = async (msg) => {
 | |
|   const carInfo = AppStorage.get<CarInfoType>('carInfo');
 | |
|   const { examSubject, plateNo } = carInfo;
 | |
|   const ksyh = '0000000000000'
 | |
|   const { fourInOneScreen:{ gpsDigit } } = judgeConfig
 | |
|   const asclshArr = stringToASC(fillZero(
 | |
|     AppStorage.get('singlePlay')
 | |
|       ? '1111111111111'
 | |
|       : AppStorage.get('lsh'),
 | |
|     13));
 | |
|   const ascksyhArr = stringToASC(fillZero(examSubject == 2 ? '0000000000000' : '1111111111111', 13))
 | |
|   const ascsbxhArr = stringToASC('00000000')
 | |
|   // const ascsbxhArr = stringToASC('153216400880')
 | |
|   const serialIndex = AppStorage.get('serialIndex')
 | |
|   const tempData = await getPlcData(msg);
 | |
|   const examType = examSubject == 2 ? 2 : 3
 | |
|   const { sensor, gps } = tempData;
 | |
|   const { zfxd, yfxd, shtd, ygd, jgd, skd, dh1, dh2, lhq, jsc, ssc, fsc, lb, mkg, aqd, ygq, cs, fdjzs, dw } = sensor
 | |
|   const { jd, wd, hxj, fyj, hbg, sd } = gps
 | |
|   const translateSignals = getTranslateSignals(
 | |
|     [zfxd, yfxd, shtd, ygd, jgd, skd, dh1, dh2, lhq, jsc, ssc, fsc, lb, mkg, aqd].concat(getDwStatusType(dw))
 | |
|       .concat([0, 0, ygq, sensor.wd, 0])
 | |
|   )
 | |
|   const translateProject = getTranslateProject();
 | |
|   const translateJd = convertGpsCoord2(wd).toFixed(gpsDigit) * Math.pow(10, gpsDigit);
 | |
|   const translateWd = convertGpsCoord2(jd).toFixed(gpsDigit) * Math.pow(10, gpsDigit)
 | |
|   const translateProjects = translateProject.map(numStr => string2Bytes(parseInt(numStr, 2), 8)[0])
 | |
|   let tempSd = (sd * 1.852).toFixed(0) * 1
 | |
|   if (tempSd < 1) {
 | |
|     tempSd = 0
 | |
|   }
 | |
| 
 | |
|   const arr = [
 | |
|   //考生号
 | |
|     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(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((hxj) * 100, 2 * 8), string2Bytes(fyj * 100, 2 * 8), string2Bytes(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 tempArr = [];
 | |
|   arr.forEach(itemArr => {
 | |
|     tempArr = tempArr.concat(itemArr)
 | |
|   })
 | |
| 
 | |
|   AppStorage.setOrCreate('serialIndex', 0);
 | |
|   return Array2Byte(tempArr)
 | |
| }
 | |
| 
 | |
| // 中心plc实时信号转换成字节
 | |
| const getTranslateSignals = (tempItems) => {
 | |
|   const len = Math.floor(tempItems.length / 8);
 | |
|   const arr = [];
 | |
|   for (let i = 0; i < len; i++) {
 | |
|     const temp = tempItems.slice(i * 8, (i + 1) * 8);
 | |
|     arr.push(temp.join(''));
 | |
|   }
 | |
|   const temp = arr.map(numStr => parseInt(numStr, 2))
 | |
|   return temp.map(item => string2Bytes(item, 8)[0])
 | |
| }
 | |
| 
 | |
| // 中心所有项目转换
 | |
| const getTranslateProject = () => {
 | |
|   const examSubject = AppStorage.get('examSubject');
 | |
| 
 | |
|   const tempItems = (examSubject == 2 ? testKm2Items : testKm3Items).map(code => {
 | |
|     return {
 | |
|       code, status: '0'
 | |
|     }
 | |
|   })
 | |
|   const arr = [];
 | |
|   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'])
 | |
|     }
 | |
|     // if (i === 3 && examSubject == 3) {
 | |
|     //   tempArr = tempArr.concat(['00'])
 | |
|     // }
 | |
| 
 | |
|     arr.push(tempArr.join(''));
 | |
|   }
 | |
|   return arr
 | |
| }
 | |
| 
 | |
| // 中心实时项目状态转换
 | |
| const getCenterProjectStatus = (status) => {
 | |
|   switch (status) {
 | |
|   //不考
 | |
|     case 0:
 | |
|       return '00'
 | |
|   //未考
 | |
|     case 1:
 | |
|       return '01'
 | |
|   //已考
 | |
|     case 2:
 | |
|       return '10'
 | |
|   }
 | |
| }
 | |
| 
 | |
| // plc数据转换成对象
 | |
| const getPlcData = async (plc: string) => {
 | |
|   const time = await systemTime.getCurrentTime()
 | |
|   const p = plc.split(',').map((val, key) => {
 | |
|     if (key !== 27 && key !== 92) {
 | |
|       return val * 1
 | |
|     } else {
 | |
|       return val
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   const tempData = {
 | |
|     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: p[27].split('_')[0] * 1,
 | |
|       //累计脉冲   溜车脉冲   超声波左后     超声波右后     超声波右前     超声波左前    座椅    仪表盘   后视镜   倒车镜   光照  雨量
 | |
|       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
 | |
|     },
 | |
|     gps: {
 | |
|       //TODO 办卡类型    定位差分状态
 | |
|       bklx: p[56],
 | |
|       dwzt: p[83],
 | |
|       //角度差分状态
 | |
|       jdzt: p[92].split('-')[0] * 1,
 | |
|       //TODO gps数据
 | |
|       //gps时间 经度      纬度       航向角      俯仰角      海拔高       高度差     速度
 | |
|       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: p[92].split('-')[1] * 1
 | |
|     },
 | |
|   }
 | |
| 
 | |
|   return tempData
 | |
| }
 | |
| 
 | |
| const getDwStatusType = (dw) => {
 | |
|   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]
 | |
|   }
 | |
| } |