397 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			397 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {string2Bytes,Array2Byte,getCurrentTime} from '../../../common/utils/tools'
 | ||
| import {testMarkRules,testRealExam,testKmItems} from '../dataTest/index'
 | ||
| 
 | ||
| import promptAction from '@ohos.promptAction'
 | ||
| import systemTime from '@ohos.systemDateTime';
 | ||
| 
 | ||
| //获取本地扣分项
 | ||
| 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
 | ||
|     }
 | ||
|   })
 | ||
| }
 | ||
| 
 | ||
| // 中心信号转换
 | ||
| export 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])
 | ||
| }
 | ||
| 
 | ||
| // c++评判考车行驶状态转换
 | ||
| export function getCarStatus(status: -1 | 0 | 1):string {
 | ||
|   switch (status){
 | ||
|     case -1:return '后退'
 | ||
|     case 0:return '停车'
 | ||
|     case 1:return '前进'
 | ||
|     default :return ''
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| // 当前考车中心状态转换
 | ||
| export function getCarStatusType(carzt){
 | ||
|   switch (carzt){
 | ||
|     case -1:return  [1,0]
 | ||
|     case 0: return  [0,0]
 | ||
|     case 1: return  [0,1]
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| // 中心实时项目状态转换
 | ||
| export function getCenterProjectStatus(status){
 | ||
|   switch (status){
 | ||
|   //不考
 | ||
|     case 0:return '00'
 | ||
|   //未考
 | ||
|     case 1:return '01'
 | ||
|   //已考
 | ||
|     case 2:return '10'
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| //获取科目三开始项目、结束项目语音
 | ||
| 
 | ||
| export function getKmProjectVoice(
 | ||
|   projectCode,
 | ||
|   // 1:项目开始 2:项目结束
 | ||
|   type: 1 | 2
 | ||
| ) {
 | ||
|   const carInfo = globalThis.carInfo;
 | ||
|   const { examSubject } = carInfo;
 | ||
| 
 | ||
|   if(examSubject == 2){
 | ||
|     return projectCode
 | ||
|   }
 | ||
| 
 | ||
|   switch (projectCode*1){
 | ||
|     //直线行驶
 | ||
|     case 40300: return type === 1 ? 403001 : 403002
 | ||
|     //变更车道
 | ||
|     case 40500: return type === 1 ? 405001 : 405002
 | ||
|     //超车
 | ||
|     case 41400 : return type === 1 ? 414001 : undefined
 | ||
|     //直线行驶
 | ||
|     case 40700 : return type === 1 ? 407001 : undefined
 | ||
|     //左转
 | ||
|     case 40800 : return type === 1 ? 408001 : undefined
 | ||
|     //右转
 | ||
|     case 40900 : return type === 1 ? 409001 : undefined
 | ||
|     //通过人行横道
 | ||
|     case 41000 : return type === 1? 410001:undefined
 | ||
|     //通过学校
 | ||
|     case 41100 : return type === 1 ? 411001:undefined
 | ||
|     //通过车站
 | ||
|     case 41200 : return type === 1 ? 412001 : undefined
 | ||
|     //会车
 | ||
|     case 41300 : return type === 1 ? 413001: 413002
 | ||
|     //靠边停车
 | ||
|     case 40600 : return type === 1 ? 406001 : undefined
 | ||
|     //掉头
 | ||
|     case 41500 : return type === 1 ? 415001:undefined
 | ||
|     //超车
 | ||
|     case 40400 : return type === 1 ? 404001:undefined
 | ||
| 
 | ||
|     default :return undefined
 | ||
|   }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| // 上传监管数据code转换
 | ||
| export function promptWxCode(
 | ||
|     jkid:'17C52' | '17C54' |'17C55' | '17C53' | '17C56',
 | ||
|     code:number
 | ||
| ){
 | ||
|   let toast = '';
 | ||
|   const singlePlay = globalThis.singlePlay
 | ||
|   if(singlePlay){
 | ||
|     return
 | ||
|   }
 | ||
|   switch (jkid){
 | ||
|     //项目开始
 | ||
|     case '17C52':
 | ||
|       switch (code){
 | ||
|         case  0:toast = '存在作弊嫌疑,已被取消或暂停考试';break;
 | ||
|         case -1:toast = '无考生身份比对信息';break;
 | ||
|         case -2:toast = '考试项目与考试安排信息不符';break;
 | ||
|         case -3:toast = '考试设备未备案';break;
 | ||
|         case -4:toast = '考试设备与考试项目不符';break;
 | ||
|         case -5:toast = '考试设备使用状态异常';break;
 | ||
|         case -6:toast = '考生考试车型与考试设备使用准驾车型范围不符';break;
 | ||
|         case -7:toast = '该考生存在作弊嫌疑,已被暂停/取消考试';break;
 | ||
|         case -8:toast = '项目开始时间不能小于科目开始时间';break;
 | ||
|         case -9:toast = '存在未结束的考试项目、不能开始新的项目考试!';break;
 | ||
|         case -10:toast = '科目三考车号牌不能为空';break;
 | ||
|         case -11:toast = '同一考车存在未结束考试,不能开始应用于新的考试';break;
 | ||
|         case -12:toast = '未找到考场记录';break;
 | ||
|         case -13:toast = '未找到考车信息';break;
 | ||
|         case -14:toast = '随机抽取考生的考车与当前考车不一致';break;
 | ||
|         default:toast = '';break;
 | ||
|       }
 | ||
|       break;
 | ||
|     //过程照片
 | ||
|     case '17C54':
 | ||
|       switch (code){
 | ||
|         case -1:toast = '无当前科目考试信息';break;
 | ||
|         case -2:toast = '考生身份证明号码与考生预约信息不符';break;
 | ||
|         case -3:toast = '考试项目不正确';break;
 | ||
|         case -4:toast = '考试过程中拍摄照片数量少于3张!';break;
 | ||
|         case -5:toast = '考试项目不符合要求';break;
 | ||
|         case -6:toast = '存在未结束的考试项目!';break;
 | ||
|       }
 | ||
|       break;
 | ||
|     //项目结束
 | ||
|     case '17C55':
 | ||
|       switch (code){
 | ||
|         case -1:toast = '无当前考试项目开始信息';break;
 | ||
|         case -2:toast = '考生身份证明号码与考生预约信息不符';break;
 | ||
|         case -3:toast = '考试项目不正确';break;
 | ||
|         case -4:toast = '考试设备序号不正确!';break;
 | ||
|         case -5:toast = '考试项目结束时间写入错误';break;
 | ||
|         case -6:toast = '考生未进行身份认证';break;
 | ||
|         case -7:toast = '项目考试过程信息记录被非法篡改';break;
 | ||
|         case -8:toast = '每个考试项目中必须至少抓拍一张照片';break;
 | ||
|         case -12:toast = '未找到考场记录';break;
 | ||
|         case -13:toast = '未找到考车信息';break;
 | ||
|         case -15:toast = '考试过程信息必须由考车上传';break;
 | ||
|         case -90:toast = '考试项目已经结束、无需重传';break;
 | ||
|         case -91:toast = '实际道路考试,在完成科目考试时统一结束';break;
 | ||
|         default:break;
 | ||
|       }
 | ||
|       break;
 | ||
|     //扣分
 | ||
|     case '17C53':
 | ||
|       switch (code){
 | ||
|         case  0:toast = '已存在同一时间的同一扣分记录';break
 | ||
|         case -1:toast = '无当前考试项目开始信息';break;
 | ||
|         case -2:toast = '扣分时间大于项目开始时间!';break;
 | ||
|         case -3:toast = '考试项目与扣分项不符';break;
 | ||
|         case -4:toast = '项目考试过程中,请传入当前考试项目代码';break;
 | ||
|         case -5:toast = '考生未进行身份认证';break;
 | ||
|         case -6:toast = '扣分时间写入错误';break;
 | ||
|         case -7:toast = '项目考试过程信息记录被非法篡改';break;
 | ||
|         case -12:toast = '未找到考场记录';break;
 | ||
|         case -13:toast = '未找到考车信息';break;
 | ||
|         case -15:toast = '考试过程信息必须由考车上传';break;
 | ||
|         default:toast = '';break
 | ||
|       }
 | ||
|       break;
 | ||
|     //考试结束
 | ||
|     case '17C56':
 | ||
|       switch (code){
 | ||
|         case -1:toast = '无当前科目考试信息';break;
 | ||
|         case -2:toast = '考生身份证明号码与考生预约信息不符';break;
 | ||
|         case -3:toast = '考试结束时间不正确';break;
 | ||
|         case -4:toast = '考试过程中拍摄照片数量少于3张!';break;
 | ||
|         case -5:toast = '考试项目不符合要求';break;
 | ||
|         case -6:toast = '存在未结束的考试项目!';break;
 | ||
|         case -7:toast = '传输的考试成绩非空';break;
 | ||
|         case -91:toast = '考试成绩计算不一致';break;
 | ||
|         case -91:toast = '日间考试已结束等待进行夜间考试';break;
 | ||
|         default: toast = '';break
 | ||
|       }
 | ||
|       break;
 | ||
|     default :break;
 | ||
|   }
 | ||
|   promptAction.showToast({
 | ||
|     message: decodeURIComponent(toast),
 | ||
|     duration: 4000
 | ||
|   });
 | ||
| }
 | ||
| 
 | ||
| // 获取plc数据
 | ||
| export const plcStrToJson = async (plc:string) =>{
 | ||
| 
 | ||
|   const p = plc.split(',').map((val,key)=>{
 | ||
|     if(key !== 27 && key !== 92){
 | ||
|       //@ts-ignore
 | ||
|       return val*1
 | ||
|     }else{
 | ||
|       return val
 | ||
|     }
 | ||
|   });
 | ||
|   let data:any = testRealExam;
 | ||
|   const time = await systemTime.getCurrentTime()
 | ||
|   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],
 | ||
|       //@ts-ignore 方向盘
 | ||
|       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,
 | ||
|       //TODO 数据待替换 油压  闪灯 信号灯
 | ||
|       yy:0,  sde:0, xhd:'',rmndg:0, wav:0 , mndg:''
 | ||
|     },
 | ||
|     gps:{
 | ||
|       //办卡类型    定位差分状态
 | ||
|       bklx:p[56], dwzt:p[83],
 | ||
|       //@ts-ignore 角度差分状态
 | ||
|       jdzt:p[92].split('-')[0]*1,
 | ||
|       //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],
 | ||
|       //@ts-ignore 角度搜星数
 | ||
|       jdsxs:p[92].split('-')[1]*1
 | ||
|     },
 | ||
|     gps2:data.gps,
 | ||
|     vision:data.vision,
 | ||
|     radar:data.radar,
 | ||
|     extend:{}
 | ||
|   }
 | ||
|   return tempData
 | ||
| }
 | ||
| 
 | ||
| export const plcStrToWXJson = async (plc:string) =>{
 | ||
|   const p = plc.split(',').map((val,key)=>{
 | ||
|     if(key !== 27 && key !== 92){
 | ||
|       //@ts-ignore
 | ||
|       return val*1
 | ||
|     }else{
 | ||
|       return val
 | ||
|     }
 | ||
|   });
 | ||
|   const timeStr = p[93] + '' + p[94];
 | ||
|   const gps = {
 | ||
|     //办卡类型    定位差分状态
 | ||
|     bklx:p[56], dwzt:p[83],
 | ||
|     // 经度      纬度       航向角      俯仰角      海拔高       高度差     速度
 | ||
|     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],
 | ||
|   }
 | ||
|   const judgeSignal = [
 | ||
|   // 车门    安全带  熄火    发动机启动 左转向 右转向  前照灯近灯 前照灯远灯
 | ||
|   p[14], p[19],  p[5],  p[6],   p[2],  p[3],  p[7],   p[8],
 | ||
|     // 注车制动 行车制动 离合器 副制动   喇叭   雨刷    危险报警灯 示廓灯 系统未涉及的传感器信号
 | ||
|   p[13],  p[12], p[17], p[18], p[4], p[11],  p[20],  p[9], 0
 | ||
|   ]
 | ||
|   const judgeAnotherSignal = [
 | ||
|   // 低三挡位 左侧单边桥1 左侧单边桥2 右侧单边桥1 右侧单边桥2 雾灯
 | ||
|     '000',    '0',       '0',      '0',      '0',      p[10],
 | ||
|     // 桩杆全无信号  左后绕车 右后绕车 右前绕车 左前绕车
 | ||
|     '000',         '0',   '0',    '0',   '0'
 | ||
|   ]
 | ||
|   const wuXiData = [
 | ||
|   //         卫星时间     精度    纬度     高度      方位角    俯仰角    速度角  速度      横滚  卫星定位状态
 | ||
|     '$KSXT', timeStr,   gps.jd, gps.wd, gps.hbg, gps.hxj, gps.fyj, ''    , gps.sd, '',  gps.dwzt, gps.dwzt,
 | ||
|     //前天线可用星数 后天线可用星数 东向坐标位置 北向位置坐标 天向位置坐标  东向速度 北向速度 天向速度
 | ||
|     '',            '',         '',        '',       '',        '',      '',    '',
 | ||
|     //@ts-ignore 评判信号1 评判信号2 发动机转速
 | ||
|   (judgeSignal.join('')*1).toString(16), (judgeAnotherSignal.join('')*1).toString(16) , p[25],
 | ||
|     '0xFFFFFFF'
 | ||
|   ]
 | ||
|   const wuXiDataStr = wuXiData.join(',')
 | ||
|   return wuXiDataStr
 | ||
| }
 | ||
| 
 | ||
| export const senorToWXDataStr= async (tempData) => {
 | ||
|   const {sensor,gps} = tempData;
 | ||
|   const timeStr = await getTimeStr()
 | ||
| 
 | ||
|   const {mkg,aqd,dh1,dh2, zfxd,  yfxd,  jgd,   ygd,ssc ,  jsc,    lhq,  fsc,   lb,   ygq,wd} = sensor
 | ||
|   const judgeSignal = [
 | ||
|   //车门 安全带  熄火    发动机启动 左转向 右转向  前照灯近灯 前照灯远灯
 | ||
|     mkg,   aqd,  dh1,   dh2,   zfxd,  yfxd,  jgd,   ygd,
 | ||
|     // 注车制动 行车制动 离合器 副制动   喇叭   雨刷    危险报警灯 示廓灯 系统未涉及的传感器信号
 | ||
|     ssc ,  jsc,    lhq,  fsc,   lb,   ygq,  0,  0, 0
 | ||
|   ]
 | ||
| 
 | ||
|   const judgeAnotherSignal = [
 | ||
|   // 低三挡位 左侧单边桥1 左侧单边桥2 右侧单边桥1 右侧单边桥2 雾灯
 | ||
|     '000',    '0',       '0',      '0',      '0',     '0',,'0',
 | ||
|     // 桩杆全无信号  左后绕车 右后绕车 右前绕车 左前绕车
 | ||
|     '000',         '0',   '0',    '0',   '0',   '0','0'
 | ||
|   ]
 | ||
|   //@ts-ignore
 | ||
|   const str1 = (judgeSignal.join('')*1).toString(16);
 | ||
|   //@ts-ignore
 | ||
|   const str2 = (judgeAnotherSignal.join('')*1).toString(16);
 | ||
| 
 | ||
|   const wuXiData = [
 | ||
|   //         卫星时间     精度    纬度     高度      方位角    俯仰角    速度角  速度      横滚  卫星定位状态
 | ||
|     '$KSXT', timeStr,   gps.jd, gps.wd, gps.hbg, gps.hxj, gps.fyj, '0'    , gps.sd, '0',  gps.dwzt,
 | ||
|     //前天线可用星数 后天线可用星数 东向坐标位置 北向位置坐标 天向位置坐标  东向速度 北向速度 天向速度
 | ||
|     '0',            '0',         '0',        '0',       '0',        '0',      '0',    '0','0',
 | ||
|     //@ts-ignore 评判信号1 评判信号2 发动机转速
 | ||
|     // (judgeSignal.join('')*1).toString(16), (judgeAnotherSignal.join('')*1).toString(16) , sensor.fdjzs,
 | ||
|     '0006', '0001' , sensor.fdjzs,
 | ||
|     '0xFFFFFFF'
 | ||
|   ]
 | ||
|   return wuXiData.map(d => (d + '')).join(',');
 | ||
|   // console.log('wuXiData',wuXiData.join(','));
 | ||
| }
 | ||
| 
 | ||
| export const getTimeStr = async () =>{
 | ||
|   const date = await systemTime.getDate()
 | ||
|   const timeStr = '';
 | ||
|   const Y = date.getFullYear();
 | ||
|   const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) ;
 | ||
|   const D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
 | ||
|   const h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours());
 | ||
|   const m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes());
 | ||
|   const s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
 | ||
|   const ss = (date.getMilliseconds() +'').slice(0,2);
 | ||
|   return timeStr + Y + M +D +h +m +s +'.' + ss
 | ||
| }
 | ||
| 
 | ||
| //蓝灯
 | ||
| export function sendBlue(){
 | ||
|   const arrBlue = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00];
 | ||
|   const arrBlueBuffer= Array2Byte(arrBlue).buffer
 | ||
|   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);
 | ||
| }
 | ||
| 
 | ||
| //红灯
 | ||
| export function sendRed(){
 | ||
|   const arrRed= [0x55, 0xaa, 0x01, 0x01, 0x02, 0x00, 0x03, 0x00];
 | ||
|   const arrRedBuffer= Array2Byte(arrRed).buffer
 | ||
|   globalThis.lightLineUdp.send(arrRedBuffer);
 | ||
| }
 | ||
| 
 | ||
| export const defaultJudgeConfigObj = {
 | ||
| //结束考试方式 0-不合格继续 1-考试不合格报靠边停车 2-不合格不报靠边 3-训练不合格报靠边 4-自动退出 5-不合格自动退出
 | ||
|   302:'5',
 | ||
|   332:'',
 | ||
| //是否能进行人工操作 0-不能人工评判 1-不能人工进项目 3-都不能
 | ||
|   342:'',
 | ||
| //有项目未结束时可以靠边停车 0-否 1-是
 | ||
|   343:'1',
 | ||
| //考试未结束且有扣分,是否可以退出
 | ||
|   344:'0',
 | ||
| //直线行驶中是否可以进其它项目 0-否 1-是
 | ||
|   348:'0',
 | ||
| //车上是否能点结束考试 0:否 1:是
 | ||
|   353:'0',
 | ||
| //是否启动断电续考    0:否 1:是
 | ||
|   369:'1',
 | ||
| //是否显示应考里程
 | ||
|   375:'0',
 | ||
| //里程不够允许手工点靠边停车
 | ||
|   387:'0',
 | ||
| //监管模式有扣分续考(0-否++1-是+把上次未考完的扣分带下来重新考试)
 | ||
|   432:'1'
 | ||
| } |