fix: 轨迹黑屏问题优化,防止进入车检页面再进考试界面黑屏问题

This commit is contained in:
wangzhongjie 2025-08-08 09:55:48 +08:00
parent 829cb9e576
commit 4f76c81429
9 changed files with 289 additions and 237 deletions

View File

@ -5,9 +5,9 @@
"name": "default",
"material": {
"certpath": "/Users/wangzhongjie/.ohos/config/openharmony/default_car_next_xIuD6UMCLxZgyeiH-w2XdDck6DewIfdHAvOk_FUbNZo=.cer",
"storePassword": "0000001BC64885799C5237EE8F4A1DD2F6A02E9E9ECDF000224536FC73A97B0762A9DE3DA53E12989713A5",
"storePassword": "0000001B3C172BE457130742FD9398569777C93BBF9F9BBC9FA403F3FD8E06D5893F3D14B1789DF6E0F242",
"keyAlias": "debugKey",
"keyPassword": "0000001B4C1141AC4B73DF3FB5112EDFA2017F07BD680B5ACEC3FAA37E9C84DD4B8DA0C9EBBB4605A7DAD4",
"keyPassword": "0000001BEB9FF05D2B1A12791F121AFD8768580FD640018F6A394C3992EF05F73C2CEFAA130DE40703DFE8",
"profile": "/Users/wangzhongjie/.ohos/config/openharmony/default_car_next_xIuD6UMCLxZgyeiH-w2XdDck6DewIfdHAvOk_FUbNZo=.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "/Users/wangzhongjie/.ohos/config/openharmony/default_car_next_xIuD6UMCLxZgyeiH-w2XdDck6DewIfdHAvOk_FUbNZo=.p12"

View File

@ -2,6 +2,7 @@ import { PerLane } from '../../../model/index'
import { dConsole } from '../../../utils/LogWorker'
import SignalDisplayComponent from '../../compontents/SignalDisplay'
import TabComponent from '../../compontents/Tab'
import TrajectoryViewComponent from '../../compontents/TrajectoryView'
@CustomDialog
export default struct SignalTrajectoryDialog {
@ -38,10 +39,16 @@ export default struct SignalTrajectoryDialog {
Scroll() {
Column() {
SignalDisplayComponent({
active: this.active,
laneSignal: this.laneSignal
})
if (this.active !== 2) {
SignalDisplayComponent({
active: this.active,
})
} else {
TrajectoryViewComponent({
laneSignal: this.laneSignal
})
}
}.height(890)
}.width("100%")
.height(700)

View File

@ -45,7 +45,6 @@ struct SignDisplayPage {
SignalDisplayComponent({
active: this.active,
laneSignal: this.laneSignal
})
}
.width('100%')

View File

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

View File

@ -0,0 +1,36 @@
import { SignalDataType } from '../../model'
import BlockComponent from './Block'
@Component
export default struct CoordinateComponent {
@Prop data: Array<SignalDataType>
@State isItHorizontal: boolean = true
@State heightNum: number = 65
build() {
Flex({
direction: FlexDirection.Column,
alignItems: ItemAlign.Center
}) {
Text("GPS坐标").fontColor("#FFB433").fontSize(20).margin({
top: 10
})
Flex({
wrap: FlexWrap.Wrap,
direction: this.isItHorizontal ? FlexDirection.Row : FlexDirection.Column
}) {
ForEach(this.data, (item: SignalDataType) => {
BlockComponent({
heightNum: this.heightNum,
color: "#FFB433",
label: item.key,
value: item.value
})
})
}.width("100%")
}
.width("100%")
.height(this.isItHorizontal ? 210 : "100%")
.backgroundColor("#1A1A1A")
}
}

View File

@ -1,17 +1,11 @@
import { GPSData, SignalData } from '../../mock';
import {
EnvironmentConfigurationType,
PerLane,
RoadDataType,
SignalDataType,
WorkerBackMessage,
WorkerBackMessageType
} from '../../model';
import { EnvironmentConfigurationType, SignalDataType, WorkerBackMessage, WorkerBackMessageType } from '../../model';
import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker';
import { examJudgeMapSetDrawing, examJudgeMapSetScaling } from '../Judge/JudgeUtils';
import { dConsole } from '../../utils/LogWorker';
import { SignDisplayTag } from '../../config';
import CoordinateComponent from './Coordinate';
import BlockComponent from './Block';
@Component
@ -26,12 +20,6 @@ export default struct SignalDisplayComponent {
@Prop active: number = 0
// 原始数据
@State rawData: string = "$GPS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
// 车道信息
@Link @Watch("laneSignalChange") laneSignal: PerLane
laneSignalChange() {
dConsole.log("车道信号变化333", this.laneSignal)
}
aboutToAppear(): void {
DifferentialAndSignal.onMsg(this.getMsg)
@ -128,28 +116,6 @@ export default struct SignalDisplayComponent {
Column() {
Text(this.rawData).fontSize(20).fontColor("#fff")
}.backgroundColor("#282828").width("100%").height("100%")
} else {
// 轨迹查看
Flex() {
Column() {
CoordinateComponent({
isItHorizontal: false,
heightNum: 40,
data: this.GPSColum
})
}.width("20%")
Column() {
LaneComponent({
laneSignal: this.laneSignal
})
}.width("20%")
Column() {
trajectoryComponent()
}.height("100%").width("60%")
}.backgroundColor("#282828").width("100%").height("100%")
}
}
.width("100%")
@ -161,122 +127,6 @@ export default struct SignalDisplayComponent {
}
}
@Component
struct trajectoryComponent {
@State scaleNum: number = 100
scaleFn = async (num: number) => {
console.log("缩放传入数据", num.toString())
const scaleNum = this.scaleNum
if (scaleNum > 0 && scaleNum < 5000) {
this.scaleNum += num;
}
if (scaleNum === 0 && num > 0) {
this.scaleNum += num;
}
if (scaleNum > 5000 && num < 0) {
this.scaleNum += num;
}
console.log("缩放数据", this.scaleNum.toString())
await examJudgeMapSetScaling(this.scaleNum);
}
getScaleNum = (): number => {
const scaleNum = this.scaleNum;
if (scaleNum < 200) return 10;
if (scaleNum < 400) return 30;
if (scaleNum < 600) return 50;
if (scaleNum < 800) return 70;
if (scaleNum < 1000) return 100;
if (scaleNum < 2000) return 500;
return 1000;
}
build() {
Stack({
alignContent: Alignment.TopEnd
}) {
XComponent({
id: 'duolun_plugin_id_draw', //显示轨迹窗口id名称注意这个ID要和C++侧一致,不能变
type: 'surface',
// libraryname: 'JudgeSdk'
libraryname: 'judgesdk'
})
.width("100%")
.height("100%")
.onLoad(() => {
dConsole.log("开始绘制")
examJudgeMapSetDrawing(true)
})
.onDestroy(() => {
dConsole.log("结束绘制")
examJudgeMapSetDrawing(false)
})
Row() {
Image($rawfile('judge/big.png')).width(60).onClick(() => {
this.scaleFn(-this.getScaleNum())
})
Image($rawfile('judge/small.png')).width(60).onClick(() => {
this.scaleFn(this.getScaleNum())
}).margin({ left: 20 })
}.align(Alignment.TopEnd)
}.width("100%").height("100%")
}
}
@Component
struct LaneComponent {
@Link laneSignal: PerLane
private RoadData: Array<RoadDataType> = [
{ name: '路段组号', key: 'MapRoad_Code_No' },
{ name: '路段编码', key: 'MapRoad_Name' },
{ name: '车轮压线', key: ['TouchLineType', 'TouchDir'] },
{ name: '车身碰线', key: ['TouchLineTypeCS', 'TouchLineDirCS'] },
{ name: '基准车道', key: ['BasePointInLaneNo', 'BaseLaneCount'] },
{ name: '前点车道', key: ['FrontPointLaneNo', 'FrontPointLaneCount'] },
{ name: '后车点道', key: ['BackPointLaneNo', 'BackPointLaneCount'] },
{ name: '左前/后车身距离', key: ['Body_LF_ToLeftEdge', 'Body_LB_ToLeftEdge'] },
{ name: '右前/后车身距离', key: ['Body_RF_ToRightEdge', 'Body_RB_ToRightEdge'] },
{ name: '右前/后车身边线', key: ['Body_RF_ToBaseLine', 'Body_RB_ToBaseLine'] },
{ name: '右前/后轮距离', key: ['Wheel_RF_ToRightEdge', 'Wheel_RB_ToRightEdge'] },
{ name: '右前/后轮边线', key: ['Wheel_RF_ToBaseLine', 'Wheel_RB_ToBaseLine'] },
{ name: '左前/后轮距离', key: ['Wheel_LF_ToRightEdge', 'Wheel_LB_ToRightEdge'] },
{ name: '左前/后轮边线', key: ['Wheel_LF_ToBaseLine', 'Wheel_LB_ToBaseLine'] },
{ name: '车道属性', key: ['BasePointInLaneDir', 'CrossLineAttr', 'DirInverse'] },
{ name: '形状', key: ['InShapeAttr', 'ShapeNo', 'ShapeNoWheel'] },
{ name: '路段点', key: ['CrossPointNo'] },
]
getValues(roadColumn: RoadDataType) {
dConsole.log(SignDisplayTag, "车道信息", this.laneSignal)
let key = roadColumn.key;
let str = ''
if (Array.isArray(key)) {
key.forEach((k, index) => {
str += (Reflect.get(this.laneSignal, k) === undefined ? '' : Reflect.get(this.laneSignal, k)) + (index == key.length - 1 ? '' : '/')
})
} else {
str = Reflect.get(this.laneSignal, key) === undefined ? '' : Reflect.get(this.laneSignal, key)
}
return str
}
build() {
Column() {
Text("车道信息").fontSize(20).fontColor("#FFB433").margin({
top: 20
})
ForEach(this.RoadData, (item: RoadDataType) => {
blockComponent({
color: "#FFB433",
heightNum: 40,
label: item.name,
value: this.getValues(item)
})
})
}.width("100%")
}
}
@Component
struct GPSComponent {
@ -299,59 +149,59 @@ struct GPSComponent {
Flex({
wrap: FlexWrap.Wrap
}) {
blockComponent({
BlockComponent({
label: "发送次数",
value: this.data[49] || "-"
})
blockComponent({
BlockComponent({
label: "固件版本",
value: this.data[54] || "-"
})
blockComponent({
BlockComponent({
label: "方向盘类型",
value: this.data[50] || "-"
})
blockComponent({
BlockComponent({
label: "按键数值",
value: this.data[55] || "-"
})
blockComponent({
BlockComponent({
label: "GPS错误次数",
value: this.data[60] || "-"
})
blockComponent({
BlockComponent({
label: "汽车类型",
value: this.data[51] || "-"
})
blockComponent({
BlockComponent({
label: "GPS板卡类型",
value: this.data[56] || "-"
})
blockComponent({
BlockComponent({
label: "本机IP",
value: this.ip
})
blockComponent({
BlockComponent({
label: "接口心跳",
value: this.data[52] || "-"
})
blockComponent({
BlockComponent({
label: "GPS板卡软件版本",
value: this.data[57] || "-"
})
blockComponent({
BlockComponent({
label: "改正数次数/改正数大小",
value: this.data[58] || "-"
})
blockComponent({
BlockComponent({
label: "已工作时长/设定工作时长",
value: this.data[61] || "-"
})
blockComponent({
BlockComponent({
label: "GPS数据次数/数据长度",
value: this.data[59] || "-"
})
blockComponent({
BlockComponent({
label: "改正数据长度*数据长度-基准站RTCM改正数类型",
value: this.data[62] || "-"
})
@ -368,7 +218,7 @@ struct CarComponent {
wrap: FlexWrap.Wrap
}) {
ForEach(this.data, (item: SignalDataType) => {
blockComponent({
BlockComponent({
label: item.key,
value: item.value
})
@ -377,62 +227,4 @@ struct CarComponent {
}
}
@Component
struct CoordinateComponent {
@Prop data: Array<SignalDataType>
@State isItHorizontal: boolean = true
@State heightNum: number = 65
build() {
Flex({
direction: FlexDirection.Column,
alignItems: ItemAlign.Center
}) {
Text("GPS坐标").fontColor("#FFB433").fontSize(20).margin({
top: 10
})
Flex({
wrap: FlexWrap.Wrap,
direction: this.isItHorizontal ? FlexDirection.Row : FlexDirection.Column
}) {
ForEach(this.data, (item: SignalDataType) => {
blockComponent({
heightNum: this.heightNum,
color: "#FFB433",
label: item.key,
value: item.value
})
})
}.width("100%")
}
.width("100%")
.height(this.isItHorizontal ? 210 : "100%")
.backgroundColor("#1A1A1A")
}
}
@Component
struct blockComponent {
@State label: string = "发送次数"
@Prop value: string = "1"
@State widthNum: number = 130
@State heightNum: number = 70
@State color: string = "#FDF5E7"
build() {
Row() {
Row() {
Text(this.label + ":").fontColor(this.color).fontSize(14)
}.width(this.widthNum).justifyContent(FlexAlign.End)
Row() {
Text(this.value).fontColor(this.color)
}.width(80).justifyContent(FlexAlign.Start).margin({
left: 20
})
}
.height(this.heightNum)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Center)
}
}

View File

@ -0,0 +1,194 @@
import { SignDisplayTag } from '../../config'
import { GPSData } from '../../mock'
import { PerLane, RoadDataType, SignalDataType, WorkerBackMessage, WorkerBackMessageType } from '../../model'
import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker'
import { dConsole } from '../../utils/LogWorker'
import { examJudgeMapSetDrawing, examJudgeMapSetScaling } from '../Judge/JudgeUtils'
import BlockComponent from './Block'
import CoordinateComponent from './Coordinate'
@Component
export default struct TrajectoryViewComponent {
// GPS信号
@State GPSColum: Array<SignalDataType> = GPSData
// 车道信息
@Link @Watch("laneSignalChange") laneSignal: PerLane
laneSignalChange() {
dConsole.log("车道信号变化333", this.laneSignal)
}
aboutToAppear(): void {
DifferentialAndSignal.onMsg(this.getMsg)
}
aboutToDisappear(): void {
DifferentialAndSignal.offMsg(this.getMsg)
}
getMsg = (data: string) => {
const result: WorkerBackMessage = JSON.parse(data)
dConsole.log(SignDisplayTag, "wzj", data)
if (result.type === WorkerBackMessageType.ObtainUdpData) {
this.getSignal(result.data as string)
}
}
getSignal = (msg: string) => {
const newArr = msg.split(',')
if (newArr[0] != '#DN_GD') {
return
}
let t = 0
for (let i = 83; i <= 97; i++) {
this.GPSColum[t].value = newArr[i]
t++
}
this.GPSColum[14].value = ((Number((newArr[97] || 0)) * 1.852).toFixed(2)).toString()
this.GPSColum[10].value = newArr[93]
this.GPSColum = JSON.parse(JSON.stringify((this.GPSColum)))
}
build() {
Column() {
Flex() {
Column() {
CoordinateComponent({
isItHorizontal: false,
heightNum: 40,
data: this.GPSColum
})
}.width("20%")
Column() {
LaneComponent({
laneSignal: this.laneSignal
})
}.width("20%")
Column() {
trajectoryComponent()
}.height("100%").width("60%")
}.backgroundColor("#282828").width("100%").height("100%").borderRadius(10)
}.width("100%").height("100%").backgroundColor("#fff").padding(10)
}
}
@Component
struct LaneComponent {
@Link laneSignal: PerLane
private RoadData: Array<RoadDataType> = [
{ name: '路段组号', key: 'MapRoad_Code_No' },
{ name: '路段编码', key: 'MapRoad_Name' },
{ name: '车轮压线', key: ['TouchLineType', 'TouchDir'] },
{ name: '车身碰线', key: ['TouchLineTypeCS', 'TouchLineDirCS'] },
{ name: '基准车道', key: ['BasePointInLaneNo', 'BaseLaneCount'] },
{ name: '前点车道', key: ['FrontPointLaneNo', 'FrontPointLaneCount'] },
{ name: '后车点道', key: ['BackPointLaneNo', 'BackPointLaneCount'] },
{ name: '左前/后车身距离', key: ['Body_LF_ToLeftEdge', 'Body_LB_ToLeftEdge'] },
{ name: '右前/后车身距离', key: ['Body_RF_ToRightEdge', 'Body_RB_ToRightEdge'] },
{ name: '右前/后车身边线', key: ['Body_RF_ToBaseLine', 'Body_RB_ToBaseLine'] },
{ name: '右前/后轮距离', key: ['Wheel_RF_ToRightEdge', 'Wheel_RB_ToRightEdge'] },
{ name: '右前/后轮边线', key: ['Wheel_RF_ToBaseLine', 'Wheel_RB_ToBaseLine'] },
{ name: '左前/后轮距离', key: ['Wheel_LF_ToRightEdge', 'Wheel_LB_ToRightEdge'] },
{ name: '左前/后轮边线', key: ['Wheel_LF_ToBaseLine', 'Wheel_LB_ToBaseLine'] },
{ name: '车道属性', key: ['BasePointInLaneDir', 'CrossLineAttr', 'DirInverse'] },
{ name: '形状', key: ['InShapeAttr', 'ShapeNo', 'ShapeNoWheel'] },
{ name: '路段点', key: ['CrossPointNo'] },
]
getValues(roadColumn: RoadDataType) {
dConsole.log(SignDisplayTag, "车道信息", this.laneSignal)
let key = roadColumn.key;
let str = ''
if (Array.isArray(key)) {
key.forEach((k, index) => {
str += (Reflect.get(this.laneSignal, k) === undefined ? '' : Reflect.get(this.laneSignal, k)) + (index == key.length - 1 ? '' : '/')
})
} else {
str = Reflect.get(this.laneSignal, key) === undefined ? '' : Reflect.get(this.laneSignal, key)
}
return str
}
build() {
Column() {
Text("车道信息").fontSize(20).fontColor("#FFB433").margin({
top: 20
})
ForEach(this.RoadData, (item: RoadDataType) => {
BlockComponent({
color: "#FFB433",
heightNum: 40,
label: item.name,
value: this.getValues(item)
})
})
}.width("100%")
}
}
@Component
struct trajectoryComponent {
@State scaleNum: number = 100
scaleFn = async (num: number) => {
console.log("缩放传入数据", num.toString())
const scaleNum = this.scaleNum
if (scaleNum > 0 && scaleNum < 5000) {
this.scaleNum += num;
}
if (scaleNum === 0 && num > 0) {
this.scaleNum += num;
}
if (scaleNum > 5000 && num < 0) {
this.scaleNum += num;
}
console.log("缩放数据", this.scaleNum.toString())
await examJudgeMapSetScaling(this.scaleNum);
}
getScaleNum = (): number => {
const scaleNum = this.scaleNum;
if (scaleNum < 200) return 10;
if (scaleNum < 400) return 30;
if (scaleNum < 600) return 50;
if (scaleNum < 800) return 70;
if (scaleNum < 1000) return 100;
if (scaleNum < 2000) return 500;
return 1000;
}
build() {
Stack({
alignContent: Alignment.TopEnd
}) {
XComponent({
id: 'duolun_plugin_id_draw', //显示轨迹窗口id名称注意这个ID要和C++侧一致,不能变
type: 'surface',
// libraryname: 'JudgeSdk'
libraryname: 'judgesdk'
})
.width("100%")
.height("100%")
.onLoad(() => {
dConsole.log("开始绘制")
examJudgeMapSetDrawing(true)
})
.onDestroy(() => {
dConsole.log("结束绘制")
examJudgeMapSetDrawing(false)
})
Row() {
Image($rawfile('judge/big.png')).width(60).onClick(() => {
this.scaleFn(-this.getScaleNum())
})
Image($rawfile('judge/small.png')).width(60).onClick(() => {
this.scaleFn(this.getScaleNum())
}).margin({ left: 20 })
}.align(Alignment.TopEnd)
}.width("100%").height("100%")
}
}

View File

@ -23,8 +23,7 @@ export default class FileModel {
constructor(context: common.UIAbilityContext) {
(async () => {
const fileUtil = new FileUtils(context)
this.fileUtil = fileUtil
this.fileUtil = new FileUtils(context)
})()
}

View File

@ -339,9 +339,9 @@ export const GetPhotoBase64 = async (context: common.UIAbilityContext): Promise<
} else {
try {
dConsole.info(JudgeTag, '拍照开始')
const res = await takePhoto(videoConfig, context, 'pz/', 2);
const res = await takePhoto(videoConfig!, context, 'pz/', 2);
dConsole.info(JudgeTag, '拍照完成')
return res.base64
return res.base64 || ""
} catch (e) {
dConsole.error(JudgeTag, '拍照异常' + JSON.stringify(e))
Prompt.showToast({