文件添加
This commit is contained in:
		
							parent
							
								
									0c09d24fea
								
							
						
					
					
						commit
						5770833621
					
				
							
								
								
									
										117
									
								
								entry/src/main/ets/pages/judgeSDK/utils/fileLog.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								entry/src/main/ets/pages/judgeSDK/utils/fileLog.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | |||||||
|  | import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl' | ||||||
|  | import promptAction from '@ohos.promptAction' | ||||||
|  | import fileAccess from '@ohos.file.fileAccess' | ||||||
|  | import common from '@ohos.app.ability.common' | ||||||
|  | import Want from '@ohos.app.ability.Want' | ||||||
|  | import fs from '@ohos.file.fs' | ||||||
|  | import FileUtil from '../../../common/utils/File' | ||||||
|  | import {getCurrentTime} from '../../../common/utils/tools' | ||||||
|  | 
 | ||||||
|  | interface StuInfo{ | ||||||
|  |   name:string | ||||||
|  |   lsh:string | ||||||
|  |   idCard:string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const LOGTAG = 'LOGTAG' | ||||||
|  | export default class FileLog { | ||||||
|  | 
 | ||||||
|  |   //后续文件路径待替换
 | ||||||
|  |   private fileUtil: FileUtil | ||||||
|  |   private stuInfo: StuInfo | ||||||
|  |   public folderPath: string | ||||||
|  | 
 | ||||||
|  |   constructor(context) { | ||||||
|  |     const fileUtil = new FileUtil(context) | ||||||
|  |     this.fileUtil = fileUtil | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 设置文件夹
 | ||||||
|  |   public initFileLogo = async (stuInfo:StuInfo) => { | ||||||
|  |     const {fileUtil,setExamLineData} = this | ||||||
|  |     const {name,lsh,idCard} = stuInfo; | ||||||
|  |     this.stuInfo = stuInfo; | ||||||
|  |     const time = await getCurrentTime() | ||||||
|  |     const date = time.split(' ')[0].split('-').join('_') | ||||||
|  |     const hourTime = time.split(' ')[1].split(':').join('_') | ||||||
|  |     const folderPath = await fileUtil.initFolder(`/logs/${date}/${lsh}_${idCard}_${name}_${date}_${hourTime}`); | ||||||
|  |     this.folderPath = folderPath; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 过程文件数据
 | ||||||
|  |   public setExamProgressData = async (str:Object) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/exam_progress_data.txt`,JSON.stringify(str)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 无锡所接口数据
 | ||||||
|  |   public setExamJudgeWuxiData = async (str) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/wuxi_exam_data.txt`,str); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 无锡所过程数据
 | ||||||
|  |   public setExamJudgeWuxiProgressData = async (str)=>{ | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/wuxi_progress_data.txt`,str); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // plc文件数据
 | ||||||
|  |   public setPlcProgressData = async (str:Object) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/plc_data.txt`,JSON.stringify(str)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 过程评判json数据
 | ||||||
|  |   public setExamJudgeData = async (str:Object) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/judge_exam_data.txt`,JSON.stringify(str)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 过程评判回调数据
 | ||||||
|  |   public setExamJudgeCallbackData = async (str:string) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/judge_progress_callback_data.txt`,str); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 过程评判日志调数据
 | ||||||
|  |   public setExamJudgeLogData = async (str:string) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/judge_log_data.txt`,str); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 无锡所轨迹数据
 | ||||||
|  |   public setExamLineData = async (plcStr) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     const plcData = plcStr.split(','); | ||||||
|  |     const time = await getCurrentTime(); | ||||||
|  | 
 | ||||||
|  |     const lineData = [ | ||||||
|  |     /*帧头*/ time, | ||||||
|  |       /*卫星时间*/time, | ||||||
|  |       /*经度*/ plcData[95], | ||||||
|  |       /*纬度*/ plcData[95], | ||||||
|  |       /*高度*/ plcData[86], | ||||||
|  |       /*方位角*/ 0, | ||||||
|  |       /*俯仰角*/ plcData[91], | ||||||
|  |       /*速度角*/'', | ||||||
|  |       /*速度*/  plcData[97], | ||||||
|  |       /*横滚*/'', | ||||||
|  |       /*卫星定位状态*/'', | ||||||
|  |       /*卫星定向状态*/'', | ||||||
|  |       /*前天线可用星数*/'', | ||||||
|  |       /*后天线可用星数*/'', | ||||||
|  |       /*东向位置坐标*/'', | ||||||
|  |       /*北向位置坐标*/'', | ||||||
|  |       /*天向位置坐标*/'', | ||||||
|  |       /*东向速度*/'', | ||||||
|  |       /*北向速度*/'', | ||||||
|  |       /*评判信号1*/[plcData[14],plcData[19],plcData[5],'',plcData[2],plcData[3],plcData[7],plcData[8],plcData[13],plcData[12],plcData[17],'',plcData[4],plcData[11],plcData[20],plcData[9],0].join(','), | ||||||
|  |       /*评判信号2*/['',plcData[28],'','',plcData[10],'','','','','','','','','','','','',''].join(','), | ||||||
|  |       /*发动机转速*/ plcData[25], | ||||||
|  |       /*结束符*/ time, | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     await fileUtil.editFile(`${folderPath}/exam_wuxi_data.txt`,JSON.stringify(lineData)); | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | import FileUtil from '../../../common/utils/File' | ||||||
|  | import zlib from '@ohos.zlib'; | ||||||
|  | export default class FileModel{ | ||||||
|  | 
 | ||||||
|  |   //后续文件路径待替换
 | ||||||
|  |   private fileUtil: FileUtil | ||||||
|  |   public folderPath: string | ||||||
|  | 
 | ||||||
|  |   constructor(context){ | ||||||
|  |     (async ()=>{ | ||||||
|  |       const fileUtil = new FileUtil(context) | ||||||
|  |       this.fileUtil = fileUtil | ||||||
|  |     })() | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 设置文件夹
 | ||||||
|  |   public initFolder = async () => { | ||||||
|  |     const {fileUtil} = this | ||||||
|  |     await fileUtil.initFolder(`/models/model_enc`); | ||||||
|  |     const folderPath =  await fileUtil.initFolder(`/models`); | ||||||
|  |     this.folderPath = folderPath; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 存储zip文件并解压
 | ||||||
|  |   public storingFiles = async (str) => { | ||||||
|  |     const {fileUtil,folderPath} = this; | ||||||
|  |     await fileUtil.editFile(`${folderPath}/model.zip`,str,'overWrite') | ||||||
|  | 
 | ||||||
|  |     let options = { | ||||||
|  |       level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION, | ||||||
|  |       memLevel: zlib.MemLevel.MEM_LEVEL_DEFAULT, | ||||||
|  |       strategy: zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     zlib.unzipFile( | ||||||
|  |       `${folderPath}/model.zip`, | ||||||
|  |       `${folderPath}`, | ||||||
|  |       options).then((data) => { | ||||||
|  |       console.log("unzipFile result:" + data); | ||||||
|  |     }).catch((err)=>{ | ||||||
|  |       console.log("catch((err)=>" + err); | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //获取文件内容
 | ||||||
|  |   public getModelContent = (folderPath,fileName) => { | ||||||
|  |     const {fileUtil} = this; | ||||||
|  |     const content = fileUtil.getFileContent(`${folderPath}/${fileName}`) | ||||||
|  |     return content; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										71
									
								
								entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | |||||||
|  | import mediaLibrary from '@ohos.multimedia.mediaLibrary' | ||||||
|  | import onvifclient from '@ohos.onvifclient'; | ||||||
|  | import fs from '@ohos.file.fs' | ||||||
|  | import util from '@ohos.util'; | ||||||
|  | import FileUtil from '../../../common/utils/File' | ||||||
|  | 
 | ||||||
|  | interface Params{ | ||||||
|  |   userName:string | ||||||
|  |   pwd:string | ||||||
|  |   ip:string | ||||||
|  |   port:string | ||||||
|  |   rlls:string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default class FilePhoto{ | ||||||
|  | 
 | ||||||
|  |   private params:Params | ||||||
|  |   private context:any | ||||||
|  |   private fileUtil:FileUtil | ||||||
|  |   public mediaTest | ||||||
|  | 
 | ||||||
|  |   constructor(context) { | ||||||
|  |     (async ()=>{ | ||||||
|  |       const fileUtil = new FileUtil(context) | ||||||
|  |       const strConfig = await fileUtil.readFile('/mnt/hmdfs/100/account/device_view/local/files/logs/config/config3.txt'); | ||||||
|  |       const config = JSON.parse(strConfig) | ||||||
|  |       const  {userName,ip,pwd,port,rlls} = config | ||||||
|  |       this.params = {userName,pwd,ip,port,rlls} | ||||||
|  |       this.context = context | ||||||
|  |       this.fileUtil = fileUtil | ||||||
|  |     })() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public async getPhoto(){ | ||||||
|  |     const {params,context,fileUtil} = this; | ||||||
|  |     const {userName,pwd,ip,port,rlls} = params; | ||||||
|  |     const mediaTest = mediaLibrary.getMediaLibrary(context); | ||||||
|  |     let mediaType = mediaLibrary.MediaType.IMAGE; | ||||||
|  |     let DIR_DOCUMENTS = mediaLibrary.DirectoryType.DIR_IMAGE; | ||||||
|  |     const path = await mediaTest.getPublicDirectory(DIR_DOCUMENTS); | ||||||
|  | 
 | ||||||
|  |     return new Promise(async (resolve)=>{ | ||||||
|  |       mediaTest.createAsset(mediaType, 'judge_face.jpg', path,(error,asset)=>{ | ||||||
|  |         asset.open('rw', (error, fd) => { | ||||||
|  |           if (fd > 0) { | ||||||
|  |             const file_path = "/mnt/hmdfs/100/account/device_view/local/files/Pictures/judge_face.jpg" | ||||||
|  |             const result3 = onvifclient.getVideoSnapshot(`rtsp://${userName}:${pwd}@${ip}:${port}/h264/ch${rlls}/main/av_stream`,file_path,fd); | ||||||
|  |             fs.closeSync(fd); | ||||||
|  |             asset.close(fd); | ||||||
|  |             fs.lstat(file_path).then((stat) => { | ||||||
|  |               console.info("get link status succeed, the size of file is" + stat.size); | ||||||
|  |               let file = fs.openSync(file_path, fs.OpenMode.READ_WRITE); | ||||||
|  |               const size=Number(stat.size)+100 | ||||||
|  |               let buf = new ArrayBuffer(size); | ||||||
|  |               let num = fs.readSync(file.fd, buf); | ||||||
|  |               const that = new util.Base64(); | ||||||
|  |               const array = new Uint8Array(buf); | ||||||
|  |               const result = that.encodeToStringSync(array);//base64圖片
 | ||||||
|  |               fileUtil.deleteF(file_path,3) | ||||||
|  |               resolve(result) | ||||||
|  |             }).catch((err) => { | ||||||
|  |               console.info("get link status failed with error message: " + err.message + ", error code: " + err.code); | ||||||
|  |             }); | ||||||
|  |           } else { | ||||||
|  |             console.error('baoyihu getVideoSnapshot File Open failed with error: ' + error); | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										397
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,397 @@ | |||||||
|  | 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] || 0, | ||||||
|  |       //@ts-ignore 角度搜星数
 | ||||||
|  |       jdsxs:p[92].split('-')[1]*1 || 0 | ||||||
|  |     }, | ||||||
|  |     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' | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //考试回放开关
 | ||||||
|  | export const judgeConfig = { | ||||||
|  |   //本地目录开关
 | ||||||
|  |   isTrajectoryOpen: false, | ||||||
|  |   //是否开启Udp
 | ||||||
|  |   udpOpen:false, | ||||||
|  |   // 本地模型地址
 | ||||||
|  |   modelPath: 'models/model_enc', | ||||||
|  |   // 轨迹回放地址
 | ||||||
|  |   trajectoryPath: 'logs/2024_07_06/0000000000001_342323199501470011_测试学员1_2024_07_06_16_22_35/judge_exam_data.txt', | ||||||
|  |   //TODO 济南临时特殊配置
 | ||||||
|  |   systemParamConfig:{ | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | import { | ||||||
|  |   examJudgeMapSetParam, | ||||||
|  |   examJudgeMapSetScaling | ||||||
|  | } from '../api/index' | ||||||
|  | import systemTime from '@ohos.systemDateTime'; | ||||||
|  | 
 | ||||||
|  | import FileUtil from '../../../common/utils/File' | ||||||
|  | import FileModel from './fileModel' | ||||||
|  | import {testRealExam} from '../dataTest/index' | ||||||
|  | 
 | ||||||
|  | const judgeTag = 'SURENJUN_JUDGE' | ||||||
|  | 
 | ||||||
|  | export default class JudgeImg { | ||||||
|  | 
 | ||||||
|  |   private judgeUI | ||||||
|  |   private modelPath:string | ||||||
|  |   private fileModel:FileModel | ||||||
|  |   private fileUtil:FileUtil | ||||||
|  |   private plcData:any | ||||||
|  | 
 | ||||||
|  |   constructor(judgeUI) { | ||||||
|  |     this.modelPath = 'models/model_enc' | ||||||
|  |     this.judgeUI = judgeUI | ||||||
|  |     this.fileUtil = new FileUtil(judgeUI.context) | ||||||
|  |     this.fileModel = new FileModel(judgeUI.context) | ||||||
|  |     this.init() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async init(){ | ||||||
|  |     const isJudgeInitBool = globalThis.isJudgeInitBool; | ||||||
|  |     const {judgeUI} = this; | ||||||
|  | 
 | ||||||
|  |     //TODO 临时处理
 | ||||||
|  |     setTimeout(async ()=>{ | ||||||
|  |       console.info(judgeTag,'1.进入评判入口') | ||||||
|  |       await examJudgeMapSetParam(640, 480); //设置参数宽、高
 | ||||||
|  |       await examJudgeMapSetScaling(120); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0
 | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     judgeUI.draw = true | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //获取评判初始化数据
 | ||||||
|  |   getInitInfo = () =>{ | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | import Prompt from '@system.prompt' | ||||||
|  | 
 | ||||||
|  | const TAG = 'SURENJUN_JUDGE' | ||||||
|  | 
 | ||||||
|  | export default class JudgeTask{ | ||||||
|  |   private queue = [] | ||||||
|  |   private status:string | ||||||
|  |   constructor() { | ||||||
|  |     this.queue = [] | ||||||
|  |     this.status = 'end' | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   executeQueue = async ()=>{ | ||||||
|  |     const {queue,executeQueue} = this | ||||||
|  |     if(queue.length){ | ||||||
|  |       for (const currentTask of queue) { | ||||||
|  |         const {status} = this | ||||||
|  |         try { | ||||||
|  |           await currentTask(); | ||||||
|  |         }catch (e){ | ||||||
|  |           // console.info(TAG,'过程数据接口解析错误')
 | ||||||
|  |           Prompt.showToast({ | ||||||
|  |             message: '过程数据接口解析错误', | ||||||
|  |             duration: 3000 | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  |         this.queue.shift() | ||||||
|  |         await executeQueue() | ||||||
|  |       } | ||||||
|  |     }else{ | ||||||
|  |       this.status = 'end' | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   addTask = async (fn) =>{ | ||||||
|  |     this.queue.push(fn); | ||||||
|  |     if(this.status == 'end' && this.queue.length === 1){ | ||||||
|  |       await this.executeQueue(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										150
									
								
								entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | |||||||
|  | import media from '@ohos.multimedia.media'; | ||||||
|  | import Prompt from '@system.prompt'; | ||||||
|  | 
 | ||||||
|  | const TAG = 'VoiceAnnounce' | ||||||
|  | 
 | ||||||
|  | export default class VoiceAnnounce{ | ||||||
|  | 
 | ||||||
|  |   //队列时候立马终止
 | ||||||
|  |   private isStopped:Boolean | ||||||
|  |   private queue:String[] | ||||||
|  |   private newQueue:String[] | ||||||
|  |   private pendingQueue:String[] | ||||||
|  |   private callback:Function; | ||||||
|  |   constructor() { | ||||||
|  |     this.isStopped = false; | ||||||
|  |     this.queue = [] | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async playAudio(urls:string[],shit?:boolean,callback?:Function){ | ||||||
|  |     const {isStopped,queue} = this; | ||||||
|  |     this.callback = callback | ||||||
|  |     if(shit){ | ||||||
|  |       //队列清空,重新初始化
 | ||||||
|  |       this.isStopped = true; | ||||||
|  |       this.newQueue = urls | ||||||
|  |     } | ||||||
|  |     if(queue.length){ | ||||||
|  |       //队列续上
 | ||||||
|  |       this.queue = this.queue.concat(urls); | ||||||
|  | 
 | ||||||
|  |     }else{ | ||||||
|  |       this.queue = urls | ||||||
|  |       await this.executeQueue() | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async executeQueue(){ | ||||||
|  |     const avPlayer = new AVPlayer(); | ||||||
|  |     const go = async () => { | ||||||
|  |       const {queue,callback,isStopped,newQueue} = this; | ||||||
|  |       if(isStopped){ | ||||||
|  |         //清空原来队列
 | ||||||
|  |         this.queue = newQueue | ||||||
|  |         this.isStopped = false; | ||||||
|  |         await go() | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       await avPlayer.play(queue[0],callback); | ||||||
|  |       this.queue.shift(); | ||||||
|  |       console.info(TAG,JSON.stringify(this.queue),'堆栈弹出'); | ||||||
|  |       if(this.queue.length){ | ||||||
|  |         await go() | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     await go() | ||||||
|  |     avPlayer.avPlayerStop(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AVPlayer { | ||||||
|  | 
 | ||||||
|  |   public avPlayer:any = null; | ||||||
|  | 
 | ||||||
|  |   private voiceUrl: string[]; | ||||||
|  |   private voiceStatus: 'completed' | 'playing' | ||||||
|  |   private endCallback:Function | ||||||
|  |   constructor() {} | ||||||
|  | 
 | ||||||
|  |   // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例
 | ||||||
|  |   async play(name,callback) { | ||||||
|  |     this.endCallback = callback | ||||||
|  |     const avPlayer = await media.createAVPlayer(); | ||||||
|  |     this.avPlayer = avPlayer; | ||||||
|  |     return new Promise(async (resolve,reject) => { | ||||||
|  |       let url = '' | ||||||
|  |       await this.setAVPlayerCallback(()=>{ | ||||||
|  |         //@ts-ignore
 | ||||||
|  |         resolve() | ||||||
|  |       }); | ||||||
|  |       try { | ||||||
|  |          url =  await globalThis.context.resourceManager.getRawFd(name); | ||||||
|  |          this.avPlayer.fdSrc = url; | ||||||
|  |       } catch  (e) { | ||||||
|  |         Prompt.showToast({ | ||||||
|  |           message: `${name}语音文件不存在`, | ||||||
|  |           duration: 4000 | ||||||
|  |         }); | ||||||
|  |         resolve(1) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   //音频播放队列
 | ||||||
|  |   public releasePlayer() { | ||||||
|  |     this.avPlayer.release(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   avPlayerStop() { | ||||||
|  |     this.avPlayer && this.avPlayer.stop() | ||||||
|  |     this.avPlayer && this.avPlayer.reset() | ||||||
|  |     this.avPlayer && this.avPlayer.release() | ||||||
|  |   } | ||||||
|  |   // 注册avplayer回调函数
 | ||||||
|  |   setAVPlayerCallback(callBack) { | ||||||
|  | 
 | ||||||
|  |     this.avPlayer.on('error', (err) => { | ||||||
|  |       this.avPlayer && this.avPlayer.stop() | ||||||
|  |       this.avPlayer && this.avPlayer.reset() | ||||||
|  |       this.avPlayer && this.avPlayer.release() | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     let num = 0; | ||||||
|  |     // 状态机变化回调函数
 | ||||||
|  |     this.avPlayer.on('stateChange', async (state, reason) => { | ||||||
|  |       const {endCallback} = this; | ||||||
|  |       switch (state) { | ||||||
|  |         case 'idle': // 成功调用reset接口后触发该状态机上报
 | ||||||
|  |           break; | ||||||
|  |         case 'initialized': // avplayer 设置播放源后触发该状态上报
 | ||||||
|  |           this.avPlayer.prepare() | ||||||
|  |           break; | ||||||
|  |         case 'prepared': // prepare调用成功后上报该状态机
 | ||||||
|  |           this.avPlayer.play(); | ||||||
|  |           this.voiceStatus = 'playing' | ||||||
|  |           break; | ||||||
|  |         case 'playing': // play成功调用后触发该状态机上报
 | ||||||
|  |           break; | ||||||
|  |         case 'paused': // pause成功调用后触发该状态机上报
 | ||||||
|  |           break; | ||||||
|  |         case 'completed': // 播放结束后触发该状态机上报
 | ||||||
|  |           this.voiceStatus = 'completed' | ||||||
|  |           this.avPlayer.stop(); //调用播放结束接口
 | ||||||
|  |           if(endCallback){ | ||||||
|  |             endCallback() | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case 'stopped': // stop接口成功调用后触发该状态机上报
 | ||||||
|  |           this.avPlayer.reset(); // 调用reset接口初始化avplayer状态
 | ||||||
|  |           callBack() | ||||||
|  |           break; | ||||||
|  |         case 'released': | ||||||
|  |           break; | ||||||
|  |         default: | ||||||
|  |           break; | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user