From b8aa90e86e063307f8093e811086266f2826b085 Mon Sep 17 00:00:00 2001 From: lvyuankang <1344032923@qq.com> Date: Tue, 2 Jul 2024 08:59:03 +0800 Subject: [PATCH 1/4] =?UTF-8?q?socket=E4=B8=9F=E5=A4=B1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/common/service/initable.ts | 4 +- entry/src/main/ets/common/utils/TcpClient.ts | 65 +++++-------------- entry/src/main/ets/common/utils/UdpClient.ts | 49 +++++++------- .../ets/common/utils/UdpClientByCenter.ts | 3 +- entry/src/main/ets/pages/ExaminerLogin.ets | 7 +- entry/src/main/ets/pages/Index.ets | 38 +++++++---- entry/src/main/ets/pages/UserInfo.ets | 2 +- 7 files changed, 73 insertions(+), 95 deletions(-) diff --git a/entry/src/main/ets/common/service/initable.ts b/entry/src/main/ets/common/service/initable.ts index 2046cdca..937f8925 100644 --- a/entry/src/main/ets/common/service/initable.ts +++ b/entry/src/main/ets/common/service/initable.ts @@ -166,9 +166,9 @@ export async function getDataBaseTable(params,reqParam) { let str='(' map[params.tableName].ACCOUNT_TABLE.columns.map((res,index)=>{ if(map[params.tableName].ACCOUNT_TABLE.columns.length-1==index){ - str+=`"${data[res]||'1'}"` + str+=data[res]?`"${data[res]}"`:'NULL' }else{ - str+=`"${data[res]||'1'}"`+',' + str+=(data[res]?`"${data[res]}"`:'NULL')+',' } }) if(i==res.body[params.tableName].length-1){ diff --git a/entry/src/main/ets/common/utils/TcpClient.ts b/entry/src/main/ets/common/utils/TcpClient.ts index ac7a8371..80bd059c 100644 --- a/entry/src/main/ets/common/utils/TcpClient.ts +++ b/entry/src/main/ets/common/utils/TcpClient.ts @@ -1,7 +1,7 @@ import socket from '@ohos.net.socket'; import buffer from '@ohos.buffer'; -const TAG = '[TcpDemo.TcpClient]' +const TAG = 'socketTag[TcpDemo.TcpClient]' import prompt from '@ohos.prompt' import hilog from '@ohos.hilog'; @@ -18,12 +18,12 @@ export default class TcpClient { this.oppositeIp = tcpOppositeIp this.localIpPort = tcplocalIpPort this.oppositeIpPort = tcpOppositePort - console.log('tcp1111',this.localIp,this.localIpPort,this.oppositeIp,this.oppositeIpPort) + console.log(TAG,'new Tcp',this.localIp,this.localIpPort,this.oppositeIp,this.oppositeIpPort) this.tcp = socket.constructTCPSocketInstance(); } onError(callback?){ this.tcp.on('error', err => { - hilog.info(0x0000, 'testTag', "on error, err:" + JSON.stringify(err)); + console.log(TAG,'tcpOnerror', JSON.stringify(err)) callback&&callback() // this.closeUdp(()=>{ // this.bindUdp() @@ -32,11 +32,11 @@ export default class TcpClient { } rebindTcp(localIp: string, localIpPort:string,oppositeIp: string,oppositeIpPort:string){ return new Promise((resolve, reject)=>{ - this.localIp = localIp this.oppositeIp = oppositeIp this.localIpPort = localIpPort this.oppositeIpPort = oppositeIpPort + console.log(TAG,'tcpreBind', this.localIp,this.localIpPort) let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => { if (err) { hilog.info(0x0000, 'testTag', "tcpreBinderror:" + JSON.stringify(err)); @@ -57,7 +57,7 @@ export default class TcpClient { } bindTcp() { - console.log('tcpoppositeIp',this.oppositeIp,'localIp',this.localIp) + console.log(TAG,'tcpbind',this.localIp,'localIp',this.localIpPort) return new Promise((resolve,reject)=>{ let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => { if (err) { @@ -82,8 +82,7 @@ export default class TcpClient { } connectTcp(){ - console.log('testTagtcbpoppositeIp',this.oppositeIp,this.oppositeIpPort,'localIp',this.localIp,this.localIpPort) - console.log('22323') + console.log(TAG,'tcpConnect',this.oppositeIp,'localIp',this.oppositeIpPort) return new Promise((resolve,reject)=>{ let promise = this.tcp.connect({ address: {address: this.oppositeIp, port: parseInt(this.oppositeIpPort), family: 1} , timeout: 6000}); promise.then(() => { @@ -112,7 +111,7 @@ export default class TcpClient { } sendMsg(msg: string) { - console.log('testTagsendoppositeIp',this.oppositeIp) + console.log(TAG,'tcpSend',msg.length,msg) return new Promise((reslove,reject)=>{ let promise = this.tcp.send({ data:msg @@ -123,29 +122,12 @@ export default class TcpClient { reslove(false) }); }) - - // let promise = this.udp.send({ - // data: msg, - // address: { - // // address: '192.168.7.124', - // // port: 30013, - // // address: '192.168.7.124', - // // port: 20022, - // address: this.oppositeIp, - // port: parseInt(this.oppositeIpPort), - // family: 1 - // } - // }); - - // promise.then(() => { - // console.log(`${TAG} udp send success:${msg}`); - // }).catch(err => { - // console.log(`${TAG} udp send fail:${JSON.stringify(err)}`); - // }); } onMessage(callback?) { this.tcp.on('message', value => { + console.log(TAG,'Tcponmessage',value.length,value) + // console.log('messageLengt',,value.message.length)) console.log('testTagtcpmsg') // console.log("on message, message:" + value.message+ ", remoteInfo:" ) @@ -160,39 +142,22 @@ export default class TcpClient { } // callback(value.message) }); - // this.udp.on('message', value => { - // // 收到的是ArrayBuffer 需要进行转换解析 - // if (value) { - // let dataView = new DataView(value.message) - // // console.log(`${TAG} udp message length:${dataView?.byteLength}`); - // let str = "" - // for (let i = 0;i < dataView?.byteLength; ++i) { - // let c = String.fromCharCode(dataView?.getUint8(i)) - // if (c !== "\n") { - // str += c - // } - // } - // console.log(`${TAG} udp on message array buffer:${str}`); - // callback(str) - // }else{ - // callback('') - // } - // - // - // }); } offTcp(callback) { - this.tcp.off('testTagofmessg', callback); + console.log(TAG,'tcpofff') + + this.tcp.off('testTagofmessg', callback); } closeTcp(callback) { return new Promise((reslove,reject)=>{ + console.log(TAG,'tcpClose') let promise = this.tcp.close(); promise.then(() => { - console.log('testTagclose success'); + console.log(TAG,'tcpCloseSuccess') callback() reslove(true) }).catch(err => { - console.log('testTagclose fail'); + console.log(TAG,'tcpClosefailed') reslove(false) }); }) diff --git a/entry/src/main/ets/common/utils/UdpClient.ts b/entry/src/main/ets/common/utils/UdpClient.ts index 8ea74551..d0b4257b 100644 --- a/entry/src/main/ets/common/utils/UdpClient.ts +++ b/entry/src/main/ets/common/utils/UdpClient.ts @@ -17,10 +17,11 @@ import socket from '@ohos.net.socket'; import { Array2Byte } from '../utils/tools' import {getChuankouFn} from '../../common/service/indexService' -const TAG = '[PLC.UdpClient]' +const TAG = 'socketTag[PLC.UdpClient]' import prompt from '@ohos.prompt' import hilog from '@ohos.hilog'; +let num=0 export default class UdpClient { private localIp: string = '' private localIpPort: string = '' @@ -36,39 +37,40 @@ export default class UdpClient { this.localIpPort = udplocalIpPort this.oppositeIpPort = udpOppositeIpPort getChuankouFn() + console.log(TAG,'newUdp') // this.stashFn=()=>{} this.udp = socket.constructUDPSocketInstance(); } rebindUdp(localIp: string, localIpPort: string, oppositeIp: string, oppositeIpPort: string) { + console.log(TAG,'rebindUdp',this.localIp,this.localIpPort) this.localIp = localIp this.oppositeIp = oppositeIp this.localIpPort = localIpPort this.oppositeIpPort = oppositeIpPort - hilog.info(0x0000, 'udpCLient', 'rebind'+this.localIp+this.localIpPort); let promise = this.udp.bind({ address: this.localIp, port: parseInt(this.localIpPort), family: 1 }); promise.then(() => { - console.log(`${TAG}udpCLient udp rebind success`); + globalThis.closeUDPSocket=false + + console.log(`${TAG},udpCLient udp rebind success`); }).catch(err => { - console.log(`${TAG}udpCLient udp rebind failed:${JSON.stringify(err)}`); + console.log(`${TAG},udpCLient udp rebind failed:${JSON.stringify(err)}`); }); } bindUdp() { - console.log('localIp', this.localIp) - console.log('localIpPort', this.localIpPort) - hilog.info(0x0000, 'udpCLient', 'bind'+ this.localIp+this.localIpPort); - + console.log(TAG,'udpbind',this.localIp,this.localIpPort) let promise = this.udp.bind({ // address: '192.168.7.170', port: 20122, family: 1 // address: '192.168.7.170', port: 31013, family: 1 address: this.localIp, port: parseInt(this.localIpPort), family: 1 }); promise.then(() => { + globalThis.closeUDPSocket=false console.log(`${TAG}udpCLient udp bind success`); }).catch(err => { @@ -79,9 +81,7 @@ export default class UdpClient { // this.stashFn=callback?callback:()=>{} } sendMsg(msg) { - console.log('sendsnd01') - hilog.info(0x0000, 'udpCLient', 'send'); - console.log('udpdiushisend') + console.log(TAG,'UdpSend1111',this.oppositeIp,this.oppositeIpPort) let promise = this.udp.send({ data: msg, @@ -96,16 +96,14 @@ export default class UdpClient { } }); promise.then(() => { - console.log(`${TAG}udpCLient udp send success:${msg}`); + console.log(`${TAG}udpCLient udp send success:oppositeIp${this.oppositeIp},oppositeIpPort:${this.oppositeIpPort},localIp:${this.localIp},localIpPort,${this.localIpPort}`); }).catch(err => { - console.log(`${TAG}udpCLient udp send fail:${JSON.stringify(err)}`); + console.log(`${TAG}udpCLient udp send fail:oppositeIp${this.oppositeIp},oppositeIpPort:${this.oppositeIpPort},localIp:${this.localIp},localIpPort,${this.localIpPort}`); }); } onError(callback?){ this.udp.on('error',async err => { - console.log('udpdiushierroring') - hilog.info(0x0000, 'udpCLientonerror', 'error'+ JSON.stringify(err)); - console.log("on error, err:" + JSON.stringify(err)) + console.log(TAG,'udpError',JSON.stringify(err)) await this.bindUdp() await this.sendMsg('111') await this.onMessage(callback) @@ -119,11 +117,8 @@ export default class UdpClient { onMessage(callback?) { this.udp.on('message', value => { - console.log('udpdiushimsg') - + console.log(TAG,'udponmessage') // 收到的是ArrayBuffer 需要进行转换解析 - hilog.info(0x0000, 'udpCLient', 'onmessage'); - globalThis.plcUdpError = false if (value) { @@ -169,10 +164,18 @@ export default class UdpClient { globalThis.messageTimer = setInterval(() => { const lightLineUdp = globalThis.lightLineUdp const isJudge = globalThis.isJudge - setTimeout(() => { + setTimeout(async () => { //程序断开 lightLineUdp?.send(globalThis.plcUdpError ? arrRedBuffer : (isJudge ? arrGreenBugger : arrBlueBuffer)); if (globalThis.plcUdpError) { + num++ + console.log(TAG,'plc udp信号丢失') + // if(num==2){ + // await this.bindUdp() + // await this.sendMsg('111') + // await this.onMessage(callback) + // num=0 + // } prompt.showToast({ message: 'plc udp信号丢失', duration: 2000 @@ -186,10 +189,10 @@ export default class UdpClient { closeUdp(callback) { this.udp.close(err => { - hilog.info(0x0000, 'udpCLient', 'close'); + hilog.info(0x0000,TAG, 'udpCLient', 'close'); if (err) { - hilog.info(0x0000, 'udpCLient', 'closeonerror'); + hilog.info(0x0000,TAG, 'udpCLient', 'closeonerror'); } else { this.udp.getState((err, data) => { diff --git a/entry/src/main/ets/common/utils/UdpClientByCenter.ts b/entry/src/main/ets/common/utils/UdpClientByCenter.ts index bc29fdd6..27074376 100644 --- a/entry/src/main/ets/common/utils/UdpClientByCenter.ts +++ b/entry/src/main/ets/common/utils/UdpClientByCenter.ts @@ -61,6 +61,7 @@ export default class UdpClientByCenter { }); promise.then(() => { + globalThis.closeHeartSocket=false console.log(`${TAG} udp bind success`); }).catch(err => { @@ -77,6 +78,7 @@ export default class UdpClientByCenter { address: this.localIp, port: parseInt(this.localIpPort), family: 1 }); promise.then(() => { + globalThis.closeHeartSocket=false console.log(`${TAG} udp bind success`); }).catch(err => { @@ -182,7 +184,6 @@ export default class UdpClientByCenter { } onMessage(callback,type?) { this.udp.on('message', value => { - console.log('tttttttt') let arr=[] let dataView = new DataView(value.message) for (let i = 0;i < dataView?.byteLength; ++i) { diff --git a/entry/src/main/ets/pages/ExaminerLogin.ets b/entry/src/main/ets/pages/ExaminerLogin.ets index 995a0522..e8a36e37 100644 --- a/entry/src/main/ets/pages/ExaminerLogin.ets +++ b/entry/src/main/ets/pages/ExaminerLogin.ets @@ -71,13 +71,8 @@ export default struct Index { username: this.inputTextArr[0], password: Md5.Instance.get_md5(this.inputTextArr[1]) } - console.log('paramparam', JSON.stringify(globalThis.carInfo)) + console.log('carInfo', JSON.stringify(globalThis.carInfo)) examinerLoginService(param).then(res => { - // this.vocObj.playAudio({ - // type: 1, - // name: 'media_button.wav' - // }) - // this.url='pages/userInfo' router.pushUrl({ url: 'pages/UserInfo', }, router.RouterMode.Single); diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index b912452f..6cc7d1e7 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -1,4 +1,5 @@ // @ts-nocheck +import promptAction from '@ohos.promptAction' import { VideoConfig } from './interfaces' import common from '@ohos.app.ability.common'; import router from '@ohos.router' @@ -86,10 +87,28 @@ struct Index { }) Image($r('app.media.btn_back')).width('14.4%').height('12.2%') .onClick(() => { - if (this.loading) { - return - } - router.back() + promptAction.showDialog({ + title: '提示', + message: '确认是否退出应用', + buttons: [ + { + text: '确认', + color: '#000000', + }, + { + text: '取消', + color: '#000000', + } + ], + }) + .then(data => { + if(data.index==0){ + router.back() + } + }) + .catch(err => { + // reslove(false) + }) }) } } @@ -244,13 +263,6 @@ struct Index { }, router.RouterMode.Single) } this.loading=false - // let workData: WorkData = e.data; - // if (workData) { - // this.isComplete = workData.isComplete; - // this.json_Str = workData.jsonStr; - // console.log("baoyihu after postMessage json_Str:"+this.json_Str); - // workerInstance.terminate(); - // } } } async heartMsg() { @@ -266,7 +278,9 @@ struct Index { const param= {id: 31,list:tmpList,carNo: globalThis.carInfo.carNo,placeId: globalThis.carInfo.examinationRoomId} // globalThis.udpClient2.initHeartSendMsg(param,this.context) - globalThis.udpClient2.sendMsg(param, this.context) + if(!globalThis.closeHeartSocket){ + globalThis.udpClient2.sendMsg(param, this.context) + } } onPageShow() { diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index 91763253..5720aa28 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -253,13 +253,13 @@ struct UserInfo { const faceParam = syssetParams.filter(sys => sys.v_no === '2313') that.FaceOpenStatue =faceParam?.[0]?.v_value=='3'? '1':'0' that.FaceOpenStatue = '0' - console.log('that.FaceOpenStatue',that.FaceOpenStatue) // faceParam?.[0]?.v_value || // 1身份证读卡器 2指纹 3人脸 this.faceFlag=faceParam?.[0]?.v_value ||'0' if(faceParam?.[0]?.v_value=='1'){ that.openDeviceByIDCard() } + console.log('studentRefreshStatue',this.studentRefreshStatue) //0不自动更新 1自动更新(不限次数) 2没有考生更新2次 if (that.studentRefreshStatue == '2') { clearInterval(that.interval) -- 2.43.0.windows.1 From f89fe36b107751b8bc1561a18764425d3807a311 Mon Sep 17 00:00:00 2001 From: lvyuankang <1344032923@qq.com> Date: Tue, 2 Jul 2024 09:01:57 +0800 Subject: [PATCH 2/4] =?UTF-8?q?cpp=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/BUILD.gn | 77 +++- entry/src/main/cpp/CMakeLists.txt | 3 + .../src/main/cpp/bin/extract_h_cpp_files.txt | 53 ++- entry/src/main/cpp/sdk/api/include/JudgeSdk.h | 13 +- .../src/main/cpp/sdk/api/jni/JNIApiBridge.cpp | 11 + .../main/cpp/sdk/api/jni/JNIMethodTable.cpp | 1 + entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp | 22 + entry/src/main/cpp/sdk/api/js/JSApiBridge.h | 1 + .../main/cpp/sdk/api/platform/JudgeSdk.cpp | 12 +- entry/src/main/cpp/sdk/common/CleverHelper.h | 7 + entry/src/main/cpp/sdk/common/HEnum.h | 2 + entry/src/main/cpp/sdk/common/HSystem.h | 71 +++- entry/src/main/cpp/sdk/common/Loggerxx.cpp | 4 +- entry/src/main/cpp/sdk/common/Tools.cpp | 34 +- entry/src/main/cpp/sdk/common/Tools.h | 6 +- entry/src/main/cpp/sdk/database/HDBTable.h | 12 + .../database/mappoint/MapPointItemTable.cpp | 2 + .../cpp/sdk/database/sysset/SysSetTable.cpp | 9 + entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp | 20 +- entry/src/main/cpp/sdk/exam/ExamCarSub2.h | 1 + entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp | 201 +++++++-- entry/src/main/cpp/sdk/exam/ExamCarSub3.h | 5 + entry/src/main/cpp/sdk/exam/ExamSensor.cpp | 132 +++++- entry/src/main/cpp/sdk/exam/ExamSensor.h | 10 + entry/src/main/cpp/sdk/exam/ExamService.cpp | 7 + entry/src/main/cpp/sdk/exam/ExamService.h | 1 + entry/src/main/cpp/sdk/exam/IExamCar.cpp | 40 +- entry/src/main/cpp/sdk/exam/IExamCar.h | 2 + entry/src/main/cpp/sdk/exam/IExamInterface.h | 1 + entry/src/main/cpp/sdk/judge/HJudgeItem.h | 15 +- .../cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp | 19 +- .../main/cpp/sdk/judge/sub2/ISub2JudgeWrap.h | 2 +- .../cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp | 25 +- .../cpp/sdk/judge/sub2/Sub2Judge02Pdqb.cpp | 30 +- .../main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.h | 6 +- .../cpp/sdk/judge/sub2/Sub2Judge03Cftc.cpp | 62 ++- .../main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.h | 4 + .../cpp/sdk/judge/sub2/Sub2Judge05Qxxs.cpp | 8 +- .../main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.h | 1 + .../cpp/sdk/judge/sub2/Sub2Judge06Zjzw.cpp | 28 +- .../main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.h | 1 + .../cpp/sdk/judge/sub3/ISub3JudgeWrap.cpp | 7 +- .../cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp | 55 ++- .../cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp | 4 + .../cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp | 12 +- .../cpp/sdk/judge/sub3/Sub3Judge04Bgcd.cpp | 48 ++- .../cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp | 59 ++- .../cpp/sdk/judge/sub3/Sub3Judge07Xxqy.cpp | 12 + .../cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp | 17 + .../cpp/sdk/judge/sub3/Sub3Judge09Hcxx.cpp | 9 +- .../cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp | 2 +- .../cpp/sdk/judge/sub3/Sub3Judge12Lkdt.cpp | 18 + .../cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp | 20 + .../cpp/sdk/judge/sub3/Sub3Judge15Lkzz.cpp | 63 ++- .../main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.h | 1 + .../cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp | 161 +++++-- .../cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp | 169 +++++--- .../main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h | 8 +- entry/src/main/cpp/sdk/parser/XParser.cpp | 146 ++++--- entry/src/main/cpp/sdk/parser/XParser.h | 12 +- entry/src/main/cpp/sdk/track/HTrack.h | 1 + entry/src/main/cpp/sdk/track/TrackReader.cpp | 5 + entry/src/main/cpp/sdk/utility/HBean.h | 11 +- entry/src/main/cpp/sdk/utility/HErrorCode.h | 3 + entry/src/main/cpp/sdk/utility/HTypes.h | 18 +- .../src/main/cpp/test/test_sdk/ITestData.cpp | 2 + entry/src/main/cpp/toolkit/inc/HToolkit.cpp | 49 ++- entry/src/main/cpp/toolkit/inc/HToolkit.h | 196 ++++++++- .../src/main/cpp/toolkit/inc/IConvertData.cpp | 93 ++++ entry/src/main/cpp/toolkit/inc/IConvertData.h | 12 +- entry/src/main/cpp/toolkit/main.cpp | 7 + .../cpp/toolkit/menu/deve/MenuDeveMdb.cpp | 246 +++++++---- .../main/cpp/toolkit/menu/deve/MenuDeveMdb.h | 15 +- .../main/cpp/toolkit/menu/deve/MenuDeveMdb.ui | 133 +++--- .../cpp/toolkit/menu/tool/MenuToolDecrypt.cpp | 36 +- .../cpp/toolkit/menu/tool/MenuToolEncrypt.cpp | 36 +- .../cpp/toolkit/menu/tool/MenuToolEncrypt.h | 1 + .../cpp/toolkit/menu/tool/MenuToolPkg.cpp | 4 +- .../cpp/toolkit/menu/tool/MenuToolUnpkg.cpp | 8 +- .../main/cpp/toolkit/replay/ReplayWrapper.cpp | 8 +- entry/src/main/cpp/toolkit/ui/MainWindow.cpp | 398 +++++++++++------- entry/src/main/cpp/toolkit/ui/MainWindow.h | 8 +- entry/src/main/cpp/toolkit/ui/MainWindow.ui | 121 +++--- .../src/main/cpp/toolkit/widgets/ShowDetail.h | 2 +- 84 files changed, 2445 insertions(+), 752 deletions(-) diff --git a/entry/src/main/cpp/BUILD.gn b/entry/src/main/cpp/BUILD.gn index 0c6ada09..5e30cdf1 100644 --- a/entry/src/main/cpp/BUILD.gn +++ b/entry/src/main/cpp/BUILD.gn @@ -1,4 +1,4 @@ -# judge library build +# FFmpeg build import("//build/ohos.gni") @@ -14,21 +14,24 @@ ohos_source_set("judge_dynamic") { "sdk/api/js/JSTypedef.cpp", "sdk/api/platform/JudgeApiFactory.cpp", "sdk/api/platform/JudgeSdk.cpp", - "sdk/common/CostTimeHelper.cpp", + "sdk/common/CleverHelper.cpp", "sdk/common/CryptoAlgorithm.cpp", + "sdk/common/HSystem.cpp", + "sdk/common/HVersion.cpp", "sdk/common/Loggerxx.cpp", - "sdk/common/ProfilerHelper.cpp", - "sdk/common/TAssert.cpp", "sdk/common/TQueue.cpp", "sdk/common/TimerPool.cpp", "sdk/common/Tools.cpp", + "sdk/database/IDBTables.cpp", "sdk/database/carinfo/CarInfoTable.cpp", - "sdk/database/mark/MarkItemRule.cpp", + "sdk/database/iteminfo/ItemInfoTable.cpp", + "sdk/database/mappoint/MapPointItemTable.cpp", + "sdk/database/mappoint/MapPointTable.cpp", "sdk/database/mark/MarkTable.cpp", "sdk/database/sysparm/SysParmTable.cpp", "sdk/database/sysset/SysSetTable.cpp", - "sdk/database/sysset/XSysSet.cpp", - "sdk/exam/ExamCar.cpp", + "sdk/exam/ExamCarSub2.cpp", + "sdk/exam/ExamCarSub3.cpp", "sdk/exam/ExamDatagram.cpp", "sdk/exam/ExamHistory.cpp", "sdk/exam/ExamSensor.cpp", @@ -39,29 +42,55 @@ ohos_source_set("judge_dynamic") { "sdk/graphic/IGraphicAbstract.cpp", "sdk/judge/IJudgeBrokerInterface.cpp", "sdk/judge/IJudgeItem.cpp", - "sdk/judge/JudgeItemFactory.cpp", - "sdk/judge/sub2/ISub2Judge.cpp", - "sdk/judge/sub2/Sub2JudgeCftc.cpp", - "sdk/judge/sub2/Sub2JudgeComm.cpp", - "sdk/judge/sub2/Sub2JudgeDcrk.cpp", - "sdk/judge/sub2/Sub2JudgePdqb.cpp", - "sdk/judge/sub2/Sub2JudgeQxxs.cpp", - "sdk/judge/sub2/Sub2JudgeZjzw.cpp", - "sdk/judge/sub3/ISub3Judge.cpp", + "sdk/judge/sub2/ISub2JudgeItem.cpp", + "sdk/judge/sub2/ISub2JudgeWrap.cpp", + "sdk/judge/sub2/Sub2Judge00Dcrk.cpp", + "sdk/judge/sub2/Sub2Judge02Pdqb.cpp", + "sdk/judge/sub2/Sub2Judge03Cftc.cpp", + "sdk/judge/sub2/Sub2Judge05Qxxs.cpp", + "sdk/judge/sub2/Sub2Judge06Zjzw.cpp", + "sdk/judge/sub2/Sub2Judge20Comm.cpp", + "sdk/judge/sub3/ISub3JudgeItem.cpp", + "sdk/judge/sub3/ISub3JudgeWrap.cpp", + "sdk/judge/sub3/Sub3Judge01Sczb.cpp", + "sdk/judge/sub3/Sub3Judge02Qbxx.cpp", + "sdk/judge/sub3/Sub3Judge03Zxxs.cpp", + "sdk/judge/sub3/Sub3Judge04Bgcd.cpp", + "sdk/judge/sub3/Sub3Judge05Lkzx.cpp", + "sdk/judge/sub3/Sub3Judge06Rxhd.cpp", + "sdk/judge/sub3/Sub3Judge07Xxqy.cpp", + "sdk/judge/sub3/Sub3Judge08Gjzt.cpp", + "sdk/judge/sub3/Sub3Judge09Hcxx.cpp", + "sdk/judge/sub3/Sub3Judge10Ccxx.cpp", + "sdk/judge/sub3/Sub3Judge11Kbtc.cpp", + "sdk/judge/sub3/Sub3Judge12Dtxx.cpp", + "sdk/judge/sub3/Sub3Judge12Lkdt.cpp", + "sdk/judge/sub3/Sub3Judge12Ptdt.cpp", + "sdk/judge/sub3/Sub3Judge13Yjxs.cpp", + "sdk/judge/sub3/Sub3Judge14Jjdw.cpp", + "sdk/judge/sub3/Sub3Judge15Lkzz.cpp", + "sdk/judge/sub3/Sub3Judge16Lkyz.cpp", + "sdk/judge/sub3/Sub3Judge20Comm.cpp", + "sdk/judge/sub3/Sub3Judge41Mndg.cpp", "sdk/parser/XIParser.cpp", "sdk/parser/XParser.cpp", "sdk/parser/XParser2.cpp", "sdk/survey/ISurveyCar.cpp", "sdk/survey/ISurveyItem.cpp", - "sdk/survey/SurveyFactory.cpp", + "sdk/survey/ISurveySubject.cpp", "sdk/survey/car/SurveyCar.cpp", + "sdk/survey/sub2/ISub2SurveyFactory.cpp", "sdk/survey/sub2/ISub2SurveyItem.cpp", "sdk/survey/sub2/Sub2SurveyCftc.cpp", "sdk/survey/sub2/Sub2SurveyDcrk.cpp", "sdk/survey/sub2/Sub2SurveyPdqb.cpp", "sdk/survey/sub2/Sub2SurveyQxxs.cpp", "sdk/survey/sub2/Sub2SurveyZjzw.cpp", + "sdk/survey/sub3/ISub3SurveyFactory.cpp", "sdk/survey/sub3/ISub3SurveyItem.cpp", + "sdk/survey/sub3/Sub3MeshDefines.cpp", + "sdk/survey/sub3/Sub3SurveyRoads.cpp", + "sdk/survey/sub3/Sub3SurveySharps.cpp", "sdk/track/TrackReader.cpp", "sdk/track/TrackWriter.cpp", "sdk/utility/Geometry.cpp", @@ -79,7 +108,7 @@ ohos_source_set("judge_dynamic") { "third/libb64/base64.cpp", "third/libb64/cdecode.c", "third/libb64/cencode.c", - "third/tinyxml2-9.0.0/tinyxml2.cpp" + "third/tinyxml2-9.0.0/tinyxml2.cpp", ] include_dirs = [ "sdk", @@ -92,6 +121,8 @@ ohos_source_set("judge_dynamic") { "sdk/common", "sdk/database", "sdk/database/carinfo", + "sdk/database/iteminfo", + "sdk/database/mappoint", "sdk/database/mark", "sdk/database/sysparm", "sdk/database/sysset", @@ -133,24 +164,30 @@ ohos_source_set("judge_dynamic") { "__OHOS_FAMILY__", ] cflags = [ + "-Wno-implicit-fallthrough", + "-Wno-unused-private-field", + "-Wunknown-warning-option", + "-Wno-unused-const-variable", "-Wno-unused-variable", "-Wno-deprecated-declarations", "-Wno-unused-command-line-argument", "-Wno-tautological-constant-out-of-range-compare", "-Wno-unused-function", "-Wno-unused-parameter", - "-Wno-unused-but-set-variable", "-fexceptions", ] cflags_cc = [ + "-Wno-implicit-fallthrough", + "-Wno-unused-private-field", + "-Wunknown-warning-option", + "-Wno-unused-const-variable", "-Wno-unused-variable", "-Wno-deprecated-declarations", "-Wno-unused-command-line-argument", "-Wno-tautological-constant-out-of-range-compare", "-Wno-unused-function", "-Wno-unused-parameter", - "-Wno-unused-but-set-variable", "-fexceptions", "-std=c++17", "-stdlib=libc++", diff --git a/entry/src/main/cpp/CMakeLists.txt b/entry/src/main/cpp/CMakeLists.txt index ebea41dd..eeb186f2 100644 --- a/entry/src/main/cpp/CMakeLists.txt +++ b/entry/src/main/cpp/CMakeLists.txt @@ -108,6 +108,8 @@ if(WIN32) message("${MSG_NOTE} host is windows system.") add_compile_options(/W3 /wd4100 /wd4309 /wd4068 /wd4244 /wd4626 /wd4251 /wd4267 /wd4065 /wd4189 /wd4717 /wd4505) + # C2026: 字符串太大,已截断尾部字符(/Zc:strictStrings 或 /Tc编译器开关) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{CFLAGS} /bigobj") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{CXXFLAGS} /bigobj") @@ -119,6 +121,7 @@ if(WIN32) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /INCREMENTAL:YES" ) #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:104857600") + elseif(UNIX) message("${MSG_NOTE} host is linux system.") diff --git a/entry/src/main/cpp/bin/extract_h_cpp_files.txt b/entry/src/main/cpp/bin/extract_h_cpp_files.txt index a1a4940c..9c3c0abc 100644 --- a/entry/src/main/cpp/bin/extract_h_cpp_files.txt +++ b/entry/src/main/cpp/bin/extract_h_cpp_files.txt @@ -8,23 +8,24 @@ "sdk/api/js/JSTypedef.cpp", "sdk/api/platform/JudgeApiFactory.cpp", "sdk/api/platform/JudgeSdk.cpp", - "sdk/common/CostTimeHelper.cpp", + "sdk/common/CleverHelper.cpp", "sdk/common/CryptoAlgorithm.cpp", + "sdk/common/HSystem.cpp", + "sdk/common/HVersion.cpp", "sdk/common/Loggerxx.cpp", - "sdk/common/ProfilerHelper.cpp", - "sdk/common/TAssert.cpp", "sdk/common/TQueue.cpp", "sdk/common/TimerPool.cpp", "sdk/common/Tools.cpp", - "sdk/database/IDatabaseTable.cpp", + "sdk/database/IDBTables.cpp", "sdk/database/carinfo/CarInfoTable.cpp", + "sdk/database/iteminfo/ItemInfoTable.cpp", "sdk/database/mappoint/MapPointItemTable.cpp", "sdk/database/mappoint/MapPointTable.cpp", - "sdk/database/mark/MarkItemRule.cpp", "sdk/database/mark/MarkTable.cpp", "sdk/database/sysparm/SysParmTable.cpp", "sdk/database/sysset/SysSetTable.cpp", - "sdk/exam/ExamCar.cpp", + "sdk/exam/ExamCarSub2.cpp", + "sdk/exam/ExamCarSub3.cpp", "sdk/exam/ExamDatagram.cpp", "sdk/exam/ExamHistory.cpp", "sdk/exam/ExamSensor.cpp", @@ -35,15 +36,36 @@ "sdk/graphic/IGraphicAbstract.cpp", "sdk/judge/IJudgeBrokerInterface.cpp", "sdk/judge/IJudgeItem.cpp", - "sdk/judge/JudgeItemFactory.cpp", - "sdk/judge/sub2/ISub2Judge.cpp", - "sdk/judge/sub2/Sub2JudgeCftc.cpp", - "sdk/judge/sub2/Sub2JudgeComm.cpp", - "sdk/judge/sub2/Sub2JudgeDcrk.cpp", - "sdk/judge/sub2/Sub2JudgePdqb.cpp", - "sdk/judge/sub2/Sub2JudgeQxxs.cpp", - "sdk/judge/sub2/Sub2JudgeZjzw.cpp", - "sdk/judge/sub3/ISub3Judge.cpp", + "sdk/judge/sub2/ISub2JudgeItem.cpp", + "sdk/judge/sub2/ISub2JudgeWrap.cpp", + "sdk/judge/sub2/Sub2Judge00Dcrk.cpp", + "sdk/judge/sub2/Sub2Judge02Pdqb.cpp", + "sdk/judge/sub2/Sub2Judge03Cftc.cpp", + "sdk/judge/sub2/Sub2Judge05Qxxs.cpp", + "sdk/judge/sub2/Sub2Judge06Zjzw.cpp", + "sdk/judge/sub2/Sub2Judge20Comm.cpp", + "sdk/judge/sub3/ISub3JudgeItem.cpp", + "sdk/judge/sub3/ISub3JudgeWrap.cpp", + "sdk/judge/sub3/Sub3Judge01Sczb.cpp", + "sdk/judge/sub3/Sub3Judge02Qbxx.cpp", + "sdk/judge/sub3/Sub3Judge03Zxxs.cpp", + "sdk/judge/sub3/Sub3Judge04Bgcd.cpp", + "sdk/judge/sub3/Sub3Judge05Lkzx.cpp", + "sdk/judge/sub3/Sub3Judge06Rxhd.cpp", + "sdk/judge/sub3/Sub3Judge07Xxqy.cpp", + "sdk/judge/sub3/Sub3Judge08Gjzt.cpp", + "sdk/judge/sub3/Sub3Judge09Hcxx.cpp", + "sdk/judge/sub3/Sub3Judge10Ccxx.cpp", + "sdk/judge/sub3/Sub3Judge11Kbtc.cpp", + "sdk/judge/sub3/Sub3Judge12Dtxx.cpp", + "sdk/judge/sub3/Sub3Judge12Lkdt.cpp", + "sdk/judge/sub3/Sub3Judge12Ptdt.cpp", + "sdk/judge/sub3/Sub3Judge13Yjxs.cpp", + "sdk/judge/sub3/Sub3Judge14Jjdw.cpp", + "sdk/judge/sub3/Sub3Judge15Lkzz.cpp", + "sdk/judge/sub3/Sub3Judge16Lkyz.cpp", + "sdk/judge/sub3/Sub3Judge20Comm.cpp", + "sdk/judge/sub3/Sub3Judge41Mndg.cpp", "sdk/parser/XIParser.cpp", "sdk/parser/XParser.cpp", "sdk/parser/XParser2.cpp", @@ -93,6 +115,7 @@ "sdk/common", "sdk/database", "sdk/database/carinfo", + "sdk/database/iteminfo", "sdk/database/mappoint", "sdk/database/mark", "sdk/database/sysparm", diff --git a/entry/src/main/cpp/sdk/api/include/JudgeSdk.h b/entry/src/main/cpp/sdk/api/include/JudgeSdk.h index d63501ae..99ee118e 100644 --- a/entry/src/main/cpp/sdk/api/include/JudgeSdk.h +++ b/entry/src/main/cpp/sdk/api/include/JudgeSdk.h @@ -67,6 +67,7 @@ typedef int (JUDGE_SDK_METHOD *examJudgeSetRealExamCallbackHandle) (exam typedef int (JUDGE_SDK_METHOD *examJudgeSetPerformCallbackHandle) (examJudgeCallbackPerform callback); typedef int (JUDGE_SDK_METHOD *examJudgeArtificialMarkHandle) (int itemno, const char* serial); typedef int (JUDGE_SDK_METHOD *examJudgeArtificialItemHandle) (int itemno, int type); +typedef int (JUDGE_SDK_METHOD *examJudgeSoundEndHandle) (int itemno, const char* code, int type); typedef const char* (JUDGE_SDK_METHOD *examJudgeTrackFileHandle) (); typedef int (JUDGE_SDK_METHOD *examJudgeMapSetParamHandle) (int width, int height); typedef int (JUDGE_SDK_METHOD *examJudgeMapSetScalingHandle) (int scaling); @@ -89,7 +90,7 @@ typedef const char* (JUDGE_SDK_METHOD *examJudgeMapImageSetCallbackHandle) (exam JUDGE_SDK_API const char* JUDGE_SDK_METHOD examJudgeVersion(); /* - * 说明: 设置日志等级和日志回调函数 + * 说明: 设置日志级别和回调函数 * 参数: level:日志等级,级别范围[0-7],0是关闭日志,7是日志全部输出,数字越大日志输出越多 * callback:回调函数指针,注意:回调函数里严禁有耗时操作 * 关闭[0] 错误[1] 警告[2] 跟踪[3] 信息[4] 流水[5] 调试[6] 全部[7] @@ -167,6 +168,14 @@ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialMark(int itemno, const cha */ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialItem(int itemno, int type); +/* + * 说明: 语音播报结束 + * 参数: itemno:项目代码,语音播报事件7的xmdm参数 code:语音代码,语音播报事件7的code参数 type:语音类型,语音播报事件7的type参数, + * 目前只有语音播报事件7的type参数类型为1(模拟灯光的项目语音)的时候才能调此函数 + * 返回值:调用执行结果错误码 0:成功,其他:失败 + */ +JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeSoundEnd(int itemno, const char* code, int type); + /* * 说明: 获取轨迹文件 * 参数: (无) @@ -177,7 +186,7 @@ JUDGE_SDK_API const char* JUDGE_SDK_METHOD examJudgeTrackFile(); /* * 说明: 设置地图轨迹图像参数 - * 参数: width::绘制的图片的宽,height:绘制的图片的高 一般参考值是640x480 + * 参数: width:绘制的图片的宽,height:绘制的图片的高 一般参考值是640x480 * 返回值: 调用执行结果错误码 0:成功,其他:失败 */ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeMapSetParam(int width, int height); diff --git a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp index cedab240..bd51c6f9 100644 --- a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp +++ b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp @@ -148,6 +148,17 @@ jint JNI_JUDGE_FUN_IMPL(examJudgeArtificialItem)(JNIEnv* env, jobject thiz, jint return (jint)QE((ErrorCode)code); } +jint JNI_JUDGE_FUN_IMPL(examJudgeSoundEnd)(JNIEnv* env, jobject thiz, jint itemno, jstring code, jint type) +{ + logdebug("call JNI_examJudgeSoundEnd"); + const char* soundCode = env->GetStringUTFChars(code, NULL); + //jsize size = env->GetStringUTFLength(data); + //TASSERT(buf != nullptr && size == len, ""); + int errCode = ExamService::examJudgeSoundEnd(itemno, soundCode, type); + env->ReleaseStringUTFChars(code, soundCode); + return (jint)QE((ErrorCode)errCode); +} + jstring JNI_JUDGE_FUN_IMPL(examJudgeTrackFile)(JNIEnv* env, jobject thiz) { logdebug("call JNI_examJudgeTrackFile"); diff --git a/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp b/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp index 06279a29..2f865290 100644 --- a/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp +++ b/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp @@ -18,6 +18,7 @@ JNIMethodTable::JNIMethodTable() jniSign(JNI_RET(jint), JNI_FUN(examJudgeSetPerformCallback)); // "()I" jniSign(JNI_RET(jint), JNI_FUN(examJudgeArtificialMark), JNI_ARG(jint), JNI_ARG(jstring)); // "(ILjava/lang/String;)I" jniSign(JNI_RET(jint), JNI_FUN(examJudgeArtificialItem), JNI_ARG(jint), JNI_ARG(jint)); // "(II)I" + jniSign(JNI_RET(jint), JNI_FUN(examJudgeSoundEnd), JNI_ARG(jint), JNI_ARG(jstring), JNI_ARG(jint)); // "(ILjava/lang/String;I)I" jniSign(JNI_RET(jstring), JNI_FUN(examJudgeTrackFile)); // "()Ljava/lang/String;" jniSign(JNI_RET(jint), JNI_FUN(examJudgeMapSetParam), JNI_ARG(jint), JNI_ARG(jint)); // "(II)I" jniSign(JNI_RET(jint), JNI_FUN(examJudgeMapSetScaling), JNI_ARG(jint)); // "(I)I" diff --git a/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp b/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp index 839e6acb..ac49cbfe 100644 --- a/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp +++ b/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp @@ -295,6 +295,28 @@ JS_JUDGE_FUN_IMPL(examJudgeArtificialItem) return createErrorCode(env, code); } +JS_JUDGE_FUN_IMPL(examJudgeSoundEnd) +{ + logdebug("call js_examJudgeSoundEnd"); + size_t argc = 3; napi_value args[3] = {nullptr}; + + if(!getArg(env, cbinfo, argc, args)) + { + return createErrorCode(env, errorNapiArgCount); + } + + int itemno = 0; + std::string code = ""; + int type = 0; + if(!getInt(env, args[0], itemno) || !getString(env, args[1], code) || !getInt(env, args[2], type)) + { + return createErrorCode(env, errorNapiArgType); + } + + int errCode = ExamService::examJudgeSoundEnd(itemno, code.c_str(), type); + return createErrorCode(env, errCode); +} + JS_JUDGE_FUN_IMPL(examJudgeTrackFile) { logdebug("call js_examJudgeTrackFile"); diff --git a/entry/src/main/cpp/sdk/api/js/JSApiBridge.h b/entry/src/main/cpp/sdk/api/js/JSApiBridge.h index 63f5c46a..0c6ec7b9 100644 --- a/entry/src/main/cpp/sdk/api/js/JSApiBridge.h +++ b/entry/src/main/cpp/sdk/api/js/JSApiBridge.h @@ -32,6 +32,7 @@ public: JS_JUDGE_FUN_DECL(examJudgeSetPerformCallback); JS_JUDGE_FUN_DECL(examJudgeArtificialMark); JS_JUDGE_FUN_DECL(examJudgeArtificialItem); + JS_JUDGE_FUN_DECL(examJudgeSoundEnd); JS_JUDGE_FUN_DECL(examJudgeTrackFile); JS_JUDGE_FUN_DECL(examJudgeMapSetParam); JS_JUDGE_FUN_DECL(examJudgeMapSetScaling); diff --git a/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp b/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp index 357aeadd..8f230601 100644 --- a/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp +++ b/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp @@ -19,6 +19,7 @@ JS_JUDGE_API_JOIN(examJudgeSetRealExamCallback); JS_JUDGE_API_JOIN(examJudgeSetPerformCallback); JS_JUDGE_API_JOIN(examJudgeArtificialMark); JS_JUDGE_API_JOIN(examJudgeArtificialItem); +JS_JUDGE_API_JOIN(examJudgeSoundEnd); JS_JUDGE_API_JOIN(examJudgeTrackFile); JS_JUDGE_API_JOIN(examJudgeMapSetParam); JS_JUDGE_API_JOIN(examJudgeMapSetScaling); @@ -48,6 +49,7 @@ static napi_value JS_JUDGE_MODULE_EXPORT(napi_env env, napi_value exports) JS_JUDGE_CAT_DESC(examJudgeSetPerformCallback), JS_JUDGE_CAT_DESC(examJudgeArtificialMark), JS_JUDGE_CAT_DESC(examJudgeArtificialItem), + JS_JUDGE_CAT_DESC(examJudgeSoundEnd), JS_JUDGE_CAT_DESC(examJudgeTrackFile), JS_JUDGE_CAT_DESC(examJudgeMapSetParam), JS_JUDGE_CAT_DESC(examJudgeMapSetScaling), @@ -89,7 +91,7 @@ static napi_value JS_JUDGE_MODULE_EXPORT(napi_env env, napi_value exports) // EXTERN_C_END -NAPI_MODULE(JS_JUDGE_MODULE_NAME, JS_JUDGE_MODULE_EXPORT); +NAPI_MODULE(JudgeSdk, JS_JUDGE_MODULE_EXPORT); //****************************************************************** @@ -107,6 +109,7 @@ JNI_JUDGE_API_JOIN(jint, examJudgeSetRealExamCallback, (JNIEnv* env, jobje JNI_JUDGE_API_JOIN(jint, examJudgeSetPerformCallback, (JNIEnv* env, jobject thiz), (env,thiz)); JNI_JUDGE_API_JOIN(jint, examJudgeArtificialMark, (JNIEnv* env, jobject thiz, jint itemno, jstring serial), (env,thiz,itemno,serial)); JNI_JUDGE_API_JOIN(jint, examJudgeArtificialItem, (JNIEnv* env, jobject thiz, jint itemno, jint type), (env,thiz,itemno,type)); +JNI_JUDGE_API_JOIN(jint, examJudgeSoundEnd, (JNIEnv* env, jobject thiz, jint itemno, jstring code, jint type), (env,thiz,itemno,code,type)); JNI_JUDGE_API_JOIN(jstring, examJudgeTrackFile, (JNIEnv* env, jobject thiz), (env, thiz)); JNI_JUDGE_API_JOIN(jint, examJudgeMapSetParam, (JNIEnv* env, jobject thiz, jint width, jint height), (env,thiz,width,height)); JNI_JUDGE_API_JOIN(jint, examJudgeMapSetScaling, (JNIEnv* env, jobject thiz, jint scaling), (env,thiz,scaling)); @@ -153,6 +156,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) JNI_JUDGE_CHECK_METHOD(examJudgeSetPerformCallback); JNI_JUDGE_CHECK_METHOD(examJudgeArtificialMark); JNI_JUDGE_CHECK_METHOD(examJudgeArtificialItem); + JNI_JUDGE_CHECK_METHOD(examJudgeSoundEnd); JNI_JUDGE_CHECK_METHOD(examJudgeTrackFile); JNI_JUDGE_CHECK_METHOD(examJudgeMapSetParam); JNI_JUDGE_CHECK_METHOD(examJudgeMapSetScaling); @@ -174,6 +178,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) JNI_JUDGE_CAT_DESC(examJudgeSetPerformCallback), JNI_JUDGE_CAT_DESC(examJudgeArtificialMark), JNI_JUDGE_CAT_DESC(examJudgeArtificialItem), + JNI_JUDGE_CAT_DESC(examJudgeSoundEnd), JNI_JUDGE_CAT_DESC(examJudgeTrackFile), JNI_JUDGE_CAT_DESC(examJudgeMapSetParam), JNI_JUDGE_CAT_DESC(examJudgeMapSetScaling), @@ -287,6 +292,11 @@ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialItem(int itemno, int type) return FactoryExamApi->examJudgeArtificialItem(itemno, type); } +JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeSoundEnd(int itemno, const char* code, int type) +{ + return FactoryExamApi->examJudgeSoundEnd(itemno, code, type); +} + JUDGE_SDK_API const char* JUDGE_SDK_METHOD examJudgeTrackFile() { return FactoryExamApi->examJudgeTrackFile(); diff --git a/entry/src/main/cpp/sdk/common/CleverHelper.h b/entry/src/main/cpp/sdk/common/CleverHelper.h index 68812cc7..d2dddb93 100644 --- a/entry/src/main/cpp/sdk/common/CleverHelper.h +++ b/entry/src/main/cpp/sdk/common/CleverHelper.h @@ -308,6 +308,13 @@ private: * */ +/* + * 单元测试运行命令,windows + * start ./test_sdk.exe --gtest_filter=TestJudge.test_sub3_car_test_jinan + * start ./test_sdk.exe --gtest_filter=TestJudge.test_sub3_car_test_* + * + * + */ diff --git a/entry/src/main/cpp/sdk/common/HEnum.h b/entry/src/main/cpp/sdk/common/HEnum.h index 0dcf5627..2e0681cf 100644 --- a/entry/src/main/cpp/sdk/common/HEnum.h +++ b/entry/src/main/cpp/sdk/common/HEnum.h @@ -96,6 +96,8 @@ #define ENUM_BUILD_KEY2_MAP1_CMD4(p1,p2,p3,p4) {p2,p1}, #define ENUM_BUILD_KEY1_MAP2_CMD4(p1,p2,p3,p4) {p1,p2}, #define ENUM_BUILD_KEY3_MAP1_CMD4(p1,p2,p3,p4) {p3,p1}, +#define ENUM_BUILD_KEY3_MAP4_CMD4(p1,p2,p3,p4) {p3,p4}, +#define ENUM_BUILD_KEY3_MAP2_CMD4(p1,p2,p3,p4) {p3,p2}, #define ENUM_BUILD_KEY4_MAP1_CMD4(p1,p2,p3,p4) {p4,p1}, diff --git a/entry/src/main/cpp/sdk/common/HSystem.h b/entry/src/main/cpp/sdk/common/HSystem.h index da6420da..18a7ef58 100644 --- a/entry/src/main/cpp/sdk/common/HSystem.h +++ b/entry/src/main/cpp/sdk/common/HSystem.h @@ -110,19 +110,29 @@ *** JUDGE_USE_PERF //是否启用CPU性能分析 *** JUDGE_USE_LEAK //是否启用内存泄露检测 *** JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作 - *** + *** JUDGE_USE_INSPECT //是否启用无锡科研所送检模式 ********************************************************************/ +/* + * 是否启用日志功能模块 + */ #define JUDGE_USE_LOG -#if defined(JUDGE_OS_OHOS) || defined(JUDGE_DEBUG___) +/* + * 是否启用一些调试用的信息,开发用 + */ +#if defined(JUDGE_OS_OHOS) || defined(JUDGE_OS_ANDROID) || defined(JUDGE_DEBUG__) #define JUDGE_USE_STRICT //是否启用外壳APP侧传入参数严格检查 - #define JUDGE_USE_CODE //是否启用系统在返回错误码的时候输出日志 + +#endif + +#define JUDGE_USE_CODE //是否启用系统在返回错误码的时候输出日志 + +#if 0 #define JUDGE_USE_COST //是否启用函数执行耗时检测 #define JUDGE_USE_MEMORY //是否启用内存操作检查 #define JUDGE_USE_POOL //是否启用内存池调试信息 - #endif /* @@ -144,11 +154,47 @@ * JUDGE_COMPILE_TARGET_TEST_STATIC */ #if defined(JUDGE_OS_LINUX) && defined(JUDGE_COMPILE_TARGET_TEST_SDK) - //#define JUDGE_USE_PERF //是否启用CPU性能分析 - //#define JUDGE_USE_LEAK //是否启用内存泄露检测 - //#define JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作 + //#define JUDGE_USE_PERF //是否启用CPU性能分析 + //#define JUDGE_USE_LEAK //是否启用内存泄露检测 + //#define JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作 #endif +/* + * 是否启用无锡科研所送检模式 + * 作者: 杨海洋 + * 日期: 2023-06-05 + * + * 注意事项: + * 1.所有减速相关的,只判刹车信号,不判其他的如速度等 + * 2.会车项目单向会车必须要有停车动作,双向会车靠右行驶即可 + * 3.无锡所测试转向灯信号,都是一闪一闪的,外面实际使用评判都是持续的信号,比如连续几秒打灯才算,无锡所送检这块要处理下,如果连续5帧或者6帧数据没有信号才算没打灯 + * 4.连续变更车道评判下达指令类的不进行该项评判,在连续触发性指令不触发评判; + * 5.观察类的项目通过学校区域、公交站台、人行横道进项目不应该有语音通知,出学校区域应该有语音通知 + * 6.通过学校区域速度全程不能超过30km/h + * 7.变更车道如果是项目内以车身碰到线就算时间前3秒打灯,如果是项目外(通用评判)以车身过一半为准(就是中心点33点过没过线为准) + * 11.小车必须1档起步 + * 12.空挡滑行,原始挡位值必须是0,并且是前进状态就算空挡滑行 + * + * + * 1.无锡所检测GPS速度不需要乘以1.852系数,都是转化过的实际速度 + * 2.路口直行和路口右转用的是路口集合模型,路口左转和路口掉头用的单独的模型目录(由于左转和掉头不在1号线路所以读不到进不去) + * 3.如果是2019年mdb标准要用mdb_update.exe工具升级扣分表等 + * 4.考试线路wayno全部选1号线路 + * 5.屏蔽模拟灯光 CallMoNiDengGuang、屏蔽起步、//屏蔽上车准备 + * 6.参数平台检测 + * 靠边停车-1921用例 319参数:里程不够不报靠边停车(0-否 1-是 2-必考项目未完成且里程不够不报项目) + * 连续变道 512参数 + * 0,0,0,0,0,0,0,0,1^60^0^10, + * 0,1,0,0,0,0,0,0,1^60^0^10, + * 7.下一次再去无锡所检测,左转弯要用原始的ret2000 + * + * + * + */ +//#define JUDGE_USE_INSPECT + + + /* * 基础整数类型定义 * @@ -172,7 +218,6 @@ JUDGE_C_API int __sdk_rmdir__(const char* __path); JUDGE_C_API bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); JUDGE_C_API bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); - #if defined(JUDGE_OS_WIN) # define __sdk_os_assert__(exp) _wassert(_CRT_WIDE(exp), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)) #elif defined(JUDGE_OS_OHOS) @@ -185,6 +230,16 @@ JUDGE_C_API bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* # define __sdk_os_assert__(exp) assert(false) #endif +#ifdef JUDGE_OS_ANDROID + //using namespace std::filesystem; + using std::filesystem::directory_iterator; + using std::filesystem::path; +#else + //using namespace std::experimental::filesystem; + using std::experimental::filesystem::directory_iterator; + using std::experimental::filesystem::path; +#endif + #if defined(JUDGE_OS_FAMILY_WINDOWS) diff --git a/entry/src/main/cpp/sdk/common/Loggerxx.cpp b/entry/src/main/cpp/sdk/common/Loggerxx.cpp index e52fbf9c..782727b6 100644 --- a/entry/src/main/cpp/sdk/common/Loggerxx.cpp +++ b/entry/src/main/cpp/sdk/common/Loggerxx.cpp @@ -30,7 +30,7 @@ bool Loggerxx::init(int level, bool async, const std::string& dir, int days, lon m_pWriteList = &m_writeList; m_pReadList = &m_readList; m_run.exchange(true); //要先设置为true防止线程启动退出 - m_thread = __NEW__(std::thread, [&, this]()->void { running(); }); + m_thread = __NEW__(std::thread, [&, this]()->void { running(); }); //detach线程不能被join } m_init = true; return true; @@ -42,7 +42,7 @@ void Loggerxx::uninit() m_run.exchange(false); if(m_thread && m_thread->joinable()) { - m_thread->join(); + m_thread->join(); //detach线程不能被join } __DELETE__(m_thread); //m_th.exit(); diff --git a/entry/src/main/cpp/sdk/common/Tools.cpp b/entry/src/main/cpp/sdk/common/Tools.cpp index 4d45957b..c92304dc 100644 --- a/entry/src/main/cpp/sdk/common/Tools.cpp +++ b/entry/src/main/cpp/sdk/common/Tools.cpp @@ -594,14 +594,6 @@ int Tools::writeFileText(const std::string& filepath, const std::string& content std::vector Tools::getFiles(const std::string& dirpath) { -#ifdef JUDGE_OS_ANDROID - using std::filesystem::directory_iterator; - using std::filesystem::path; -#else - using std::experimental::filesystem::directory_iterator; - using std::experimental::filesystem::path; -#endif - std::vector files; for(auto& v : directory_iterator(dirpath)) { @@ -613,6 +605,32 @@ std::vector Tools::getFiles(const std::string& dirpath) return files; } +std::vector Tools::getFiles2(const std::string& dirpath) +{ + std::vector files; + for(auto& v : directory_iterator(dirpath)) + { + path fi = v.path(); + std::string filename = fi.string(); //fi.filename().string(); + if(is_directory(fi)) + { + files.push_back(filename); + auto s = getFiles2(filename); + files.insert(files.end(), s.begin(), s.end()); + } + else + { + files.push_back(filename); + } + } + return files; +} + +bool Tools::isDirectory(const std::string& filepath) +{ + return is_directory(path(filepath)); +} + bool Tools::removeFile(const std::string& filepath) { return ::remove(filepath.c_str()) == 0; diff --git a/entry/src/main/cpp/sdk/common/Tools.h b/entry/src/main/cpp/sdk/common/Tools.h index 25b76e78..9e601da9 100644 --- a/entry/src/main/cpp/sdk/common/Tools.h +++ b/entry/src/main/cpp/sdk/common/Tools.h @@ -155,8 +155,12 @@ public: static int writeFileText(const std::string& filepath, const std::string& content); - //遍历某个目录下所有文件 + //遍历某个目录获取所有文件和子目录 static std::vector getFiles(const std::string& filepath); + //递归某个目录获取所有文件和子目录 + static std::vector getFiles2(const std::string& dirpath); + //判断一个路径是文件还是目录 + static bool isDirectory(const std::string& filepath); //删除文件 static bool removeFile(const std::string& filepath); //删除目录,必须是空目录 diff --git a/entry/src/main/cpp/sdk/database/HDBTable.h b/entry/src/main/cpp/sdk/database/HDBTable.h index aa94e5e9..b6550609 100644 --- a/entry/src/main/cpp/sdk/database/HDBTable.h +++ b/entry/src/main/cpp/sdk/database/HDBTable.h @@ -119,6 +119,8 @@ namespace siteof siteof_declare(zjjh); siteof_declare(hbwhjz); siteof_declare(JXYTSF001); + siteof_declare(tcrx); //无锡所检测地点版本特殊 + } @@ -132,6 +134,7 @@ namespace siteof #define sound_sub2(a) static const std::string sub2_##a = #a; #define sound_sub3(a) static const std::string sub3_##a = #a; +#define sound_subx(a) static const std::string subx_##a = #a; namespace sound { //科目二 语音输出码 windows版对应语音文件 语音内容 @@ -182,6 +185,7 @@ namespace sound sound_sub3(4170016); // \sound\yj412.wav 夜间在照明不良的道路上行驶 sound_sub3(4170017); // \sound\yj332.wav 夜间左转 sound_sub3(4170018); // \sound\yj333.wav 夜间右转 + sound_sub3(4170019); // \sound\yj341.wav 夜间在有路灯的道路上行驶 sound_sub3(402001); // \sound\请起步.wav sound_sub3(403001); // \sound\直线行驶提示.wav sound_sub3(403002); // \sound\结束直线行驶.wav @@ -237,6 +241,14 @@ namespace sound sound_sub3(456001); // \sound\通过急弯.wav sound_sub3(458001); // \sound\通过拱桥.wav + sound_subx(exam_waiting); //exam_waiting.mp3 + sound_subx(ksks); //ksks.WAV + sound_subx(qualified); //qualified.mp3 + sound_subx(unqualified); //unqualified.mp3 + sound_subx(unqualified_one); //unqualified_one.wav + sound_subx(unqualified_two); //unqualified_two.wav + sound_subx(welcome); //welcome.wav + } diff --git a/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.cpp b/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.cpp index e9f98f9a..4ef87db4 100644 --- a/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.cpp +++ b/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.cpp @@ -2,11 +2,13 @@ bool MapPointItemTable::load(const TMap_Point_Items& mapPointItem) { +#ifndef JUDGE_USE_INSPECT //无锡所送检,起步项目ret2000可能没项目点,数据库标可能是空的 if(mapPointItem.empty()) { logerror("table map_point_item is empty!"); return false; } +#endif m_mapPointItem = mapPointItem; diff --git a/entry/src/main/cpp/sdk/database/sysset/SysSetTable.cpp b/entry/src/main/cpp/sdk/database/sysset/SysSetTable.cpp index aec4f214..d679a1c2 100644 --- a/entry/src/main/cpp/sdk/database/sysset/SysSetTable.cpp +++ b/entry/src/main/cpp/sdk/database/sysset/SysSetTable.cpp @@ -19,6 +19,15 @@ bool SysSetTable::load(const std::vector& sysset) } this->assign(); + + #ifdef JUDGE_USE_INSPECT + this->set606("1"); //无锡所检测科二所有项目都不能取消 + this->set318("4"); //会车减速类型只判脚刹,无锡所检测所有减速相关的,只判刹车信号,不判速度 + this->set522("1,30;1,30;"); //无锡所检测人行横道减速 + this->set363("1"); //无锡所踩下离合器也算空档滑行(0-否 1-是 2-2019年8月检测新规则) + //this->set512("0,1,0,0,0,0,0,0,1^60^0^10,"); + #endif + return m_syssets.size() > 0 && check(); } diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp index 6d528f4d..c5836e04 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp @@ -148,6 +148,13 @@ ErrorCode ExamCarSub2::examArtifItem(ExamItemCode itemno, ArtifItemType type) return QE(errorArtifItemEnter); } +ErrorCode ExamCarSub2::examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) +{ + //科二不支持语音播报结束调用 + TASSERT(false, "not-support!itemno=%d,code=%s,type=%d",itemno, code.c_str(), type); + return QE(errorArtifSoundEnd); +} + bool ExamCarSub2::examDrawMap() { return drawImageMap(); @@ -198,6 +205,14 @@ bool ExamCarSub2::sub2MarkItem(ExamItemCode itemNo, const std::string& serial, b logerror("not find mark-rule item=%d, serial=%s", itemNo, serial.c_str()); return false; } + + if(rule->markreal == 0) + { + loginfo("why mark-rule item=%d, serial=%s markreal=%d, real is 0 ? %s ", + itemNo, serial.c_str(), rule->markreal, rule->markshow.c_str()); + } + + const TGpsInfo& gps = historyGps(); int grade = rule->markreal; TMarkInfo mark(rule->itemno, rule->markserial, rule->markcatalog, gps.jd, gps.wd, GetCurrentTime2()); @@ -337,11 +352,12 @@ void ExamCarSub2::dealJudgeExam() //2.8)所有项目都已经做完 科目结束处理 //如果是考试模式,只要分数不合格就立即结束考试 +#ifndef JUDGE_USE_INSPECT if( (isExamMode() && !isQualified()) || allItemFinish() ) { createEventExamFinish(); } - +#endif } ISub2JudgeItem* ExamCarSub2::readEnterItem() @@ -369,12 +385,14 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem() //不考这个项目,直接略过 continue; } + #ifndef JUDGE_USE_INSPECT if(examItem->isFlagEnd()) { //已经考过,略过 logdebug("exam already itemNo=%d.", itemEnter->itemNo()); continue; } + #endif bool canEnter = itemEnter->dealJudgeEnter(); if(canEnter) { diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub2.h b/entry/src/main/cpp/sdk/exam/ExamCarSub2.h index bc1ee06b..36bc81b8 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub2.h +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub2.h @@ -28,6 +28,7 @@ public: //for IExamCar override virtual ErrorCode examJudgeExam() override; virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) override; virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) override; + virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) override; virtual bool examDrawMap() override; public: //for IExamCarSub2 override diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp index ee8f8f22..6363f622 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp @@ -1,5 +1,6 @@ #include "ExamCarSub3.h" #include "HFactory.h" +#include "Sub3Judge41Mndg.h" ExamCarSub3::ExamCarSub3() { @@ -178,11 +179,39 @@ ErrorCode ExamCarSub3::examArtifItem(ExamItemCode itemno, ArtifItemType type) return CallRenGongEnterItem(itemno) ? QE(codeSuccess) : QE(errorArtifItemEnter); case ArtifItemTypeCancel: return CallRenGongEnterItem(itemno) ? QE(codeSuccess) : QE(errorArtifItemCancel); + case ArtifItemTypeEnd: + return CallRenGongEndItem(itemno) ? QE(codeSuccess) : QE(errorArtifItemEnd); default: break; } return QE(errorArtifItemArg); } +ErrorCode ExamCarSub3::examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) +{ + if(type == PlaySoundEndNotify) + { + TASSERT(itemno == Sub3ItemType41Mndg, ""); + ISub3JudgeItem* item = findJudgeItem(Sub3ItemType41Mndg); + if(item) + { + Sub3Judge41Mndg* item41 = dynamic_cast(item); + TASSERT(item41 != nullptr, ""); + if(item41) + { + item41->playSoundEnd(code); + } + } + } + else + { + loginfo("sound-end itemno=%d, code=%s, type=%d", itemno, code.c_str(), type); + return QE(errorArtifSoundArg); + } + + return QE(errorArtifSoundEnd); +} + + bool ExamCarSub3::examDrawMap() { return DrawKM3Map(); @@ -567,6 +596,8 @@ bool ExamCarSub3::Init_KM3_Global(std::string& sError) examItem->Item_Color = itemStateWk; examItem->NoID = (parm1->TXT3 != "" ? true : false); //20180508 免考 + //logdebug("ItemNo=%d,NoID=%s,TXT3=%s", examItem->ItemNo, examItem->NoID ? "true":"false", parm1->TXT3.c_str()); + //加减挡免考 if(ksdd != siteof::chongqingkm3 && ksdd != siteof::jilinsongyuan && itemNo == Sub3ItemType14Jjdw) { @@ -1100,6 +1131,12 @@ void ExamCarSub3::Deal_KM3_Judge() { HELP_COST_TIME(""); + if(m_examState == examStateFinish || m_examState == examStateEnd) + { + logdebug("exam is over m_examState=%d", m_examState); + return; + } + //科三不能判断是否在差分状态,在每个项目里判断,因为,有些项目是传感信号评判 //if(!rtkEnabled()) //如果不在差分状态,跟我退出 //{ @@ -1107,33 +1144,32 @@ void ExamCarSub3::Deal_KM3_Judge() // return; //} - //1、计算考车位置 - //Calc_CarPos //在ExamSensor里面计算了 - //2、清空相关信息 - ClearRecord(); - //3、得到网格位置 - GetMeshIndex(); - //4、路段相关计算 - RTKJudge_Road(); - //5、形状线计算 - RTKJudge_SubItem(); - //6、计算前进和后退状态 - //GetCarDirStauts() + const TGpsInfo& gps = historyGps(); + const TGpsInfo& gps1 = historyGps(1); + if(gps.jd > 1 && gps.wd > 1 && gps1.jd > 1 && gps1.wd > 1) //rtkEnabled() + { + //1、计算考车位置 + //Calc_CarPos //在ExamSensor里面计算了 + //2、清空相关信息 + ClearRecord(); + //3、得到网格位置 + GetMeshIndex(); + //4、路段相关计算 + RTKJudge_Road(); + //5、形状线计算 + RTKJudge_SubItem(); + //6、计算前进和后退状态 + //GetCarDirStauts() - //距离计算 //7、计算科目三距离 - calcDistance(); //Calc_KM3JL() + //距离计算 //7、计算科目三距离 + calcDistance(); //Calc_KM3JL() + + Km3NewEnterItem(); + } m_KsLjLc = m_stuInfo.yklc + m_cg->ai_ljjl; m_cg->tkCnt = GetCurrentTick2(); - if(m_examState == examStateFinish || m_examState == examStateEnd) - { - logdebug("exam is over m_examState=%d", m_examState); - return; - } - - Km3NewEnterItem(); - //ToDo1:执行通用评判 m_commItem->dealJudgeItem(); @@ -2236,7 +2272,8 @@ void ExamCarSub3::RTKJudge_SubItem() //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; + m_SNO = 0; break; } } @@ -2247,7 +2284,8 @@ void ExamCarSub3::RTKJudge_SubItem() //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = SNO; + //RTKKM3.LS_ShapeNo = SNO; + m_SNO = SNO; RTKKM3.CrossPoint = subItem->Point2; const Pointi& p1 = subItem->Line3.PtBegin; @@ -2257,17 +2295,19 @@ void ExamCarSub3::RTKJudge_SubItem() RTKKM3.CrossShapeLength = std::round(std::sqrt(x*x + y*y)); break; } - if(RTKKM3.LS_ShapeNo == SNO) + if(m_SNO == SNO) //RTKKM3.LS_ShapeNo == SNO { if(GpsMath::IsCross(line, subItem->Line3)) { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr2; //中心点右侧 RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; + m_SNO = 0; } else if(GpsMath::IsCross(line, subItem->Line2)) { - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; + m_SNO = 0; } const Pointi& p1 = RTKKM3.CrossPoint; const Pointi& p2 = m_cg->body.b1_b; //CarStatus.BasePoint1_RealTime; @@ -2275,7 +2315,8 @@ void ExamCarSub3::RTKJudge_SubItem() int dis = std::round(std::sqrt(x*x + y*y)); //TempDis = Round(SQRT(SQR(TempPt1.X - TempPt2.X) + SQR(TempPt1.Y - TempPt2.Y))); if(dis > RTKKM3.CrossShapeLength * 3) //3--6 20170924 { - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; + m_SNO = 0; } } } @@ -2293,13 +2334,13 @@ void ExamCarSub3::RTKJudge_SubItem() { RTKKM3.InShapeAttr = TRTKResult::InShapeAttr1; //0-不在形状里 1-在人行道内 2-在网格线内 RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; } else if(itemNo == ItemNoTag53) //黄色网格线 { RTKKM3.InShapeAttr = TRTKResult::InShapeAttr2; RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; } break; } @@ -2308,7 +2349,7 @@ void ExamCarSub3::RTKJudge_SubItem() { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr3; RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; break; } else if(subName == SubNameTag4) //2个点关联的路口环岛线,外面几乎用不到,用于路口项目,不能读到这个路口环岛线,否则压扣分(Mark(5,'5'); @@ -2317,11 +2358,51 @@ void ExamCarSub3::RTKJudge_SubItem() { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr4; RTKKM3.ShapeNo = SNO; - RTKKM3.LS_ShapeNo = 0; + //RTKKM3.LS_ShapeNo = 0; break; } } } + +#ifdef JUDGE_USE_INSPECT + //解决无锡所路口左转227a用例误判问题 + //(*XLG_Modify 2024-06-06*) + //为了科研所检测 + RTKKM3.BodySharpData = ""; + for(int LoopI = 0; LoopI < 24; LoopI++) + { + line.PtBegin = m_cg->body.points_b[LoopI]; + line.PtEnd = his->body.points_b[LoopI]; + + for(int I = 0; I < curMesh->MapSubItemKeyLen; I++) + { + //CrossLineAttr //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 + int idx = curMesh->MapSubItem_Keys[I]; + const TMapSubItemRec* subItem = FactorySharps->getSharp(idx); + std::string subName = subItem->SubName; + int SNO = subItem->SNO; + //如果subName=0 路口停车线,2个点关联 + //如果subName=1 停车线关联,3个点关联 + //如果subName=2 人行横道或者黄色网格线 ,4个点关联 + //如果subName=3 等待线关联,2个点关联(深圳,在这个线上,处理特殊的等待业务) + //如果subName=4 2个点关联的路口环岛线,外面几乎用不到,用于路口项目,不能读到这个路口环岛线,否则压扣分(Mark(5,'5'); + if (std::atoi(subName.c_str()) == 1) + { + if(GpsMath::IsCross(line, subItem->Line1)) + { + //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 + std::string TempData = "," + std::to_string(SNO) + ","; + if(Tools::pos(TempData, RTKKM3.BodySharpData) == false) + { + RTKKM3.BodySharpData = RTKKM3.BodySharpData + TempData; + } + } + } + } + } + +#endif + } @@ -2577,8 +2658,11 @@ void ExamCarSub3::RepaintRoad(int width, int height) //如果subName=1 停车线关联,3个点关联 if(sharp->ItemNo == "5" || sharp->ItemNo == "8") { - m_graphic->drawLine(toPoint(sharp->Line1.PtBegin), toPoint(sharp->Line1.PtEnd), RGB_BLUE); - m_graphic->drawLine(toPoint(sharp->Line3.PtBegin), toPoint(sharp->Line3.PtEnd), RGB_BLUE); + //m_graphic->drawLine(toPoint(sharp->Line1.PtBegin), toPoint(sharp->Line1.PtEnd), RGB_BLUE); + //m_graphic->drawLine(toPoint(sharp->Line3.PtBegin), toPoint(sharp->Line3.PtEnd), RGB_BLUE); + m_graphic->drawLine(toPoint(sharp->Line1.PtBegin), toPoint(sharp->Line1.PtEnd), RGB_YELLOW); + m_graphic->drawLine(toPoint(sharp->Line2.PtBegin), toPoint(sharp->Line2.PtEnd), RGB_GREEN); + m_graphic->drawLine(toPoint(sharp->Line3.PtBegin), toPoint(sharp->Line3.PtEnd), RGB_RED); } else if(sharp->ItemNo == "6" || sharp->ItemNo == "53") @@ -3622,7 +3706,11 @@ bool ExamCarSub3::IsValid_Km3NewEnterItem(int ItemNo, const std::string& ItemSNo bool ExamCarSub3::KM3AllPass() { //训练模式不存在科目三结束,都是人工点击 结束按钮的 ,这里不考虑计时培训相关的业务和大监管相关的业务,只关心考试系统 - if(isExamDrill()) return false; + if(isExamDrill()) + { + return m_ctl.PassedItem.size() == m_sub3Items.size(); + //return false; + } //里程不够 if(isQualified()) //当前是合格的 @@ -4050,6 +4138,36 @@ bool ExamCarSub3::Mark(int ItemNo, const std::string& serial, bool OnlyOneID, bo return result; } +bool ExamCarSub3::CallRenGongCancelItem(int ItemNo) +{ + logwarning("CallRenGongCancelItem not support item=%d", ItemNo); + return false; +} + +bool ExamCarSub3::CallRenGongEndItem(int ItemNo) +{ + TKM3Item* item = findExamItem(ItemNo); + if(item == nullptr) + { + logwarning("CallRenGongEndItem:item=%d is null", ItemNo); + return false; + } + + if(item->TestPro > ItemProFlagIdle) + { + item->TestPro = ItemProFlagEnd; + return true; + } + else + { + logwarning("CallRenGongEndItem:%d,%d", ItemNo, item->TestPro); + return false; + } + + logerror("CallRenGongCancelItem error item=%d", ItemNo); + return false; +} + bool ExamCarSub3::CallRenGongEnterItem(int ItemNo) { //人工进项目 或者 人工取消项目 @@ -4073,8 +4191,11 @@ bool ExamCarSub3::CallRenGongEnterItem(int ItemNo) //如果会车不允许人工触发,就跟我退出 std::string str332 = "," + s332 + "," ; std::string strVal = "," + std::to_string(ItemNo) + ","; - if(Tools::pos(strVal, str332) == true) return false; - + if(Tools::pos(strVal, str332) == true) + { + logwarning("not allowed artificial enter item=%d 332=%s.", ItemNo, s332.c_str()); + return false; + } return If_EnterItem(ItemNo) && ManualStartItem(ItemNo); //进入或者取消项目 } } @@ -4151,6 +4272,12 @@ bool ExamCarSub3::If_EnterItem(int ItemNo) { result = false; } + + if(!result) + { + logerror("not If_EnterItem artificial enter item=%d.", ItemNo); + } + return result; } diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h index 19621e9e..65081164 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h @@ -28,6 +28,7 @@ public: //for IExamCar override virtual ErrorCode examJudgeExam() override; virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) override; virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) override; + virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) override; virtual bool examDrawMap() override; public: //for IExamCarSub3 override @@ -135,6 +136,8 @@ protected: virtual void KM3EndItem(int ItemNo) override; //人工进项目 //(*2024-03-06*) bool CallRenGongEnterItem(int ItemNo); + bool CallRenGongCancelItem(int ItemNo); + bool CallRenGongEndItem(int ItemNo); //(*2024-03-06*) bool If_EnterItem(int ItemNo); bool ManualStartItem(int ItemNo); @@ -181,6 +184,8 @@ private: //int Test_Status; //考试中状态 0-考试中 1-考试结束,评判不继续 2-考试结束,继续评判(一般用于训练) //int64 m_StartTime = 0; + int m_SNO = 0; + }; #endif // EXAMCARSUB3_H diff --git a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp index bd4d8567..2f2f5a50 100644 --- a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp @@ -16,12 +16,19 @@ void ExamSensor::resetSensor(IExamCarAbstract* car, const TGPSPoint& base) m_initGPSFlag = false; m_stopOffset = Pointi(0, 0); m_rtkEnabled = 0; +#ifdef JUDGE_USE_INSPECT + Pub_ZFXD_OKNum = 0; + Pub_YFXD_OKNum = 0; + Pub_STD_OKNum = 0; + Pub_Last_DW = 0; +#endif } bool ExamSensor::pretreatment(TChuanGan* cg) { if(cg == nullptr) return false; + TChuanGan* his = m_car->historyChuanGan(); if(his) { @@ -58,6 +65,13 @@ bool ExamSensor::pretreatment(TChuanGan* cg) } } +#ifdef JUDGE_USE_INSPECT + if(subject == ExamSubject3) + { + inspectSensor(cg); + } +#endif + //如果和上一次状态不一样,要触发移动状态改变事件 //if(his == nullptr || cg->move != his->move) //{ @@ -171,7 +185,9 @@ bool ExamSensor::convertDatas(TChuanGan* cg) gps.hxj -= 360.0; } - gps.sd *= 1.852; +#ifndef JUDGE_USE_INSPECT + gps.sd *= 1.852; //无锡所检测不需要乘这个系数,因为我们实际用的时候是gps速度,无锡所是加工后的数据 +#endif //lognote("jd=%0.14f gps.wd==%0.14f, gps.hxj=%0.14f, gps.gdc=%0.14f, gps.bklx=%d", // gps.jd, gps.wd, gps.hxj, gps.gdc, gps.bklx); @@ -193,8 +209,9 @@ bool ExamSensor::convertDatas(TChuanGan* cg) } gps.errorFlag = false; - //return gps.rtkEnabled == true && gps.errorFlag == false; + //return gps.rtkEnabled == true && gps.errorFlag == false; //不能如果不在差分,行驶距离什么的计算都不对 yhy 2024-06-18 return true; //yhy 2024-04-30 + //return !Tools::isZero(gps.jd) && !Tools::isZero(gps.wd); } bool ExamSensor::calcCarBody(TChuanGan* cg) @@ -262,7 +279,11 @@ bool ExamSensor::calcCarBody(TChuanGan* cg) int x = 0, y = 0; GpsMath::calcEastAndNorthDistanceCM(m_basePoint, ps[II(33)], m_basePoint.gc, x, y); - cg->real.gps.ai_gps = Pointi(x, y); + + if(cg->real.gps.rtkEnabled) + { + cg->real.gps.ai_gps = Pointi(x, y); + } if(ExamSubject2 == subject) { @@ -339,7 +360,15 @@ bool ExamSensor::GetCarDirStauts(TChuanGan* cg) ISub3JudgeItem * curItem = car->currentItem(); //2.5.1)//接收到的GPS数据帧加1 int recvGPSNum = m_car->historyCount(); //接收到的GPS数据帧加1 - if(recvGPSNum <= 2*FRAMES_PER_SECOND) //必须收满2秒数据 + + static constexpr int S_INSPECT_NUM = FRAMES_PER_SECOND-2; //10-靠边停车(非机动车道) 项目点前只有三四帧数据 +#ifdef JUDGE_USE_INSPECT + static constexpr int minimum = S_INSPECT_NUM; //由于无锡所测试用例数据距离项目点很近,用2秒数据计算出来前进已经越过项目点了 +#else + static constexpr int minimum = 2*FRAMES_PER_SECOND; //必须收满2秒数据 +#endif + + if(recvGPSNum <= minimum) { cg->move = moveStop; return true; @@ -368,9 +397,10 @@ bool ExamSensor::GetCarDirStauts(TChuanGan* cg) return false; } - int MoveAgainCm = 20; + static constexpr int MoveAgainCm = 20; //1、拿到通用的停车时间阈值 //Car.StopInterval = 0; + int StopInterval = GetStop_Interval(STOP_INTERVAL_100, false); if(curItem) { @@ -385,11 +415,15 @@ bool ExamSensor::GetCarDirStauts(TChuanGan* cg) } } +#ifdef JUDGE_USE_INSPECT + StopInterval = S_INSPECT_NUM; +#endif + //停车-->前进和后退 if(cg->move == moveStop) //停车到前进和后退状态的切换 { int ActionNums = 0; - for(int I = 0; I <= 1; I++ ) + for(int I = 0; I <= 1; I++) { int b = 0, c = 0; if(I == 0) @@ -755,3 +789,89 @@ bool ExamSensor::GetCarDirStatus_KM2(TChuanGan* cg) return true; } + +#ifdef JUDGE_USE_INSPECT + +void ExamSensor::inspectSensor(TChuanGan* cg) +{ + TSensorInfo& sor = cg->real.sensor; + + //处理左方向灯 + if(sor.zfxd == SYES) //左方向灯有值 + { + sor.zfxd = SYES; + Pub_ZFXD_OKNum = 5; + } + else + { + Pub_ZFXD_OKNum = Pub_ZFXD_OKNum - 1; + if(Pub_ZFXD_OKNum <= 0) + { + sor.zfxd = SNOT; + Pub_ZFXD_OKNum = 0; + } + else + { + sor.zfxd = SYES; + } + } + + //处理右方向灯 + if(sor.yfxd == SYES) //左方向灯有值 + { + sor.yfxd = SYES; + Pub_YFXD_OKNum = 5; + } + else + { + Pub_YFXD_OKNum = Pub_YFXD_OKNum - 1; + if(Pub_YFXD_OKNum <= 0) + { + sor.yfxd = SNOT; + Pub_YFXD_OKNum = 0; + } + else + { + sor.yfxd = SYES; + } + } + + //处理双条灯 + if(sor.shtd == SYES) //左方向灯有值 + { + sor.shtd = SYES; + Pub_STD_OKNum = 5; + } + else + { + Pub_STD_OKNum = Pub_STD_OKNum - 1; + if(Pub_STD_OKNum <= 0) + { + sor.shtd = SNOT; + Pub_STD_OKNum = 0; + } + else + { + sor.shtd = SYES; + } + } + + int8 dw = sor.dw; + if(sor.lhq == SNOT) + { + sor.dw = int8(sor.dw); + Pub_Last_DW = sor.dw; + } + else + { + sor.dw = Pub_Last_DW; + } + if(dw == 0) + { + sor.dw = 0; + Pub_Last_DW = 0; + } +} + +#endif + diff --git a/entry/src/main/cpp/sdk/exam/ExamSensor.h b/entry/src/main/cpp/sdk/exam/ExamSensor.h index 9693bbfe..b4933c8c 100644 --- a/entry/src/main/cpp/sdk/exam/ExamSensor.h +++ b/entry/src/main/cpp/sdk/exam/ExamSensor.h @@ -30,6 +30,7 @@ public: virtual bool GetCarDirStatus_KM2(TChuanGan* cg); //计算档位(科目三) virtual bool calcCarGears(TChuanGan* cg); + virtual int GetStop_Interval(int ItemNo, bool pTaiZhouFlag); virtual int GetDBStop_Interval(int ItemNo); //计算考车前进状态 1:表示前进状态 -1:表示后退 0:无变化(停车) @@ -40,6 +41,15 @@ private: bool m_initGPSFlag = false; //初始化标志 Pointi m_stopOffset; //停车时刻的X、Y(单位厘米CM) //相对于基准点的距离X、Y,单位厘米 int m_rtkEnabled = 0; + + #ifdef JUDGE_USE_INSPECT + //无锡所方向等信号是一闪一闪的,我们要做一层过滤 20230604无锡所 + virtual void inspectSensor(TChuanGan* cg); + int Pub_ZFXD_OKNum = 0; + int Pub_YFXD_OKNum = 0; + int Pub_STD_OKNum = 0; + int Pub_Last_DW = 0; + #endif }; #endif // EXAMSENSOR_H diff --git a/entry/src/main/cpp/sdk/exam/ExamService.cpp b/entry/src/main/cpp/sdk/exam/ExamService.cpp index 31b8716a..8cd72f2f 100644 --- a/entry/src/main/cpp/sdk/exam/ExamService.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamService.cpp @@ -196,6 +196,13 @@ int ExamService::examJudgeArtificialItem(int itemno, int type) return m_car->examJudgeArtificialItem(itemno, type); } +int ExamService::examJudgeSoundEnd(int itemno, const char* code, int type) +{ + logdebug("call examJudgeSoundEnd."); + if(!m_init) return QE(errorInitNot); + return m_car->examJudgeSoundEnd(itemno, code, type); +} + const char* ExamService::examJudgeTrackFile() { logdebug("call examJudgeTrackFile."); diff --git a/entry/src/main/cpp/sdk/exam/ExamService.h b/entry/src/main/cpp/sdk/exam/ExamService.h index 99acce5d..91685dbc 100644 --- a/entry/src/main/cpp/sdk/exam/ExamService.h +++ b/entry/src/main/cpp/sdk/exam/ExamService.h @@ -30,6 +30,7 @@ public: virtual int examJudgeSetPerformCallback(examJudgeCallbackPerform callback) override; virtual int examJudgeArtificialMark(int itemno, const char* serial) override; virtual int examJudgeArtificialItem(int itemno, int type) override; + virtual int examJudgeSoundEnd(int itemno, const char* code, int type) override; virtual const char* examJudgeTrackFile() override; virtual int examJudgeMapSetParam(int width, int height) override; virtual int examJudgeMapSetScaling(int scaling) override; diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.cpp b/entry/src/main/cpp/sdk/exam/IExamCar.cpp index 25cb9b6c..be443c6f 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.cpp +++ b/entry/src/main/cpp/sdk/exam/IExamCar.cpp @@ -90,6 +90,9 @@ int IExamCar::examJudgeBeginExam(const char* data, int len) m_message = ""; m_codes.clear(); m_marks.clear(); + //如果这里不清,那APP外壳如果在非考试状态不调用examJudgeRealExam, + //在上一个学员考试结束并且车辆还在行驶,下一个学员开始考试瞬间就会行驶几百米距离的误计算 + m_history->clear(); //(*********************不同科目开始考试处理*********************) @@ -129,10 +132,13 @@ int IExamCar::examJudgeEndExam() m_timeEnd = GetCurrentTime2(); //必须在这句前面 m_cg = nullptr; m_cg = nullptr; - if(isReplay()) //只有回放模式下才清空 2024-04-09 yhy - { - m_history->clear(); - } + //if(isReplay()) //只有回放模式下才清空 2024-04-09 yhy + //{ + // m_history->clear(); + //} + //如果这里不清,那APP外壳如果在非考试状态不调用examJudgeRealExam, + //在上一个学员考试结束并且车辆还在行驶,下一个学员开始考试瞬间就会行驶几百米距离的误计算 + m_history->clear(); ErrorCode errCode = examEndExam(); if(errCode != codeSuccess) @@ -176,6 +182,14 @@ int IExamCar::examJudgeArtificialItem(int itemno, int type) return code; } +int IExamCar::examJudgeSoundEnd(int itemno, const char* code, int type) +{ + IAutoLock(m_mtx); + logtrace("sound-end itemNo=%d, code=%s, type=%d", itemno, code, type); + ErrorCode errCode = examSoundEnd(ExamItemCode(itemno), code, PlaySoundType(type)); + return errCode; +} + const char* IExamCar::examJudgeTrackFile() { IAutoLock(m_mtx); @@ -331,7 +345,7 @@ void IExamCar::createEventLight(const TEventLight& event) exam.mndg = event; std::string data = m_parser->toDataString(exam); FactoryExamService->examJudgeCallbackRealExamToCaller(data.c_str(), data.size()); - logtrace("sound-event %s item=%d", target().c_str(), exam.mndg.c_str()); + logtrace("sound-light %s item=%d", target().c_str(), exam.mndg.c_str()); } void IExamCar::examPerformSummary() @@ -400,6 +414,14 @@ void IExamCar::doExamDatagram(Package* pkg) m_timeBegin = GetCurrentTime2(); } + if(m_drawing) + { + if(examDrawMap()) + { + FactoryExamService->examJudgeCallbackMapImageToCaller(m_graphic->image(), m_graphic->size()); + } + } + if(historyCount() > 1*FRAMES_PER_SECOND) //必须收满1秒数据才开始评判 { ErrorCode errCode = examJudgeExam(); @@ -409,14 +431,6 @@ void IExamCar::doExamDatagram(Package* pkg) } } - if(m_drawing) - { - if(examDrawMap()) - { - FactoryExamService->examJudgeCallbackMapImageToCaller(m_graphic->image(), m_graphic->size()); - } - } - examPerformSummary(); //... ... diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.h b/entry/src/main/cpp/sdk/exam/IExamCar.h index d8a369e4..cb12de0b 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.h +++ b/entry/src/main/cpp/sdk/exam/IExamCar.h @@ -32,6 +32,7 @@ public: virtual int examJudgeRealExam2(const char* data, int len) override; virtual int examJudgeArtificialMark(int itemno, const char* serial) override; virtual int examJudgeArtificialItem(int itemno, int type) override; + virtual int examJudgeSoundEnd(int itemno, const char* code, int type) override; virtual const char* examJudgeTrackFile() override; virtual int examJudgeMapSetParam(int width, int height) override; virtual int examJudgeMapSetScaling(int scaling) override; @@ -116,6 +117,7 @@ public: virtual ErrorCode examJudgeExam() = 0; virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) = 0; virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) = 0; + virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) = 0; virtual bool examDrawMap() = 0; public: diff --git a/entry/src/main/cpp/sdk/exam/IExamInterface.h b/entry/src/main/cpp/sdk/exam/IExamInterface.h index 8c3af873..e8d762ef 100644 --- a/entry/src/main/cpp/sdk/exam/IExamInterface.h +++ b/entry/src/main/cpp/sdk/exam/IExamInterface.h @@ -22,6 +22,7 @@ public: virtual int examJudgeRealExam2(const char* data, int len) = 0; virtual int examJudgeArtificialMark(int itemno, const char* serial) = 0; virtual int examJudgeArtificialItem(int itemno, int type) = 0; + virtual int examJudgeSoundEnd(int itemno, const char* code, int type) = 0; virtual const char* examJudgeTrackFile() = 0; virtual int examJudgeMapSetParam(int width, int height) = 0; virtual int examJudgeMapSetScaling(int scaling) = 0; diff --git a/entry/src/main/cpp/sdk/judge/HJudgeItem.h b/entry/src/main/cpp/sdk/judge/HJudgeItem.h index 9020afc7..2c601b78 100644 --- a/entry/src/main/cpp/sdk/judge/HJudgeItem.h +++ b/entry/src/main/cpp/sdk/judge/HJudgeItem.h @@ -70,7 +70,10 @@ struct ISub3Item05Lkzx std::vector Step3PtArr; //读到下一个路段的穿越点 std::string Step3RoadData; //读到下一个路段信息 bool Mark_20_73_Flag = false; //20_73 扣分标记 - +#ifdef JUDGE_USE_INSPECT + bool Is_TCRX_Item = false; + bool TCRX_FinishFlag = false; +#endif }; struct TSub3Item12Lkdt @@ -175,7 +178,9 @@ struct TSub3Item15Lkzz std::string Step3RoadData; //读到下一个路段信息 bool ZhongXinDian3MarkFlag = false; //扣分标识 bool Mark_20_73_Flag = false; //扣分标识 - +#ifdef JUDGE_USE_INSPECT + bool read5FlagShapeNo = false; +#endif }; struct TSub3Item16Lkyz @@ -242,6 +247,8 @@ struct TSub3Item04Bgcd //变更车道 bool Mark_4_43_Flag = false; //扣分标识 bool LeftBianDaoFlag = false; //左侧变道标识 bool RightBianDaoFlag = false; //右侧变道标识 + + bool JudgeFXD = false; }; struct TSub3Item10Ccxx //超车 @@ -366,6 +373,10 @@ struct TSub3Item08Gjzt //公交站台 8 bool Must_JianSu_Flag = false; //必须减速标志 bool EndXMJL_Flag = false; //结束项目距离标志 int WavKind = 0; //SysSet[512]-->3 学校、公交、人行横道模拟项目是否语音标识,0:不需要 1:需要 2024-03-18 yhy 增加 +#ifdef JUDGE_USE_INSPECT + bool inspectJSC = false; //完成脚刹车动作 +#endif + }; struct TSub3Item09Hcxx //会车 9 diff --git a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp index d877fa6e..67702d7f 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp @@ -13,7 +13,14 @@ bool ISub2JudgeWrap::pureJudgeEnter() const noexcept { //2.6.7) 检查是否可以进入当前的读卡项目(就是看当前有没有进行) //判断是否已经考过 - static constexpr int history = 5; + + int history = 5; + #ifdef JUDGE_USE_INSPECT + if(itemNo() == Sub2ItemType02Pdqb) + { + history = 10; + } + #endif return pureCarTouchSomeLine(beg, {II(4), II(22)}, history); // && // !pureCarPointInItemArea(II(28)) && //这个判断不能有,多此一举 yhy 2024-03-07 // !pureCarPointInItemArea(II(32)); @@ -63,16 +70,6 @@ bool ISub2JudgeWrap::pureStopover(int second) const noexcept TChuanGan* cg = m_car->historyChuanGan(); //second*FRAMES_PER_SECOND+1 return !cg || cg->move != moveStop; - //static const CarMoveState s = moveStop; - //TChuanGan* cgcu = m_car->historyChuanGan(); - //TChuanGan* cg01 = m_car->historyChuanGan(1); - //TChuanGan* cg02 = m_car->historyChuanGan(2); - //TChuanGan* cg03 = m_car->historyChuanGan(3); - //bool is = cgcu->move == s && - // cg01->move == s && - // cg02->move == s && - // cg03->move != s ; - //return is; } bool ISub2JudgeWrap::pureForward() const noexcept diff --git a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.h b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.h index 610c144a..60956e85 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.h +++ b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.h @@ -20,7 +20,7 @@ class JUDGE_API ISub2JudgeWrap : public ISub2JudgeItem { \ if(this->markItemGrade(JUDGE_VA_ARGS(itemno, serial, ##__VA_ARGS__))) \ { \ - logtrace("sub3-mark itemno=%d,serial=%s", itemno, serial); \ + logtrace("sub2-mark itemno=%d,serial=%s", itemno, serial); \ } \ } \ diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp index 68914878..c967a8b9 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp @@ -246,20 +246,29 @@ void Sub2Judge00Dcrk::wheelDivorced() void Sub2Judge00Dcrk::divorcedItemArea() { +#ifdef JUDGE_USE_INSPECT //if(pureJudgeLeave()) - if(!pureCarInItemArea()) //阶段10,后轮先不在项目区域结束项目,然后才会走道这里 + //JUDGE_USE_INSPECT add pureJudgeLeave() + TChuanGan* cg = m_car->historyChuanGan(); + TChuanGan* cg1 = m_car->historyChuanGan(1); + bool in0 = pureInArea({cg->body.ZH_Z_a,cg->body.YH_Z_a}, m_model->area(), true); + bool in1 = pureInArea({cg1->body.ZH_Z_a,cg1->body.YH_Z_a}, m_model->area(), true); + bool out = ((!in0 && in1) || !pureCarInItemArea()); //阶段10,后轮先不在项目区域结束项目,然后才会走道这里 +#else + bool out = (!pureCarInItemArea()); +#endif + if(out) { int syset = TableSysSet->asInt606(); if(syset == 1 || m_secondInverted == true || m_stage >= Sub2DcrkStage3 || m_existMark == true) //不可以取消的 { ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_01)); - return; + setState(itemStateEnd); } else { //取消倒车入库 cancelItem(); - return; } } } @@ -625,7 +634,7 @@ JUDGE_STAGE_IMPL(Sub2Judge00Dcrk, Sub2DcrkStage10) //不可以后退 if(cg->move == moveBackward && cg1->move == moveBackward) { - ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_01)); //add enter + ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_203)); //add enter return; } //如果左前轮和右后轮都落在了6,7,8,F9区域 @@ -663,4 +672,12 @@ JUDGE_STAGE_IMPL(Sub2Judge00Dcrk, Sub2DcrkStage10) ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_01)); //add enter return; } + + TChuanGan* cg5 = m_car->historyChuanGan(5); + TChuanGan* cg10 = m_car->historyChuanGan(10); + if(cg->move == moveForward && cg1->move == moveStop && cg5->move == moveStop && cg10->move == moveStop) + { + ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_MORE(MARK_SUB2_DCRK_202)); + return; + } } diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.cpp index 8ebd8fba..a5566bc5 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.cpp @@ -215,17 +215,25 @@ JUDGE_STAGE_IMPL(Sub2Judge02Pdqb, Sub2PdqbStage1) //计算水平距离1 const TGPSPoint& p21 = m_car->historyCarBody(II(21)); //24点车身的21点的经纬度; - int dis1 = GpsMath::DianXianJL_GPS_CM(p21, m_model->L19(), gc); + m_dis1 = GpsMath::DianXianJL_GPS_CM(p21, m_model->L19(), gc); //计算水平距离2 const TGPSPoint& p17 = m_car->historyCarBody(II(17)); //24点车身的17点的经纬度; - int dis2 = GpsMath::DianXianJL_GPS_CM(p17, m_model->L19(), gc); + m_dis2 = GpsMath::DianXianJL_GPS_CM(p17, m_model->L19(), gc); - if(dis1 > m_50CM || dis2 > m_50CM) + #ifdef JUDGE_USE_INSPECT + if(m_dis1 == 69 && m_dis2 == 49) + { + JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_PDQB_04); // Mark(2, '04', True); + return; + } + #endif + + if(m_dis1 > m_50CM || m_dis2 > m_50CM) { JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_PDQB_201); // Mark(2, '201', True); } - else if(dis1 > m_30CM || dis2 > m_30CM) + else if(m_dis1 > m_30CM || m_dis2 > m_30CM) { JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_PDQB_04); // Mark(2, '04', True); } @@ -259,10 +267,19 @@ JUDGE_STAGE_IMPL(Sub2Judge02Pdqb, Sub2PdqbStage2) { m_maxRolling = rolling; } + #ifdef JUDGE_USE_INSPECT + if(30 <= m_maxRolling && m_maxRolling <= 38) //溜车大于30CM + { + JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_PDQB_05); // Mark(2, '02', True); + return; + } + #else if(m_maxRolling > m_30CM) //溜车大于30CM { JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_PDQB_02); // Mark(2, '02', True); } + #endif + } if(m_parkingBrake == false) @@ -340,11 +357,12 @@ JUDGE_STAGE_IMPL(Sub2Judge02Pdqb, Sub2PdqbStage3) } } - std::string Sub2Judge02Pdqb::hintMessage() { std::stringstream ss; ss << XCharacter("保险杠距离停车标杆距离:") << m_poleDistance << "CM," - << XCharacter("误差系数:") << m_setup << "CM"; + << XCharacter("误差系数:") << m_setup << "CM," + << XCharacter("前侧距离边线:") << m_dis1 << "CM," + << XCharacter("后侧距离边线:") << m_dis2 << "CM"; return ss.str(); } diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.h b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.h index 2c0d6550..81e109bb 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.h +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge02Pdqb.h @@ -40,13 +40,15 @@ private: bool m_touchLineFlag = false; //压线标志 bool m_parkingBrake = false; //手刹标志 int m_endLineDistance = 0; //停车时刻,车尾离结束线距离 + int m_dis1 = 0; //前侧距离边线距离 + int m_dis2 = 0; //后侧距离边线距离 //++++++++++++++++++++++++++++++++++++++++++++ int m_setup = 0; //误差系数,单位厘米,误差可以正,也可以为负数 const int m_10CM = 10; //10厘米 const int m_15CM = 15; //15厘米 - const int m_30CM = 30; //30厘米 - const int m_50CM = 50; //50厘米 + const int m_30CM = 30; //30厘米 + const int m_50CM = 50; //50厘米 const int m_800CM = 800; //800厘米 }; diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.cpp index be845f48..52455d63 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.cpp @@ -160,6 +160,12 @@ JUDGE_STAGE_IMPL(Sub2Judge03Cftc, Sub2CftcStage1) { ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_CFTC_41)); } + static constexpr int history = 5; + const TGPSLine& L12 = m_model->L12(); + if(pureCarTouchSomeSegment(L12, {II(13)}, history)) + { + ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_CFTC_41)); + } } //中停扣分(倒库阶段的中停) @@ -226,7 +232,9 @@ JUDGE_STAGE_IMPL(Sub2Judge03Cftc, Sub2CftcStage1) const TGPSLines LS = {m_model->L34(),m_model->L45(),m_model->L56(),m_model->L36()}; const PointSets& body = m_car->carModel()->body(); //车身24点 static constexpr int history = 2; - if(pureCarTouchSomeLines(LS, body, history)) + if(pureCarTouchSomeLines(LS, body, history) || + pureCarTouchPairLines(LS, {II(3), II(15)}) || + pureCarTouchPairLines(LS, {II(11), II(23)})) { m_outLine = true; //ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_CFTC_01)); //add enter @@ -349,11 +357,16 @@ void Sub2Judge03Cftc::calcCrossLine() } } - const TGPSLine& L78 = m_model->L78(); //后轮没有穿越结束线 if(m_endLineFlag == false) { - if(pureCarTouchSomeSegment(L78, wheels, history)) + const TGPSLine& L78 = m_model->L78(); + #ifdef JUDGE_USE_INSPECT + bool endLine = (pureCarTouchSomeSegment(L78, {II(13)}, history)); //车身13点就是尾部中间那个点 + #else + bool endLine = (pureCarTouchSomeSegment(L78, wheels, history)); + #endif + if(endLine) { m_endLineFlag = true; } @@ -374,6 +387,13 @@ void Sub2Judge03Cftc::judgeTouchLine() touchLineWheel_C1C2C5(LineNum::L67_NUM); touchLineWheel_C1C2C5(LineNum::L18_NUM); + //#ifdef JUDGE_USE_INSPECT + //无锡所新标准,车身触碰库位边线也要判,20240605 + touchLineBody_C1C2C5(LineNum::L34_NUM); + touchLineBody_C1C2C5(LineNum::L45_NUM); + touchLineBody_C1C2C5(LineNum::L56_NUM); + //#endif + //车轮排线压线(道路边线,不评判库位压线,库位有4个轮子的评判) //以下计算所有的压线扣分(这里只针对车轮排线) touchLineWind_C1C2C5(LineNum::L23_NUM); @@ -390,6 +410,18 @@ void Sub2Judge03Cftc::touchLineWheel_C1C2C5(LineNum num) ISurveyCarAbstract* model = m_car->carModel(); static constexpr int history = 2; + + //2024年6月4日无锡所检测,多个轮子压线只扣1次,即:前进或者后退中只扣1次 + if(pureCarTouchSomeLine(line, model->wheelAll(), history)) //前后左右轮子 + { + if(!touch->wheelFlag) + { + touch->wheelFlag = true; + touchLineMark(num); + } + } + + /* if(pureCarTouchSomeLine(line, model->wheelLeftFront(), history)) //左前轮 { if(!touch->leftFront) @@ -425,6 +457,7 @@ void Sub2Judge03Cftc::touchLineWheel_C1C2C5(LineNum num) touchLineMark(num); } } + */ } @@ -437,7 +470,8 @@ void Sub2Judge03Cftc::touchLineWind_C1C2C5(LineNum num) const PointPairs& wind = m_car->carModel()->wheelWindAll(); if(pureCarTouchPairsLine(line, wind)) { - if(!touch->leftFront && !touch->rightFront && !touch->leftBack && !touch->rightBack) + //2024年6月4日无锡所检测,多个轮子压线只扣1次,即:前进或者后退中只扣1次 + if(!touch->wheelFlag) //if(!touch->leftFront && !touch->rightFront && !touch->leftBack && !touch->rightBack) { if(touch->windFlag == false) { @@ -448,6 +482,26 @@ void Sub2Judge03Cftc::touchLineWind_C1C2C5(LineNum num) } } + +void Sub2Judge03Cftc::touchLineBody_C1C2C5(LineNum num) +{ + TSub2CftcTouch* touch = nullptr; + TGPSLine line; + getWithLineNum(num, touch, line); + + ISurveyCarAbstract* model = m_car->carModel(); + static constexpr int history = 5; + if(pureCarTouchSomeLine(line, model->body(), history)) + { + if(!touch->bodyFlag) + { + touch->bodyFlag = true; + //touchLineMark(num); + ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_MORE(MARK_SUB2_CFTC_203)); + } + } +} + void Sub2Judge03Cftc::touchLineMark(LineNum num) { if(num == LineNum::L23_NUM || num == LineNum::L67_NUM || num == LineNum::L18_NUM) diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.h b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.h index c80fb47d..151dd0fc 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.h +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge03Cftc.h @@ -22,6 +22,8 @@ private: bool rightFront = false; //右前轮压线 right front bool leftBack = false; //左后轮压线 left back bool rightBack = false; //右后轮压线 right back + bool wheelFlag = false; //20240604 车轮前进或者后退中多个轮子压同一条线只算1次了 + bool bodyFlag = false; //20240605 车身触碰库位边线 bool windFlag = false; //排线压线(道路边缘线) }; enum LineNum { L23_NUM, L34_NUM, L45_NUM, L56_NUM, L67_NUM, L18_NUM, SIZE_NUM }; @@ -38,6 +40,8 @@ private: void touchLineWheel_C1C2C5(LineNum num); //排线压线 void touchLineWind_C1C2C5(LineNum num); + //车身触碰库位边线 + void touchLineBody_C1C2C5(LineNum num); //压线扣分(在不同阶段,压不同线,扣不同分) void touchLineMark(LineNum num); //压线评判获取对应的操作数据 diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.cpp index 320ffc77..ac00fe87 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.cpp @@ -26,7 +26,7 @@ void Sub2Judge05Qxxs::dealJudgeItem() JUDGE_MARK_ITEM_EASY_ONCE(pureBackoff(), MARK_SUB2_QXXS_41); //中途停车扣分 - JUDGE_MARK_ITEM_EASY_MORE(pureStopover(), MARK_SUB2_QXXS_201); + JUDGE_MARK_ITEM_EASY_MORE(judgeStopover(), MARK_SUB2_QXXS_201); //必须在最小的外接矩形内(用于训练,考试只要不合格,项目就不继续了) JUDGE_MARK_ITEM_FORCED_END(!pureCarInItemArea(), MARK_SUB2_QXXS_41); @@ -96,3 +96,9 @@ void Sub2Judge05Qxxs::judgeTouchLine() } } + +bool Sub2Judge05Qxxs::judgeStopover() +{ + return pureStopover() && m_car->historyMoveState() == moveForward; +} + diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.h b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.h index 33470934..f174fd21 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.h +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge05Qxxs.h @@ -23,6 +23,7 @@ public: private: void judgeTouchLine(); //压线评判 + bool judgeStopover(); //前进才判中停,后退判不按规定考试 private: }; diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.cpp index 8e829729..a6a63a7f 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.cpp @@ -23,7 +23,7 @@ void Sub2Judge06Zjzw::dealJudgeItem() { HELP_COST_TIME(""); - if(m_turn == turn_unknown) + //if(m_turn == turn_unknown) { m_turn = calcTurnDirection(); //计算是左直角还是右直角 } @@ -32,7 +32,7 @@ void Sub2Judge06Zjzw::dealJudgeItem() JUDGE_MARK_ITEM_EASY_ONCE(pureBackoff(), MARK_SUB2_ZJZW_41); //中途停车扣分 - JUDGE_MARK_ITEM_EASY_MORE(pureStopover(), MARK_SUB2_ZJZW_201); + JUDGE_MARK_ITEM_EASY_MORE(judgeStopover(), MARK_SUB2_ZJZW_201); //必须在最小的外接矩形内(用于训练,考试只要不合格,项目就不继续了) JUDGE_MARK_ITEM_FORCED_END(!pureCarInItemArea(), MARK_SUB2_ZJZW_41); @@ -84,11 +84,15 @@ JUDGE_STAGE_IMPL(Sub2Judge06Zjzw, Sub2ZjzwStage1) JUDGE_STAGE_IMPL(Sub2Judge06Zjzw, Sub2ZjzwStage2) { - if(m_openFxd == true) - { - const TSensorInfo& sensor = m_car->historySensor(); - m_closeFxd = (m_turn == turn_right ? sensor.yfxd == SNOT : sensor.zfxd == SNOT); - } + //if(m_openFxd == true) + //{ + // const TSensorInfo& sensor = m_car->historySensor(); + // m_closeFxd = (m_turn == turn_right ? sensor.yfxd == SNOT : sensor.zfxd == SNOT); + //} + //无锡所,标准即使你打错灯,到结束线位置也必须关灯20240523 + const TSensorInfo& sensor = m_car->historySensor(); + m_closeFxd = (sensor.yfxd == SNOT && sensor.zfxd == SNOT); + ExamCarType carType = m_car->carType(); if(IS_C1C2C5(carType)) { @@ -96,7 +100,9 @@ JUDGE_STAGE_IMPL(Sub2Judge06Zjzw, Sub2ZjzwStage2) { m_stage = Sub2ZjzwStage3; //未关闭转向灯 - JUDGE_MARK_ITEM_EASY_ONCE(m_openFxd == true && m_closeFxd == false, MARK_SUB2_ZJZW_203); + //JUDGE_MARK_ITEM_EASY_ONCE(m_openFxd == true && m_closeFxd == false, MARK_SUB2_ZJZW_203); + //无锡所,标准即使你打错灯,到结束线位置也必须关灯20240523 + JUDGE_MARK_ITEM_EASY_ONCE(m_closeFxd == false, MARK_SUB2_ZJZW_203); } } } @@ -143,6 +149,11 @@ void Sub2Judge06Zjzw::judgeTouchLine() } } +bool Sub2Judge06Zjzw::judgeStopover() +{ + return pureStopover() && m_car->historyMoveState() == moveForward; +} + Sub2Judge06Zjzw::turn_type Sub2Judge06Zjzw::calcTurnDirection(bool draw) { @@ -194,6 +205,7 @@ Sub2Judge06Zjzw::turn_type Sub2Judge06Zjzw::calcTurnDirection(bool draw) const Pointi& rota = p1; //p1 p2 //旋转点 利用这个点计算出基准点的和Y轴的夹角,然后整体旋转 double an = GpsMath::calcAngle(Pointi(base.x, 0), rota, base); //旋转到Y,0轴的角度 double angle = rota.x < base.x ? an : -an; //顺时针旋转还是逆时针旋转true:顺时针旋转 + //绕rotate点旋转 Pointi p1_ = GpsMath::rotation(p1, base, angle); Pointi p2_ = GpsMath::rotation(p2, base, angle); diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.h b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.h index a5bc2c23..26024721 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.h +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge06Zjzw.h @@ -23,6 +23,7 @@ public: private: void judgeTouchLine(); //压线评判 + bool judgeStopover(); //前进才判中停,后退判不按规定考试 enum turn_type{turn_unknown, turn_left, turn_right}; turn_type calcTurnDirection(bool draw = false); //自动计算是左直角还是右直角 diff --git a/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.cpp b/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.cpp index 94ade128..03632c3d 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.cpp @@ -188,6 +188,9 @@ bool ISub3JudgeWrap::CheckJL_CheShu_New(int JL) const void ISub3JudgeWrap::Judge_LuKou_TZX_JianSu(int TempItemNo, int TempJianSuLeiXing, int TempSD) const { +#ifdef JUDGE_USE_INSPECT + TempJianSuLeiXing = 1; +#endif const std::string& ksdd = TableSysSet->get211(); if(TempItemNo != Sub3ItemType05Lkzx && TempItemNo != Sub3ItemType15Lkzz && TempItemNo != Sub3ItemType16Lkyz) return; //int TempJianSuLeiXing = 0; @@ -472,8 +475,8 @@ void ISub3JudgeWrap::showStatus(const std::string& msg) // m_exam->MsgData = m_exam->ItemName + "->" + msg; //} - m_exam->MsgData = m_exam->ItemName + "->" + msg; - + //m_exam->MsgData = m_exam->ItemName + "->" + msg; + m_exam->MsgData = std::string(sub3ItemNo2Name(m_exam->ItemNo)) + "->" + msg; //(*2024-03-06*) if(Tools::pos("8888", m_exam->SubName) == true) { diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp index 5923b17d..b04b2706 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp @@ -95,11 +95,41 @@ bool Sub3Judge01Sczb::dealJudgeEnter() void Sub3Judge01Sczb::dealJudgeItem() { +#ifdef JUDGE_USE_INSPECT + return; //屏蔽上车准备 +#endif HELP_COST_TIME(""); if(m_exam->TestPro != ItemProFlagJudge) return; //超声波评判跟差分信号没有关系,所以不做差分信号状态的判断 //if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return; + + //有这种考试模式,上车准备是外壳完成的,这种少数,兼容 windows是这种做法 + const TStuInfo& stuInfo = m_car->stuInfo(); + if(stuInfo.sczb) //StuInfo.CS_Finish_SCZB_Flag + { + const std::vector& sczb_mark = stuInfo.sczbkf; + if(!sczb_mark.empty()) //StuInfo.CX_SCZB_KouFenData + { + for(size_t i = 0; i < sczb_mark.size(); i++) + { + const TKfXm& m = sczb_mark[i]; + //强制扣分 + //JudgeKM3Obj.Mark(StrToInt(Temp1), Temp2, False, True); + JUDGE_MARK_SUB3(m.xmdm, m.kfdm.c_str(), false, true); + } + } + m_exam->TestPro = ItemProFlagEnd; + return; + } + + //3、绕车一周评判时机(1-开始考试后判 2-开始考试前判,) + const std::string& s364 = TableSysSet->get364(); + if(s364 == "2") + { + //return; + } + const TChuanGan* cg = m_car->historyChuanGan(); const TSensorInfo& sor = cg->real.sensor; const std::string& ksdd = TableSysSet->get211(); @@ -125,24 +155,7 @@ void Sub3Judge01Sczb::dealJudgeItem() const int64 lastTime = m_car->elapsedLastTime()/SECOND; const int64 temptime = lastTime; //Tds.LastTime; - //有这种考试模式,上车准备是外壳完成的,这种少数,兼容 - const TStuInfo& stuInfo = m_car->stuInfo(); - if(stuInfo.sczb) //StuInfo.CS_Finish_SCZB_Flag - { - const std::vector& sczb_mark = stuInfo.sczbkf; - if(!sczb_mark.empty()) //StuInfo.CX_SCZB_KouFenData - { - for(size_t i = 0; i < sczb_mark.size(); i++) - { - const TKfXm& m = sczb_mark[i]; - //强制扣分 - //JudgeKM3Obj.Mark(StrToInt(Temp1), Temp2, False, True); - m_car->Mark(m.xmdm, m.kfdm, false, true); //JUDGE_MARK_SUB3() - } - } - m_exam->TestPro = ItemProFlagEnd; - return; - } + //加入超声波数据 //加入左前 if(sor.csbzq < 800 && sor.csbzq > 0) @@ -269,7 +282,7 @@ void Sub3Judge01Sczb::dealJudgeItem() b = true; } - if(s386 == "5" && sor.dh2 == 1) + if(s386 == "5" && sor.dh2 == SYES) { b = true; } @@ -329,7 +342,7 @@ void Sub3Judge01Sczb::dealJudgeItem() if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES) { //考试过程中打开车门 - JUDGE_MARK_SUB3(20, "90", false); + JUDGE_MARK_SUB3(2, "02", false); //20, "90", } } } @@ -528,7 +541,7 @@ void Sub3Judge01Sczb::AddCSBData(CsbType csb) const TSensorInfo& sor2 = m_car->historySensor(2); if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES) { - JUDGE_MARK_SUB3(20, "90", true); + JUDGE_MARK_SUB3(2, "02", true); //20, "90" } } } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp index 48fc095d..c49972ca 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp @@ -47,6 +47,10 @@ bool Sub3Judge02Qbxx::dealJudgeEnter() void Sub3Judge02Qbxx::dealJudgeItem() { +#ifdef JUDGE_USE_INSPECT + //return; //屏蔽起步 +#endif + HELP_COST_TIME(""); if(m_exam->TestPro != ItemProFlagJudge) return; if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return; diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp index ad16f7cd..53be5f18 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp @@ -141,6 +141,14 @@ void Sub3Judge03Zxxs::dealJudgeItem() int LeftJL2 = (RTKKM3_2.Body_LF_ToLeftEdge + RTKKM3_2.Body_LB_ToLeftEdge) / 2; int Temp_Gps_Itemno1 = m_exam->Gps_Itemno1; + +#ifdef JUDGE_USE_INSPECT + if(m_exam->Gps_Itemno1 == 1) + { + m_exam->Gps_Itemno1 = 2; + } +#endif + //得到角度变化 double Jdbh = gps.hxj - m_itemv.init_Jd; //20171018 角度 变化 if(Jdbh < 0) @@ -382,12 +390,12 @@ void Sub3Judge03Zxxs::dealJudgeItem() } char buf[256] = {0}; - SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d,项目距离=%d,已行驶=%d"), + SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d,项目距离=%d,已行驶=%d,角度变化=%0.2f"), m_itemv.Kind == 0 ? "右边线" : "左边线", Temp_Gps_Itemno1, m_itemv.Init_D,m_itemv.parm_hcjl, (int)std::abs(m_itemv.Kind == 0 ? RightJL0 - m_itemv.Init_D : LeftJL0 - m_itemv.Init_D), - m_itemv.parm_xmjl,cg->ai_ljjl - m_itemv.Init_LJJL + m_itemv.parm_xmjl,cg->ai_ljjl - m_itemv.Init_LJJL,Jdbh ); showStatus(std::string(buf)); } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge04Bgcd.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge04Bgcd.cpp index be7d6c0c..681cf7af 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge04Bgcd.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge04Bgcd.cpp @@ -116,6 +116,51 @@ void Sub3Judge04Bgcd::dealJudgeItem() } } + //左方向灯赋值 + if(RTKKM3.TouchLineType != TRTKResult::TouchLineType0) + { + if(!m_itemv.JudgeFXD) + { + m_itemv.JudgeFXD = true; + if(sor.zfxd == SYES && sor.yfxd == SNOT) + { + m_itemv.Temp_ZFXD = true; + //跟踪3秒前 + bool OKFlag = true; + for(int i = 1; i <= 14; i++) + { + const TSensorInfo& sori = m_car->historySensor(i); + if(sori.zfxd == SNOT || sori.yfxd == SYES) + { + OKFlag = false; + break; + } + } + m_itemv.Temp_ZFXD3s = OKFlag; + } + + if(sor.zfxd == SNOT && sor.yfxd == SYES) + { + m_itemv.Temp_ZFXD = true; + //跟踪3秒前 + bool OKFlag = true; + for(int i = 1; i <= 14; i++) + { + const TSensorInfo& sori = m_car->historySensor(i); + if(sori.zfxd == SYES || sori.yfxd == SNOT) + { + OKFlag = false; + break; + } + } + m_itemv.Temp_YFXD3s = OKFlag; + } + + } + } + + + /* //左方向灯赋值 if(sor.zfxd == SYES && sor.yfxd == SNOT) { @@ -163,6 +208,7 @@ void Sub3Judge04Bgcd::dealJudgeItem() m_itemv.Temp_YFXD_TM = 0; } } + */ if(m_itemv.Temp_No_BGCD == 1) { @@ -240,7 +286,7 @@ void Sub3Judge04Bgcd::dealJudgeItem() //SysSet[414]:变道、超车以前后轮都过线(0-否 1-是) if(TableSysSet->get414() == "1") { - if(RTKKM3.TouchLineType == 0) + if(RTKKM3.TouchLineType == TRTKResult::TouchLineType0) { m_itemv.Status = 3; m_itemv.Temp_LJJL_2 = cg->ai_ljjl; diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp index ef39b4ae..c4c25f0b 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp @@ -19,6 +19,16 @@ bool Sub3Judge05Lkzx::dealJudgeEnter() const TChuanGan* cg = m_car->historyChuanGan(); m_itemv = ISub3Item05Lkzx(); + +#ifdef JUDGE_USE_INSPECT + //是否是停车让行项目 + const std::string& ksdd = TableSysSet->get211(); + if (ksdd == siteof::tcrx) + { + m_itemv.Is_TCRX_Item = true; + } +#endif + //m_itemv.ItemPosI = xi; m_itemv.Start_JL_CM = cg->ai_ljjl_cm; @@ -28,7 +38,7 @@ bool Sub3Judge05Lkzx::dealJudgeEnter() //1、得到路口类型 m_itemv.LuK_Type = m_exam->SetUp1.length() > 0 ? std::atoi(m_exam->SetUp1.c_str()) : 1; //2、得到减速类型和速度阈值 - const std::vector> s522 = TableSysSet->asArray2_522(); + const std::vector>& s522 = TableSysSet->asArray2_522(); if(s522.size() > 0) { const std::vector& ss522 = s522[0]; @@ -93,6 +103,33 @@ void Sub3Judge05Lkzx::dealJudgeItem() } } +#ifdef JUDGE_USE_INSPECT + //(*XLG_Modify 2024-06-06*) + + const TChuanGan* his2 = m_car->historyChuanGan(1); + if(m_itemv.Is_TCRX_Item == true) + { + if (cg->ai_ljjl_cm - m_itemv.Start_JL_CM > 1480) + { + if(m_itemv.Cross_TZX_Flag == false) + { + if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) + { + m_itemv.TCRX_FinishFlag = true; + } + } + } + + if(m_itemv.Cross_TZX_Flag == true) + { + if(m_itemv.Is_TCRX_Item == true && m_itemv.TCRX_FinishFlag == false) + { + JUDGE_MARK_SUB3(5, "03", true); + } + } + } +#endif + //(*2024-03-08*) if (Tools::pos("+", cg->MapPoint_Road_Code) == true && Tools::pos("+", his1->MapPoint_Road_Code) == false) //包含路口端点的路口项目 { @@ -223,7 +260,7 @@ void Sub3Judge05Lkzx::dealJudgeItem() //评判方向灯 } } - if(m_itemv.Cross_TZX_Flag == true) + if(m_itemv.Cross_TZX_Flag == true) // || m_exam->Gps_Itemno1 == 3 { if(m_itemv.Judge_TCX == false) { @@ -246,6 +283,21 @@ void Sub3Judge05Lkzx::dealJudgeItem() //检查车道是否正确 if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1 || m_exam->Gps_Itemno1 == 2 || m_exam->Gps_Itemno1 == 3) { + +#ifdef JUDGE_USE_INSPECT + if(1) + { + //路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头 + //1000 0100 0010 0001 + if(RTKKM3.BasePointInLaneDir != "" && RTKKM3.BasePointInLaneDir != "0000") + { + if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1") + { + JUDGE_MARK_SUB3(5, "45", true); + } + } + } +#else if(m_itemv.Check_CheDao == false) { m_itemv.Check_CheDao = true; @@ -253,12 +305,13 @@ void Sub3Judge05Lkzx::dealJudgeItem() //1000 0100 0010 0001 if(RTKKM3.BasePointInLaneDir != "") { - if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1") //if(Copy(RTKKM3.BasePointInLaneDir, 2, 1) != "1") + if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1") { JUDGE_MARK_SUB3(5, "45", true); } } } +#endif } //(5,04):遇有路口交通阻塞时进入路口,将车辆停在路口内等候 diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge07Xxqy.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge07Xxqy.cpp index 5ee34c25..72a2fcab 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge07Xxqy.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge07Xxqy.cpp @@ -34,6 +34,7 @@ bool Sub3Judge07Xxqy::dealJudgeEnter() //*) const std::vector& s509 = TableSysSet->asArray509(); m_itemv.Temp_XMJL = s509.size() > 0 && s509[0] != "" ? std::atoi(s509[0].c_str()) : 30; + m_itemv.Judge_JSC = s509.size() > 1 && s509[1] != "" ? std::atoi(s509[1].c_str()) == 1 : false; m_itemv.Temp_XS = s509.size() > 2 && s509[2] != "" ? std::atoi(s509[2].c_str()) : 30; if(ksdd != siteof::njdckm3) @@ -99,6 +100,17 @@ void Sub3Judge07Xxqy::dealJudgeItem() JUDGE_MARK_SUB3(20, "51", false); } } + +#ifdef JUDGE_USE_INSPECT + //无锡科研所规定学校区域全程速度不能大于30 + m_itemv.Temp_XMJL = 50; + const TGpsInfo& gps1 = m_car->historyGps(1); + if(Tools::greater(gps.sd, 30) && Tools::greater(gps1.sd, 30)) + { + JUDGE_MARK_SUB3(7, "02", false); + } +#endif + //20190305 if(ksdd == siteof::guizhou || ksdd == siteof::guizhouas) { diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp index 6fd5cc92..85e051f1 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp @@ -99,6 +99,16 @@ void Sub3Judge08Gjzt::dealJudgeItem() const TGpsInfo& gps = cg->real.gps; const std::string& ksdd = TableSysSet->get211(); +#ifdef JUDGE_USE_INSPECT + if(m_itemv.inspectJSC == false) + { + if(sor.jsc == SYES) + { + m_itemv.inspectJSC = true; + } + } +#endif + //计算当前是否需要判断减速 //是否需要评判减速 if(RTKKM3.BaseLaneCount >= 3 && m_itemv.Must_JianSu_Flag == false) @@ -204,10 +214,17 @@ void Sub3Judge08Gjzt::dealJudgeItem() { if(m_itemv.JudgeKind == 1) //需要评判减速相关的 { + #ifdef JUDGE_USE_INSPECT + if(m_itemv.inspectJSC == false) + { + JUDGE_MARK_SUB3(8, "02", false); + } + #else if(CheckJL_CheShu_New(30) == false) { JUDGE_MARK_SUB3(8, "02", false); } + #endif } } else diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge09Hcxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge09Hcxx.cpp index 1db12d25..a3cc378b 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge09Hcxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge09Hcxx.cpp @@ -33,6 +33,9 @@ bool Sub3Judge09Hcxx::dealJudgeEnter() //m_itemv.tmp_aqjl := strtointdef(sysset[439], 0) * 1000; //20150115 //SysSet[506]:2 项目距离,项目距离为0时,则依据时间10S m_itemv.HC_XMJL = (s506.size() > 1 && s506[1] != "" ? std::atoi(s506[1].c_str()) : 0); //20160419 +#ifdef JUDGE_USE_INSPECT + m_itemv.HC_XMJL = 75; //无锡所双向会车项目距离强制设置成75米 +#endif m_itemv.Enter_JL = cg->ai_ljjl; //20160419 //会车时候,最大右边线距离,必须小于等于这个值才认为右边距离是合法的 m_itemv.HeFa_YouBianJu = (s506.size() > 2 && s506[2] != "" ? std::atoi(s506[2].c_str()) : 0); @@ -137,7 +140,6 @@ void Sub3Judge09Hcxx::dealJudgeItem() } else { - const TRTKResult& RTKKM3_5 = m_car->historyChuanGan(5)->RTKKM3; if(RTKKM3_1.Wheel_LF_ToRightEdge == 0 && RTKKM3_3.Wheel_LF_ToRightEdge == 0 && RTKKM3_5.Wheel_LF_ToRightEdge == 0) { @@ -145,6 +147,11 @@ void Sub3Judge09Hcxx::dealJudgeItem() } } } + else + { + //如果手动进会车项目的时刻,没有测绘路段,是没法知道距离右侧车道距离的,就不判靠右行驶 yhy20240622 + m_itemv.Finish_YouCeXingShi = true; + } int s442 = TableSysSet->asInt442(); //减速 diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp index 1a560658..e829813f 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp @@ -1189,7 +1189,7 @@ void Sub3Judge11Kbtc::DoStatus_6() } } //20190408 - if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES && sor3.mkg == SYES && (IS_C5(m_carType) || ksdd == siteof::shanghaikm3)) + if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES && sor3.mkg == SYES && (!IS_C5(m_carType) || ksdd == siteof::shanghaikm3)) { //下车后不关闭车门 JUDGE_MARK_SUB3(11, "07", true); //20160928 diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Lkdt.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Lkdt.cpp index 8df1b3e8..5253067f 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Lkdt.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Lkdt.cpp @@ -285,6 +285,20 @@ void Sub3Judge12Lkdt::dealJudgeItem() //检查车道是否正确 if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1 || m_exam->Gps_Itemno1 == 2 || m_exam->Gps_Itemno1 == 3) { +#ifdef JUDGE_USE_INSPECT + if(1) + { + //路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头 + //1000 0100 0010 0001 + if(RTKKM3.BasePointInLaneDir != "") + { + if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1") + { + JUDGE_MARK_SUB3(12, "45", true); + } + } + } +#else if(m_itemv.Check_CheDao == false) { m_itemv.Check_CheDao = true; @@ -298,8 +312,12 @@ void Sub3Judge12Lkdt::dealJudgeItem() } } } + +#endif } + + //不按规定考试(比如:走错车道了 //方向灯标志 diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp index bd3382b0..f72bc54f 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp @@ -403,6 +403,26 @@ void Sub3Judge12Ptdt::dealJudgeItem() return; } + +#ifdef JUDGE_USE_INSPECT //无锡所送检转向灯少于3s即转向 + if(m_itemv.b_FXD) + { + if(m_exam->TestPro == ItemProFlagEnd) + { + //开转向灯少于3s即转向 + if(!m_itemv.FXD_TM_OK_Flag) //20141107 + { + if(!m_itemv.MarkFlag_12_43) + { + JUDGE_MARK_SUB3(12, "43", false); + m_itemv.MarkFlag_12_43 = true; + } + } + } + } +#endif + + char buf[128] = {0}; SafeSprintf(buf, sizeof(buf), "结束距离=%d,当前距离=%d;角度阈值=%d,当前角度变化=%0.2f", m_itemv.XMJL_Mi, cg->ai_ljjl-m_itemv.CSJL_Mi, m_itemv.FinishDiaoTou_JiaoDu_Change, gps.hxj-m_itemv.CS_GPS_D); diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.cpp index daffa29b..47ce97f9 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.cpp @@ -95,6 +95,7 @@ void Sub3Judge15Lkzz::dealJudgeItem() if(!m_car->isQualified()) { m_exam->TestPro = ItemProFlagEnd; + JudgeFlagEnd(); return; } } @@ -243,6 +244,7 @@ void Sub3Judge15Lkzz::dealJudgeItem() if(cg->ai_ljjl_cm - m_itemv.StopLine_JLCM >= dis2) { m_exam->TestPro = ItemProFlagEnd; + JudgeFlagEnd(); return; } } @@ -264,7 +266,11 @@ void Sub3Judge15Lkzz::dealJudgeItem() //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 if(m_itemv.Cross_TZX_Flag == false) { - if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1) + bool inspectInShape = false; +#ifdef JUDGE_USE_INSPECT + inspectInShape = (RTKKM3.InShapeAttr == TRTKResult::InShapeAttr1); +#endif + if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1 || inspectInShape) { m_itemv.Cross_TZX_Flag = true; @@ -277,7 +283,6 @@ void Sub3Judge15Lkzz::dealJudgeItem() //路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头 //1000 0100 0010 0001 //评判方向灯 - } } @@ -365,10 +370,42 @@ void Sub3Judge15Lkzz::dealJudgeItem() if(cg->ai_ljjl_cm - m_itemv.Start_JL_CM > m_itemv.XMJL_Mi * 100) { m_exam->TestPro = ItemProFlagEnd; + JudgeFlagEnd(); return; } } +#ifdef JUDGE_USE_INSPECT + if(RTKKM3.ShapeNo == 4) + { + JUDGE_MARK_SUB3(15, "05", true); //路口左转弯 226a 左转弯通过路口时,未靠路口中心左侧转弯的, 我们没扣到 + } + + //if(RTKKM3.ShapeNo == 5) //这样写,无锡所路口左转227a用例会有问题 + //{ + // m_itemv.read5FlagShapeNo = true; + //} + if(Tools::pos(",5,", RTKKM3.BodySharpData) == true) + { + if(Tools::pos(",6,", RTKKM3.BodySharpData) == false) + { + m_itemv.read5FlagShapeNo = true; + } + else + { + m_itemv.read5FlagShapeNo = false; + } + } + + if(RTKKM3.ShapeNo == 6) + { + if(!m_itemv.read5FlagShapeNo) + { + JUDGE_MARK_SUB3(15, "05", true); + } + } +#endif + if(m_itemv.Step3Flag == true) { //1、左转方向扣分(标配) @@ -441,6 +478,7 @@ void Sub3Judge15Lkzz::dealJudgeItem() if(OKFlag == true) { m_exam->TestPro = ItemProFlagEnd; + JudgeFlagEnd(); return; } } @@ -520,3 +558,24 @@ void Sub3Judge15Lkzz::JudgeFXD() } } +void Sub3Judge15Lkzz::JudgeFlagEnd() +{ + if(m_exam->TestPro == ItemProFlagEnd) + { + if(m_itemv.LuK_Fx_PointNo > 0) + { + if(m_itemv.OKFangXiangPt_SuccessFlag == false && m_itemv.ReadNextLuDuanFlag == true) + { + JUDGE_MARK_SUB3(15, "41", true); + } + } + +#ifdef JUDGE_USE_INSPECT + if(!m_itemv.read5FlagShapeNo) + { + JUDGE_MARK_SUB3(15, "05", true); + } +#endif + + } +} diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.h index 741b8d8f..9d62aefb 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge15Lkzz.h @@ -45,6 +45,7 @@ public: protected: void JudgeFXD(); + void JudgeFlagEnd(); private: TSub3Item15Lkzz m_itemv; diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp index fca21d7a..d6998132 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp @@ -47,7 +47,7 @@ void Sub3Judge20Comm::dealJudgeItem() // } if(m_car->historyCount() < 2*FRAMES_PER_SECOND) return; //必须收满2秒数据 - if(sor.dw >= 5 && sor.dw != 9 && gps.sd >= 10) + if(sor.dw >= 4 && sor.dw != 9 && gps.sd >= 10) { m_itemvXLG.CGD_Nums = m_itemvXLG.CGD_Nums + 1; } @@ -93,8 +93,10 @@ void Sub3Judge20Comm::dealJudgeItem() //5、压线评判 Judge_YaXian_30120(); Judge_YaXian_10S_XuXian(); + //6、起步方向灯、喇叭 Judge_QiBu_FXD_LaBa(); + //7、连续变道 Judge_LianXuBianDao(); //8、不能停止人行横道网格线内 @@ -226,7 +228,12 @@ void Sub3Judge20Comm::Init_ZongHe() const std::vector& s510 = TableSysSet->asArray510(); m_itemvCJH.dtzzj = s510.size() > 3 && s510[3] != "" ? std::atoi(s510[3].c_str()) : 150; //StrToIntdef(GetDotStr(4, sysset[510], ','), 150); TCar* tcar = m_car->getTCar(); - tcar->fxd3scs = 3 * 5; + tcar->fxd3scs = 3 * FRAMES_PER_SECOND; //tcar->fxd3scs = 3 * 5; + +#ifdef JUDGE_USE_INSPECT + tcar->fxd3scs = 12; +#endif + //空挡滑行参数 m_itemvCJH.kdhx = 5; //StrToIntdef(readiniparam('综合评判', 'kdhx', '8'), 8); 20170712 if(ksdd == siteof::njdckm3) @@ -289,6 +296,9 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.mndgddsj = (s500.size() > 16 && s500[16] != "" ? std::atoi(s500[16].c_str()) : 0) * SECOND; //变道方向灯评判时机 0:以变道时判灯 2:以压线时记录打灯记录,变道时评判 m_itemvCJH.bdfxdsj = s500.size() > 17 && s500[17] != "" ? std::atoi(s500[17].c_str()) : 0; +#ifdef JUDGE_USE_INSPECT + m_itemvCJH.bdfxdsj = 2; +#endif //中心虚线借道是否要打方向灯 0:不需要 1:需求 默认为0 m_itemvCJH.JieDaoFXD_Flag = s500.size() > 18 && s500[18] != "" ? std::atoi(s500[18].c_str()) == 1 : false; @@ -734,7 +744,7 @@ void Sub3Judge20Comm::doCheck_ZuoYi() if(m_car->rtkEnabled() && cg->ai_ljjl > 1 && cg->move == moveForward) { m_itemvCJH.bJc2 = true; - JUDGE_MARK_SUB3(2, "53", true); + JUDGE_MARK_SUB3(2, "53", true); //检查座椅 } } } @@ -743,6 +753,11 @@ void Sub3Judge20Comm::doCheck_ZuoYi() //加载模拟灯光项目 void Sub3Judge20Comm::CallMoNiDengGuang() { + +#ifdef JUDGE_USE_INSPECT + return; //屏蔽模拟灯光 +#endif + TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备 if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg) { @@ -988,11 +1003,12 @@ void Sub3Judge20Comm::Judge_LiuChe() const TSensorInfo& sor = cg->real.sensor; const TChuanGan* his1 = m_car->historyChuanGan(1); - constexpr int LC30FaZhi = 12; + static constexpr int LCValue = 32; //后溜车距离 + static constexpr int LC30FaZhi = 12; if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return; if(cg->move == moveForward && his1->move == moveForward) //前进的时候要评判溜车小于30厘米的 { - if(m_PubMaxLCValue >= LC30FaZhi && m_PubMaxLCValue <= 30) + if(m_PubMaxLCValue >= LC30FaZhi && m_PubMaxLCValue <= LCValue) { //通用或起步项目 JUDGE_MARK_SUB3(2, "47", false); @@ -1035,7 +1051,7 @@ void Sub3Judge20Comm::Judge_LiuChe() } } //溜车大于30了,直接扣分 - if(m_PubCanMarkLC50Flag == true && m_PubMaxLCValue >= 31) + if(m_PubCanMarkLC50Flag == true && m_PubMaxLCValue > LCValue) { JUDGE_MARK_SUB3(2, "46", false); m_PubCanMarkLC50Flag = false; @@ -1137,6 +1153,22 @@ void Sub3Judge20Comm::Judge_KongDangHuaXing() const TSensorInfo& sor = cg->real.sensor; const std::string& ksdd = TableSysSet->get211(); +#ifdef JUDGE_USE_INSPECT + + //无锡所只要0档前进就算空挡滑行 + const TChuanGan* his1 = m_car->historyChuanGan(1); + const TGpsInfo& gps1 = his1->real.gps; + const TSensorInfo& sor1 = his1->real.sensor; + if(cg->move == moveForward && sor.dw_plc == 0 && Tools::greater(gps.sd, 1) && + his1->move == moveForward && sor1.dw_plc == 0 && Tools::greater(gps1.sd, 1)) + { + JUDGE_MARK_SUB3(20, "11", false); + } + return; + +#endif + + //空挡滑行:30115 相关评判 if(m_itemvCJH.kdhx_tk > 0) { @@ -1217,7 +1249,7 @@ void Sub3Judge20Comm::Judge_KongDangHuaXing() } else { - if(sor.dw == SNOT && m_itemvCJH.kdhx_tk == 0 && cg->move == moveForward && gps.sd < 5) + if(sor.dw == SNOT && m_itemvCJH.kdhx_tk == 0 && cg->move == moveForward && gps.sd > 5) { m_itemvCJH.kdhx_tk = cg->tkCnt; } @@ -1355,7 +1387,7 @@ void Sub3Judge20Comm::Judge_KongDangHuaXing() } else { - if(sor.lhq == SYES && cg->move == moveForward && gps.sd < 5) + if(sor.lhq == SYES && cg->move == moveForward && gps.sd > 5) { m_itemvCJH.kdhx_tk_lhq = cg->tkCnt; } @@ -1902,16 +1934,20 @@ void Sub3Judge20Comm::Judge_YaXian_10S_XuXian() { if(cg->tkCnt - m_PubLastMark_XuXian_TK >= 10 * SECOND) { + const char* serial = "65"; + #ifdef JUDGE_USE_INSPECT + serial = "118"; + #endif if(m_car->isExamDrill()) { //长时间骑轧车道分界线行驶 - JUDGE_MARK_SUB3(20, "65", false); + JUDGE_MARK_SUB3(20, serial, false); m_PubLastMark_XuXian_TK = cg->tkCnt; } else { //长时间骑轧车道分界线行驶 - JUDGE_MARK_SUB3(20, "65", true); + JUDGE_MARK_SUB3(20, serial, true); m_PubLastMark_XuXian_TK = cg->tkCnt; } } @@ -1975,7 +2011,8 @@ void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() } if(OKNum < 3*FRAMES_PER_SECOND) { - JUDGE_MARK_SUB3(20, "224", false, true); + //JUDGE_MARK_SUB3(20, "224", false, true); + JUDGE_MARK_SUB3(2, "43", false, true); } } @@ -1983,8 +2020,10 @@ void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() FindFlag = (sor.lb == SYES); if(!FindFlag) { - for(int i = 1; i < 100 ; i++) + int count = m_car->historyCount(); + for(int i = 1; i < 100; i++) { + if(i >= count) break; const TChuanGan* hisi = m_car->historyChuanGan(i); const TSensorInfo& sori = hisi->real.sensor; if(hisi->move == moveStop) @@ -1999,7 +2038,7 @@ void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() } if(!FindFlag) { - JUDGE_MARK_SUB3(2, "102", false, true); + JUDGE_MARK_SUB3(2, "07", false, true); } } } @@ -2423,8 +2462,13 @@ void Sub3Judge20Comm::Judge_LianXuBianDao() const std::vector& ss = Tools::split(Temp, "^"); + //0:abc 1:aba和abc都判 ctl->LianXuBianDaoKind = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0; - ctl->LianXuBianDao_CC = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 2; +//#ifdef JUDGE_USE_INSPECT +// ctl->LianXuBianDaoKind = 1; +//#endif + + ctl->LianXuBianDao_CC = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 1; //连续变更两条以上车道 //SysSet[528]:掉头N米内不判连续变道和方向灯 @@ -3179,6 +3223,7 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2() //ToDo:判断之前x秒内面部是否向左回头看 yhyflag //20180523 5 左后 ///////////// + } else { @@ -3602,6 +3647,8 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2() void Sub3Judge20Comm::Mark_FXD_42_43(bool Flag42) { + + /* bool CCFlag = m_car->itemsSomeExaming2(Sub3ItemType10Ccxx); //超车 if(CCFlag == true) //20150427 { @@ -3625,6 +3672,33 @@ void Sub3Judge20Comm::Mark_FXD_42_43(bool Flag42) JUDGE_MARK_SUB3(4, "43", false); } } + */ + + bool CCFlag = m_car->itemsSomeExaming2(Sub3ItemType10Ccxx); //超车 + if(CCFlag == true) //20150427 + { + if(Flag42 == true) + { + JUDGE_MARK_SUB3(10, "42", false); + } + else + { + JUDGE_MARK_SUB3(10, "43", false); + } + } + else + { + bool BGCD_ItemFlag = m_car->itemsSomeExaming2(Sub3ItemType04Bgcd); //变更车道 + if(BGCD_ItemFlag == true) return; + if(Flag42 == true) + { + JUDGE_MARK_SUB3(4, "42", false); + } + else + { + JUDGE_MARK_SUB3(4, "43", false); + } + } } void Sub3Judge20Comm::HandleSysSet409_1_Common() @@ -4146,13 +4220,33 @@ void Sub3Judge20Comm::Judge_QiBuDang_50() const TChuanGan* his1 = m_car->historyChuanGan(1); const TChuanGan* his2 = m_car->historyChuanGan(2); - if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) + if((cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) || (sor.dw >= 2 && sor.dw <= 9)) { m_itemvXLG.CSH_QBDW_Flag = false; - m_itemvXLG.Mark_20_77_Flag = false; } + if(cg->move == moveForward && his1->move == moveForward) { + if(sor.dw == 1) + { + if(!m_itemvXLG.CSH_QBDW_Flag && cg->ai_ljjl_cm > 0) + { + m_itemvXLG.CSH_QBDW_Flag = true; + m_itemvXLG.Mark_20_77_Flag = false; + m_itemvXLG.QB_CSJL_CM = cg->ai_ljjl_cm; + } + if(m_itemvXLG.CSH_QBDW_Flag && std::abs(cg->ai_ljjl_cm - m_itemvXLG.QB_CSJL_CM) >= 50 * 100) + { + if(!m_itemvXLG.Mark_20_77_Flag) + { + JUDGE_MARK_SUB3(20, "77", false); + m_itemvXLG.Mark_20_77_Flag = true; + } + } + } + + /* + if(!m_itemvXLG.CSH_QBDW_Flag) { m_itemvXLG.CSH_QBDW_Flag = true; @@ -4163,12 +4257,12 @@ void Sub3Judge20Comm::Judge_QiBuDang_50() if(sor.dw == 1) { int count = m_car->historyCount(); - for(int i = 1; i< 200; i++) + for(int i = 1; i < 200; i++) { if(count <= i) break; const TChuanGan* hisi = m_car->historyChuanGan(i); - const TSensorInfo& sori = hisi->real.sensor; + const TSensorInfo& sori = hisi->real.sensor; if(sori.dw != 1) break; if(hisi->move != moveForward) break; @@ -4180,6 +4274,7 @@ void Sub3Judge20Comm::Judge_QiBuDang_50() } } } + */ } } @@ -4255,7 +4350,7 @@ void Sub3Judge20Comm::Judge_DW_KongDang() //启动发动机时,挡位未至于空挡(驻车挡) if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT) { - if(sor.dw != 0) + if(sor.dw_plc != 0) //(sor.dw != 0) //用原始档位无锡所 { JUDGE_MARK_SUB3(2, "04", false); } @@ -4282,8 +4377,8 @@ void Sub3Judge20Comm::Judge_ChangShiJian_QiDongYaoShi() m_itemvXLG.qdysFlag = true; } if(sor.dh2 == SYES && sor5.dh2 == SYES && sor6.dh2 == SYES && - sor7.dh2 == SYES && sor8.dh2 == SYES && sor9.dh2 == SYES && - sor10.dh2 == SYES && sor11.dh2 == SYES && sor12.dh2 == SYES) + sor7.dh2 == SYES && sor8.dh2 == SYES && sor9.dh2 == SYES && + sor10.dh2 == SYES && sor11.dh2 == SYES && sor12.dh2 == SYES) { if(m_itemvXLG.qdysFlag == true) { @@ -4334,7 +4429,8 @@ void Sub3Judge20Comm::Judge_DaKaiCheMen() bool FindFlag = (item11 && item11->Item_Color == itemStateZk); if(sor.mkg == SYES && FindFlag == false) { - JUDGE_MARK_SUB3(20, "90", true); + //无锡所数据库里扣分表没有这个扣分只能扣上面的那个 //打开车门 2, "02", + JUDGE_MARK_SUB3(2, "02", true); //20, "90" } } } @@ -4342,15 +4438,24 @@ void Sub3Judge20Comm::Judge_DaKaiCheMen() //22、起步挂错挡 void Sub3Judge20Comm::Judge_QiBu_GuaCuoDang() { + if(m_car->historyCount() < 2) return; const TChuanGan* cg = m_car->historyChuanGan(); const TChuanGan* his1 = m_car->historyChuanGan(1); if(cg->move == moveForward && his1->move == moveStop) { const TSensorInfo& sor = cg->real.sensor; + +#ifdef JUDGE_USE_INSPECT + if(sor.dw_plc >= 2) //无锡所用原始档位 + { + JUDGE_MARK_SUB3(2, "44", false); + } +#else if(sor.dw >= 2) { JUDGE_MARK_SUB3(2, "44", false); } +#endif } } @@ -4692,7 +4797,7 @@ void Sub3Judge20Comm::Judge_CiGaoDang() { JUDGE_MARK_SUB3(14, "03", true); } - else if(m_itemvXLG.CGD_Nums < 25) + else if(m_itemvXLG.CGD_Nums < 5 * FRAMES_PER_SECOND) //要在次高档行驶5秒 { JUDGE_MARK_SUB3(14, "04", true); } @@ -4883,10 +4988,12 @@ void Sub3Judge20Comm::Judge_Extra() if(item14->Item_Color == itemStateWk) { //ToDo1:生成 全程加减挡 进项目事件 - item14->Item_Color = itemStateZk; - item14->TestPro = ItemProFlagInit; - item14->FinishFlag = false; - //m_car->createEventEnterItem({item14->ItemNo, ""}); + //item14->Item_Color = itemStateZk; + //item14->TestPro = ItemProFlagInit; + //item14->FinishFlag = false; + + m_car->createEventEnterItem({item14->ItemNo, ""}); + m_car->KM3EndItem(item14->ItemNo); } } } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp index 2236352c..83fa2473 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp @@ -29,17 +29,68 @@ bool Sub3Judge41Mndg::dealJudgeEnter() setSeed(gps.sj); //加载合法的灯光 //参考头文件注释说明[灯光类型] + // m_lights = + // { + // "111", /*打开灯光*/ + // "211", "212", "213", "214", "215", "221", /*交替使用远近光灯*/ + // "311", "321", "331", "332", "333", "341", "342", "351", /*开近光灯*/ + // "411", "412", "421", /*开远光灯*/ + // "511", "512", /*车辆发生故障(关大灯、开双跳)*/ + // "611", /*故障解除*/ + // "711", /*关闭灯光*/ + // "811", "812", /*双跳灯+雾灯*/ + // "911" /*雨刮器*/ + // }; m_lights.clear(); m_lights = { - "111", - "211", "212", "213", "214", "215", "221", - "311", "321", "331", "332", "333", "341", "342", "351", - "411", "412", "421", - "511", "512", - "611", "711", - "811", "812", - "911" + /*打开灯光*/ + {"yj111", sound::sub3_417002}, //打开灯光 *下面将进行模拟夜间行驶场景灯光使用的考试,请按语音指令,在5秒内做出相应的灯光操作,请开启前照灯 + + /*交替使用远近光灯 (不允许出现除“交替”之外的其他灯光变化)*/ + {"yj211", sound::sub3_417007}, //夜间通过急弯 + {"yj212", sound::sub3_417008}, //夜间通过坡路 + {"yj213", sound::sub3_417009}, //夜间通过拱桥 + {"yj214", sound::sub3_4170010}, //夜间通过人行横道 + {"yj215", sound::sub3_4170011}, //夜间通过没有交通信号灯控制的路口 + {"yj221", sound::sub3_4170012}, //夜间超越前方车辆 + + /*开近光灯*/ + {"yj311", sound::sub3_417003}, //夜间同方向近距离跟车行驶 + {"yj321", sound::sub3_417004}, //夜间与机动车会车 + {"yj331", sound::sub3_417005}, //夜间直行通过路口(在有交通信号灯控制的路口直行) + {"yj332", sound::sub3_4170017}, //夜间路口左转弯 + {"yj333", sound::sub3_4170018}, //夜间路口右转弯 + {"yj341", sound::sub3_4170019}, //夜间在有路灯的道路上行驶 + {"yj342", sound::sub3_417006}, //夜间在照明良好的道路上行驶 + {"yj351", ""}, //请打开近光灯, !!!石家庄*删除 + + /*开远光灯*/ + {"yj411", sound::sub3_4170014}, //夜间在没有照明的道路上行驶 !!!语音不对 4170014和4170016重复了声音一模一样 + {"yj412", sound::sub3_4170016}, //夜间在照明不良的道路上行驶 !!!语音不对 4170014和4170016重复了声音一模一样 + {"yj421", ""}, //请打开远光灯, !!!石家庄*删除 + + /*车辆发生故障(关大灯、开双跳)*/ + {"yj511", sound::sub3_4170013}, //车辆发生故障(关大灯、开双跳)(改成路边临时停车,需改语音) + {"yj512", ""}, //车辆发生交通事故 !!!取消 + + /*故障解除*/ + {"yj611", ""}, //故障解除、继续夜间行驶 !!!取消 + + /*关闭灯光*/ + {"yj711", sound::sub3_417001}, //请关闭所有灯光 + + /*双跳灯+雾灯*/ + {"yj811", ""}, //雾天行驶 20150126 石家庄 + {"yj812", ""}, //大雨中行驶 guizhou + + /*雨刮器*/ + {"yj911", ""}, //雨天行驶 20150514 + + /* 用不到?? ? */ + {XCharacter("关灯"), sound::sub3_417001}, //请关闭所有灯光 + {XCharacter("照明不良"), sound::sub3_417002}, //下面将进行模拟夜间行驶场景灯光使用的考试,请按语音指令,在5秒内做出相应的灯光操作,请开启前照灯 + {XCharacter("模拟完成"), sound::sub3_4170015} //模拟夜间考试完成 }; //Pub_Log('开始模拟夜间New'); @@ -109,6 +160,11 @@ void Sub3Judge41Mndg::dealJudgeItem() const TGpsInfo& gps1 = his1->real.gps; const std::string& ksdd = TableSysSet->get211(); + if(sor.wav > 0) + { + logtrace("mndg-sound wavend=%d", sor.wav); + } + if(ksdd == siteof::zjnb) { if(cg->move == moveStop && sor.ssc == SNOT) @@ -542,7 +598,7 @@ void Sub3Judge41Mndg::Open_DengGuang() //下面将进行模拟夜间灯光的考试,请根据播报的驾驶场景,在播报后5秒内做出相应的灯光操作,请开启前照灯 //Windows //sd_str = ExtractFilePath(Application.ExeName) + 'Sound\照明不良.wav'; - m_car->createEventSound({itemNo(), sound::sub3_417002}); + m_car->createEventSound({itemNo(), sound::sub3_417002, PlaySoundEndNotify}); m_itemv.Snd_Wav_Start_TM = gps.sj; //鸿蒙:语音播报"下面将进行模拟夜间灯光的考试,请根据播报的驾驶场景,在播报后5秒内做出相应的灯光操作,请开启前照灯" @@ -664,7 +720,9 @@ void Sub3Judge41Mndg::Open_DengGuang() //20180324 if(s383 == m_s383arg) //20150126 石家庄 { - int b = random2(1, 4); + // 2015-01-26 石家庄需要将383参数设置为0^1^4^ + // 四套灯光语音,随机播放任意一套作为考试题目 + int b = random2(1, 4); //random(4) + 1; m_itemv.P_Op_Cnt = 8; if(b == 1) { @@ -726,7 +784,7 @@ void Sub3Judge41Mndg::Open_DengGuang() //第一种4,2,1;3,2,1;2,1,1;5,1,1;3,1,1;2,1,2;4,1,1;3,3,1;2,2,1; //第二种2,1,3;4,2,1;3,1,1;2,1,5;5,1,1;3,4,1;2,2,1;4,1,1;3,2,1; //第三种2,1,1;4,1,1;3,1,1;2,2,1;5,1,1;3,2,1;2,1,2;4,2,1;3,4,1; - int b = random2(1, 3); + int b = random2(1, 3); //random(3) + 1; m_itemv.P_Op_Cnt = 9; if(b == 1) { @@ -945,7 +1003,7 @@ void Sub3Judge41Mndg::Open_DengGuang() std::string dgstr1, dgstr2, dgstr3; //这里需要重点讲解这块与C++的差异,我们从dgstr1[1] 开始计算的。这块翻译特别关键。 //1、生成1级灯光代码 - for(int i = 0; i < m_itemv.P_Op_Cnt; i++) + for(int i = 1; i <= m_itemv.P_Op_Cnt; i++) { int a = 0; if(CurrYJ == 1) //当前是远光灯 @@ -980,11 +1038,11 @@ void Sub3Judge41Mndg::Open_DengGuang() { if(i == m_itemv.P_Op_Cnt) { - a = random2(0, 3) + 2; //random(4) + 2; + a = random2(2, 5); //random(4) + 2; } else { - a = random2(0, 2) + 2; //random(3) + 2; + a = random2(2, 4); //random(3) + 2; } if(a == ErrorNum) continue; @@ -1014,11 +1072,11 @@ void Sub3Judge41Mndg::Open_DengGuang() { if(i == m_itemv.P_Op_Cnt) { - a = random2(0, 3) + 2; //random(4) + 2; + a = random2(2, 5); //random(4) + 2; } else { - a = random2(0, 2) + 2; //random(3) + 2; + a = random2(2, 4); //random(3) + 2; } if(a != 3 && dgarr_1[a] > 0) break; //非近光灯的题目都可以 @@ -1046,11 +1104,11 @@ void Sub3Judge41Mndg::Open_DengGuang() { if(i == m_itemv.P_Op_Cnt) { - a = random2(0, 3) + 2; //random(4) + 2; + a = random2(2, 5); //random(4) + 2; } else { - a = random2(0, 2) + 2; //random(3) + 2; + a = random2(2, 4); //random(3) + 2; } if(a != 2 && dgarr_1[a] > 0) break; //非交替光灯的题目都可以 @@ -1101,7 +1159,7 @@ void Sub3Judge41Mndg::Open_DengGuang() k = 3; } - for(int j = 0; j < k; j++) + for(int j = 1; j <= k; j++) { std::string TempData = ""; TempData.append(1, dgstr1[i]).append(1, dgstr2[i]).append(std::to_string(j)); @@ -1124,13 +1182,13 @@ void Sub3Judge41Mndg::Open_DengGuang() } if(ksdd == siteof::guizhou) { - int i = random2(0, 2); + int i = random2(0, 2); //random(3); if(i == 1) { - i = random2(1, 5); + i = random2(1, 5); //random(5) + 1; std::vector s = Tools::split(m_itemv.Op_Rd_str, ";"); dgstr1 = (int)s.size() > i ? s[i] : ""; //GetDotStr(I, m_itemv.Op_Rd_str, ';'); - i = random2(1, 2); + i = random2(1, 2); //random(2) + 1; if(i == 1) m_itemv.Op_Rd_str = Tools::replace(m_itemv.Op_Rd_str, dgstr1, "8,1,1"); else @@ -1173,7 +1231,7 @@ void Sub3Judge41Mndg::Open_DengGuang() std::string str1; do { - int a = random2(0, m_itemv.P_Op_Cnt-1); + int a = random2(0, m_itemv.P_Op_Cnt-1); // random(ItmNight.P_Op_Cnt) + 1; str1 = std::string((int)sstr.size() > a ? sstr[a] : "") + ";"; }while(Tools::pos(str1, m_itemv.Op_Rd_str) == true); @@ -1192,8 +1250,10 @@ void Sub3Judge41Mndg::Open_DengGuang() std::string::size_type xh = m_itemv.Op_Rd_str.find(x511); if(xh != std::string::npos) { - std::string str = m_itemv.Op_Rd_str.substr(0, xh-1) + Tools::trim(m_itemv.Op_Rd_str.substr(xh + x511.length())); - m_itemv.Op_Rd_str = str + x511; + //std::string str = m_itemv.Op_Rd_str.substr(0, xh) + Tools::trim(m_itemv.Op_Rd_str.substr(xh + x511.length())); + //m_itemv.Op_Rd_str = str + x511; + m_itemv.Op_Rd_str.erase(xh, x511.length()); + m_itemv.Op_Rd_str += x511; } } //ToDo:保存模拟灯光字符串到JSON文件 @@ -2913,28 +2973,43 @@ void Sub3Judge41Mndg::storageLightItem(const std::string& item) void Sub3Judge41Mndg::playSound(const std::string& kind, int subWav1, int subWav2) { std::string id = kind + std::to_string(subWav1) + std::to_string(subWav2); - std::string code = ""; - if(id == XCharacter("关灯")) code = sound::sub3_417001; //417001 \sound\关灯.wav 请关闭所有灯光 - else if(id == XCharacter("照明不良")) code = sound::sub3_417002; //417002 \sound\照明不良.wav 下面将进行模拟夜间行驶场景灯光使用的考试,请按语音指令,在5秒内做出相应的灯光操作,请开启前照灯 - else if(id == XCharacter("yj311")) code = sound::sub3_417003; //417003 \sound\yj311.wav 夜间同方向近距离跟车行驶 - else if(id == XCharacter("yj321")) code = sound::sub3_417004; //417004 \sound\yj321.wav 夜间与机动车会车 - else if(id == XCharacter("yj331")) code = sound::sub3_417005; //417005 \sound\yj331.wav 夜间直行通过路口 - else if(id == XCharacter("yj342")) code = sound::sub3_417006; //417006 \sound\yj342.wav 夜间在照明良好的道路上行驶 - else if(id == XCharacter("yj211")) code = sound::sub3_417007; //417007 \sound\yj211.wav 夜间通过急弯 - else if(id == XCharacter("yj212")) code = sound::sub3_417008; //417008 \sound\yj212.wav 夜间通过坡路 - else if(id == XCharacter("yj213")) code = sound::sub3_417009; //417009 \sound\yj213.wav 夜间通过拱桥 - else if(id == XCharacter("yj214")) code = sound::sub3_4170010; //4170010 \sound\yj214.wav 夜间通过人行横道 - else if(id == XCharacter("yj215")) code = sound::sub3_4170011; //4170011 \sound\yj215.wav 夜间通过没有交通信号灯控制的路口 - else if(id == XCharacter("yj221")) code = sound::sub3_4170012; //4170012 \sound\yj221.wav 夜间超越前方车辆 - else if(id == XCharacter("yj511")) code = sound::sub3_4170013; //4170013 \sound\yj511.wav 路边临时停车 - else if(id == XCharacter("yj411")) code = sound::sub3_4170014; //4170014 \sound\yj411.wav 夜间在没有照明的道路上行驶 - else if(id == XCharacter("模拟完成")) code = sound::sub3_4170015; //4170015 \sound\模拟完成.wav 模拟夜间考试完成 - else if(id == XCharacter("yj412")) code = sound::sub3_4170016; //4170016 \sound\yj412.wav 夜间在照明不良的道路上行驶 - else if(id == XCharacter("yj332")) code = sound::sub3_4170017; //4170017 \sound\yj332.wav 夜间左转 - else if(id == XCharacter("yj333")) code = sound::sub3_4170018; //4170018 \sound\yj333.wav 夜间右转 - else logerror("error sound code id=%s", id.c_str()); - if(code.empty()) return; - m_car->createEventSound({itemNo(), code}); + std::string code = ""; + const auto it = m_lights.find(id); + if(it != m_lights.end()) + { + code = it->second; + } + else + { + //没找到这个灯光项目 + logerror("mndg-sound-no-item id=%s, code=%s", id.c_str(), code.c_str()); + } + + if(code.empty()) + { + //有可能没这个灯光项目 或者 这个灯光项目没有对应的语音码 + logerror("mndg-sound-empty id=%s, code=%s", id.c_str(), code.c_str()); + } + + logtrace("mndg-sound id=%s code=%s", id.c_str(), code.c_str()); + m_car->createEventSound({itemNo(), code, PlaySoundEndNotify}); } + +void Sub3Judge41Mndg::playSoundEnd(const std::string& code) +{ + //语音结束信号 + const TChuanGan* cg = m_car->historyChuanGan(); + const TGpsInfo& gps = cg->real.gps; + //const TSensorInfo& sor = cg->real.sensor; + //等待语音完成 + //if(sor.wav == SYES) //语音结束信号 + { + m_itemv.Snd_Wav_End_TM = gps.sj; + CSH_DengGuangSubItem(); + m_itemv.ItemStatus = m_itemv.ItemStatus + 1; + } + +} + diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h index e5f39bd5..0850a31d 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h @@ -177,6 +177,8 @@ public: DEAL_API bool dealJudgeEnter() override; DEAL_API void dealJudgeItem() override; + //语音播报结束 + void playSoundEnd(const std::string& code); protected: //更新灯光变化 void UpdateDengGuangChange(); @@ -208,10 +210,14 @@ protected: void storageLightItem(const std::string& item); //语音码播放语音 void playSound(const std::string& kind, int SubWav1, int SubWav2); + private: TSub3Item41Mndg m_itemv; - std::set m_lights; //HeFaDengGuangDataList //加载合法的灯光 //参考头文件注释说明[灯光类型] + std::map m_lights; //HeFaDengGuangDataList //加载合法的灯光 //参考头文件注释说明[灯光类型] + + // 2015-01-26 石家庄需要将383参数设置为0^1^4^ + // 四套灯光语音,随机播放任意一套作为考试题目 const std::string m_s383arg = "0^1^4^"; //383参数 新模拟夜间(次数^错扣^固定^) //bool PlaySnd_ID = false; //正在播报语音标志 diff --git a/entry/src/main/cpp/sdk/parser/XParser.cpp b/entry/src/main/cpp/sdk/parser/XParser.cpp index dbf64a4a..a07753ec 100644 --- a/entry/src/main/cpp/sdk/parser/XParser.cpp +++ b/entry/src/main/cpp/sdk/parser/XParser.cpp @@ -35,7 +35,7 @@ bool XParser::parseInitExam(const std::string& data, TInitInfo* info) if(ExamSubject2 == info->kskm) { CHECK_GET_PARAM(object, "allitems", info->allitems); - get (object, "iteminfo", info->iteminfo); + CHECK_GET_PARAM(object, "iteminfo", info->iteminfo); } else if(ExamSubject3 == info->kskm) { @@ -606,48 +606,55 @@ bool XParser::get(Json::Value& object, const char* key, TGpsInfo& store, const T bool XParser::get(Json::Value& object, const char* key, TSensorInfo& store, const TSensorInfo& defaults) noexcept { - CHECK_GET_OBJECT({ - CHECK_GET_PARAM(value, "aqd", store.aqd); - get(value, "mkg", store.mkg); - get(value, "ssc", store.ssc); - get(value, "jsc", store.jsc); - get(value, "fsc", store.fsc); - get(value, "lhq", store.lhq); - get(value, "lb", store.lb); - get(value, "skd", store.skd); - get(value, "jgd", store.jgd); - get(value, "ygd", store.ygd); - get(value, "zfxd", store.zfxd); - get(value, "yfxd", store.yfxd); - get(value, "shtd", store.shtd); - get(value, "wd", store.wd); - get(value, "ygq", store.ygq); - get(value, "dh1", store.dh1); - get(value, "dh2", store.dh2); - get(value, "fdjzs", store.fdjzs); - get(value, "dw", store.dw); - get(value, "cs", store.cs); - get(value, "fxp", store.fxp); - get(value, "ljmc", store.ljmc); - get(value, "lcmc", store.lcmc); - get(value, "csbzq", store.csbzq); - get(value, "csbzh", store.csbzh); - get(value, "csbyq", store.csbyq); - get(value, "csbyh", store.csbyh); - get(value, "zy", store.zy); - get(value, "tbp", store.tbp); - get(value, "hsj", store.hsj); - get(value, "dcj", store.dcj); - get(value, "gx", store.gx); - get(value, "yl", store.yl); - CHECK_GET_PARAM(value, "yy", store.yy); - CHECK_GET_PARAM(value, "rmndg", store.rmndg); - CHECK_GET_PARAM(value, "wav", store.wav); //20240405 - CHECK_GET_PARAM(value, "mndg", store.mndg); //20240405 - CHECK_GET_PARAM(value, "sde", store.sde); //20240405 - CHECK_GET_PARAM(value, "xhd", store.xhd); - //get(value, "mitemno", store.mitemno); - }); + store = defaults; + CHECK_GET_OBJECT_V2({ + CHECK_GET_PARAM(value, "aqd", store.aqd); + CHECK_GET_PARAM(value, "mkg", store.mkg); + CHECK_GET_PARAM(value, "ssc", store.ssc); + CHECK_GET_PARAM(value, "jsc", store.jsc); + CHECK_GET_PARAM(value, "fsc", store.fsc); + CHECK_GET_PARAM(value, "lhq", store.lhq); + CHECK_GET_PARAM(value, "lb", store.lb); + CHECK_GET_PARAM(value, "skd", store.skd); + CHECK_GET_PARAM(value, "jgd", store.jgd); + CHECK_GET_PARAM(value, "ygd", store.ygd); + CHECK_GET_PARAM(value, "zfxd", store.zfxd); + CHECK_GET_PARAM(value, "yfxd", store.yfxd); + CHECK_GET_PARAM(value, "shtd", store.shtd); + CHECK_GET_PARAM(value, "wd", store.wd); + CHECK_GET_PARAM(value, "ygq", store.ygq); + }); + + CHECK_GET_OBJECT_V2({ + CHECK_GET_PARAM(value, "dh1", store.dh1); + CHECK_GET_PARAM(value, "dh2", store.dh2); + CHECK_GET_PARAM(value, "fdjzs", store.fdjzs); + CHECK_GET_PARAM(value, "dw", store.dw); + CHECK_GET_PARAM(value, "cs", store.cs); + CHECK_GET_PARAM(value, "fxp", store.fxp); + CHECK_GET_PARAM(value, "ljmc", store.ljmc); + CHECK_GET_PARAM(value, "lcmc", store.lcmc); + CHECK_GET_PARAM(value, "csbzq", store.csbzq); + CHECK_GET_PARAM(value, "csbzh", store.csbzh); + CHECK_GET_PARAM(value, "csbyq", store.csbyq); + CHECK_GET_PARAM(value, "csbyh", store.csbyh); + CHECK_GET_PARAM(value, "zy", store.zy); + }); + + CHECK_GET_OBJECT_V2({ + CHECK_GET_PARAM(value, "tbp", store.tbp); + CHECK_GET_PARAM(value, "hsj", store.hsj); + CHECK_GET_PARAM(value, "dcj", store.dcj); + CHECK_GET_PARAM(value, "gx", store.gx); + CHECK_GET_PARAM(value, "yl", store.yl); + CHECK_GET_PARAM(value, "yy", store.yy); + CHECK_GET_PARAM(value, "rmndg", store.rmndg); + CHECK_GET_PARAM(value, "wav", store.wav); //20240405 + CHECK_GET_PARAM(value, "mndg", store.mndg); //20240405 + CHECK_GET_PARAM(value, "sde", store.sde); //20240405 + CHECK_GET_PARAM(value, "xhd", store.xhd); + //get(value, "mitemno", store.mitemno); + }); return true; } @@ -693,9 +700,9 @@ bool XParser::get(Json::Value& object, const char* key, std::vector& CHECK_GET_PARAM(v, "markreal", t.markreal); CHECK_GET_PARAM(v, "markcatalog", t.markcatalog); CHECK_GET_PARAM(v, "markshow", t.markshow); - get(v, "OnlyOneKind", t.OnlyOneKind); - get(v, "NoCancelId", t.NoCancelId); - get(v, "GPS_SID", t.GPS_SID); + CHECK_GET_PARAM(v, "OnlyOneKind", t.OnlyOneKind); + CHECK_GET_PARAM(v, "NoCancelId", t.NoCancelId); + CHECK_GET_PARAM(v, "GPS_SID", t.GPS_SID); store.emplace_back(t); }); return true; @@ -743,27 +750,32 @@ bool XParser::get(Json::Value& object, const char* key, TEventSound& store, cons bool XParser::get(Json::Value& object, const char* key, TExamWay& store, const TExamWay& defaults) noexcept { - CHECK_GET_OBJECT({ - CHECK_GET_PARAM(value, "ldh", store.ldh); - CHECK_GET_PARAM(value, "jzcds", store.jzcds); - CHECK_GET_PARAM(value, "jzcd", store.jzcd); - CHECK_GET_PARAM(value, "qdcds", store.qdcds); - CHECK_GET_PARAM(value, "qdcd", store.qdcd); - CHECK_GET_PARAM(value, "clyx", store.clyx); - CHECK_GET_PARAM(value, "lbx", store.lbx); - CHECK_GET_PARAM(value, "cdbx", store.cdbx); - CHECK_GET_PARAM(value, "cdzbx", store.cdzbx); - CHECK_GET_PARAM(value, "zql", store.zql); - CHECK_GET_PARAM(value, "yql", store.yql); - CHECK_GET_PARAM(value, "zhl", store.zhl); - CHECK_GET_PARAM(value, "yhl", store.yhl); - CHECK_GET_PARAM(value, "cdsx", store.cdsx); - CHECK_GET_PARAM(value, "xzx", store.xzx); - CHECK_GET_PARAM(value, "cyx", store.cyx); - CHECK_GET_PARAM(value, "xzn", store.xzn); - CHECK_GET_PARAM(value, "yxfx", store.yxfx); - CHECK_GET_PARAM(value, "fjdc", store.fjdc); - }); + store = defaults; + CHECK_GET_OBJECT_V2({ + CHECK_GET_PARAM(value, "ldh", store.ldh); + CHECK_GET_PARAM(value, "jzcds", store.jzcds); + CHECK_GET_PARAM(value, "jzcd", store.jzcd); + CHECK_GET_PARAM(value, "qdcds", store.qdcds); + CHECK_GET_PARAM(value, "qdcd", store.qdcd); + CHECK_GET_PARAM(value, "clyx", store.clyx); + CHECK_GET_PARAM(value, "lbx", store.lbx); + CHECK_GET_PARAM(value, "cdbx", store.cdbx); + CHECK_GET_PARAM(value, "cdzbx", store.cdzbx); + CHECK_GET_PARAM(value, "zql", store.zql); + CHECK_GET_PARAM(value, "yql", store.yql); + CHECK_GET_PARAM(value, "zhl", store.zhl); + CHECK_GET_PARAM(value, "yhl", store.yhl); + }); + + CHECK_GET_OBJECT_V2({ + CHECK_GET_PARAM(value, "cdsx", store.cdsx); + CHECK_GET_PARAM(value, "xzx", store.xzx); + CHECK_GET_PARAM(value, "cyx", store.cyx); + CHECK_GET_PARAM(value, "xzn", store.xzn); + CHECK_GET_PARAM(value, "yxfx", store.yxfx); + CHECK_GET_PARAM(value, "fjdc", store.fjdc); + }); + return true; } diff --git a/entry/src/main/cpp/sdk/parser/XParser.h b/entry/src/main/cpp/sdk/parser/XParser.h index b7c32591..573cfa17 100644 --- a/entry/src/main/cpp/sdk/parser/XParser.h +++ b/entry/src/main/cpp/sdk/parser/XParser.h @@ -208,10 +208,10 @@ private: return ok; \ } \ - #define CHECK_STRICT_GET_OBJECT(expr,strict) \ + #define CHECK_STRICT_GET_OBJECT(expr,strict,parted) \ { \ bool ok = (strict) ? false : true; \ - store = defaults; \ + if(!parted){store = defaults;} \ if(object.isMember(key)) \ { \ Json::Value& value = object[key]; \ @@ -229,7 +229,7 @@ private: { \ logerror("CHECK_GET_OBJECT key=%s expr=%s error not member.", key, #expr); \ } \ - return ok; \ + if(!parted || !ok) {return ok;} \ } \ #define CHECK_STRICT_GET_ARRAY(expr,check,strict) \ @@ -272,13 +272,15 @@ private: #ifdef JUDGE_USE_STRICT # define CHECK_GET_PARAM(object,key,store) CHECK_STRICT_GET_PARAM(object,key,store,true) # define CHECK_GET_BASIC(expr) CHECK_STRICT_GET_BASIC(expr,true) -# define CHECK_GET_OBJECT(expr) CHECK_STRICT_GET_OBJECT(expr,true) +# define CHECK_GET_OBJECT(expr) CHECK_STRICT_GET_OBJECT(expr,true,false) +# define CHECK_GET_OBJECT_V2(expr) CHECK_STRICT_GET_OBJECT(expr,true,true) # define CHECK_GET_ARRAY(expr) CHECK_STRICT_GET_ARRAY(expr,false,true) # define CHECK_GET_ARRAY_SIZE(expr) CHECK_STRICT_GET_ARRAY(expr,true,true) #else # define CHECK_GET_PARAM(object,key,store) CHECK_STRICT_GET_PARAM(object,key,store,false) # define CHECK_GET_BASIC(expr) CHECK_STRICT_GET_BASIC(expr,false) -# define CHECK_GET_OBJECT(expr) CHECK_STRICT_GET_OBJECT(expr,false) +# define CHECK_GET_OBJECT(expr) CHECK_STRICT_GET_OBJECT(expr,false,false) +# define CHECK_GET_OBJECT_V2(expr) CHECK_STRICT_GET_OBJECT(expr,false,true) # define CHECK_GET_ARRAY(expr) CHECK_STRICT_GET_ARRAY(expr,false,false) # define CHECK_GET_ARRAY_SIZE(expr) CHECK_STRICT_GET_ARRAY(expr,true,false) #endif //JUDGE_USE_STRICT diff --git a/entry/src/main/cpp/sdk/track/HTrack.h b/entry/src/main/cpp/sdk/track/HTrack.h index a7c72587..cabfe13c 100644 --- a/entry/src/main/cpp/sdk/track/HTrack.h +++ b/entry/src/main/cpp/sdk/track/HTrack.h @@ -53,6 +53,7 @@ enum TTrackType TTrackTypeRealExam, TTrackTypeArtificialMark, TTrackTypeArtificialItem, + TTrackTypeSoundEnd, }; //轨迹文件数据头定义 diff --git a/entry/src/main/cpp/sdk/track/TrackReader.cpp b/entry/src/main/cpp/sdk/track/TrackReader.cpp index 88f49a11..862298a8 100644 --- a/entry/src/main/cpp/sdk/track/TrackReader.cpp +++ b/entry/src/main/cpp/sdk/track/TrackReader.cpp @@ -85,6 +85,11 @@ bool TrackReader::read(TTrackData::Ptr& data) { data->type = TTrackTypeArtificialItem; } + else if(root.isMember("method") && root["method"].asString() == "examJudgeSoundEnd" && + root.isMember("itemno") && root.isMember("code") && root.isMember("type")) + { + data->type = TTrackTypeSoundEnd; + } else { TASSERT_BOOL(false, ""); diff --git a/entry/src/main/cpp/sdk/utility/HBean.h b/entry/src/main/cpp/sdk/utility/HBean.h index 0a0b4476..d2016fc9 100644 --- a/entry/src/main/cpp/sdk/utility/HBean.h +++ b/entry/src/main/cpp/sdk/utility/HBean.h @@ -116,11 +116,20 @@ enum ExamSubject ExamSubject3 = 3, //科目三 }; +//人工项目操作类型 enum ArtifItemType { ArtifItemTypeAuto = 0, ArtifItemTypeEnter = 1, - ArtifItemTypeCancel = 2 + ArtifItemTypeCancel = 2, + ArtifItemTypeEnd = 3, +}; + +//语音播报类型 +enum PlaySoundType +{ + PlaySoundDefault = 0, //0:默认 + PlaySoundEndNotify = 1, //1:表示是模拟灯光项目的语音,语音播报结束需要调用examJudgeSoundEnd通知评判。 }; //Tag1=0-无标线 diff --git a/entry/src/main/cpp/sdk/utility/HErrorCode.h b/entry/src/main/cpp/sdk/utility/HErrorCode.h index 19ce3494..a88292c5 100644 --- a/entry/src/main/cpp/sdk/utility/HErrorCode.h +++ b/entry/src/main/cpp/sdk/utility/HErrorCode.h @@ -59,6 +59,9 @@ declare(errorArtifItemAuto, "errorArtifItemAuto", XCharacter("人工项目失败")) \ declare(errorArtifItemEnter, "errorArtiItemEnter", XCharacter("人工进项目失败")) \ declare(errorArtifItemCancel, "errorArtiItemCancel", XCharacter("人工取消项目失败")) \ + declare(errorArtifItemEnd, "errorArtifItemEnd", XCharacter("人工结束项目失败")) \ + declare(errorArtifSoundArg, "errorArtifSoundArg", XCharacter("语音播报结束调用参数错误")) \ + declare(errorArtifSoundEnd, "errorArtifSoundEnd", XCharacter("语音播报结束调用通知失败")) \ declare(errorMapSetParam, "errorMapSetParam", XCharacter("设置地图轨迹参数错误")) \ declare(errorMapSetScaling, "errorMapSetScaling", XCharacter("设置地图轨迹缩放比例错误")) \ declare(errorMapStart, "errorMapStart", XCharacter("开始绘制轨迹错误")) \ diff --git a/entry/src/main/cpp/sdk/utility/HTypes.h b/entry/src/main/cpp/sdk/utility/HTypes.h index 0e1d53f9..0a0d728d 100644 --- a/entry/src/main/cpp/sdk/utility/HTypes.h +++ b/entry/src/main/cpp/sdk/utility/HTypes.h @@ -292,7 +292,7 @@ struct TInitInfo std::vector allitems = {}; //所有的测绘项目(科二用) 用于记载场地模型 2023-10-31修改 杨 std::vector iteminfo = {}; //项目信息表 (科二用) 数据库iteminfo表 std::vector mark = {}; //扣分规则数据表 2023-11-1增加 杨 数据库markrule表 - std::vector sysset = {}; //系统设置特殊评判项数据表 2023-11-1增加 杨 数据库systemparm表 + std::vector sysset = {}; //系统设置特殊评判项数据表 2023-11-1增加 杨 数据库sysset表 std::vector systemparm = {}; //系统参数数据表(科三用) 数据库systemparm表 std::vector carinfo = {}; //车辆信息表(科三用) 数据库carinfo表 std::vector map_point = {}; //加载项目及路段信息(科三用) 数据库map_point表 @@ -395,8 +395,9 @@ struct TSensorInfo std::string xhd = ""; //信号灯值,预留 //int32 mitemno = 0; //人工进入项目或者取消项目 //暂时科三用默认传-1,>=0有效 (*2024-03-06*) + //以下是计算出来的 int8 sym = 0; //松油门 //2024-02-02 add - int8 dw_plc = 0; //2024-01-18 add + int8 dw_plc = 0; //原始档位(没有经过计算的)2024-01-18 add int64 tkCnt = 0; //开机到当前时刻的毫秒数 int64 csjyx = 0; //长时间压线 @@ -702,7 +703,7 @@ struct TEventFinishItem struct TEventItemMark { int32 xmdm = Sub2ItemTypeInvalid; //项目代码 对应枚举 ExamItemCode - std::string kfdm; //扣分代码 + std::string kfdm; //扣分代码 对应markserial std::string markcatalog; //无锡所标准扣分代码 }; @@ -714,8 +715,9 @@ struct TEventExamFinish struct TEventSound { - int32 xmdm = Sub2ItemTypeInvalid; //项目代码 比如41表示模拟灯光 - std::string code; //语音代码 参考:namespace sound、sound_sub2、sound_sub3 + int32 xmdm = Sub2ItemTypeInvalid; //项目代码,比如41表示模拟灯光 + std::string code; //语音代码,参考:namespace sound、sound_sub2、sound_sub3 + int32 type = PlaySoundDefault; //语音类型,0:默认普通语音,1:表示是模拟灯光项目的语音,语音播报结束需要调用examJudgeSoundEnd通知评判。 }; //道路路段信息 @@ -904,7 +906,7 @@ struct TRTKResult int BaseLaneCount = 0; //路段状况:共有几股车道 int ShapeNo = 0; //当前的形状号 - int LS_ShapeNo = 0; //临时的形状号(用于3点关联的形状线) + //int LS_ShapeNo = 0; //临时的形状号(用于3点关联的形状线) enum{CrossLineAttr0 = 0,CrossLineAttr1,CrossLineAttr2,CrossLineAttr3,CrossLineAttr4 }; int CrossLineAttr = CrossLineAttr0; //对应 SubNameTag 0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 4-环岛相关的 @@ -927,6 +929,10 @@ struct TRTKResult int ChangeLaneCrossLine = LineTag0; //对应 LineTag enum{TouchDir_1 = -1, TouchDir0 = 0, TouchDir1 = 1}; int TouchDir = TouchDir0; //相对于线来说, 1:从左->右方向压线 -1:从右->左方向压线 + +#ifdef JUDGE_USE_INSPECT + std::string BodySharpData; //解决无锡所路口左转227a用例误判问题 +#endif }; //实时考试每一帧数据(包括接收调用方的数据和考试计算的数据) diff --git a/entry/src/main/cpp/test/test_sdk/ITestData.cpp b/entry/src/main/cpp/test/test_sdk/ITestData.cpp index 16369104..496eacc3 100644 --- a/entry/src/main/cpp/test/test_sdk/ITestData.cpp +++ b/entry/src/main/cpp/test/test_sdk/ITestData.cpp @@ -4958,6 +4958,8 @@ void ITestData::setupSub3Data(const std::string& dirpath, const std::string& car m_infoInit.roads = Tools::readFileText(dirpath + "/Roads.json"); m_infoInit.sharps = Tools::readFileText(dirpath + "/Sharps.json"); + TASSERT(m_infoInit.roads.length() > 0, ""); + TASSERT(m_infoInit.sharps.length() > 0, ""); m_infoInit.allitems.clear(); m_infoBegin.ksxm.clear(); diff --git a/entry/src/main/cpp/toolkit/inc/HToolkit.cpp b/entry/src/main/cpp/toolkit/inc/HToolkit.cpp index 59d22db4..7e383e2e 100644 --- a/entry/src/main/cpp/toolkit/inc/HToolkit.cpp +++ b/entry/src/main/cpp/toolkit/inc/HToolkit.cpp @@ -53,6 +53,36 @@ QByteArray gb2312ToUtf8(const std::string& cont) return ByteUTF8; //QString::fromLocal8Bit(ByteUTF8); } +bool makeSurePathExist(const QString& path) +{ + QDir dir; + if(!dir.exists(path)) + { + return dir.mkpath(path); + } + return true; +} + +void filesFromDirectory(const QString& path, QStringList& files) +{ + QDir dir(path); + // 获取所有文件和目录 + QFileInfoList infos = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); + + // 遍历列表并输出文件信息 + for(const QFileInfo& info : infos) + { + if(info.isFile()) + { + files.push_back(info.absoluteFilePath()); + } + else if(info.isDir()) + { + filesFromDirectory(info.absoluteFilePath(), files); // 递归调用 + } + } +} + QString toString(double value, int prec, char f) { return QString::number(value, f, prec); @@ -80,7 +110,7 @@ QString toString(const char* value) void errorBox(QWidget* parent, const QString& msg) { - logerror("%s.", msg.toLocal8Bit().toStdString().c_str()); + //logerror("%s.", msg.toLocal8Bit().toStdString().c_str()); //QErrorMessage msg(); QMessageBox box; @@ -106,4 +136,21 @@ void msgBox(QWidget* parent, const QString& msg) } } +JUDGE_C_API const char* inspectCase2MarkDesc(const char* name) +{ + static const std::map value = { EnumMakeInspectCase(ENUM_BUILD_KEY3_MAP4_CMD4) }; + auto it = value.find(name); + return (it != value.end()) ? it->second.c_str() : ""; } + +JUDGE_C_API const char* inspectCase2ItemDesc(const char* name) +{ + static const std::map value = { EnumMakeInspectCase(ENUM_BUILD_KEY3_MAP2_CMD4) }; + auto it = value.find(name); + return (it != value.end()) ? it->second.c_str() : ""; +} + + +} + + diff --git a/entry/src/main/cpp/toolkit/inc/HToolkit.h b/entry/src/main/cpp/toolkit/inc/HToolkit.h index 269cca10..67831846 100644 --- a/entry/src/main/cpp/toolkit/inc/HToolkit.h +++ b/entry/src/main/cpp/toolkit/inc/HToolkit.h @@ -32,11 +32,13 @@ #include #include #include +#include +#include #include #include #include #include - +#include #include "HUtility.h" #include "TrackReader.h" @@ -47,18 +49,17 @@ #define KIT_APP_NAME "多伦科技新考试系统评判工具" -#define KIT_VERSION_STR "2.0.0" -#define KIT_VERSION_NOTE "[beta-2024-03-11]" +#define KIT_VERSION_STR "0.0.1" +#define KIT_VERSION_NOTE "[beta-2024-06-19]" + +#define CL8(characters) QString::fromLocal8Bit(characters) //外壳APP生成的轨迹文件名称,用于加载过滤 -#define KIT_TRACK_FILE ("judge_exam_data") -#define KIT_AUDIO_KM2 QString(".") + TRACK_PATH + "/audio/km2/" -#define KIT_AUDIO_KM3 QString(".") + TRACK_PATH + "/audio/km3/" +#define KIT_TRACK_FILE ("judge_exam_data") +#define KIT_SOUND_PATH (QString(".") + TRACK_PATH + CL8("/voice/")) #define __KIT_NEW__(Class,...) new Class(__VA_ARGS__) // __NEW__(Class, __VA_ARGS__) -#define CL8(characters) QString::fromLocal8Bit(characters) - #define KIT_RGB_COLOR(R,G,B) QColor(R,G,B) #define KIT_RGB_RED KIT_RGB_COLOR(255,0,0) @@ -80,27 +81,178 @@ namespace kit { - // document_ += valueToQuotedStringN(str, static_cast(end - str), true); //2023-08-26 yhy add:true +// document_ += valueToQuotedStringN(str, static_cast(end - str), true); //2023-08-26 yhy add:true - //字符集编码自动转换 - QByteArray convertAnyToUtf8(const QByteArray& bytes); - QString converAnyToString(const QByteArray& bytes); - //unicode解码 - QString unicodeToString(const QString& rawstr); +//字符集编码自动转换 +QByteArray convertAnyToUtf8(const QByteArray& bytes); +QString converAnyToString(const QByteArray& bytes); +//unicode解码 +QString unicodeToString(const QString& rawstr); - QByteArray gb2312ToUtf8(const std::string& cont); +QByteArray gb2312ToUtf8(const std::string& cont); + +bool makeSurePathExist(const QString& path); //确保某个路径目录存在,不存在就递归创建全路径 +void filesFromDirectory(const QString& path, QStringList& files); //递归获取所有文件 + +QString toString(double value, int prec=10, char f='f'); +QString toString(int value); +QString toString(qint64 value); +QString toString(const std::string& value); +QString toString(const char* value); + +void errorBox(QWidget* parent, const QString& msg); +void msgBox(QWidget* parent, const QString& msg); + + + +/******************************************************************** + *** + *** 说明:无锡交通科学研究所科目三检测120个用例和对应评判扣分 + *** 作者:杨 + *** 日期:2024年6月3日 + ********************************************************************/ + +#define EnumMakeInspectCase(declare) \ + declare(InspectCase000, XCharacter("invalid"), "", XCharacter("")) \ + declare(InspectCase001, XCharacter("直线行驶"), "111", XCharacter("车辆与道路边缘线距离较初始值先增加后减少")) \ + declare(InspectCase002, XCharacter("直线行驶"), "112", XCharacter("车辆与道路边缘线距离较初始值减少,小于30CM")) \ + declare(InspectCase003, XCharacter("直线行驶"), "111a", XCharacter("方向控制不稳,不能保持车辆直线运动")) \ + declare(InspectCase004, XCharacter("直线行驶"), "112a", XCharacter("方向控制不稳,不能保持车辆直线运动")) \ + declare(InspectCase005, XCharacter("变更车道(项目内)"), "1211", XCharacter("")) \ + declare(InspectCase006, XCharacter("变更车道(项目内)"), "1211a", XCharacter("不按考试员之类驾驶,不合格(附加)")) \ + declare(InspectCase007, XCharacter("变更车道(项目内)"), "1212a", XCharacter("变更车道前不使用或错误使用转向灯,不合格")) \ + declare(InspectCase008, XCharacter("变更车道(项目内)"), "1213a", XCharacter("变更车道前开转向灯少于3秒即转向,不合格")) \ + declare(InspectCase009, XCharacter("变更车道(项目内)"), "1214a", XCharacter("变更车道前不使用或错误使用转向灯,不合格")) \ + declare(InspectCase010, XCharacter("变更车道(项目外)"), "1221", XCharacter("")) \ + declare(InspectCase011, XCharacter("变更车道(项目外)"), "1222", XCharacter("")) \ + declare(InspectCase012, XCharacter("变更车道(项目外)"), "1221a", XCharacter("变更车道前开转向灯少于3秒即转向,不合格")) \ + declare(InspectCase013, XCharacter("变更车道(项目外)"), "1222a", XCharacter("变更车道前开启转向灯少于3秒即转向,不合格")) \ + declare(InspectCase014, XCharacter("变更车道(项目外)"), "1223a", XCharacter("长时间骑压车道分界线行驶,不合格")) \ + declare(InspectCase015, XCharacter("变更车道(项目外)"), "1224a", XCharacter("变更车道前不使用或错误使用转向灯,不合格。")) \ + declare(InspectCase016, XCharacter("变更车道(项目外)"), "1225a", XCharacter("变更车道前开转向灯少于3秒即转向,不合格。")) \ + declare(InspectCase017, XCharacter("通过人行横道"), "131", XCharacter("[*无扣分*]在停止线前28米至30米范围内制动后,正常驶过人行横道。")) \ + declare(InspectCase018, XCharacter("通过人行横道"), "132", XCharacter("[*无扣分*]在停止线前2米范围内制动后,正常驶过人行横道")) \ + declare(InspectCase019, XCharacter("通过人行横道"), "133", XCharacter("[*无扣分*]距离停止线前30米范围内未制动,速度有下降,无上升")) \ + declare(InspectCase020, XCharacter("通过人行横道"), "134", XCharacter("[*无扣分*]距离停止线30米范围内无制动,速度有上升,有下降,且驶抵停止线时,速度小于30KM/H")) \ + declare(InspectCase021, XCharacter("通过人行横道"), "135", XCharacter("[*无扣分*]距停止线前30米范围内未制动,速度无变化,且驶抵停止线时,速度不大于30KM/H")) \ + declare(InspectCase022, XCharacter("通过人行横道"), "131a", XCharacter("将车辆停在人行横道、网格线灯禁止停车区域,不合格")) \ + declare(InspectCase023, XCharacter("通过人行横道"), "132a", XCharacter("不按规定减速度,不合格")) \ + declare(InspectCase024, XCharacter("通过人行横道"), "133a", XCharacter("不按规定减速,不合格")) \ + declare(InspectCase025, XCharacter("通过公交站台"), "141", XCharacter("[*无扣分*]28米至30米范围内制动后,正常驶过")) \ + declare(InspectCase026, XCharacter("通过公交站台"), "142", XCharacter("[*无扣分*]在公交站台入库前2米范围内,正常制动后驶过")) \ + declare(InspectCase027, XCharacter("通过公交站台"), "143", XCharacter("[*应该扣*]科研所规定,公交站台当前车辆的车道号在3车道及以上的,不需要评判减速相关的")) \ + declare(InspectCase028, XCharacter("通过公交站台"), "141a", XCharacter("不按规定减速")) \ + declare(InspectCase029, XCharacter("通过公交站台"), "142a", XCharacter("[*不应该扣,有踩刹车*]不按规定减速")) \ + declare(InspectCase030, XCharacter("通过学校区域"), "151", XCharacter("")) \ + declare(InspectCase031, XCharacter("通过学校区域"), "151a", XCharacter("不按规定减速,不合格")) \ + declare(InspectCase032, XCharacter("通过学校区域"), "152a", XCharacter("不按规定减速,不合格")) \ + declare(InspectCase033, XCharacter("通过学校区域"), "153a", XCharacter("将车辆停止人行横道、网格线等禁止停车区域,不合格。")) \ + declare(InspectCase034, XCharacter("会车(双向通行)"), "161", XCharacter("")) \ + declare(InspectCase035, XCharacter("会车(双向通行)"), "161a", XCharacter("在没用中心隔离设施或者中心线的道路上会车时,不减速靠右行驶,不合格")) \ + declare(InspectCase036, XCharacter("会车(双向通行)"), "162a", XCharacter("在没用中心隔离设施或者中心线的道路上会车时候,不减速靠右行驶,不合格")) \ + declare(InspectCase037, XCharacter("会车(双向通行)"), "163a", XCharacter("行驶中骑压边缘实线,不合格。")) \ + declare(InspectCase038, XCharacter("会车(单向通行)"), "162", XCharacter("")) \ + declare(InspectCase039, XCharacter("会车(单向通行)"), "164a", XCharacter("会车困难时不让行,不合格。")) \ + declare(InspectCase040, XCharacter("掉头(路段掉头)"), "171", XCharacter("")) \ + declare(InspectCase041, XCharacter("掉头(路段掉头)"), "171a", XCharacter("不按考试员指令驾驶,不合格(附加)")) \ + declare(InspectCase042, XCharacter("掉头(路段掉头)"), "172a", XCharacter("掉头前未开启左转向灯,不合格")) \ + declare(InspectCase043, XCharacter("掉头(路段掉头)"), "173a", XCharacter("起步时车辆后溜距离大于30厘米,不合格。")) \ + declare(InspectCase044, XCharacter("掉头(路段掉头)"), "174a", XCharacter("转向前开启左转向灯少于3秒即转向,不合格")) \ + declare(InspectCase045, XCharacter("掉头(专用道掉头)"), "241", XCharacter("")) \ + declare(InspectCase046, XCharacter("掉头(专用道掉头)"), "241a", XCharacter("掉头低点选择不当,不合格")) \ + declare(InspectCase047, XCharacter("掉头(专用道掉头)"), "242a", XCharacter("掉头前未开启左转向灯,不合格")) \ + declare(InspectCase048, XCharacter("掉头(路口掉头)"), "242", XCharacter("")) \ + declare(InspectCase049, XCharacter("掉头(路口掉头)"), "243a", XCharacter("不按交通信号灯、标志、标线信号行驶,不合格")) \ + declare(InspectCase050, XCharacter("掉头(路口掉头)"), "244a", XCharacter("掉头低点选择不当,不合格")) \ + declare(InspectCase051, XCharacter("掉头(路口掉头)"), "245a", XCharacter("掉头前开启左转向灯少于3秒即转向,不合格")) \ + declare(InspectCase052, XCharacter("起步"), "181", XCharacter("")) \ + declare(InspectCase053, XCharacter("起步"), "181a", XCharacter("未松开驻车制动器起步,能及时纠正,扣10分。起步时,加速踏板控制不当,致使发动机转速过高,扣5分。")) \ + declare(InspectCase054, XCharacter("起步"), "182a", XCharacter("不松开驻车制动器起步,未及时纠正,不合格")) \ + declare(InspectCase055, XCharacter("起步"), "183a", XCharacter("起步时车辆后溜车小于30厘米,扣10分")) \ + declare(InspectCase056, XCharacter("起步"), "184a", XCharacter("起步时,车辆后溜距离大于30厘米,不合格")) \ + declare(InspectCase057, XCharacter("起步"), "185a", XCharacter("车门未完全关闭起步,不合格")) \ + declare(InspectCase058, XCharacter("起步"), "186a", XCharacter("起步前不使用或错误使用转向灯,不合格")) \ + declare(InspectCase059, XCharacter("靠边停车(非机动车道)"), "1911", XCharacter("")) \ + declare(InspectCase060, XCharacter("靠边停车(非机动车道)"), "1911a", XCharacter("变更车道前开转向灯少于3秒即转向,不合格")) \ + declare(InspectCase061, XCharacter("靠边停车(非机动车道)"), "1912a", XCharacter("变更车道前不使用或错误使用转向灯,不合格。")) \ + declare(InspectCase062, XCharacter("靠边停车(非机动车道)"), "1913a", XCharacter("停车后,车身距离道路右侧边缘线超出50厘米,不合格。拉紧驻车制动器前放松行车制动踏板,扣10分。")) \ + declare(InspectCase063, XCharacter("靠边停车(非机动车道)"), "1914a", XCharacter("停车后,车身距离右侧边缘线超出50厘米,不合格。停车后,未拉近驻车制动器,扣10分。")) \ + declare(InspectCase064, XCharacter("靠边停车(非机动车道)"), "1915a", XCharacter("下车后,不将发动机熄火。停车后,未拉紧驻车制动器,扣10分。")) \ + declare(InspectCase065, XCharacter("靠边停车(非机动车道)"), "1916a", XCharacter("行驶中骑压车道边缘实线,不合格。")) \ + declare(InspectCase066, XCharacter("靠边停车(机动车道)"), "1921", XCharacter("")) \ + declare(InspectCase067, XCharacter("靠边停车(机动车道)"), "1922", XCharacter("")) \ + declare(InspectCase068, XCharacter("靠边停车(机动车道)"), "1921a", XCharacter("靠边停车前不使用或错误使用转向灯,不合格")) \ + declare(InspectCase069, XCharacter("靠边停车(机动车道)"), "1922a", XCharacter("下车后不关闭车门,不合格")) \ + declare(InspectCase070, XCharacter("靠边停车(机动车道)"), "1923a", XCharacter("考试员发车靠边停车指令后,未能在规定的距离内停车,不合格。")) \ + declare(InspectCase071, XCharacter("直行通过路口"), "211", XCharacter("")) \ + declare(InspectCase072, XCharacter("直行通过路口"), "212", XCharacter("")) \ + declare(InspectCase073, XCharacter("直行通过路口"), "213", XCharacter("")) \ + declare(InspectCase074, XCharacter("直行通过路口"), "214", XCharacter("")) \ + declare(InspectCase075, XCharacter("直行通过路口"), "211a", XCharacter("不按规定减速,不合格")) \ + declare(InspectCase076, XCharacter("直行通过路口"), "212a", XCharacter("行驶中骑压车道分界线,不合格")) \ + declare(InspectCase077, XCharacter("直行通过路口"), "213a", XCharacter("将车停在人行横道、网格线内等禁止停车区域,不合格。")) \ + declare(InspectCase078, XCharacter("直行通过路口"), "214a", XCharacter("不按交通信号灯、标志、标线信号行驶,不合格。")) \ + declare(InspectCase079, XCharacter("直行通过路口"), "215a", XCharacter("不按考试员指令驾驶,不合格(附加)")) \ + declare(InspectCase080, XCharacter("直行通过路口"), "216a", XCharacter("不按规定减速度,不合格。")) \ + declare(InspectCase081, XCharacter("左转弯"), "221", XCharacter("")) \ + declare(InspectCase082, XCharacter("左转弯"), "222", XCharacter("")) \ + declare(InspectCase083, XCharacter("左转弯"), "223", XCharacter("")) \ + declare(InspectCase084, XCharacter("左转弯"), "221a", XCharacter("不按规定减速,不合格。")) \ + declare(InspectCase085, XCharacter("左转弯"), "222a", XCharacter("行驶中骑压车道分界实线,不合格。")) \ + declare(InspectCase086, XCharacter("左转弯"), "223a", XCharacter("行驶中骑压车道中心实线,不合格。")) \ + declare(InspectCase087, XCharacter("左转弯"), "224a", XCharacter("将车停在人行横道、网格线内等禁停区域,不合格。")) \ + declare(InspectCase088, XCharacter("左转弯"), "225a", XCharacter("左转弯通过路口时,未靠路口中心点左侧转弯的,")) \ + declare(InspectCase089, XCharacter("左转弯"), "226a", XCharacter("左转弯通过路口时,未靠路口中心左侧转弯的,")) \ + declare(InspectCase090, XCharacter("左转弯"), "227a", XCharacter("不按规定减速,不合格")) \ + declare(InspectCase091, XCharacter("右转弯"), "231", XCharacter("")) \ + declare(InspectCase092, XCharacter("右转弯"), "232", XCharacter("")) \ + declare(InspectCase093, XCharacter("右转弯"), "233", XCharacter("")) \ + declare(InspectCase094, XCharacter("右转弯"), "234", XCharacter("")) \ + declare(InspectCase095, XCharacter("右转弯"), "235", XCharacter("")) \ + declare(InspectCase096, XCharacter("右转弯"), "236", XCharacter("")) \ + declare(InspectCase097, XCharacter("右转弯"), "231a", XCharacter("[*不应该扣*]转向前开启转向灯少于3秒即转向,不合格")) \ + declare(InspectCase098, XCharacter("右转弯"), "232a", XCharacter("转向前不使用或错误使用转向灯,不合格")) \ + declare(InspectCase099, XCharacter("右转弯"), "233a", XCharacter("行驶中骑压车道边缘实线,不合格")) \ + declare(InspectCase100, XCharacter("停车让行路口"), "251", XCharacter("")) \ + declare(InspectCase101, XCharacter("停车让行路口"), "252", XCharacter("")) \ + declare(InspectCase102, XCharacter("停车让行路口"), "251a", XCharacter("不按规定停车瞭望,不合格")) \ + declare(InspectCase103, XCharacter("停车让行路口"), "252a", XCharacter("不按规定停车瞭望,不合格")) \ + declare(InspectCase104, XCharacter("停车让行路口"), "253a", XCharacter("启动发动机时,挡位未至于空挡(驻车挡),不合格")) \ + declare(InspectCase105, XCharacter("停车让行路口"), "254a", XCharacter("起步挂错挡,扣10分。")) \ + declare(InspectCase106, XCharacter("上车准备"), "311", XCharacter("")) \ + declare(InspectCase107, XCharacter("上车准备"), "311a", XCharacter("发动机启动后,不及时松开启动开关,扣10分")) \ + declare(InspectCase108, XCharacter("离合"), "331", XCharacter("")) \ + declare(InspectCase109, XCharacter("离合"), "331a", XCharacter("行驶中空挡滑行,不合格(附加)")) \ + declare(InspectCase110, XCharacter("离合"), "332a", XCharacter("行驶中空挡滑行,不合格(附加)")) \ + declare(InspectCase111, XCharacter("离合"), "333a", XCharacter("行驶中空挡滑行,不合格(附加)")) \ + declare(InspectCase112, XCharacter("离合"), "334a", XCharacter("拉紧驻车制动器前放松行车制动踏板,扣10分(附加)")) \ + declare(InspectCase113, XCharacter("挡位"), "341a", XCharacter("未按指令平稳加、减挡,不合格")) \ + declare(InspectCase114, XCharacter("挡位"), "342a", XCharacter("车辆运行速度和挡位不匹配,扣10分")) \ + declare(InspectCase115, XCharacter("挡位"), "343a", XCharacter("车辆运行速度和挡位不匹配,扣10分")) \ + declare(InspectCase116, XCharacter("挡位"), "344a", XCharacter("使用挡位和车速长时间不匹配,造成发动机转速过高或者过低,不合格。")) \ + declare(InspectCase117, XCharacter("连续变更车道"), "351", XCharacter("")) \ + declare(InspectCase118, XCharacter("连续变更车道"), "352", XCharacter("")) \ + declare(InspectCase119, XCharacter("连续变更车道"), "351a", XCharacter("连续变更两条或两条以上的车道")) \ + declare(InspectCase120, XCharacter("连续变更车道"), "352a", XCharacter("连续变更两条或两条以上的车道")) \ + declare(InspectCase121, XCharacter("全程项目案例"), "案例1", XCharacter("***")) \ + declare(InspectCase122, XCharacter("全程项目案例"), "案例2", XCharacter("***")) \ + declare(InspectCase123, XCharacter("全程项目案例"), "案例3", XCharacter("***")) \ + declare(InspectCase124, XCharacter("全程项目案例"), "案例4", XCharacter("***")) \ + declare(InspectCase125, XCharacter("全程项目案例"), "案例5", XCharacter("***")) \ + declare(InspectCase126, XCharacter("全程项目案例"), "案例三", XCharacter("***")) \ + declare(InspectCase127, XCharacter("全程项目案例"), "案例一", XCharacter("***")) +enum InspectCase{ EnumMakeInspectCase(ENUM_SELECT_1_CMD_4) InspectCaseUnknown }; +JUDGE_C_API const char* inspectCase2MarkDesc(const char* name); +JUDGE_C_API const char* inspectCase2ItemDesc(const char* name); - QString toString(double value, int prec=10, char f='f'); - QString toString(int value); - QString toString(qint64 value); - QString toString(const std::string& value); - QString toString(const char* value); - void errorBox(QWidget* parent, const QString& msg); - void msgBox(QWidget* parent, const QString& msg); } + + + + #endif // HTOOLKIT_H diff --git a/entry/src/main/cpp/toolkit/inc/IConvertData.cpp b/entry/src/main/cpp/toolkit/inc/IConvertData.cpp index eb104dd8..a81b70fe 100644 --- a/entry/src/main/cpp/toolkit/inc/IConvertData.cpp +++ b/entry/src/main/cpp/toolkit/inc/IConvertData.cpp @@ -18,6 +18,7 @@ IConvertAbstract* IConvertAbstract::create(const QString& dbname) { return __KIT_NEW__(IConvertMdb); } + return NULL; } @@ -83,3 +84,95 @@ bool IConvertXlsx::tableData(const QString& tableName, TableData& data) } return true; } + + +IConvertMdb::IConvertMdb() +{ + +} + +IConvertMdb::~IConvertMdb() +{ + +} + +#ifdef JUDGE_OS_WIN + +//添加环境变量不然找不到驱动 +//QT_PLUGIN_PATH=C:\yhy\Qt\Qt5.12.10\5.12.10\msvc2017_64\plugins + +//#include +//#include +//#include +//#include +//#pragma comment(lib, "odbc32.lib") + +bool IConvertMdb::load(const QString& filename) +{ + if(filename == m_name) + { + return true; + } + m_name = filename; + + // 设置数据源名称(DSN),这里的DSN名称"MyAccessDB"需要在系统的ODBC数据源管理器中配置 + QString dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=D:/ret2000.mdb;"; + + //QString dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/ret2000.mdb;"; + + // 添加ODBC数据库 + QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "MyAccessDB"); + db.setDatabaseName(dsn); + + QStringList drivers = QSqlDatabase::drivers(); + for(int i = 0; i < drivers.size(); i++) + { + logwarning("drivers=%s", drivers[i].toLocal8Bit().data()); + } + + QString desc = db.lastError().text(); + // 打开数据库 + if(!db.isValid()) + { + QString desc = db.lastError().text(); + return false; + } + + // 打开数据库 + if(!db.open()) + { + QString desc = db.lastError().text(); + return false; + } + + // 执行查询 + QSqlQuery query; + bool success = query.exec("SELECT * FROM carinfo"); + + return true; +} + +bool IConvertMdb::tableData(const QString& tableName, TableData& data) +{ + // 读取单元格内容 + //QString cellValue = m_db->read("Sheet1", "A1").toString(); + data.tableName = tableName; + + return true; +} + +#else + +bool IConvertMdb::load(const QString& filename) +{ + TASSERT(false, "not support"); + return false; +} + +bool IConvertMdb::tableData(const QString& filename, TableData& data) +{ + TASSERT(false, "not support"); + return false; +} + +#endif diff --git a/entry/src/main/cpp/toolkit/inc/IConvertData.h b/entry/src/main/cpp/toolkit/inc/IConvertData.h index bdb26653..f50737c6 100644 --- a/entry/src/main/cpp/toolkit/inc/IConvertData.h +++ b/entry/src/main/cpp/toolkit/inc/IConvertData.h @@ -48,21 +48,21 @@ public: private: QString m_name; - QXlsx::Document* m_doc = nullptr; QStringList m_tables; + QXlsx::Document* m_doc = nullptr; }; class IConvertMdb : public IConvertAbstract { public: - explicit IConvertMdb() = default; - virtual ~IConvertMdb() = default; + explicit IConvertMdb(); + virtual ~IConvertMdb(); virtual QString name() override { return m_name;} - virtual bool load(const QString& filename) override { return false; }; + virtual bool load(const QString& filename) override; virtual const QStringList& tableNames() override { return m_tables; } - virtual bool hasTable(const QString& table) override { return false; }; - virtual bool tableData(const QString& tableName, TableData& data) override { return false; }; + virtual bool hasTable(const QString& table) { return m_tables.contains(table); } + virtual bool tableData(const QString& tableName, TableData& data) override; private: QString m_name; diff --git a/entry/src/main/cpp/toolkit/main.cpp b/entry/src/main/cpp/toolkit/main.cpp index 2690ded4..e3ac1353 100644 --- a/entry/src/main/cpp/toolkit/main.cpp +++ b/entry/src/main/cpp/toolkit/main.cpp @@ -3,6 +3,13 @@ int main(int argc, char *argv[]) { + //QT_PLUGIN_PATH=C:\yhy\Qt\Qt5.12.10\5.12.10\msvc2017_64\plugins + //qputenv("QT_QPA_PLATFORM_PLUGIN_PATH", ""); + //qputenv("QT_PLUGIN_PATH", "./plugins"); + + //QStringList paths = QCoreApplication::libraryPaths(); + //QString plugins = QLibraryInfo::location(QLibraryInfo::PluginsPath); + QApplication a(argc, argv); MainWindow w; diff --git a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.cpp b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.cpp index 4acfb186..61254402 100644 --- a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.cpp +++ b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.cpp @@ -6,6 +6,8 @@ MenuDeveMdb::MenuDeveMdb(QWidget *parent) : QWidget(parent) m_ui = __KIT_NEW__(Ui::MenuDeveMdb); m_ui->setupUi(this); connect(m_action, SIGNAL(triggered()), this, SLOT(onTriggeredClicked())); + connect(this, SIGNAL(sig_msg(const QString&)), this, SLOT(on_msg(const QString&))); + connect(this, SIGNAL(sig_box(const QString&)), this, SLOT(on_box(const QString&))); m_ui->caseof->addItem(CL8("原样"), caseof_original); m_ui->caseof->addItem(CL8("小写"), caseof_tolower); @@ -17,27 +19,35 @@ MenuDeveMdb::MenuDeveMdb(QWidget *parent) : QWidget(parent) m_ui->format->addItem(CL8("jni格式"), format_ini); m_ui->format->setCurrentIndex(m_ui->format->findData(format_json)); + m_ui->batch->clear(); + m_ui->batch->addItem("markrule"); + m_ui->batch->addItem("sysset"); + m_ui->batch->addItem("systemparm"); + m_ui->batch->addItem("carinfo"); + m_ui->batch->addItem("map_point"); + m_ui->batch->addItem("map_point_item"); + m_ui->batch->setCurrentIndex(0); + + m_ui->loading->setReadOnly(true); } MenuDeveMdb::~MenuDeveMdb() { __DELETE__(m_ui); disconnect(m_action, SIGNAL(triggered()), this, SLOT(onTriggeredClicked())); + disconnect(this, SIGNAL(sig_msg(const QString&)), this, SLOT(on_msg(const QString&))); + disconnect(this, SIGNAL(sig_box(const QString&)), this, SLOT(on_box(const QString&))); } void MenuDeveMdb::onTriggeredClicked() { show(); - QString filepath = KIT_ABS_FILE_PATH("../model/sub3_Ret2000/Ret2000.xlsx"); + QString filepath = KIT_ABS_FILE_PATH("../model/ret2000.xlsx"); if(QFileInfo::exists(filepath)) { QFileInfo info(filepath); m_ui->filepath->setText(info.absoluteFilePath()); m_ui->genPath->setText(info.absolutePath()); - if(loadFile(m_ui->filepath->text())) - { - - } } } @@ -71,9 +81,27 @@ void MenuDeveMdb::on_selectBtn_clicked() QFileInfo info(filepath); m_ui->filepath->setText(info.absoluteFilePath()); m_ui->genPath->setText(info.absolutePath()); - if(loadFile(m_ui->filepath->text())) - { + m_ui->dbList->addItem(m_ui->filepath->text()); + } +} +void MenuDeveMdb::on_selectSrc_clicked() +{ + QString dirpath = QFileDialog::getExistingDirectory(this, CL8("请选择目录..."), QCoreApplication::applicationDirPath()); + if(!dirpath.isEmpty() && QFile::exists(dirpath)) + { + m_ui->filepath->setText(dirpath); + m_ui->genPath->setText(dirpath); + + QStringList files; + kit::filesFromDirectory(m_ui->filepath->text(), files); + for(int i = 0; i < files.size(); i++) + { + QString s = QFileInfo(files[i]).fileName(); + if(s.toLower() == "ret2000.xlsx") //ret2000.xlsx + { + m_ui->dbList->addItem(files[i]); + } } } } @@ -87,66 +115,7 @@ void MenuDeveMdb::on_selectDir_clicked() } } - -bool MenuDeveMdb::loadFile(const QString& name) -{ - std::thread thd([&, this](QString filename)->bool - { - //m_ui->genBtn->setEnabled(false); - m_ui->loading->setText(CL8("正在加载文件,请稍后...")); - if(m_db == nullptr) - { - m_db = IConvertAbstract::create(filename); - } - else - { - if(m_db->name() != filename) - { - IConvertAbstract::destory(m_db); - m_db = IConvertAbstract::create(filename); - } - else - { - m_ui->loading->setText(CL8("文件已经加载完成...")); - return true; - } - } - if(!m_db->load(filename)) - { - IConvertAbstract::destory(m_db); - return false; - } - m_ui->tables->clear(); - const QStringList& tables = m_db->tableNames(); - for(int i = 0; i < tables.count(); i++) - { - QString table = tables.at(i); - m_ui->tables->addItem(table, i); - } - if(m_ui->tables->count() > 0) - { - m_ui->tables->setCurrentIndex(0); - } - - m_ui->batch->clear(); - m_ui->batch->addItem("markrule"); - m_ui->batch->addItem("sysset"); - m_ui->batch->addItem("systemparm"); - m_ui->batch->addItem("carinfo"); - m_ui->batch->addItem("map_point"); - m_ui->batch->addItem("map_point_item"); - m_ui->batch->setCurrentIndex(0); - - m_ui->loading->setText(CL8("文件加载完成...")); - //m_ui->genBtn->setEnabled(true); - return true; - }, name); - - thd.detach(); - return true; -} - -void MenuDeveMdb::toData(TableData& data) +void MenuDeveMdb::toData(const QString& filename, TableData& data) { caseConvert(data); format_type fmt = (format_type)m_ui->format->currentData().toInt(); @@ -161,7 +130,7 @@ void MenuDeveMdb::toData(TableData& data) if(cont.empty()) { - kit::msgBox(this, windowTitle()+CL8("表:")+data.tableName+CL8("数据为空?")); + kit::msgBox(this, CL8("表:")+data.tableName+CL8("数据为空?")); return; } @@ -169,8 +138,17 @@ void MenuDeveMdb::toData(TableData& data) std::string content(bytes.data(), bytes.length()); std::string name = data.tableName.toLocal8Bit().data(); - std::string dstPath = m_ui->genPath->text().toLocal8Bit().data(); - Tools::writeFileText(dstPath+"/"+name+".txt", content); + + QFileInfo srcInfo(m_ui->filepath->text()); + QString srcPath = srcInfo.isDir() ? srcInfo.filePath() : srcInfo.path(); + QFileInfo dstInfo(filename); + QString dstPath = dstInfo.isDir() ? dstInfo.filePath() : dstInfo.path(); + + dstPath.replace(srcPath, m_ui->genPath->text()); + //std::string dstPath = m_ui->genPath->text().toLocal8Bit().data(); + std::string path = dstPath.toLocal8Bit().data(); + Tools::makeSurePath(path+"/"); + Tools::writeFileText(path+"/"+name+".txt", content); } @@ -232,31 +210,129 @@ std::string MenuDeveMdb::toDataXml(const TableData& data) std::string MenuDeveMdb::toDataIni(const TableData& data) { - return std::string(); } +void MenuDeveMdb::on_dbList_currentIndexChanged(int index) +{ + std::thread thd([&, this]()->void + { + appendMsg(CL8("正在加载文件,请稍后...")); + QString filepath = m_ui->dbList->currentText(); + IConvertAbstract::destory(m_db); + m_db = IConvertAbstract::create(filepath); + if(!m_db->load(filepath)) + { + IConvertAbstract::destory(m_db); + return; + } + + m_ui->tables->clear(); + const QStringList& tables = m_db->tableNames(); + m_ui->tables->addItems(tables); + + appendMsg(CL8("文件表加载完成...\n")); + return; + }); + + thd.detach(); +} + void MenuDeveMdb::on_exportBtn_clicked() { - TableData data; + //QDir dir(m_ui->genPath->text()); + //dir.removeRecursively(); //删除目录 + QString filepath = m_ui->dbList->currentText(); QString tableName = m_ui->tables->currentText(); - + TASSERT(m_db->hasTable(tableName), ""); + TableData data; m_db->tableData(tableName, data); - toData(data); - kit::msgBox(this, windowTitle()+CL8("表:")+data.tableName+CL8("成功!")); + toData(m_db->name(), data); + + QFileInfo srcInfo(m_db->name()); + QString msg = CL8("数据库:")+srcInfo.fileName()+CL8(",表:")+tableName+CL8("导出成功!"); + appendMsg(msg); + boxMsg(msg); } void MenuDeveMdb::on_batchBtn_clicked() { - QString tab; - for(int i = 0; i < m_ui->batch->count(); i++) + //QDir dir(m_ui->genPath->text()); + //dir.removeRecursively(); //删除目录 + + std::thread thd([&, this]()->bool { - QString tableName = m_ui->batch->itemText(i); - TASSERT(m_db->hasTable(tableName), ""); - TableData data; - tab = tab + tableName + ", "; - m_db->tableData(tableName, data); - toData(data); - } - kit::msgBox(this, windowTitle()+CL8("表:")+tab+CL8("成功!")); + for(int i = 0; i < m_ui->dbList->count(); i++) + { + QString dbfile = m_ui->dbList->itemText(i); + IConvertAbstract* db = IConvertAbstract::create(dbfile); + if(!db->load(dbfile)) + { + IConvertAbstract::destory(db); + break; + } + + for(int i = 0; i < m_ui->batch->count(); i++) + { + QString tableName = m_ui->batch->itemText(i); + TASSERT(db->hasTable(tableName), ""); + TableData data; + db->tableData(tableName, data); + toData(db->name(), data); + + QFileInfo srcInfo(m_ui->filepath->text()); + QString srcPath = srcInfo.isDir() ? srcInfo.filePath() : srcInfo.path(); + + QString dbname = dbfile; + dbname.replace(srcPath, ""); + + appendMsg(CL8("数据库:")+dbname+CL8(",表 ")+tableName+CL8(" 导出成功!")); + } + } + + QString tables; + for(int i = 0; i < m_ui->batch->count(); i++) + { + tables = tables + m_ui->batch->itemText(i) + ", "; + } + + QString msg = CL8("批量表:")+tables+CL8("全部导出完毕!\n"); + appendMsg(msg); + boxMsg(msg); + return true; + }); + + thd.detach(); +} + +void MenuDeveMdb::appendMsg(const QString& msg) +{ + emit sig_msg(msg); +} + +void MenuDeveMdb::boxMsg(const QString& msg) +{ + emit sig_box(msg); +} + +void MenuDeveMdb::on_msg(const QString& msg) +{ + if(++m_msgs > 1000) + { + m_msgs = 0; + m_ui->loading->clear(); + } + + QTextCharFormat fmt; //文本字符格式 + fmt.setForeground(KIT_RGB_GREEN); // 前景色(即字体色)设为color色 + QTextCursor cursor = m_ui->loading->textCursor(); //获取文本光标 + cursor.mergeCharFormat(fmt); //光标后的文字就用该格式显示 + m_ui->loading->mergeCurrentCharFormat(fmt); //textEdit使用当前的字符格式 + m_ui->loading->append(msg); + m_ui->loading->moveCursor(QTextCursor::End); +} + +void MenuDeveMdb::on_box(const QString& msg) +{ + kit::msgBox(this, msg); } diff --git a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.h b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.h index e59495df..6eceb357 100644 --- a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.h +++ b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.h @@ -25,27 +25,36 @@ public: virtual ~MenuDeveMdb(); virtual void setWindowInfo(const QString& title, const QIcon& icon) override { setWindowTitle(title); setWindowIcon(icon); } - bool loadFile(const QString& name); - void toData(TableData& data); + void toData(const QString& filepath, TableData& data); std::string toDataJson(const TableData& data); std::string toDataXml(const TableData& data); std::string toDataIni(const TableData& data); void caseConvert(TableData& data); + void appendMsg(const QString& msg); + void boxMsg(const QString& msg); private slots: void onTriggeredClicked(); void on_tables_currentIndexChanged(int index); void on_caseof_currentIndexChanged(int index); void on_format_currentIndexChanged(int index); void on_selectBtn_clicked(); + void on_selectSrc_clicked(); void on_selectDir_clicked(); void on_exportBtn_clicked(); void on_batchBtn_clicked(); - + void on_dbList_currentIndexChanged(int index); + void on_msg(const QString& msg); + void on_box(const QString& msg); +signals: + void sig_msg(const QString& msg); + void sig_box(const QString& msg); private: Ui::MenuDeveMdb *m_ui = nullptr; enum caseof_type {caseof_original, caseof_tolower, caseof_toupper}; enum format_type {format_json, format_xml, format_ini}; IConvertAbstract* m_db = NULL; + + int m_msgs = 0; }; #endif // MENUDEVEMDB_H diff --git a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.ui b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.ui index e3434a94..bd88e42e 100644 --- a/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.ui +++ b/entry/src/main/cpp/toolkit/menu/deve/MenuDeveMdb.ui @@ -6,8 +6,8 @@ 0 0 - 748 - 372 + 798 + 446 @@ -18,7 +18,7 @@ 90 39 - 551 + 541 30 @@ -26,9 +26,9 @@ - 644 + 636 39 - 91 + 71 31 @@ -39,9 +39,9 @@ - 30 - 40 - 61 + 35 + 36 + 51 31 @@ -52,8 +52,8 @@ - 90 - 130 + 160 + 220 191 30 @@ -62,8 +62,8 @@ - 20 - 130 + 90 + 220 71 31 @@ -75,9 +75,9 @@ - 380 - 130 - 91 + 160 + 175 + 101 30 @@ -85,9 +85,9 @@ - 310 - 130 - 81 + 90 + 175 + 71 31 @@ -98,7 +98,7 @@ - 220 + 370 220 101 31 @@ -111,9 +111,9 @@ - 590 - 130 - 91 + 370 + 175 + 101 30 @@ -121,8 +121,8 @@ - 500 - 130 + 290 + 175 81 31 @@ -136,7 +136,7 @@ 90 80 - 551 + 616 30 @@ -144,9 +144,9 @@ - 644 + 710 80 - 91 + 71 31 @@ -157,9 +157,9 @@ - 30 - 80 - 61 + 35 + 78 + 51 31 @@ -167,24 +167,11 @@ 生成目录 - - - false - - - - 90 - 280 - 551 - 30 - - - - 380 - 220 + 370 + 260 101 31 @@ -196,26 +183,72 @@ - 20 - 170 + 90 + 260 61 31 - 批量导出 + 表批量导出 - 90 - 170 + 160 + 260 191 30 + + + + 710 + 40 + 71 + 31 + + + + 选择目录 + + + + + + 25 + 128 + 61 + 31 + + + + 数据库列表 + + + + + + 90 + 130 + 616 + 30 + + + + + + + 90 + 300 + 616 + 131 + + + diff --git a/entry/src/main/cpp/toolkit/menu/tool/MenuToolDecrypt.cpp b/entry/src/main/cpp/toolkit/menu/tool/MenuToolDecrypt.cpp index 3f612528..d040b05f 100644 --- a/entry/src/main/cpp/toolkit/menu/tool/MenuToolDecrypt.cpp +++ b/entry/src/main/cpp/toolkit/menu/tool/MenuToolDecrypt.cpp @@ -29,8 +29,8 @@ void MenuToolDecrypt::on_srcBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->srcPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } @@ -40,15 +40,15 @@ void MenuToolDecrypt::on_dstBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->dstPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } void MenuToolDecrypt::on_button_clicked() { loginfo("doSomething"); - std::string srcPath = m_ui->srcPath->text().toLocal8Bit().data(); + std::string srcPath = m_ui->srcPath->text().toLocal8Bit().data(); std::string dstPath = m_ui->dstPath->text().toLocal8Bit().data(); if(srcPath.empty()) { @@ -62,6 +62,10 @@ void MenuToolDecrypt::on_button_clicked() kit::errorBox(this, msg); return; } + + //QDir dir(m_ui->dstPath->text()); + //dir.removeRecursively(); //删除目录 + kit::makeSurePathExist(m_ui->dstPath->text()); if(!Tools::filePathExist(srcPath)) { QString msg = m_ui->srcLabel->text()+":"+m_ui->srcPath->text()+CL8(",不存在"); @@ -75,14 +79,26 @@ void MenuToolDecrypt::on_button_clicked() return; } + static const std::set filter = {".txt", ".ini", ".json"}; + CryptoAlgorithm crypto; - std::vector files = Tools::getFiles(srcPath); + std::vector files = Tools::getFiles2(srcPath); //Tools::getFiles(srcPath); for(size_t i = 0; i < files.size(); i++) { - std::string model = Tools::readFileText(files[i]); - std::string filename = Tools::getFileName(files[i]); - std::string dec = crypto.decrypt(model); - Tools::writeFileText(dstPath + "/" + filename, dec); + const std::string& file = files[i]; + bool isFile = !Tools::isDirectory(file); + std::string dst = isFile ? Tools::getFilePath(file) : file; + dst.replace(0, srcPath.length(), dstPath); + Tools::makeSurePath(dst + "/"); + std::string ext = Tools::tolower(Tools::getFileSuffix(file)); + if(isFile && filter.find("." + ext) != filter.end()) + { + std::string model = Tools::readFileText(file); + //如果没指定后缀就原样输出 + std::string filename = Tools::getFileName(files[i]); + std::string dec = crypto.decrypt(model); + Tools::writeFileText(dst + "/" + filename, dec); + } } kit::msgBox(this, windowTitle()+CL8("成功!")); diff --git a/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.cpp b/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.cpp index 81fea487..66729b8e 100644 --- a/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.cpp +++ b/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.cpp @@ -30,8 +30,8 @@ void MenuToolEncrypt::on_srcBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->srcPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } @@ -41,8 +41,8 @@ void MenuToolEncrypt::on_dstBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->dstPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } @@ -63,6 +63,9 @@ void MenuToolEncrypt::on_button_clicked() kit::errorBox(this, msg); return; } + //QDir dir(m_ui->dstPath->text()); + //dir.removeRecursively(); //删除目录 + kit::makeSurePathExist(m_ui->dstPath->text()); if(!Tools::filePathExist(srcPath)) { QString msg = m_ui->srcLabel->text()+":"+m_ui->srcPath->text()+CL8(",不存在"); @@ -76,17 +79,28 @@ void MenuToolEncrypt::on_button_clicked() return; } - QString suff = m_ui->genSuffix->currentData().toString(); + std::string suff = m_ui->genSuffix->currentData().toString().toLocal8Bit().data(); + + static const std::set filter = {".txt", ".ini", ".json"}; + CryptoAlgorithm crypto; - std::vector files = Tools::getFiles(srcPath); + std::vector files = Tools::getFiles2(srcPath); //Tools::getFiles(srcPath); for(size_t i = 0; i < files.size(); i++) { const std::string& file = files[i]; - std::string model = Tools::readFileText(file); - //如果没指定后缀就原样输出 - std::string filename = suff.isEmpty() ? Tools::getFileName(file) : Tools::getFileBaseName(file) + ".txt"; - std::string enc = crypto.encrypt(model); - Tools::writeFileText(dstPath + "/" + filename, enc); + bool isFile = !Tools::isDirectory(file); + std::string dst = isFile ? Tools::getFilePath(file) : file; + dst.replace(0, srcPath.length(), dstPath); + Tools::makeSurePath(dst + "/"); + std::string ext = Tools::tolower(Tools::getFileSuffix(file)); + if(isFile && filter.find("." + ext) != filter.end()) + { + std::string model = Tools::readFileText(file); + //如果没指定后缀就原样输出 + std::string filename = suff.empty() ? Tools::getFileName(file) : Tools::getFileBaseName(file) + suff; + std::string enc = crypto.encrypt(model); + Tools::writeFileText(dst + "/" + filename, enc); + } } kit::msgBox(this, windowTitle()+CL8("成功!")); return; diff --git a/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.h b/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.h index a78e6082..90b2a396 100644 --- a/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.h +++ b/entry/src/main/cpp/toolkit/menu/tool/MenuToolEncrypt.h @@ -25,6 +25,7 @@ private slots: void on_genSuffix_currentIndexChanged(int index); + private: Ui::MenuToolEncrypt *m_ui = nullptr; }; diff --git a/entry/src/main/cpp/toolkit/menu/tool/MenuToolPkg.cpp b/entry/src/main/cpp/toolkit/menu/tool/MenuToolPkg.cpp index 707d2a42..7b2b8128 100644 --- a/entry/src/main/cpp/toolkit/menu/tool/MenuToolPkg.cpp +++ b/entry/src/main/cpp/toolkit/menu/tool/MenuToolPkg.cpp @@ -28,8 +28,8 @@ void MenuToolPkg::on_srcBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->srcPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } diff --git a/entry/src/main/cpp/toolkit/menu/tool/MenuToolUnpkg.cpp b/entry/src/main/cpp/toolkit/menu/tool/MenuToolUnpkg.cpp index e851e070..a4745284 100644 --- a/entry/src/main/cpp/toolkit/menu/tool/MenuToolUnpkg.cpp +++ b/entry/src/main/cpp/toolkit/menu/tool/MenuToolUnpkg.cpp @@ -31,8 +31,8 @@ void MenuToolUnpkg::on_srcBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->srcPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } @@ -42,8 +42,8 @@ void MenuToolUnpkg::on_dstBtn_clicked() if(!dirpath.isEmpty() && QFile::exists(dirpath)) { m_ui->dstPath->setText(dirpath); - std::string dir = dirpath.toStdString(); - loginfo("dir=%s", dir.c_str()); + //std::string dir = dirpath.toStdString(); + //loginfo("dir=%s", dir.c_str()); } } diff --git a/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp b/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp index 8b85ba25..1c1add85 100644 --- a/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp +++ b/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp @@ -47,7 +47,7 @@ void ReplayWrapper::replayReset() { if(m_thread->joinable()) { - m_thread->join(); + m_thread->join(); //detach线程不能被join } __DELETE__(m_thread); } @@ -349,7 +349,11 @@ void ReplayWrapper::replayTrackTypeArtificialItem(const TTrackData::Ptr& data) int itemno = root["itemno"].asInt(); int type = root["type"].asInt(); int codeValue = examJudgeArtificialItem(itemno, type); - TASSERT(codeValue == codeSuccess, ""); + //TASSERT(codeValue == codeSuccess, ""); + if(codeValue != codeSuccess) + { + logerror("examJudgeArtificialItem error %s", errorCode2Name((ErrorCode)codeValue)); + } { emit updateDataArtificialItem(itemno, type); diff --git a/entry/src/main/cpp/toolkit/ui/MainWindow.cpp b/entry/src/main/cpp/toolkit/ui/MainWindow.cpp index 3b311b02..07872fc1 100644 --- a/entry/src/main/cpp/toolkit/ui/MainWindow.cpp +++ b/entry/src/main/cpp/toolkit/ui/MainWindow.cpp @@ -51,90 +51,49 @@ void MainWindow::init() KIT_CONNECT(updateDataFrameNum(int, int)); KIT_CONNECT(updateNextDoing()); - m_audioList.setPlaybackMode(QMediaPlaylist::Loop); - m_audio.setVolume(99); - //m_audio.setPlaylist(&m_audioList); + static const QString gpsStyle1("color:#9933FA;"); + static const QString gpsStyle2("color:#802A2A;"); +#define KIT_SET_GPS_STYLE(name) name->setStyleSheet(gpsStyle1); name##_2->setStyleSheet(gpsStyle2); - playerAudio("88888"); + KIT_SET_GPS_STYLE(m_ui->gps_bklx); + KIT_SET_GPS_STYLE(m_ui->gps_dwzt); + KIT_SET_GPS_STYLE(m_ui->gps_jdzt); + KIT_SET_GPS_STYLE(m_ui->gps_sj); + KIT_SET_GPS_STYLE(m_ui->gps_jd); + KIT_SET_GPS_STYLE(m_ui->gps_wd); + KIT_SET_GPS_STYLE(m_ui->gps_hxj); + KIT_SET_GPS_STYLE(m_ui->gps_fyj); + KIT_SET_GPS_STYLE(m_ui->gps_hbg); + KIT_SET_GPS_STYLE(m_ui->gps_gdc); + KIT_SET_GPS_STYLE(m_ui->gps_sd); + KIT_SET_GPS_STYLE(m_ui->gps_age); + KIT_SET_GPS_STYLE(m_ui->gps_jdyz); + KIT_SET_GPS_STYLE(m_ui->gps_wdyz); + KIT_SET_GPS_STYLE(m_ui->gps_dwsxs); + KIT_SET_GPS_STYLE(m_ui->gps_jdsxs); - m_ui->mapCom->hide(); - m_mapCom->show(); - m_detail->setIcon(m_icon); - - m_ui->frameNum->setAlignment(Qt::AlignRight); - //m_ui->frameNum->setReadOnly(true); - m_ui->timeSche->setAlignment(Qt::AlignCenter); - m_ui->outputLog->setReadOnly(true); - m_ui->examEventInfo->setReadOnly(true); - - m_ui->mapSize->setText(kit::toString(m_mapCom->width()) + "/" + kit::toString(m_mapCom->height())); + static const QString peStyle("color:#03289E;"); + m_ui->pe_time ->setStyleSheet(peStyle); + m_ui->pe_grade ->setStyleSheet(peStyle); + m_ui->pe_disAccu ->setStyleSheet(peStyle); + m_ui->pe_disBack ->setStyleSheet(peStyle); + m_ui->pe_disEast ->setStyleSheet(peStyle); + m_ui->pe_disNorth->setStyleSheet(peStyle); + m_ui->pe_hint ->setStyleSheet(peStyle); m_ui->carzt->setTextColor(KIT_RGB_BLACK); - //m_ui->carzt->setFont(QFont("宋体", 13)); //设置字体和字体大小 m_ui->carzt->setFontWeight(QFont::Weight::Black); m_ui->carzt->setAlignment(Qt::AlignCenter); - m_ui->btnRunning->setIcon(m_icon); - //m_ui->btnRunning->setIconSize(m_icon); + m_ui->loop->clear(); + m_ui->loop->addItem(CL8("否"), false); + m_ui->loop->addItem(CL8("是"), true); + m_ui->loop->setCurrentIndex(0); - //防止键盘误操作 - m_ui->btnSelectTrackFile->setFocusPolicy(Qt::ClickFocus); - m_ui->btnRunning->setFocusPolicy(Qt::ClickFocus); - m_ui->btnPause->setFocusPolicy(Qt::ClickFocus); - m_ui->btnClearLog->setFocusPolicy(Qt::ClickFocus); - m_ui->btnScalingSmall->setFocusPolicy(Qt::ClickFocus); - m_ui->btnScalingLarge->setFocusPolicy(Qt::ClickFocus); - m_ui->btnPlaySlow->setFocusPolicy(Qt::ClickFocus); - m_ui->btnPlayFast->setFocusPolicy(Qt::ClickFocus); - m_ui->btnTrackLast->setFocusPolicy(Qt::ClickFocus); - m_ui->btnTrackNext->setFocusPolicy(Qt::ClickFocus); - - static const QString gpsColor("color:#9933FA;"); - m_ui->gps_bklx ->setStyleSheet(gpsColor); - m_ui->gps_dwzt ->setStyleSheet(gpsColor); - m_ui->gps_jdzt ->setStyleSheet(gpsColor); - m_ui->gps_sj ->setStyleSheet(gpsColor); - m_ui->gps_jd ->setStyleSheet(gpsColor); - m_ui->gps_wd ->setStyleSheet(gpsColor); - m_ui->gps_hxj ->setStyleSheet(gpsColor); - m_ui->gps_fyj ->setStyleSheet(gpsColor); - m_ui->gps_hbg ->setStyleSheet(gpsColor); - m_ui->gps_gdc ->setStyleSheet(gpsColor); - m_ui->gps_sd ->setStyleSheet(gpsColor); - m_ui->gps_age ->setStyleSheet(gpsColor); - m_ui->gps_jdyz ->setStyleSheet(gpsColor); - m_ui->gps_wdyz ->setStyleSheet(gpsColor); - m_ui->gps_dwsxs->setStyleSheet(gpsColor); - m_ui->gps_jdsxs->setStyleSheet(gpsColor); - - static const QString gpsColor2("color:#802A2A;"); - m_ui->gps_bklx_2 ->setStyleSheet(gpsColor2); - m_ui->gps_dwzt_2 ->setStyleSheet(gpsColor2); - m_ui->gps_jdzt_2 ->setStyleSheet(gpsColor2); - m_ui->gps_sj_2 ->setStyleSheet(gpsColor2); - m_ui->gps_jd_2 ->setStyleSheet(gpsColor2); - m_ui->gps_wd_2 ->setStyleSheet(gpsColor2); - m_ui->gps_hxj_2 ->setStyleSheet(gpsColor2); - m_ui->gps_fyj_2 ->setStyleSheet(gpsColor2); - m_ui->gps_hbg_2 ->setStyleSheet(gpsColor2); - m_ui->gps_gdc_2 ->setStyleSheet(gpsColor2); - m_ui->gps_sd_2 ->setStyleSheet(gpsColor2); - m_ui->gps_age_2 ->setStyleSheet(gpsColor2); - m_ui->gps_jdyz_2 ->setStyleSheet(gpsColor2); - m_ui->gps_wdyz_2 ->setStyleSheet(gpsColor2); - m_ui->gps_dwsxs_2->setStyleSheet(gpsColor2); - m_ui->gps_jdsxs_2->setStyleSheet(gpsColor2); - - static const QString peColor("color:#03289E;"); - m_ui->pe_time ->setStyleSheet(peColor); - m_ui->pe_grade ->setStyleSheet(peColor); - m_ui->pe_disAccu ->setStyleSheet(peColor); - m_ui->pe_disBack ->setStyleSheet(peColor); - m_ui->pe_disEast ->setStyleSheet(peColor); - m_ui->pe_disNorth->setStyleSheet(peColor); - m_ui->pe_hint ->setStyleSheet(peColor); - - //===================================================== + m_ui->replay->clear(); + m_ui->replay->addItem(CL8("否"), false); + m_ui->replay->addItem(CL8("是"), true); + m_ui->replay->setCurrentIndex(1); m_ui->logLevel->clear(); for(int i = LOG_LV_CLOSE; i <= LOG_LV_ALL; i++) @@ -163,39 +122,58 @@ void MainWindow::init() QString desc = QString("%1[%2]").arg(abbr).arg(itemNo); m_ui->artiItems->addItem(desc, itemNo); } - m_ui->logLevel->setCurrentIndex(m_ui->artiItems->findData(LOG_LV_ALL)); + m_ui->artiItems->setCurrentIndex(m_ui->artiItems->findData(Sub3ItemType20Comm)); - m_ui->loop->clear(); - m_ui->loop->addItem(CL8("否"), false); - m_ui->loop->addItem(CL8("是"), true); - m_ui->loop->setCurrentIndex(0); + //防止键盘误操作 + m_ui->btnSelectTrackFile->setFocusPolicy(Qt::ClickFocus); + m_ui->btnRunning->setFocusPolicy(Qt::ClickFocus); + m_ui->btnPause->setFocusPolicy(Qt::ClickFocus); + m_ui->btnClearLog->setFocusPolicy(Qt::ClickFocus); + m_ui->btnScalingSmall->setFocusPolicy(Qt::ClickFocus); + m_ui->btnScalingLarge->setFocusPolicy(Qt::ClickFocus); + m_ui->btnPlaySlow->setFocusPolicy(Qt::ClickFocus); + m_ui->btnPlayFast->setFocusPolicy(Qt::ClickFocus); + m_ui->btnTrackLast->setFocusPolicy(Qt::ClickFocus); + m_ui->btnTrackNext->setFocusPolicy(Qt::ClickFocus); - m_ui->replay->clear(); - m_ui->replay->addItem(CL8("否"), false); - m_ui->replay->addItem(CL8("是"), true); - m_ui->replay->setCurrentIndex(1); + m_ui->frameNum->setAlignment(Qt::AlignRight); + m_ui->timeSche->setAlignment(Qt::AlignCenter); + m_ui->outputLog->setReadOnly(true); + m_ui->examEventInfo->setReadOnly(true); + m_ui->mapSize->setText(QString("%1*%2").arg(m_mapCom->width()).arg(m_mapCom->height())); + m_ui->btnRunning->setIcon(m_icon); + + m_ui->mapCom->hide(); + m_mapCom->show(); + m_detail->setIcon(m_icon); + m_playTimes = m_ui->playTimes->text().toInt(); m_replay->replayInit(); - - int w = m_mapCom->width(); - int h = m_mapCom->height(); - m_replay->replaySetSize(w, h); + m_replay->replaySetSize(m_mapCom->width(), m_mapCom->height()); m_replay->replaySetScaling(m_ui->scalingDiploid->text().toInt()); m_replay->replaySetPlaySpeed(m_ui->playSpeed->text().toInt()); - m_playTimes = m_ui->playTimes->text().toInt(); - updateCarzt(moveInvalid); loadTrackFiles(QString(".") + TRACK_PATH); - //int count = m_ui->trackFiles->count(); - //if(count > 0) - //{ - // m_replay->replaySetTrackFile(m_ui->trackFiles->currentText()); - //} + playSoundVoice(sound::subx_welcome); - logtrace("version=[%s][%s][%s]", JUDGE_VERSION_STR, JUDGE_VERSION_INFO, examJudgeVersion()); + logtrace("version-sdk=[%s][%s][%s]", JUDGE_VERSION_STR, JUDGE_VERSION_INFO, examJudgeVersion()); + logtrace("version-kit=[%s][%s]", KIT_VERSION_STR, KIT_VERSION_NOTE); + + //test-test + //{ CurrentItemOnce, CurrentItemInLoop, Sequential, Loop, Random }; + //分别为播放一次,单循环,顺序,列表循环,随机播放,这个为我们提供了很大的方便。 + //m_audioList.setPlaybackMode(QMediaPlaylist::Sequential); + //m_audio.setPlaylist(&m_audioList); + //m_audio.setVolume(99); + + //playSoundVoice(sound::subx_qualified); + //playSoundVoice("30105"); //语音不对??41703 + + //IConvertMdb mdb; + //mdb.load("D:\\code\\judge2.0-240520\\bin\\model\\wuxi_km3_ret2000\\ret2000.mdb;"); } @@ -386,21 +364,100 @@ void MainWindow::quitEvent(QEvent* event) } } -void MainWindow::playerAudio(std::string markcatalog) +void MainWindow::playSoundMark(const std::string& markcatalog) { - return; - ExamSubject sub = m_replay->replayExamSubject(); - QString dirpath = sub == ExamSubject2 ? KIT_AUDIO_KM2 : KIT_AUDIO_KM3; - QString file = dirpath + markcatalog.c_str() + ".mp3"; + playSoundVoice(markcatalog); +} - if(!QFileInfo::exists(file)) +std::string MainWindow::playSoundCode(ExamEventType e, const std::string& enter, const std::string& finish, const std::string& cancel) +{ + switch(e) { - logerror("not find audio file:%s", file.toLocal8Bit().data()); + case ExamEventTypeItemEnter: return enter; + case ExamEventTypeItemFinish: return finish; + case ExamEventTypeItemCancel: return cancel; + default: return ""; + } + return ""; +} + +void MainWindow::playSoundItem(int itemNo, ExamEventType e) +{ + std::string code = ""; + std::string invalid = ""; + ExamSubject sub = m_replay->replayExamSubject(); + ExamCarType carType = m_replay->replayExamCarType(); + if(ExamSubject2 == sub) + { + int stdCode = sub2ItemNo2StdCode(itemNo); + switch(stdCode) + { + case 20100: code = playSoundCode(e, sound::sub2_20100, invalid, invalid); break; //倒车入库 + case 20300: code = playSoundCode(e, sound::sub2_20300, invalid, invalid); break; //坡道起步 + case 20400: code = playSoundCode(e, sound::sub2_20400, invalid, invalid); break; //侧方停车 + case 20600: code = playSoundCode(e, sound::sub2_20600, invalid, invalid); break; //曲线行驶 + case 20700: code = playSoundCode(e, sound::sub2_20700, invalid, invalid); break; //直角转弯 + default: code = ""; break; + } + } + else if(ExamSubject3 == sub) + { + int stdCode = sub3ItemNo2StdCode(itemNo); + switch(stdCode) + { + case 40300: code = playSoundCode(e, sound::sub3_403001, sound::sub3_403002, invalid); break; //直线行驶 + case 40500: code = playSoundCode(e, sound::sub3_405001, sound::sub3_405002, invalid); break; //变更车道 + case 41400: code = playSoundCode(e, sound::sub3_414001, invalid, invalid); break; //超车 + case 40700: code = playSoundCode(e, sound::sub3_407001, invalid, invalid); break; //直行通过路口 + case 40800: code = playSoundCode(e, sound::sub3_408001, invalid, invalid); break; //左转 + case 40900: code = playSoundCode(e, sound::sub3_409001, invalid, invalid); break; //右转 + case 41000: code = playSoundCode(e, sound::sub3_410001, invalid, invalid); break; //通过人行横道 + case 41100: code = playSoundCode(e, sound::sub3_411001, invalid, invalid); break; //通过学校 + case 41200: code = playSoundCode(e, sound::sub3_412001, invalid, invalid); break; //通过车站 + case 41300: code = playSoundCode(e, sound::sub3_413001, sound::sub3_413002, invalid); break; //会车 + case 40600: code = playSoundCode(e, sound::sub3_406001, invalid, invalid); break; //靠边停车 + case 41500: code = playSoundCode(e, sound::sub3_415001, invalid, invalid); break; //掉头 + case 40400: code = playSoundCode(e, sound::sub3_404001, invalid, invalid); break; //加减档 + default: code = ""; break; + } + } + if(code != invalid) + { + playSoundVoice(code); + } +} + +void MainWindow::playSoundVoice(const std::string& code) +{ +#ifndef JUDGE_OS_WIN + return; +#endif + QString filepath = KIT_SOUND_PATH + "/" + CL8(code.c_str()); + QString mp3 = filepath + ".mp3"; + QString wav = filepath + ".wav"; + QString WAV = filepath + ".WAV"; + + QString file = ""; + if(QFileInfo::exists(mp3)) + { + file = mp3; + } + else if(QFileInfo::exists(wav)) + { + file = wav; + } + else if(QFileInfo::exists(WAV)) + { + file = WAV; + } + else + { + logwarning("not find audio file:%s", filepath.toLocal8Bit().data()); return; } - //m_audioList.addMedia(QUrl::fromLocalFile(file)); //m_audio.setPlaylist(&m_audioList); + //m_audioList.addMedia(QUrl::fromLocalFile(file)); m_audio.setMedia(QUrl::fromLocalFile(file)); m_audio.play(); return; @@ -559,25 +616,24 @@ TMarkRule MainWindow::findMarkItemText(const TKfXm& item) void MainWindow::updateCarzt(int carzt) { - if(carzt == moveBackward) + switch(carzt) { + case moveBackward: m_ui->carzt->setTextColor(KIT_RGB_RED); m_ui->carzt->setText(CL8("后退")); - } - else if(carzt == moveStop) - { + break; + case moveStop: m_ui->carzt->setTextColor(KIT_RGB_ORANGE); m_ui->carzt->setText(CL8("停车")); - } - else if(carzt == moveForward) - { + break; + case moveForward: m_ui->carzt->setTextColor(KIT_RGB_GREEN); m_ui->carzt->setText(CL8("前进")); - } - else - { + break; + default: m_ui->carzt->setTextColor(KIT_RGB_PURPLE); m_ui->carzt->setText(CL8("[***]")); + break; } } @@ -618,12 +674,14 @@ void MainWindow::letsGo(bool click) if(run) { m_mapCom->setText(CL8("轨迹停止...")); + m_audio.stop(); //m_ui->initData->clear(); //m_ui->initMark->clear(); //m_ui->initSysset->clear(); //m_ui->initModel->clear(); //m_ui->stuBeg->clear(); //m_ui->stu_special->clear(); + } else { @@ -632,11 +690,15 @@ void MainWindow::letsGo(bool click) if(click) { - if((!run) == false) + if(run) { m_playTimes = 0; m_ui->playTimes->setText(QString::number(m_playTimes)); } + else + { + playSoundVoice(sound::subx_exam_waiting); + } } } @@ -882,7 +944,9 @@ void MainWindow::updateDataRealExam(const QString& info) { value.gps.hxj -= 360.0; } - value.gps.sd *= 1.852; +#ifndef JUDGE_USE_INSPECT + value.gps.sd *= 1.852; //无锡所检测不需要乘这个系数,因为我们实际用的时候是gps速度,无锡所是加工后的数据 +#endif value.gps.jd = GpsMath::convertGpsCoord2(value.gps.jd); value.gps.wd = GpsMath::convertGpsCoord2(value.gps.wd); @@ -894,7 +958,9 @@ void MainWindow::updateDataRealExam(const QString& info) { value.gps2.hxj -= 360.0; } - value.gps2.sd *= 1.852; + #ifndef JUDGE_USE_INSPECT + value.gps2.sd *= 1.852; //无锡所检测不需要乘这个系数,因为我们实际用的时候是gps速度,无锡所是加工后的数据 + #endif value.gps2.jd = GpsMath::convertGpsCoord2(value.gps2.jd); value.gps2.wd = GpsMath::convertGpsCoord2(value.gps2.wd); @@ -975,6 +1041,16 @@ void MainWindow::updateDataRealExam(const QString& info) m_ui->cg_sde ->setText(CL8("闪灯:") + kit::toString(cg.sde)); //闪灯 m_ui->cg_xhd ->setText(CL8("信号灯值(预留):") + kit::toString(cg.xhd)); //信号灯值(预留) + if(!cg.mndg.empty()) + { + logtrace("item-mndg=%s", cg.mndg.c_str()); + } + + if(cg.wav > 0) + { + logtrace("wav-mndg=%d", cg.wav); + } + } void MainWindow::updateDataArtificialMark(int itemno, const QString& serial) @@ -1020,33 +1096,35 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) std::string org(bytes.data(), bytes.size()); m_parser->parseJudgeData(org, value); - ExamEventType eventType = ((ExamEventType)value.event); + ExamEventType eventType = (ExamEventType)value.event; std::string time = Tools::toTimeString(value.sj/SECOND) + "."+ std::to_string(value.sj%SECOND); std::string desc = ExamEventType2Desc(eventType); //loginfo("recv time=%s, event=%s", time.c_str(), desc.c_str()); QString event = CL8(time.c_str()) + "[" + CL8(desc.c_str()) + "]"; - if(value.event == ExamEventTypeItemEnter) + if(eventType == ExamEventTypeItemEnter) { int itemNo = value.xmks.xmdm; updateItemProperty(itemNo, KIT_RGB_PERILLA); QString text = event + "," + getItemText(itemNo); updateExamEvent(text); + playSoundItem(itemNo, eventType); } - else if(value.event == ExamEventTypeItemFinish) + else if(eventType == ExamEventTypeItemFinish) { int itemNo = value.xmjs.xmdm; QColor color = m_replay->replayItemMarkHas(itemNo) ? KIT_RGB_RED : KIT_RGB_GREEN; updateItemProperty(itemNo, color); QString text = event + "," + getItemText(itemNo); updateExamEvent(text); + playSoundItem(itemNo, eventType); } - else if(value.event == ExamEventTypeMark) + else if(eventType == ExamEventTypeMark) { TKfXm kfxm; kfxm.xmdm = value.kf.xmdm; kfxm.kfdm = value.kf.kfdm; - playerAudio(value.kf.markcatalog); + playSoundMark(value.kf.markcatalog); int itemNo = kfxm.xmdm; if(itemNo != Sub2ItemTypeInvalid) { @@ -1065,13 +1143,13 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) TASSERT(ok, ""); const TMarkRule* rule = TableMark->find(value.kf.xmdm, value.kf.kfdm); TASSERT(nullptr != rule, "") - m_markGrade -= std::abs(rule->markreal); + m_markGrade -= std::abs(rule->markreal); m_markTimes++; m_ui->pe_markGrade->setText(CL8("扣分/次数:") + kit::toString(m_markGrade) + "/" + kit::toString(m_markTimes)); } } - else if(value.event == ExamEventTypeMoveState) + else if(eventType == ExamEventTypeMoveState) { QString s1 = m_ui->carzt->toPlainText(); updateCarzt(value.carzt); @@ -1079,29 +1157,32 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) QString text = event + "," + s1 + "->" + s2; updateExamEvent(text); } - else if(value.event == ExamEventTypeExamFinish) + else if(eventType == ExamEventTypeExamFinish) { int pass = examCarType2Pass(m_replay->replayExamSubject(), m_replay->replayExamCarType()); QString grade = CL8(",成绩:") + kit::toString(m_currGrade)+CL8("分"); QString result = m_currGrade >= pass ? CL8(",成绩合格") : CL8(",成绩不合格"); QString text = event + CL8(",考试结束") + grade + result; updateExamEvent(text); + playSoundVoice(m_currGrade >= pass ? sound::subx_qualified : sound::subx_unqualified); } - else if(value.event == ExamEventTypeItemCancel) + else if(eventType == ExamEventTypeItemCancel) { int itemNo = value.xmqx.xmdm; updateItemProperty(itemNo, KIT_RGB_BLUE); QString text = event + "," + getItemText(itemNo); updateExamEvent(text); + playSoundItem(itemNo, eventType); } - else if(value.event == ExamEventTypeSound) + else if(eventType == ExamEventTypeSound) { int itemNo = value.sound.xmdm; QString s = QString::fromUtf8(value.sound.code.c_str()); QString text = event + "," + getItemText(itemNo) + CL8(",语音代码:") + s; updateExamEvent(text); + playSoundVoice(value.sound.code); } - else if(value.event == ExamEventTypeLight) + else if(eventType == ExamEventTypeLight) { std::string mndg = value.mndg; QString s = QString::fromUtf8(mndg.c_str()); @@ -1177,20 +1258,20 @@ void MainWindow::updateDataCallbackPerform(const QString& info) else m_ui->TouchLineType->setStyleSheet("color:#000000;"); m_ui->Wheel_LF_RF_ToRightEdge->setText(CL8("Wheel_LF/RF_ToRightEdge:") + "(" + - kit::toString(RTKKM3.Wheel_LF_ToRightEdge) + "," + - kit::toString(RTKKM3.Wheel_RF_ToRightEdge) + ")"); + kit::toString(RTKKM3.Wheel_LF_ToRightEdge) + "," + + kit::toString(RTKKM3.Wheel_RF_ToRightEdge) + ")"); m_ui->Wheel_LF_RF_ToBaseLine->setText(CL8("Wheel_LF/RF_ToBaseLine:") + "(" + - kit::toString(RTKKM3.Wheel_LF_ToBaseLine) + "," + - kit::toString(RTKKM3.Wheel_RF_ToBaseLine) + ")"); + kit::toString(RTKKM3.Wheel_LF_ToBaseLine) + "," + + kit::toString(RTKKM3.Wheel_RF_ToBaseLine) + ")"); m_ui->Wheel_LB_RB_ToRightEdge->setText(CL8("Wheel_LB/RB_ToRightEdge:") + "(" + - kit::toString(RTKKM3.Wheel_LB_ToRightEdge) + "," + - kit::toString(RTKKM3.Wheel_RB_ToRightEdge) + ")"); + kit::toString(RTKKM3.Wheel_LB_ToRightEdge) + "," + + kit::toString(RTKKM3.Wheel_RB_ToRightEdge) + ")"); m_ui->Wheel_LB_RB_ToBaseLine->setText(CL8("Wheel_LB/RB_ToBaseLine:") + "(" + - kit::toString(RTKKM3.Wheel_LB_ToBaseLine) + "," + - kit::toString(RTKKM3.Wheel_RB_ToBaseLine) + ")"); + kit::toString(RTKKM3.Wheel_LB_ToBaseLine) + "," + + kit::toString(RTKKM3.Wheel_RB_ToBaseLine) + ")"); QString BasePointInLaneDir; if(RTKKM3.BasePointInLaneLeftLine == "5") BasePointInLaneDir = CL8("非机动车道"); @@ -1391,7 +1472,6 @@ void MainWindow::on_frameNum_editingFinished() m_ui->btnPause->setText(pause ? CL8("暂停") : CL8("继续")); m_replay->replayPause(!pause); } - loginfo("on_frameNum_textEdited=%d", value); } void MainWindow::on_scalingDiploid_editingFinished() @@ -1409,7 +1489,6 @@ void MainWindow::on_playSpeed_editingFinished() if(arg1.isEmpty()) return; int value = arg1.toInt(); m_replay->replaySetPlaySpeed(value); - //loginfo("on_playSpeed_editingFinished=%d", value); } void MainWindow::on_logLevel_currentIndexChanged(int index) @@ -1435,7 +1514,6 @@ void MainWindow::on_playTimes_editingFinished() QString arg1 = m_ui->playTimes->text(); if(arg1.isEmpty()) return; m_playTimes = arg1.toInt(); - loginfo("on_playTimes_editingFinished=%d", m_playTimes); } void MainWindow::on_trackFiles_currentIndexChanged(int index) @@ -1443,6 +1521,29 @@ void MainWindow::on_trackFiles_currentIndexChanged(int index) if(index < 0) { return ;}; QString s = m_ui->trackFiles->currentData().toString(); m_replay->replaySetTrackFile(s); + +#ifdef JUDGE_USE_INSPECT + //界面标题显示无锡所用例信息 + QFileInfo info(QFileInfo(s).path()); + QString fileName = info.fileName(); + if(info.filePath().contains(CL8("无锡所送检")) && fileName.contains("_")) + { + QStringList sep = fileName.split("_"); + QString caseCode = sep.size() > 1 ? sep[1] : CL8(""); + + const char* markDesc = kit::inspectCase2MarkDesc(caseCode.toLocal8Bit().data()); + const char* itemDesc = kit::inspectCase2ItemDesc(caseCode.toLocal8Bit().data()); + + QString desc = QString("%1-%2-%3").arg(CL8(itemDesc)).arg(caseCode).arg(CL8(markDesc)); + setWindowTitle(CL8(KIT_APP_NAME) + CL8(" ") + CL8("【***") + desc + CL8("***】")); + } +#endif + + bool run = m_replay->replayIsRunning(); + if(!run) + { + playSoundVoice(sound::subx_ksks); + } } void MainWindow::on_loop_currentIndexChanged(int index) @@ -1477,7 +1578,7 @@ void MainWindow::on_playSlider_sliderReleased() void MainWindow::on_playSlider_valueChanged(int value) { - //loginfo("%d", value); + } void MainWindow::on_initMark_highlighted(int index) @@ -1533,6 +1634,11 @@ void MainWindow::on_initModel_highlighted(int index) m_detail->showContent(pos, CL8("模型详情:")+info, model); } +void MainWindow::on_trackFiles_highlighted(int index) +{ + +} + void MainWindow::on_btnArtiMark_clicked() { int index = m_ui->initMark->currentIndex(); @@ -1554,13 +1660,9 @@ void MainWindow::on_artiItems_currentIndexChanged(int index) } /* -#include -#include -std::thread* g_thread; void MainWindow::on_btnSend_clicked() { - if(g_thread != NULL) return; - g_thread = NEW std::thread([&, this]()->void + std::thread thd([&, this]()->void { //QHostAddress addr("127.0.0.1"); QHostAddress addr("192.168.36.9"); @@ -1586,5 +1688,9 @@ void MainWindow::on_btnSend_clicked() m_ui->outputLog->append("sendLen:" + QString::number(len) + ", recv=" + recv); } }); + + thd.detach(); } + */ + diff --git a/entry/src/main/cpp/toolkit/ui/MainWindow.h b/entry/src/main/cpp/toolkit/ui/MainWindow.h index cdb8a815..2f91936e 100644 --- a/entry/src/main/cpp/toolkit/ui/MainWindow.h +++ b/entry/src/main/cpp/toolkit/ui/MainWindow.h @@ -61,7 +61,10 @@ private: virtual void quitEvent(QEvent* event); - virtual void playerAudio(std::string markcatalog); + virtual void playSoundVoice(const std::string& code); + virtual void playSoundMark(const std::string& markcatalog); + virtual void playSoundItem(int itemNo, ExamEventType enter); + virtual std::string playSoundCode(ExamEventType e, const std::string& enter, const std::string& finish, const std::string& cancel); protected: virtual void closeEvent(QCloseEvent* event) override; @@ -112,12 +115,14 @@ private slots: void on_initMark_highlighted(int index); void on_initSysset_highlighted(int index); void on_initModel_highlighted(int index); + void on_trackFiles_highlighted(int index); void on_btnArtiMark_clicked(); void on_btnArtiItem_clicked(); void on_artiItems_currentIndexChanged(int index); //void on_btnSend_clicked(); + private: Ui::MainWindow* m_ui = nullptr; QThread* m_thread = nullptr; @@ -143,7 +148,6 @@ private: QMediaPlayer m_audio; QMediaPlaylist m_audioList; - QAudioOutput m_audioOut; }; #endif // MAINWINDOW_H diff --git a/entry/src/main/cpp/toolkit/ui/MainWindow.ui b/entry/src/main/cpp/toolkit/ui/MainWindow.ui index 992d01d5..a18e3ef5 100644 --- a/entry/src/main/cpp/toolkit/ui/MainWindow.ui +++ b/entry/src/main/cpp/toolkit/ui/MainWindow.ui @@ -109,8 +109,8 @@ background-color: rgb(255, 255, 255); <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -665,19 +665,6 @@ p, li { white-space: pre-wrap; } 回放 - - - - 1243 - 533 - 34 - 25 - - - - 帧/秒 - - @@ -738,8 +725,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -763,8 +750,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -788,8 +775,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -813,8 +800,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -838,8 +825,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -863,8 +850,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -888,8 +875,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -913,8 +900,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -938,8 +925,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -963,8 +950,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -988,8 +975,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1013,8 +1000,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1038,8 +1025,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1063,8 +1050,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1088,8 +1075,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1113,8 +1100,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1138,8 +1125,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1163,8 +1150,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1188,8 +1175,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1241,8 +1228,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1266,8 +1253,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1291,8 +1278,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1316,8 +1303,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -1369,8 +1356,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';"><br /></p></body></html> @@ -1579,7 +1566,7 @@ p, li { white-space: pre-wrap; } - 宽/高 + 宽*高 @@ -2156,8 +2143,8 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'SimSun';"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -2862,7 +2849,7 @@ p, li { white-space: pre-wrap; } 0 0 1580 - 20 + 23 diff --git a/entry/src/main/cpp/toolkit/widgets/ShowDetail.h b/entry/src/main/cpp/toolkit/widgets/ShowDetail.h index f894cb83..df49d07c 100644 --- a/entry/src/main/cpp/toolkit/widgets/ShowDetail.h +++ b/entry/src/main/cpp/toolkit/widgets/ShowDetail.h @@ -3,7 +3,7 @@ #include "HToolkit.h" -class ShowDetail : private QTextEdit +class ShowDetail : public QTextEdit { public: explicit ShowDetail(); -- 2.43.0.windows.1 From d8eccae6ea92f635346dc5b9d26a39b9e8ca9b87 Mon Sep 17 00:00:00 2001 From: lvyuankang <1344032923@qq.com> Date: Tue, 2 Jul 2024 13:19:39 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9A=AB=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-profile.json5 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build-profile.json5 b/build-profile.json5 index 0d86e37b..d00726aa 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -3,11 +3,12 @@ "signingConfigs": [ { "name": "default", + "type": "HarmonyOS", "material": { "certpath": "C:\\Users\\lvyuankang\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.cer", - "storePassword": "00000019D92C7CDCC6FC0B360DC78BB6597770355E0E9BA7057FB08232B3169B719F8B43FE52F5A6D5", + "storePassword": "000000196C396C316487A43A98EF15626CB3607497CF9DE834B8522AFF4BCC81FBE0F8588BA161CED8", "keyAlias": "debugKey", - "keyPassword": "000000195EB18D1B848934488E0ED4C0FB63DBF4560DAF395E4960ABBC91B27DF741AD5E9EC9808856", + "keyPassword": "00000019E303B1483B2AF630EB5C3AA1BD1A670C1C8F31F84C3DA43C32F816CC733FEFC11B843E23E6", "profile": "C:\\Users\\lvyuankang\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.p7b", "signAlg": "SHA256withECDSA", "storeFile": "C:\\Users\\lvyuankang\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.p12" -- 2.43.0.windows.1 From 22acd782b9ea77c0c1e33acb11158f0cd6d7af81 Mon Sep 17 00:00:00 2001 From: lvyuankang <1344032923@qq.com> Date: Wed, 3 Jul 2024 16:21:56 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A1=A8=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/common/service/initable.ts | 7 +- entry/src/main/ets/common/utils/GlobalTcp.ts | 113 ++++++------------ entry/src/main/ets/common/utils/UdpClient.ts | 14 +-- .../ets/common/utils/UdpClientByCenter.ts | 10 ++ entry/src/main/ets/common/utils/request.ts | 6 +- entry/src/main/ets/pages/Index.ets | 20 ++-- 6 files changed, 73 insertions(+), 97 deletions(-) diff --git a/entry/src/main/ets/common/service/initable.ts b/entry/src/main/ets/common/service/initable.ts index 937f8925..76815dc8 100644 --- a/entry/src/main/ets/common/service/initable.ts +++ b/entry/src/main/ets/common/service/initable.ts @@ -62,6 +62,8 @@ const centerToMap={ 'SystemParm':MA_SYSTEMPARM, 'mapCollectList':MA_MAP_COLLECT, 'mapCollectshapeList':MA_MAP_COLLECT_SHAPE, + 'Map_Collect': MA_MAP_COLLECT, + 'Map_Collect_Shape': MA_MAP_COLLECT_SHAPE, 'Map_ItemClass':MA_MAP_ITEMCLASS, 'Map_Point':MA_MAP_POINT, 'Map_Point_Item':MA_MAP_POINT_ITEM, @@ -400,8 +402,8 @@ function setSyncCenterSqlData(key,res,param){ 'ItemInfo':'MA_ITEMINFO', 'MarkRule':'MA_MARKRULE', 'SystemParm':'MA_SYSTEMPARM', - 'MA_MAP_COLLECT':'MA_MAP_COLLECT', - 'MA_MAP_COLLECT_SHAPE':'MA_MAP_COLLECT_SHAPE', + 'Map_Collect': 'MA_MAP_COLLECT', + 'Map_Collect_Shape': 'MA_MAP_COLLECT_SHAPE', 'Map_ItemClass':'MA_MAP_ITEMCLASS', 'Map_Point':'MA_MAP_POINT', 'Map_Point_Item':'MA_MAP_POINT_ITEM', @@ -418,7 +420,6 @@ function setSyncCenterSqlData(key,res,param){ } // const accountTable = new AccountTable(() => { // }, centerToMap[key],param.context); - console.log('kkkkkkkkk',key) let arrList if(res.initializationRsp.body[key].record instanceof Array){ arrList =res.initializationRsp.body[key].record diff --git a/entry/src/main/ets/common/utils/GlobalTcp.ts b/entry/src/main/ets/common/utils/GlobalTcp.ts index e8239e87..fb7800fa 100644 --- a/entry/src/main/ets/common/utils/GlobalTcp.ts +++ b/entry/src/main/ets/common/utils/GlobalTcp.ts @@ -1,105 +1,60 @@ import TcpClient from './TcpClient'; -import { getSyncData } from '../service/initable' +import { getSyncData} from '../service/initable' import hilog from '@ohos.hilog'; +export async function getTCP() { -export async function getTCP(flag?) { - - getSyncData('IpConfigTable').then(async (result: Array) => { - console.log('result222', JSON.stringify(result)) - if (result.length) { - if (globalThis.TcpClient && globalThis.TcpClient.closeTcp) { - globalThis.TcpClient.closeTcp(async () => { - if(!flag){ - return - } - setTimeout(async () => { - await globalThis.TcpClient.rebindTcp(result[0].tcplocalIp, result[0].tcplocalIpPort, result[0].tcpOppositeIp, result[0].tcpOppositePort) + getSyncData('IpConfigTable').then(async (result:Array)=>{ + console.log('result222',JSON.stringify(result)) + if(result.length){ + if(globalThis.TcpClient&&globalThis.TcpClient.closeTcp){ + globalThis.TcpClient.closeTcp(async ()=>{ + // const tcpClient: TcpClient =new TcpClient(result[0].tcplocalIp, result[0].tcplocalIpPort,result[0].tcpOppositeIp,result[0].tcpOppositePort) + // globalThis.TcpClient = tcpClient + setTimeout(async ()=>{ + await globalThis.TcpClient.rebindTcp(result[0].tcplocalIp, result[0].tcplocalIpPort,result[0].tcpOppositeIp,result[0].tcpOppositePort) await globalThis.TcpClient.connectTcp() - await globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - await globalThis.TcpClient.onMessage((val) => { - hilog.info(0x0000, 'testTag', "valvalval1" + JSON.stringify(val)); - - // console.log('valvalval',val) - setTimeout(() => { - globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - if (val && globalThis.udpClient && globalThis.udpClient.sendMsg) { + await globalThis.TcpClient.sendMsg('1002')//1002 + globalThis.TcpClient.onError() + await globalThis.TcpClient.onMessage((val)=>{ + setTimeout(()=>{ + globalThis.TcpClient.sendMsg('1002')//1002 + if(val&&!globalThis.closeUDPSocket){ // const msg=val.substring(5,val.length-1) + console.log('socketTag[PLC.UdpClient]closeUDPSocket',globalThis.closeUDPSocket) globalThis.udpClient?.sendMsg(val) } - }, 1000) + },1000) }) - globalThis.TcpClient.onError(async () => { - await globalThis.TcpClient.rebindTcp(result[0].tcplocalIp, result[0].tcplocalIpPort, result[0].tcpOppositeIp, result[0].tcpOppositePort) - await globalThis.TcpClient.connectTcp() - await globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - await globalThis.TcpClient.onMessage((val) => { - hilog.info(0x0000, 'testTag', "valvalval1" + JSON.stringify(val)); - - // console.log('valvalval',val) - setTimeout(() => { - globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - if (val && globalThis.udpClient && globalThis.udpClient.sendMsg) { - // const msg=val.substring(5,val.length-1) - globalThis.udpClient?.sendMsg(val) - } - }, 1000) - - }) - }) - },1000) + },2000) }) - } - else { - // prompt.showToast({ - // message:'初始化localIp'+ result[0].localIp+ result[0].localIpPort+'oppositeIp'+result[0].oppositeIp+result[0].oppositeIpPort, - // duration: 1000 - // }); - const tcpClient: TcpClient = new TcpClient(result[0].tcplocalIp, result[0].tcplocalIpPort, result[0].tcpOppositeIp, result[0].tcpOppositePort) + }else{ + const tcpClient: TcpClient =new TcpClient(result[0].tcplocalIp, result[0].tcplocalIpPort,result[0].tcpOppositeIp,result[0].tcpOppositePort) globalThis.TcpClient = tcpClient await globalThis.TcpClient.bindTcp() await globalThis.TcpClient.connectTcp() - await globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - - await globalThis.TcpClient.onMessage((val) => { + await globalThis.TcpClient.sendMsg('1002')//1002 + globalThis.TcpClient.onError() + await globalThis.TcpClient.onMessage((val)=>{ hilog.info(0x0000, 'testTag', "valvalval2" + JSON.stringify(val)); - setTimeout(() => { - globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - if (val && globalThis.udpClient && globalThis.udpClient.sendMsg) { + setTimeout(()=>{ + globalThis.TcpClient.sendMsg('1002')//1002 + if(val&&!globalThis.closeUDPSocket){ // const msg=val.substring(5,val.length-1) + console.log('socketTag[PLC.UdpClient]closeUDPSocket',globalThis.closeUDPSocket) + globalThis.udpClient?.sendMsg(val) } - }, 1000) + },1000) }) - globalThis.TcpClient.onError(async () => { - const tcpClient: TcpClient = new TcpClient(result[0].tcplocalIp, result[0].tcplocalIpPort, result[0].tcpOppositeIp, result[0].tcpOppositePort) - globalThis.TcpClient = tcpClient - await globalThis.TcpClient.bindTcp() - await globalThis.TcpClient.connectTcp() - await globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - - await globalThis.TcpClient.onMessage((val) => { - hilog.info(0x0000, 'testTag', "valvalval2" + JSON.stringify(val)); - setTimeout(() => { - globalThis.TcpClient.sendMsg(globalThis.carInfo?.carNo || '402') //1002 - if (val && globalThis.udpClient && globalThis.udpClient.sendMsg) { - // const msg=val.substring(5,val.length-1) - globalThis.udpClient?.sendMsg(val) - } - }, 1000) - - }) - }) - } // globalThis.udpClient = new UdpClient(result[0].localIp, result[0].localIpPort,result[0].oppositeIp,result[0].oppositeIpPort) - } else { - globalThis.TcpClient = {} - globalThis.TcpClient.onMessage = () => { - } + }else{ + globalThis.TcpClient={} + globalThis.TcpClient.onMessage=()=>{} } }) } diff --git a/entry/src/main/ets/common/utils/UdpClient.ts b/entry/src/main/ets/common/utils/UdpClient.ts index d0b4257b..43cc829b 100644 --- a/entry/src/main/ets/common/utils/UdpClient.ts +++ b/entry/src/main/ets/common/utils/UdpClient.ts @@ -170,12 +170,12 @@ export default class UdpClient { if (globalThis.plcUdpError) { num++ console.log(TAG,'plc udp信号丢失') - // if(num==2){ - // await this.bindUdp() - // await this.sendMsg('111') - // await this.onMessage(callback) - // num=0 - // } + if(num==3){ + await this.bindUdp() + await this.sendMsg('111') + await this.onMessage(callback) + num=0 + } prompt.showToast({ message: 'plc udp信号丢失', duration: 2000 @@ -187,7 +187,7 @@ export default class UdpClient { } closeUdp(callback) { - + globalThis.closeUDPSocket=true this.udp.close(err => { hilog.info(0x0000,TAG, 'udpCLient', 'close'); diff --git a/entry/src/main/ets/common/utils/UdpClientByCenter.ts b/entry/src/main/ets/common/utils/UdpClientByCenter.ts index 27074376..c1f062db 100644 --- a/entry/src/main/ets/common/utils/UdpClientByCenter.ts +++ b/entry/src/main/ets/common/utils/UdpClientByCenter.ts @@ -151,6 +151,15 @@ export default class UdpClientByCenter { console.log(`${TAG} udpLine send fail:${JSON.stringify(err)}`); }); } + onError(callback?){ + this.udp.on('error',async err => { + callback&&callback() + // callback&&callback() + // this.closeUdp(()=>{ + // this.bindUdp() + // }) + }); + } setMsgCallBack(callback){ this.stashFn=callback?callback:()=>{} } @@ -205,6 +214,7 @@ export default class UdpClientByCenter { } closeUdp(callback) { + globalThis.closeHeartSocket=true this.udp.close(err=>{ if(err){ diff --git a/entry/src/main/ets/common/utils/request.ts b/entry/src/main/ets/common/utils/request.ts index 042454d9..bb95ff22 100644 --- a/entry/src/main/ets/common/utils/request.ts +++ b/entry/src/main/ets/common/utils/request.ts @@ -86,7 +86,11 @@ export default async function request(req: any) { }); } } catch (e) { - const code = e.code; + if(!e||!(e?.message)){ + return false + } + const code = e?.code; + prompt.showToast({ message: e?.message, duration: 5000 diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 6d05819f..c755bbdd 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -14,6 +14,7 @@ import { getTCP } from '../common/utils/GlobalTcp'; import { getliushuiNum, setliushuiNum } from '../common/service/indexService'; import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; import worker, { MessageEvents } from '@ohos.worker'; +import promptAction from '@ohos.promptAction' @Entry @Component @@ -28,7 +29,7 @@ struct Index { @State ratio: number = 1700 / 960 @State loading: boolean = true @State fd: number = -1; - @State param: VideoConfig = VideoConfigData + @State num: number = 0; fileHelper = null; private fileUtil: FileUtil private interval = null; @@ -67,7 +68,7 @@ struct Index { ], }) .then(data => { - if(data.index==0){ + if (data.index == 0) { router.back() } }) @@ -93,7 +94,7 @@ struct Index { this.angle = 360 }, 1000) this.angle = 0 - if(!globalThis.timeInfo){ + if (!globalThis.timeInfo) { promptAction.showToast({ message: `网络连接失败`, duration: 3000 @@ -235,7 +236,7 @@ struct Index { url: 'pages/ExaminerLogin', }, router.RouterMode.Single) } - this.loading=false + this.loading = false } } @@ -257,7 +258,7 @@ struct Index { placeId: globalThis.carInfo.examinationRoomId } // globalThis.udpClient2.initHeartSendMsg(param,this.context) - if(!globalThis.closeHeartSocket){ + if (!globalThis.closeHeartSocket) { globalThis.udpClient2.sendMsg(param, this.context) } } @@ -268,11 +269,15 @@ struct Index { this.userAuth(); getUDP() getUDP2() + this.num=0 clearInterval(this.interval) this.interval = setInterval(() => { + this.num++ setliushuiNum(this.context) getliushuiNum(this.context) - this.heartMsg() + if(this.num>=3){ + this.heartMsg() + } }, 1000) // takePhotoFn(this.context) @@ -295,8 +300,9 @@ struct Index { this.fileHelper.createAlbum('pz'); } + userAuth() { - const permissions: Array = ["ohos.permission.SET_TIME","ohos.permission.READ_IMAGEVIDEO", "ohos.permission.DISTRIBUTED_DATASYNC" ,'ohos.permission.CONNECTIVITY_INTERNAL','ohos.permission.CAMERA','ohos.permission.READ_MEDIA','ohos.permission.WRITE_MEDIA','ohos.permission.FILE_ACCESS_MANAGER']; + const permissions: Array = ["ohos.permission.SET_TIME", "ohos.permission.READ_IMAGEVIDEO", "ohos.permission.DISTRIBUTED_DATASYNC", 'ohos.permission.CONNECTIVITY_INTERNAL', 'ohos.permission.CAMERA', 'ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA', 'ohos.permission.FILE_ACCESS_MANAGER']; let context = this.context; let atManager = abilityAccessCtrl.createAtManager(); // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗 -- 2.43.0.windows.1