From 8afec6f7cd3dc6f8abe0a825727f72bfc7d6f361 Mon Sep 17 00:00:00 2001 From: Surenjun Date: Mon, 14 Oct 2024 14:17:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:c++=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/CMakeLists.txt | 8 +- entry/src/main/cpp/sdk/common/HDefine.h | 13 ++- entry/src/main/cpp/sdk/common/HSystem.cpp | 114 +++++++++++++------- entry/src/main/cpp/sdk/common/HSystem.h | 33 ++++-- entry/src/main/cpp/sdk/common/HVersion.h | 2 +- entry/src/main/cpp/sdk/common/Loggerxx.h | 16 +-- entry/src/main/cpp/sdk/common/Tools.cpp | 4 +- entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp | 27 ++++- 8 files changed, 148 insertions(+), 69 deletions(-) diff --git a/entry/src/main/cpp/CMakeLists.txt b/entry/src/main/cpp/CMakeLists.txt index ca30db87..156d7cb2 100644 --- a/entry/src/main/cpp/CMakeLists.txt +++ b/entry/src/main/cpp/CMakeLists.txt @@ -212,6 +212,7 @@ elseif(JUDGE_OS_OHOS) message("${MSG_NOTE} now compiler platform JUDGE_OS_OHOS") set(JUDGE_INCLUDE_PLATFORM + ${CMAKE_SYSROOT}/usr/include/ace ${CMAKE_SYSROOT}/usr/include/ace/xcomponent ${CMAKE_SYSROOT}/usr/include/native_window ${CMAKE_SOURCE_DIR}/sdk/api/js @@ -231,10 +232,10 @@ elseif(JUDGE_OS_OHOS) ) set(JUDGE_LIB_FILE_PLATFORM - ace_napi.z uv - ace_ndk.z native_window #//for-surface-nativeXComponent + ace_napi.z + ace_ndk.z hilog_ndk.z ) @@ -242,8 +243,8 @@ elseif(JUDGE_OS_ANDROID) message("${MSG_NOTE} now compiler platform JUDGE_OS_ANDROID") set(JUDGE_INCLUDE_PLATFORM - ${CMAKE_SOURCE_DIR}/third/android/include #本地开发看代码用的 ${CMAKE_SOURCE_DIR}/sdk/api/jni + ${CMAKE_SOURCE_DIR}/third/android/include #本地开发看代码用的 ) file(GLOB_RECURSE JUDGE_SOURCE_PLATFORM @@ -381,6 +382,7 @@ function(showOutputInfo) message(STATUS "${MSG_INFO} ENV{CFLAGS}=$ENV{CFLAGS}") message(STATUS "${MSG_INFO} ENV{CXXFLAGS=$ENV{CXXFLAGS}") + message(STATUS "${MSG_INFO} CMAKE_SYSROOT = ${CMAKE_SYSROOT}") message(STATUS "${MSG_INFO} CMAKE_DEFAULT_BUILD_TYPE = ${CMAKE_DEFAULT_BUILD_TYPE}") message(STATUS "${MSG_INFO} CMAKE_C_COMPILER = ${CMAKE_C_COMPILER}") message(STATUS "${MSG_INFO} CMAKE_CXX_COMPILER = ${CMAKE_CXX_COMPILER}") diff --git a/entry/src/main/cpp/sdk/common/HDefine.h b/entry/src/main/cpp/sdk/common/HDefine.h index ede59454..627daf52 100644 --- a/entry/src/main/cpp/sdk/common/HDefine.h +++ b/entry/src/main/cpp/sdk/common/HDefine.h @@ -12,9 +12,9 @@ #include "CleverHelper.h" //字面量转化为字符串的宏定义 -#define JUDGE_EXP_STR(x) #x +#define JUDGE_STR(x) #x -#define JUDGE_EXP_EXPAND(x) x +#define JUDGE_EXPAND(x) x //可变参数列表 #define JUDGE_VA_ARGS(...) __VA_ARGS__ @@ -65,8 +65,6 @@ #define sdk_ssleep(x) std::this_thread::sleep_for(std::chrono::seconds(x)) - - //距离单位换算枚举(以毫米为基准单位) enum DisUnit { @@ -114,6 +112,13 @@ struct SpaceStorage int64 spaceSelf = 0; //当前进程占用(只针对内存有效,磁盘空间无效) }; + +enum CharsetType +{ + CharsetTypeUTF8, + CharsetTypeGBK +}; + //============================================================ using ILock = std::lock_guard; using ULock = std::unique_lock; diff --git a/entry/src/main/cpp/sdk/common/HSystem.cpp b/entry/src/main/cpp/sdk/common/HSystem.cpp index 70e5f4e2..b828b3aa 100644 --- a/entry/src/main/cpp/sdk/common/HSystem.cpp +++ b/entry/src/main/cpp/sdk/common/HSystem.cpp @@ -3,17 +3,17 @@ #if defined(JUDGE_OS_FAMILY_WINDOWS) - JUDGE_C_API bool __sdk_localtime_safe__(time_t* __t, tm* __tm) + bool __sdk_localtime_safe__(time_t* __t, tm* __tm) { return ::localtime_s(__tm, __t) == 0; } - JUDGE_C_API int64 __sdk_mktime_safe__(tm* __tm) + int64 __sdk_mktime_safe__(tm* __tm) { return ::_mktime64(__tm); } - JUDGE_C_API bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm) + bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm) { const char* _fmt = "%d-%d-%d %d:%d:%d"; if(NULL != ::strchr(__fmt, '/')) @@ -34,22 +34,22 @@ return true; } - JUDGE_C_API bool __sdk_filepath_exist__(const char* __filepath) + bool __sdk_filepath_exist__(const char* __filepath) { return (::_access(__filepath, 0) == 0); } - JUDGE_C_API int __sdk_mkdir__(const char* __path) + int __sdk_mkdir__(const char* __path) { return ::_mkdir(__path); } - JUDGE_C_API int __sdk_rmdir__(const char* __path) + int __sdk_rmdir__(const char* __path) { return ::_rmdir(__path); } - JUDGE_C_API bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit) + bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit) { const double _n = (double)__unit; MEMORYSTATUSEX _m; @@ -65,7 +65,7 @@ return __ok; } - JUDGE_C_API bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit) + bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit) { const double _n = (double)__unit; ULARGE_INTEGER bytesAvail, bytesTotal, bytesFree; @@ -79,63 +79,70 @@ return __ok; } - std::string __sdk_gbk_to_utf8__(const char* strgbk) + std::string __sdk_charset_convert__(const std::string& __str, int __from, int __to) { - int wlen = MultiByteToWideChar(CP_ACP, 0, strgbk, -1, NULL, 0); + int from_charset = -1, to_charset = -1; + + switch(__from) + { + case CharsetTypeUTF8: from_charset = CP_UTF8; break; + case CharsetTypeGBK: from_charset = CP_ACP; break; + default: TASSERT(false, ""); break; + } + + switch(__to) + { + case CharsetTypeUTF8: to_charset = CP_UTF8; break; + case CharsetTypeGBK: to_charset = CP_ACP; break; + default: TASSERT(false, ""); break; + } + + + int wlen = MultiByteToWideChar(from_charset, 0, __str.data(), -1, NULL, 0); std::wstring wstr(wlen+1, L'\0'); - MultiByteToWideChar(CP_ACP, 0, strgbk, -1, wstr.data(), wlen); - int len = WideCharToMultiByte(CP_UTF8, 0, wstr.data(), -1, NULL, 0, NULL, NULL); + MultiByteToWideChar(from_charset, 0, __str.data(), -1, wstr.data(), wlen); + int len = WideCharToMultiByte(to_charset, 0, wstr.data(), -1, NULL, 0, NULL, NULL); std::string str(len+1, '\0'); - WideCharToMultiByte(CP_UTF8, 0, wstr.data(), -1, str.data(), len, NULL, NULL); + WideCharToMultiByte(to_charset, 0, wstr.data(), -1, str.data(), len, NULL, NULL); return str; } - std::string __sdk_utf8_to_gbk__(const char* strutf8) - { - int wlen = MultiByteToWideChar(CP_UTF8, 0, strutf8, -1, NULL, 0); - std::wstring wstr(wlen+1, L'\0'); - MultiByteToWideChar(CP_UTF8, 0, strutf8, -1, wstr.data(), wlen); - int len = WideCharToMultiByte(CP_ACP, 0, wstr.data(), -1, NULL, 0, NULL, NULL); - std::string str(len+1, '\0'); - WideCharToMultiByte(CP_ACP, 0, wstr.data(), -1, str.data(), len, NULL, NULL); - return str; - } #elif defined(JUDGE_OS_FAMILY_LINUX) - JUDGE_C_API bool __sdk_localtime_safe__(time_t* __t, tm* __tm) + bool __sdk_localtime_safe__(time_t* __t, tm* __tm) { tm* p = ::localtime_r(__t, __tm); return p != NULL; } - JUDGE_C_API int64 __sdk_mktime_safe__(tm* __tm) + int64 __sdk_mktime_safe__(tm* __tm) { return ::mktime(__tm); } - JUDGE_C_API bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm) + bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm) { char* p = ::strptime(__s, __fmt, __tm); return p != NULL; } - JUDGE_C_API bool __sdk_filepath_exist__(const char* __filepath) + bool __sdk_filepath_exist__(const char* __filepath) { return (::access(__filepath, F_OK) == 0); } - JUDGE_C_API int __sdk_mkdir__(const char* __path) + int __sdk_mkdir__(const char* __path) { return ::mkdir(__path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO); } - JUDGE_C_API int __sdk_rmdir__(const char* __path) + int __sdk_rmdir__(const char* __path) { return ::rmdir(__path); } - JUDGE_C_API bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit) + bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit) { const double _n = (double)__unit; long long page_size = ::sysconf(_SC_PAGE_SIZE); @@ -150,7 +157,7 @@ return __ok; } - JUDGE_C_API bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit) + bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit) { const double _n = (double)__unit; struct ::statfs disk; @@ -164,16 +171,44 @@ return __ok; } - std::string __sdk_gbk_to_utf8__(const char* strgbk) + std::string __sdk_charset_convert__(const std::string& __str, int __from, int __to) { - TASSERT(false, "not support!"); - return std::string(strgbk); - } + std::string from_charset, to_charset; - std::string __sdk_utf8_to_gbk__(const char* strutf8) - { - TASSERT(false, "not support!"); - return std::string(strutf8); + switch(__from) + { + case CharsetTypeUTF8: from_charset = "UTF-8"; break; + case CharsetTypeGBK: from_charset = "GBK"; break; + default: TASSERT(false, ""); break; + } + + switch(__to) + { + case CharsetTypeUTF8: to_charset = "UTF-8"; break; + case CharsetTypeGBK: to_charset = "GBK"; break; + default: TASSERT(false, ""); break; + } + + iconv_t cd = iconv_open(to_charset.data(), from_charset.data()); + if(cd == (iconv_t)(-1)) + { + return std::string(); + } + char* inbuf = const_cast(__str.data()); + size_t inbytesleft = __str.size(); + size_t outbytesleft = inbytesleft * 4; // UTF-8 最坏情况下是 GBK 的 4 倍 + std::string out(outbytesleft, '\0'); + char* outbuf = out.data(); + //转换编码 + size_t ret = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + if(ret == (size_t)(-1)) + { + iconv_close(cd); + return std::string(); + } + //清理 + iconv_close(cd); + return out; } #else @@ -181,3 +216,4 @@ # error "define-error-msg: unknow system." #endif + diff --git a/entry/src/main/cpp/sdk/common/HSystem.h b/entry/src/main/cpp/sdk/common/HSystem.h index 5d95ec86..db51b087 100644 --- a/entry/src/main/cpp/sdk/common/HSystem.h +++ b/entry/src/main/cpp/sdk/common/HSystem.h @@ -277,6 +277,7 @@ using uint64 = unsigned long long; // using uint64 = std::uint64_t; #include #include #include + #include #else @@ -297,17 +298,24 @@ using uint64 = unsigned long long; // using uint64 = std::uint64_t; # define __sdk_os_assert__(exp) assert(false) #endif +JUDGE_EXTERN_C_BEGIN -JUDGE_C_API bool __sdk_localtime_safe__(time_t* __t, tm* __tm); -JUDGE_C_API int64 __sdk_mktime_safe__(tm* __tm); -JUDGE_C_API bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm); -JUDGE_C_API bool __sdk_filepath_exist__(const char* __filepath); -JUDGE_C_API int __sdk_mkdir__(const char* __path); -JUDGE_C_API int __sdk_rmdir__(const char* __path); -JUDGE_C_API bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); -JUDGE_C_API bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); -std::string __sdk_gbk_to_utf8__(const char* strgbk); -std::string __sdk_utf8_to_gbk__(const char* strutf8); +bool __sdk_localtime_safe__(time_t* __t, tm* __tm); +int64 __sdk_mktime_safe__(tm* __tm); +bool __sdk_strptime_safe__(const char* __s, const char* __fmt, tm* __tm); +bool __sdk_filepath_exist__(const char* __filepath); +int __sdk_mkdir__(const char* __path); +int __sdk_rmdir__(const char* __path); +bool __sdk_space_memory__(struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); +bool __sdk_space_disk__(const char* __driver, struct SpaceStorage* __space, int __unit/*is SpaceUnit*/); + +JUDGE_EXTERN_C_END + +JUDGE_EXTERN_CXX_BEGIN + +std::string __sdk_charset_convert__(const std::string& __str, int __from, int __to/*enum CharsetType*/); + +JUDGE_EXTERN_CXX_END /********************************************************************************************** * @@ -447,6 +455,11 @@ std::string __sdk_utf8_to_gbk__(const char* strutf8); * std:c++17 201703L * std:c++20 202002L * +********************************************************************************************** +* +* __VA_ARGS__ 用于获取传递给可变参数宏的参数列表。 +* ##__VA_ARGS__ 用于在宏展开时删除前面的逗号,尤其在没有传递任何参数时,避免出现多余的分隔符。 +* **********************************************************************************************/ diff --git a/entry/src/main/cpp/sdk/common/HVersion.h b/entry/src/main/cpp/sdk/common/HVersion.h index 51118c66..a8b3dabf 100644 --- a/entry/src/main/cpp/sdk/common/HVersion.h +++ b/entry/src/main/cpp/sdk/common/HVersion.h @@ -25,7 +25,7 @@ #define JUDGE_VERSION_MAJOR 1 #define JUDGE_VERSION_MINOR 0 #define JUDGE_VERSION_PATCH 2 -#define JUDGE_VERSION_STAMP 2410121423b +#define JUDGE_VERSION_STAMP 2410141037b #define JUDGE_AUX_EXP(x) #x #define JUDGE_AUX_STR(x) JUDGE_AUX_EXP(x) diff --git a/entry/src/main/cpp/sdk/common/Loggerxx.h b/entry/src/main/cpp/sdk/common/Loggerxx.h index c4313b87..d1f4fbe2 100644 --- a/entry/src/main/cpp/sdk/common/Loggerxx.h +++ b/entry/src/main/cpp/sdk/common/Loggerxx.h @@ -183,10 +183,12 @@ private: * **************************************************/ -#define Logxx Loggerxx::GetInstance() #ifdef JUDGE_USE_LOG +#define Logxx Loggerxx::GetInstance() +#define LOG_CALL_FUNC(func,format,...) Logxx->func(__FILE__,__LINE__,__FUNCTION__,LOG_TAG_SDK,UTF8S(format),##__VA_ARGS__) + //初始化日志模块 #define logInit(level) Logxx->init(level); //卸载日志模块 @@ -194,17 +196,17 @@ private: //设置日志级别 #define logSetLevel(level) Logxx->setLevel(level); //错误日志宏函数 -#define logerror(format, ...) Logxx->error (__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define logerror(format, ...) LOG_CALL_FUNC(error, format, ##__VA_ARGS__); //警告日志宏函数 -#define logwarning(format, ...) Logxx->warning(__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define logwarning(format, ...) LOG_CALL_FUNC(warning, format, ##__VA_ARGS__); //跟踪日志宏函数 -#define logtrace(format, ...) Logxx->trace (__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define logtrace(format, ...) LOG_CALL_FUNC(trace, format, ##__VA_ARGS__); //信息日志宏函数 -#define loginfo(format, ...) Logxx->info (__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define loginfo(format, ...) LOG_CALL_FUNC(info, format, ##__VA_ARGS__); //流水日志宏函数 -#define lognote(format, ...) Logxx->note (__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define lognote(format, ...) LOG_CALL_FUNC(note, format, ##__VA_ARGS__); //调试日志宏函数 -#define logdebug(format, ...) Logxx->debug (__FILE__, __LINE__, __FUNCTION__, LOG_TAG_SDK, format, ##__VA_ARGS__); +#define logdebug(format, ...) LOG_CALL_FUNC(debug, format, ##__VA_ARGS__); #else diff --git a/entry/src/main/cpp/sdk/common/Tools.cpp b/entry/src/main/cpp/sdk/common/Tools.cpp index b625adf6..da2bbddc 100644 --- a/entry/src/main/cpp/sdk/common/Tools.cpp +++ b/entry/src/main/cpp/sdk/common/Tools.cpp @@ -304,12 +304,12 @@ std::string Tools::toJson(const nlohmann::json& root) std::string Tools::gbkToUtf8(const std::string& str) { - return __sdk_gbk_to_utf8__(str.data()); + return __sdk_charset_convert__(str.data(), CharsetTypeGBK, CharsetTypeUTF8); } std::string Tools::utf8ToGbk(const std::string& str) { - return __sdk_utf8_to_gbk__(str.data()); + return __sdk_charset_convert__(str.data(), CharsetTypeUTF8, CharsetTypeGBK); } std::string Tools::tolower(const std::string& s) diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp index 723fb597..bc15f0af 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp @@ -4881,14 +4881,27 @@ void ExamCarSub3::playItemSound(TKM3Item* item, bool enter) if(item == nullptr) return; std::string sou = item->Item_Code + (enter ? "1" : "2"); std::string code; + std::string code2; int type = PlaySoundDefault; if(item->ItemNo == Sub3ItemType01Sczb) { - code = enter ? sound::sub3_40100 : ""; //"40100" sound::sub3_40100 item->Item_Code + //code = enter ? sound::sub3_40100 : ""; //"40100" sound::sub3_40100 item->Item_Code + if(enter) + { + code = sound::sub3_40100; + } + else + { + if(isItemPassed(Sub3ItemType41Mndg)) + { + //有可能先考模拟灯光,也有可能做完模拟灯光在考上车准备 + code2 = (isExamDrill() || isQualified() ? sound::sub3_402001 : ""); + } + } } else if(item->ItemNo == Sub3ItemType02Qbxx) { - code = enter ? sou : ""; + //402001 起步只在模拟灯光结束的时候报一次请起步继续完成考试语音 } else if(item->ItemNo == Sub3ItemType03Zxxs) { @@ -4998,7 +5011,11 @@ void ExamCarSub3::playItemSound(TKM3Item* item, bool enter) //ToDo1:播报语音"模拟夜间灯光使用考试结束,请关闭所有灯光'; //ToDo2:播报语音“请起步,继续完成考试'; code = (isExamDrill() || isQualified() ? sound::sub3_4170015 : ""); - //code = (isExamDrill() || isQualified() ? sound::sub3_402001 : ""); + if(isItemPassed(Sub3ItemType01Sczb)) + { + //有可能先考模拟灯光,也有可能做完模拟灯光在考上车准备 + code2 = (isExamDrill() || isQualified() ? sound::sub3_402001 : ""); + } } } else @@ -5010,6 +5027,10 @@ void ExamCarSub3::playItemSound(TKM3Item* item, bool enter) { createEventSound({item->ItemNo, code, type}); } + if(!code2.empty()) + { + createEventSound({item->ItemNo, code2, type}); + } } void ExamCarSub3::dealOffset()