diff --git a/entry/src/main/cpp/BUILD.gn b/entry/src/main/cpp/BUILD.gn index 5e30cdf1..0c6ada09 100644 --- a/entry/src/main/cpp/BUILD.gn +++ b/entry/src/main/cpp/BUILD.gn @@ -1,4 +1,4 @@ -# FFmpeg build +# judge library build import("//build/ohos.gni") @@ -14,24 +14,21 @@ ohos_source_set("judge_dynamic") { "sdk/api/js/JSTypedef.cpp", "sdk/api/platform/JudgeApiFactory.cpp", "sdk/api/platform/JudgeSdk.cpp", - "sdk/common/CleverHelper.cpp", + "sdk/common/CostTimeHelper.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/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/ExamCarSub2.cpp", - "sdk/exam/ExamCarSub3.cpp", + "sdk/database/sysset/XSysSet.cpp", + "sdk/exam/ExamCar.cpp", "sdk/exam/ExamDatagram.cpp", "sdk/exam/ExamHistory.cpp", "sdk/exam/ExamSensor.cpp", @@ -42,55 +39,29 @@ ohos_source_set("judge_dynamic") { "sdk/graphic/IGraphicAbstract.cpp", "sdk/judge/IJudgeBrokerInterface.cpp", "sdk/judge/IJudgeItem.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/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/parser/XIParser.cpp", "sdk/parser/XParser.cpp", "sdk/parser/XParser2.cpp", "sdk/survey/ISurveyCar.cpp", "sdk/survey/ISurveyItem.cpp", - "sdk/survey/ISurveySubject.cpp", + "sdk/survey/SurveyFactory.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", @@ -108,7 +79,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", @@ -121,8 +92,6 @@ 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", @@ -164,30 +133,24 @@ 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/bin/extract_h_cpp_files.txt b/entry/src/main/cpp/bin/extract_h_cpp_files.txt index 9c3c0abc..a1a4940c 100644 --- a/entry/src/main/cpp/bin/extract_h_cpp_files.txt +++ b/entry/src/main/cpp/bin/extract_h_cpp_files.txt @@ -8,24 +8,23 @@ "sdk/api/js/JSTypedef.cpp", "sdk/api/platform/JudgeApiFactory.cpp", "sdk/api/platform/JudgeSdk.cpp", - "sdk/common/CleverHelper.cpp", + "sdk/common/CostTimeHelper.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/IDatabaseTable.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/ExamCarSub2.cpp", - "sdk/exam/ExamCarSub3.cpp", + "sdk/exam/ExamCar.cpp", "sdk/exam/ExamDatagram.cpp", "sdk/exam/ExamHistory.cpp", "sdk/exam/ExamSensor.cpp", @@ -36,36 +35,15 @@ "sdk/graphic/IGraphicAbstract.cpp", "sdk/judge/IJudgeBrokerInterface.cpp", "sdk/judge/IJudgeItem.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/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/parser/XIParser.cpp", "sdk/parser/XParser.cpp", "sdk/parser/XParser2.cpp", @@ -115,7 +93,6 @@ "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/bin/test_data/test-real-exam.json b/entry/src/main/cpp/bin/test_data/test-real-exam.json index f3e162da..bf7d8fe8 100644 --- a/entry/src/main/cpp/bin/test_data/test-real-exam.json +++ b/entry/src/main/cpp/bin/test_data/test-real-exam.json @@ -35,6 +35,7 @@ "yl": 0, "yy": 0, "rmndg": 0, + "wavend": 1, "mndg": "2,1,3;4,1,2;3,4,2;2,2,1;3,1,1;", "sde": 0, "xhd":"" diff --git a/entry/src/main/cpp/sdk/api/include/JudgeSdk.h b/entry/src/main/cpp/sdk/api/include/JudgeSdk.h index 99ee118e..aec1fd2d 100644 --- a/entry/src/main/cpp/sdk/api/include/JudgeSdk.h +++ b/entry/src/main/cpp/sdk/api/include/JudgeSdk.h @@ -65,7 +65,7 @@ typedef int (JUDGE_SDK_METHOD *examJudgeEndExamHandle) (); typedef int (JUDGE_SDK_METHOD *examJudgeRealExamHandle) (const char* data, int len); typedef int (JUDGE_SDK_METHOD *examJudgeSetRealExamCallbackHandle) (examJudgeCallbackRealExam callback); typedef int (JUDGE_SDK_METHOD *examJudgeSetPerformCallbackHandle) (examJudgeCallbackPerform callback); -typedef int (JUDGE_SDK_METHOD *examJudgeArtificialMarkHandle) (int itemno, const char* serial); +typedef int (JUDGE_SDK_METHOD *examJudgeArtificialMarkHandle) (int itemno, const char* serial, int type); 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) (); @@ -156,10 +156,10 @@ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeSetPerformCallback(examJudgeCallback /* * 说明: 人工扣分 - * 参数: itemno:项目代码,serial:扣分代码 + * 参数: itemno:项目代码,serial:扣分代码 serial:人工扣分类型,1是本地人工扣分,2是远程人工扣分 * 返回值:调用执行结果错误码 0:成功,其他:失败 */ -JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialMark(int itemno, const char* serial); +JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialMark(int itemno, const char* serial, int type); /* * 说明: 人工项目 diff --git a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp index bd51c6f9..6553dd18 100644 --- a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp +++ b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.cpp @@ -130,13 +130,13 @@ jint JNI_JUDGE_FUN_IMPL(examJudgeSetPerformCallback)(JNIEnv* env, jobject thiz) return (jint)QE(code); } -jint JNI_JUDGE_FUN_IMPL(examJudgeArtificialMark)(JNIEnv* env, jobject thiz, jint itemno, jstring serial) +jint JNI_JUDGE_FUN_IMPL(examJudgeArtificialMark)(JNIEnv* env, jobject thiz, jint itemno, jstring serial, jint type) { logdebug("call JNI_examJudgeArtificialMark"); const char* markSerial = env->GetStringUTFChars(serial, NULL); //jsize size = env->GetStringUTFLength(data); //TASSERT(buf != nullptr && size == len, ""); - int code = ExamService::examJudgeArtificialMark(itemno, markSerial); + int code = ExamService::examJudgeArtificialMark(itemno, markSerial, type); env->ReleaseStringUTFChars(serial, markSerial); return (jint)QE((ErrorCode)code); } diff --git a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.h b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.h index 3cba66b3..8c9e9d3c 100644 --- a/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.h +++ b/entry/src/main/cpp/sdk/api/jni/JNIApiBridge.h @@ -32,7 +32,7 @@ public: jint JNI_JUDGE_FUN_DECL(examJudgeRealExam) (JNIEnv* env, jobject thiz, jstring data, jint len); jint JNI_JUDGE_FUN_DECL(examJudgeSetRealExamCallback) (JNIEnv* env, jobject thiz); jint JNI_JUDGE_FUN_DECL(examJudgeSetPerformCallback) (JNIEnv* env, jobject thiz); - jint JNI_JUDGE_FUN_DECL(examJudgeArtificialMark) (JNIEnv* env, jobject thiz, jint itemno, jstring serial); + jint JNI_JUDGE_FUN_DECL(examJudgeArtificialMark) (JNIEnv* env, jobject thiz, jint itemno, jstring seria, jint type); jstring JNI_JUDGE_FUN_DECL(examJudgeTrackFile) (JNIEnv* env, jobject thiz); jint JNI_JUDGE_FUN_DECL(examJudgeMapSetParam) (JNIEnv* env, jobject thiz, jint width, jint height); jint JNI_JUDGE_FUN_DECL(examJudgeMapSetScaling) (JNIEnv* env, jobject thiz, jint scaling); diff --git a/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp b/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp index 2f865290..2f263ebc 100644 --- a/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp +++ b/entry/src/main/cpp/sdk/api/jni/JNIMethodTable.cpp @@ -16,7 +16,7 @@ JNIMethodTable::JNIMethodTable() jniSign(JNI_RET(jint), JNI_FUN(examJudgeRealExam), JNI_ARG(jstring), JNI_ARG(jint)); // "(Ljava/lang/String;I)I" jniSign(JNI_RET(jint), JNI_FUN(examJudgeSetRealExamCallback)); // "()I" 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(examJudgeArtificialMark), JNI_ARG(jint), JNI_ARG(jstring), JNI_ARG(jint)); // "(ILjava/lang/String;I)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;" diff --git a/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp b/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp index ac49cbfe..29a34977 100644 --- a/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp +++ b/entry/src/main/cpp/sdk/api/js/JSApiBridge.cpp @@ -256,7 +256,7 @@ JS_JUDGE_FUN_IMPL(examJudgeSetPerformCallback) JS_JUDGE_FUN_IMPL(examJudgeArtificialMark) { logdebug("call js_examJudgeArtificialMark"); - size_t argc = 2; napi_value args[2] = {nullptr}; + size_t argc = 3; napi_value args[3] = {nullptr}; if(!getArg(env, cbinfo, argc, args)) { @@ -265,12 +265,13 @@ JS_JUDGE_FUN_IMPL(examJudgeArtificialMark) int itemno = 0; std::string serial = ""; - if(!getInt(env, args[0], itemno) || !getString(env, args[1], serial/*, 2*KB*/)) + int type = 0; + if(!getInt(env, args[0], itemno) || !getString(env, args[1], serial/*, 2*KB*/) || !getInt(env, args[2], type)) { return createErrorCode(env, errorNapiArgType); } - int code = ExamService::examJudgeArtificialMark(itemno, serial.c_str()); + int code = ExamService::examJudgeArtificialMark(itemno, serial.c_str(), type); return createErrorCode(env, code); } diff --git a/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp b/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp index 8f230601..7790de3c 100644 --- a/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp +++ b/entry/src/main/cpp/sdk/api/platform/JudgeSdk.cpp @@ -107,7 +107,7 @@ JNI_JUDGE_API_JOIN(jint, examJudgeEndExam, (JNIEnv* env, jobje JNI_JUDGE_API_JOIN(jint, examJudgeRealExam, (JNIEnv* env, jobject thiz, jstring data, jint len), (env,thiz,data,len)); JNI_JUDGE_API_JOIN(jint, examJudgeSetRealExamCallback, (JNIEnv* env, jobject thiz), (env,thiz)); 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, examJudgeArtificialMark, (JNIEnv* env, jobject thiz, jint itemno, jstring serial, jint type), (env,thiz,itemno,serial,type)); 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)); @@ -282,9 +282,9 @@ JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeSetPerformCallback(examJudgeCallback return FactoryExamApi->examJudgeSetPerformCallback(callback); } -JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialMark(int itemno, const char* serial) +JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialMark(int itemno, const char* serial, int type) { - return FactoryExamApi->examJudgeArtificialMark(itemno, serial); + return FactoryExamApi->examJudgeArtificialMark(itemno, serial, type); } JUDGE_SDK_API int JUDGE_SDK_METHOD examJudgeArtificialItem(int itemno, int type) diff --git a/entry/src/main/cpp/sdk/common/TThread.h b/entry/src/main/cpp/sdk/common/TThread.h index 9a5c756a..f67ea205 100644 --- a/entry/src/main/cpp/sdk/common/TThread.h +++ b/entry/src/main/cpp/sdk/common/TThread.h @@ -63,7 +63,7 @@ public: while (m_run) { T value; - while(m_que->blockPull(value, 1000)) + while(m_que->blockPull(value, 20)) { m_func(value); } diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp index 3a917283..7edc1b28 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp @@ -106,7 +106,7 @@ ErrorCode ExamCarSub2::examGoonExam() //已经不合格了 如果是考试模式,只要分数不合格就立即结束考试 if( (isExamMode() && !isQualified()) || allItemFinish() ) { - createEventExamFinish(); + //createEventExamFinish(ExamFinishAuto); //杨 20240724 都由苏那边控制 return QE(errorBeginNotQual); //已经不合格了 } @@ -135,9 +135,9 @@ ErrorCode ExamCarSub2::examJudgeExam() return QE(codeSuccess); } -ErrorCode ExamCarSub2::examArtifMark(ExamItemCode itemno, const std::string& serial) +ErrorCode ExamCarSub2::examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) { - sub2MarkItem(itemno, serial, false, true, true); + examMarkItem(itemno, serial, false, true, true, type); return QE(codeSuccess); } @@ -160,16 +160,16 @@ bool ExamCarSub2::examDrawMap() return drawImageMap(); } -bool ExamCarSub2::sub2MarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force, bool event) +bool ExamCarSub2::examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force, bool event, MarkType type) { if(m_examState != examStateIng) { - logwarning("mark-warning itemNo=%d, serial=%s", itemNo, serial.c_str()); + logwarning("mark-warning itemNo=%d, serial=%s,type=%d", itemNo, serial.c_str(), type); return false; } if(!TableMark->has(itemNo, serial)) { - logerror("mark-error itemNo=%d, serial=%s", itemNo, serial.c_str()); + logerror("mark-error itemNo=%d, serial=%s,type=%d", itemNo, serial.c_str(), type); return false; } @@ -202,16 +202,16 @@ bool ExamCarSub2::sub2MarkItem(ExamItemCode itemNo, const std::string& serial, b const TMarkRule* rule = TableMark->find(itemNo, serial); //找到扣分的对象 if(nullptr == rule) { - logerror("not find mark-rule item=%d, serial=%s", itemNo, serial.c_str()); + logerror("not find mark-rule item=%d, serial=%s, type=%d", itemNo, serial.c_str(), type); 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()); + loginfo("why mark-rule type=%d, item=%d, serial=%s, markreal=%d, real is 0 ? %s ", + type, itemNo, serial.c_str(), rule->markreal, rule->markshow.c_str()); } - + const TGpsInfo& gps = historyGps(); int grade = rule->markreal; @@ -232,7 +232,7 @@ bool ExamCarSub2::sub2MarkItem(ExamItemCode itemNo, const std::string& serial, b if(itemNo != Sub2ItemType20Comm) { IExamItem* item = findExamItem(itemNo); - TASSERT(item != nullptr, "itemNo=%d, serial=%s", itemNo, serial.c_str()); + TASSERT(item != nullptr, "itemNo=%d, serial=%s, type=%d", itemNo, serial.c_str(), type); if(item != nullptr) { //扣分扣到不合格当前项目要结束掉 @@ -244,9 +244,9 @@ bool ExamCarSub2::sub2MarkItem(ExamItemCode itemNo, const std::string& serial, b if(event) { //插入监管扣分事件(C++评判不负责这块了,这里忽略,只是做个提醒) - createEventMarkItem({itemNo, serial, rule->markcatalog}); - logtrace("mark-item %s itemno=%d,markserial=%s,markreal=%d", - target().c_str(), rule->itemno, rule->markserial.c_str(), rule->markreal); + createEventMarkItem({itemNo, serial, rule->markcatalog, type}); + logtrace("mark-item %s type=%d itemno=%d,markserial=%s,markreal=%d", + target().c_str(), type, rule->itemno, rule->markserial.c_str(), rule->markreal); } return true; @@ -355,7 +355,7 @@ void ExamCarSub2::dealJudgeExam() #ifndef JUDGE_USE_INSPECT if( (isExamMode() && !isQualified()) || allItemFinish() ) { - createEventExamFinish(); + //createEventExamFinish(ExamFinishAuto); //杨 20240724 都由苏那边控制 } #endif } @@ -400,7 +400,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem() if(!subIdx.empty() && subIdx != itemEnter->subIdx()) { //createEventFinishItem(itemEnter); //发送项目结束指令 - sub2MarkItem(Sub2ItemType20Comm, MARK_SUB2_COMM_41, true, false, true); //扣分:不按规定考试 + examMarkItem(Sub2ItemType20Comm, MARK_SUB2_COMM_41, true, false, true, MarkTypeAuto); //扣分:不按规定考试 return nullptr; } return itemEnter; diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub2.h b/entry/src/main/cpp/sdk/exam/ExamCarSub2.h index 36bc81b8..e184d490 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub2.h +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub2.h @@ -26,10 +26,12 @@ public: //for IExamCar override virtual ErrorCode examGoonExam() override; virtual ErrorCode examEndExam() override; virtual ErrorCode examJudgeExam() override; - virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) override; + virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) 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; + virtual bool examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) override; + public: //for IExamCarSub2 override virtual IExamItem* findExamItem(ExamItemCode itemNo) override; @@ -37,7 +39,7 @@ public: //for IExamCarSub2 override virtual bool allItemFinish() override; virtual ISub2JudgeItem* currentItem() const noexcept override { return m_curItem; } virtual ISub2JudgeItem* commItem() const noexcept override { return m_commItem; } - virtual bool sub2MarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force=false, bool event=true) override; + protected: //执行考试评判 virtual void dealJudgeExam(); diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp index 418b2846..3a959e59 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp @@ -38,6 +38,7 @@ ErrorCode ExamCarSub3::examBeginExam() // loginfo("exam-item xmdm=%d", item.xmdm); //} + m_pub = TPubKM3(); std::string sError; if(!Init_KM3_Global(sError)) { @@ -163,9 +164,9 @@ ErrorCode ExamCarSub3::examJudgeExam() return QE(codeSuccess); } -ErrorCode ExamCarSub3::examArtifMark(ExamItemCode itemno, const std::string& serial) +ErrorCode ExamCarSub3::examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) { - judgeMark(itemno, serial, false, true, true, 1); + examMarkItem(itemno, serial, false, true, true, type); return QE(codeSuccess); } @@ -418,7 +419,7 @@ bool ExamCarSub3::Init_KM3_Global(std::string& sError) //注释改成:将之前的行驶里程减掉 if(m_stuInfo.yklc != 0) { - m_car.XSJL -= m_stuInfo.yklc; + m_car.XSJL -= m_stuInfo.yklc/100; if(m_car.XSJL <= 0) { m_car.XSJL = 0; @@ -1123,8 +1124,8 @@ bool ExamCarSub3::Init_KM3_Special() } //触发起步项目 - TKM3Item* item = findExamItem(Sub3ItemType02Qbxx); //加载起步项目 - triggerItem(item); + //TKM3Item* item = findExamItem(Sub3ItemType02Qbxx); //加载起步项目 + //triggerItem(item); //在通用评判里调用CallQiBu触发,通过判断502参数和307参数 20240726 return true; } @@ -1145,10 +1146,10 @@ void ExamCarSub3::Deal_KM3_Judge() // return; //} - TChuanGan* his1 = historyChuanGan(1); + //TChuanGan* his1 = historyChuanGan(1); + //const TGpsInfo& gps1 = his1->real.gps; const TGpsInfo& gps = m_cg->real.gps; - const TGpsInfo& gps1 = his1->real.gps; - if(gps.jd > 1 && gps.wd > 1 && gps1.jd > 1 && gps1.wd > 1) //rtkEnabled() + if(gps.jd > 1 && gps.wd > 1 && rtkEnabled()) { //1、计算考车位置 //Calc_CarPos //在ExamSensor里面计算了 @@ -1168,9 +1169,9 @@ void ExamCarSub3::Deal_KM3_Judge() Km3NewEnterItem(); - { //车道或路段变化事件 + TChuanGan* his1 = historyChuanGan(1); const TRTKResult& rtk = m_cg->RTKKM3; const TRTKResult& rtk1 = his1->RTKKM3; if(rtk.MapRoad_Code_No != rtk1.MapRoad_Code_No || @@ -1182,7 +1183,7 @@ void ExamCarSub3::Deal_KM3_Judge() } } - m_KsLjLc = m_stuInfo.yklc + m_cg->ai_ljjl; + m_pub.m_KsLjLc = m_stuInfo.yklc/100 + m_cg->ai_ljjl; m_cg->tkCnt = GetCurrentTick2(); m_cg->RTKKM3.CrossPointNo = lastCrossPtNo(); @@ -1196,20 +1197,21 @@ void ExamCarSub3::Deal_KM3_Judge() // CallRenGongEnterItem(mitemno); //} - if(m_cg->real.sensor.rmndg == SYES) - { - TKM3Item* item = findExamItem(Sub3ItemType41Mndg); - if(item && item->TestPro == ItemProFlagIdle) - { - item->Item_Color = itemStateZk; - item->TestPro = ItemProFlagInit; - item->FinishFlag = false; - //item->StartTime = GetCurrentTime2(); - //item->EndTime = 0; - //item->MsgData = ""; - //createEventEnterItem({item->ItemNo, ""}); - } - } + //240710 + //if(m_cg->real.sensor.rmndg == SYES) + //{ + // TKM3Item* item = findExamItem(Sub3ItemType41Mndg); + // if(item && item->TestPro == ItemProFlagIdle) + // { + // item->Item_Color = itemStateZk; + // item->TestPro = ItemProFlagInit; + // item->FinishFlag = false; + // //item->StartTime = GetCurrentTime2(); + // //item->EndTime = 0; + // //item->MsgData = ""; + // //createEventEnterItem({item->ItemNo, ""}); + // } + //} m_curItem = nullptr; //执行具体的专项评判 @@ -1260,31 +1262,29 @@ void ExamCarSub3::Deal_KM3_Judge() //如果考试结束(训练不存在结束的概念,都是界面上点击结束考试,一般科目三都是可以重复进项目的) if(isExamMode()) //考试模式的 { - if(allItemFinish() == true) - { - //ToDo1:告知上层当前考试结束,生成科目结束事件2 - createEventExamFinish(); - } - } + bool finish = allItemFinish(); + bool qualified = isQualified(); - if(isExamMode() && !isQualified()) //正式考试模式 - { //ToDo1:检查当前正在进行的项目状态 - for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) + if(!qualified) { - const TKM3Item* examItem = it->second->getExamItem(); - if(examItem->TestPro == ItemProFlagInit || examItem->TestPro == ItemProFlagJudge) + for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) { - KM3EndItem(examItem->ItemNo); + const TKM3Item* examItem = it->second->getExamItem(); + if(examItem->TestPro == ItemProFlagInit || examItem->TestPro == ItemProFlagJudge) + { + KM3EndItem(examItem->ItemNo); + } } } - //ToDo2:告知上层当前考试结束,生成科目结束事件2 - createEventExamFinish(); - - //ToDo3:考试状态:结束状态 - //*Test_Status = 1; ////考试中状态 0-考试中 1-考试结束,评判不继续 2-考试结束,继续评判(一般用于训练) + if(finish || !qualified) + { + //ToDo1:告知上层当前考试结束,生成科目结束事件2 + //createEventExamFinish(ExamFinishAuto); //杨 20240724 都由苏那边控制 + } } + } void ExamCarSub3::ClearRecord() @@ -2289,7 +2289,7 @@ void ExamCarSub3::RTKJudge_SubItem() RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; //RTKKM3.LS_ShapeNo = 0; - m_SNO = 0; + m_pub.m_SNO = 0; break; } } @@ -2301,7 +2301,7 @@ void ExamCarSub3::RTKJudge_SubItem() RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; //RTKKM3.LS_ShapeNo = SNO; - m_SNO = SNO; + m_pub.m_SNO = SNO; RTKKM3.CrossPoint = subItem->Point2; const Pointi& p1 = subItem->Line3.PtBegin; @@ -2311,19 +2311,19 @@ void ExamCarSub3::RTKJudge_SubItem() RTKKM3.CrossShapeLength = std::round(std::sqrt(x*x + y*y)); break; } - if(m_SNO == SNO) //RTKKM3.LS_ShapeNo == SNO + if(m_pub.m_SNO == SNO) //RTKKM3.LS_ShapeNo == SNO { if(GpsMath::IsCross(line, subItem->Line3)) { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr2; //中心点右侧 RTKKM3.ShapeNo = SNO; //RTKKM3.LS_ShapeNo = 0; - m_SNO = 0; + m_pub.m_SNO = 0; } else if(GpsMath::IsCross(line, subItem->Line2)) { //RTKKM3.LS_ShapeNo = 0; - m_SNO = 0; + m_pub.m_SNO = 0; } const Pointi& p1 = RTKKM3.CrossPoint; const Pointi& p2 = m_cg->body.b1_b; //CarStatus.BasePoint1_RealTime; @@ -2332,7 +2332,7 @@ void ExamCarSub3::RTKJudge_SubItem() if(dis > RTKKM3.CrossShapeLength * 3) //3--6 20170924 { //RTKKM3.LS_ShapeNo = 0; - m_SNO = 0; + m_pub.m_SNO = 0; } } } @@ -3116,10 +3116,25 @@ void ExamCarSub3::Km3NewEnterItem() TChuanGan* his1 = historyChuanGan(1); if(cg->move != moveForward || his1->move != moveForward) return; //2、速度是0也退出 - if(cg->real.gps.sd < 0.1 || his1->real.gps.sd < 0.1) return; //ai_CS_GPS + //if(cg->real.gps.sd < 0.1 || his1->real.gps.sd < 0.1) return; //ai_CS_GPS //3、非差分状态忽略 if(!rtkEnabled()) return; //非差分状态不不允许进项目 + if(!rtkEnabled(1)) + { + if(historyCount() > 10) + { + for(int i = 2; i < 10; i++) + { + TChuanGan* his = historyChuanGan(i); + if(his->real.gps.rtkEnabled) + { + his1 = his; + } + } + } + } + static constexpr double KK0 = 1000000.0; if(E_1Deg2Cm == 0) { @@ -3271,8 +3286,8 @@ void ExamCarSub3::Km3NewEnterItem() cg->MapPoint_Road_Code = Road_Code; //得到穿越的点号,在路口项目中,会被转换成路段的点。(如果右路段信息的话,当然了,路口项目肯定是在特定的路段上的) - PubLastChuanYuePtNo = crossPointNo; - PubLastChuanYuePt_JLCM = disCM; + m_pub.PubLastChuanYuePtNo = crossPointNo; + m_pub.PubLastChuanYuePt_JLCM = disCM; //如果不是项目点,忽略 //读卡进项目的 //(*2024-03-05*) @@ -3336,10 +3351,10 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo) const std::string& s319 = TableSysSet->get319(); //SysSet[319]: 1:必须达到里程,才能进入靠边停车 //SysSet[319]: 2:必须达到里程,并且完成必考项目。才能进入靠边停车 - if(s319 == "1" && m_KsLjLc < m_car.XSJL) return; + if(s319 == "1" && m_pub.m_KsLjLc < m_car.XSJL) return; if(s319 == "2") { - if(m_KsLjLc < m_car.XSJL) return; + if(m_pub.m_KsLjLc < m_car.XSJL) return; bool unfinished = false; for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) { @@ -3732,7 +3747,7 @@ bool ExamCarSub3::KM3AllPass() if(isQualified()) //当前是合格的 { int s336 = TableSysSet->asInt336(); - if(m_KsLjLc + s336 < m_car.XSJL) + if(m_pub.m_KsLjLc + s336 < m_car.XSJL) { return false; } @@ -3848,7 +3863,7 @@ void ExamCarSub3::KM3EndItem(int ItemNo) examItem->GPS_n = 0; if(examItem->ItemNo == Sub3ItemType04Bgcd || examItem->ItemNo == Sub3ItemType10Ccxx) { - PUB_JDCC_ZT = 0; //借道超车 + m_pub.PUB_JDCC_ZT = 0; //借道超车 } //已考项目变量更新 if(!isExamAlready(ItemNo)) @@ -3859,7 +3874,7 @@ void ExamCarSub3::KM3EndItem(int ItemNo) createEventFinishItem({examItem->ItemNo, "", markFlag ? 0 : 1}); } -bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneID, bool ForceID, bool event, int8 Kind) +bool ExamCarSub3::examMarkItem(int itemNo, const std::string& serial, bool once, bool force, bool event, MarkType type) { //Kind:0 自动评判 1:考车人工扣分 2:远程下发的考试扣分 bool result = false; @@ -3867,31 +3882,31 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI //满分学习如果不扣分,除了考车人工点击扣分或者远程下发的扣分,一律忽略 if(m_stuInfo.mfxx && m_stuInfo.mfxxn) { - if(Kind == 0) return result; + if(type == MarkTypeAuto) return result; } const std::string& ksdd = TableSysSet->get211(); if(Tools::tolower(ksdd) == siteof::chongqingkm3) { - if(ItemNo == Sub3ItemType11Kbtc && serial == "10") + if(itemNo == Sub3ItemType11Kbtc && serial == "10") { - OnlyOneID = true; + once = true; } - if(ForceID == false) + if(force == false) { if(std::atoi(serial.c_str()) >= 100) { } - else if(ItemNo == Sub3ItemType01Sczb || ItemNo == Sub3ItemType41Mndg) //上车准备、模拟灯光 + else if(itemNo == Sub3ItemType01Sczb || itemNo == Sub3ItemType41Mndg) //上车准备、模拟灯光 { } - else if(ItemNo == Sub3ItemType20Comm && serial == "15") + else if(itemNo == Sub3ItemType20Comm && serial == "15") { } - else if(ItemNo == Sub3ItemType20Comm && serial == "36") + else if(itemNo == Sub3ItemType20Comm && serial == "36") { } @@ -3909,22 +3924,22 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI if(IS_A1(cartype) || IS_A2(cartype) || IS_A3(cartype) || IS_C6(cartype) || IS_B1(cartype) || IS_B2(cartype)) { //路口右转弯 - if(ItemNo == Sub3ItemType16Lkyz) + if(itemNo == Sub3ItemType16Lkyz) { if(isExamAlready(Sub3ItemType16Lkyz)) return result; } //直行通过路口 - if(ItemNo == Sub3ItemType05Lkzx) + if(itemNo == Sub3ItemType05Lkzx) { if(isExamAlready(Sub3ItemType05Lkzx)) return result; } //路口左转弯 - if(ItemNo == Sub3ItemType15Lkzz) + if(itemNo == Sub3ItemType15Lkzz) { if(isExamAlready(Sub3ItemType15Lkzz)) return result; } //夜间驾驶 - if(ItemNo == Sub3ItemType13Yjxs) + if(itemNo == Sub3ItemType13Yjxs) { for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) { @@ -3943,29 +3958,29 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI if(IS_A2(cartype)) { - if( (ItemNo == Sub3ItemType02Qbxx && serial == "04") || - (ItemNo == Sub3ItemType02Qbxx && serial == "44") || - (ItemNo == Sub3ItemType20Comm && serial == "86") || - (ItemNo == Sub3ItemType20Comm && serial == "79") || - (ItemNo == Sub3ItemType20Comm && serial == "80") || - (ItemNo == Sub3ItemType20Comm && serial == "84") || - (ItemNo == Sub3ItemType20Comm && serial == "85") || - (ItemNo == Sub3ItemType20Comm && serial == "98") ) + if( (itemNo == Sub3ItemType02Qbxx && serial == "04") || + (itemNo == Sub3ItemType02Qbxx && serial == "44") || + (itemNo == Sub3ItemType20Comm && serial == "86") || + (itemNo == Sub3ItemType20Comm && serial == "79") || + (itemNo == Sub3ItemType20Comm && serial == "80") || + (itemNo == Sub3ItemType20Comm && serial == "84") || + (itemNo == Sub3ItemType20Comm && serial == "85") || + (itemNo == Sub3ItemType20Comm && serial == "98") ) { if(std::atoi(serial.c_str()) < 100) return result; } - if(ItemNo == Sub3ItemType14Jjdw) return result; + if(itemNo == Sub3ItemType14Jjdw) return result; } } if(ksdd == siteof::njdckm3) { - if( (ItemNo == Sub3ItemType20Comm && serial == "89") || - (ItemNo == Sub3ItemType04Bgcd && serial == "42") || - (ItemNo == Sub3ItemType04Bgcd && serial == "43") ) + if( (itemNo == Sub3ItemType20Comm && serial == "89") || + (itemNo == Sub3ItemType04Bgcd && serial == "42") || + (itemNo == Sub3ItemType04Bgcd && serial == "43") ) { if(m_cg->ai_ljjl < 500) return result; - if(m_KsLjLc + TableSysSet->asInt336() >= m_car.XSJL) return result; + if(m_pub.m_KsLjLc + TableSysSet->asInt336() >= m_car.XSJL) return result; } } @@ -3974,7 +3989,7 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI TKM3Item* item = findExamItem(Sub3ItemType12Dtxx); if(nullptr != item && item->TestPro > ItemProFlagIdle) { - if(ItemNo == Sub3ItemType02Qbxx) + if(itemNo == Sub3ItemType02Qbxx) { if(serial == "46" || serial == "47") return result; } @@ -3982,7 +3997,7 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI } //变更车道 - if(ItemNo == Sub3ItemType04Bgcd) + if(itemNo == Sub3ItemType04Bgcd) { TKM3Item* item = findExamItem(Sub3ItemType04Bgcd); if(item->TestPro == ItemProFlagIdle && (serial == "42" || serial == "43")) @@ -4000,8 +4015,8 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI { if( !m_car.Night_ID || serial.length() == 3 || (m_car.Night_ID && - (ItemNo == Sub3ItemType13Yjxs || - ((ItemNo == Sub3ItemType05Lkzx || ItemNo == Sub3ItemType15Lkzz || ItemNo == Sub3ItemType16Lkyz) && serial == "01"))) ) + (itemNo == Sub3ItemType13Yjxs || + ((itemNo == Sub3ItemType05Lkzx || itemNo == Sub3ItemType15Lkzz || itemNo == Sub3ItemType16Lkyz) && serial == "01"))) ) { } else @@ -4010,11 +4025,11 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI } } - if(!ForceID) + if(!force) { if(IS_C2(cartype) || IS_C5(cartype)) //自动挡不判 熄火, 起步闯动, 挂错挡,空挡滑行,溜车,抵挡高速 { - if(ItemNo == Sub3ItemType02Qbxx) + if(itemNo == Sub3ItemType02Qbxx) { //起步项目 if( (serial == "08" && ksdd != siteof::yingtan) || (serial == "44") ) @@ -4031,13 +4046,13 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI } } - if(ItemNo == Sub3ItemType14Jjdw && serial.length() < 3) //不判加减档操作 + if(itemNo == Sub3ItemType14Jjdw && serial.length() < 3) //不判加减档操作 { return result; } //通用评判扣分 - if(ItemNo == Sub3ItemType20Comm) + if(itemNo == Sub3ItemType20Comm) { const std::vector& s507 = TableSysSet->asArray507(); @@ -4062,22 +4077,22 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI bool RepeatKfID = false; for(size_t i = 0; i < m_marks.size(); i++) { - if(m_marks[i].serial == serial && m_marks[i].itemNo == ItemNo) + if(m_marks[i].serial == serial && m_marks[i].itemNo == itemNo) { RepeatKfID = true; } } - if(OnlyOneID) + if(once) { if(RepeatKfID) return result; } //执行扣分 - const TMarkRule* rule = TableMark->find(ItemNo, serial); + const TMarkRule* rule = TableMark->find(itemNo, serial); if(nullptr == rule) { - logerror("not find mark-rule item=%d, serial=%s", ItemNo, serial.c_str()); + logerror("not find mark-rule item=%d, serial=%s", itemNo, serial.c_str()); return result; } @@ -4143,15 +4158,15 @@ bool ExamCarSub3::judgeMark(int ItemNo, const std::string& serial, bool OnlyOneI if(event) { - createEventMarkItem({mark.itemNo, mark.serial, mark.catalog}); + createEventMarkItem({mark.itemNo, mark.serial, mark.catalog, type}); } result = true; } else { - loginfo("why mark-rule item=%d, serial=%s markreal=%d, real is 0 ? %s ", - ItemNo, serial.c_str(), rule->markreal, rule->markshow.c_str()); + loginfo("why mark-rule type=%d, item=%d, serial=%s, markreal=%d, real is 0 ? %s ", + type, itemNo, serial.c_str(), rule->markreal, rule->markshow.c_str()); } return result; @@ -4416,7 +4431,7 @@ bool ExamCarSub3::ManualStartItem(int ItemNo) if(ItemNo == Sub3ItemType04Bgcd || ItemNo == Sub3ItemType10Ccxx) { //ToDo:语音播报:取消变更车道 - PUB_JDCC_ZT = 0; //借道超车 + m_pub.PUB_JDCC_ZT = 0; //借道超车 } //ToDo:语音播报:取消变更车道 createEventCancelItem({ItemNo, ""}); diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h index 7409ebfa..b96a6e99 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h @@ -26,10 +26,12 @@ public: //for IExamCar override virtual ErrorCode examGoonExam() override; virtual ErrorCode examEndExam() override; virtual ErrorCode examJudgeExam() override; - virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) override; + virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) 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; + virtual bool examMarkItem(int ItemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) override; + public: //for IExamCarSub3 override virtual ISub3JudgeItem* findJudgeItem(ExamItemCode itemNo) const override; @@ -38,7 +40,6 @@ public: //for IExamCarSub3 override virtual bool allItemFinish() override; virtual ISub3JudgeItem* currentItem() const noexcept override { return m_curItem; } virtual ISub3JudgeItem* commItem() const noexcept override { return m_commItem; } - bool judgeMark(int ItemNo, const std::string& serial, bool OnlyOneID=false, bool ForceID=false, bool event=true, int8 Kind=0) override; virtual const std::map& allExamItem() const noexcept override { return m_sub3Items; } virtual bool isCrossroadExaming() const override; @@ -51,25 +52,25 @@ public: //for IExamCarSub3 override virtual TCar* getTCar() override { return &m_car; } virtual TTestCtl* getTTestCtl() override { return &m_ctl; } - virtual int lastCrossPtNo() override { return PubLastChuanYuePtNo; } - virtual void setPUB_JDCC_ZT(int v) override { PUB_JDCC_ZT = v;} - virtual int getPUB_JDCC_ZT() const override { return PUB_JDCC_ZT;} - virtual void setChaoChe_Start_TM(int64 v) override { ChaoChe_Start_TM = v;} - virtual int64 getChaoChe_Start_TM() const override { return ChaoChe_Start_TM;} - virtual void setChaoChe_End_TM(int64 v) override { ChaoChe_End_TM = v;} - virtual int64 getChaoChe_End_TM() const override { return ChaoChe_End_TM;} - virtual void setPub_JSC_JL(int v) override { Pub_JSC_JL = v;} - virtual int getPub_JSC_JL() const override { return Pub_JSC_JL; } - virtual void setNJ_DiaoTou_JL(int v) override { NJ_DiaoTou_JL = v; } - virtual int getNJ_DiaoTou_JL() const override { return NJ_DiaoTou_JL; } - virtual void setPubCanJudge_XiHuoFlag(bool v) override { PubCanJudge_XiHuoFlag = v; } - virtual bool getPubCanJudge_XiHuoFlag() const override { return PubCanJudge_XiHuoFlag; } - virtual void setPubKaoBianTCFinish_LJJL(int v) override { PubKaoBianTCFinish_LJJL = v; } - virtual int getPubKaoBianTCFinish_LJJL() const override { return PubKaoBianTCFinish_LJJL; } - virtual void setKsLjLc(int v) override { m_KsLjLc = v; } - virtual int getKsLjLc() const override { return m_KsLjLc; } - virtual void setyjdg_road_code_kf(bool v) override { yjdg_road_code_kf = v; } - virtual bool getyjdg_road_code_kf() const override { return yjdg_road_code_kf; } + virtual int lastCrossPtNo() override { return m_pub.PubLastChuanYuePtNo; } + virtual void setPUB_JDCC_ZT(int v) override { m_pub.PUB_JDCC_ZT = v;} + virtual int getPUB_JDCC_ZT() const override { return m_pub.PUB_JDCC_ZT;} + virtual void setChaoChe_Start_TM(int64 v) override { m_pub.ChaoChe_Start_TM = v;} + virtual int64 getChaoChe_Start_TM() const override { return m_pub.ChaoChe_Start_TM;} + virtual void setChaoChe_End_TM(int64 v) override { m_pub.ChaoChe_End_TM = v;} + virtual int64 getChaoChe_End_TM() const override { return m_pub.ChaoChe_End_TM;} + virtual void setPub_JSC_JL(int v) override { m_pub.Pub_JSC_JL = v;} + virtual int getPub_JSC_JL() const override { return m_pub.Pub_JSC_JL; } + virtual void setNJ_DiaoTou_JL(int v) override { m_pub.NJ_DiaoTou_JL = v; } + virtual int getNJ_DiaoTou_JL() const override { return m_pub.NJ_DiaoTou_JL; } + virtual void setPubCanJudge_XiHuoFlag(bool v) override { m_pub.PubCanJudge_XiHuoFlag = v; } + virtual bool getPubCanJudge_XiHuoFlag() const override { return m_pub.PubCanJudge_XiHuoFlag; } + virtual void setPubKaoBianTCFinish_LJJL(int v) override { m_pub.PubKaoBianTCFinish_LJJL = v; } + virtual int getPubKaoBianTCFinish_LJJL() const override { return m_pub.PubKaoBianTCFinish_LJJL; } + virtual void setKsLjLc(int v) override { m_pub.m_KsLjLc = v; } + virtual int getKsLjLc() const override { return m_pub.m_KsLjLc; } + virtual void setyjdg_road_code_kf(bool v) override { m_pub.yjdg_road_code_kf = v; } + virtual bool getyjdg_road_code_kf() const override { return m_pub.yjdg_road_code_kf; } protected: bool Init_KM3_Global(std::string& sError); @@ -151,6 +152,7 @@ private: TCar m_car; TTestCtl m_ctl; + TPubKM3 m_pub; std::vector m_carPosMeshList; const int m_DrawArc_Step = 40; @@ -158,25 +160,6 @@ private: int E_1Deg2Cm = 0; //经度1度=多少厘米 const int N_1Deg2Cm = 11110792; //北纬1度=X cm - int m_KsZgDw = 0; //记录考试中的最高档位 - int m_KsZgSs = 0; //记录考试中的最高时速 - int m_KsLjLc = 0; //记录考试累计里程(米) - - int PubLastChuanYuePtNo = 0; //最后一次经过的点 - int PubLastChuanYuePt_JLCM = 0; //最后一次经过的点偏移量 - - int NJ_DiaoTou_JL = 0; //个性需求 - int64 ChaoChe_Start_TM = 0; //2018011 超车开始时间 - int64 ChaoChe_End_TM = 0; //2018011 超车结束时间 - int PUB_JDCC_ZT = 0; //借道超车状态 0:非借道 1:表示超车 2:表示正在返回原车道 3:回原车道道完成 20180227 - bool yjdg_road_code_kf = false; - - int Pub_JSC_JL = 0; - bool PubCanJudge_XiHuoFlag = true; //注意初始必须是true - int PubKaoBianTCFinish_LJJL = 0; - - int m_SNO = 0; - //TCarStatus m_carStatus; //int64 m_ContinuedStartTime = 0; //续考的上次开始考试时间 20150205 diff --git a/entry/src/main/cpp/sdk/exam/ExamDatagram.cpp b/entry/src/main/cpp/sdk/exam/ExamDatagram.cpp index ac67dd80..fa0a24cb 100644 --- a/entry/src/main/cpp/sdk/exam/ExamDatagram.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamDatagram.cpp @@ -38,6 +38,13 @@ void ExamDatagram::addRealtime(int8 proto, const char* data, int len) addRealtime(pkg); } +void ExamDatagram::addRealtime(int8 proto, const std::string& data) +{ + Package* pkg = nullptr; + do { IAutoLock(m_mtxPool); pkg = POOL_CREATE_FROM_V1(m_pool, proto, data); } while(0); + addRealtime(pkg); +} + void ExamDatagram::addRealtime(Package* pkg) { push(pkg); diff --git a/entry/src/main/cpp/sdk/exam/ExamDatagram.h b/entry/src/main/cpp/sdk/exam/ExamDatagram.h index 366da9eb..fccf8752 100644 --- a/entry/src/main/cpp/sdk/exam/ExamDatagram.h +++ b/entry/src/main/cpp/sdk/exam/ExamDatagram.h @@ -23,7 +23,7 @@ struct Package data = std::string(_data,_len); } virtual ~Package() { data.clear(); } - enum {v1_json, v2_hardware}; + enum {v1_json, v2_hardware, v3_end}; int8 proto; std::string data; @@ -43,6 +43,7 @@ public: virtual void exitRealtime(); virtual void clearRealtime(); virtual void addRealtime(int8 proto, const char* data, int len); + virtual void addRealtime(int8 proto, const std::string& data); virtual void addRealtime(Package* pkg); private: HandleDatagram m_handle = nullptr; diff --git a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp index 122ac487..a1f50659 100644 --- a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp @@ -110,32 +110,32 @@ bool ExamSensor::convertDatas(TChuanGan* cg) { TSensorInfo& sor = cg->real.sensor; sor.dw_plc = sor.dw; - if(m_car->examSubject() == ExamSubject2) - { - } - else if(m_car->examSubject() == ExamSubject3) - { - IExamCarSub3* car = dynamic_cast(m_car); - TCar* tcar = car->getTCar(); - //给雾灯信号赋值的时候,一定要遵守下面的规则 - switch(tcar->WD_Signal) - { - case 0: sor.wd = sor.ygq; break; - case 1: sor.wd = 1 - sor.yy; break; //这是取反的的意思如果有信号1, 1-1就是0; - //20140411 - case 2: sor.wd = 1 - sor.ygq; break; //这是取反的的意思如果有信号1, 1-1就是0; - case 3: sor.wd = sor.yy; break; - default:break; - } - - if(tcar->CarTypeName == XCharacter("吉利豪情")) - { - if(sor.ygq == SNOT) - { - sor.wd = SNOT; - } - } - } + // if(m_car->examSubject() == ExamSubject2) + // { + // } + // else if(m_car->examSubject() == ExamSubject3) + // { + // IExamCarSub3* car = dynamic_cast(m_car); + // TCar* tcar = car->getTCar(); + // //给雾灯信号赋值的时候,一定要遵守下面的规则 + // switch(tcar->WD_Signal) + // { + // case 0: sor.wd = sor.ygq; break; + // case 1: sor.wd = 1 - sor.yy; break; //这是取反的的意思如果有信号1, 1-1就是0; + // //20140411 + // case 2: sor.wd = 1 - sor.ygq; break; //这是取反的的意思如果有信号1, 1-1就是0; + // case 3: sor.wd = sor.yy; break; + // default:break; + // } + // + // if(tcar->CarTypeName == XCharacter("吉利豪情")) + // { + // if(sor.ygq == SNOT) + // { + // sor.wd = SNOT; + // } + // } + // } //油门计算,松油门信号 sor.sym = 0; @@ -296,11 +296,11 @@ bool ExamSensor::calcCarBody(TChuanGan* cg) } else { - if(m_car->historyCount() == 0) + if(m_car->historyCount() > 0) { - return false; //第一帧数据就是非差分状态? + cg->real.gps.ai_gps = m_car->historyAiGps(); //20240702 yhy + //return false; //这里不能返回false 第一帧数据就是非差分状态?如果做模拟灯光的时候一直没差分进不了项目了 } - cg->real.gps.ai_gps = m_car->historyAiGps(); //20240702 yhy } if(ExamSubject2 == subject) @@ -405,13 +405,13 @@ bool ExamSensor::GetCarDirStauts(TChuanGan* cg) else { //数据异常 - return false; + return true; //如果从一开始考试一直在非差分状态 如果返回false就进不了评判了 比如模拟灯光 20240726 } } if(cg->real.gps.rtkEnabled == false) //20240702 yhy { - cg->move = m_car->historyChuanGan()->move; + cloneWith(m_car->historyChuanGan(), cg); return true; } @@ -814,6 +814,18 @@ bool ExamSensor::GetCarDirStatus_KM2(TChuanGan* cg) return true; } +void ExamSensor::cloneWith(TChuanGan* src, TChuanGan* dest) +{ + dest->move = src->move; + dest->real.gps.ai_gps = src->real.gps.ai_gps; + dest->ai_ljjl = src->ai_ljjl; + dest->ai_dcjl = src->ai_dcjl; + dest->ai_ljjl_cm = src->ai_ljjl_cm; + dest->ai_dcjl_cm = src->ai_dcjl_cm; + //dest->tkCnt = src->tkCnt; + +} + #ifdef JUDGE_USE_INSPECT void ExamSensor::inspectSensor(TChuanGan* cg) diff --git a/entry/src/main/cpp/sdk/exam/ExamSensor.h b/entry/src/main/cpp/sdk/exam/ExamSensor.h index b4933c8c..983bbbc9 100644 --- a/entry/src/main/cpp/sdk/exam/ExamSensor.h +++ b/entry/src/main/cpp/sdk/exam/ExamSensor.h @@ -35,6 +35,7 @@ public: virtual int GetDBStop_Interval(int ItemNo); //计算考车前进状态 1:表示前进状态 -1:表示后退 0:无变化(停车) virtual CarMoveState calcMoveState(); + virtual void cloneWith(TChuanGan* src, TChuanGan* dest); private: IExamCarAbstract* m_car = nullptr; TGPSPoint m_basePoint; //地图对应的基准点(地图就是测绘项目, 跟考车模型没有关系) diff --git a/entry/src/main/cpp/sdk/exam/ExamService.cpp b/entry/src/main/cpp/sdk/exam/ExamService.cpp index 8cd72f2f..4e58164b 100644 --- a/entry/src/main/cpp/sdk/exam/ExamService.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamService.cpp @@ -105,7 +105,7 @@ int ExamService::examJudgeInit(const char* data, int len) return QE(code); } m_init = true; - loginfo("exam-init success."); + loginfo("exam-init success version=%s.", JUDGE_VERSION_INFO); return QE(codeSuccess); } @@ -182,11 +182,11 @@ int ExamService::examJudgeSetPerformCallback(examJudgeCallbackPerform callback) return QE(codeSuccess); } -int ExamService::examJudgeArtificialMark(int itemno, const char* serial) +int ExamService::examJudgeArtificialMark(int itemno, const char* serial, int type) { logdebug("call examJudgeArtificialMark."); if(!m_init) return QE(errorInitNot); - return m_car->examJudgeArtificialMark(itemno, serial); + return m_car->examJudgeArtificialMark(itemno, serial, type); } int ExamService::examJudgeArtificialItem(int itemno, int type) diff --git a/entry/src/main/cpp/sdk/exam/ExamService.h b/entry/src/main/cpp/sdk/exam/ExamService.h index 91685dbc..efabd8c0 100644 --- a/entry/src/main/cpp/sdk/exam/ExamService.h +++ b/entry/src/main/cpp/sdk/exam/ExamService.h @@ -28,7 +28,7 @@ public: virtual int examJudgeRealExam2(const char* data, int len) override; virtual int examJudgeSetRealExamCallback(examJudgeCallbackRealExam callback) override; virtual int examJudgeSetPerformCallback(examJudgeCallbackPerform callback) override; - virtual int examJudgeArtificialMark(int itemno, const char* serial) override; + virtual int examJudgeArtificialMark(int itemno, const char* serial, int type) 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; diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.cpp b/entry/src/main/cpp/sdk/exam/IExamCar.cpp index 5a9f480e..99718481 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.cpp +++ b/entry/src/main/cpp/sdk/exam/IExamCar.cpp @@ -89,6 +89,7 @@ int IExamCar::examJudgeBeginExam(const char* data, int len) m_timeEnd = 0; m_disForward = 0; m_disBackward = 0; + memset(m_disGears, 0, sizeof(m_disGears)); m_message = ""; m_codes.clear(); m_marks.clear(); @@ -117,7 +118,19 @@ int IExamCar::examJudgeBeginExam(const char* data, int len) int IExamCar::examJudgeEndExam() { - IAutoLock(m_mtx); + logtrace("end-exam-judge begin %s", target().c_str()); + //IAutoLock(m_mtx); + m_handle->addRealtime(Package::v3_end, ""); + return QE(codeSuccess); +} + +int IExamCar::examJudgeEndExamFinish() +{ + logtrace("end-exam begin %s", target().c_str()); + //IAutoLock(m_mtx); + + createEventExamFinish(ExamFinishArti); + m_handle->clearRealtime(); if(m_examState == examStateEnd) { @@ -166,11 +179,11 @@ int IExamCar::examJudgeRealExam2(const char* data, int len) return QE(codeSuccess); } -int IExamCar::examJudgeArtificialMark(int itemno, const char* serial) +int IExamCar::examJudgeArtificialMark(int itemno, const char* serial, int type) { IAutoLock(m_mtx); logtrace("artificial-mark itemNo=%d, serial=%s", itemno, serial); - ErrorCode code = examArtifMark(ExamItemCode(itemno), serial); + ErrorCode code = examArtifMark(ExamItemCode(itemno), serial, MarkType(type)); examPerformSummary(); return code; } @@ -180,7 +193,6 @@ int IExamCar::examJudgeArtificialItem(int itemno, int type) IAutoLock(m_mtx); logtrace("artificial-item itemNo=%d, type=%d", itemno, type); ErrorCode code = examArtifItem(ExamItemCode(itemno), ArtifItemType(type)); - //examPerformSummary(); return code; } @@ -303,15 +315,24 @@ void IExamCar::createEventMoveState(const TEventCarMove& event) FactoryExamService->examJudgeCallbackRealExamToCaller(data.c_str(), data.size()); } -void IExamCar::createEventExamFinish(void) +void IExamCar::createEventExamFinish(ExamFinishType type) { - //__DELETE__(m_track); //这里需不需要???这里停止录轨迹 + examPerformSummary(); + m_examState = examStateFinish; TJudgeData exam; exam.event = ExamEventTypeExamFinish; exam.sj = GetCurrentTime2(); - exam.ksjs = {m_disForward, m_disBackward}; + exam.ksjs.type = type; + exam.ksjs.qjjl = m_disForward; + exam.ksjs.dcjl = m_disBackward; + exam.ksjs.d1 = m_disGears[1]; + exam.ksjs.d2 = m_disGears[2]; + exam.ksjs.d3 = m_disGears[3]; + exam.ksjs.d4 = m_disGears[4]; + exam.ksjs.d5 = m_disGears[5]; + exam.ksjs.d6 = m_disGears[6]; std::string data = m_parser->toDataString(exam); FactoryExamService->examJudgeCallbackRealExamToCaller(data.c_str(), data.size()); logtrace("exam-finish-event %s", target().c_str()); @@ -363,6 +384,10 @@ void IExamCar::createEventLane(const TEventLane& event) void IExamCar::examPerformSummary() { + if(historyCount() == 0) + { + return; + } const Pointi& dis = historyAiGps(); TPerformData exam; exam.time = elapsedLastTime(); @@ -457,6 +482,11 @@ void IExamCar::doExamDatagram(Package* pkg) //m_history->push(cg); } + else if(pkg->proto == Package::v3_end) + { + examJudgeEndExamFinish(); + } + } void IExamCar::calcDistance() @@ -474,20 +504,24 @@ void IExamCar::calcDistance() double x = h.x - c.x; double y = h.y - c.y; int a = std::round(std::sqrt(x*x + y*y)); - CarMoveState state = historyMoveState(); - switch(state) + switch(m_cg->move) { case moveForward: m_disForward += a; break; case moveBackward: m_disBackward += a; break; default: break; } - //logdebug("move=%d,dis=%dCM", state, a); m_cg->ai_ljjl_cm = m_disForward; m_cg->ai_dcjl_cm = m_disBackward; m_cg->ai_ljjl = m_disForward/100.0; m_cg->ai_dcjl = m_disBackward/100.0; - //logdebug("calcDistance state=%d a=%d", state, a); + if(m_cg->move == moveForward) + { + int gear = m_cg->real.sensor.dw; + m_disGears[gear] += a; + } + + //logdebug("move=%d,dis=%dCM", state, a); } int64 IExamCar::GetCurrentTime2() const diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.h b/entry/src/main/cpp/sdk/exam/IExamCar.h index e2085acd..5cf63449 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.h +++ b/entry/src/main/cpp/sdk/exam/IExamCar.h @@ -30,7 +30,7 @@ public: virtual int examJudgeEndExam() override; virtual int examJudgeRealExam(const char* data, int len) override; virtual int examJudgeRealExam2(const char* data, int len) override; - virtual int examJudgeArtificialMark(int itemno, const char* serial) override; + virtual int examJudgeArtificialMark(int itemno, const char* serial, int type) 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; @@ -49,7 +49,7 @@ public: virtual void createEventFinishItem(const TEventFinishItem& event) override; virtual void createEventMarkItem(const TEventItemMark& event) override; virtual void createEventMoveState(const TEventCarMove& event) override; - virtual void createEventExamFinish(void) override; + virtual void createEventExamFinish(ExamFinishType type) override; virtual void createEventCancelItem(const TEventCancelItem& event) override; virtual void createEventSound(const TEventSound& event) override; virtual void createEventLight(const TEventLight& event) override; @@ -116,12 +116,14 @@ public: virtual ErrorCode examGoonExam() = 0; virtual ErrorCode examEndExam() = 0; virtual ErrorCode examJudgeExam() = 0; - virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial) = 0; + virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) = 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; + virtual bool examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) = 0; public: + virtual int examJudgeEndExamFinish(); //执行处理每一帧的GPS传感数据 virtual void doExamDatagram(Package* pkg); //前进 后退 距离计算 @@ -145,6 +147,7 @@ protected: int m_disForward = 0; //累计前进距离(单位厘米) 老的代码里也叫累计距离, 行驶距离=累计距离-倒车距离 int m_disBackward= 0; //累计倒车距离(单位厘米) 老的代码里也叫倒车距离 + int m_disGears[20]; //档位距离 int m_grade = 0; //当前得分 int m_gradePass = 0; //考试及格分数 @@ -173,9 +176,6 @@ public: explicit IExamCarSub2() = default; virtual ~IExamCarSub2() = default; - //扣分 - virtual bool sub2MarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force=false, bool event=true) = 0; - //查找考试项目对象 virtual IExamItem* findExamItem(ExamItemCode itemNo) = 0; //是否是需要考试项目 @@ -207,8 +207,6 @@ public: virtual ISub3JudgeItem* currentItem() const = 0; //通用评判项目对象,只要是考试状态不会是NULL virtual ISub3JudgeItem* commItem() const = 0; - //Kind:0 自动评判 1:考车人工扣分 2:远程下发的考试扣分 - virtual bool judgeMark(int ItemNo, const std::string& MarkSerial, bool OnlyOneID=false, bool ForceID=false, bool event=true, int8 Kind=0) = 0; virtual const std::map& allExamItem() const = 0; //路口项目是否正考,如果路口项目没有结束 diff --git a/entry/src/main/cpp/sdk/exam/IExamCarAbstract.h b/entry/src/main/cpp/sdk/exam/IExamCarAbstract.h index 4d7a0612..e3f102c1 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCarAbstract.h +++ b/entry/src/main/cpp/sdk/exam/IExamCarAbstract.h @@ -33,7 +33,7 @@ public: //考车移动状态改变事件 virtual void createEventMoveState(const TEventCarMove& event) = 0; //考试结束事件 - virtual void createEventExamFinish(void) = 0; + virtual void createEventExamFinish(ExamFinishType type) = 0; //项目取消事件 virtual void createEventCancelItem(const TEventCancelItem& event) = 0; //语音播报和提示事件 diff --git a/entry/src/main/cpp/sdk/exam/IExamInterface.h b/entry/src/main/cpp/sdk/exam/IExamInterface.h index e8d762ef..1814c469 100644 --- a/entry/src/main/cpp/sdk/exam/IExamInterface.h +++ b/entry/src/main/cpp/sdk/exam/IExamInterface.h @@ -20,7 +20,7 @@ public: virtual int examJudgeEndExam() = 0; virtual int examJudgeRealExam(const char* data, int len) = 0; virtual int examJudgeRealExam2(const char* data, int len) = 0; - virtual int examJudgeArtificialMark(int itemno, const char* serial) = 0; + virtual int examJudgeArtificialMark(int itemno, const char* serial, int type) = 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; diff --git a/entry/src/main/cpp/sdk/judge/HJudgeItem.h b/entry/src/main/cpp/sdk/judge/HJudgeItem.h index 2c601b78..92be9c96 100644 --- a/entry/src/main/cpp/sdk/judge/HJudgeItem.h +++ b/entry/src/main/cpp/sdk/judge/HJudgeItem.h @@ -256,7 +256,7 @@ struct TSub3Item10Ccxx //超车 //1:初始超车道阶段 2:初始普通车道阶段 3:左侧超车阶段 4:完成左侧超车阶段 //5:回原车道阶段 6:完成回原车道阶段 int8 Status = 0; - bool CS_CCD_Flag = false; + bool CS_CCD_Flag = false; //初始是否在超车到标记 int Temp_LJJL_CCD_PTCD = 0; //进入项目时的累计距离(超车道->普通车道) int Temp_LJJL_2 = 0; //变道发生时的累计距离 int64 Temp_TM = 0; //变道、超车以前后轮都过线的时间 @@ -273,8 +273,8 @@ struct TSub3Item10Ccxx //超车 int CS_CCD_Max_XSJL = 0; //超车道上最多可以行驶的距离 //初始超车道,二次超车最小行驶距离(如果初始在超车道上,需要驶离超车道, //然后行驶规定的距离后,再次进入超车道超车) - int CS_CCD_ErCiChaoChe_Min_XSJL = 0; - bool CS_CCD_ErCiChaoChe_Min_XSJL_OK = false; + int CS_CCD_ErCiChaoChe_Min_XSJL = 0; //初始在超车道行驶到普通车道,要行使一段距离才能再次进入超车道 + bool CS_CCD_ErCiChaoChe_Min_XSJL_OK = false; //初始在超车道行驶到普通车道,要行使一段距离才能再次进入超车道状态 int64 St4_HuiYuanCheDao_TM = 0; //超车回原车道时刻 int St4_HuiYuanCheDao_Miao = 0; //超车回原车道时间 int Temp_CC_CSSJ = 0; //超车达到车速的持续时间 20150507 @@ -428,7 +428,10 @@ struct TSub3Item41Mndg //模拟灯光 41 int64 Lt_LastChange_TM = 0; //灯光最后变化时间 int Lt_YJ_cs = 0; //远近光灯变化次数 20150327 - std::array Lt_Change; //: array[0..6] of string; //0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 + //std::array Lt_Change; //: array[0..6] of string; //0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 + std::string Lt_Change; + + std::string Lt_Change_Last; int8 ItemNo = 0, ItemStatus = 0; //St 控制具体项目 St1控制指定项目的状态 int64 Snd_Wav_Start_TM = 0; //语音开始时间 @@ -469,6 +472,14 @@ struct TSub3Item02Qbxx //起步 2 int QiBu_LJJL_CM = 0; bool Error_SSC_Flag = false; + + + //以下是溜车评判需要用到的变量 + int PubMaxLCValue = 0; + Pointi PubLCTCPtt; + double PubLCTC_GPS_JD = 0.0; + double PubLCTC_GPS_WD = 0.0; + bool PubCanMarkLC50Flag = true; //注意初始必须是true }; diff --git a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp index 67702d7f..48b1174a 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/ISub2JudgeWrap.cpp @@ -690,8 +690,7 @@ void ISub2JudgeWrap::setFinishItem() noexcept bool ISub2JudgeWrap::markItemGrade(ExamItemCode itemNo, const std::string& serial, bool once, bool force) noexcept { - static constexpr bool event = true; - bool ok = m_car->sub2MarkItem(itemNo, serial, once, force, event); + bool ok = m_car->examMarkItem(itemNo, serial, once, force, true, MarkTypeAuto); if(m_car->isExamMode() && !m_car->isQualified()) { m_exam->setState(itemStateEnd); diff --git a/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.h b/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.h index fdab2ff0..2fa23d5b 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.h +++ b/entry/src/main/cpp/sdk/judge/sub3/ISub3JudgeWrap.h @@ -33,7 +33,7 @@ class JUDGE_API ISub3JudgeWrap : public ISub3JudgeItem //itemno, serial, once, force #define JUDGE_MARK_SUB3(itemno, serial, ...) \ { \ - if(m_car->judgeMark(JUDGE_VA_ARGS(itemno, serial, ##__VA_ARGS__))) \ + if(m_car->examMarkItem(JUDGE_VA_ARGS(itemno, serial, ##__VA_ARGS__))) \ { \ logtrace("sub3-mark itemno=%d,serial=%s", itemno, serial); \ } \ diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp index b6ab1be6..9bcda5fe 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp @@ -116,7 +116,7 @@ void Sub3Judge01Sczb::dealJudgeItem() const TKfXm& m = sczb_mark[i]; //强制扣分 //JudgeKM3Obj.Mark(StrToInt(Temp1), Temp2, False, True); - JUDGE_MARK_SUB3(m.xmdm, m.kfdm.c_str(), false, true, false); + JUDGE_MARK_SUB3(m.xmdm, m.kfdm.c_str(), false, true, false, MarkTypeArti); } } m_exam->TestPro = ItemProFlagEnd; diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp index c49972ca..470556b6 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp @@ -38,6 +38,16 @@ bool Sub3Judge02Qbxx::dealJudgeEnter() const TChuanGan* cg = m_car->historyChuanGan(); m_itemv.Temp_JL_CM = cg->ai_ljjl_cm; + if(m_car->disForward() > 10*100) //10米 + { + //20240730 在济南修改 yhy + //根据程军华口述修改过滤,在下面这种情况下: + //如果在做模拟灯光的时候,还没起步之前差分丢了,车子开起来一段距离后差分又恢复了,当进入路口直行项目时,如果这个时候正好在路口等红灯停车了,会触发第一次起步 + //路口直行是不需要打灯的,而程序又第一次触发了起步项目,又要打左灯,考生怎么操作都会扣分, + //所以这里过滤下,如果起步的时候前进的距离超过10米了就不算第一次起步了,就不判首次起步打左灯了 + m_Pub_First_QiBu_Flag = true; + } + m_itemv.State = 1; //车辆停车状态到前进距离小于1米的阶段 m_exam->TestPro = ItemProFlagJudge; @@ -131,10 +141,15 @@ void Sub3Judge02Qbxx::dealJudgeItem() //10秒未起步 nogo_timeout(); + //溜车评判 20240730 + Judge_LiuChe(); + if(cg->ai_ljjl_cm - m_itemv.Temp_JL_CM >= 100) { if(cg->move == moveForward && his1->move == moveForward) { + Judge_QiBu_FXD_LaBa(); //20240730 + Judge_QiBu_GuaCuoDang(); //20240730 m_itemv.State = 2; return; } @@ -194,11 +209,9 @@ void Sub3Judge02Qbxx::dealJudgeItem() void Sub3Judge02Qbxx::nogo_timeout() { const TChuanGan* cg = m_car->historyChuanGan(); - const TGpsInfo& gps = cg->real.gps; const TSensorInfo& sor = cg->real.sensor; const TChuanGan* his1 = m_car->historyChuanGan(1); - const TGpsInfo& gps1 = his1->real.gps; const TSensorInfo& sor1 = his1->real.sensor; //档位或者手刹信号发生变化,且变化的结果是前进挡和松手刹状态,开始计时,10秒后扣分 @@ -260,3 +273,181 @@ void Sub3Judge02Qbxx::nogo_timeout() } */ } + + +//6、起步方向灯、喇叭 +void Sub3Judge02Qbxx::Judge_QiBu_FXD_LaBa() +{ + const TChuanGan* cg = m_car->historyChuanGan(); + const TSensorInfo& sor = cg->real.sensor; + const TChuanGan* his1 = m_car->historyChuanGan(1); + //const TChuanGan* his2 = m_car->historyChuanGan(2); + + //1、检查起步前有没有打转向灯 + //if(cg->move == moveForward && his1->move == moveForward && his2->move == moveStop) + if(cg->move == moveForward && his1->move == moveForward) + { + //可以多次触发起步,但是起步方向灯,全程只评判一次 + if(m_Pub_First_QiBu_Flag == true) return; + m_Pub_First_QiBu_Flag = true; + bool FindFlag = (sor.zfxd == SYES && sor.yfxd == SNOT); + if(!FindFlag) + { + for(int i = 1; i < 50; i++) + { + const TChuanGan* hisi = m_car->historyChuanGan(i); + if(hisi == nullptr) break; + const TSensorInfo& sori = hisi->real.sensor; + if(hisi->move == moveStop) + { + if(sori.zfxd == SYES && sori.yfxd == SNOT) + { + FindFlag = true; + break; + } + } + } + } + if(!FindFlag) + { + JUDGE_MARK_SUB3(2, "42", false, true); //JUDGE_MARK_SUB3(20, "73", false, true); + } + else + { + //看方向灯是否小于3秒 + int OKNum = 0; + for(int i = 1; i < 50; i++) + { + const TChuanGan* hisi = m_car->historyChuanGan(i); + if(hisi == nullptr) break; + const TSensorInfo& sori = hisi->real.sensor; + if(hisi->move == moveStop) + { + if(sori.zfxd == SYES && sori.yfxd == SNOT) + { + OKNum++; + } + } + } + if(OKNum < 3*FRAMES_PER_SECOND) + { + //JUDGE_MARK_SUB3(20, "224", false, true); + JUDGE_MARK_SUB3(2, "43", false, true); + } + } + + //起步喇叭评判 + FindFlag = (sor.lb == SYES); + if(!FindFlag) + { + 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) + { + if(sori.lb == SYES) + { + FindFlag = true; + break; + } + } + } + } + if(!FindFlag) + { + JUDGE_MARK_SUB3(2, "07", false, true); + } + } +} + +//22、起步挂错挡 +void Sub3Judge02Qbxx::Judge_QiBu_GuaCuoDang() +{ + if(m_car->historyCount() < 2) return; + const TChuanGan* cg = m_car->historyChuanGan(); + const TChuanGan* his1 = m_car->historyChuanGan(1); + //const TChuanGan* his5 = m_car->historyChuanGan(5); + //const TChuanGan* his10 = m_car->historyChuanGan(10); + //if(cg->move == moveForward && his1->move == moveStop && his5->move == moveStop && his10->move == moveStop) + if(cg->move == moveForward && his1->move == moveForward) + { + 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 + } +} + +//1、溜车评判 +void Sub3Judge02Qbxx::Judge_LiuChe() +{ + if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1) || !m_car->rtkEnabled(2)) return; + + const TChuanGan* cg = m_car->historyChuanGan(); + const TGpsInfo& gps = cg->real.gps; + const TSensorInfo& sor = cg->real.sensor; + const TChuanGan* his1 = m_car->historyChuanGan(1); + + static constexpr int LCValue = 32; //后溜车距离 + static constexpr int LC30FaZhi = 12; + if(cg->move == moveForward && his1->move == moveForward) //前进的时候要评判溜车小于30厘米的 + { + if(m_itemv.PubMaxLCValue >= LC30FaZhi && m_itemv.PubMaxLCValue <= LCValue) + { + //通用或起步项目 + JUDGE_MARK_SUB3(2, "47", false); + } + + m_itemv.PubLCTCPtt.x = 0; + m_itemv.PubLCTCPtt.y = 0; + m_itemv.PubMaxLCValue = 0; + m_itemv.PubCanMarkLC50Flag = true; + } + if(sor.dw != 9 && sor.dw != 6 && sor.ssc == SNOT) + { + //if(m_itemv.PubLCTCPtt.x == 0 && m_itemv.PubLCTCPtt.y == 0 && m_car->rtkEnabled()) + { + const TChuanGan* his2 = m_car->historyChuanGan(2); + if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) + { + m_itemv.PubLCTCPtt.x = gps.ai_gps.x; + m_itemv.PubLCTCPtt.y = gps.ai_gps.y; + m_itemv.PubLCTC_GPS_JD = gps.jd; + m_itemv.PubLCTC_GPS_WD = gps.wd; + m_itemv.PubMaxLCValue = 0; + } + } + + //ExamSensor* sensor = m_car->sensor(); //sensor->calcMoveState(); + if(m_itemv.PubLCTCPtt.x != 0 && m_itemv.PubLCTCPtt.y != 0 && cg->move != moveForward) // JudgeKM3Obj.GetMovingState <> 1 + { + Point Ptt = gps.ai_gps; + int b = m_itemv.PubLCTCPtt.x - Ptt.x; + int c = m_itemv.PubLCTCPtt.y - Ptt.y; + int a = std::round(std::sqrt(b*b + c*c)); //cm + int LC = a; + if(m_itemv.PubMaxLCValue < LC) + { + m_itemv.PubMaxLCValue = LC; + } + //溜车大于30了,直接扣分 + if(m_itemv.PubCanMarkLC50Flag == true && m_itemv.PubMaxLCValue > LCValue) + { + JUDGE_MARK_SUB3(2, "46", false); + m_itemv.PubCanMarkLC50Flag = false; + } + } + } +} diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.h index 04285dec..3cdce741 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.h @@ -59,10 +59,16 @@ public: protected: //具备起步条件,10秒没有起步 void nogo_timeout(); + //1、溜车评判 + void Judge_LiuChe(); + //6、起步方向灯、喇叭 + void Judge_QiBu_FXD_LaBa(); + //22、起步挂错挡 + void Judge_QiBu_GuaCuoDang(); private: TSub3Item02Qbxx m_itemv; - + bool m_Pub_First_QiBu_Flag = false; //起步方向灯和喇叭 只判一次 第一次进起步项目才判 }; #endif // SUB3JUDGE02QBXX_H diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp index 74ba97c6..1d6a988e 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp @@ -510,13 +510,15 @@ void Sub3Judge10Ccxx::dealJudgeItem() //在普通车道上,开始超车距离 if(m_itemv.Status == 2) //普通车道上,准备超车 { - if(m_itemv.CS_CCD_Flag == true) + //如果初始在超车道,行驶到普通车道,要行驶一段距离504参数才能在进超车道 + if(m_itemv.CS_CCD_Flag == true && m_itemv.CS_CCD_ErCiChaoChe_Min_XSJL_OK == false) { //初始超车道,二次超车最小行驶距离(如果初始在超车道上,需要驶离超车道, //然后行驶规定的距离后,再次进入超车道超车) if(cg->ai_ljjl - m_itemv.Temp_LJJL_CCD_PTCD >= m_itemv.CS_CCD_ErCiChaoChe_Min_XSJL) { m_itemv.CS_CCD_ErCiChaoChe_Min_XSJL_OK = true; + m_car->createEventSound({itemNo(), sound::sub3_414001}); return; } } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp index 0e662674..b4de8cc7 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp @@ -63,27 +63,29 @@ void Sub3Judge20Comm::dealJudgeItem() //自动靠边停车计算 Call_Auto_KBTC(); //Step0-2触发模拟灯光 - if(!m_car->isReplay()) //(Data_Replay.Kind = 2) then //杨海洋实际考试模式(就是说非回放模式的) - { - CallMoNiDengGuang(); //yhyflag - } - else - { - //回放相关的 - if(sor.rmndg == SYES) - { - TKM3Item* item = m_car->findExamItem(Sub3ItemType41Mndg); - if(item && item->TestPro == ItemProFlagIdle) - { - item->Item_Color = itemStateZk; - item->TestPro = ItemProFlagInit; - item->FinishFlag = false; - } - } - } + + CallMoNiDengGuang(); //240710 + //if(!m_car->isReplay()) //(Data_Replay.Kind = 2) then //杨海洋实际考试模式(就是说非回放模式的) + //{ + // CallMoNiDengGuang(); //yhyflag + //} + //else + //{ + // //回放相关的 + // if(sor.rmndg == SYES) + // { + // TKM3Item* item = m_car->findExamItem(Sub3ItemType41Mndg); + // if(item && item->TestPro == ItemProFlagIdle) + // { + // item->Item_Color = itemStateZk; + // item->TestPro = ItemProFlagInit; + // item->FinishFlag = false; + // } + // } + //} //1、溜车评判 - Judge_LiuChe(); + //Judge_LiuChe(); //移到起步专项里评判 20240730 //2、连续2次挂挡不进 Judge_GuaDangBuJin(); //3、空挡滑行 @@ -95,7 +97,7 @@ void Sub3Judge20Comm::dealJudgeItem() Judge_YaXian_10S_XuXian(); //6、起步方向灯、喇叭 - Judge_QiBu_FXD_LaBa(); + //Judge_QiBu_FXD_LaBa(); //移到起步项目里了 20240730 //7、连续变道 Judge_LianXuBianDao(); @@ -129,7 +131,7 @@ void Sub3Judge20Comm::dealJudgeItem() //21、考试过程中打开车门 Judge_DaKaiCheMen(); //22、起步挂错挡 - Judge_QiBu_GuaCuoDang(); + //Judge_QiBu_GuaCuoDang(); //移到起步专项里评判 20240730 //23、使用挡位与车速长时间不匹配,造成车辆发动机转速过高或过低(发动机转速〉2500转或〈900转,且时间大于30秒)扣100分 Judge_DangWei_CS_ZS(); @@ -172,10 +174,6 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.ZdKbTcJl = 1; } //溜车变量初始化 - m_PubLCTCPtt.x = 0; - m_PubLCTCPtt.y = 0; - m_PubMaxLCValue = 0; - m_PubCanMarkLC50Flag = true; //SysSet[529]:模拟灯光是否需要人脸验证 //说明:这个参数目前我没有实际的用到 @@ -928,7 +926,6 @@ void Sub3Judge20Comm::CallQiBu(int qbsj) } //SysSet[502]:起步触发顺序:0-无限制,1-上车准备完成,2-模拟灯光完成 - const std::vector& s502 = TableSysSet->asArray502(); int s502_9 = s502.size() > 9 && s502[9] != "" ? std::atoi(s502[9].c_str()) : 0; //StrToIntdef(GetDotStr(10, sysset[502], ','), 0); if(s502_9 == 1) @@ -949,8 +946,7 @@ void Sub3Judge20Comm::CallQiBu(int qbsj) if(item41) { if(item41->Item_Color == itemStateWk || item41->Item_Color == itemStateZk) return; - - if(MilliSecondsBetween(m_car->GetCurrentTime2(), item41->EndTime) < 2000) return; + if(MilliSecondsBetween(m_car->GetCurrentTime2(), item41->EndTime) < 2*SECOND) return; } } @@ -999,9 +995,12 @@ void Sub3Judge20Comm::CallQiBu(int qbsj) } } -//1、溜车评判 +/* +//1、溜车评判 //移到起步专项里评判 20240730 void Sub3Judge20Comm::Judge_LiuChe() { + if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1) || !m_car->rtkEnabled(2)) return; + const TChuanGan* cg = m_car->historyChuanGan(); const TGpsInfo& gps = cg->real.gps; const TSensorInfo& sor = cg->real.sensor; @@ -1009,7 +1008,6 @@ void Sub3Judge20Comm::Judge_LiuChe() 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 <= LCValue) @@ -1063,7 +1061,7 @@ void Sub3Judge20Comm::Judge_LiuChe() } } } - +*/ //2、连续两次挂挡不进 void Sub3Judge20Comm::Judge_GuaDangBuJin() @@ -1376,7 +1374,7 @@ void Sub3Judge20Comm::Judge_KongDangHuaXing() { if(Tools::pos("C", m_car->carType2())) { - if(sor.lhq == SYES && cg->move == moveForward) + if(sor.lhq == SYES && cg->move == moveForward) { m_itemvCJH.kdhx_tk_lhq = cg->tkCnt; } @@ -1960,6 +1958,7 @@ void Sub3Judge20Comm::Judge_YaXian_10S_XuXian() } } +/* //6、起步方向灯、喇叭 void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() { @@ -1994,7 +1993,7 @@ void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() } if(!FindFlag) { - JUDGE_MARK_SUB3(20, "73", false, true); + JUDGE_MARK_SUB3(2, "42", false, true); //JUDGE_MARK_SUB3(20, "73", false, true); } else { @@ -2046,6 +2045,7 @@ void Sub3Judge20Comm::Judge_QiBu_FXD_LaBa() } } } +*/ //是否是连续变道 bool Sub3Judge20Comm::Is_Lxbd_New() @@ -4224,16 +4224,16 @@ 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) || (sor.dw >= 2 && sor.dw <= 9)) + if((cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) || (sor.dw != 1)) { m_itemvXLG.CSH_QBDW_Flag = false; } if(cg->move == moveForward && his1->move == moveForward) { - if(sor.dw == 1) + if(sor.dw == 1 && cg->ai_ljjl_cm > 0) { - if(!m_itemvXLG.CSH_QBDW_Flag && cg->ai_ljjl_cm > 0) + if(!m_itemvXLG.CSH_QBDW_Flag) // && cg->ai_ljjl_cm > 0 { m_itemvXLG.CSH_QBDW_Flag = true; m_itemvXLG.Mark_20_77_Flag = false; @@ -4439,6 +4439,7 @@ void Sub3Judge20Comm::Judge_DaKaiCheMen() } } +/* //22、起步挂错挡 void Sub3Judge20Comm::Judge_QiBu_GuaCuoDang() { @@ -4464,6 +4465,7 @@ void Sub3Judge20Comm::Judge_QiBu_GuaCuoDang() #endif } } +*/ //23、挡位与车速、转速不匹配 void Sub3Judge20Comm::Judge_DangWei_CS_ZS() @@ -4797,7 +4799,7 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS() //24、全程次高挡评判 void Sub3Judge20Comm::Judge_CiGaoDang() { - if(m_car->allItemFinish() == true) //全程次高挡评判 KM3AllPass() + if(m_car->allItemFinish() && m_car->isQualified()) //全程次高挡评判 KM3AllPass() { if(m_itemvXLG.CGD_Nums == 0) { diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.h index 7764fbb4..b3fd942a 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.h @@ -109,8 +109,8 @@ protected: void CallQiBu(int qbsj = 5); //======================================= - //1、溜车评判 - void Judge_LiuChe(); + //1、溜车评判 //移到起步专项里评判 20240730 + //void Judge_LiuChe(); //2、连续两次挂挡不进 void Judge_GuaDangBuJin(); @@ -127,8 +127,8 @@ protected: //长时间骑轧车道分界线行驶 void Judge_YaXian_10S_XuXian(); - //6、起步方向灯、喇叭 - void Judge_QiBu_FXD_LaBa(); + //6、起步方向灯、喇叭 //移到起步专项里评判 20240730 + //void Judge_QiBu_FXD_LaBa(); //7、连续变更两条以上车道 //重点 void Judge_LianXuBianDao(); @@ -182,8 +182,8 @@ protected: //21、打开车门 void Judge_DaKaiCheMen(); - //22、起步挂错挡 - void Judge_QiBu_GuaCuoDang(); + //22、起步挂错挡 //移到起步专项里评判 20240730 + //void Judge_QiBu_GuaCuoDang(); //23、挡位与车速、转速不匹配 void Judge_DangWei_CS_ZS(); @@ -206,14 +206,8 @@ private: //std::string m_PubTongYong_Msg; int m_sfyz_state = 0; //模拟灯光是否需要人脸验证 bool m_qbjc_zuoyi = false; //20151207 贵州起步检查 - //以下是溜车评判需要用到的变量 - int m_PubMaxLCValue = 0; - Pointi m_PubLCTCPtt; - double m_PubLCTC_GPS_JD = 0.0; - double m_PubLCTC_GPS_WD = 0.0; - bool m_PubCanMarkLC50Flag = true; //注意初始必须是true - bool m_Pub_First_QiBu_Flag = false; + //bool m_Pub_First_QiBu_Flag = false; //int Pub_JSC_JL = 0; //in car //bool PubCanJudge_XiHuoFlag = true; //in car diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp index fa4a68b5..91f56e46 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.cpp @@ -26,7 +26,7 @@ bool Sub3Judge41Mndg::dealJudgeEnter() } const TGpsInfo& gps = m_car->historyGps(); - setSeed(gps.sj); //240709 gps.sj + setSeed(gps.sj); //加载合法的灯光 //参考头文件注释说明[灯光类型] // m_lights = @@ -96,6 +96,7 @@ bool Sub3Judge41Mndg::dealJudgeEnter() //Pub_Log('开始模拟夜间New'); //灯光初始化 m_itemv = TSub3Item41Mndg(); + m_itemv.Lt_Change.resize(7, N0); //m_exam->TestPro = ItemProFlagJudge; //ToDo2:生成进项目事件 @@ -160,6 +161,15 @@ void Sub3Judge41Mndg::dealJudgeItem() const TGpsInfo& gps1 = his1->real.gps; const std::string& ksdd = TableSysSet->get211(); + //调试代码 + if(gps.sj - m_lastDealTick > 5*SECOND) + { + m_lastDealTick = gps.sj; + + logtrace("mndg-tick-Op_Step=%d,ItemStatus=%d,Item=%d%d%d", m_itemv.Op_Step,m_itemv.ItemStatus, + m_itemv.ItemNo,m_itemv.SubWav1,m_itemv.SubWav2); + } + if(ksdd == siteof::zjnb) { if(cg->move == moveStop && sor.ssc == SNOT) @@ -260,7 +270,7 @@ void Sub3Judge41Mndg::dealJudgeItem() } else if(m_itemv.ItemNo == 100) //灯光结束 { - logtrace("sound-mndg-end"); + logtrace("mndg-item-end"); m_exam->TestPro = ItemProFlagEnd; if(m_car->isExamDrill()) //训练模式 { @@ -292,7 +302,7 @@ void Sub3Judge41Mndg::dealJudgeItem() } else { - logerror("mndg-error Op_Step=%d,ItemNo=%d,Status=%d",m_itemv.Op_Step, m_itemv.ItemNo, m_itemv.ItemStatus); + logerror("mndg-error-Op_Step=%d,ItemNo=%d,Status=%d",m_itemv.Op_Step, m_itemv.ItemNo, m_itemv.ItemStatus); } char buf[128] = {0}; @@ -363,18 +373,18 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() { if(MilliSecondsBetween(gps.sj, m_itemv.Lt_YJ_TM) < m_itemv.P_YJGD_JT_YS) { - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; m_itemv.Lt_YJ_TM = 0; m_itemv.Lt_YJ_cs++; //Inc(m_itemv.Lt_YJ_cs); //20150327 if(ksdd == siteof::shijiazhuang1001) { if(m_itemv.Lt_YJ_cs >= 2) { - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; } else { - m_itemv.Lt_Change[6] = "0"; + m_itemv.Lt_Change[6] = N0; } } @@ -382,9 +392,9 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() if(ksdd == siteof::gdjykm3 || ksdd == siteof::jiuquan) { if(m_itemv.Lt_YJ_cs == 2) - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; else - m_itemv.Lt_Change[6] = "0"; + m_itemv.Lt_Change[6] = N0; } } } @@ -422,26 +432,26 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() if(tm <= m_itemv.P_YJGD_JT_YS) { //(m_itemv.Snd_No = 2) and (m_itemv.Snd_No1 = 1) and (m_itemv.St=1) 超车 - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; m_itemv.Lt_YJ_TM = 0; //成功闪灯一次,远近关灯时间清空 m_itemv.Lt_YJ_cs++; //Inc(m_itemv.Lt_YJ_cs); if(ksdd == siteof::shijiazhuang1001) { if(m_itemv.Lt_YJ_cs >= 2) - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; else - m_itemv.Lt_Change[6] = "0"; + m_itemv.Lt_Change[6] = N0; } if(ksdd == siteof::gdjykm3 || ksdd == siteof::jiuquan) { if(m_itemv.Lt_YJ_cs == 2) { - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; } else { - m_itemv.Lt_Change[6] = "0"; + m_itemv.Lt_Change[6] = N0; } } } @@ -451,7 +461,7 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() //如果有闪灯信号,直接赋值就可以了(前提是要有硬件支持) if(sor.sde == SYES && sor1.sde == SNOT) { - m_itemv.Lt_Change[6] = "1"; + m_itemv.Lt_Change[6] = Y1; } //远光,近光, @@ -461,14 +471,14 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() { if(sor.ygd == SYES) { - m_itemv.Lt_Change[4] = "1"; + m_itemv.Lt_Change[4] = Y1; m_itemv.Lt_YJ_TM = 0; } else { if(sor.jgd == SYES) { - m_itemv.Lt_Change[5] = "1"; + m_itemv.Lt_Change[5] = Y1; m_itemv.Lt_YJ_TM = 0; } } @@ -500,12 +510,12 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() } if(Flag1 == true || Flag2 == true || Flag3 == true || Flag4 == true) { - m_itemv.Lt_Change[1] = "1"; + m_itemv.Lt_Change[1] = Y1; } //双跳, if(sor.shtd == SYES && sor1.shtd == SNOT) { - m_itemv.Lt_Change[2] = "1"; + m_itemv.Lt_Change[2] = Y1; } //雾灯, 20181015 @@ -513,12 +523,12 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() { if(sor.wd == SYES && sor1.wd == SNOT) { - m_itemv.Lt_Change[3] = "1"; + m_itemv.Lt_Change[3] = Y1; } } else { - m_itemv.Lt_Change[3] = "0"; + m_itemv.Lt_Change[3] = N0; } } } @@ -527,6 +537,8 @@ void Sub3Judge41Mndg::UpdateDengGuangChange() //0、统一调度 void Sub3Judge41Mndg::CallItemProc() { + logtrace("mndg-Op_Step CallItemProc"); + const TChuanGan* cg = m_car->historyChuanGan(); const TGpsInfo& gps = cg->real.gps; const TSensorInfo& sor = cg->real.sensor; @@ -539,7 +551,7 @@ void Sub3Judge41Mndg::CallItemProc() { if(sor.wd == SYES || sor.zfxd == SYES || sor.yfxd == SYES || sor.shtd == SYES /* || sor.shtd == SYES*/) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill()) { m_itemv.ItemNo = 0; @@ -582,7 +594,7 @@ void Sub3Judge41Mndg::CallItemProc() m_itemv.ItemNo = 100; } - logtrace("Op_Step=%d,ItemStatus=%d,Item=%d%d%d", m_itemv.Op_Step,m_itemv.ItemStatus, + logtrace("mndg-item-Op_Step=%d,ItemStatus=%d,Item=%d%d%d", m_itemv.Op_Step,m_itemv.ItemStatus, m_itemv.ItemNo,m_itemv.SubWav1,m_itemv.SubWav2); } } @@ -657,7 +669,7 @@ void Sub3Judge41Mndg::Open_DengGuang() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill()) { m_itemv.ItemNo = 0; @@ -676,7 +688,7 @@ void Sub3Judge41Mndg::Open_DengGuang() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill()) //20140722 { m_itemv.ItemNo = 0; @@ -1284,7 +1296,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() { for(size_t i = 0; i < m_itemv.Lt_Change.size(); i++) { - m_itemv.Lt_Change[i] = "0"; + m_itemv.Lt_Change[i] = N0; } m_itemv.Lt_YJ_TM = 0; @@ -1311,7 +1323,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() else if(m_itemv.ItemStatus == 3) //操作结果 { //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { //检查上一个灯光题目:是不是 “车辆发生故障” bool b5 = (m_itemv.LastSubItemNo == 5); @@ -1327,7 +1339,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() if(i == 2 || i == 3) { // //0:未定义 1:示宽, 2:双跳, 3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 if(m_itemv.SubWav1 == 2 || m_itemv.SubWav1 == 3) //按规则翻译,夜间超车相关的 @@ -1399,7 +1411,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() if(sor.zfxd == SYES && sor1.zfxd == SYES) { m_itemv.Cc_Jd = 1; - m_itemv.Lt_Change[6] = "0"; + m_itemv.Lt_Change[6] = N0; } //20171123 if(ksdd == siteof::guizhoubj && MilliSecondsBetween(gps.sj, m_itemv.Snd_Wav_End_TM) > m_itemv.P_zys) @@ -1442,7 +1454,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() } else if(m_itemv.Cc_Jd == 1) { - if(m_itemv.Lt_Change[6] == "1") + if(m_itemv.Lt_Change[6] == Y1) { m_itemv.Cc_Jd = 2; } @@ -1543,7 +1555,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() //雾天行驶 要判断双跳灯+雾灯 //检查灯光正确 //非特殊地点版本 - if(m_itemv.Lt_Change[6] == "1") + if(m_itemv.Lt_Change[6] == Y1) { if(m_itemv.Lt_LastChange_TM == 0) //灯光正确了 { @@ -1597,7 +1609,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() } //20171009 检查双跳灯 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { if(m_itemv.Lt_YesID) { @@ -1607,7 +1619,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() if(sor.shtd == SYES && sor1.shtd == SYES && sor2.shtd == SYES) { //Pub_Log('jt std:' + m_itemv.Lt_Change); - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -1654,7 +1666,7 @@ void Sub3Judge41Mndg::JiaoTi_DengGuang() } else { - if(m_itemv.Lt_Change[6] == "1") + if(m_itemv.Lt_Change[6] == Y1) { m_itemv.ItemNo = 0; } @@ -1710,8 +1722,9 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else if(m_itemv.ItemStatus == 3) { + std::string s(7, N0); //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { //检查上一个灯光题目:是不是 “车辆发生故障” bool b5 = (m_itemv.LastSubItemNo == 5); @@ -1730,7 +1743,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() //0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 if(i == 4 || (b5 == false && i == 6)) //20170527 20171009 { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { if(ksdd == siteof::shanghaikm3 || ksdd == siteof::jiuquan) { @@ -1752,7 +1765,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else if(m_itemv.SubWav1 == 5) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else @@ -1778,7 +1791,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else if(m_itemv.SubWav1 == 5) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } //20180129 @@ -1790,7 +1803,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } } @@ -1846,7 +1859,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - if(m_itemv.Lt_Change[5] == "1") //相当于近光灯持续了一段时间 + if(m_itemv.Lt_Change[5] == Y1) //相当于近光灯持续了一段时间 m_itemv.Lt_YesID = true; } } @@ -1866,13 +1879,13 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - if(m_itemv.Lt_Change[5] == "1") //相当于近光灯持续了一段时间 + if(m_itemv.Lt_Change[5] == Y1) //相当于近光灯持续了一段时间 m_itemv.Lt_YesID = true; } } } //20171009 检查双跳灯 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { if(m_itemv.Lt_YesID) { @@ -1881,7 +1894,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() const TSensorInfo& sor2 = m_car->historySensor(2); if(sor.shtd == SYES && sor1.shtd == SYES && sor2.shtd == SYES) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -1916,7 +1929,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() { if(m_itemv.SubWav1 == 3 && m_itemv.SubWav2 > 1) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill()) { m_itemv.ItemNo = 0; @@ -1951,7 +1964,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else if(m_itemv.SubWav1 == 5) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else @@ -1964,7 +1977,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 2) @@ -1979,7 +1992,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 4) @@ -1990,12 +2003,12 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 5) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } if(m_car->isQualified() || m_car->isExamDrill()) @@ -2027,7 +2040,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 2) @@ -2042,7 +2055,7 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 4) @@ -2053,12 +2066,12 @@ void Sub3Judge41Mndg::Open_JinGuangDeng() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } } else if(m_itemv.SubWav1 == 5) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } if(m_car->isQualified() || m_car->isExamDrill()) { @@ -2103,7 +2116,7 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() else if(m_itemv.ItemStatus == 3) { //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { //检查上一个灯光题目:是不是 “车辆发生故障” bool b5 = (m_itemv.LastSubItemNo == 5); @@ -2115,11 +2128,11 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() { //20171010 if(i != 4 && i != 1 && i != 6 && i != 5) //20140812 { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { if(m_itemv.SubWav1 == 2) //远光灯 20150126 { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } else { @@ -2142,11 +2155,11 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() { if(i != 4 && i != 1) //20140812 { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { if(m_itemv.SubWav1 == 2) //远光灯 20150126 { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } else { @@ -2180,7 +2193,7 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() } else { - if(m_itemv.Lt_Change[4] == "1") //相当于远光灯持续了一段时间 + if(m_itemv.Lt_Change[4] == Y1) //相当于远光灯持续了一段时间 { m_itemv.Lt_YesID = true; } @@ -2196,7 +2209,7 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() } } //20171009 检查双跳灯 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { if(m_itemv.Lt_YesID) { @@ -2205,7 +2218,7 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() const TSensorInfo& sor2 = m_car->historySensor(2); if(sor.shtd == SYES && sor1.shtd == SYES && sor2.shtd == SYES) { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2236,7 +2249,7 @@ void Sub3Judge41Mndg::Open_YuanGuangDeng() { if(m_itemv.SubWav1 == 2) //远光灯 20150126 { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); } else { @@ -2285,7 +2298,7 @@ void Sub3Judge41Mndg::CheLiangGuZhang() { const std::string& s421 = TableSysSet->get421(); //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { for(int i = 1; i <= 6; i++) { @@ -2295,7 +2308,7 @@ void Sub3Judge41Mndg::CheLiangGuZhang() ////0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 if(i == 3) { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 if(m_itemv.SubWav1 == 1) @@ -2323,7 +2336,7 @@ void Sub3Judge41Mndg::CheLiangGuZhang() { if(i != 1 && i != 2 && i != 6) { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 if(ksdd == siteof::guizhouzy) @@ -2355,7 +2368,7 @@ void Sub3Judge41Mndg::CheLiangGuZhang() if((ksdd == siteof::jiuquan && i != 1 && i != 5) || (ksdd != siteof::jiuquan && i != 1 && i != 2 && i != 5)) //之前判断方法 //20170809 { ////0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 if(m_itemv.SubWav1 == 1) @@ -2381,7 +2394,7 @@ void Sub3Judge41Mndg::CheLiangGuZhang() if(i != 1 && i!= 2 && i != 5) //20140923 新增不判远光灯 { ////0:未定义 1:示宽,2:双跳,3:雾灯,4:远光,5:近光,6:交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 if(m_itemv.SubWav1 == 1) @@ -2558,17 +2571,17 @@ void Sub3Judge41Mndg::GuZhangJieChu() else if(m_itemv.ItemStatus == 3) { //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { //示宽,双跳,雾灯,远光,近光,交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 for(int i = 1; i <= 6; i++) { if(i == 3) { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2612,7 +2625,7 @@ void Sub3Judge41Mndg::GuZhangJieChu() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2653,17 +2666,17 @@ void Sub3Judge41Mndg::CloseAllDengGuang() else if(m_itemv.ItemStatus == 3) { //检查灯光错误 - if(m_itemv.P_IF_Err_Kf) + if(m_itemv.P_IF_Err_Kf && m_itemv.Lt_Change != m_itemv.Lt_Change_Last) { for(int i = 1; i <= 6; i++) { //示宽,双跳,雾灯,远光,近光,交替, 注意:记录灯光的变化,示宽是从有到无,其他是从无到有 if(i == 3) { - if(m_itemv.Lt_Change[i] == "1") + if(m_itemv.Lt_Change[i] == Y1) { //打错灯了 - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2707,7 +2720,7 @@ void Sub3Judge41Mndg::CloseAllDengGuang() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2786,7 +2799,7 @@ void Sub3Judge41Mndg::WuTianXingShi() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2806,7 +2819,7 @@ void Sub3Judge41Mndg::WuTianXingShi() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2826,7 +2839,7 @@ void Sub3Judge41Mndg::WuTianXingShi() } else { - JUDGE_MARK_SUB3(41, "01", true); + JUDGE_MARK_SUB3(41, "01", false); if(m_car->isQualified() || m_car->isExamDrill() || ksdd == siteof::hebtest) { m_itemv.ItemNo = 0; @@ -2959,9 +2972,11 @@ void Sub3Judge41Mndg::CSH_DengGuangSubItem() { for(size_t i = 0; i < m_itemv.Lt_Change.size(); i++) { - m_itemv.Lt_Change[i] = "0"; + m_itemv.Lt_Change[i] = N0; } + m_itemv.Lt_Change_Last = m_itemv.Lt_Change; + m_itemv.Lt_YJ_TM = 0; m_itemv.Lt_YJ_cs = 0; //20150327 } @@ -3014,7 +3029,7 @@ void Sub3Judge41Mndg::playSoundEnd(const std::string& code) m_itemv.Snd_Wav_End_TM = gps.sj; CSH_DengGuangSubItem(); m_itemv.ItemStatus = m_itemv.ItemStatus + 1; - logtrace("sound-end code=%s", code.c_str()); + logtrace("mndg-sound-end code=%s", code.c_str()); } } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h index 0850a31d..1937c503 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge41Mndg.h @@ -212,6 +212,10 @@ protected: void playSound(const std::string& kind, int SubWav1, int SubWav2); private: + + #define Y1 ('1') + #define N0 ('0') + TSub3Item41Mndg m_itemv; std::map m_lights; //HeFaDengGuangDataList //加载合法的灯光 //参考头文件注释说明[灯光类型] @@ -220,6 +224,8 @@ private: // 四套灯光语音,随机播放任意一套作为考试题目 const std::string m_s383arg = "0^1^4^"; //383参数 新模拟夜间(次数^错扣^固定^) + int64 m_lastDealTick = 0; + //bool PlaySnd_ID = false; //正在播报语音标志 //int PlaySnd_Cnt = 0, PlaySnd_Cnt1 = 0; //std::set g_lstsound; diff --git a/entry/src/main/cpp/sdk/parser/XParser.cpp b/entry/src/main/cpp/sdk/parser/XParser.cpp index fa530788..2e261a2c 100644 --- a/entry/src/main/cpp/sdk/parser/XParser.cpp +++ b/entry/src/main/cpp/sdk/parser/XParser.cpp @@ -302,6 +302,15 @@ bool XParser::parsePerform(const std::string& data, TPerformData& info) //CHECK_GET_PARAM(lane, "xxxxx", info.lane.Body_RB_ToRightEdge); //车轮相交的形状线号 CHECK_GET_PARAM(lane, "CrossPointNo", info.lane.CrossPointNo); + //20240730 增加 yhy + CHECK_GET_PARAM(lane, "TouchLineDirCS", info.lane.TouchLineDirCS); + CHECK_GET_PARAM(lane, "BackPointLaneNo", info.lane.BackPointLaneNo); + CHECK_GET_PARAM(lane, "BackPointLaneCount", info.lane.BackPointLaneCount); + CHECK_GET_PARAM(lane, "Body_RF_ToBaseLine", info.lane.Body_RF_ToBaseLine); + CHECK_GET_PARAM(lane, "Body_RB_ToBaseLine", info.lane.Body_RB_ToBaseLine); + CHECK_GET_PARAM(lane, "DirInverse", info.lane.DirInverse); + CHECK_GET_PARAM(lane, "ShapeNoWheel", info.lane.ShapeNoWheel); + } return true; @@ -381,6 +390,15 @@ std::string XParser::toDataString(const TPerformData& data) //set(lane, "xxxxx", data.lane.Body_RB_ToRightEdge); //车轮相交的形状线号 set(lane, "CrossPointNo", data.lane.CrossPointNo); + //20240730 增加 yhy + set(lane, "TouchLineDirCS", data.lane.TouchLineDirCS); + set(lane, "BackPointLaneNo", data.lane.BackPointLaneNo); + set(lane, "BackPointLaneCount", data.lane.BackPointLaneCount); + set(lane, "Body_RF_ToBaseLine", data.lane.Body_RF_ToBaseLine); + set(lane, "Body_RB_ToBaseLine", data.lane.Body_RB_ToBaseLine); + set(lane, "DirInverse", data.lane.DirInverse); + set(lane, "ShapeNoWheel", data.lane.ShapeNoWheel); + root["lane"] = lane; } @@ -629,8 +647,15 @@ bool XParser::get(Json::Value& object, const char* key, TEventItemMark& store, c bool XParser::get(Json::Value& object, const char* key, TEventExamFinish& store, const TEventExamFinish& defaults) noexcept { CHECK_GET_OBJECT({ + CHECK_GET_PARAM(value, "type", store.type); CHECK_GET_PARAM(value, "qjjl", store.qjjl); CHECK_GET_PARAM(value, "dcjl", store.dcjl); + CHECK_GET_PARAM(value, "d1", store.d1); + CHECK_GET_PARAM(value, "d2", store.d2); + CHECK_GET_PARAM(value, "d3", store.d3); + CHECK_GET_PARAM(value, "d4", store.d4); + CHECK_GET_PARAM(value, "d5", store.d5); + CHECK_GET_PARAM(value, "d6", store.d6); }); return true; } @@ -1414,6 +1439,7 @@ inline bool XParser::set(Json::Value& object, const char* key, const TEventItemM set(value, "xmdm", store.xmdm); set(value, "kfdm", store.kfdm); set(value, "markcatalog", store.markcatalog); + set(value, "type", store.type); object[key] = value; return true; } @@ -1421,8 +1447,15 @@ inline bool XParser::set(Json::Value& object, const char* key, const TEventItemM inline bool XParser::set(Json::Value& object, const char* key, const TEventExamFinish& store) noexcept { Json::Value value; + set(value, "type", store.type); set(value, "qjjl", store.qjjl); set(value, "dcjl", store.dcjl); + set(value, "d1", store.d1); + set(value, "d2", store.d2); + set(value, "d3", store.d3); + set(value, "d4", store.d4); + set(value, "d5", store.d5); + set(value, "d6", store.d6); object[key] = value; return true; } diff --git a/entry/src/main/cpp/sdk/track/TrackReader.cpp b/entry/src/main/cpp/sdk/track/TrackReader.cpp index 862298a8..a54a2bd6 100644 --- a/entry/src/main/cpp/sdk/track/TrackReader.cpp +++ b/entry/src/main/cpp/sdk/track/TrackReader.cpp @@ -76,7 +76,7 @@ bool TrackReader::read(TTrackData::Ptr& data) data->type = TTrackTypeRealExam; } else if(root.isMember("method") && root["method"].asString() == "examJudgeArtificialMark" && - root.isMember("itemno") && root.isMember("serial")) + root.isMember("itemno") && root.isMember("serial") && root.isMember("type") ) { data->type = TTrackTypeArtificialMark; } diff --git a/entry/src/main/cpp/sdk/utility/HBean.h b/entry/src/main/cpp/sdk/utility/HBean.h index d92c9dce..88d5683b 100644 --- a/entry/src/main/cpp/sdk/utility/HBean.h +++ b/entry/src/main/cpp/sdk/utility/HBean.h @@ -80,7 +80,7 @@ JUDGE_C_API const char* ExamEventType2Desc(ExamEventType code); JUDGE_C_API ExamEventType Name2ExamEventType(const char* name); //******注意顺序不能变,这个类型要传给上层APP调用方的***杨海洋2023-07-04*** -//考车移动状态 +//考车移动状态,***注意:枚举不能变,和外壳有对应关系 enum CarMoveState { moveInvalid = -2, //无效未知的状态 @@ -89,35 +89,35 @@ enum CarMoveState moveForward = 1, //前进状态 }; -//考试模式(0:训练 1:考试) +//考试模式(0:训练 1:考试)***注意:枚举不能变,和外壳有对应关系 enum ExamMode { examModeDrill = 0, //0:训练 examModeExam = 1, //1:考试 }; -//是否轨迹(回放)(0:否 1:是) +//是否轨迹(回放)(0:否 1:是)***注意:枚举不能变,和外壳有对应关系 enum TrackReplayType { - TrackReplayTypeNot = 0, //0:否 - TrackReplayTypeYes = 1, //1:是 + TrackReplayNot = 0, //0:否 + TrackReplayYes = 1, //1:是 }; -//传感信号 +//传感信号,***注意:枚举不能变,和外壳有对应关系 enum SensorSignal { SNOT = 0, //传感无信号 SYES = 1, //传感有信号 }; -//考试科目类型定义 +//考试科目类型定义,注意:枚举不能变,和外壳有对应关系 enum ExamSubject { ExamSubject2 = 2, //科目二 ExamSubject3 = 3, //科目三 }; -//人工项目操作类型 +//人工项目操作类型,***注意:枚举不能变,和外壳有对应关系 enum ArtifItemType { ArtifItemTypeAuto = 0, @@ -126,13 +126,29 @@ enum ArtifItemType ArtifItemTypeEnd = 3, }; -//语音播报类型 +//扣分类型,***注意:枚举不能变,和外壳有对应关系 +enum MarkType +{ + MarkTypeAuto = 0, //0:评判自动扣分 + MarkTypeArti = 1, //1:人工扣分 + MarkTypeRemote = 2, //2:远程扣分 +}; + +//考试结束类型,***注意:枚举不能变,和外壳有对应关系 +enum ExamFinishType +{ + ExamFinishAuto = 0, //0:评判自动结束 + ExamFinishArti = 1, //1:人工结束 +}; + +//语音播报类型,***注意:枚举不能变,和外壳有对应关系 enum PlaySoundType { PlaySoundDefault = 0, //0:默认 PlaySoundEndNotify = 1, //1:表示是模拟灯光项目的语音,语音播报结束需要调用examJudgeSoundEnd通知评判。 }; + //Tag1=0-无标线 //Tag1=1-中心线(黄色实线) //Tag1=2-道路分界线(虚线) diff --git a/entry/src/main/cpp/sdk/utility/HTypes.h b/entry/src/main/cpp/sdk/utility/HTypes.h index eaf03492..79606121 100644 --- a/entry/src/main/cpp/sdk/utility/HTypes.h +++ b/entry/src/main/cpp/sdk/utility/HTypes.h @@ -703,12 +703,20 @@ struct TEventItemMark int32 xmdm = Sub2ItemTypeInvalid; //项目代码 对应枚举 ExamItemCode std::string kfdm; //扣分代码 对应markserial std::string markcatalog; //无锡所标准扣分代码 + int32 type = MarkTypeAuto; //扣分类型,评判自动、人工、远程 }; struct TEventExamFinish { - int32 qjjl = 0; //累计前进距离 单位厘米 - int32 dcjl = 0; //累计倒车距离 单位厘米 + int32 type = ExamFinishAuto; //考试结束类型 + int32 qjjl = 0; //累计前进距离 单位厘米 + int32 dcjl = 0; //累计倒车距离 单位厘米 + int32 d1 = 0; //1档档位行驶距离,单位厘米 + int32 d2 = 0; + int32 d3 = 0; + int32 d4 = 0; + int32 d5 = 0; + int32 d6 = 0; }; struct TEventSound @@ -842,6 +850,17 @@ struct TRTKResult int CrossPointNo = 0; //穿越点 + + //20240730 新增 还没计算 + int TouchLineDirCS = 0; //车身碰线 车身碰线方向 + int BackPointLaneNo = 0; //后点车道 后点所在车道号 + int BackPointLaneCount = 0; //后点车道 后点天线共有几股车道 + int Body_RF_ToBaseLine = 0; //右前车身边线 指车身离右侧路边缘线距离 + int Body_RB_ToBaseLine = 0; //右后车身边线 指车身离右侧路边缘线距离 + + int DirInverse = 0; //车道属性 是否逆向行驶 + int ShapeNoWheel = 0; //形状 车轮相交的形状线号 + #ifdef JUDGE_USE_INSPECT std::string BodySharpData; //解决无锡所路口左转227a用例误判问题 #endif @@ -1293,6 +1312,28 @@ struct TTestCtl bool Dw_Cgd_OK = false; }; +struct TPubKM3 +{ + int m_KsZgDw = 0; //记录考试中的最高档位 + int m_KsZgSs = 0; //记录考试中的最高时速 + int m_KsLjLc = 0; //记录考试累计里程(米) + + int PubLastChuanYuePtNo = 0; //最后一次经过的点 + int PubLastChuanYuePt_JLCM = 0; //最后一次经过的点偏移量 + + int NJ_DiaoTou_JL = 0; //个性需求 + int64 ChaoChe_Start_TM = 0; //2018011 超车开始时间 + int64 ChaoChe_End_TM = 0; //2018011 超车结束时间 + int PUB_JDCC_ZT = 0; //借道超车状态 0:非借道 1:表示超车 2:表示正在返回原车道 3:回原车道道完成 20180227 + bool yjdg_road_code_kf = false; + + int Pub_JSC_JL = 0; + bool PubCanJudge_XiHuoFlag = true; //注意初始必须是true + int PubKaoBianTCFinish_LJJL = 0; + + int m_SNO = 0; +}; + /* //后面去掉可能没用了 struct TCarStatus diff --git a/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp b/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp index 00ecf201..7a1b0302 100644 --- a/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp +++ b/entry/src/main/cpp/toolkit/replay/ReplayWrapper.cpp @@ -371,8 +371,6 @@ void ReplayWrapper::replayTrackTypeArtificialItem(const TTrackData::Ptr& data) void ReplayWrapper::replayTrackTypeSoundEnd(const TTrackData::Ptr &data) { - //return; //240709 - Json::Value root; bool ok = Tools::fromJson(data->data, root); TASSERT(ok, ""); diff --git a/entry/src/main/cpp/toolkit/ui/MainWindow.cpp b/entry/src/main/cpp/toolkit/ui/MainWindow.cpp index b374e027..ac426473 100644 --- a/entry/src/main/cpp/toolkit/ui/MainWindow.cpp +++ b/entry/src/main/cpp/toolkit/ui/MainWindow.cpp @@ -52,15 +52,6 @@ void MainWindow::init() KIT_CONNECT(updateDataFrameNum(int, int)); KIT_CONNECT(updateNextDoing()); - connect(&m_audio, &QMediaPlayer::stateChanged, [=](QMediaPlayer::State state) - { - if(state == QMediaPlayer::StoppedState) - { - //examJudgeSoundEnd(); - //logtrace("examJudge-SoundEnd"); - } - }); - 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); @@ -1122,7 +1113,7 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) m_parser->parseJudgeData(org, value); ExamEventType eventType = (ExamEventType)value.event; - std::string time = toEasyTime(Tools::nowTime()); //value.sj 240709 + std::string time = toEasyTime(value.sj); std::string desc = ExamEventType2Desc(eventType); //loginfo("recv time=%s, event=%s", time.c_str(), desc.c_str()); @@ -1200,16 +1191,11 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) } else if(eventType == ExamEventTypeSound) { - const TEventSound& sound = value.sound; - int itemNo = sound.xmdm; - QString s = QString::fromUtf8(sound.code.c_str()); - QString text = event + getItemText(itemNo) + CL8(",语音代码:") + s + CL8(",语音类型:")+kit::toString(sound.type); + 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); - if(sound.xmdm == Sub3ItemType41Mndg && sound.type == PlaySoundEndNotify) - { - examJudgeSoundEnd(sound.xmdm, sound.code.c_str(),sound.type); //240709 - } } else if(eventType == ExamEventTypeLight) { @@ -1218,10 +1204,6 @@ void MainWindow::updateDataCallbackRealExam(const QString& info) QString text = event + ",[" + s +"]"; updateExamEvent(text); } - else if(eventType == ExamEventTypeLane) - { - const TEventLane& lane = value.lane; - } else { QString text = event + ""; @@ -1333,6 +1315,7 @@ void MainWindow::updateDataCallbackPerform(const QString& info) m_ui->PubLastChuanYuePtNo->setText(CL8("穿越点=") + kit::toString(PubLastChuanYuePtNo)); m_ui->PubLastChuanYuePtNo->setStyleSheet("color:#FF0000;"); + std::string aaasss = cg->MapPoint_Road_Code; m_ui->MapRoad->setText(CL8("MapRoad:") + kit::toString(RTKKM3.MapRoad_Name) + CL8(" Point路段:") + kit::toString(cg->MapPoint_Road_Code)); m_ui->MapRoad->setStyleSheet("color:#FF0000;"); diff --git a/entry/src/main/ets/api/judge.ts b/entry/src/main/ets/api/judge.ts index 861f4901..9a9a27f8 100644 --- a/entry/src/main/ets/api/judge.ts +++ b/entry/src/main/ets/api/judge.ts @@ -1,33 +1,58 @@ import request from "../common/utils/request" -import {getCurrentTime} from '../common/utils/tools' +import { getCurrentTime } from '../common/utils/tools' +import { getSyncData } from '../common/service/initable'; +import writeObjectOutNew from './judgeNew' +import FileLog from '../pages/judgeSDK/utils/fileLog'; +let baseHost = globalThis.host; -// const baseHost = 'http://192.168.36.2:8081'; -const baseHost = 'http://112.80.35.83:11051'; // 下载模型 -export async function download(){ +export async function download() { return await request({ - host:baseHost, - url:'/para/initEsModel.ws', - method:'post', - xml:false + host: baseHost, + url: '/para/initEsModel.ws', + method: 'post', + xml: false }) } // 通用监管接口 -export async function writeObjectOut(params):Promise{ +export async function writeObjectOut(params): Promise { const singlePlay = globalThis.singlePlay - if(singlePlay){ - return + if (singlePlay) { + return 1 } - const {xtlb,jkxlh,jkid,drvexam} = params; - const {lsh,kskm,sfzmhm,ksxm,sbxh,kchp,kssj} = drvexam; + + //获取监管接口地址路径 + if (!globalThis.JGPATH) { + const syssetParams = await getSyncData('MA_SYSSET') || []; + //@ts-ignore + syssetParams.forEach(sys => { + if (sys.v_no == '839') { + //是否是新监管 + globalThis.isJGNew = sys.v_value == '3' + } + if (sys.v_no == '900') { + globalThis.JGHOST = validateIP(decodeURIComponent(sys.v_value)) + } + }) + } + const {xtlb,jkxlh,jkid,drvexam} = params; + //新监管调用 + if (globalThis.isJGNew) { + return await writeObjectOutNew(params) + } + + const fileLog = new FileLog(globalThis.context) + const drvexamArrs = Reflect.ownKeys(drvexam).map((key: string) => (`<${key}>${drvexam[key]}`)); + fileLog.setExamJudgeWuxiData(JSON.stringify({ + xtlb,jkxlh,jkid,drvexam + })) //对象转换成xml - const drvexamArrs = Reflect.ownKeys(drvexam).map((key:string) => (`<${key}>${drvexam[key]}`)) - return await request({ - host:baseHost, - url:'/dems_ws/services/TmriOutAccess?wsdl', - data:` + const temp = await request({ + host: globalThis.JGHOST, + url: '/dems_ws/services/TmriOutAccess?wsdl', + data: ` { `, - method:'post', - xml:true + method: 'post', + xml: true }) + return temp } // 过程文件上传 -export async function uploadExamProgressData(params){ +export async function uploadExamProgressData(params) { const singlePlay = globalThis.singlePlay const {carId,examinationRoomId,type,time,cardNo,examData,examStartTime,examEndTime} = params - if(singlePlay){ + if (singlePlay) { return } return await request({ - url:'/der2/services/exam/uploadExamDataFile.ws', - data:` + url: '/der2/services/exam/uploadExamDataFile.ws', + data: ` @@ -78,50 +104,62 @@ export async function uploadExamProgressData(params){ ${examEndTime} `, - method:'post', - xml:true + method: 'post', + xml: true }) } // 上传考试里程 -export async function uploadExamMileage(params){ +export async function uploadExamMileage(params) { const singlePlay = globalThis.singlePlay - if(singlePlay){ + if (singlePlay) { return } - const paramsArrs = Reflect.ownKeys(params).map((key:string) => (`<${key}>${params[key]}`)) const time = await getCurrentTime() + return await request({ - url:'/der2/services/exam/uploadExamMileage.ws', - data:` + url: '/der2/services/exam/uploadExamMileage.ws', + data: ` - ${paramsArrs} + ${params.carId} + ${params.examinationRoomId} + ${params.lsh} + ${params.examinationRoomId} + ${params.kslc} `, - method:'post', - xml:true + method: 'post', + xml: true }) } + // 上传考试成绩 -export async function uploadExamGrade(params){ +export async function uploadExamGrade(params) { const singlePlay = globalThis.singlePlay - if(singlePlay){ + if (singlePlay) { return } - const paramsArrs = Reflect.ownKeys(params).map((key:string) => (`<${key}>${params[key]}`)) + const paramsArrs = Reflect.ownKeys(params).map((key: string) => (`<${key}>${params[key]}`)) const time = await getCurrentTime() return await request({ - url:'/der2/services/exam/uploadExamGrade.ws', - data:` + url: '/der2/services/exam/uploadExamGrade.ws', + data: ` ${paramsArrs} `, - method:'post', - xml:true + method: 'post', + xml: true }) } + +function validateIP(path: string) { + const reg = new RegExp(/(\w+):\/\/([^/:]+)(:\d*)?/) + const result = path.match(reg); + return result[0] +} + diff --git a/entry/src/main/ets/api/judgeNew.ts b/entry/src/main/ets/api/judgeNew.ts new file mode 100644 index 00000000..ecc2a8b5 --- /dev/null +++ b/entry/src/main/ets/api/judgeNew.ts @@ -0,0 +1,194 @@ +import { getSyncData } from '../common/service/initable'; +import request from "../common/utils/request" +let baseHost = globalThis.host; +import FileLog from '../pages/judgeSDK/utils/fileLog'; + +//新监管接口 + + +//监管接口序列号映射 +const gjxlhObj = { + '17C51': '02-21-000009', + '17C52': '02-21-000010', + '17C53': '02-21-000011', + '17C54': '02-21-000012', + '17C55': '02-21-000013', + '17C56': '02-21-000014', +} + +export default async function writeObjectOutNew(data): Promise { + const {jkid , drvexam} = data; + const basic = await getBasicConfig(jkid); + const params = await getParams(jkid, drvexam); + const {wglb,jkxlh,glbm,jgbh,sjbs} = basic; + + return await request({ + host: globalThis.JGHOST, + method: 'post', + //是否是新中心 + isNewCenter: true, + xml: true, + url: '/dems_ws/services/TmriOutAccess?wsdl', + data: ` + + + + ${wglb} + ${jkxlh} + ${glbm} + ${jgbh} + ${sjbs} + ${JSON.stringify(params.data)} + ${JSON.stringify(params.file)} + + + `, + }) +} + +export async function getParams(jkid, drvexam) { + const examSubject = globalThis.carInfo.examSubject; + switch (jkid) { + //开始考试 + case '17C51': + return { + data: { + sjbs: gjxlhObj[jkid], + param: { + sfzmhm: drvexam.sfzmhm, + kchp: decodeURI(drvexam.kchp), + kskm: examSubject, + ksxl: examSubject == 3 ? drvexam.ksxl : undefined, + kssj: drvexam.kssj + } + }, + file: { + sjbs: gjxlhObj[jkid], + param: [{ field: '', data: examSubject == 2 ? encodeURIComponent(drvexam.zp) : drvexam.zp }] + } + } + //项目开始 + case '17C52': + return { + data: { + sjbs: gjxlhObj[jkid], + param: { + sfzmhm: drvexam.sfzmhm, + kskm: drvexam.kskm, + ksxm: drvexam.ksxm, + ksxl: examSubject == 3 ? drvexam.ksxl : undefined, + kchp: decodeURI(drvexam.kchp), + //TODO 待验证 科目三无 + sbbh: examSubject == 3 ? undefined : drvexam.sbxh, + kssj: drvexam.kssj + } + }, + file: { + sjbs: gjxlhObj[jkid], + param: [{ field: '', data: '' }] + } + } + //扣分 + case '17C53': + return { + data: { + sjbs: gjxlhObj[jkid], + param: { + kffs: drvexam.kffs, + kfsj: drvexam.kfsj, + kfxm: drvexam.kfxm, + kfxmmx: drvexam.kfxmmx, + kskm: examSubject, + ksxm: drvexam.ksxm, + sfzmhm: drvexam.sfzmhm + } + }, + file: { + sjbs: gjxlhObj[jkid], + param: [{ field: '', data: '' }] + } + } + //过程照片 + case '17C54': + return { + data: { + sjbs: gjxlhObj[jkid], + param: { + cs: drvexam.cs, + kskm: drvexam.kskm, + ksxm: drvexam.ksxm, + sfzmhm: drvexam.sfzmhm, + zpsj: drvexam.zpsj + } + }, + file: { + sjbs: gjxlhObj[jkid], + param: [{ field: '', data: examSubject == 2 ? encodeURIComponent(drvexam.zp) : drvexam.zp }] + } + } + //项目结束 + case '17C55': + return { + data: { + param: { + czlx: drvexam.czlx, + jssj: drvexam.jssj, + kskm: examSubject, + ksxl: drvexam.ksxl, + ksxm: drvexam.ksxm, + sfzmhm: drvexam.sfzmhm + }, + sjbs: gjxlhObj[jkid], + }, + file: { sjbs: gjxlhObj[jkid], param: [{ field: '', data: '' }] } + } + //考试结束 + case '17C56': + return { + data: { + sjbs: gjxlhObj[jkid], + param: { + dwlc: drvexam.dwlc, + ghks: "0", + jssj: drvexam.jssj, + kscj: drvexam.kscj, + kskm: examSubject, + kslc: drvexam.kslc, + sfzmhm: drvexam.sfzmhm + }, + }, + file: { sjbs: gjxlhObj[jkid], param: [{ field: '', data: drvexam.zp }] } + } + + default: + return {} + } +} + +//获取基础信息 +async function getBasicConfig(jkid) { + const examSubject = globalThis.carInfo.examSubject; + const syssetParam = await getSyncData('MA_SYSSET'); + let syssetObj = {}; + //@ts-ignore + syssetParam.forEach(sys => { + syssetObj[sys.v_no] = decodeURIComponent(sys.v_value) + }); + + return { + //外挂类别 + wglb: examSubject == 2 ? "700203" : "700204", + //监管接口序列号 + jkxlh: syssetObj['901'], + //管理部门 + glbm: syssetObj['903'], + //考场序号 + jgbh: syssetObj['905'], + //接口id + sjbs: gjxlhObj[jkid], + } +} \ No newline at end of file diff --git a/entry/src/main/ets/api/userInfo.ts b/entry/src/main/ets/api/userInfo.ts index e8e372fc..8db7e169 100644 --- a/entry/src/main/ets/api/userInfo.ts +++ b/entry/src/main/ets/api/userInfo.ts @@ -47,6 +47,7 @@ export async function examinationStuAbsent(params) { }) } +//获取断点续考 export async function getExaminationItem(params) { return await request({ url: '/der2/services/exam/getExaminationItem.ws', diff --git a/entry/src/main/ets/common/constants/USER.ts b/entry/src/main/ets/common/constants/USER.ts index 2b847459..e9000a73 100644 --- a/entry/src/main/ets/common/constants/USER.ts +++ b/entry/src/main/ets/common/constants/USER.ts @@ -25,8 +25,8 @@ CommonConstants { */ static readonly ACCOUNT_TABLE = { tableName: 'USER', - sqlCreate: 'CREATE TABLE IF NOT EXISTS USER(id INTEGER PRIMARY KEY AUTOINCREMENT,sfzmhm TEXT,xm CHAR(20), lsh TEXT, kszp TEXT,ksdd TEXT,kssycs TEXT,kslx TEXT,kscx TEXT)', - columns: ['id','sfzmhm','xm','lsh','kszp','ksdd','kssycs','kslx','kscx'] + sqlCreate: 'CREATE TABLE IF NOT EXISTS USER(id INTEGER PRIMARY KEY AUTOINCREMENT,sfzmhm TEXT,xm CHAR(20), lsh TEXT, kszp TEXT,ksdd TEXT,kssycs TEXT,kslx TEXT,kscx TEXT,ksxl TEXT)', + columns: ['id','sfzmhm','xm','lsh','kszp','ksdd','kssycs','kslx','kscx','ksxl'] }; /** diff --git a/entry/src/main/ets/common/service/terminalService.ts b/entry/src/main/ets/common/service/terminalService.ts index 2511aa70..e05ddfe3 100644 --- a/entry/src/main/ets/common/service/terminalService.ts +++ b/entry/src/main/ets/common/service/terminalService.ts @@ -10,6 +10,9 @@ import FileUtil from '../../common/utils/File' export async function getDeviceInfo(context) { // globalThis.deviceNo = '153216400880'; //科目三设备 globalThis.deviceNo = '150667400235'; //科目三设备 + // globalThis.deviceNo = 'MAC-36E6575F'; //杭州科目二设备 489 + // globalThis.deviceNo = 'MAC-C57C8966'; //杭州科目二设备 + return return new Promise(async (resolve, reject) => { const fileUtil = new FileUtil(context) diff --git a/entry/src/main/ets/common/utils/request.ts b/entry/src/main/ets/common/utils/request.ts index 917ecfcb..cef78b68 100644 --- a/entry/src/main/ets/common/utils/request.ts +++ b/entry/src/main/ets/common/utils/request.ts @@ -21,13 +21,13 @@ let httpRequest = http.createHttp(); */ export default async function request(req: any) { - const {url,params = {},data = {},xml,method = 'get',host} = req; + const {url,params = {},data = {},xml,method = 'get',host,isNewCenter = false} = req; const options = { method: http.RequestMethod[method.toUpperCase()], header: { 'Content-Type': xml ? 'text/xml' : 'application/json' }, - extraData: xml?data:JSON.stringify(data) + extraData: xml ? data : JSON.stringify(data) } //params转url拼接参数 let paramsStr = Reflect.ownKeys(params).reduce((p: string, n: string) => (`${p}${n}=${params[n]}&`), '?') || ''; @@ -36,14 +36,9 @@ export default async function request(req: any) { paramsStr = paramsStr.substring(0, paramsStr.length-1) try { let baseUrl=host?host:globalThis.host - // let baseUrl=host?config.csptHost:config.host' - console.info('surenjun',baseUrl) const {result,responseCode} = await httpRequest.request(`${baseUrl}${url}${paramsStr}`, options); - console.log('daihai5') let res:any = xml ? xmlToJson(result,url) : result; - console.log('daihai55') - console.log('响应头地址' + JSON.stringify(res)) let resObj = null; if(typeof res === "string"){ @@ -53,11 +48,7 @@ export default async function request(req: any) { //处理中心服务code if(res.Envelope){ const msgXml = res.Envelope.Body.writeObjectOutResponse.return; - console.log('daihai6') - - const dd = handleCenterCode(msgXml); - console.log('daihai7') - + const dd = handleCenterCode(msgXml,isNewCenter); return dd } @@ -86,6 +77,7 @@ export default async function request(req: any) { }); } } catch (e) { + console.info('surenjun',JSON.stringify(e)) if(!e||!(e?.message)){ return false } @@ -130,7 +122,24 @@ function xmlToJson(result,url) { } //处理中心服务code -function handleCenterCode(msgXml){ +function handleCenterCode(msgXml,isNewCenter){ + //新监管 + if(isNewCenter){ + const msg = JSON.parse(msgXml); + const result = msg?.data[0]?.result; + if(result){ + const {code,message} = result + if(code != '1'){ + prompt.showToast({ + message, duration: 3000 + }); + return + }else{ + return code + } + } + } + //正则匹配code message字段 const [code,message] = [/(.*)<\/code>/i,/(.*)<\/message>/i].map(pattern=>{ const patternArr = pattern.exec(msgXml); @@ -139,7 +148,7 @@ function handleCenterCode(msgXml){ if(code === ''){ prompt.showToast({ - message: decodeURIComponent(message), + message: decodeURIComponent(message as string), duration: 3000 }); return diff --git a/entry/src/main/ets/entryability/EntryAbility.ts b/entry/src/main/ets/entryability/EntryAbility.ts index 07c6b125..a85e910d 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ts +++ b/entry/src/main/ets/entryability/EntryAbility.ts @@ -56,8 +56,8 @@ export default class EntryAbility extends UIAbility { const windowClass = await windowStage.getMainWindow(); globalThis.windowClass = windowClass // await windowClass.setWindowLayoutFullScreen(true) - // await windowClass.setWindowSystemBarEnable([]) //全屏 - await windowClass.setWindowSystemBarEnable(['navigation']) + await windowClass.setWindowSystemBarEnable([]) //全屏 + // await windowClass.setWindowSystemBarEnable(['navigation']) windowStage.loadContent('pages/Index', (err, data) => { if (err.code) { diff --git a/entry/src/main/ets/mock/SignDisplay.ets b/entry/src/main/ets/mock/SignDisplay.ets index b8344fdb..3e27eecc 100644 --- a/entry/src/main/ets/mock/SignDisplay.ets +++ b/entry/src/main/ets/mock/SignDisplay.ets @@ -64,4 +64,24 @@ export const GPSData = [ { key: '经度', value: '0' }, { key: '纬度', value: '0' }, { key: '速度', value: '0' }, -] \ No newline at end of file +] + +export const RoadData = [ + {name:'路段组号',key:'MapRoad_Code_No'}, + {name:'路段编码',key:'MapRoad_Name'}, + {name:'车轮压线',key:['TouchLineType','TouchDir']}, + {name:'车身碰线',key:['TouchLineTypeCS','TouchLineDirCS']}, + {name:'基准车道',key:['BasePointInLaneNo','BaseLaneCount']}, + {name:'前点车道',key:['FrontPointLaneNo','FrontPointLaneCount']}, + {name:'后车点道',key:[]}, + {name:'左前/后车身距离',key:['Body_LF_ToLeftEdge','Body_LB_ToLeftEdge']}, + {name:'右前/后车身距离',key:['Body_RF_ToRightEdge','Body_RB_ToRightEdge']}, + {name:'右前/后车身边线',key:[]}, + {name:'右前/后轮距离',key:['Wheel_RF_ToRightEdge','Wheel_RB_ToRightEdge']}, + {name:'右前/后轮边线',key:['Wheel_RF_ToBaseLine','Wheel_RF_ToBaseLine']}, + {name:'左前/后轮距离',key:['Wheel_LF_ToRightEdge','Wheel_LB_ToRightEdge']}, + {name:'左前/后轮边线',key:['Wheel_LF_ToBaseLine','Wheel_LB_ToBaseLine']}, + {name:'车道属性',key:['BasePointInLaneDir','CrossLineAttr']}, + {name:'形状',key:['InShapeAttr','ShapeNo','']}, + {name:'路段点',key:['CrossPointNo']}, +] diff --git a/entry/src/main/ets/model/SignDisplay.ets b/entry/src/main/ets/model/SignDisplay.ets index 7ded50b4..c3df4d32 100644 --- a/entry/src/main/ets/model/SignDisplay.ets +++ b/entry/src/main/ets/model/SignDisplay.ets @@ -1,4 +1,4 @@ export type SignalDataType = { key: string; value: string; -}; \ No newline at end of file +}; diff --git a/entry/src/main/ets/pages/Judge.ets b/entry/src/main/ets/pages/Judge.ets index 819ed4e0..f033a710 100644 --- a/entry/src/main/ets/pages/Judge.ets +++ b/entry/src/main/ets/pages/Judge.ets @@ -7,6 +7,7 @@ import DeductedPopup from './compontents/judge/DeductionPopup'; import AmplifyPopup from './compontents/judge/AmplifyPopup'; import Judge from './judgeSDK/judge'; import { defaultJudgeConfigObj } from './judgeSDK/utils//judgeCommon'; +import {uploadExamMileage} from '../api/judge' import { CARINFO, @@ -31,6 +32,10 @@ import SignDisplayCom from './compontents/signDisplayCom'; @Entry @Component struct Index { + async aboutToDisappear(){ + clearInterval(this.mileageTimer) + } + async aboutToAppear() { globalThis.windowClass.setWindowSystemBarEnable([]) const time = await getCurrentTime() @@ -38,6 +43,7 @@ struct Index { this.startTime = time.split(' ')[1] this.startFullTime = await getCurrentTime(1); this.startHourTime = await getCurrentHourTime() + this.startExamTime = time setInterval(async () => { this.time = await getCurrentTime(); @@ -53,6 +59,7 @@ struct Index { //初始化评判 const judge = await this.initJudge(); this.judge = judge + } //初始化相关数据库表 @@ -70,6 +77,7 @@ struct Index { await this.initSystemParam() await this.initMarkRules(); await this.initSysset(); + this.singlePlay = globalThis.singlePlay } await this.initCDSBInfo() @@ -77,6 +85,11 @@ struct Index { if (examSubject == 3) { await this.initMapPoint() await this.initMapPointItem() + //定时上传考试里程 + // let mileageTimer = setInterval(()=>{ + // this.uploadMileage() + // },5000) + // this.mileageTimer = mileageTimer } } @@ -102,13 +115,16 @@ struct Index { async initStudent() { const students = await getSyncData('USER') const stuInfo = students[0] || {}; - const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx} = stuInfo; + console.info('surenjun stuInfo=>', JSON.stringify(stuInfo)) + const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl} = stuInfo; this.name = xm || '测试考生'; this.idCard = sfzmhm || '01234567891010'; this.lsh = lsh; this.kszp = kszp; this.ksdd = ksdd; this.kssycs = kssycs; + this.ksxl = ksxl; + this.wayno = ksxl; this.kslx = kslx; } @@ -210,14 +226,17 @@ struct Index { const {carName,carType,examSubject} = this; //小车车型列表 const sCarTypes = ['C1', 'C2', 'C5'] - this.wayno = currentParams.wayno || 1; + if (globalThis.singlePlay) { + this.wayno = currentParams.wayno || 1; + } + const {isTrajectoryOpen} = judgeConfig let carNo = '', allItems = []; systemParms.forEach((systemParm) => { if (isTrajectoryOpen) { - systemParm.no1 = systemParm.NO1; - systemParm.no2 = systemParm.NO2; - systemParm.no3 = systemParm.NO3; + systemParm.no1 = systemParm.NO1 + ''; + systemParm.no2 = systemParm.NO2 + ''; + systemParm.no3 = systemParm.NO3 + ''; systemParm.txt1 = systemParm.TXT1; systemParm.txt2 = systemParm.TXT2; systemParm.txt3 = systemParm.TXT3; @@ -233,6 +252,7 @@ struct Index { //获取当前考车的考试项目 if (carNo !== '' && no1 == 3 && no2 == carNo && no3 == 10) { allItems = decodeURIComponent(systemParm.txt1).split(',').filter(txt => txt !== '') + console.info('surenjun', JSON.stringify(allItems)) } const txt2 = decodeURIComponent(systemParm.txt2); if ( @@ -255,6 +275,8 @@ struct Index { projectCodeCenter: txt2, //是否是必考 isRequired: allItems.includes(no2 + ''), + //是否考过了 + isEnd: false, } this.projectsObj[no2*1] = currentProject this.projectsCenterObj[txt2] = currentProject @@ -314,31 +336,38 @@ struct Index { // 断点续考判断 async goDdxkItems() { const judgeConfigObj = this.judgeConfigObj - if (judgeConfigObj['369'] != 1 || judgeConfigObj['432'] != 1) { - return - } - //断点续考判断 - let currentParams: any = router.getParams(); - const examItems: string = currentParams?.examItems; - // 2024-01-03 16:29:26;0;20300,;2,4^2,4;null; - if (examItems !== '' && examItems !== undefined) { - const examItemsArrs = examItems.split(';'); - const startTime = examItemsArrs[0] - const ddxkKsxmArr = examItemsArrs[2]?.split(',').filter(item => item) || [] - const ddxkKfArr = examItemsArrs[3]?.split('^').filter(item => item) || [] - - if (ddxkKsxmArr?.length) { - this.isDdxk = true - ddxkKsxmArr.forEach(xmdm => { - const projectCode = this.projectsCenterObj[xmdm].projectCode - this.projectsObj[projectCode].type = '3' - }) + if (judgeConfigObj['432'] != 0) { + //断点续考判断 + let currentParams: any = router.getParams(); + const examItems: string = currentParams?.examItems; + // 2024-01-03 16:29:26;0;20300,;2,4^2,4;null; + if (examItems !== '' && examItems !== undefined) { + console.info('surenjun examItems=>', JSON.stringify(examItems)) + const examItemsArrs = examItems.split(';'); + const startTime = examItemsArrs[0] + const ddxkKsxmArr = examItemsArrs[2]?.split(',').filter(item => item) || [] + const ddxkKfArr = examItemsArrs[3]?.split('^').filter(item => item) || [] + if (judgeConfigObj['432'] == 2) { + //TODO 带项目带里程 + if (ddxkKsxmArr?.length) { + //断点续考 + ddxkKsxmArr.forEach(xmdm => { + const projectCode = this.projectsCenterObj[xmdm].projectCode + if(this.projectsObj[projectCode]){ + this.projectsObj[projectCode].type = '3' + } + }) + } + } + //扣分续考 ddxkKfArr.forEach((kf) => { const [xmdm, kfdm] = kf.split(',') const currentKf = this.markRuleListObj[`${xmdm}_${kfdm}`] - const currentProject = this.projectsObj[xmdm] - this.projectsObj[xmdm].type = '4' + const currentProject = this.projectsObj[xmdm] || { name: '通用评判' } + if (this.projectsObj[xmdm]) { + this.projectsObj[xmdm].type = '4' + } this.kfArr.push({ //扣分项目名称 xmmcStr: currentProject.name, @@ -355,8 +384,10 @@ struct Index { this.ddxkKsxmArr = ddxkKsxmArr this.ddxkKfArr = ddxkKfArr this.ddxkTime = Date.parse(startTime); + this.isDdxk = true } } + } // 初始化mapPoint表 @@ -418,24 +449,40 @@ struct Index { const strArr = str.split('\n'); const [initData, beginData] = [strArr[0], strArr[1]]; const initDataObj = JSON.parse(initData) + const beginDataObj = JSON.parse(beginData) // initDataObj.systemparm = - const systemparm = initDataObj.systemparm; const examSubject = globalThis.carInfo.examSubject; this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject; globalThis.carInfo.examSubject = this.examSubject - await this.initSystemParam(systemparm) + this.singlePlay = beginDataObj.exam == 0; + globalThis.singlePlay = beginDataObj.exam == 0; + await this.initSystemParam(initDataObj.systemparm) await this.initMarkRules(initDataObj.mark); await this.initSysset(initDataObj.sysset); } + // 上传考试里程 + async uploadMileage(){ + if(!globalThis.singlePlay){ + const {lsh,startExamTime:kskssj,jl:kslc} = this + const { carId ,examinationRoomId} = globalThis.carInfo; + await uploadExamMileage({ + carId,examinationRoomId, + lsh,kskssj,kslc + }) + console.info('surenjun 考试里程上传成功') + } + } + build() { Column() { Row() { Row() { Image($rawfile('judge/signal_logoS.png')).width(120) Text(this.time).fontColor('#CCB48F').fontSize(32).padding({ left: 10, right: 5 }) - Image($rawfile(this.isDwztRight?'judge/xh_red.png':'judge/xh_green.png')).width(50) + Image($rawfile(this.isDwztRight ? 'judge/xh_green.png' : 'judge/xh_red.png')).width(50) }.padding({ left: 20 }) + Row() { Text(`当前项目:${this.xmmcStr || '无'} `).fontColor('#E5CCA1').fontSize(32) } @@ -501,12 +548,16 @@ struct Index { Column() { Row() { Text(this.carztStr).fontColor('#FFA500').fontSize(this.FONTSIZE) + if (this.judgeConfigObj['342'] == 0) { + Text(`${this.dw}挡`).fontColor('#FFA500').fontSize(this.FONTSIZE).padding({ left: 15, right: 15 }) + Text(`${this.sd}km/h`).fontColor('#FFA500').fontSize(this.FONTSIZE) + } }.height(40) Row() { Flex({ direction: FlexDirection.Column }) { if (this.kfArr.length) { - List({}) { + List({ scroller: this.kfArrScroller }) { ForEach(this.kfArr, (item) => { ListItem() { Column() { @@ -539,7 +590,6 @@ struct Index { .padding({ top: 12, bottom: 12, left: 8, right: 3 }) }.margin({ top: 35 }).padding({ left: 20, right: 20 }).alignItems(HorizontalAlign.Start) } - } .backgroundImage($rawfile('judge/score_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) @@ -594,7 +644,6 @@ struct Index { .padding(30) .margin({ right: 10 }) } - //科目三 if (this.examSubject == 3) { Column() { @@ -606,16 +655,17 @@ struct Index { List({}) { ForEach(this.projects, (project) => { ListItem() { - Text(project.name) {} + Text(project.name) { + } .fontColor(this.getProjectColor(this.projectsObj[project.projectCode].type)) - .margin({ bottom: 5 }) - .fontSize(26) - }.margin({ bottom: 8 }) + .margin({ bottom: 3 }) + .fontSize(22) + }.margin({ bottom: 3 }) }) }.lanes(2).margin({ left: 25 }) } .width('100%') - .height('50%') + .height('57%') .backgroundImage($rawfile('judge/project_km3_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .padding(30) @@ -637,13 +687,13 @@ struct Index { ), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width(174) - .height(118) - .margin({ bottom: 15 }) + .height(118 * 0.95) + .margin({ bottom: 8 }) .onClick(() => { this.setManualProjectFn(index) }) }) - }.lanes(3).margin({ left: 5, top: 18 }) + }.lanes(3).margin({ left: 5, top: 12 }) } } @@ -663,7 +713,7 @@ struct Index { Column() { Column() { Row() { - Text(this.totalScore + '').fontColor('#FFEECC').fontSize(55) + Text(this.totalScore <= 0 ? '0' : this.totalScore + '').fontColor('#FFEECC').fontSize(55) Text('分').fontColor('#FFEECC').fontSize(30).padding({ top: 5 }) } .width(334) @@ -770,14 +820,19 @@ struct Index { this.endPopupVisible = false; }, confirmFn: async () => { + if (this.judgeConfigObj['344'] == 1) { + Prompt.showToast({ + message: '考试未结束,不允许手动退出!', + duration: 4000 + }); + return + } this.endPopupVisible = false; this.loadingPopupVisible = true - globalThis.isJudge = false clearInterval(this.timer); clearInterval(globalThis.judgeTimer) globalThis.windowClass.setWindowSystemBarEnable(['navigation']) - const judge = this.judge - await judge.handEndExam(true); + this.judge.checkExamIsEnd(true); } }) } @@ -793,8 +848,8 @@ struct Index { Column() { SignDisplayCom({ showBack: false, - scaleNum: 1.5, - msgStr: this.judge.plcStr || '' + scaleNum: 1.8, + msgStr: this.judge.plcStr || '', }).margin({ top: 100 }) Row() { @@ -813,6 +868,7 @@ struct Index { //科目三人工扣分弹窗 if (this.isDeductedPopShow && this.examSubject == 3) { DeductedPopup({ + defaultTabIndex: this.defaultTabIndex, currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => { //@ts-ignore const project = this.projectsObj[projectKey] @@ -820,7 +876,8 @@ struct Index { }).filter(project => project !== undefined), markRules: this.manualMarkRules, closePopup: () => { - this.isDeductedPopShow = false + this.isDeductedPopShow = false; + this.defaultTabIndex = 0; }, confirmMark: async (itemno, serial) => { const judge = this.judge @@ -955,11 +1012,11 @@ struct Index { } //项目进行中不能人工触发 - if(isProjectIn) { - if(param340 == 1){ - if(isManualProjectIn && (currentXmdm == projectCode)){ + if (isProjectIn) { + if (param340 == 1) { + if (isManualProjectIn && (currentXmdm == projectCode)) { return true - }else{ + } else { return false } } @@ -967,7 +1024,7 @@ struct Index { } //项目路段信息判断 - if(!getProjectIsInRoad(projectCode+'')){ + if (!getProjectIsInRoad(projectCode + '')) { return false } @@ -981,7 +1038,6 @@ struct Index { return false } - //319不为0,或者387不为1,里程不够时,靠边停车项目不能触发 if ((param387 != '1' || param319 != '0') && index === 5) { const {examMileage,isRequiredProjectsEnd,jl} = this; @@ -992,56 +1048,56 @@ struct Index { return true } // 判断项目是否在当前路段号 - getProjectIsInRoad = (projectCode:string,) => { + getProjectIsInRoad = (projectCode: string,) => { const { judgeConfigObj, - lane:{road,num,count} + lane:{ road, num, count } } = this; const projectRoads = { //直线行驶 '3': (judgeConfigObj['514']?.split(',') || []), //变更车道 - '4':judgeConfigObj['515']?.split(',') || [], + '4': judgeConfigObj['515']?.split(',') || [], //超车 - '10':judgeConfigObj['516']?.split(',') || [], + '10': judgeConfigObj['516']?.split(',') || [], //靠边停车 - '11':judgeConfigObj['517']?.split(',') || [], + '11': judgeConfigObj['517']?.split(',') || [], //会车 - '9':judgeConfigObj['518']?.split(',') || [], + '9': judgeConfigObj['518']?.split(',') || [], //掉头 - '12':judgeConfigObj['519']?.split(',') || [], + '12': judgeConfigObj['519']?.split(',') || [], }; - console.info('surenjun',JSON.stringify(projectRoads)) - //未测绘得道路上或者不在差分状态 - if(road === ''){ + if (road === '') { return false } //设置了514-519参数,只能在设置的路段触发对应项目 - if(projectRoads[projectCode].includes(road)){ + if (projectRoads[projectCode].includes(road)) { //如果525为1,则514-519设置的路段不能触发对应项目 - if(judgeConfigObj['525'] == '1'){ + if (judgeConfigObj['525'] == '1') { return false } - }else{ + } else { return false } //405参数为2是,如果在最左侧车道,超车项目不能触发; - if(projectCode == '10' && + if (projectCode == '10' && judgeConfigObj['402'] == '2' && (num === count) && num > 0 - ){ + ) { return false } // 车道总数少于2条,超车和变道不能触发 - if(projectCode == '10' || projectCode == '4'){ - if(count < 2){return false} + if (projectCode == '10' || projectCode == '4') { + if (count < 2) { + return false + } } return true @@ -1075,6 +1131,7 @@ struct Index { @State startTime: string = '00:00:00' @State startFullTime: string = '' @State startHourTime: string = '' + @State startExamTime: string = '' //科目类型 @State examSubject: 2 | 3 = 3; @State ddxkTime: number = 0; @@ -1090,6 +1147,7 @@ struct Index { }[] = [] @State name: string = '' @State idCard: string = '' + @State singlePlay: boolean = false; @State totalScore: number = 100 //模拟考试项目 @State projects: Project[] = [] @@ -1105,6 +1163,7 @@ struct Index { @State kszp: string = '' @State ksdd: string = '' @State kssycs: string = '' + @State ksxl: string = '' @State kslx: string = '' //监管接口序列号 @State serialNumber: number = 0 @@ -1132,11 +1191,20 @@ struct Index { @State isProjectIn: boolean = false; //正在进行的项目代码 @State currentXmdm: string = '' - //必考项目除靠边停车是否全部完成 + // 必考项目除靠边停车是否全部完成 @State isRequiredProjectsEnd: boolean = false; + // 考试项目是否全部完成 + // @State isAllProjectsEnd: boolean = false; @State lane: LANE = { road: '', num: 0, count: 0 } + @State roadData: Object = {}; //定位差分状态时候正常 - @State isDwztRight:boolean = false; + @State isDwztRight: boolean = false; + @State defaultTabIndex: number = 0; private context = getContext(this) as common.UIAbilityContext; - //已考考试项目 + public kfArrScroller: Scroller = new Scroller() + //档位 + @State dw: string = '' + //速度 + @State sd: string = '' + @State mileageTimer: number = 0; } diff --git a/entry/src/main/ets/pages/TerminalInfos.ets b/entry/src/main/ets/pages/TerminalInfos.ets index 2564d567..99c143da 100644 --- a/entry/src/main/ets/pages/TerminalInfos.ets +++ b/entry/src/main/ets/pages/TerminalInfos.ets @@ -18,7 +18,7 @@ struct Index { // '',] // @State inputTextList2: string[] = ['192.168.7.124','20022'] - + // @State inputTextList1: string[] = ['172.37.55.191','18782','172.37.55.191','8082','255.255.255.0','172.37.55.1','114.114.114.114','192.168.7.124','20022','172.37.55.59','20122'] @State inputTextList1: string[] = ['172.37.55.191','18782','172.37.55.191','8082','255.255.255.0','192.168.7.1','114.114.114.114','192.168.7.124','20022','192.168.7.170','20122'] // @State inputTextList2: string[] = [] // 112.80.35.83 11052 diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index 59e0bc0d..5e5d5346 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -14,12 +14,20 @@ import common from '@ohos.app.ability.common'; import { User } from './interfaces'; import WebRTCVoice from './webRTC/'; import promptAction from '@ohos.promptAction'; -import { getSyncData } from '../common/service/initable'; +import FilePhoto from './judgeSDK/utils/filePhoto'; +import { getSyncData, upDateTableByArray } from '../common/service/initable'; import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup' +import LoadingPopup from './compontents/judge/LoadingPopup'; +import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; +import { JudgeConfig } from '../config/judge'; +import { judgeConfig } from './judgeSDK/utils/judgeConfig'; + @Entry @Component struct UserInfo { + private filePhoto: FilePhoto + private avPlayer @State pageIndex: number = 0 @State ratio: number = 1700 / 960 @State index: number = 0 @@ -38,6 +46,8 @@ struct UserInfo { @State isBoardPrePareSetPopupOpen: boolean = false @State isFirstBoardPrePareSetPopupBtnShow: boolean = false @State isBoardPrePareSetPopupShow: boolean = false + @State isLoadingPopupVisible:boolean = false; + @State loadingText:string = '正在生成考试记录,请稍后...' @State sczbkf:{xmdm:number,kfdm:string}[] = [] @State currentUser: User = EmptyCandidateObject @State dataList: Array = [] @@ -50,6 +60,8 @@ struct UserInfo { @State nation: string = ''; @State idCard: string = ''; @State grantDept: string = ''; + //是否已经开始考试 + @State isExamStart:boolean = false; @State effectDate: string = ''; @State interval: any = null; @State studentRefreshStatue: string = '0'; @@ -68,12 +80,14 @@ struct UserInfo { { label: '考生姓名', key: 'xm' }, { label: '身份证号', key: 'sfzmhm' }, { label: ' 流 水 号 ', key: 'lsh' }, - { label: '考试路线', key: 'kslx' }, + { label: '考试路线', key: 'ksxl' }, { label: '待考次数', key: 'kssycs' }, { label: '考官姓名', key: 'ksy1' }, ] async onPageShow() { + const mediaTest = new FilePhoto(this.context); + this.filePhoto = new FilePhoto(this.context); //语音功能 new WebRTCVoice(this.context); //初始化数据 @@ -85,7 +99,9 @@ struct UserInfo { this.initSysset() //心跳处理 this.heartMsg() - + this.isExamStart = false + this.sczbkf = []; + this.avPlayer = new VoiceAnnounce(); } //身份证读卡器初始化 @@ -117,14 +133,14 @@ struct UserInfo { this.lsh = this.currentUser.lsh globalThis.lsh = this.currentUser.lsh globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm - + const {examSubject} = globalThis.carInfo; // this.currentUser.kszp=this.photo+res.kszp // this.currentUser.ksmjzp=this.photo+this.currentUser.ksmjzp if (globalThis.singlePlay) { this.stopDeviceById() // globalThis.statue=4 router.pushUrl({ - url: 'pages/Judge', + url: examSubject == 3 ? 'pages/Roads':'pages/Judge', params:{ sczb:Number(this.isBoardPrePareSetPopupOpen), kfdm:this.sczbkf @@ -204,7 +220,6 @@ struct UserInfo { } async initData() { - this.sczbkf = [] this.isFirstBoardPrePareSetPopupBtnShow = false; this.stepFlag = false this.faceCompareSucess = 0 @@ -225,7 +240,7 @@ struct UserInfo { globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm globalThis.lsh = this.lsh } else { - // this.getExaminationStudentInfoFn() + this.getExaminationStudentInfoFn() } const syssetParams = await getSyncData('MA_SYSSET'); //@ts-ignore @@ -432,7 +447,6 @@ struct UserInfo { } async getExaminationItemFn() { - console.info('surenjun', this.currentUser.lsh) if (!this.currentUser.lsh || globalThis.singlePlay) { return } @@ -444,6 +458,7 @@ struct UserInfo { lsh: this.currentUser.lsh || '', examinationRoomId }); + if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) { this.getExaminationStudentInfoFn() } else { @@ -456,34 +471,136 @@ struct UserInfo { //身份比对 async sfbdinterfaceFn() { this.stepFlag = true - console.info('surenjun', this.currentUser.lsh) const carInfo = globalThis.carInfo; const {carId,examinationRoomId} = carInfo; - const examItems = await getExaminationItem({ - time: getCurrentTime(), - carId, - lsh: this.currentUser.lsh || '', - examinationRoomId - }); - - //获取已考项目 - console.log('goroute') - const date = new Date() this.showFaceCompare = false + let examItems = {getExaminationItemRsp:{body:{ykxx:''}}}; + if(!globalThis.singlePlay){ + //获取已考项目 + examItems = await getExaminationItem({ + time: getCurrentTime(), + carId, + lsh: this.currentUser.lsh || '', + examinationRoomId + }); + } + this.currentUser.id = '1' + //是否已经开始考试 + // if(!this.isExamStart){ + const code = await this.beginExam(); + if (code != 1) { + return + } + // } + this.AccountTable.query('0', (result) => { + if (result.length == 0) { + this.isExamStart = true + this.AccountTable.insertData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + globalThis.statue = 4 + this.stepFlag = false + router.pushUrl({ + url: 'pages/Judge', + params: { + examItems: examItems?.getExaminationItemRsp?.body?.ykxx , + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + }) + }) + } else { + this.AccountTable.updateData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + this.stepFlag = false + router.pushUrl({ + url:'pages/Judge', + params: { + examItems: examItems?.getExaminationItemRsp?.body?.ykxx , + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + globalThis.statue = 4 + this.stopDeviceById() + }) + }) + } + }) + this.stepFlag = false + } + // 过程照片拍照 + getPhoto = async (empty?: boolean) => { + const singlePlay = globalThis.singlePlay + //单机模式返回空照片 + if (singlePlay) { + return '' + } else { + const {filePhoto} = this; + const photoBase64 = await filePhoto.getPhoto(); + return photoBase64 + } + } + + // 检测车门、熄火信号 + async checkSignal():Promise{ + const {isCheckFireOpen} = judgeConfig + return new Promise((resolve,reject)=>{ + if(isCheckFireOpen){ + resolve(true) + } + globalThis.udpClient.onMessage_1(async (msg) => { + const msgArr = msg.split(',') + const mkg = msgArr[14]; + const fdjzs = msgArr[25]; + globalThis.udpClient.onMessage_1(()=>{}); + //TODO + console.info('surenjun mkg=>', mkg) + console.info('surenjun fdjzs=>', fdjzs) + if(mkg == 1){ + this.avPlayer.playAudio(['voice/关门.mp3']) + promptAction.showToast({ + message:'请关闭车门', + duration:4000 + }) + reject(false) + } + if(fdjzs*1 > 0){ + this.avPlayer.playAudio(['voice/熄火.mp3']) + promptAction.showToast({ + message:'请熄火', + duration:4000 + }) + reject(false) + } + resolve(true) + }) + }) + } + // 开始考试 + async beginExam(){ + const carInfo = globalThis.carInfo; + const {carId,examinationRoomId} = carInfo; const { examSubject,plateNo } = carInfo; + const date = new Date() + console.info('surenjun','photoBase64') + const photoBase64 = await this.getPhoto(); + console.info('surenjun','photoBase64End') const drvexam = { lsh: this.currentUser.lsh || '', - kskm: 2, + kskm: examSubject, ksxtbh: this.ksxtbh || '222', sfzmhm: this.currentUser.sfzmhm || '', ksysfzmhm: this.currentUser.ksy1sfzmhm || '', - zp: encodeURIComponent((this.faceCatchImg || this.currentUser.kszp.substr(22)) || ''), + ksxl:this.currentUser.ksxl, + zp: photoBase64, kssj: dateFormat(date) || '', kchp: decodeURI(plateNo), Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' } const param = { - drvexam: drvexam, + drvexam, xtlb: '17', //接口序列号 jkxlh: this.jkxlh || '1234567', @@ -492,48 +609,8 @@ struct UserInfo { } const code = await writeObjectOut(param); globalThis.lsh = this.currentUser.lsh - globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm - this.currentUser.id = '1' - if (code) { - this.AccountTable.query('0', (result) => { - if (result.length == 0) { - this.AccountTable.insertData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - globalThis.statue = 4 - this.stepFlag = false - router.pushUrl({ - url: 'pages/Judge', - params: { - examItems: examItems?.getExaminationItemRsp?.body?.ykxx , - sczb:Number(this.isBoardPrePareSetPopupOpen), - kfdm:this.sczbkf - } - }, router.RouterMode.Single); - this.stopDeviceById() - - }) - }) - } else { - this.AccountTable.updateData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - this.stepFlag = false - router.pushUrl({ - url: 'pages/Judge', - params: { - examItems: examItems?.getExaminationItemRsp?.body?.ykxx , - sczb:Number(this.isBoardPrePareSetPopupOpen), - kfdm:this.sczbkf - } - }, router.RouterMode.Single); - globalThis.statue = 4 - this.stopDeviceById() - }) - }) - } - }) - } else { - this.stepFlag = false - } + globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm; + return code } aboutToDisappear() { @@ -659,67 +736,84 @@ struct UserInfo { if( this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow){ //上车准备 - Image($r('app.media.sczb_btn')).commStyle().onClick(()=>{ - this.isBoardPrePareSetPopupShow = true; - this.isFirstBoardPrePareSetPopupBtnShow = true; + Image($r('app.media.sczb_btn')).commStyle().onClick(async ()=>{ + try { + await this.checkSignal() + this.isExamStart = true + await upDateTableByArray('USER',[this.currentUser]) + globalThis.statue = 4 + this.isBoardPrePareSetPopupShow = true; + this.isFirstBoardPrePareSetPopupBtnShow = true; + this.stepFlag = false + this.stopDeviceById() + }catch (e){ + + } }) }else{ Image($r('app.media.ksks_btn')) .commStyle() - .onClick(() => { - this.faceCompareSucess = 0 - globalThis.statue = 2 - if (!this.currentUser.xm) { - return - } - // if(globalThis.spzdFlag){ - // promptAction.showToast({ - // message: '摄像头被遮挡', - // duration: 2000 - // }); - // return - // } - if (globalThis.singlePlay) { - const {examSubject} = globalThis.carInfo; - this.AccountTable.query('0', (result) => { - if (result.length == 0) { - this.AccountTable.insertData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - router.pushUrl({ - url: examSubject == 3 ? 'pages/Roads':'pages/Judge', - params:{ - sczb:Number(this.isBoardPrePareSetPopupOpen), - kfdm:this.sczbkf - } - }, router.RouterMode.Single); - this.stopDeviceById() + .onClick(async () => { + try { + // await this.checkSignal() + this.faceCompareSucess = 0 + globalThis.statue = 2 + if (!this.currentUser.xm) { + return + } + // if(globalThis.spzdFlag){ + // promptAction.showToast({ + // message: '摄像头被遮挡', + // duration: 2000 + // }); + // return + // } + console.info('surenjun currentUser',JSON.stringify(this.currentUser)) + if (globalThis.singlePlay) { + const {examSubject} = globalThis.carInfo; + console.info('surenjun => sczbkf',JSON.stringify(this.sczbkf)) + this.AccountTable.query('0', (result) => { + if (result.length == 0) { + this.AccountTable.insertData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + router.pushUrl({ + url: examSubject == 3 ? 'pages/Roads':'pages/Judge', + params:{ + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + }) }) - }) - } else { - this.AccountTable.updateData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - router.pushUrl({ - url: examSubject == 3?'pages/Roads':'pages/Judge', - params:{ - sczb:Number(this.isBoardPrePareSetPopupOpen), - kfdm:this.sczbkf - } - }, router.RouterMode.Single); - this.stopDeviceById() + } else { + this.AccountTable.updateData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + router.pushUrl({ + url: examSubject == 3?'pages/Roads':'pages/Judge', + params:{ + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + }) }) - }) - } - }) - return - } - if (this.FaceOpenStatue != '0') { - this.showFaceCompare = true - } else { - this.sfbdinterfaceFn() + } + }) + return + } + if (this.FaceOpenStatue != '0') { + this.showFaceCompare = true + } else { + this.sfbdinterfaceFn() + } + }catch (e){ + } + }) } - } } @@ -765,18 +859,34 @@ struct UserInfo { .borderRadius(19 * this.ratio) } - // 上车准备 + // 上车准备弹窗 if(this.isBoardPrePareSetPopupShow){ BoardPrePareSetPopup({ - closePopup:()=>{ - this.isBoardPrePareSetPopupShow = false + closePopup:(bool)=>{ + this.isBoardPrePareSetPopupShow = false; + // if(!globalThis.singlePlay){ + // this.isFirstBoardPrePareSetPopupBtnShow = !bool; + // } }, + // endLoading:()=>{ + // this.isLoadingPopupVisible = false; + // this.faceCompareSucess = 0 + // this.numCount = 0 + // this.getExaminationStudentInfoFn() + // }, confirmMark:(kfdm)=>{ - this.sczbkf= kfdm + this.sczbkf = kfdm } }) } + // loading + // if(this.isLoadingPopupVisible){ + // LoadingPopup({ + // title: this.loadingText, + // }) + // } + } .height('100%') .width('100%') diff --git a/entry/src/main/ets/pages/compontents/SignDisplayCom.ets b/entry/src/main/ets/pages/compontents/SignDisplayCom.ets index 2bb75ade..e1948471 100644 --- a/entry/src/main/ets/pages/compontents/SignDisplayCom.ets +++ b/entry/src/main/ets/pages/compontents/SignDisplayCom.ets @@ -2,7 +2,7 @@ import router from '@ohos.router'; import UdpClient from '../../common/utils/UdpClient'; import FileLog from '../judgeSDK/utils/fileLog'; import RealTime from '../compontents/judge/RealTime'; -import { GPSData, SignalData } from '../../mock'; +import { GPSData, SignalData, RoadData } from '../../mock'; import { SignalDataType } from '../../model'; @Component @@ -48,21 +48,23 @@ export default struct SignDisplayCom { }) - Row() { - Text('实时轨迹').fontColor(this.active == 1 ? '#FFAD33' : '#e7cba3').fontSize(20 * this.ratio) + if (!this.showBack) { + Row() { + Text('实时轨迹').fontColor(this.active == 1 ? '#FFAD33' : '#e7cba3').fontSize(20 * this.ratio) + } + .backgroundImage(this.active == 1 ? $r('app.media.signal_tabS') : $r('app.media.signal_tab')) + .width(144 * this.ratio) + .height(50 * this.ratio) + .backgroundImageSize({ width: '100%', height: '100%' }) + .justifyContent(FlexAlign.Center) + .onClick(() => { + this.active = 1 + // this.vocObj.playAudio({ + // type: 1, + // name: 'media_button.wav' + // }) + }) } - .backgroundImage(this.active == 1 ? $r('app.media.signal_tabS') : $r('app.media.signal_tab')) - .width(144 * this.ratio) - .height(50 * this.ratio) - .backgroundImageSize({ width: '100%', height: '100%' }) - .justifyContent(FlexAlign.Center) - .onClick(() => { - this.active = 1 - // this.vocObj.playAudio({ - // type: 1, - // name: 'media_button.wav' - // }) - }) Row() { Text('原始数据').fontColor(this.active == 2 ? '#FFAD33' : '#e7cba3').fontSize(20 * this.ratio) @@ -261,7 +263,7 @@ export default struct SignDisplayCom { Row() { Text('GPS').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff') } - .width(316 * this.ratio) + .width(316 / 2 * this.ratio) .height(24 * this.ratio) .backgroundColor(this.gpsActive == 0 ? '#fff' : '#1A1A1A') .margin({ left: 10 * this.ratio, right: 10 * this.ratio }) @@ -276,22 +278,18 @@ export default struct SignDisplayCom { ForEach(this.GPSColum, (item) => { Column() { Text(`${item.key}:${item.value}`) - .fontSize(14 * this.ratio) - .lineHeight(25 * this.ratio) + .fontSize(12 * this.ratio) + .lineHeight(20 * this.ratio) .fontColor('#fff') - }.height(25 * this.ratio).justifyContent(FlexAlign.Start).width('100%') + }.height(20 * this.ratio).justifyContent(FlexAlign.Start).width('100%') }) } } - .width(168 * 2 * this.ratio) + .width(168 * this.ratio) .height(380 * this.ratio) .backgroundColor('#282828') .margin({ top: 6 * this.ratio, left: 10 * this.ratio }) - // Row() { - // - // }.width(168 * this.ratio).height(380 * this.ratio).backgroundColor('#1A1A1A').margin({ top: 6 * this.ratio }) - Row() { RealTime({ widthNumber: Math.floor(550 * this.ratio), @@ -301,7 +299,7 @@ export default struct SignDisplayCom { .width(550 * this.ratio) .height(380 * this.ratio) .backgroundColor('#1A1A1A') - .margin({ top: 6 * this.ratio, left: 6 * this.ratio }) + .margin({ top: 6 * this.ratio,}) } .width(936 * this.ratio) diff --git a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets index b277baca..5f33ea1e 100644 --- a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets +++ b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets @@ -3,20 +3,23 @@ import { judgeConfig } from '../../judgeSDK/utils/judgeConfig'; import FileUtil from '../../../common/utils/File'; import common from '@ohos.app.ability.common'; import VoiceAnnounce from '../../judgeSDK/utils/voiceAnnouncements'; - -import { - MarkRule, - SYSSET, -} from '../../judgeSDK/api/judgeSDK.d'; +import { getCurrentTime } from '../../../common/utils/tools'; +import { MarkRule, SYSSET } from '../../judgeSDK/api/judgeSDK.d'; +import { uploadExamProgressData, writeObjectOut } from '../../../api/judge'; +import JudgeTask from '../../judgeSDK/utils/judgeTask'; +import FilePhoto from '../../judgeSDK/utils/filePhoto'; interface SEL { fontColor: string bgColor: string } +//考前模拟人工扣分 @Component export default struct DeductedPopup { private context = getContext(this) as common.UIAbilityContext; + private judgeTask: JudgeTask + private filePhoto: FilePhoto private avPlayer @State name: string = '' @State idCard: string = '' @@ -25,10 +28,14 @@ export default struct DeductedPopup { @State ksdd: string = '' @State kssycs: string = '' @State kslx: string = '' + @State ksxl: string = '' + @State score: number = 100; + @State judgeConfigObj: { [k: string]: any } = {} @State kfdmArr: { xmdm: number, kfdm: string, - markreal: number + markreal: number, + markcatalog: string }[] = [] //开始考试前判绕车一周评判是否开启 @State isOpen: boolean = false @@ -51,22 +58,36 @@ export default struct DeductedPopup { } private confirmMark: Function = (itemno: number, serial: string) => { } + private endLoading: Function = () => { + } @State selectedLineStyle: SEL = { fontColor: '#FFF', bgColor: '#B36E00' } - aboutToAppear() { + async aboutToAppear() { + this.avPlayer = new VoiceAnnounce(); + this.judgeTask = new JudgeTask(); + const mediaTest = new FilePhoto(this.context); + this.filePhoto = mediaTest //上车准备 // this.universalMarkRules = this.markRules.filter(item => this.currentItems.includes(item.itemno+'')) const {isTrajectoryOpen} = judgeConfig; if (isTrajectoryOpen) { - this.initDb() + await this.initDb() } else { - this.initSysset() - this.initMarkRules() + await this.initSysset() + await this.initMarkRules() + await this.initStudent() } - this.avPlayer = new VoiceAnnounce(); + + // const {judgeTask} = this; + // judgeTask.addTask(async () => { + // await this.beginProject(); + // }, { isDelay: true }) + // judgeTask.addTask(async () => { + // await this.uploadProgressPhoto(); + // }, { isDelay: true }) } //本地数据初始化 @@ -86,9 +107,239 @@ export default struct DeductedPopup { await this.initStudent() } + // 过程照片拍照 + getPhoto = async (empty?: boolean) => { + const singlePlay = globalThis.singlePlay + //单机模式返回空照片 + if (singlePlay) { + return '' + } else { + const {filePhoto} = this; + const photoBase64 = await filePhoto.getPhoto(); + return photoBase64 + } + } + + // 扣分操作 + async pointsDedute() { + const singlePlay = globalThis.singlePlay + const index = this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex; + const mark = this.universalMarkRules[index * 7 + this.selectedLine]; + const {judgeConfigObj,kssycs,avPlayer,judgeTask} = this; + this.kfdmArr.push({ xmdm: 1, kfdm: mark.markserial, markreal: mark.markreal, markcatalog: mark.markcatalog }) + const kfdmArr = this.kfdmArr + + //计算总扣分 + let score = kfdmArr.reduce((p, n) => { + p += n.markreal * 1 + return p + }, 0); + this.score = score + + this.confirmMark(this.kfdmArr.map((kf) => ({ + xmdm: kf.xmdm, + kfdm: kf.kfdm, + }))) + + if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) { + avPlayer.playAudio([`voice/${mark.markcatalog}.mp3`], false, () => { + this.closePopup(true) + }); + return + } + + if (singlePlay) { + return + } else { + this.closePopup() + } + return; + + if (score < 90) { + this.closePopup(true) + avPlayer.playAudio(['voice/exam_waiting.mp3', `voice/kfdesc.mp3`]) + judgeTask.addTask(async () => { + //扣分 + await this.kfFn(); + }, { isDelay: true }) + + judgeTask.addTask(async () => { + //项目结束 + await this.endProject(); + }, { isDelay: true }) + + judgeTask.addTask(async () => { + //结束考试 + await this.endFn() + }, { isDelay: true }) + } + ; + + let voiceURL = score < 90 ? `voice/${kssycs == '1' ? 'exam_no_pass_finish' : 'exam_no_pass'}.mp3` : 'voice/exam_pass.mp3' + + let kfScore = 0; + if (kfdmArr.length) { + kfdmArr.forEach((kf, index) => { + kfScore += Math.abs(Number(kf.markreal)); + if (kfScore <= 100) { + judgeTask.addTask(() => { + if (index === kfdmArr.length - 1) { + avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`, voiceURL], false, () => { + this.endLoading(true) + }) + } else { + avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`]) + } + }) + } + }) + } + + this.confirmMark(this.kfdmArr.map((kf) => ({ + xmdm: kf.xmdm, + kfdm: kf.kfdm, + }))) + + } + + //项目开始 + async beginProject() { + //项目开始 //过程照片 //扣分 //结束考试 + const carInfo = globalThis.carInfo; + const { examSubject,plateNo } = carInfo; + const {serialNumber,lsh,idCard,ksxl,kslx,ksdd} = this + const time = await getCurrentTime(); + const beginData = { + xtlb: '17', jkxlh: serialNumber, jkid: '17C52', + drvexam: { + // 考试科目 身份证号码 + lsh, + kskm: examSubject, + sfzmhm: idCard, + ksxm: '40100', + ksxl, + kchp: decodeURI(plateNo), + ksdd: decodeURI(ksdd), + kslx: decodeURI(kslx) || '', + kssj: time + }, + } + const code = await writeObjectOut(beginData) + //TODO code待处理 + if (code == 1) { + + } + } + + //过程照片 + async uploadProgressPhoto() { + const {serialNumber,lsh,idCard,ksdd,kfdmArr,getPhoto} = this; + const carInfo = globalThis.carInfo; + const { examSubject,plateNo,carNo } = carInfo; + const time = await getCurrentTime(); + console.info('surenjun uploadProgressPhoto',) + const photoBase64 = await getPhoto() + const photoData = { + xtlb: '17', jkxlh: serialNumber, jkid: '17C54', + drvexam: { + lsh, + kskm: examSubject, + ksxm: '40100', + sfzmhm: idCard, + kchp: decodeURI(plateNo), + zpsj: time, + //@ts-ignore + // zp: encodeURIComponent(photoBase64), + zp: photoBase64, + cs: 0, + ksdd: decodeURI(ksdd) + } + }; + const code = await writeObjectOut(photoData); + console.info('surenjun uploadProgressPhoto end',) + } + + // 扣分 + async kfFn() { + const {serialNumber,lsh,idCard,ksdd,kfdmArr} = this; + const kfLen = kfdmArr.length; + const kf = kfdmArr[kfLen -1]; + const carInfo = globalThis.carInfo; + const { examSubject} = carInfo; + const time = await getCurrentTime(); + const kfData = { + xtlb: '17', jkxlh: serialNumber, jkid: '17C53', + drvexam: { + lsh, + kskm: examSubject, + // 通用评判科二10000,科三30000 + ksxm: 40100, + kfxm: kf.markcatalog, + kfxmmx: `${'1'},${kf.kfdm}`, + sfzmhm: idCard, + kchp: decodeURI(carInfo.plateNo), + kffs: 2, + ksdd: decodeURI(ksdd), + kfsj: time + } + } + const code = await writeObjectOut(kfData); + } + + // 项目结束 + async endProject() { + const carInfo = globalThis.carInfo; + const { examSubject,plateNo,carNo } = carInfo; + const {lsh,idCard,serialNumber,ksdd,kslx,ksxl,} = this; + const time = await getCurrentTime(); + const endProjectData = { + xtlb: '17', jkxlh: serialNumber, jkid: '17C55', + drvexam: { + lsh, + kskm: examSubject, + sfzmhm: idCard, + ksxm: '40100', + czlx: '1', + ksxl, + kchp: decodeURI(plateNo), + ksdd: decodeURI(ksdd), + kslx: encodeURI(kslx) || '', + jssj: time + } + } + const code = await writeObjectOut(endProjectData); + } + + //考试结束 + async endFn() { + const {serialNumber,lsh,idCard,score,getPhoto} = this; + const carInfo = globalThis.carInfo; + const { examSubject,plateNo } = carInfo; + const time = await getCurrentTime(); + const photoBase64 = await getPhoto(); + const endData = { + xtlb: '17', jkxlh: serialNumber, jkid: '17C56', + drvexam: { + lsh, + kchp: decodeURI(plateNo), + kskm: examSubject, + sfzmhm: idCard, + //@ts-ignore + // zp: encodeURIComponent(photoBase64), + zp: photoBase64, + jssj: time, + kscj: (score * 1) > 0 ? score : 0, + kslc: 0, + dwlc: '', + } + } + const code = await writeObjectOut(endData); + } + //获取sysset表数据 async initSysset(sysset?: SYSSET[]) { const syssetParams = sysset || await getSyncData('MA_SYSSET'); + console.info('surenjun syssetParams', JSON.stringify(syssetParams)); //@ts-ignore syssetParams.forEach(sys => { //监管序列号 @@ -101,15 +352,14 @@ export default struct DeductedPopup { if (isOpen) { this.avPlayer.playAudio(['voice/上车准备.mp3']) } - } + this.judgeConfigObj[sys.v_no] = decodeURIComponent(sys.v_value) }) } //获取markrule表数据 async initMarkRules(markRules ?: MarkRule[]) { const markRuleParams = markRules || (await getSyncData('MA_MARKRULE') as MarkRule[]) - markRuleParams.forEach(mark => { const tempObj = { itemno: mark.itemno * 1, @@ -140,7 +390,8 @@ export default struct DeductedPopup { async initStudent() { const students = await getSyncData('USER') const stuInfo = students[0] || {}; - const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx} = stuInfo; + + const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl} = stuInfo; this.name = xm || '测试考生'; this.idCard = sfzmhm || '01234567891010'; this.lsh = lsh; @@ -148,6 +399,7 @@ export default struct DeductedPopup { this.ksdd = ksdd; this.kssycs = kssycs; this.kslx = kslx; + this.ksxl = ksxl; } //上一页 下一页 @@ -273,34 +525,8 @@ export default struct DeductedPopup { .alignItems(VerticalAlign.Center) .backgroundImage($rawfile(`judge/km3/button_nor.png`)) .backgroundImageSize({ width: '100%', height: '100%' }) - .onClick(() => { - const index = this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex; - const mark = this.universalMarkRules[index * 7 + this.selectedLine]; - const {avPlayer,kssycs} = this; - this.kfdmArr.push({ xmdm: 1, kfdm: mark.markserial, markreal: mark.markreal }) - - //计算总扣分 - let score = this.kfdmArr.reduce((p, n) => { - p += n.markreal - return p - }, 0); - avPlayer.playAudio([`voice/${mark.markcatalog}.mp3`]); - console.info('surenjun',score) - if(!globalThis.singlePlay){ - if (score < -90) { - avPlayer.playAudio([ - 'voice/exam_waiting.mp3', - kssycs == '1' ? 'voice/unqualified_one.wav' : 'voice/unqualified_two.wav' - ]); - - }; - } - - this.confirmMark(this.kfdmArr.map((kf) => ({ - xmdm:kf.xmdm, - kfdm:kf.kfdm, - }))) - + .onClick(async () => { + this.pointsDedute() }) } }.width('100%').justifyContent(FlexAlign.SpaceBetween) @@ -340,8 +566,14 @@ export default struct DeductedPopup { .position({ y: '85%', x: '50%' }) .backgroundImage($rawfile('judge/km3/close_nor.png')) .backgroundImageSize({ width: '100%', height: '100%' }) - .onClick(() => { - this.closePopup() + .onClick(async () => { + //没有扣分项目通过 + this.closePopup(this.kfdmArr.length ? true : false) + + // judgeTask.addTask(async () => { + // await this.endProject() + // }, { isDelay: true }) + }) }.width('100%').height('100%').position({ y: 0 }).backgroundColor('rgba(0,0,0,0.7)') } diff --git a/entry/src/main/ets/pages/compontents/judge/DeductionPopup.ets b/entry/src/main/ets/pages/compontents/judge/DeductionPopup.ets index 576e8b14..43893b14 100644 --- a/entry/src/main/ets/pages/compontents/judge/DeductionPopup.ets +++ b/entry/src/main/ets/pages/compontents/judge/DeductionPopup.ets @@ -21,8 +21,8 @@ export default struct DeductedPopup { private markRules:MarkRule[] = [] @State universalMarkRules:MarkRule[] = [] @State manualMarkRules:MarkRule[] = [] - @State currentItems:number[] = [] - + @State currentItems:string[] = [] + @Prop defaultTabIndex:number = 0 @State lineBg:Array = ['#4D4136','#26231E'] @State selectedLine:number = undefined private closePopup:Function = ()=> {} @@ -34,8 +34,9 @@ export default struct DeductedPopup { aboutToAppear(){ //@ts-ignore + this.universalMarkRules = this.markRules.filter(item => (this.currentItems.includes(item.itemno) || this.currentItems.includes(item.itemno + ''))); + this.currentIndex = this.defaultTabIndex - this.universalMarkRules = this.markRules.filter(item => (this.currentItems.includes(item.itemno) || this.currentItems.includes(item.itemno + ''))) } //上一页 下一页 goPage(typeIndex){ diff --git a/entry/src/main/ets/pages/compontents/judge/RealTime.ets b/entry/src/main/ets/pages/compontents/judge/RealTime.ets index 7f17973a..28b87539 100644 --- a/entry/src/main/ets/pages/compontents/judge/RealTime.ets +++ b/entry/src/main/ets/pages/compontents/judge/RealTime.ets @@ -3,6 +3,11 @@ import Judge from '../../judgeSDK/utils/judgeReal'; import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d'; import common from '@ohos.app.ability.common'; +interface RoadDataType { + name: string, + key: string | string[] +} + @Component export default struct RealTime { @State message: string = '开始绘制' @@ -14,9 +19,13 @@ export default struct RealTime { @State projects: Project[] = [] @State projectsObj: ProjectObj = {} @State markRuleListObj: MarkRule = {} + @State gpsActive: number = 1 private widthNumber: string | number | Resource = 0 private heightNumber: string | number | Resource = 0 private context = getContext(this) as common.UIAbilityContext; + @State ratio: number = 1 + @State lane: Object = {} + @State timer:number = 0 constructor() { super() @@ -26,6 +35,32 @@ export default struct RealTime { build() { Row() { + Column() { + Row() { + Text('车道信息').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff').fontSize(20) + } + .width('100%') + .height(37) + .backgroundColor(this.gpsActive == 0 ? '#fff' : '#1A1A1A') + .margin({ top: 10 * this.ratio, right: 10 }) + .justifyContent(FlexAlign.Center) + + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start }) { + ForEach(this.RoadData, (item) => { + Column() { + Text(`${item.name}:${this.getValues(item)}`) + .fontSize(20) + .lineHeight(30) + .fontColor('#fff') + }.height(30).justifyContent(FlexAlign.Start).width('100%') + }) + }.margin({top:5}) + + }.width(168 * 1.5) + .height(this.heightNumber) + .backgroundColor('#282828') + .margin({ top: 6 * this.ratio, }) + Column() { if (this.draw) { XComponent({ @@ -57,14 +92,49 @@ export default struct RealTime { .height('100%') } + async aboutToDisappear() { + clearInterval(this.timer) + } async aboutToAppear() { - const judge = new Judge(this) + let timer = setInterval(()=>{ + this.lane = globalThis.laneData; + },1000) + this.timer = timer } - aboutToDisappear() { - //apiJudgeSdk.stopRender(); - + getValues(roadColumn) { + const lane = this.lane || {}; + let key = roadColumn.key; + let str = '' + if (Array.isArray(key)) { + key.forEach((k, index) => { + str += (lane[k] === undefined ? '' : lane[k]) + (index == key.length - 1 ? '' : '/') + }) + } else { + str = lane[key] === undefined ? '' : lane[key] + } + return str } + + private RoadData: Array = [ + { name: '路段组号', key: 'MapRoad_Code_No' }, + { name: '路段编码', key: 'MapRoad_Name' }, + { name: '车轮压线', key: ['TouchLineType', 'TouchDir'] }, + { name: '车身碰线', key: ['TouchLineTypeCS', 'TouchLineDirCS'] }, + { name: '基准车道', key: ['BasePointInLaneNo', 'BaseLaneCount'] }, + { name: '前点车道', key: ['FrontPointLaneNo', 'FrontPointLaneCount'] }, + { name: '后车点道', key: ['BackPointLaneNo','BackPointLaneCount'] }, + { name: '左前/后车身距离', key: ['Body_LF_ToLeftEdge', 'Body_LB_ToLeftEdge'] }, + { name: '右前/后车身距离', key: ['Body_RF_ToRightEdge', 'Body_RB_ToRightEdge'] }, + { name: '右前/后车身边线', key: ['Body_RF_ToBaseLine','Body_RB_ToBaseLine'] }, + { name: '右前/后轮距离', key: ['Wheel_RF_ToRightEdge', 'Wheel_RB_ToRightEdge'] }, + { name: '右前/后轮边线', key: ['Wheel_RF_ToBaseLine', 'Wheel_RB_ToBaseLine'] }, + { name: '左前/后轮距离', key: ['Wheel_LF_ToRightEdge', 'Wheel_LB_ToRightEdge'] }, + { name: '左前/后轮边线', key: ['Wheel_LF_ToBaseLine', 'Wheel_LB_ToBaseLine'] }, + { name: '车道属性', key: ['BasePointInLaneDir', 'CrossLineAttr','DirInverse'] }, + { name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] }, + { name: '路段点', key: ['CrossPointNo'] }, + ] } diff --git a/entry/src/main/ets/pages/judgeSDK/api/index.ts b/entry/src/main/ets/pages/judgeSDK/api/index.ts index c5124d35..1130ab6d 100644 --- a/entry/src/main/ets/pages/judgeSDK/api/index.ts +++ b/entry/src/main/ets/pages/judgeSDK/api/index.ts @@ -77,9 +77,11 @@ export async function examJudgeArtificialMark( //项目代码 itemno:number, //扣分代码 - serial:string + serial:string, + //扣分类型:number + type:number ){ - const temp = libJudgeSdk.examJudgeArtificialMark(itemno,serial); + const temp = libJudgeSdk.examJudgeArtificialMark(itemno,serial,type); return await handle(temp,'examJudgeArtificialMark') } @@ -93,8 +95,6 @@ export async function examJudgeArtificialItem( //操作类型 type:number = 0 ){ - console.info('surenjun itemno=>',itemno) - console.info('surenjun type=>',type) const temp = libJudgeSdk.examJudgeArtificialItem(itemno,type); return await handle(temp,'examJudgeArtificialMark') } @@ -133,7 +133,6 @@ export function handleLog(level,infoStr, len){ * */ export async function examJudgeEndExam(){ - console.info('surenjun','考试结束调用') const temp = libJudgeSdk.examJudgeEndExam(); return await handle(temp,'examJudgeEndExam') } diff --git a/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts b/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts index f75ad652..9ba7fded 100644 --- a/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts +++ b/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts @@ -1,170 +1,206 @@ - -export interface Project{ +export interface Project { //项目名称 - name:string + name: string //项目代码 - projectCode:string + projectCode: string //无锡所项目代码 - projectCodeCenter:string + projectCodeCenter: string //项目简写 - abbreviation?:string + abbreviation?: string //项目状态:未做 正在做 及格 不及格 type?: '1' | '2' | '3' | '4' + // } -export interface MarkRule{ - itemno?:number - markcatalog?:string - markshow?:string - markserial?:string - markstandard?:number, - markreal?:number - kfxh?:string - onlyoneid?:number - nocancelid?:number - gps_sid?:number - +export interface MarkRule { + itemno?: number + markcatalog?: string + markshow?: string + markserial?: string + markstandard?: number, + markreal?: number + kfxh?: string + onlyoneid?: number + nocancelid?: number + gps_sid?: number } -export interface SYSTEMPARMARR{ - 'NO1':number, - 'NO2':number, - 'NO3':number, - 'TXT1':string, - 'TXT2':string, - 'TXT3':string, +export interface KF{ + //项目名称 + xmmcStr: string, + xmdm: string | number, + //扣分描述 + desc: string, + //扣分 + score: string + //无锡所扣分代码 + markcatalog: string + markserial: string + kfxh: string + type: 0| 1 | 2 } -export interface SYSTEMPARMARROBJ{ - 'no1':number, - 'no2':number, - 'no3':number, - 'txt1':string, - 'txt2':string, - 'txt3':string, - [k:string]:string|number +export interface SYSTEMPARMARR { + 'NO1': number, + 'NO2': number, + 'NO3': number, + 'TXT1': string, + 'TXT2': string, + 'TXT3': string, +} + +export interface SYSTEMPARMARROBJ { + 'no1': number, + 'no2': number, + 'no3': number, + 'txt1': string, + 'txt2': string, + 'txt3': string, + + [k: string]: string | number } -export interface CARINFO{ - CARID:string, - IPADDR:string, - CARCLASS:string, - KSCX:string, - CARNAME:string, - FLAG:string, - BK1:string, - BK2:string +export interface CARINFO { + CARID: string, + IPADDR: string, + CARCLASS: string, + KSCX: string, + CARNAME: string, + FLAG: string, + BK1: string, + BK2: string } -export interface MAPPOINT{ - point_no:number, - gps_e:number, - gps_n:number, - point_no_f:number, - point_type:number, - road_code:string, - gps_e_Location:number - gps_n_Location:number - f_gps_e:number, - f_gps_n:number, - passed:number +export interface MAPPOINT { + point_no: number, + gps_e: number, + gps_n: number, + point_no_f: number, + point_type: number, + road_code: string, + gps_e_Location: number + gps_n_Location: number + f_gps_e: number, + f_gps_n: number, + passed: number } -export interface MAPITEMPOINTITEM{ - point_no:number, - itemno:number, - itemno1:number, - subname:string +export interface MAPITEMPOINTITEM { + point_no: number, + itemno: number, + itemno1: number, + subname: string } -export interface EXAMDATA{ +export interface EXAMDATA { //1:项目开始 2:项目结束 3:扣分 4:考车状态 5:考试结束 6:项目取消 7:语音播放和提示 8:模拟灯光事件 9:车道信息事件 - event:1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 + event: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //时间 - sj:number + sj: number //考车状态 -1:后退 0:停车 1:前进 - carzt:-1 | 0 | 1 + carzt: -1 | 0 | 1 //项目开始 - xmks:{ + xmks: { //项目代码 项目子序号 - xmdm:number, xmxh:string + xmdm: number, + xmxh: string } //项目结束 - xmjs:{ + xmjs: { //项目代码 项目子序号 项目是否合格 - xmdm:number, xmxh:string, xmhg: 1 | 0 + xmdm: number, + xmxh: string, + xmhg: 1 | 0 }, + //扣分 - kf:{ + kf: { //项目代码 - xmdm:number, + xmdm: number, //扣分代码 - kfdm:string, + kfdm: string, //无锡所扣分代码 - markcatalog:string + markcatalog: string + // 0:评判自动扣分 1:本地人工扣分 2:远程人工扣分 + type: 0 | 1 | 2 }, + //考试结束 - ksjs:{ + ksjs: { //前进距离 - qjjl:number, + qjjl: number, //倒车距离 - dcjl:number + dcjl: number }, + //项目取消 - xmqx:{ + xmqx: { //项目代码 项目子序号 - xmdm:number, xmxh:string + xmdm: number, + xmxh: string }, - sound:{ - xmdm:number, + sound: { + xmdm: number, //语音播放文件代码 - code:string, - type:number + code: string, + type: number }, + //模拟灯光 - mndg:string, - lane:LANE + mndg: string, + lane: LANE, + type: number } - -export interface MAPPOINTITEM{ - +export interface KSJS { + //0:自动结束,1:手动结束 + type: 0 | 1 + qjjl: number, + dcjl: number, + d1: number, + d2: number, + d3: number, + d4: number, + d5: number, + d6: number, } -export interface CDSBInfo{ +export interface MAPPOINTITEM {} -} +export interface CDSBInfo {} export interface SOUND { //项目代码 - xmdm:number + xmdm: number //语音播放提示代码 - code:string, + code: string, + //0:普通,1:模拟灯光 - type:number -} -export interface SYSSET { - v_no:string, - v_name:string, - v_value:string + type: number } -export interface LANE{ +export interface SYSSET { + v_no: string, + v_name: string, + v_value: string +} + +export interface LANE { //当前路段号 如果road为空字符串””,说明当前在未测绘得道路上或者不在差分状态 - road:string + road: string /*当前基准天线所在车道号 num等于0或者count等于0说明当前未在测绘路段,或者不在差分状态。 num等于1的时候表示在最右侧车道 num等于count的时候的表示在最左侧车道 */ - num:number + num: number //当前基准天线共有几股车道 - count:number + count: number } export interface ProjectObj { - [k:string]:Project + [k: string]: Project } diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ts b/entry/src/main/ets/pages/judgeSDK/judge.ts index 85d98f0a..71a7ecf0 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ts +++ b/entry/src/main/ets/pages/judgeSDK/judge.ts @@ -3,18 +3,18 @@ import router from '@ohos.router'; import util from '@ohos.util'; import buffer from '@ohos.buffer'; import { testKmItems, testMarkRules } from './dataTest/index'; -import { EXAMDATA, SOUND } from './api/judgeSDK'; +import { EXAMDATA, SOUND, KSJS } from './api/judgeSDK'; import VoiceAnnounce from './utils/voiceAnnouncements'; import FileModel from './utils/fileModel'; import FilePhoto from './utils/filePhoto'; import FileUtil from '../../common/utils/File'; import FileLog from './utils/fileLog'; - import JudgeTask from './utils/judgeTask'; import { judgeConfig } from './utils/judgeConfig'; - - import { uploadExamProgressData, writeObjectOut } from '../../api/judge'; +import UsbService from '../../common/service/usbService'; +import { LANE,KF } from '../judgeSDK/api/judgeSDK.d'; + import { Array2Byte, convertGpsCoord2, @@ -24,6 +24,7 @@ import { string2Bytes, stringToASC } from '../../common/utils/tools'; + import { getCarStatus, getCarStatusType, @@ -35,6 +36,7 @@ import { promptWxCode, senorToWXDataStr } from './utils/judgeCommon'; + import { examJudgeArtificialItem, examJudgeArtificialMark, @@ -47,9 +49,6 @@ import { examJudgeSetPerformCallback, examJudgeSetRealExamCallback } from './api/index'; -import UsbService from '../../common/service/usbService'; - -import Prompt from '@system.prompt'; const judgeTag = 'SURENJUN_JUDGE' @@ -57,7 +56,6 @@ export default class Judge { constructor(judgeUI) { this.serialIndex = 1; this.judgeUI = judgeUI - //语音播放工具 this.avPlayer = new VoiceAnnounce(); //模型工具 @@ -65,9 +63,8 @@ export default class Judge { //文件工具 this.fileUtil = new FileUtil(judgeUI.context) this.judgeTask = new JudgeTask() - const mediaTest = new FilePhoto(judgeUI.context); this.usbService = new UsbService(); - this.filePhoto = mediaTest + this.filePhoto = new FilePhoto(judgeUI.context); this.kfArr = judgeUI.kfArr this.xmmcStr = ''; this.xmmcCode = ''; @@ -80,7 +77,7 @@ export default class Judge { this.modelPath = modelPath; this.trajectoryPath = trajectoryPath; - this.isExam = !globalThis.singlePlay; + this.isExam = !this.judgeUI.singlePlay; const {projectsCenterObj} = judgeUI //科目三待修改 @@ -93,12 +90,13 @@ export default class Judge { } } }) - this.isEnd = false; + this.isExamEnd = false; } public async onJudgeFn(fn: Function) { await this.judging(fn) } + //开始评判 private async judging(callBack: Function) { const {judgeUI} = this; @@ -119,7 +117,7 @@ export default class Judge { } //日志回调 console.info(judgeTag, '1.进入评判入口') - await examJudgeSetLogCallback(3, async (level, info, len) => { + await examJudgeSetLogCallback(6, async (level, info, len) => { console.log('评判日志:' + info) await fileLog.setExamJudgeLogData(info); }) @@ -151,6 +149,8 @@ export default class Judge { const performInfo = JSON.parse(info) this.performInfo = performInfo this.judgeUI.jl = Math.floor((performInfo.qjjl + performInfo.dcjl) / 100) + //TODO 待优化 跨组件传值不生效 + globalThis.laneData = performInfo.lane; }) // 3.开始考试 @@ -162,11 +162,8 @@ export default class Judge { await fileLog.setExamJudgeData(beginExamInfo) await examJudgeBeginExam(beginExamInfo); console.info(judgeTag, '6.开始考试注册完成') - avPlayer.playAudio(['voice/ksks.WAV']) - this.judgeUI.draw = true - // 处理轨迹plc信息 if (isTrajectoryOpen) { handleTrajectoryUdp(strArr); @@ -177,6 +174,7 @@ export default class Judge { handleUdp(msg) }) } + // 获取评判初始化数据 getJudgeInitData = async () => { const {getModelData,getKm3JudgeInitConfig} = this @@ -206,14 +204,14 @@ export default class Judge { name: carName, carmodel: getModelData(`${examType}/${carType}.txt`), allitems, - iteminfo:[], + iteminfo: [], systemparm: systemparmArr, mark: Reflect.ownKeys(markRuleListObj).map(ruleKey => (markRuleListObj[ruleKey])) || testMarkRules, sysset: judgeUI.judgeConfig, }; let km3Config = {} - if (examSubject == 3) { + if (examSubject == 3) { km3Config = await getKm3JudgeInitConfig(); } // 获取科目三的评判配置 @@ -223,6 +221,7 @@ export default class Judge { ...km3Config, } } + // 获取开始考试数据 getJudgeBeginData = async () => { const {code,name:examinerName} = globalThis.examinerInfo; @@ -259,7 +258,7 @@ export default class Judge { }), //断点续考 ddxk: isDdxk ? 1 : 0, - ddkssj: ddxkTime, + ddkssj: ddxkTime || 0, ykxm: isDdxk ? (ddxkKsxmArr?.map(projectCenterCode => (projectsCenterObj[projectCenterCode]?.projectCode) * 1)) : [], kfxm: isDdxk ? (ddxkKfArr?.map(kf => { const [xmdm, kfdm] = kf.split(',') @@ -268,11 +267,12 @@ export default class Judge { kfdm } })) : [], + //TODO 已考里程待修改 yklc: 0, special: [], //TODO 科目三参数临时写死 - sczb: (sczb === undefined || sczb == 0)?0:1, - sczbkf:kfdm, + sczb: (sczb === undefined || sczb == 0) ? 0 : 1, + sczbkf: kfdm, dmndg: false, nitem1: false, nitem41: false, @@ -297,11 +297,11 @@ export default class Judge { //项目开始 case 1: judgeUI.projectsObj[xmdm].type = '2'; - if(isManualProjectIn){ + if (isManualProjectIn) { //手动项目是否在进行中 this.judgeUI.isManualProjectIn = true } - if(xmdm == 41 && examSubject == 3){ + if (xmdm == 41 && examSubject == 3) { this.rmndg = 1 } this.judgeUI.currentXmdm = xmdm; @@ -321,14 +321,15 @@ export default class Judge { //项目结束 case 2: judgeUI.projectsObj[xmdm].type = (xmjs.xmhg === 0 ? '4' : '3'); - //计算项目是否全部结束 + + //计算项目是否全部结束 this.judgeUI.isProjectIn = (Reflect.ownKeys(judgeUI.projectsObj).filter( projectKey => judgeUI.projectsObj[projectKey].type == '2').length ) > 0; - if(isManualProjectIn){ + if (isManualProjectIn) { this.judgeUI.isManualProjectIn = false } - //统计必考项目数量 + //统计必考项目数量 this.xmmcStr = '无'; this.xmmcCode = ''; this.xmmcSingleCode = 0; @@ -352,7 +353,9 @@ export default class Judge { // 扣分无锡所代码 markcatalog: thisKf.markcatalog, markserial: thisKf.markserial, - kfxh: thisKf.kfxh + kfxh: thisKf.kfxh, + //扣分类型 + type: kf.type }) this.judgeUI.totalScore += thisKf.score * 1; break; @@ -383,7 +386,8 @@ export default class Judge { //车道和路段变化 case 9: this.judgeUI.lane = lane - console.info('surenjun',JSON.stringify(lane)) + this.lane = lane; + console.info(judgeTag + 'lane', JSON.stringify(lane)) break; default: @@ -399,68 +403,102 @@ export default class Judge { }); //语音播报 - this.goVoiceAnnounce(event, xmdm, this.kfArr, xmjs) + this.goVoiceAnnounce(event, xmdm, this.kfArr, xmjs, ksjs) //更新UI if (event == 1 || event == 2 || event == 3) { const copyProjectsObj = this.judgeUI.projectsObj; judgeUI.projectsObj = deepClone(copyProjectsObj); - //科目三统计必考数量 - this.setCountItems() } } - // 更改考试状态 - goVoiceAnnounce = async (event, xmdm, kf, xmjs) => { - const {beginProject,pointsDedute,endProject,avPlayer,uploadProgressPhoto,judgeTask,handEndExam,judgeUI} = this; - const {projectsObj,judgeConfigObj,examSubject} = judgeUI; - const kfLen = kf.length + // 更改考试状态 + goVoiceAnnounce = async (event, xmdm, kf, xmjs, ksjs) => { + const { + beginProject, + pointsDedute, + endProject, + avPlayer, + uploadProgressPhoto, + judgeTask, + handEndExam, + judgeUI, + checkExamIsEnd, + checkProjectIsStart, + lane + } = this; + + const {projectsObj,judgeConfigObj,examSubject,examMileage,jl,isAllProjectsEnd} = judgeUI; + const kfLen = kf.length; //不报语音的项目列表 const ignoreVoiceCodeArr = (judgeConfigObj['312'] || '').split(',') switch (event) { - // 项目开始 case 1: const code = projectsObj[xmdm].projectCodeCenter; - const kmCode = getKmProjectVoice(code, 1) + const isEnd = projectsObj[xmdm].isEnd; + const kmCode = getKmProjectVoice(code, 1, judgeConfigObj, lane) if (!ignoreVoiceCodeArr.includes(code)) { kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`]) } - await judgeTask.addTask(async () => { - console.info(judgeTag, `项目开始-${xmdm}-${projectsObj[xmdm].name}`) - await beginProject(xmdm) - // console.info(judgeTag,'上传照片 start') - await uploadProgressPhoto(xmdm) - }) + //项目已考不上传监管信息 + if (!isEnd) { + await judgeTask.addTask(async () => { + console.info(judgeTag, `项目开始-${xmdm}-${projectsObj[xmdm].name}`) + await beginProject(xmdm) + }, { + isDelay: true + }) + + await judgeTask.addTask(async () => { + console.info(judgeTag, '上传照片 start') + await uploadProgressPhoto(xmdm) + }, { + isDelay: true + }) + } break; // 项目结束 - case 2: + case 2:{ const endCode = projectsObj[xmdm].projectCodeCenter; - const endKmCode = getKmProjectVoice(endCode, 2) + const projectIsEnd = projectsObj[xmdm].isEnd; + const endKmCode = getKmProjectVoice(endCode, 2, judgeConfigObj, lane) if (!ignoreVoiceCodeArr.includes(endCode) && examSubject == 3) { endKmCode && avPlayer.playAudio([`voice/${endKmCode}.mp3`]) } - await judgeTask.addTask(async () => { - console.info(judgeTag, `项目结束-${xmdm}-${projectsObj[xmdm].name}`) - await endProject(xmdm); - //TODO 靠边停车结束 - if(xmdm === 11){ + const isStart = await checkProjectIsStart(xmdm,1); + if(isStart){ + //项目结束了就不再生成数据 + if (!projectIsEnd) { + await judgeTask.addTask(async () => { + console.info(judgeTag, `项目结束-${xmdm}-${projectsObj[xmdm].name}`) + await endProject(xmdm); + }, { + isDelay: true + }) } - }) + } + judgeUI.projectsObj[xmdm].isEnd = true; break; + } // 扣分 case 3: - //扣分时实时播报语音(0-否+1-是) - if(judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen){ + //扣分时实时播报语音(0-否+1-是) + if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) { avPlayer.playAudio([`voice/${kf[kfLen -1].markcatalog}.mp3`]) } - await judgeTask.addTask(async () => { - console.info(judgeTag, `项目扣分-${kf[kfLen -1].markcatalog}-${kf[kfLen -1].desc}`) - await pointsDedute(kf[kfLen -1].xmdm, kf[kfLen -1]) - }) + const isStart = await checkProjectIsStart(xmdm,2,kf[kfLen -1]); + if(isStart){ + await judgeTask.addTask(async () => { + console.info(judgeTag, `项目扣分-${kf[kfLen -1].markcatalog}-${kf[kfLen -1].desc}`) + await pointsDedute(kf[kfLen -1].xmdm, kf[kfLen -1]) + }, { + isDelay: true + }) + } break; // 考车状态 @@ -469,23 +507,67 @@ export default class Judge { // 考试结束 case 5: - console.info(judgeTag,'考试结束') - clearInterval(globalThis.judgeTimer) + console.info(judgeTag, '考试结束') await judgeTask.addTask(async () => { console.info(judgeTag, '考试结束 start') - await handEndExam() + globalThis.isJudge = false; + await handEndExam(ksjs) }) + clearInterval(globalThis.judgeTimer) break default: break } + if (event == 2 || event == 3) { + //科目三统计必考数量 + await this.setCountItems(); + await checkExamIsEnd() + setTimeout(() => { + this.judgeUI.kfArrScroller.scrollTo({ + yOffset: 999999, xOffset: 0 + }) + console.info(judgeTag, '发生滚动') + }) + } } + + // 检测扣分、结束项目时该项目是否开始 + checkProjectIsStart = async(xmdm,currentType:1|2,kf?:KF) => { + if(xmdm == 20){ + return + } + const {judgeTask,beginProject,pointsDedute,uploadProgressPhoto,endProject,checkExamIsEnd} = this; + const {projectsObj} = this.judgeUI + const type = projectsObj[xmdm].type; + + //如果项目没有开始 + if(type == 1){ + console.info(judgeTag,'项目补传开始') + //项目开始补传 + judgeTask.addTask(async ()=>{await beginProject(xmdm)},{isDelay:true}) + judgeTask.addTask(async ()=>{await uploadProgressPhoto(xmdm)},{isDelay:true}) + //扣分补传 + if(currentType == 2){ + judgeTask.addTask(async ()=>{await pointsDedute(xmdm,kf)},{isDelay:true}) + } + judgeTask.addTask(async ()=>{await endProject(xmdm)},{isDelay:true}) + judgeTask.addTask(async ()=>{ + this.judgeUI.projectsObj[xmdm].isEnd = true; + checkExamIsEnd() + }) + + return false; + }else{ + return true + } + } + // 项目开始接口同步 beginProject = async (ksxm) => { const carInfo = globalThis.carInfo; const { examSubject,plateNo } = carInfo; const {judgeUI,fileLog,getSbbm,xmxh} = this; - const {lsh,idCard,serialNumber,projectsObj,ksdd,kslx} = judgeUI + const {lsh,idCard,serialNumber,projectsObj,ksdd,kslx,ksxl} = judgeUI const time = await getCurrentTime(); const project = projectsObj[ksxm] const sbxh = getSbbm(ksxm, xmxh) @@ -499,20 +581,19 @@ export default class Judge { sfzmhm: idCard, ksxm: project.projectCodeCenter, sbxh, + ksxl, kchp: encodeURI(plateNo), // 开始时间 ksdd: encodeURI(ksdd), - ksxl: encodeURI(kslx) || '', + kslx: encodeURI(kslx) || '', kssj: time } } const code = await writeObjectOut(data) - // console.info(judgeTag,'项目开始 end') + console.info(judgeTag, '项目开始 end') if (code === 2300007) { this.isJudgeDisConnect = true; } - const isJudgeDisConnect = this.isJudgeDisConnect - isJudgeDisConnect ? fileLog.setExamJudgeDisWuxiProgressData(data) : fileLog.setExamJudgeWuxiData(data) promptWxCode('17C52', code) } // 项目结束接口同步 @@ -521,10 +602,10 @@ export default class Judge { const deviceNo = globalThis.deviceNo; const { examSubject,plateNo,carNo } = carInfo; const {judgeUI,fileLog,getSbxh,xmxh,getSbbm} = this; - const {lsh,idCard,serialNumber,projectsObj,cdsbInfoObj,ksdd,kslx} = judgeUI + const {lsh,idCard,serialNumber,projectsObj,cdsbInfoObj,ksdd,kslx,ksxl,} = judgeUI const time = await getCurrentTime(); const project = projectsObj[ksxm] - const sbxh = getSbbm(ksxm, xmxh) + const sbxh = examSubject == 3 ? undefined : getSbbm(ksxm, xmxh) const data = { xtlb: '17', jkxlh: serialNumber, jkid: '17C55', @@ -534,11 +615,12 @@ export default class Judge { sfzmhm: idCard, ksxm: project.projectCodeCenter, sbxh, - //操作类型 1:正常 0:撤销该考试记录 + //TODO 操作类型 1:正常 0:撤销该考试记录 czlx: '1', + ksxl, kchp: encodeURI(plateNo), ksdd: encodeURI(ksdd), - ksxl: encodeURI(kslx) || '', + kslx: encodeURI(kslx) || '', jssj: time } } @@ -546,9 +628,7 @@ export default class Judge { if (code === 2300007) { this.isJudgeDisConnect = true; } - const isJudgeDisConnect = this.isJudgeDisConnect - isJudgeDisConnect ? fileLog.setExamJudgeDisWuxiProgressData(data) : fileLog.setExamJudgeWuxiData(data) - // console.info(judgeTag,'项目结束 end') + console.info(judgeTag, '项目结束 end') promptWxCode('17C55', code) } // 考试扣分 @@ -556,23 +636,26 @@ export default class Judge { const carInfo = globalThis.carInfo; const deviceNo = globalThis.deviceNo; const { examSubject,plateNo,carNo } = carInfo; - const {judgeUI,getProjectInfo,fileLog} = this; + const {judgeUI,getProjectInfo,fileLog,xmmcSingleCode} = this; const {lsh,idCard,serialNumber,ksdd} = judgeUI const time = await getCurrentTime(); const project = getProjectInfo(ksxm); + //科目三上车准备、模拟灯光、夜间行驶出现通用评判,ksxm为当前进行的项目 + const checkProjects = ['41600', '41700', '40100'] + const data = { xtlb: '17', jkxlh: serialNumber, jkid: '17C53', drvexam: { lsh, kskm: examSubject, - // 通用评判科二10000,科三30000 - ksxm: project ? project.projectCodeCenter : 10000, + ksxm: project + ? (checkProjects.includes(xmmcSingleCode + '') ? xmmcSingleCode : project.projectCodeCenter) + : (examSubject == 3 ? 30000 : 10000), kfxm: kf.markcatalog, kfxmmx: `${ksxm},${kf.markserial}`, sfzmhm: idCard, kchp: encodeURI(carInfo.plateNo), - //1:自动 2:人工 - kffs: 1, + kffs: kf.type == 0 ? 1 : 2, ksdd: encodeURI(ksdd), kfsj: time } @@ -581,8 +664,6 @@ export default class Judge { if (code === 2300007) { this.isJudgeDisConnect = true } - const isJudgeDisConnect = this.isJudgeDisConnect - isJudgeDisConnect ? fileLog.setExamJudgeDisWuxiProgressData(data) : fileLog.setExamJudgeWuxiData(data) console.info(judgeTag, '项目扣分 end') promptWxCode('17C53', code) } @@ -607,7 +688,7 @@ export default class Judge { kchp: encodeURI(plateNo), zpsj: time, //@ts-ignore - zp: encodeURIComponent(photoBase64), + zp: photoBase64, cs: Math.ceil(gps.sd * 1.852), ksdd: encodeURI(ksdd) } @@ -617,21 +698,24 @@ export default class Judge { this.isJudgeDisConnect = true } promptWxCode('17C54', code) - fileLog.setExamJudgeWuxiData(data) console.info(judgeTag, '上传照片 end') } + // 评判语音提示 goJudgeVoice = async (sound: SOUND) => { const {avPlayer,fileLog} = this; const {xmdm,code,type} = sound; //判断是不是模拟灯光语音 - if(type == 1){ + if (type == 1) { console.info(judgeTag, '模拟灯光开始播放:' + code) } + console.info(judgeTag, '语音播放代码:' + code) avPlayer.playAudio([`voice/${code}.mp3`], false, () => { if (type == 1) { console.info(judgeTag, '播放结束:' + code) - examJudgeSoundEnd({itemno:xmdm,code,type}) + examJudgeSoundEnd({ + itemno: xmdm, code, type + }) fileLog.setExamJudgeData({ method: 'examJudgeSoundEnd', itemno: xmdm, @@ -641,71 +725,130 @@ export default class Judge { } }) } - // 处理考试结束 - public handEndExam = async (isManual?: Boolean) => { - const {isExam,judgeUI,endExam,handleSEP,kfArr,avPlayer,judgeTask} = this; - const singlePlay = globalThis.singlePlay - const {judgeConfigObj,totalScore,} = judgeUI - this.judgeUI.loadingPopupVisible = true; - if (judgeConfigObj['344'] == 1) { - Prompt.showToast({ - message: '考试未结束,不允许手动退出!', - duration: 4000 - }); + // 校验考试是否结束 + checkExamIsEnd = async (isManual?: boolean) => { + const {judgeUI,avPlayer,isExamEnd} = this; + const {isAllProjectsEnd,examSubject,singlePlay,totalScore,judgeConfigObj,jl,examMileage} = judgeUI; + + if (isExamEnd) { return } - //结束评判函数 - await examJudgeEndExam(); - //TODO 科目三考试合格 考官综合评判 - - //TODO 语音播放扣分项 - let score = 0; - if(kfArr.length){ - avPlayer.playAudio([`voice/kfdesc.mp3`]) - kfArr.forEach(kf => { - score += Math.abs(Number(kf.score)); - if(score <= 100){ - judgeTask.addTask(()=>{ - avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`]) - }) + //及格分 + let passingGrade = examSubject == 2 ? 80 : 90 + if (isManual) { + if (isAllProjectsEnd) { + // 考试合格 + if (totalScore >= passingGrade) { + // 考试合格 + await examJudgeEndExam(); + this.isExamEnd = true } + } else { + // 考试不合格 + await examJudgeEndExam() + this.isExamEnd = true + } + this.isManual = true + + } else { + //单机模式 + if (singlePlay) { + console.info(judgeTag + ' isAllProjectsEnd',isAllProjectsEnd) + if (isAllProjectsEnd) { + await examJudgeEndExam() + this.isExamEnd = true + } + } else { + //成绩不合格 + if (totalScore < passingGrade) { + await examJudgeEndExam() + this.isExamEnd = true + return + } + //成绩合格 + if (isAllProjectsEnd && totalScore >= passingGrade) { + const param302 = judgeConfigObj['302']; + if (examSubject == 3 && (param302 != 6 || param302 != 7 || param302 != 8)) { + avPlayer.playAudio(['voice/综合评判.mp3']) + this.judgeUI.isDeductedPopShow = true + this.judgeUI.defaultTabIndex = 1 + } else { + await examJudgeEndExam() + this.isExamEnd = true + } + } + } + } + } + + // 处理考试结束 + public handEndExam = async (ksjs: KSJS) => { + this.judgeUI.loadingPopupVisible = true; + this.judgeUI.endPopupVisible = false; + const {qjjl,dcjl} = ksjs + const {judgeUI,endExam,handleSEP,kfArr,avPlayer,judgeTask,isManual} = this; + const {judgeConfigObj,examSubject,isAllProjectsEnd,totalScore,projectsObj} = judgeUI; + //计算考试分数 + this.judgeUI.totalScore = isAllProjectsEnd ? totalScore : 0; + const singlePlay = globalThis.singlePlay + const param302 = judgeConfigObj['302']; + globalThis.windowClass.setWindowSystemBarEnable(['navigation']) + + //自动退出待验证并且不合格 + if (!isManual && examSubject == 3 && (param302 == 1 || (singlePlay && param302 == 2)) && totalScore < 90) { + avPlayer.playAudio([`voice/考试结束.mp3`]) + } + + //联网模式下手动结束的直接退出 + if (!singlePlay && isManual && !isAllProjectsEnd) { + avPlayer.playAudio(['voice/empty.mp3'], true, () => { + router.back(); }) + return + } + + if (examSubject == 3) { + const param302 = judgeConfigObj['302']; + //TODO 分数待修改从sysset表里获取 + if (totalScore < 90) { + //考试不合格;考试模式,自动退出; + if (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8) { + } + } else { + //考试合格 + } } await handleSEP(306); - judgeTask.addTask(()=>{ - avPlayer.playAudio(['voice/exam_waiting.mp3'],false,async ()=>{ - this.isEnd = true - try { - if(!singlePlay){ - const bytes = await this.getMessageHeartbeat(true); - globalThis.judgeUdp.send(bytes) - } - globalThis.isJudge = false - //TODO endExam函数逻辑待验证 - !singlePlay && await endExam(isManual) - router.back(); - } catch (e) { - // setTimeout(() => { - // // avPlayer.avPlayerStop(); - // router.back(); - // }, 3000) + avPlayer.playAudio(['voice/exam_waiting.mp3'], true, async () => { + try { + if (!singlePlay) { + // TODO 待验证 + // const bytes = await this.getMessageHeartbeat(true); + // globalThis.judgeUdp.send(bytes) } - }) - }) + //TODO endExam函数逻辑待验证 + await endExam() + } catch (e) { + // setTimeout(() => { + // // avPlayer.avPlayerStop(); + // router.back(); + // }, 3000) + } + }); + } // 考试结束 public endExam = async (isManual?: Boolean) => { const carInfo = globalThis.carInfo; - const deviceNo = globalThis.deviceNo; + const singlePlay = globalThis.singlePlay const { examSubject ,plateNo} = carInfo; - const {judgeUI,fileLog,ksjs,getPhoto,uploadProgressData,uploadDisConnectData,avPlayer} = this; - const {lsh,idCard,serialNumber,kssycs,totalScore} = judgeUI + const {judgeUI,ksjs,getPhoto,uploadProgressData,uploadDisConnectData,avPlayer,kfArr,judgeTask} = this; + const {lsh,idCard,serialNumber,kssycs,totalScore,judgeConfigObj,isAllProjectsEnd} = judgeUI await uploadDisConnectData(); const time = await getCurrentTime(); const photoBase64 = await getPhoto(); - const data = { xtlb: '17', jkxlh: serialNumber, jkid: '17C56', drvexam: { @@ -714,42 +857,80 @@ export default class Judge { kskm: examSubject, sfzmhm: idCard, //@ts-ignore - zp: encodeURIComponent(photoBase64), + zp: photoBase64, jssj: time, kscj: (totalScore * 1) > 0 ? totalScore : 0, - kslc: (ksjs?.qjjl + ksjs?.dcjl) || 0, + kslc: Math.ceil(((ksjs?.qjjl + ksjs?.dcjl) || 0) / 100), + //TODO dwlc: '', } } const code = await writeObjectOut(data); promptWxCode('17C56', code) console.info(judgeTag, '考试结束 end') - if (!isManual) { - judgeUI.loadingPopupVisible = true; - if (examSubject == 2 && totalScore < 80) { - avPlayer.playAudio([ - `voice/unqualified_${kssycs == 1?'one':'two'}.wav`, - ], true) - } else { - avPlayer.playAudio(['voice/qualified.mp3'], true) - } + let noPassExitVoice = '' + const param302 = judgeConfigObj['302']; - if (examSubject == 3 && totalScore < 90) { - avPlayer.playAudio([ - `voice/${kssycs == 1?'exam_no_pass':'exam_no_pass_finish'}.mp3`, - ], true) + judgeUI.loadingPopupVisible = true; + + let voiceURL = '' + if (examSubject == 2) { + voiceURL = (totalScore < 80 ? `voice/unqualified_${kssycs == 1 ? 'one' : 'two'}.wav` : 'voice/qualified.mp3') + } + + if (examSubject == 3) { + if (isAllProjectsEnd) { + if (totalScore < 90) { + voiceURL = `voice/${kssycs == 1 ? 'exam_no_pass_finish' : 'exam_no_pass'}.mp3` + } else { + voiceURL = 'voice/exam_pass.mp3' + } } else { - avPlayer.playAudio(['voice/exam_pass.mp3'], true) + voiceURL = `voice/${kssycs == 1 ? 'exam_no_pass_finish' : 'exam_no_pass'}.mp3` } } - console.info(judgeTag, `考试成绩:${totalScore}`) - // fileLog.setExamJudgeWuxiData(data) - await uploadProgressData(); - setTimeout(() => { - router.back(); - }, 3000) + console.info(judgeTag, `考试成绩:${totalScore}`) + await uploadProgressData(); + + //语音播放扣分项 + let score = 0; + if (kfArr.length) { + avPlayer.playAudio([`voice/kfdesc.mp3`], false, () => { + try { + kfArr.forEach((kf, index) => { + score += Math.abs(Number(kf.score)); + console.info(judgeTag + 'score=>', score) + //TODO 考试分数待替换 + if (score <= (examSubject == 3 ? 10 : 20)) { + if (kfArr.length - 1 === index) { + avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`, voiceURL], false, () => { + router.back(); + }) + throw new Error('End Loop') + } + avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`]) + } else { + avPlayer.playAudio([`voice/${kf.markcatalog}.mp3`, voiceURL], false, () => { + router.back(); + }) + throw new Error('End Loop') + } + }) + } catch (e) { + + } + }) + + } else { + avPlayer.playAudio([voiceURL], true, () => { + setTimeout(() => { + router.back(); + }, param302 == 8 ? 3000 : 0) + }) + } } + // 当前项目转换 getDqxmStr = (type) => { const projectsObj = this.judgeUI.projectsObj @@ -936,25 +1117,26 @@ export default class Judge { } } //人工操作项目 - public setJudgeItem = async (itemno,type:1|2) => { + public setJudgeItem = async (itemno, type: 1 | 2) => { const {fileLog} = this; - await examJudgeArtificialItem(itemno * 1,type); + await examJudgeArtificialItem(itemno * 1, type); await fileLog.setExamJudgeData({ method: 'examJudgeArtificialItem', itemno: itemno * 1, type }) - console.info(judgeTag, `人工评判${type == 1?'进入':'取消'}项目-${itemno}`) + console.info(judgeTag, `人工评判${type == 1 ? '进入' : '取消'}项目-${itemno}`) } //人工扣分 - public setJudgeMark = async (itemno, serial) => { + public setJudgeMark = async (itemno, serial, type = 1) => { const {fileLog} = this - await examJudgeArtificialMark(itemno * 1, serial); + await examJudgeArtificialMark(itemno * 1, serial, type); await fileLog.setExamJudgeData({ method: 'examJudgeArtificialMark', itemno: itemno * 1, - serial + serial, + type }) console.info(judgeTag, `人工扣分-${itemno}-${serial}`) @@ -1026,8 +1208,8 @@ export default class Judge { console.info('plc信号', msg) const {fileLog,getPlcData,usbService} = this const stachArr = msg.split(',') - const {isEnd} = this; - if (stachArr[0] != '#DN_GD' || isEnd) { + const {isExamEnd} = this; + if (stachArr[0] != '#DN_GD' || isExamEnd) { return } const plcData = await getPlcData(msg); @@ -1039,6 +1221,8 @@ export default class Judge { usbService.sendUSB(str) } this.judgeUI.isDwztRight = plcData.gps.dwzt == 4; + this.judgeUI.sd = (Math.floor(plcData.gps.sd as number) || 0) + ''; + this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' await examJudgeRealExam(plcData) const udpIndex = globalThis.udpIndex; if (udpIndex % 5 === 0) { @@ -1103,48 +1287,59 @@ export default class Judge { } // 4.过程数据 this.tempData = msg + this.judgeUI.isDwztRight = msg?.gps?.dwzt == 4; + this.judgeUI.sd = Math.floor(msg?.gps?.sd) + ''; + this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + '' this.plcData = msg + // this.judgeUI.isDwztRight = msg.gps.dwzt == 4; globalThis.msgStr = '' - if(msg.method === 'examJudgeArtificialItem'){ - setJudgeItem(msg.itemno,msg.type) + if (msg.method === 'examJudgeArtificialItem') { + setJudgeItem(msg.itemno, msg.type) } - if(msg.method === 'examJudgeArtificialMark'){ - setJudgeItem(msg.itemno,msg.serial) + if (msg.method === 'examJudgeArtificialMark') { + setJudgeItem(msg.itemno, msg.serial) } await examJudgeRealExam(msg) num++ - }, 200) + }, 50) globalThis.judgeTimer = judgeTimer; } - // 统计必考项目数量 + // 统计必考项目、所有项目、已考数量 setCountItems = async () => { const carInfo = globalThis.carInfo; const { examSubject} = carInfo; const {projectsObj} = this.judgeUI; - if(examSubject == 3){ - //必考项目数量 必考项目已考数量 - let projectNum = 0,endProjectsNum =0; - Reflect.ownKeys(projectsObj).forEach(projectKey=>{ - const {type,isRequired} = projectsObj[projectKey]; - if(isRequired){ - projectNum += 1; - if(type == 3 || type == 4){ - endProjectsNum += 1; - } - } - }) - //必考项目除靠边停车是否全部完成 - this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0) - } - } + //必考项目数量 必考项目已考数量 + let projectNum = 0, endProjectsNum = 0; + // 所有考试项目数量 项目已考项目数量 + let allProjectNum = 0, allEndProjectsNum = 0; + Reflect.ownKeys(projectsObj).forEach(projectKey => { + const {type,isRequired} = projectsObj[projectKey]; + allProjectNum += 1; + if (type == 3 || type == 4) { + allEndProjectsNum += 1; + } + + if (isRequired) { + projectNum += 1; + if (type == 3 || type == 4) { + endProjectsNum += 1; + } + } + + }) + //必考项目除靠边停车是否全部完成 + this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0) + this.judgeUI.isAllProjectsEnd = (allProjectNum - allEndProjectsNum === 0) + } // 模拟灯光 setMndg = async (mndgStr: string) => { this.mndgStr = mndgStr } // 路段信息处理 - setRoadAndLane = async (lane)=>{ + setRoadAndLane = async (lane) => { const {road,num,count} = lane; } @@ -1170,7 +1365,9 @@ export default class Judge { //是否是考试模式 private isExam: boolean //考试是否结束了 - private isEnd: boolean + private isExamEnd: boolean + //是否手动结束考试 + private isManual: boolean //UDP服务序列号 private serialIndex: number private fileUtil: FileUtil @@ -1195,6 +1392,7 @@ export default class Judge { markcatalog: string markserial: string kfxh: string + type: 0| 1 | 2 }[] private km2ItemsStatus: any[] //所有的科目考试项目(大车&小车) @@ -1209,6 +1407,8 @@ export default class Judge { private isTrajectoryOpen: boolean; // 调代理接口是否断网了 private isJudgeDisConnect: boolean; - private artSubject3ProjectsCodesArr:number[] = [3, 9, 4, 10, 12, 11] - + private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] + private lane: LANE = { + road: '', num: 0, count: 0 + } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts b/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts index a935a7fd..f5abffbc 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts @@ -1,5 +1,8 @@ import FileUtil from '../../../common/utils/File' import zlib from '@ohos.zlib'; +import promptAction from '@ohos.promptAction'; +import router from '@ohos.router'; + export default class FileModel{ //后续文件路径待替换 @@ -47,8 +50,16 @@ export default class FileModel{ //获取文件内容 public getModelContent = (folderPath,fileName) => { const {fileUtil} = this; - const content = fileUtil.getFileContent(`${folderPath}/${fileName}`) - return content; + try { + const content = fileUtil.getFileContent(`${folderPath}/${fileName}`) + return content; + }catch (e){ + promptAction.showToast({ + message:"请检查模型路径是否正确!", + duration:4000 + }) + router.back() + } } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts b/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts index 58aac620..660ac918 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts @@ -1,8 +1,7 @@ -import mediaLibrary from '@ohos.multimedia.mediaLibrary' -import onvifclient from '@ohos.onvifclient'; -import fs from '@ohos.file.fs' -import util from '@ohos.util'; import FileUtil from '../../../common/utils/File' +import { takePhoto } from '../../../common/service/videoService'; +import promptAction from '@ohos.promptAction'; +import {judgeConfig} from './judgeConfig' interface Params{ userName:string @@ -10,6 +9,7 @@ interface Params{ ip:string port:string rlls:string + pztd:string } export default class FilePhoto{ @@ -21,51 +21,33 @@ export default class FilePhoto{ constructor(context) { (async ()=>{ + //TODO 309参数 获取拍照摄像头拍照通道 const fileUtil = new FileUtil(context) - const strConfig = await fileUtil.readFile('/mnt/hmdfs/100/account/device_view/local/files/logs/config/config3.txt'); + const strConfig = await fileUtil.readFile('/mnt/hmdfs/100/account/device_view/local/files/config/config3.txt'); const config = JSON.parse(strConfig) - const {userName,ip,pwd,port,rlls} = config - this.params = {userName,pwd,ip,port,rlls} + const {userName,ip,pwd,port,rlls,pztd} = config + this.params = {userName,pwd,ip,port,rlls,pztd} this.context = context this.fileUtil = fileUtil })() } - public async getPhoto(){ - const {params,context,fileUtil} = this; - const {userName,pwd,ip,port,rlls} = params; - const mediaTest = mediaLibrary.getMediaLibrary(context); - let mediaType = mediaLibrary.MediaType.IMAGE; - let DIR_DOCUMENTS = mediaLibrary.DirectoryType.DIR_IMAGE; - const path = await mediaTest.getPublicDirectory(DIR_DOCUMENTS); - - return new Promise(async (resolve)=>{ - mediaTest.createAsset(mediaType, 'judge_face.jpg', path,(error,asset)=>{ - asset.open('rw', (error, fd) => { - if (fd > 0) { - const file_path = "/mnt/hmdfs/100/account/device_view/local/files/Pictures/judge_face.jpg" - const result3 = onvifclient.getVideoSnapshot(`rtsp://${userName}:${pwd}@${ip}:${port}/h264/ch${rlls}/main/av_stream`,file_path,fd); - fs.closeSync(fd); - asset.close(fd); - fs.lstat(file_path).then((stat) => { - console.info("get link status succeed, the size of file is" + stat.size); - let file = fs.openSync(file_path, fs.OpenMode.READ_WRITE); - const size=Number(stat.size)+100 - let buf = new ArrayBuffer(size); - let num = fs.readSync(file.fd, buf); - const that = new util.Base64(); - const array = new Uint8Array(buf); - const result = that.encodeToStringSync(array);//base64圖片 - fileUtil.deleteF(file_path,3) - resolve(result) - }).catch((err) => { - console.info("get link status failed with error message: " + err.message + ", error code: " + err.code); - }); - } else { - console.error('baoyihu getVideoSnapshot File Open failed with error: ' + error); - } + public getPhoto = async () => { + const {params} = this; + if(!judgeConfig.isPhotoOpen){ + return '' + }else{ + try { + const res = await takePhoto(params, this.context, 'pz/',2); + return res.base64 + } catch (e) { + promptAction.showToast({ + message: JSON.stringify(e), + duration: 2000 }); - }); - }) + return '' + } + } } + } \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts index 144a65ac..cbe28464 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts @@ -66,36 +66,44 @@ export function getCenterProjectStatus(status){ export function getKmProjectVoice( projectCode, // 1:项目开始 2:项目结束 - type: 1 | 2 + type: 1 | 2, + judgeConfig, + lane ) { const carInfo = globalThis.carInfo; const { examSubject } = carInfo; + const param506Str = judgeConfig['506']?.split(',') || []; + const param512Str = judgeConfig['512']?.split(',') || []; + const param544Str = judgeConfig['544'] || 0; + const param405Str = judgeConfig['405'] || 0; + const {num,count} = lane if(examSubject == 2){ return projectCode } - switch (projectCode*1){ //直线行驶 case 40300: return type === 1 ? 403001 : 403002 //变更车道 case 40500: return type === 1 ? 405001 : 405002 - //超车 - case 41400 : return type === 1 ? 414001 : undefined - //直线行驶 - case 40700 : return type === 1 ? 407001 : undefined //左转 case 40800 : return type === 1 ? 408001 : undefined //右转 case 40900 : return type === 1 ? 409001 : undefined - //通过人行横道 - case 41000 : return type === 1? 410001:undefined - //通过学校 - case 41100 : return type === 1 ? 411001:undefined + //会车 506-6为1都报 + case 41300 : return type === 1 ? 413001: (param506Str[5]===1?413002:undefined) + //超车 + case 41400 : return type === 1 + ? (param405Str == 1 && (num == count)?undefined:414001) + : undefined + //直线行驶 + case 40700 : return type === 1 ? 407001 : undefined + //TODO 通过学校 结束param544Str + case 41100 : return type === 1 ? (param512Str[2] ==3 ? 411001 : undefined):undefined //通过车站 - case 41200 : return type === 1 ? 412001 : undefined - //会车 - case 41300 : return type === 1 ? 413001: 413002 + case 41200 : return type === 1 ? (param512Str[2] ==3 ? 412001 : undefined):undefined + //通过人行横道 + case 41000 : return type === 1? (param512Str[2] == 3 ? 410001 : undefined):undefined //靠边停车 case 40600 : return type === 1 ? 406001 : undefined //掉头 @@ -114,6 +122,7 @@ export function promptWxCode( code:number ){ let toast = ''; + const singlePlay = globalThis.singlePlay if(singlePlay){ return @@ -204,10 +213,12 @@ export function promptWxCode( break; default :break; } - promptAction.showToast({ - message: decodeURIComponent(toast), - duration: 4000 - }); + //TODO 兼容新监管code + // console.info('surenjun showToast') + // promptAction.showToast({ + // message: decodeURIComponent(toast), + // duration: 4000 + // }); } // 获取plc数据 diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts index 58e31e14..bf2790ef 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -3,14 +3,20 @@ export const judgeConfig = { //本地目录开关 isTrajectoryOpen: false, + //是否开启拍照 + isPhotoOpen: false, + //扣分语音是否强制开启 + kfVoiceOpen: true, + // 是否忽略考试前熄火、车门检查 + isCheckFireOpen: true, //是否开启Udp udpOpen:false, // 本地模型地址 modelPath: 'models/model_enc', - // 轨迹回放地址 - trajectoryPath: 'logs/2024_07_11/0000000000001_342323199501470011_测试学员1_2024_07_11_13_33_10/judge_exam_data.txt', - //扣分语音是否强制开启 - kfVoiceOpen:true, + // 济南科目三 + trajectoryPath: 'logs/2024_07_31/0000000000001_342323199501470011_测试学员1_2024_07_31_10_21_38/judge_exam_data.txt', + // 杭州科目二 + // trajectoryPath: 'logs/2024_07_19/0000000000001_342323199501470011_测试学员1_2024_07_19_06_49_12/judge_exam_data.txt', //TODO 济南临时特殊配置 systemParamConfig:{} } \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts index 7925f759..a2b0ef5f 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts @@ -2,41 +2,66 @@ import Prompt from '@system.prompt' const TAG = 'SURENJUN_JUDGE' -export default class JudgeTask{ +interface QUEUE { + fn: Function, + config?: { + isDelay: boolean + delayTime: number + } +} + +export default class JudgeTask { private queue = [] - private status:string + private status: string + constructor() { this.queue = [] this.status = 'end' } - executeQueue = async ()=>{ - const {queue,executeQueue} = this - if(queue.length){ - for (const currentTask of queue) { - const {status} = this + // + goTask = async (currentTask) => { + const {fn,delayConfig={}} = currentTask; + const { isDelay = false,delayTime = 1000} = delayConfig + return new Promise(async (res, rej) => { + setTimeout(async () => { try { - await currentTask(); - }catch (e){ - // console.info(TAG,'过程数据接口解析错误') + await fn() + res(true) + } catch (e) { + console.info(TAG, JSON.stringify(e)) Prompt.showToast({ message: '过程数据接口解析错误', duration: 3000 }); + rej(false) } + }, isDelay ? delayTime : 0); + }) + } + + executeQueue = async () => { + const {queue,executeQueue} = this + if (queue.length) { + for (const currentTask of queue) { + await this.goTask(currentTask) this.queue.shift() await executeQueue() } - }else{ + } else { this.status = 'end' } } - addTask = async (fn) =>{ - this.queue.push(fn); - if(this.status == 'end' && this.queue.length === 1){ + addTask = async (fn, delayConfig?: { + isDelay: Boolean, + delayTime?: Number + }) => { + this.queue.push({ + fn, delayConfig + }); + if (this.status == 'end' && this.queue.length === 1) { await this.executeQueue(); } } - } diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeTask_BAK.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask_BAK.ts new file mode 100644 index 00000000..ffc86328 --- /dev/null +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask_BAK.ts @@ -0,0 +1,58 @@ +import Prompt from '@system.prompt' + +const TAG = 'SURENJUN_JUDGE' +interface QUEUE{ + fn:Function, + config?:{ + isDelay:boolean + delayTime:number + } +} + +export default class JudgeTask{ + private queue = [] + private status:string + constructor() { + this.queue = [] + this.status = 'end' + } + + executeQueue = async ()=>{ + const {queue,executeQueue} = this + if(queue.length){ + for (const currentTask of queue) { + const {fn,delayConfig:{ + isDelay = false, + delayTime = 1000 + }} = currentTask; + const {status} = this + try { + isDelay + ?setTimeout(async ()=>{await fn()}) + :await fn(); + }catch (e){ + // console.info(TAG,'过程数据接口解析错误') + Prompt.showToast({ + message: '过程数据接口解析错误', + duration: 3000 + }); + } + this.queue.shift() + await executeQueue() + } + }else{ + this.status = 'end' + } + } + + addTask = async (fn,delayConfig?:{ + isDelay:Boolean, + delayTime:Number + }) =>{ + this.queue.push({fn,delayConfig}); + if(this.status == 'end' && this.queue.length === 1){ + await this.executeQueue(); + } + } + +} diff --git a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts index e1f4c1b2..a8c0ee70 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts @@ -1,6 +1,8 @@ import media from '@ohos.multimedia.media'; import Prompt from '@system.prompt'; import url from '@ohos.url'; +import fileuri from "@ohos.file.fileuri"; +import mediaLibrary from '@ohos.multimedia.mediaLibrary'; const TAG = 'VoiceAnnounce' @@ -84,10 +86,49 @@ class AVPlayer { // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 async play(name,callback) { + let isInSD = true + try { + //检查SD中的语音 + console.info('surenjun name',name) + console.info('surenjun name',name.split('/')[1]) + let playSrc = await this.queryFile(name.split('/')[1]); + let fdPath = await playSrc.open('r') + let audioPlayer = media.createAudioPlayer() + console.info('surenjun fdPath=>',fdPath) + audioPlayer.on('dataLoad', () => { + this.voiceStatus = 'playing' + audioPlayer.play() + }) + return new Promise(async (resolve)=>{ + audioPlayer.on('finish', () => { + //@ts-ignore + this.voiceStatus = 'completed' + if(callback){ + callback() + } + audioPlayer.stop(); + audioPlayer.reset() + audioPlayer.release() + resolve(true) + }) + audioPlayer.reset() + audioPlayer.src = `fd://${fdPath}` + }) + + + return + }catch (e){ + console.info('surenjun fdPath=>',JSON.stringify(e)) + isInSD = false; + } + if(!isInSD){ + return + } + //检查SD中的语音 this.endCallback = callback const avPlayer = await media.createAVPlayer(); this.avPlayer = avPlayer; - console.info('surenjun',callback) + return new Promise(async (resolve,reject) => { let url = '' await this.setAVPlayerCallback(()=>{ @@ -106,6 +147,26 @@ class AVPlayer { } }) } + + async queryFile(displayName): Promise { + const mediaLib = mediaLibrary.getMediaLibrary(globalThis.context); + let ret + let fetchOp = { + selections: `media_type=? AND display_name = ?`, + selectionArgs: [`${mediaLibrary.MediaType.AUDIO}`,displayName], + }; + let fileResult = await mediaLib.getFileAssets(fetchOp); + let retCount = fileResult.getCount(); + console.info('surenjun retCount=>',retCount) + if (retCount > 0) { + ret = fileResult.getFirstObject(); + return Promise.resolve(ret); + }else{ + return Promise.reject(0); + } + + } + //音频播放队列 public releasePlayer() { this.avPlayer.release(); diff --git a/entry/src/main/resources/rawfile/judge/km3/会车_green.png b/entry/src/main/resources/rawfile/judge/km3/会车_green.png new file mode 100644 index 00000000..e1b58a82 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/会车_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/会车_red.png b/entry/src/main/resources/rawfile/judge/km3/会车_red.png new file mode 100644 index 00000000..047e2386 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/会车_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/停车_green.png b/entry/src/main/resources/rawfile/judge/km3/停车_green.png new file mode 100644 index 00000000..0536a1f9 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/停车_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/停车_red.png b/entry/src/main/resources/rawfile/judge/km3/停车_red.png new file mode 100644 index 00000000..3322b7dc Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/停车_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/变道_green.png b/entry/src/main/resources/rawfile/judge/km3/变道_green.png new file mode 100644 index 00000000..72926b02 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/变道_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/变道_red.png b/entry/src/main/resources/rawfile/judge/km3/变道_red.png new file mode 100644 index 00000000..4be6efe1 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/变道_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/掉头_green.png b/entry/src/main/resources/rawfile/judge/km3/掉头_green.png new file mode 100644 index 00000000..cb6d9ff9 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/掉头_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/掉头_red.png b/entry/src/main/resources/rawfile/judge/km3/掉头_red.png new file mode 100644 index 00000000..bbc8681f Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/掉头_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/直线_green.png b/entry/src/main/resources/rawfile/judge/km3/直线_green.png new file mode 100644 index 00000000..ca4438ec Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/直线_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/直线_red.png b/entry/src/main/resources/rawfile/judge/km3/直线_red.png new file mode 100644 index 00000000..0309d51f Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/直线_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/超车_green.png b/entry/src/main/resources/rawfile/judge/km3/超车_green.png new file mode 100644 index 00000000..b5b021b6 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/超车_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/超车_red.png b/entry/src/main/resources/rawfile/judge/km3/超车_red.png new file mode 100644 index 00000000..1d45bc57 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/超车_red.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/路口_green.png b/entry/src/main/resources/rawfile/judge/km3/路口_green.png new file mode 100644 index 00000000..c8a25cba Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/路口_green.png differ diff --git a/entry/src/main/resources/rawfile/judge/km3/路口_red.png b/entry/src/main/resources/rawfile/judge/km3/路口_red.png new file mode 100644 index 00000000..f18d7087 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/km3/路口_red.png differ diff --git a/entry/src/main/resources/rawfile/voice/405002.mp3 b/entry/src/main/resources/rawfile/voice/405002.mp3 index 056f6f6d..993e3531 100644 Binary files a/entry/src/main/resources/rawfile/voice/405002.mp3 and b/entry/src/main/resources/rawfile/voice/405002.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/empty.mp3 b/entry/src/main/resources/rawfile/voice/empty.mp3 new file mode 100644 index 00000000..745724f9 Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/empty.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/关门.mp3 b/entry/src/main/resources/rawfile/voice/关门.mp3 new file mode 100644 index 00000000..9767a757 Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/关门.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/熄火.mp3 b/entry/src/main/resources/rawfile/voice/熄火.mp3 new file mode 100644 index 00000000..4a98d76f Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/熄火.mp3 differ