Compare commits

...

6 Commits

Author SHA1 Message Date
wangzhongjie
beb6ba1b60 fix: 优化信号显示界面 2025-08-28 17:25:13 +08:00
wangzhongjie
2321052cc1 fix: 优化代码 2025-08-26 17:28:30 +08:00
wangzhongjie
19d409cf54 fix: 完善型号显示界面放大字体 2025-08-26 14:59:28 +08:00
wangzhongjie
7e7900a124 fix: 过程数据问题 2025-08-22 18:00:49 +08:00
wangzhongjie
d64d951f1e fix: 修改调试模式重启app问题 2025-08-22 10:11:02 +08:00
wangzhongjie
e6a75028c5 fix: 网络摄像头 2025-08-21 15:02:16 +08:00
14 changed files with 379 additions and 263 deletions

View File

@ -145,4 +145,5 @@ export async function initCarParameter(params: object) {
method: http.RequestMethod.POST,
xml: false,
})
}
}

View File

@ -0,0 +1,94 @@
import http from '@ohos.net.http';
import buffer from '@ohos.buffer';
import image from '@ohos.multimedia.image';
const TAG = 'CameraService';
export async function ObtainNetworkCameraImages(): Promise<string | null> {
const url = "http://192.168.1.125/snapshot.cgi?stream=1&username=admin&password=123456";
let httpRequest = http.createHttp();
try {
console.info(TAG, 'Starting image request...');
const response = await httpRequest.request(url, {
method: http.RequestMethod.GET,
connectTimeout: 10000,
readTimeout: 10000,
expectDataType: http.HttpDataType.ARRAY_BUFFER,
});
if (response.responseCode === 200) {
let arrayBuffer = response.result as ArrayBuffer;
// 裁剪左半部分
const croppedBase64 = await cropLeftHalf(arrayBuffer);
return croppedBase64;
} else {
console.error(TAG, `HTTP Error: ${response.responseCode}`);
return null;
}
} catch (error) {
console.error(TAG, 'An error occurred while fetching the image.', JSON.stringify(error));
return null;
} finally {
httpRequest.destroy();
}
}
async function cropLeftHalf(arrayBuffer: ArrayBuffer): Promise<string> {
let imageSource: image.ImageSource | null = null;
let pixelMap: image.PixelMap | null = null;
try {
// 1. 创建ImageSource
imageSource = image.createImageSource(arrayBuffer);
// 2. 获取图片信息
const imageInfo = await imageSource.getImageInfo();
console.info(TAG, `Original image size: ${imageInfo.size.width}x${imageInfo.size.height}`);
// 3. 计算并定义左半部分的裁剪区域
const leftHalfWidth = Math.floor(imageInfo.size.width / 2);
const cropRegion: image.Region = {
size: {
width: leftHalfWidth,
height: imageInfo.size.height
},
x: 0,
y: 0
};
// 创建解码选项,并将裁剪区域放入其中
const decodingOptions: image.DecodingOptions = {
desiredRegion: cropRegion
};
// 4. 创建像素映射并进行裁剪
pixelMap = await imageSource.createPixelMap(decodingOptions);
// 5. 将裁剪后的PixelMap转换为ArrayBuffer
const imagePacker = image.createImagePacker();
const packedData = await imagePacker.packing(pixelMap, {
format: "image/jpeg",
quality: 90
});
// 6. 转换为Base64
const buf = buffer.from(packedData);
const base64 = buf.toString('base64');
const result = `data:image/jpeg;base64,${base64}`;
console.info(TAG, `Left half cropped successfully. Size: ${leftHalfWidth}x${imageInfo.size.height}`);
return result;
} catch (error) {
console.error(TAG, 'Image cropping failed:', JSON.stringify(error));
return "";
} finally {
// 7. 在 finally 块中安全地释放资源
imageSource?.release();
pixelMap?.release();
}
}

View File

@ -26,7 +26,7 @@ export const JudgeConfig: JudgeConfigType = {
// 本地模型地址
modelPath: 'models/model_enc',
// 济南科目三
trajectoryPath: 'logs/2024_10_12/2024_10_12_11_50_10_9999427676823_744299437502336256_隋统/judge_exam_data.txt',
trajectoryPath: 'logs/2025_08_22/2025_08_22_17_09_49_9999245520855_654211778346526080_杜兰曼/judge_exam_data.txt',
//四合一画面配置
fourInOneScreen: {
//gps位数

View File

@ -169,6 +169,8 @@ export interface EnvironmentConfigurationType {
version?: string
// 评判版本
judgeVersion?: string
// 是否使用网络摄像头
isUseNetworkCamera?: string
}
//全局配置

View File

@ -19,6 +19,7 @@ import Prompt from '@system.prompt';
import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker';
import { dConsole } from '../utils/LogWorker';
import CarLoadingComponent from './Index/Loading';
import { ObtainNetworkCameraImages } from '../api/networkCamera';
@Entry
@Component
@ -40,6 +41,7 @@ struct Index {
@State isPlay: boolean = false;
@State initWork: boolean = false
@State status: string = "开始"
@State base64Img: string = ""
// 请求网络表等待弹窗
customDialogController: CustomDialogController = new CustomDialogController({
builder: CarLoadingComponent(),
@ -62,6 +64,7 @@ struct Index {
async aboutToAppear() {
dConsole.log("权限首页 aboutToAppear")
this.base64Img = await ObtainNetworkCameraImages() || ""
this.ratio = AppStorage.get<BaseInfoType>('baseInfo')?.ratio || 1.4
this.angle = 0
AppStorage.set('lsh', '1111111111111')
@ -217,7 +220,7 @@ struct Index {
HeaderComponent({
shortLogo: false
})
CardComponent({
isSingle: this.singlePlay,
singleClick: () => {

View File

@ -37,20 +37,21 @@ export default struct SignalTrajectoryDialog {
})
}
Scroll() {
Column() {
if (this.active !== 2) {
SignalDisplayComponent({
active: this.active,
})
} else {
TrajectoryViewComponent({
laneSignal: this.laneSignal
})
}
// Scroll() {
Column() {
if (this.active !== 2) {
SignalDisplayComponent({
active: this.active,
heightNum: 1500
})
} else {
TrajectoryViewComponent({
laneSignal: this.laneSignal
})
}
}.height(890)
}.width("100%")
}.height(890)
// }.width("100%")
.height(700)
}.width(1500)

View File

@ -6,11 +6,9 @@ import {
DefaultJudgeConfigObj,
ExtendType,
Gps,
JudgeSound,
LANE,
MarkRule,
PLCType,
ProcessDataEnumType,
ProjectInfo,
ProjectInfos,
ProjectRoads,
@ -21,7 +19,6 @@ import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common';
import dayTs from '../../utils/Date';
import { dConsole } from '../../utils/LogWorker';
import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements';
import { examJudgeSoundEnd } from './JudgeSDKUtils';
// 中心信号转换
@ -863,23 +860,23 @@ export const CurrentProjectConversion = (code: number, projectsObj: object): str
* @param sound - 评判音频对象
* @param avPlayer - 语音播放器实例
*/
export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) {
if (sound.type == 1) {
avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => {
examJudgeSoundEnd({
xmdm: sound.xmdm, code: sound.code[0], type: sound.type
});
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({
method: 'examJudgeSoundEnd',
itemno: sound.xmdm,
code: sound.code[0],
type: sound.type,
}));
});
} else {
avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]);
}
}
// export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) {
// if (sound.type == 1) {
// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => {
// examJudgeSoundEnd({
// xmdm: sound.xmdm, code: sound.code[0], type: sound.type
// });
// dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({
// method: 'examJudgeSoundEnd',
// itemno: sound.xmdm,
// code: sound.code[0],
// type: sound.type,
// }));
// });
// } else {
// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]);
// }
// }
/**
* 检查差分

View File

@ -7,14 +7,15 @@ import ethernet from '@ohos.net.ethernet';
import { BusinessError } from '@ohos.base';
import Prompt from '@system.prompt';
import { dConsole } from '../utils/LogWorker';
import window from '@ohos.window';
@Entry
@Component
struct TerminalInfoPage {
@State config: EnvironmentConfigurationType = {}
@State isProcessing: boolean = false;
private fileUtil!: FileUtils
private context = getContext(this) as common.UIAbilityContext;
@State isProcessing: boolean = false;
async aboutToAppear() {
this.fileUtil = new FileUtils(this.context)
@ -186,6 +187,14 @@ struct TerminalInfoPage {
this.config.isOpenFiniteDifference = value;
}
})
blockComponent({
label: "开启网络摄像头",
type: 7,
value: this.config.isUseNetworkCamera,
change: (value: string) => {
this.config.isUseNetworkCamera = value;
}
})
blockComponent({
label: "是否开启日志",
type: 2,
@ -203,15 +212,20 @@ struct TerminalInfoPage {
}
})
blockComponent({
label: "开启调试(重启APP)",
label: "开启调试",
type: 6,
value: this.config.isOpenDebugger,
change: (value: string) => {
change: async (value: string) => {
this.config.isOpenDebugger = value;
const win = await window.getLastWindow(this.context);
if (value === "1") {
win.setWindowSystemBarEnable(['status', 'navigation'])
} else {
win.setWindowSystemBarEnable([])
}
}
})
}.margin(20)
}
.height(650)
.width("100%")
@ -222,7 +236,6 @@ struct TerminalInfoPage {
top: 10
})
Row() {
Image($r('app.media.bc')).height(80).objectFit(ImageFit.Contain).onClick(() => {
if (this.isProcessing) {
@ -396,7 +409,7 @@ struct blockComponent {
})
} else {
ForEach(this.type === 1 ? this.rearMachineModelList :
this.type === 2 || this.type === 5 || this.type === 6 ? this.logList :
this.type === 2 || this.type === 5 || this.type === 6 || this.type === 7 ? this.logList :
this.type === 3 ? this.boardList : this.carTypeList, (item: CommonListType, index) => {
Radio({ value: item.label, group: 'terRadioGroup' + this.type })
.borderColor('#E5CBA1')

View File

@ -2,19 +2,19 @@
export default struct BlockComponent {
@State label: string = "发送次数"
@Prop value: string = "1"
@State widthNum: number = 130
@State widthNum: number = 150
@State heightNum: number = 70
@State color: string = "#FDF5E7"
build() {
Row() {
Row() {
Text(this.label + ":").fontColor(this.color).fontSize(14)
Text(this.label + ":").fontColor(this.color).fontSize(20)
}.width(this.widthNum).justifyContent(FlexAlign.End)
Row() {
Text(this.value).fontColor(this.color)
}.width(80).justifyContent(FlexAlign.Start).margin({
Text(this.value).fontColor(this.color).fontSize(24)
}.width(150).justifyContent(FlexAlign.Start).margin({
left: 20
})
}

View File

@ -10,11 +10,13 @@ export default struct CoordinateComponent {
build() {
Flex({
direction: FlexDirection.Column,
alignItems: ItemAlign.Center
alignItems: ItemAlign.Center,
justifyContent: FlexAlign.Center
}) {
Text("GPS坐标").fontColor("#FFB433").fontSize(20).margin({
top: 10
})
Row() {
Text("GPS坐标").fontColor("#FFB433").fontSize(20)
}.height(70)
Flex({
wrap: FlexWrap.Wrap,
direction: this.isItHorizontal ? FlexDirection.Row : FlexDirection.Column
@ -30,7 +32,10 @@ export default struct CoordinateComponent {
}.width("100%")
}
.width("100%")
.height(this.isItHorizontal ? 210 : "100%")
.height(this.isItHorizontal ? 280 : "100%")
.backgroundColor("#1A1A1A")
.margin({
bottom: 20
})
}
}

View File

@ -20,6 +20,7 @@ export default struct SignalDisplayComponent {
@Prop active: number = 0
// 原始数据
@State rawData: string = "$GPS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
@State heightNum: number = 1200
aboutToAppear(): void {
DifferentialAndSignal.onMsg(this.getMsg)
@ -47,7 +48,6 @@ export default struct SignalDisplayComponent {
for (let i = 0; i <= 12; i++) {
this.vehicleSignal[i].value = this.signArr[i+2]
}
this.vehicleSignal[13].value = this.signArr[17]
this.vehicleSignal[14].value = this.signArr[18]
this.vehicleSignal[15].value = this.signArr[19]
@ -85,11 +85,12 @@ export default struct SignalDisplayComponent {
this.signArr[93] = str2 + str1 + str0
}
this.GPSColum[10].value = this.signArr[93]
// this.signArr[53]=192.168.7.170'
this.vehicleSignal = JSON.parse(JSON.stringify((this.vehicleSignal)))
this.signArr = JSON.parse(JSON.stringify((this.signArr)))
this.GPSColum = JSON.parse(JSON.stringify((this.GPSColum)))
// this.vehicleSignal = this.vehicleSignal.slice()
// this.signArr = this.signArr.slice()
// this.GPSColum = this.GPSColum.slice()
}
build() {
@ -97,26 +98,28 @@ export default struct SignalDisplayComponent {
Flex({
direction: FlexDirection.Column,
}) {
// 信号查看
if (this.active === 0) {
// GPS信号展示
GPSComponent({
data: this.signArr
})
// 车载信号以及车载坐标
CarComponent({
data: this.vehicleSignal
})
CoordinateComponent({
data: this.GPSColum
})
} else if (this.active === 1) {
// 原始数据
Column() {
Text(this.rawData).fontSize(20).fontColor("#fff")
}.backgroundColor("#282828").width("100%").height("100%")
}
Scroll() {
// 信号查看
if (this.active === 0) {
Column() {
// 车载信号以及车载坐标
CarComponent({
data: this.vehicleSignal,
GPSData: this.signArr
})
CoordinateComponent({
data: this.GPSColum
})
}.height(this.heightNum).padding({
bottom: 20
})
} else if (this.active === 1) {
// 原始数据
Column() {
Text(this.rawData).fontSize(20).fontColor("#fff")
}.backgroundColor("#282828").width("100%").height("100%")
}
}.height("100%").backgroundColor("#1A1A1A")
}
.width("100%")
.height("100%")
@ -129,8 +132,9 @@ export default struct SignalDisplayComponent {
@Component
struct GPSComponent {
@Prop data: Array<string>
struct CarComponent {
@Prop data: Array<SignalDataType>
@Prop GPSData: Array<string>
@State ip: string = ""
aboutToAppear(): void {
@ -147,35 +151,36 @@ struct GPSComponent {
build() {
Flex({
wrap: FlexWrap.Wrap
wrap: FlexWrap.Wrap,
justifyContent: FlexAlign.Center
}) {
BlockComponent({
label: "发送次数",
value: this.data[49] || "-"
value: this.GPSData[49] || "-"
})
BlockComponent({
label: "固件版本",
value: this.data[54] || "-"
value: this.GPSData[54] || "-"
})
BlockComponent({
label: "方向盘类型",
value: this.data[50] || "-"
value: this.GPSData[50] || "-"
})
BlockComponent({
label: "按键数值",
value: this.data[55] || "-"
value: this.GPSData[55] || "-"
})
BlockComponent({
label: "GPS错误次数",
value: this.data[60] || "-"
value: this.GPSData[60] || "-"
})
BlockComponent({
label: "汽车类型",
value: this.data[51] || "-"
value: this.GPSData[51] || "-"
})
BlockComponent({
label: "GPS板卡类型",
value: this.data[56] || "-"
value: this.GPSData[56] || "-"
})
BlockComponent({
label: "本机IP",
@ -183,47 +188,35 @@ struct GPSComponent {
})
BlockComponent({
label: "接口心跳",
value: this.data[52] || "-"
value: this.GPSData[52] || "-"
})
BlockComponent({
label: "GPS板卡软件版本",
value: this.data[57] || "-"
value: this.GPSData[57] || "-"
})
BlockComponent({
label: "改正数次数/改正数大小",
value: this.data[58] || "-"
value: this.GPSData[58] || "-"
})
BlockComponent({
label: "已工作时长/设定工作时长",
value: this.data[61] || "-"
value: this.GPSData[61] || "-"
})
BlockComponent({
label: "GPS数据次数/数据长度",
value: this.data[59] || "-"
value: this.GPSData[59] || "-"
})
BlockComponent({
label: "改正数据长度*数据长度-基准站RTCM改正数类型",
value: this.data[62] || "-"
value: this.GPSData[62] || "-"
})
}.backgroundColor("#282828").width("100%").height(140)
}
}
@Component
struct CarComponent {
@Prop data: Array<SignalDataType>
build() {
Flex({
wrap: FlexWrap.Wrap
}) {
ForEach(this.data, (item: SignalDataType) => {
BlockComponent({
label: item.key,
value: item.value
})
})
}.width("100%").backgroundColor("#282828").height(490)
}.width("100%").backgroundColor("#282828")
}
}

View File

@ -168,48 +168,6 @@ export default class Judge {
private isExamEnd: boolean
// 是否发送udp
private isUdpEnd: boolean = false
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const gpsPart = msg.split("#END$GPS,")[1];
const gpsStatus = gpsPart.split(",")[0];
if (gpsStatus === "4") {
dConsole.log(JudgeTag, "差分状态正常", gpsStatus)
this.judgeUI.isDwztRight = true
} else {
dConsole.log(JudgeTag, "差分状态异常", gpsStatus)
this.judgeUI.isDwztRight = false
}
this.judgeUI.isDwztRight
const plcData = await this.getPlcData(msg);
// 4.过程数据
// await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
//是否手动结束考试
private isManual: boolean = false
//UDP服务序列号
@ -254,60 +212,6 @@ export default class Judge {
dConsole.info(JudgeTag, '过程数据文件上传 end')
}
private judgeTask: JudgeTask
// 检测扣分、结束项目时该项目是否开始
checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => {
if (xmdm == 20) {
return true
}
const judgeUI = this.judgeUI;
const judgeTask = this.judgeTask;
const projectsObj: object = this.judgeUI.projectsObj
const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm)
const isUpload = currentProject.isUpload
//如果项目没有开始
dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload)
if (!isUpload) {
dConsole.info(JudgeTag, '项目补传开始')
//项目开始补传
judgeTask.addTask(async () => {
await this.beginProject(xmdm)
}, {
isDelay: true
})
judgeTask.addTask(async () => {
await this.uploadProgressPhoto(xmdm)
}, {
isDelay: true
})
currentProject.isUpload = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
//扣分补传
if (currentType == 2) {
judgeTask.addTask(async () => {
await this.pointsDedute(xmdm, kf!)
}, {
isDelay: true
})
}
//扣分补传判断是否合格 不合格补传项目结束
if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) {
judgeTask.addTask(async () => {
await this.endProject(xmdm)
}, {
isDelay: true
})
currentProject.isEnd = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
}
judgeTask.addTask(async () => {
this.checkExamIsEnd()
})
return false;
} else {
return true
}
}
private tempData?: PLCType
//实时计算gps经纬度距离
handDistance = async () => {
@ -358,40 +262,47 @@ export default class Judge {
AppStorage.setOrCreate('msgStr', plc)
return tempData
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
let num = 2;
const judgeTimer = setInterval(async () => {
const msgStr = strArr[num];
if (msgStr == '') {
dConsole.info(JudgeTag, '模拟数据考试结束')
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
return
}
const msg: PLCType = JSON.parse(strArr[num]);
num++
// 4.过程数据
this.tempData = msg
// this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3);
this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + '';
this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + ''
this.plcData = msg
// this.judgeUI.isDwztRight = msg.gps.dwzt == 4;
AppStorage.setOrCreate('msgStr', '')
if (msg.method === 'examJudgeArtificialItem') {
this.setJudgeItem(msg.itemno, msg.type)
}
if (msg.method === 'examJudgeArtificialMark') {
this.setJudgeItem(msg.itemno, msg.serial)
}
await examJudgeRealExam(msg)
// const bytes = await this.getMessageHeartbeat();
// bytes && globalThis.judgeUdp.send(bytes)
}, 200)
// TODO 定时器缺失
// globalThis.judgeTimer = judgeTimer;
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const gpsPart = msg.split("#END$GPS,")[1];
const gpsStatus = gpsPart.split(",")[0];
if (gpsStatus === "4") {
dConsole.log(JudgeTag, "差分状态正常", gpsStatus)
this.judgeUI.isDwztRight = true
} else {
dConsole.log(JudgeTag, "差分状态异常", gpsStatus)
this.judgeUI.isDwztRight = false
}
this.judgeUI.isDwztRight
const plcData = await this.getPlcData(msg);
// 4.过程数据
// await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
private isEndTip: boolean = false;
//本地轨迹回放地址
@ -411,6 +322,32 @@ export default class Judge {
const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context);
}
}
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);
dConsole.log(JudgeTag, "wzj", JSON.stringify(temp))
//断网&网络超时次数计算
if (temp.code == 2300007 || temp.code == 2300028) {
this.disConnectNum += 1;
if (this.disConnectNum < 5) {
return await this.sendWriteObjectOut(data, filePath)
}
}
if (this.disConnectNum >= 5) {
dConsole.info('surenjun', '123')
this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!';
this.judgeUI.disConnectErrorOpen = true
}
this.disConnectNum = 0
return temp
}
// 项目开始接口同步
beginProject = async (ksxm: number) => {
const carInfo = AppStorage.get<CarInfoType>('carInfo');
@ -514,32 +451,6 @@ export default class Judge {
UploadRegulatoryCodeConversion('17C54', temp.code || 0)
dConsole.info(JudgeTag, '上传照片 end')
}
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);
dConsole.log(JudgeTag, "wzj", JSON.stringify(temp))
//断网&网络超时次数计算
if (temp.code == 2300007 || temp.code == 2300028) {
this.disConnectNum += 1;
if (this.disConnectNum < 5) {
return await this.sendWriteObjectOut(data, filePath)
}
}
if (this.disConnectNum >= 5) {
dConsole.info('surenjun', '123')
this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!';
this.judgeUI.disConnectErrorOpen = true
}
this.disConnectNum = 0
return temp
}
private videoData?: RecordHandleType
//当前科目二的考试项目
private deductedPopShowTimer: number = 0;
@ -653,6 +564,95 @@ export default class Judge {
}
}
}
// 检测扣分、结束项目时该项目是否开始
checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => {
if (xmdm == 20) {
return true
}
const judgeUI = this.judgeUI;
const judgeTask = this.judgeTask;
const projectsObj: object = this.judgeUI.projectsObj
const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm)
const isUpload = currentProject.isUpload
//如果项目没有开始
dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload)
if (!isUpload) {
dConsole.info(JudgeTag, '项目补传开始')
//项目开始补传
judgeTask.addTask(async () => {
await this.beginProject(xmdm)
}, {
isDelay: true
})
judgeTask.addTask(async () => {
await this.uploadProgressPhoto(xmdm)
}, {
isDelay: true
})
currentProject.isUpload = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
//扣分补传
if (currentType == 2) {
judgeTask.addTask(async () => {
await this.pointsDedute(xmdm, kf!)
}, {
isDelay: true
})
}
//扣分补传判断是否合格 不合格补传项目结束
if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) {
judgeTask.addTask(async () => {
await this.endProject(xmdm)
}, {
isDelay: true
})
currentProject.isEnd = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
}
judgeTask.addTask(async () => {
this.checkExamIsEnd()
})
return false;
} else {
return true
}
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
let num = 2;
const judgeTimer = setInterval(async () => {
const msgStr = strArr[num];
if (msgStr == '') {
dConsole.info(JudgeTag, '模拟数据考试结束')
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
return
}
const msg: PLCType = JSON.parse(strArr[num]);
num++
// 4.过程数据
this.tempData = msg
// this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3);
this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + '';
this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + ''
this.plcData = msg
// this.judgeUI.isDwztRight = msg.gps.dwzt == 4;
AppStorage.setOrCreate('msgStr', '')
if (msg.method === 'examJudgeArtificialItem') {
this.setJudgeItem(msg.itemno, msg.type)
}
if (msg.method === 'examJudgeArtificialMark') {
this.setJudgeItem(msg.itemno, msg.serial)
}
await examJudgeRealExam(msg)
// const bytes = await this.getMessageHeartbeat();
// bytes && globalThis.judgeUdp.send(bytes)
}, 200)
// TODO 定时器缺失
// globalThis.judgeTimer = judgeTimer;
}
constructor(judgeUI: JudgeUI) {
this.serialIndex = 1;
@ -894,6 +894,7 @@ export default class Judge {
//项目结束
case 2: {
const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm)
dConsole.log(JudgeTag, "项目结束判定", xmdm, project)
const xmmcCode = project.projectCodeCenter || "";
project.type = (xmjs.xmhg === 0 ? '4' : '3')
@ -1628,6 +1629,7 @@ export default class Judge {
}
// 统计必考项目、所有项目、已考数量
setCountItems = async () => {
dConsole.log(JudgeTag, "项目结束判定,统计考试项目")
const projectsObj: object = this.judgeUI.projectsObj;
//必考项目数量 必考项目已考数量
let projectNum = 0, endProjectsNum = 0;
@ -1723,7 +1725,7 @@ export default class Judge {
dConsole.info(JudgeTag, '2.注册日志回调完成')
let initInfo: JudgeInitObj = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.getJudgeInitData();
// await fileLog?.setExamJudgeData(JSON.stringify(initInfo))
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify(initInfo))
//相关评判初始化只做一次
if (!isJudgeInitBool) {
dConsole.log(JudgeTag, "评判初始化参数", initInfo)
@ -1767,6 +1769,7 @@ export default class Judge {
} else {
beginExamInfo = await getJudgeBeginData()
}
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify(beginExamInfo))
if (beginExamInfo) {
await examJudgeBeginExam(beginExamInfo);
}

View File

@ -72,6 +72,10 @@ class serialPortService {
}
}
offMsg() {
this.events = [];
}
async closed() {
const res = await CancelReceiveSerialPortData(this.fd);
this.events = [];

View File

@ -1,6 +1,6 @@
// 处理worker线程的消息tcp拿差分改正数,udp给后置机
import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';
import { WorkerTag } from '../config';
import { SerialPortTag, WorkerTag } from '../config';
import {
CenterCallBackMsgType,
EnvironmentConfigurationType,
@ -68,7 +68,7 @@ function getDataFn(config: EnvironmentConfigurationType) {
if (data !== "" && config.carType !== "2") {
// TODO
// 需要观察
// console.log(WorkerTag, "后置机消息", data)
console.log(WorkerTag, "后置机消息", data)
const res = await SerialPortService.getData()
if (res.length > 0) {
const dataArray = data.split(",");
@ -76,7 +76,7 @@ function getDataFn(config: EnvironmentConfigurationType) {
dataArray[28] = res[9].toString();
data = dataArray.join(",");
}
// console.log(SerialPortTag, "处理完的档位信号", data)
console.log(SerialPortTag, "处理完的档位信号", data)
workerPort.postMessage(
JSON.stringify({
type: WorkerBackMessageType.ObtainUdpData,