File "D:\lantu\vcat2\tests\qwen_test_090401.py", line 21, in <module> agent.register(add) ^^^^^^^^^^^^^^ AttributeError: 'FnCallAgent' object has no attribute 'register'

时间: 2025-09-04 14:46:25 AIGC 浏览: 7
感谢你的反馈!根据你提供的错误信息: ``` AttributeError: 'FnCallAgent' object has no attribute 'register' ``` 这表明你当前使用的 `qwen-agent` 版本中,`FnCallAgent` 并不包含 `register` 方法。这可能是因为你使用的版本较新或较旧,API 已经发生了变化。 --- ### ✅ 正确使用方式(适用于最新版 `qwen-agent`) 在较新的 `qwen-agent` 版本中,函数注册方式已更改为通过构造器传入工具(functions)列表。以下是更新后的使用方式: #### 示例代码: ```python from qwen_agent.agents import FnCallAgent from qwen_agent.tools import add, multiply # 假设你已经定义了这些函数或从工具中导入 # 定义函数 def add(a: int, b: int) -> int: return a + b def multiply(a: int, b: int) -> int: return a * b # 初始化 FnCallAgent 并传入函数工具 agent = FnCallAgent(llm=None, functions=[add, multiply]) # 调用函数 result = agent.run("请计算 3 加上 4 的结果") print(result) # 输出 7 result = agent.run("请计算 6 乘以 8 的结果") print(result) # 输出 48 ``` --- ### 🔍 注意事项: - 确保你使用的是最新版本的 `qwen-agent`,可以通过以下命令更新: ```bash pip install --upgrade qwen-agent ``` - 如果你没有自定义 LLM(语言模型),可以传入 `llm=None`,否则应初始化一个合适的 LLM 实例。 - 你也可以将函数封装为工具类(继承 `Tool` 类),然后通过 `tools=[tool1, tool2]` 传入。 --- ### ✅ 推荐检查方式: 你可以通过以下方式查看当前 `FnCallAgent` 的属性: ```python import inspect print(inspect.getmembers(FnCallAgent)) ``` 这将列出所有支持的属性和方法。 ---
阅读全文

相关推荐

Traceback (most recent call last): File "D:\lantu0813\test_agent\tests\hk\test_qwen32vl_0826.py", line 38, in <module> response = ai_chat.invoke([message]) File "D:\lantu0813\test_agent\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 383, in invoke self.generate_prompt( File "D:\lantu0813\test_agent\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 1006, in generate_prompt return self.generate(prompt_messages, stop=stop, callbacks=callbacks, **kwargs) File "D:\lantu0813\test_agent\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 825, in generate self._generate_with_cache( File "D:\lantu0813\test_agent\.venv\lib\site-packages\langchain_core\language_models\chat_models.py", line 1072, in _generate_with_cache result = self._generate( File "D:\lantu0813\test_agent\.venv\lib\site-packages\langchain_openai\chat_models\base.py", line 1131, in _generate response = self.client.create(**payload) File "D:\lantu0813\test_agent\.venv\lib\site-packages\openai\_utils\_utils.py", line 287, in wrapper return func(*args, **kwargs) File "D:\lantu0813\test_agent\.venv\lib\site-packages\openai\resources\chat\completions\completions.py", line 1147, in create return self._post( File "D:\lantu0813\test_agent\.venv\lib\site-packages\openai\_base_client.py", line 1259, in post return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) File "D:\lantu0813\test_agent\.venv\lib\site-packages\openai\_base_client.py", line 1047, in request raise self._make_status_error_from_response(err.response) from None openai.InternalServerError: Internal Server Error

std::string Update::getMapInfo() { std::string result = ""; if(!m_data_list.empty()) { auto itr_value = m_data_list.begin(); for(; itr_value != m_data_list.end(); itr_value++) { if(result.empty() && itr_value == m_data_list.begin()) { result = itr_value->second->version; } if(itr_value->second->version != result) { WriteAndroidLog(4, "Local data version inconsistency"); } } } // WriteAndroidLog(4, "ZWX:mdata_list_enpty" + std::to_string(m_data_list)); return result; } #ifndef _UPDATE_H_ #define _UPDATE_H_ #include <iostream> #include <fstream> #include <vector> #include <string> #include <unistd.h> #include <cstdlib> #include <ctime> #include <cstdlib> #include <set> #include <sstream> #include <sys/stat.h> #include <sys/statfs.h> #include <zlib.h> #include <dirent.h> #include <sstream> #include <regex> #include <regex> #include "json.hpp" #include "threadpool.h" #include "jni.h" #include "tool.h" #include "isa_engine_api.h" #include "locationManager.h" #include "sqlite3.h" #define SOFTWAREVERSION "V0.8.7_20240206" #define MB2BYTE 1048576 #define DECRYPTION_AND_SIGNATURE_VERIFICATION 1 #define COPY_UPGRADE_PACKAGE 2 #define EXTRACT_UPGRADE_PACKAGE 3 #define DETECTING_AVAILABILITY 4 #define BACKUP_DATA 5 #define REPLACE_DATA 6 #define OfflineUpdating //离线更新时打开 //#define DifferentialUpdate //差分更新时打开 using json = nlohmann::json; using namespace lantu::isa; /*用于记录更新中信息*/ struct UpdateMessage { std::string country; //更新中的国家信息 std::string version; //更新中的数据版本 double total_size; //更新中的数据大小 double downloadSize; //已经下载的数据大小 double progress; //更新进度 bool is_current_flag;//是否为当前国 /** * getUpdatestatus()=0;未知 * getUpdatestatus()=1;更新初始化 * getUpdatestatus()=2;更新数据 * getUpdatestatus()=3;更新完成 * getUpdatestatus()=4;更新暂停 * getUpdatestatus()=5; 已取消更新 */ int updateStatus; //获取更新状态 0;未知 1;更新初始化 2;下载中 3;更新数据 4;更新完成 5;取消更新 UpdateMessage() { country = ""; version = ""; downloadSize = 0.0; progress = 0.0; is_current_flag = false; updateStatus = 0; total_size = 0.0; } }; using UpdateMessagePtr = std::shared_ptr<UpdateMessage>; /*用于记录更新告知信息*/ struct UpdateNotification { bool updateResult; std::vector<std::string> getUpdateSuccessfulList; std::vector<std::string> getUpdateFailedList; std::vector<std::string> UpdateException; UpdateNotification() { updateResult = false; } }; using UpdateNotificationPtr = std::shared_ptr<UpdateNotification>; //更新信息 struct UpdateInfo { /** * UPDATE_STATUS_POPUP_UPDATE =0: U盘内数据大于车机数据,进行更新; * UPDATE_STATUS_POPUP_NO_UPDATE=1:U盘内数据小于或等于车机数据,提示用户升级U盘中的数据再进行更新; * UPDATE_STATUS_POPUP_NO_U_DISK=2;未检测到U盘; * UPDATE_STATUS_POPUP_NO_U_DISK=3;U盘内无数据升级包; * UPDATE_STATUS_POPUP_OVERTIME =4: 检测到长时间未更新; * UPDATE_STATUS_OK=5:数据更新完成; * UPDATE_STATUS_FAIL=6:数据更新异常; * UPDATE_STATUS_CANCEL=7:数据更新取消; * UPDATE_STATUS_UPDATING=8:数据更新中; */ int updateStatus; UpdateMessagePtr updateMessage; //当updateStatus = 3的时有效 UpdateNotificationPtr updateNotification; //当updateStatus = 1、2的时有效 UpdateInfo() { updateStatus = -1; updateMessage = std::make_shared<UpdateMessage>(); updateNotification = std::make_shared<UpdateNotification>(); } std::string to_json_string() { json JUpdateInfo; JUpdateInfo["mapStatus"] = this->updateStatus; json JUpdateMessage; JUpdateMessage["country"] = this->updateMessage->country; JUpdateMessage["version"] = this->updateMessage->version; JUpdateMessage["totalSize"] = this->updateMessage->total_size; JUpdateMessage["progress"] = this->updateMessage->progress; JUpdateMessage["isCurrentCountry"] = this->updateMessage->is_current_flag; JUpdateMessage["downloadSize"] = this->updateMessage->downloadSize; JUpdateMessage["updateStatus"] = this->updateMessage->updateStatus; JUpdateInfo["mUpdateMessage"] = JUpdateMessage; json JUpdateNotification; JUpdateNotification["UpdateResult"] = this->updateNotification->updateResult; JUpdateNotification["UpdateSuccessfulList"] = this->updateNotification->getUpdateSuccessfulList; JUpdateNotification["UpdateFailedList"] = this->updateNotification->getUpdateFailedList; JUpdateNotification["UpdateException"] = this->updateNotification->UpdateException; JUpdateInfo["mUpdateNotification"] = JUpdateNotification; return JUpdateInfo.dump(); } }; using UpdateInfoPtr = std::shared_ptr<UpdateInfo>; /*用于管理本地数据的信息*/ struct DataMessage { std::string country; //本地的国家信息 std::string version; //对应的数据版本 double size; //更新中的数据大小 int map_status; //是否存在最新数据 std::string new_version; std::map<std::string, std::string> tile_version_map; DataMessage() { country = ""; version = ""; size = 0; map_status = 0; new_version = ""; } }; using DataMessagePtr = std::shared_ptr<DataMessage>; struct ReplaceMessage { std::string country; std::string version; std::string db_name1; std::string db_name2; std::string attach_sql; std::string delete_sql; std::string insert_sql; std::string detach_sql; std::string md5; std::string sha256; ReplaceMessage() { country = ""; version = ""; db_name1 = ""; db_name2 = ""; attach_sql = ""; delete_sql = ""; insert_sql = ""; detach_sql = ""; md5 = ""; sha256 = ""; } }; using ReplaceMessagePtr = std::shared_ptr<ReplaceMessage>; struct UpdateEnvironment { private: bool result; int gear; int Network; int HVPercent; int space; public: UpdateEnvironment() { result = true; gear = 0; Network = 0; HVPercent = 0; space = 0; } ~UpdateEnvironment() {}; bool get_result() { return result; } int get_gear() { return gear; } int get_Network() { return Network; } int get_HVPercent() { return HVPercent; } int get_Space() { return space; } void set_result(bool result) { this->result =result; } void set_gear(int gear) { this->gear =gear; } void set_Network(int Network) { this->Network = Network; } void set_HVPercent(int HVPercent) { this->HVPercent = HVPercent; } void set_Space(int space){ this->space = space; } std::string to_string() { json js_str; js_str["result"] = std::to_string(result); json js_str_reason; js_str_reason.push_back(gear); js_str_reason.push_back(Network); js_str_reason.push_back(HVPercent); js_str_reason.push_back(space); js_str["int_reason"] = js_str_reason; json js_reason; js_reason.push_back(""); js_str["reason"] = js_reason; return js_str.dump(); } }; //static static int threads_num = 0; //send_map struct SendMessage { private: std::map<std::string, std::string> messageSet; std::mutex mtx; public: void init(std::vector<UpdateInfoPtr> list) { auto itr_info = list.begin(); for( ; itr_info != list.end() ; itr_info++) { UpdateInfoPtr info = *itr_info; json JUpdateInfo; JUpdateInfo["mapStatus"] = 3; json JUpdateMessage; JUpdateMessage["country"] = info->updateMessage->country; JUpdateMessage["version"] = info->updateMessage->version; JUpdateMessage["totalSize"] = info->updateMessage->total_size; JUpdateMessage["progress"] = info->updateMessage->progress; JUpdateMessage["isCurrentCountry"] = info->updateMessage->is_current_flag; JUpdateMessage["downloadSize"] = info->updateMessage->downloadSize; JUpdateMessage["updateStatus"] = info->updateMessage->updateStatus; JUpdateInfo["mUpdateMessage"] = JUpdateMessage; json JUpdateNotification; JUpdateNotification["UpdateResult"] = info->updateNotification->updateResult; JUpdateNotification["UpdateSuccessfulList"] = info->updateNotification->getUpdateSuccessfulList; JUpdateNotification["UpdateFailedList"] = info->updateNotification->getUpdateFailedList; JUpdateNotification["UpdateException"] = info->updateNotification->UpdateException; JUpdateInfo["mUpdateNotification"] = JUpdateNotification; std::string str_json = JUpdateInfo.dump(); messageSet.insert(make_pair(info->updateMessage->country, str_json)); } } void put(UpdateInfoPtr info) { std::lock_guard<std::mutex> lock(mtx); if(info == nullptr) { return; } auto itr = messageSet.find(info->updateMessage->country); if(itr == messageSet.end() && info->updateStatus == 3) { lantu::isa::WriteAndroidLog(4,std::to_string(info->updateMessage->updateStatus)); return; } json JUpdateInfo; JUpdateInfo["mapStatus"] = info->updateStatus; json JUpdateMessage; JUpdateMessage["country"] = info->updateMessage->country; JUpdateMessage["version"] = info->updateMessage->version; JUpdateMessage["totalSize"] = info->updateMessage->total_size; JUpdateMessage["progress"] = info->updateMessage->progress; JUpdateMessage["isCurrentCountry"] = info->updateMessage->is_current_flag; JUpdateMessage["downloadSize"] = info->updateMessage->downloadSize; JUpdateMessage["updateStatus"] = info->updateMessage->updateStatus; JUpdateInfo["mUpdateMessage"] = JUpdateMessage; json JUpdateNotification; JUpdateNotification["UpdateResult"] = info->updateNotification->updateResult; JUpdateNotification["UpdateSuccessfulList"] = info->updateNotification->getUpdateSuccessfulList; JUpdateNotification["UpdateFailedList"] = info->updateNotification->getUpdateFailedList; JUpdateNotification["UpdateException"] = info->updateNotification->UpdateException; JUpdateInfo["mUpdateNotification"] = JUpdateNotification; if(itr == messageSet.end()) { messageSet.insert(make_pair("result", JUpdateInfo.dump())); } else { itr->second = JUpdateInfo.dump(); } } std::string to_string() { std::lock_guard<std::mutex> lock(mtx); std::string str = ""; auto itr_message = messageSet.begin(); for(; itr_message != messageSet.end(); itr_message++) { if(itr_message->second.empty()) { continue; } str = str + itr_message->second.data() + "|"; } return str; } void clear() { messageSet.clear(); } }; /*管理整个更新进程*/ class Update { private: //变量 std::string m_data_address; // 数据存放地址 std::string m_cache_address; double m_progress; // 更新进度 std::map<std::string, UpdateMessagePtr> m_update_list; // 更新列表 std::map<std::string, DataMessagePtr> m_data_list; // 本地地图版本清单 //std::vector<std::string> m_prepare_list; bool m_is_wifi_auto; // 是否为WIFI自动更新 bool m_is_suspend; bool m_is_cancel; std::string current_country; std::set<std::string> deleted_file_name; std::string topic_get_data; std::string topic_download_data; std::string topic_updata_status; ReadWriteLock m_update_list_lock; ReadWriteLock m_data_list_lock; ReadWriteLock m_prepare_list_lock; std::string vin_code; std::string sn_code; u_int32_t messageid; int progress; //离线更新 std::string U_data_path; // 用于记录U盘内的数据的绝对路径 std::set<std::string> lack_data_list; // 用于记录缺少的数据 std::string offline_version; //函数 void organizationCountryCode(); bool checkUSBPath(std::string usbPath); std::map<std::string, std::string> CountryCode; bool unzipFileLinux(const std::string& zipFilePath, const std::string& destinationPath = "./"); bool copyFile(const std::string& sourceFile, const std::string& destinationFile, size_t bufferSize); std::set<ReplaceMessagePtr> getHashValueSet(const std::string& hashPath); bool getHashValue(const std::string& data, std::string& hashValue, int code = 0); bool checkAuthenticity(const std::string& decryptedFilePath); void sendUpdateMessage(const UpdateInfoPtr& info); bool UpdateData(); std::string getFail(int i); long getFileSize(const std::string& filePath); float getHVPercent(); std::pair<std::string, std::string> extractVersionByDataPath(const std::string& localdatapath); void setProgress(const int& i, const int& code); bool zipDbFiles(std::string sourceDir, std::string outputZipPath) const; bool zip(std::string sourceDir, std::string outputZipPath) const; uint64_t getAvailableSpace(const std::string& filePath); std::vector<std::string> Search(const std::string& rootPath, const std::string& keyword, bool searchFiles = true, bool searchDirs = true); std::string getISADataCheckInfo(const std::string& dataPath); bool is_complete; bool update_falg; bool is_suspend; bool is_cancel; std::string U_path; std::string m_updateVersion; std::string m_releaseVersion; std::set<int> country_updateNotification; SendMessage m_send_message_struct; bool is_backup; bool is_dataRollBack; Update(); ~Update(); public: static Update* getinstance() { static Update update_instance; return &update_instance; } //单例模式 void setUSBPath(std::string usbPath); //离线U盘更新 void OfflineUpdateStart(); bool checkUsability(const std::string& dataPath); std::string getMapInfo(); void setUpdateVersion(const std::string& updateVersion); std::string getUpdateVersion(); UpdateEnvironment checkUpdateEnvironment(); std::string getCountryDbPath(); void setSuspend(bool falg); void setCancel(); bool mapControl(); bool dataBackUp(); bool dataRollBack(); void dataRepair(); // 静态方法,用于外部访问 m_data_address static std::string get_Global_m_data_address(); // 声明为 static bool UpdateInitialization(); JavaVM* javaVm; jobject carObj; }; #endif m_data_list 是什么东西?

void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_1() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv * _env = 0 ; /* Initializing argument 2 (thiz) */ ::jobject _thiz = 0 ; /* Pre-condition report */ CPPTEST_REPORT_PTR("Input: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Input: ::jobject _thiz", ( _thiz )); /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(_env, _thiz); /* Post-condition report */ CPPTEST_REPORT_PTR("Output: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Output: ::jobject _thiz", ( _thiz )); /* Post-condition check */ CPPTEST_ASSERT_EQUAL(NULL, ( _env )); CPPTEST_ASSERT_EQUAL(NULL, ( _thiz )); } /* CPPTEST_TEST_CASE_END test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_1 */ /* CPPTEST_TEST_CASE_BEGIN test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_2 */ /* CPPTEST_TEST_CASE_CONTEXT void Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(JNIEnv *, jobject) */ void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_2() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv _env_0 ; ::JNIEnv * _env = & _env_0; /* Initializing argument 2 (thiz) */ ::jobject _thiz = 0 ; /* Pre-condition report */ CPPTEST_REPORT_PTR("Input: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Input: ::jobject _thiz", ( _thiz )); /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(_env, _thiz); /* Post-condition report */ CPPTEST_REPORT_PTR("Output: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Output: ::jobject _thiz", ( _thiz )); /* Post-condition check */ CPPTEST_ASSERT(0 != ( _env )); CPPTEST_ASSERT_EQUAL(NULL, ( _thiz )); } /* CPPTEST_TEST_CASE_END test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_2 */ /* CPPTEST_TEST_CASE_BEGIN test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_3 */ /* CPPTEST_TEST_CASE_CONTEXT void Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(JNIEnv *, jobject) */ void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_3() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv * _env = 0 ; /* Initializing argument 2 (thiz) */ ::_jobject _thiz_0 ; ::jobject _thiz = & _thiz_0; /* Pre-condition report */ CPPTEST_REPORT_PTR("Input: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Input: ::jobject _thiz", ( _thiz )); /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(_env, _thiz); /* Post-condition report */ CPPTEST_REPORT_PTR("Output: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Output: ::jobject _thiz", ( _thiz )); /* Post-condition check */ CPPTEST_ASSERT_EQUAL(NULL, ( _env )); CPPTEST_ASSERT(0 != ( _thiz )); } /* CPPTEST_TEST_CASE_END test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_3 */ /* CPPTEST_TEST_CASE_BEGIN test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_4 */ /* CPPTEST_TEST_CASE_CONTEXT void Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(JNIEnv *, jobject) */ void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp_4() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv _env_0 ; ::JNIEnv * _env = & _env_0; /* Initializing argument 2 (thiz) */ ::_jobject _thiz_1 ; ::jobject _thiz = & _thiz_1; /* Pre-condition report */ CPPTEST_REPORT_PTR("Input: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Input: ::jobject _thiz", ( _thiz )); /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(_env, _thiz); /* Post-condition report */ CPPTEST_REPORT_PTR("Output: JNIEnv * _env ", ( _env )); CPPTEST_REPORT_PTR("Output: ::jobject _thiz", ( _thiz )); /* Post-condition check */ CPPTEST_ASSERT(0 != ( _env )); CPPTEST_ASSERT(0 != ( _thiz )); } void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv * _env = 0 ; /* Initializing argument 2 (thiz) */ ::jobject _thiz = 0 ; /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(_env, _thiz); /* Post-condition check */ CPPTEST_ASSERT_EQUAL(NULL, ( _env )); CPPTEST_ASSERT_EQUAL(NULL, ( _thiz )); } 上述是目前的五个测试用例 测试目标:extern "C" JNIEXPORT void JNICALL Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp(JNIEnv *env, jobject thiz) { lantu::isa::WriteAndroidLog(2, "Java_com_isa_navi_jni_hmi_HmiProxyJNI_InitializeCpp"); if(Update::getinstance()->javaVm == nullptr) { JavaVM* javaVm; jint ret = env->GetJavaVM(&javaVm); if (ret != JNI_OK) return; jclass cls = env->FindClass("com/isa/navi/jni/hmi/HmiJNIImpl"); if (cls == NULL) return; jmethodID jmid = env->GetStaticMethodID(cls, "getInstance", "()Lcom/isa/navi/jni/hmi/HmiJNIImpl;"); if (jmid == NULL) return; jobject carobj = env->CallStaticObjectMethod(cls, jmid); if (carobj == NULL) return; jobject carObj = env->NewGlobalRef(carobj); Update::getinstance()->javaVm = javaVm; Update::getinstance()->carObj = carObj; } WriteAndroidLog(1,"ISA_NAVI_UPDATE HmiProxyJNI_InitializeCpp"); } 我的目的是通过..._5 ..._6 等更多的测试用例提高分支覆盖率

// 在测试文件中添加 void CppTest_StubCallback_CallStaticObjectMethod_Pass( CppTest_StubCallInfo* info, jobject* __return, jclass cls, jmethodID methodID ) { // 默认返回NULL(测试分支覆盖) *__return = ((::jobject)1); } void CppTest_StubCallback_CallStaticObjectMethod_False( CppTest_StubCallInfo* info, jobject* __return, jclass cls, jmethodID methodID ) { // 默认返回NULL(测试分支覆盖) // *__return = ((::jobject)0); *__return = NULL; } void TestSuite_update2dsdk_cpp_802ca10e::test_Java_com_isa_navi_jni_hmi_HmiProxyJNI_updateMap_8() { /* Pre-condition initialization */ /* Initializing argument 1 (env) */ ::JNIEnv * _env = 0 ; /* Initializing argument 2 (thiz) */ ::jobject _thiz = 0 ; /* 注册桩回调(使用完整作用域) */ CPPTEST_REGISTER_STUB_CALLBACK("JNIEnv_::GetJavaVM", &CppTest_StubCallback_GetJavaVM_Pass); CPPTEST_REGISTER_STUB_CALLBACK("JNIEnv_::FindClass", &CppTest_StubCallback_FindClass_Pass); CPPTEST_REGISTER_STUB_CALLBACK("JNIEnv_::GetStaticMethodID",&CppTest_StubCallback_GetStaticMethodID_Pass); CPPTEST_REGISTER_STUB_CALLBACK("JNIEnv_::CallStaticObjectMethod",&CppTest_StubCallback_CallStaticObjectMethod_False); /* Tested function call */ ::Java_com_isa_navi_jni_hmi_HmiProxyJNI_updateMap(_env, _thiz); /* Post-condition check */ CPPTEST_ASSERT_EQUAL(NULL, ( _env )); CPPTEST_ASSERT_EQUAL(NULL, ( _thiz )); } extern "C" JNIEXPORT void JNICALL Java_com_isa_navi_jni_hmi_HmiProxyJNI_updateMap(JNIEnv *env, jobject thiz) { lantu::isa::WriteAndroidLog(2, "Java_com_isa_navi_jni_hmi_HmiProxyJNI_updateMap"); if(Update::getinstance()->javaVm == nullptr) { JavaVM* javaVm; jint ret = env->GetJavaVM(&javaVm); if (ret != JNI_OK) return; jclass cls = env->FindClass("com/isa/navi/jni/hmi/HmiJNIImpl"); if (cls == NULL) return; jmethodID jmid = env->GetStaticMethodID(cls, "getInstance", "()Lcom/isa/navi/jni/hmi/HmiJNIImpl;"); if (jmid == NULL) return; jobject carobj = env->CallStaticObjectMethod(cls, jmid); if (carobj == NULL) return; jobject carObj = env->NewGlobalRef(carobj); Update::getinstance()->javaVm = javaVm; Update::getinstance()->carObj = carObj; } lantu::isa::ThreadPool pool(1, "ISA_NAVI_ActiveUpdate"); pool.enqueue(ActiveUpdateStart); } carobj并没有触发return分支为什么?

#include <unistd.h> #include <iostream> #include <fstream> #include <vector> #include <chrono> // #include <malloc.h> #include "tool.h" #include "data_manager.h" #include "isa_service.h" #include "mesh_code_manager.h" #include "isa_dbconfig_def.h" #include "update.h" namespace lantu { namespace isa { // constexpr size_t JsonSize = 3000; std::string EraseSpace(const std::string& estr) { std::string ret(estr); if (ret.length() > 0) { ret.erase(0, ret.find_first_not_of(" ")); ret.erase(ret.find_last_not_of(" ") + 1); } return ret; } /** * @brief 用于开辟线程加载数据 */ void ForGetDataByRange(const Point& position) { DataManager::getinstance()->GetDataByDataRange(position); return; } /** * @brief 用于开辟线程加载时区和数据版本管理表数据 */ void ForGetCountryTimezoneAndVersion() { DataManager::getinstance()->LoadTimezoneAndVersionMng(); return; } /*Data manager*/ DataManager::DataManager() : // mCurrentCountryCode(""), mDataBaseName(""), mCurrentTileId(0), mIsCrossBorder(false), // mCurrentCountryType(NaviCountryType::Unknown), // mIsaSeviceStatus(ISASeviceStatus::Unknown), mDataThread(1, "IsaDbMngThread") { mDbPath = gISADbConfig.DBPath; InitConfig(); mCountryMngDbPath = mDbPath + gISADbConfig.CountryDataMng; mLoader = std::make_shared<DataLoader>(); mCountryMngLoader = std::make_shared<CountryMngLoader>(); WriteAndroidLog(2, "DataManager start"); //if (InitConfig()) { if (mCountryMngLoader->Connect(mCountryMngDbPath)) { // if (!mCountryMngLoader->LoadCountryVersionMng(mCountryVersionMap)) { // WriteAndroidLog(4,"Load CountryVersionMng false!"); // } std::thread loadTVFunc(ForGetCountryTimezoneAndVersion); loadTVFunc.detach(); } else { printf("ERROR:Connect CountryMngDb false!\n"); WriteAndroidLog(4, "Connect CountryMngDb false!"); } // InitService(); //WriteAndroidLog(2, "Init Config success!"); //} } DataManager::~DataManager() { mDataThread.DetachThreadPool(); mCountryMngDbPath = ""; mIsCrossBorder = false; // mCurrentCountryCode = ""; mDbPath = ""; mDataBaseName = ""; mCurrentTileId = 0; //mCountryNameMap.clear(); mMeshDataMap.clear(); //mMeshCountryMap.clear(); mDataTileIdSet.clear(); mCountryTimezoneMap.clear(); mLoader->Disconnect(); mCountryMngLoader->Disconnect(); WriteAndroidLog(2, "DataManager end"); printf("Tip:DataManager end!\n"); } //2024-06-20:配置文件转为头文件定义 bool DataManager::InitConfig() { std::string configPath(""); std::string configValue(""); std::string dbPathtag("Db_Path"); #ifdef __ANDROID__ configPath = "/inand/ISA/db_config.ini"; #else configPath = "./db_config.ini"; #endif //!defined(__ANDROID__) std::ifstream ifs(configPath.c_str(), std::ios::in); if (!ifs || !ifs.is_open()) { // 以写入模式创建文件 std::ofstream outfile(configPath); if (outfile.is_open()) { outfile << "Db_Path = /inand/ISA/"; outfile.close(); // 关闭文件 } else { WriteAndroidLog(4, "DataManager: Open config file false!"); } #ifdef __ANDROID__ // mDbPath = "/inand/ISA/"; Update* updateInstance = Update::getinstance(); // 步骤2:调用 get_m_data_address() 方法 mDbPath = updateInstance->get_m_data_address(); WriteAndroidLog(4, "zwx-test:mDbPath:"+mDbPath); #else mDbPath = "../ISA_Engine/etc/inand/ISA/"; #endif return true; } while (getline(ifs, configValue)) { if (strcmp(configValue.c_str(), "") == 0 || configValue.find("#") == 0 || configValue.find("[") == 0) { continue; } if (configValue.find(dbPathtag, 0) == 0) { size_t tag = configValue.find("=", 0); std::string tagConfigValue = configValue.substr(tag + 1); std::string dbpathstr = EraseSpace(tagConfigValue); if (dbpathstr.find_last_of("/") != dbpathstr.length() - 1) { mDbPath = dbpathstr + "/"; } else { mDbPath = dbpathstr; } break; } // else if (configValue.find(countryMngNameDbTag, 0) == 0) { // size_t tag = configValue.find("=", 0); // DataSetName dbname = configValue.substr(tag + 1); // countrymngdbname = EraseSpace(dbname); // } else { // size_t tag = configValue.find("=", 0); // std::string ccodTag = configValue.substr(0, tag); // CountryCode cCod = EraseSpace(ccodTag); // std::string dbnameTag = configValue.substr(tag + 1); // DataSetName dbName = EraseSpace(dbnameTag); // mCountryNameMap[cCod] = dbName; // } } ifs.clear(); ifs.close(); return true; } //2024-06-20:配置文件转为头文件定义 bool DataManager::setDbPath2Config(std::string dbPath) { if (dbPath.empty()) return false; std::string configPath(""); std::string dbPathtag("Db_Path"); if (dbPath.find_last_of("/") != dbPath.length() - 1) { mDbPath = dbPath + "/"; } else { mDbPath = dbPath; } #ifdef __ANDROID__ configPath = "/inand/ISA/db_config.ini"; #else configPath = "./db_config.ini"; #endif //!defined(__ANDROID__) std::ofstream outfile(configPath, std::ios::out | std::ios::trunc); if (!outfile || !outfile.is_open()) { WriteAndroidLog(4, "setDbPath2Config:File open error, path:" + dbPath); return false; } outfile << dbPathtag + " = " + mDbPath; outfile.clear(); outfile.close(); return true; } std::string DataManager::getDbPath2Config() { return mDbPath; } bool DataManager::InitDb(const Point& position) { mCurrentPoint = position; TileID tileId; MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; tileId = gmc.getMeshCode(position.x, position.y, lv); bool ret(false); /*initdb时不定位当前国家,后续根据定位匹配的道路获取国家编码*/ std::vector<CountryCode> bufcountryVec; if (mCountryMngLoader->LoadMeshCountryMngByTileId(tileId, bufcountryVec)) { if (bufcountryVec.size() == 1) { NaviCountryType ctype = PaseraNaviCountryType(bufcountryVec[0]); IsaService::getinstance()->SetCountryType(ctype); } else { IsaService::getinstance()->SetCountryType(NaviCountryType::Unknown); } } if (GetDataByDataRange(position)) { mCurrentTileId = tileId; ret = true; } return ret; } bool DataManager::DetachDb() { std::map<TileID, DataCollection>().swap(mMeshDataMap); mDataTileIdSet.clear(); // malloc_trim(0); /*归还堆内存*/ return mLoader->Disconnect(); } void DataManager::DetachManager() { mDataThread.DetachThreadPool(); mCountryMngDbPath = ""; mIsCrossBorder = false; // mCurrentCountryCode = ""; mDbPath = ""; mCurrentTileId = 0; //mCountryNameMap.clear(); mMeshDataMap.clear(); //mMeshCountryMap.clear(); mDataTileIdSet.clear(); mLoader->Disconnect(); WriteAndroidLog(2, "DataManager end"); printf("Tip:DataManager end!\n"); } bool DataManager::GetRoadsByTileId(const TileID tileId, const Point& position, std::vector<RoadPtr>& roads) { // roads.clear(); mDataMutex.lock(); bool ret(false); auto dataItr = mMeshDataMap.find(tileId); if (dataItr == mMeshDataMap.end()) { mDataMutex.unlock(); if (SyncDataByPosition(position)) { mDataMutex.lock(); dataItr = mMeshDataMap.find(tileId); } else { mDataMutex.lock(); } } if (dataItr != mMeshDataMap.end()) { for(const auto& road : dataItr->second.mRoadMap) { roads.emplace_back(road.second); } /*for finding the roads that stride over tile -- kvm_v1.1 */ if (!dataItr->second.mMainTileRoadMap.empty()) { for (auto tileroad : dataItr->second.mMainTileRoadMap) { auto otherItr = mMeshDataMap.find(tileroad.second); if (otherItr == mMeshDataMap.end()) { DataCollection data; if (GetDataByTileId(tileroad.second, data)) { mMeshDataMap[tileroad.second] = std::move(data); mDataTileIdSet.insert(tileroad.second); } otherItr = mMeshDataMap.find(tileroad.second); } if (otherItr != mMeshDataMap.end()) { auto roadpair = otherItr->second.mRoadMap.find(tileroad.first); if (roadpair != otherItr->second.mRoadMap.end()) { roads.emplace_back(roadpair->second); } } } } /*kvm_v1.1 end*/ ret = true; } mDataMutex.unlock(); if (!SyncDataByPosition(position)) { #ifdef __ANDROID__ std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; WriteAndroidLog(4, logstr); #else printf("ERROR:SyncDataByPosition false!\n"); #endif //__ANDROID__ } return ret; } // bool DataManager::GetRoadByRoadId(const Point& position, const RoadID& roadId, RoadPtr& road) { // bool ret(false); // MCLEVEL lv = LEVEL_ONE; // GetMeshCode gmc; // TileID tileId = gmc.getMeshCode(position.x, position.y, lv); // mDataMutex.lock(); // auto dataItr = mMeshDataMap.find(tileId); // // if (dataItr == mMeshDataMap.end()) { // // mDataMutex.unlock(); // // } // if (dataItr != mMeshDataMap.end()) { // auto roadItr = dataItr->second.mRoadMap.find(roadId); // if (roadItr == dataItr->second.mRoadMap.end()) { // /*for KVM_V1.1*/ // if (!dataItr->second.mMainTileRoadMap.empty()) { // auto troadItr = dataItr->second.mMainTileRoadMap.find(roadId); // if (troadItr != dataItr->second.mMainTileRoadMap.end()) { // DataCollection data; // if (GetDataByTileId(troadItr->second, data)) { // auto roadbuf = data.mRoadMap.find(roadId); // if (roadbuf != data.mRoadMap.end()) { // road = roadbuf->second; // ret = true; // } // mMeshDataMap[troadItr->second] = std::move(data); // mDataTileIdSet.insert(troadItr->second); // } // } // } // /*end*/ // if (!ret) { // for (const auto dataMap:mMeshDataMap) { // if (dataMap.first == tileId) continue; // auto roadItr = dataMap.second.mRoadMap.find(roadId); // if (roadItr != dataMap.second.mRoadMap.end()) { // road = roadItr->second; // ret = true; // break; // } // } // } // } else { // road = roadItr->second; // ret = true; // } // } // mDataMutex.unlock(); // if (!SyncDataByPosition(position)) { // #ifdef __ANDROID__ // std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; // WriteAndroidLog(4, logstr); // #else // printf("ERROR:SyncDataByPosition false!\n"); // #endif //__ANDROID__ // } // return ret; // } bool DataManager::GetRoadByRoadId(const Point& position, const Point& s_node, const Point& e_node, const RoadID& roadId, RoadPtr& road) { bool ret(false); MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; TileID tileId = gmc.getMeshCode(position.x, position.y, lv); mDataMutex.lock(); auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // mDataMutex.unlock(); // } if (dataItr != mMeshDataMap.end()) { auto roadItr = dataItr->second.mRoadMap.find(roadId); if (roadItr == dataItr->second.mRoadMap.end()) { //算e点 TileID e_tile = gmc.getMeshCode(e_node.x, e_node.y, lv); auto e_dataItr = mMeshDataMap.find(e_tile); if (e_dataItr != mMeshDataMap.end()) { auto e_roadItr = e_dataItr->second.mRoadMap.find(roadId); if (e_roadItr != e_dataItr->second.mRoadMap.end()) { road = e_roadItr->second; ret = true; } } if (!ret) { //算s点 TileID s_tile = gmc.getMeshCode(s_node.x, s_node.y, lv); auto s_dataItr = mMeshDataMap.find(s_tile); if (s_dataItr != mMeshDataMap.end()) { auto s_roadItr = s_dataItr->second.mRoadMap.find(roadId); if (s_roadItr != s_dataItr->second.mRoadMap.end()) { road = s_roadItr->second; ret = true; } } } /*end*/ if (!ret) { /*for KVM_V1.1*/ if (!dataItr->second.mMainTileRoadMap.empty()) { auto troadItr = dataItr->second.mMainTileRoadMap.find(roadId); if (troadItr != dataItr->second.mMainTileRoadMap.end()) { DataCollection data; if (GetDataByTileId(troadItr->second, data)) { auto roadbuf = data.mRoadMap.find(roadId); if (roadbuf != data.mRoadMap.end()) { road = roadbuf->second; ret = true; } mMeshDataMap[troadItr->second] = std::move(data); mDataTileIdSet.insert(troadItr->second); } } } } } else { road = roadItr->second; ret = true; } } mDataMutex.unlock(); if (!SyncDataByPosition(position)) { #ifdef __ANDROID__ std::string logstr = "SyncDataByPosition(" + std::to_string(position.x) + "," + std::to_string(position.y) + ") failed!"; WriteAndroidLog(4, logstr); #else printf("ERROR:SyncDataByPosition false!\n"); #endif //__ANDROID__ } return ret; } bool DataManager::GetDataByDataRange(const Point& position) { // auto st = std::chrono::high_resolution_clock::now(); GetMeshCode gMesh; TileID tileId = gMesh.getMeshCode(position.x, position.y, MCLEVEL::LEVEL_ONE); std::set<TileID> tileIdSet{}; int8_t range = int8_t(DataRange / 2); for (int8_t i = -range; i <= range; ++i) { for (int8_t j = -range; j <= range; ++j) { TileID netileid = gMesh.GetNearMeshID(i, j); tileIdSet.insert(netileid); } } // if (tileIdSet.empty()) { // WriteAndroidLog(4, "Get NearMeshID false!"); // return false; // } // if (InitDb(tileId, position)) { mTileIdSetMutex.lock(); std::set<TileID> insTileIdSet{}; std::set<TileID> eraTileIdSet{}; if (mDataTileIdSet.empty()) { insTileIdSet = tileIdSet; mDataTileIdSet = std::move(tileIdSet); } else { for (auto esetItr = mDataTileIdSet.begin(); esetItr != mDataTileIdSet.end(); esetItr++) { std::set<TileID>::iterator idItr = tileIdSet.find(*esetItr); if (idItr == tileIdSet.end()) { TileID tileid = (*esetItr); eraTileIdSet.insert(tileid); } } for (auto isetItr = tileIdSet.begin(); isetItr != tileIdSet.end(); isetItr++) { std::set<TileID>::iterator idItr = mDataTileIdSet.find(*isetItr); if (idItr == mDataTileIdSet.end()) { TileID tileid = (*isetItr); insTileIdSet.insert(tileid); } } } std::vector<std::pair<TileID, DataCollection>> meshDataVec; std::vector<std::pair<TileID, std::map<CountryCode, std::vector<ShapePointVec>>>> countrymngDataVec; DataSetName dataName(""); if (!insTileIdSet.empty()) { for (auto setItr = insTileIdSet.begin(); setItr != insTileIdSet.end(); setItr++) { bool dataflag(false); TileID itileId = (*setItr); DataCollection databuf; if (GetDataByTileId(itileId, databuf)) { // dataflag = true; meshDataVec.emplace_back(std::make_pair(itileId, databuf)); mDataTileIdSet.insert(itileId); } /*代码转移至GetDataByTileId()中*/ // std::map<CountryCode, std::vector<ShapePointVec>> bufcountryshMap; // if (mCountryMngLoader->LoadMeshCountryMngByTileId(itileId, bufcountryshMap)) { // countrymngDataVec.emplace_back(std::make_pair(itileId, bufcountryshMap)); // /*Realizing true nine grid data --20240131*/ // if (!bufcountryshMap.empty()) { // for (auto & counpair : bufcountryshMap) { // // if (std::strcmp(counpair.first.c_str(), mCurrentCountryCode.c_str()) != 0) { // auto dbnitr = mCountryNameMap.find(counpair.first); // if (dbnitr == mCountryNameMap.end()) continue; // if (dataName != dbnitr->second) { // dataName = dbnitr->second; // std::string dbpath = mDbPath + dbnitr->second; // mLoader->Disconnect(); // if (mLoader->Connect(dbpath)) { // DataCollection otdatabuf; // if (GetDataByTileId(itileId, otdatabuf)) { // try { // /* code */ // databuf.mRoadMap.insert(otdatabuf.mRoadMap.begin(), otdatabuf.mRoadMap.end()); // databuf.mRoadConnectMap.insert(otdatabuf.mRoadConnectMap.begin(), otdatabuf.mRoadConnectMap.end()); // databuf.mMainTileRoadMap.insert(otdatabuf.mMainTileRoadMap.begin(), otdatabuf.mMainTileRoadMap.end()); // databuf.mSpeedConditionMap.insert(otdatabuf.mSpeedConditionMap.begin(), otdatabuf.mSpeedConditionMap.end()); // databuf.mTimeConditionMap.insert(otdatabuf.mTimeConditionMap.begin(), otdatabuf.mTimeConditionMap.end()); // dataflag = true; // mDataTileIdSet.insert(itileId); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(4, "Realizing true nine grid data failed!"); // } // } // // mLoader->Disconnect(); // } // } else { // DataCollection otdatabuf; // if (GetDataByTileId(itileId, otdatabuf)) { // try { // /* code */ // databuf.mRoadMap.insert(otdatabuf.mRoadMap.begin(), otdatabuf.mRoadMap.end()); // databuf.mRoadConnectMap.insert(otdatabuf.mRoadConnectMap.begin(), otdatabuf.mRoadConnectMap.end()); // databuf.mMainTileRoadMap.insert(otdatabuf.mMainTileRoadMap.begin(), otdatabuf.mMainTileRoadMap.end()); // databuf.mSpeedConditionMap.insert(otdatabuf.mSpeedConditionMap.begin(), otdatabuf.mSpeedConditionMap.end()); // databuf.mTimeConditionMap.insert(otdatabuf.mTimeConditionMap.begin(), otdatabuf.mTimeConditionMap.end()); // dataflag = true; // mDataTileIdSet.insert(itileId); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(4, "Realizing true nine grid data failed!"); // } // } // } // // } // } // } // /*end --*/ // } // if (dataflag) { // meshDataVec.emplace_back(std::make_pair(itileId, databuf)); // } } } /*load map data*/ mDataMutex.lock(); if (!meshDataVec.empty()) { if (!eraTileIdSet.empty()) { for (auto setItr = eraTileIdSet.begin(); setItr != eraTileIdSet.end(); setItr++) { TileID etileId = (*setItr); mMeshDataMap.erase(etileId); mDataTileIdSet.erase(etileId); } } mMeshDataMap.insert(meshDataVec.begin(), meshDataVec.end()); } mDataMutex.unlock(); /*load countrymng data*/ /*不再需要边境线定位当前国家*/ // mSyncMngMutex.lock(); // if (!eraTileIdSet.empty()) { // for (auto setItr = eraTileIdSet.begin(); setItr != eraTileIdSet.end(); setItr++) { // TileID etileId = (*setItr); // mMeshCountryMap.erase(etileId); // } // } // if (!countrymngDataVec.empty()) { // mMeshCountryMap.insert(countrymngDataVec.begin(), countrymngDataVec.end()); // } // mSyncMngMutex.unlock(); // } mTileIdSetMutex.unlock(); // auto et = std::chrono::high_resolution_clock::now(); // uint64_t t = std::chrono::duration_cast<std::chrono::milliseconds>(et - st).count(); // printf("cost time: %ld\n", t); bool ret(false); if (!mMeshDataMap.empty()) ret = true; return ret; } bool DataManager::GetDataByTileId(TileID tileId, DataCollection& data) { auto tileItr = mMeshDataMap.find(tileId); bool ret(false); #ifdef _READ_BIN_ if (tileItr == mMeshDataMap.end()) { /*在获取该tile的数据时取全*/ std::vector<CountryCode> bufcountryVec; mSyncMngMutex.lock(); if (mCountryMngLoader->LoadMeshCountryMngByTileId(tileId, bufcountryVec)) { /*Realizing true nine grid data --20240131*/ if (!bufcountryVec.empty()) { for (auto & counpair : bufcountryVec) { auto dbnitr = gISADbConfig.CountryListMap.find(counpair); if (dbnitr == gISADbConfig.CountryListMap.end()) continue; std::map<RoadID, RoadPtr> roadMap; std::map<NodeID, std::vector<RoadID>> connectMap; std::map<RoadID, TileID> mainTileRoadMap; std::map<ConditionID, SpeedConditionPtr> speedConditionMap; std::map<ConditionID, std::vector<TimeConditionPtr>> timeConditionMap; if (mDataBaseName != dbnitr->second) { mDataBaseName = dbnitr->second; std::string dbpath = mDbPath + dbnitr->second; mLoader->Disconnect(); if (mLoader->Connect(dbpath)) { // DataCollection otdatabuf; ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); if (ret) { // try { /* code */ data.mRoadMap.insert(roadMap.begin(), roadMap.end()); data.mRoadConnectMap.insert(connectMap.begin(), connectMap.end()); data.mMainTileRoadMap.insert(mainTileRoadMap.begin(), mainTileRoadMap.end()); data.mSpeedConditionMap.insert(speedConditionMap.begin(), speedConditionMap.end()); data.mTimeConditionMap.insert(timeConditionMap.begin(), timeConditionMap.end()); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(5, "Realizing data failed!, tileid(" + std::to_string(tileId) + ")"); // } } else { WriteAndroidLog(4, "Load data by tileid(" + std::to_string(tileId) + ") failed!"); } } } else { // DataCollection otdatabuf; ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); if (ret) { // try { /* code */ data.mRoadMap.insert(roadMap.begin(), roadMap.end()); data.mRoadConnectMap.insert(connectMap.begin(), connectMap.end()); data.mMainTileRoadMap.insert(mainTileRoadMap.begin(), mainTileRoadMap.end()); data.mSpeedConditionMap.insert(speedConditionMap.begin(), speedConditionMap.end()); data.mTimeConditionMap.insert(timeConditionMap.begin(), timeConditionMap.end()); // } catch(const std::exception& e) { // std::cerr << e.what() << '\n'; // WriteAndroidLog(5, "Realizing data failed!, tileid(" + std::to_string(tileId) + ")"); // } } else { WriteAndroidLog(4, "Load data by tileid(" + std::to_string(tileId) + ") failed!"); } } } } /*end --*/ } mSyncMngMutex.unlock(); } // if (tileItr == mMeshDataMap.end()) { // std::map<RoadID, RoadPtr> roadMap; // std::map<NodeID, std::vector<RoadID>> connectMap; // std::map<RoadID, TileID> mainTileRoadMap; // std::map<ConditionID, SpeedConditionPtr> speedConditionMap; // std::map<ConditionID, std::vector<TimeConditionPtr>> timeConditionMap; // ret = mLoader->LoadBinDataByTileId(tileId, roadMap, connectMap, mainTileRoadMap, speedConditionMap, timeConditionMap); // if (ret) { // data.mRoadMap = std::move(roadMap); // data.mRoadConnectMap = std::move(connectMap); // data.mMainTileRoadMap = std::move(mainTileRoadMap); // data.mSpeedConditionMap = std::move(speedConditionMap); // data.mTimeConditionMap = std::move(timeConditionMap); // } else { // printf ("ERRO: LoadBinDataByTileId false!\n"); // WriteAndroidLog("ERRO","LoadBinDataByTileId false!"); // } // } #endif //_READ_BIN_ #ifdef _READ_TABLE_ if (tileItr == mMeshDataMap.end()) { DataCollection dataCol; if (mLoader->LoadRoadByTileId(tileId, dataCol.mRoadMap)) { for(const auto& road : dataCol.mRoadMap) { mLoader->LoadSpeedConditionByRoadId(road.first, dataCol.mSpeedConditionMap); } for (const auto& condition : dataCol.mSpeedConditionMap) { mLoader->LoadTimeConditionByConditionId(condition.first, dataCol.mTimeConditionMap); } data = std::move(dataCol); ret = true; } } #endif //_READ_TABLE_ return ret; } /*舍弃说明:读取九宫格数据中包含的所有国家的地图数据,由定位地图匹配获取的道路来定位当前国家--20240202*/ // bool DataManager::LocateCurrentCountry(const TileID tileId, const Point& position, CountryCode& countryCode, DataSetName& dataName) { // } bool DataManager::GetTimeConditionByCondition(const TileID& tileId, const ConditionID& conditionId, std::vector<TimeConditionPtr>& timeConds) { bool ret(false); // TileID tileId = currentRoad->mTileId; auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // std::vector<RoadPtr> roads; // if (GetRoadsByTileId(tileId, position, roads)) { // dataItr = mMeshDataMap.find(tileId); // } // } if (dataItr != mMeshDataMap.end()) { auto timeCondItr = dataItr->second.mTimeConditionMap.find(conditionId); if(timeCondItr != dataItr->second.mTimeConditionMap.end()) { timeConds.insert(timeConds.end(), timeCondItr->second.begin(), timeCondItr->second.end()); } ret = true; } return ret; } bool DataManager::GetSpeedConditionByRoad(const RoadPtr& currentRoad,/* const Point& position,*/std::vector<SpeedConditionPtr>& speedConds) { bool ret(false); TileID tileId = currentRoad->mTileId; auto dataItr = mMeshDataMap.find(tileId); // if (dataItr == mMeshDataMap.end()) { // std::vector<RoadPtr> roads; // if (GetRoadsByTileId(tileId, position, roads)) { // dataItr = mMeshDataMap.find(tileId); // } // } if (dataItr != mMeshDataMap.end()) { for (auto& conds:currentRoad->mRoadSpeedCondVec) { auto speedItr = dataItr->second.mSpeedConditionMap.find(conds); if(speedItr != dataItr->second.mSpeedConditionMap.end()) { speedConds.emplace_back(speedItr->second); } } ret = true; } return ret; } /*0620:版本号不存在管理表中 bool DataManager::GetCountryVer(const CountryCode& countryCd, VersionNum& countryVer) { if (mCountryVersionMap.empty()) return false; bool ret(false); NaviCountryType counType = PaseraNaviCountryType(countryCd); auto verItr = mCountryVersionMap.find(counType); if (verItr != mCountryVersionMap.end()) { countryVer = verItr->second; ret = true; } return ret; } */ bool DataManager::GetCountryDataVer(std::map<CountryCode, VersionNum>& dataVerMap) { /*todo:构建一个临时数据读取类读取*/ mSyncMngMutex.lock(); for (auto countrypair : gISADbConfig.CountryListMap) { mLoader->Disconnect(); std::string path = mDbPath + countrypair.second; if (mLoader->Connect(path)) { std::pair<CountryCode, VersionNum> verpair; if (mLoader->LoadVersionMng(verpair)) { dataVerMap.insert(verpair); } else { WriteAndroidLog(4, "文件损坏:" + countrypair.second); } } } mLoader->Disconnect(); mDataBaseName = ""; mSyncMngMutex.unlock(); return !dataVerMap.empty(); } bool DataManager::GetRoadConnectShipByTileId(const TileID tileId, std::map<NodeID, std::vector<RoadID>>& roadConnectMap, std::map<RoadID, RoadPtr>& roadsMap) { bool ret(false); auto tileItr = mMeshDataMap.find(tileId); if (tileItr != mMeshDataMap.end()) { if (!tileItr->second.mRoadConnectMap.empty() && !tileItr->second.mRoadMap.empty()) { roadConnectMap = tileItr->second.mRoadConnectMap; roadsMap = tileItr->second.mRoadMap; ret = true; } if (!tileItr->second.mMainTileRoadMap.empty()) { for (auto tileroad : tileItr->second.mMainTileRoadMap) { auto otherItr = mMeshDataMap.find(tileroad.second); if (otherItr == mMeshDataMap.end()) { DataCollection data; if (GetDataByTileId(tileroad.second, data)) { mMeshDataMap[tileroad.second] = std::move(data); mDataTileIdSet.insert(tileroad.second); } otherItr = mMeshDataMap.find(tileroad.second); } if (otherItr != mMeshDataMap.end()) { auto roadpair = otherItr->second.mRoadMap.find(tileroad.first); if (roadpair != otherItr->second.mRoadMap.end()) { roadsMap.insert(std::make_pair(roadpair->first, roadpair->second)); } } } } } return ret; } bool DataManager::SyncDataByPosition(const Point& position) { if (mCurrentPoint == position /*&& strcmp(mCurrentCountryCode.c_str(), "") != 0*/) { // std::this_thread::sleep_for(std::chrono::milliseconds(10)); return true; } mCurrentPoint = position; TileID tileId; MCLEVEL lv = LEVEL_ONE; GetMeshCode gmc; tileId = gmc.getMeshCode(position.x, position.y, lv); bool ret(false); DataSetName dbName(""); CountryCode countryCode(""); if (mCurrentTileId != tileId) { if (mMeshDataMap.find(tileId) == mMeshDataMap.end()) { if (GetDataByDataRange(position)) { mCurrentTileId = tileId; ret = true; } } else { mDataThread.enqueue(ForGetDataByRange, position); mCurrentTileId = tileId; ret = true; } } else { ret = true; } return ret; } bool DataManager::GetTimezoneByCountry(const NaviCountryType& countryType, UTCTimeZone& timezone) { mCountryCodeMutex.lock(); bool ret(false); auto tzItr = mCountryTimezoneMap.find(countryType); if (tzItr != mCountryTimezoneMap.end()) { timezone = tzItr->second; ret = true; } mCountryCodeMutex.unlock(); return ret; } void DataManager::LoadTimezoneAndVersionMng() { mCountryCodeMutex.lock(); /*0620:新数据管理表中删除了各个国家数据版本管理表 if (!mCountryMngLoader->LoadCountryVersionMng(mCountryVersionMap)) { WriteAndroidLog(4,"Load CountryVersionMng false!"); } */ if (!mCountryMngLoader->LoadCountryTimezoneMng(mCountryTimezoneMap)) { WriteAndroidLog(4,"Load CountryTimezoneMap false!"); } mCountryCodeMutex.unlock(); return ; } VersionNum DataManager::GetCountryVersion(const CountryCode& ccode) { auto countrypair = gISADbConfig.CountryListMap.find(ccode); if (countrypair == gISADbConfig.CountryListMap.end()) return 0; mSyncMngMutex.lock(); VersionNum ver(0); mLoader->Disconnect(); std::string path = mDbPath + countrypair->second; if (mLoader->Connect(path)) { std::pair<CountryCode, VersionNum> verpair; if (mLoader->LoadVersionMng(verpair)) { ver = verpair.second; } } mLoader->Disconnect(); mDataBaseName = ""; mSyncMngMutex.unlock(); return ver; } bool DataManager::checkCountryDB() { std::vector<CountryCode> bufcountryVec; return mCountryMngLoader->LoadMeshCountryMngByTileId(GetMeshCode().getMeshCode(0.0, 0.0, LEVEL_ONE), bufcountryVec); } /*Data manager End*/ } } 涉及/inand/ISA/的,全部使用mDbpath拼接替代

#include "locLog.h" #include <sys/stat.h> #include "update.h" namespace lantu{ namespace isa{ Update* updateInstance = Update::getinstance(); // 步骤2:调用 get_m_data_address() 方法 std::string m_data_adress = updateInstance->get_m_data_address(); /*定位日志构造函数*/ locLogManager::locLogManager(): dataCount(0), currentFileName(""), fileIndex(0), mDirCount(0), locLogFlag(false), stopLogging(false){} locLogManager::~locLogManager(){ stopLogging = true; dataCount = 0; fileIndex = 0; mDirCount = 0; } // 写入线程 void ForDumpLocJson() { locLogManager::getinstance()->DumpLocJson(); return; } void locLogManager::DumpLocJson(){ std::ofstream logFile; if(fileIndex == 0){ for (int8_t i = 0; i <= 2; ++i) { std::string dirname = "/inand/ISA/locLog_" + std::to_string(i); struct stat statbbuf; if (stat(dirname.c_str(), &statbbuf) == 0 && S_ISDIR(statbbuf.st_mode)) { continue; printf("Tip:Folder exist!\n"); } else { printf("Tip:Folder does not exist!\n"); mDirCount = i; if (mkdir(dirname.c_str(), S_IRWXU) == 0) { printf("Tip:Folder created!\n"); } break; } } } std::string dirPath = "/inand/ISA/locLog_" + std::to_string(mDirCount); std::string filePath = dirPath + "/Location_" + std::to_string(fileIndex) + ".json"; logFile.open(filePath.c_str(), std::ios::trunc); logFile << "["; // JSON 数组开始 while (true) { std::unique_lock<std::mutex> lock(bufferMutex); bufferCondition.wait(lock, [this] { return !dataBuffer.empty() || stopLogging; }); while (!dataBuffer.empty()) { if (dataCount > 0) { logFile << ","; // 添加逗号分隔 } logFile << dataBuffer.front(); // 写入 JSON 数据 dataBuffer.pop_front(); dataCount++; // 如果数据条数超过 2000,创建新文件 if (dataCount >= 2000) { logFile << "]"; // JSON 数组结束 logFile.close(); // 更新文件名和索引 fileIndex++; currentFileName = dirPath + "/Location_" + std::to_string(fileIndex) + ".json"; logFile.open(currentFileName); logFile << "["; // 新文件的 JSON 数组开始 dataCount = 0; // 重置计数 } } if (stopLogging) break; } logFile << "]"; // JSON 数组结束 logFile.close(); } void locLogManager::initLocLogService(){ // 在程序启动时启动写入线程 std::thread fucLocLog(ForDumpLocJson); fucLocLog.detach(); return; } } } /inand/isa/ 使用 m_data_adress替代

#include <memory> #include <sys/stat.h> #include "jni_manager.h" #include "tool.h" #include "isa_service.h" #include "data_manager.h" #include "update.h" namespace lantu { namespace isa { constexpr size_t JsonSize = 500; /** * @brief 用于开辟线程透出数据(carservices) */ void ForRevealMessage() { IsaService::getinstance()->RevealMessage(); return; } /** * @brief 用于开辟线程透出数据(socket) */ #ifdef _VIEWER_TOOL_ void ForSokcetMessage() { IsaService::getinstance()->SocketServer(); return; } void ForSendBySocket(nlohmann::json& jsonStr) { IsaService::getinstance()->SendBySocket(jsonStr); return; } void ForDumpJsonFile() { IsaService::getinstance()->DumpJsonFile(); return; } #endif //_VIEWER_TOOL_ IsaService::IsaService(): mRevealFlag(true), mCurrentCountryType(NaviCountryType::Unknown), mIsaSeviceStatus(ISASeviceStatus::Unknown), #ifdef _VIEWER_TOOL_ mPort(8088), mTcpFlag(false), mAcceptFlag(false), mSocketThread(1, "IsaSocketThread"), mJsonThread(1, "IsaJsonThread"), mJsonCount(0), mFileCount(0), #endif //_VIEWER_TOOL_ mCurrentSpeed(0), simRampDis(0) { #ifdef _VIEWER_TOOL_ /*InitPort();*/ #endif //_VIEWER_TOOL_ LocationMsgPtr initLocattion = std::make_shared<LocationMsg>(); ISAMessagePtr initIsaMsg = std::make_shared<ISAMessage>(); mRouteService = std::make_unique<RouteService>(); SetMessage(initLocattion, initIsaMsg); } IsaService::~IsaService() { DetachServer(); } void IsaService::InitService() { mRevealFlag = true; std::thread funcReveal(ForRevealMessage); #ifdef __linux__ pthread_setname_np(funcReveal.native_handle(), "IsaService"); #endif //__linux__ funcReveal.detach(); #ifdef _VIEWER_TOOL_ std::thread func(ForSokcetMessage); #ifdef __linux__ pthread_setname_np(func.native_handle(), "IsaTcpService"); #endif //__linux__ func.detach(); #endif //_VIEWER_TOOL_ return; } void IsaService::DetachServer() { if (mRevealFlag) mRevealFlag = false; #ifdef _VIEWER_TOOL_ DetachSocketServer(); mTcpFlag = false; mAcceptFlag = false; mSocketThread.DetachThreadPool(); DumpJsonFile(); mJsonCount = 0; mJsonThread.DetachThreadPool(); #endif //_VIEWER_TOOL_ printf("Tip:Isa Service end\n"); WriteAndroidLog(2, "Isa Service end"); return; } void IsaService::RevealMessage() { CarService carService; bool carFlag(false); bool firstFlag(true); /*find propid*/ int serviceStatusPropId(0);//ISA服务状态 int serviceConfidencePropId(0);//ISA服务置信度 int wayFunctionPropId(0);//道路功能等级 int countryCodePropId(0);//国家信息 int limitUnitPropId(0);//限速值单位 int roadTypePropId(0);//道路类型 int speedLimitPropId(0);//限速值 int speedLimitTypePropId(0);//限速类型 int mplLimitTypePropId(0);//隐式限速类型 int mpDistancePropId(0);//前方匝道与本车距离 int timeLimitPropId(0);//时间条件限速的限速值 int rainddayLimitPropId(0);//雨条件限速的限速值 int snowdayLimitPropId(0);//雪条件限速的限速值 int foggydayLimitPropId(0);//雾条件限速的限速值 int naviRampInfoId(0);//当前是否在匝道上 if (carService.InitJniEnv()) { /*find propid*/ serviceStatusPropId = carService.FindStaticIntField("MP5_ISASEVICE_STATUS", "I"); serviceConfidencePropId = carService.FindStaticIntField("MP5_ISASEVICE_CONFIDENCE", "I"); wayFunctionPropId = carService.FindStaticIntField("MP5_NAVI_CURRENT_WAY_FUNCTIONAL_CLASS", "I"); countryCodePropId = carService.FindStaticIntField("MP5_NAV_CTRY_CODE_INFO", "I"); limitUnitPropId = carService.FindStaticIntField("MP5_NAV_SPEED_LIMIT_UNITS", "I"); roadTypePropId = carService.FindStaticIntField("MP5_NAV_CURR_ROAD_TYPE", "I"); speedLimitPropId = carService.FindStaticIntField("MP5_NAV_SPEED_LIMIT", "I"); speedLimitTypePropId = carService.FindStaticIntField("MP5_NAV_SPEED_LIMIT_TYPE", "I"); mplLimitTypePropId = carService.FindStaticIntField("MP5_NAV_IMPLICIT_SPEED_LIMIT_TYPE", "I"); mpDistancePropId = carService.FindStaticIntField("MP5_NAV_RAMP_DISTANCE", "I"); naviRampInfoId = carService.FindStaticIntField("MP5_NAV_RAMP", "I"); timeLimitPropId = carService.FindStaticIntField("MP5_NAV_CONDITIONAL_SPEED_LIMIT_VALUE1", "I"); rainddayLimitPropId = carService.FindStaticIntField("MP5_NAV_CONDITIONAL_SPEED_LIMIT_VALUE2", "I");; snowdayLimitPropId = carService.FindStaticIntField("MP5_NAV_CONDITIONAL_SPEED_LIMIT_VALUE3", "I");; foggydayLimitPropId = carService.FindStaticIntField("MP5_NAV_CONDITIONAL_SPEED_LIMIT_VALUE4", "I");; /*通过JNI获取Android日志等级*/ lantu::isa::log_falg = carService.FindStaticIntField("LOG_FLAG", "I"); carFlag = true; } else { WriteAndroidLog(4, "Init carservice false!"); } #ifdef __ANDROID__ WriteAndroidLog(1, "CarService Jni init success"); #else printf("CarService Jni init success\n"); #endif //!defined(__ANDROID__) while (true) { if (mRevealFlag) { if (firstFlag) { if (carFlag) { carService.CallSetIntMethod(serviceStatusPropId, int(0)); carService.CallSetIntMethod(serviceConfidencePropId, int(0)); carService.CallSetIntMethod(wayFunctionPropId, int(0)); carService.CallSetIntMethod(countryCodePropId, int(0)); carService.CallSetIntMethod(limitUnitPropId, int(0)); carService.CallSetIntMethod(roadTypePropId, int(0)); carService.CallSetIntMethod(speedLimitPropId, int(0)); carService.CallSetIntMethod(speedLimitTypePropId, int(0)); carService.CallSetIntMethod(mplLimitTypePropId, int(0)); carService.CallSetIntMethod(mpDistancePropId, int(0)); carService.CallSetIntMethod(timeLimitPropId, int(0)); carService.CallSetIntMethod(rainddayLimitPropId, int(0)); carService.CallSetIntMethod(snowdayLimitPropId, int(0)); carService.CallSetIntMethod(foggydayLimitPropId, int(0)); carService.CallSetIntMethod(naviRampInfoId, int(0)); } firstFlag = false; } else { bool revealFlag(false); /*compare isamessage*/ mIsaMessMutex.lock(); /*拷贝当前Isa信息防止变化*/ NaviIsaMsg currentIsaMsg = mCurrentIsaMsg; #ifdef _VIEWER_TOOL_ nlohmann::json jsonStr = mISAMsgJson; #endif //_VIEWER_TOOL_ mIsaMessMutex.unlock(); /*限速值*/ if (mBaselineIsaMsg.mSpeedLimit != currentIsaMsg.mSpeedLimit) { int propValue = int(currentIsaMsg.mSpeedLimit); carService.CallSetIntMethod(speedLimitPropId, propValue); revealFlag = true; } /*服务状态*/ if (mBaselineIsaMsg.mISASeviceStatus != currentIsaMsg.mISASeviceStatus) { int propValue = int(currentIsaMsg.mISASeviceStatus); carService.CallSetIntMethod(serviceStatusPropId, propValue); revealFlag = true; } /*服务置信度*/ if (mBaselineIsaMsg.mISASeviceConfidence != currentIsaMsg.mISASeviceConfidence) { int propValue = int(currentIsaMsg.mISASeviceConfidence); carService.CallSetIntMethod(serviceConfidencePropId, propValue); revealFlag = true; } /*限速类型*/ if (mBaselineIsaMsg.mSpeedLimitType != currentIsaMsg.mSpeedLimitType) { int propValue = int(currentIsaMsg.mSpeedLimitType); carService.CallSetIntMethod(speedLimitTypePropId, propValue); revealFlag = true; } /*道路等级*/ if (mBaselineIsaMsg.mCurrentWayClass != currentIsaMsg.mCurrentWayClass) { int propValue = int(currentIsaMsg.mCurrentWayClass); carService.CallSetIntMethod(wayFunctionPropId, propValue); revealFlag = true; } /*道路类型*/ if (mBaselineIsaMsg.mCurrentWayType != currentIsaMsg.mCurrentWayType) { int propValue = int(currentIsaMsg.mCurrentWayType); carService.CallSetIntMethod(roadTypePropId, propValue); revealFlag = true; } /*速度单位*/ if (mBaselineIsaMsg.mSpeedlimitunitType != currentIsaMsg.mSpeedlimitunitType) { int propValue = int(currentIsaMsg.mSpeedlimitunitType); carService.CallSetIntMethod(limitUnitPropId, propValue); revealFlag = true; } /*时间条件限速*/ if (mBaselineIsaMsg.mTimeDeLimit != currentIsaMsg.mTimeDeLimit) { int propValue = int(currentIsaMsg.mTimeDeLimit); carService.CallSetIntMethod(timeLimitPropId, propValue); revealFlag = true; } /*雨天条件限速*/ if (mBaselineIsaMsg.mRainDeLimit != currentIsaMsg.mRainDeLimit) { int propValue = int(currentIsaMsg.mRainDeLimit); carService.CallSetIntMethod(rainddayLimitPropId, propValue); revealFlag = true; } /*雪天条件限速*/ if (mBaselineIsaMsg.mSnowDeLimit != currentIsaMsg.mSnowDeLimit) { int propValue = int(currentIsaMsg.mSnowDeLimit); carService.CallSetIntMethod(snowdayLimitPropId, propValue); revealFlag = true; } /*雾天条件限速*/ if (mBaselineIsaMsg.mFoggyDeLimit != currentIsaMsg.mFoggyDeLimit) { int propValue = int(currentIsaMsg.mFoggyDeLimit); carService.CallSetIntMethod(foggydayLimitPropId, propValue); revealFlag = true; } /*国家编码*/ if (mBaselineIsaMsg.mCountryType != currentIsaMsg.mCountryType) { int propValue = int(currentIsaMsg.mCountryType); carService.CallSetIntMethod(countryCodePropId, propValue); revealFlag = true; } /*隐式限速类型*/ if (mBaselineIsaMsg.mLicitSpeedLimitType != currentIsaMsg.mLicitSpeedLimitType) { int propValue = int(currentIsaMsg.mLicitSpeedLimitType); carService.CallSetIntMethod(mplLimitTypePropId, propValue); revealFlag = true; } /*匝道距离*/ if (mBaselineIsaMsg.mDisatance != currentIsaMsg.mDisatance) { int propValue = int(currentIsaMsg.mDisatance); carService.CallSetIntMethod(mpDistancePropId, propValue); revealFlag = true; } /*是否进入匝道*/ if (mBaselineIsaMsg.mRampFlag != currentIsaMsg.mRampFlag) { int propValue = int(currentIsaMsg.mRampFlag); carService.CallSetIntMethod(naviRampInfoId, propValue); revealFlag = true; } /*compare isamessage end*/ // mIsaMessMutex.lock(); if (revealFlag) { mBaselineIsaMsg = std::move(currentIsaMsg); } #ifdef _VIEWER_TOOL_ jsonStr["time"] = GetCurrentTime(); if (revealFlag) { jsonStr["NaviRevealFlag"] = 1; } else { jsonStr["NaviRevealFlag"] = 0; } mSocketThread.enqueue(ForSendBySocket, jsonStr); #endif //_VIEWER_TOOL_ } std::this_thread::sleep_for(std::chrono::milliseconds(TransmitFreq)); } else { break; } } if (carFlag) carService.DetachCarService(); printf("Isa advertisement service endup!\n"); return ; } void IsaService::SetMessage(const LocationMsgPtr& locationMsg, const ISAMessagePtr& isaMessage, bool haveMsg) { if (locationMsg == nullptr || isaMessage == nullptr) { WriteAndroidLog(4, "SetMessage: LocationMsg or ISAMessage is nullptr!"); printf("LocationMsg or ISAMessage is nullptr!\n"); return; } /*组织信息放到外层*/ // if (haveMsg) { // /*对齐东风纳米信号矩阵--20240221*/ // if (isaMessage->mLimitValue <= 32){ // mIsaSeviceStatus = ISASeviceStatus::VALIDHASLIMIT; // } else if (isaMessage->mLimitValue == 33) { // mIsaSeviceStatus = ISASeviceStatus::VALIDNOLIMIT; // } else { // isaMessage->mLimitValue = 0; // } // } else { // if (locationMsg->mStaus != ISASeviceStatus::Unknown) { // mIsaSeviceStatus = locationMsg->mStaus; // } // } mRouteService->updateLocation(locationMsg); mIsaMessMutex.lock(); /*generate isa msg*/ if (haveMsg) { OrgnazieNaviMsg(isaMessage); } else { mStatusMutex.lock(); mCurrentIsaMsg.mISASeviceStatus = mIsaSeviceStatus; /*对应无地图和导航硬件无效时发无效值*/ if (mIsaSeviceStatus == ISASeviceStatus::INVALIDNOMAP || mIsaSeviceStatus == ISASeviceStatus::INVALIDPOSITIONFAULT) { mCurrentIsaMsg.mSpeedLimit = 0; mCurrentIsaMsg.mCountryType = NaviCountryType::Unknown; mCurrentIsaMsg.mCurrentWayClass = RoadFunctionClass::Unknown; mCurrentIsaMsg.mCurrentWayType = RoadType::Invalid; mCurrentIsaMsg.mISASeviceConfidence = ISASeviceConfidence::Class0; mCurrentIsaMsg.mSpeedLimitType = SpeedLimitSource::Unknown; mCurrentIsaMsg.mSpeedlimitunitType = SpeedUnitType::Unknown; mCurrentIsaMsg.mTimeDeLimit = 0; mCurrentIsaMsg.mRainDeLimit = 0; mCurrentIsaMsg.mSnowDeLimit = 0; mCurrentIsaMsg.mFoggyDeLimit = 0; mCurrentIsaMsg.mDisatance = 0; mCurrentIsaMsg.mRampFlag = 0; mCurrentIsaMsg.mLicitSpeedLimitType = 0; } else { mCurrentIsaMsg.mISASeviceConfidence = isaMessage->mSeviceConfidence; } mStatusMutex.unlock(); } #ifdef _VIEWER_TOOL_ nlohmann::json isaMsgjson = OrgnazieIsaJson(locationMsg); mISAMsgJson = std::move(isaMsgjson); #endif //_VIEWER_TOOL_ mIsaMessMutex.unlock(); return; } void IsaService::OrgnazieNaviMsg(const ISAMessagePtr& isaMsg) { if (isaMsg == nullptr) { WriteAndroidLog(4, "SetMessage:ISAMessage is nullptr!"); printf("ISAMessage is nullptr!\n"); return; } NaviIsaMsg isaMsgBuf; /*每次组织时初始化isa消息*/ /*isa消息在外层组织,对应未匹配到道路时播发上一帧数据*/ // if (locationMsg->mCurrentRoad != nullptr) { isaMsgBuf.mCurrentWayType = isaMsg->mRoadType; isaMsgBuf.mCurrentWayClass = isaMsg->mFuncClass; /*对应环岛限速值播发*/ if (isaMsg->mIsRotaryLink) { if ((isaMsg->mLimitValue >= 12) || (mCurrentSpeed == 0)) { isaMsgBuf.mSpeedLimit = (int)(isaMsg->mLimitValue); mCurrentSpeed = isaMsg->mLimitValue; } else { isaMsgBuf.mSpeedLimit = (int)mCurrentSpeed; } } else { isaMsgBuf.mSpeedLimit = (int)(isaMsg->mLimitValue); mCurrentSpeed = isaMsg->mLimitValue; } // } else { // isaMsgBuf.mCurrentWayType = RoadType::Invalid; // isaMsgBuf.mCurrentWayClass = RoadFunctionClass::Unknown; // isaMsgBuf.mSpeedLimit = isaMsg->mLimitValue; // mCurrentSpeed = isaMsg->mLimitValue; // } isaMsgBuf.mSpeedlimitunitType = isaMsg->mUnitType; isaMsgBuf.mSpeedLimitType = isaMsg->mLimitType; mStatusMutex.lock(); isaMsgBuf.mCountryType = mCurrentCountryType; isaMsgBuf.mISASeviceStatus = mIsaSeviceStatus; mStatusMutex.unlock(); isaMsgBuf.mISASeviceConfidence = isaMsg->mSeviceConfidence; for (auto delpair : isaMsg->mDeLimitValuePair) { if (delpair.first == DependentLimit::TimeRegulation) { isaMsgBuf.mTimeDeLimit = delpair.second; } else if (delpair.first == DependentLimit::RainDay) { isaMsgBuf.mRainDeLimit = delpair.second; } else if (delpair.first == DependentLimit::SnowyDay) { isaMsgBuf.mSnowDeLimit = delpair.second; } else if (delpair.first == DependentLimit::FoggyDay) { isaMsgBuf.mFoggyDeLimit = delpair.second; } } /*匝道属性赋值*/ NavRampInfo rampInfoFlag; isaMsgBuf.mDisatance = mRouteService->getRampDistance(rampInfoFlag); isaMsgBuf.mRampFlag = int(rampInfoFlag); simRampDis = isaMsgBuf.mDisatance; mCurrentIsaMsg = std::move(isaMsgBuf); return ; } #ifdef _VIEWER_TOOL_ void IsaService::SetJsonFile(const nlohmann::json& ofsJson) { mJsonMutex.lock(); mofsJson.push_back(ofsJson); mJsonMutex.unlock(); if (mofsJson.size() > JsonSize) { mJsonThread.enqueue(ForDumpJsonFile); } return; } void IsaService::DumpJsonFile() { std::ofstream mofs; mJsonMutex.lock(); if (mofsJson.empty()) { mJsonMutex.unlock(); return; } #ifdef __ANDROID__ if (mJsonCount == 0) { for (int8_t i = 0; i <= 2; ++i) { //std::string dirname = "/map/ISAMessage_" + std::to_string(i); /*台架临时路径*/ std::string dirname =Update::get_Global_m_data_address() + "ISAMessage_" + std::to_string(i); struct stat statbbuf; if (stat(dirname.c_str(), &statbbuf) == 0 && S_ISDIR(statbbuf.st_mode)) { continue; // cout << "Folder exists!" << endl; } else { // cout << "Folder does not exist!" << endl; mFileCount = i; if (mkdir(dirname.c_str(), S_IRWXU) == 0) { printf("Tip:Folder created!\n"); } break; } } } // std::string path = "/map/ISAMessage_" + std::to_string(mFileCount) + "/ISAMessage_" + std::to_string(mJsonCount) + ".json"; /*台架临时路径*/ std::string path = Update::get_Global_m_data_address() + "ISAMessage_" + std::to_string(mFileCount) + "/ISAMessage_" + std::to_string(mJsonCount) + ".json"; mofs.open(path.c_str(), std::ios::trunc); #else if (mJsonCount == 0) { for (int8_t i = 0; i <= 2; ++i) { std::string dirname = "./ISAMessage_" + std::to_string(i); struct stat statbbuf; if (stat(dirname.c_str(), &statbbuf) == 0 && S_ISDIR(statbbuf.st_mode)) { continue; printf("Tip:Folder exist!\n"); } else { printf("Tip:Folder does not exist!\n"); mFileCount = i; if (mkdir(dirname.c_str(), S_IRWXU) == 0) { printf("Tip:Folder created!\n"); } break; } } } std::string path = "./ISAMessage_" + std::to_string(mFileCount) + "/ISAMessage_" + std::to_string(mJsonCount) + ".json"; mofs.open(path.c_str(), std::ios::trunc); #endif //!defined(__ANDROID__) if (mofs.is_open()) { mofs << mofsJson.dump(4); } else { printf("ERROR:mofs open false!\n"); } mofsJson.clear(); mJsonMutex.unlock(); mofs.close(); mJsonCount ++; return; } nlohmann::json IsaService::OrgnazieIsaJson(const LocationMsgPtr& locationMsg) { nlohmann::json messJson; nlohmann::json positionjson; nlohmann::json gnssposjson; nlohmann::json drposjson; nlohmann::json matchlistjson; nlohmann::json rampSearchJson; if (locationMsg == nullptr) { WriteAndroidLog(4, "SetMessage: LocationMsg or ISAMessage is nullptr!"); printf("LocationMsg or ISAMessage is nullptr!\n"); return mISAMsgJson; } std::string timestamp = std::to_string(locationMsg->mLimitTime.mYear) + "-" + std::to_string(locationMsg->mLimitTime.mMonth) + "-" +std::to_string(locationMsg->mLimitTime.mDay) + "-"; timestamp += std::to_string(locationMsg->mLimitTime.mHour) + "-" + std::to_string(locationMsg->mLimitTime.mMin); messJson["timestamp"] = timestamp;//locationMsg->mGnssMsg.mTimestampUtc; messJson["heading"] = locationMsg->mGnssMsg.mPositionHeading; messJson["satellitestate"] = locationMsg->mGnssMsg.mUsedGnssSvNum; messJson["speed"] = locationMsg->mVehiMsg.mSpeed * 3.6; messJson["xsensordata"] = locationMsg->mImuMsg.mXsensorData; messJson["ysensordata"] = locationMsg->mImuMsg.mYsensorData; messJson["yawrate"] = locationMsg->mImuMsg.mYawrate; messJson["mSnr"] = locationMsg->mGnssMsg.mAverageSnr;//信噪比 messJson["traveldirection"] = (int)locationMsg->mDriveDir;//行驶方向 positionjson["longitude"] = locationMsg->mMMPosition.x; positionjson["latitude"] = locationMsg->mMMPosition.y; gnssposjson["longitude"] = locationMsg->mGnssMsg.mLongitude; gnssposjson["latitude"] = locationMsg->mGnssMsg.mLatitude; messJson["gnss"] = gnssposjson; drposjson["longitude"] = locationMsg->mPosition.x; drposjson["latitude"] = locationMsg->mPosition.y; messJson["dr"] = drposjson; messJson["position"] = positionjson; messJson["frequency"] = TransmitFreq; if (locationMsg->mCurrentRoad != nullptr) { messJson["tileid"] = locationMsg->mCurrentRoad->mTileId; messJson["roadid"] = locationMsg->mCurrentRoad->mRoadId; } else { messJson["tileid"] = 0; messJson["roadid"] = 0; } for (auto matchlink : locationMsg->mMatchlist) { if(matchlink!=nullptr){ matchlistjson.push_back(matchlink->mRoadId); } } messJson["MatchLists"] = matchlistjson; std::vector<RoadID> searchIdList; mRouteService->getPathRoadIds(searchIdList); for (auto roadId : searchIdList) { rampSearchJson.push_back(roadId); } messJson["rampSearchList"] = searchIdList; nlohmann::json isaJson; /*由组织好的isa消息进行赋值,减少代码重复*/ // if (locationMsg->mCurrentRoad != nullptr) { // isaJson["NaviCurrentWayType"] = (int)locationMsg->mCurrentRoad->mRoadType; // isaJson["NaviCurrentWayClass"] = (int)locationMsg->mCurrentRoad->mFunctionClass; // } else { // isaJson["NaviCurrentWayType"] = 0; // isaJson["NaviCurrentWayClass"] = 0; // } isaJson["NaviCurrentWayType"] = (int)mCurrentIsaMsg.mCurrentWayType; isaJson["NaviCurrentWayClass"] = (int)mCurrentIsaMsg.mCurrentWayClass; isaJson["NaviSpeedLimit"] = (int)mCurrentIsaMsg.mSpeedLimit; isaJson["NaviSpeedlimitunitType"] = (int)(mCurrentIsaMsg.mSpeedlimitunitType); isaJson["NaviSpeedLimitType"] = (int)(mCurrentIsaMsg.mSpeedLimitType); isaJson["NaviCountryType"] = (int)(mCurrentIsaMsg.mCountryType); isaJson["NaviISASeviceStatus"] = (int)(mCurrentIsaMsg.mISASeviceStatus); isaJson["NaviISASeviceConfidence"] = (int)(mCurrentIsaMsg.mISASeviceConfidence); isaJson["NavRampDistance"] = (int)mCurrentIsaMsg.mDisatance; isaJson["NavRampFlag"] = (int)mCurrentIsaMsg.mRampFlag; isaJson["NavImplicitSpeedLimitType"] = (int)mCurrentIsaMsg.mLicitSpeedLimitType; isaJson["NavConditionalSpeedLimitValue1"] = int(mCurrentIsaMsg.mTimeDeLimit); /*timelimit*/ isaJson["NavConditionalSpeedLimitValue2"] = int(mCurrentIsaMsg.mRainDeLimit); /*rainlimit*/ isaJson["NavConditionalSpeedLimitValue3"] = int(mCurrentIsaMsg.mSnowDeLimit); /*snowlimit*/ isaJson["NavConditionalSpeedLimitValue4"] = int(mCurrentIsaMsg.mFoggyDeLimit); /*foggylimit*/ // for (auto delpair : isaMsg->mDeLimitValuePair) { // if (delpair.first == DependentLimit::TimeRegulation) { // isaJson["NavConditionalSpeedLimitValue1"] = (int)delpair.second; // } else if (delpair.first == DependentLimit::RainDay) { // isaJson["NavConditionalSpeedLimitValue2"] = (int)delpair.second; // } else if (delpair.first == DependentLimit::SnowyDay) { // isaJson["NavConditionalSpeedLimitValue3"] = (int)delpair.second; // } else if (delpair.first == DependentLimit::FoggyDay) { // isaJson["NavConditionalSpeedLimitValue4"] = (int)delpair.second; // } // } messJson["IsaMessage"] = isaJson; return messJson; } /*bool IsaService::InitPort() { std::string configPath(""); #ifdef __ANDROID__ configPath = "/map/db_config.ini"; #else char* dirBuffer = getcwd(nullptr, 0); std::string bufPath = std::string(dirBuffer); if (strcmp(bufPath.c_str(), "") == 0) { printf("ERROR:Can not find the config path!\n"); return false; } if (bufPath.find_last_of("/") != bufPath.length() - 1) { configPath = bufPath + "/db_config.ini"; } else { configPath = bufPath + "db_config.ini"; } free(dirBuffer); #endif //!defined(__ANDROID__) std::ifstream ifs(configPath.c_str(), std::ios::in); if (!ifs) { // printf("ERROR:Open db_config.ini false!\n"); WriteAndroidLog(4, "Open db_config.ini false!"); return false; } std::string porttag("PORT"); std::string configValue(""); while (getline(ifs, configValue)) { if (strcmp(configValue.c_str(), "") == 0 || configValue.find("#") == 0 || configValue.find("[") == 0) { continue; } if (configValue.find(porttag, 0) == 0) { size_t tag = configValue.find("=", 0); std::string port = configValue.substr(tag + 1); port.erase(0, port.find_first_not_of(" ")); port.erase(port.find_last_not_of(" ") +1); mPort = atoi(port.c_str()); } } ifs.close(); return true; }*/ void IsaService::SocketServer() { if (mTcpFlag) { if (!mAcceptFlag) { while (mRevealFlag) { if (mTcpServer.Accept()) { mAcceptFlag = true; break; } } } } else { int8_t count(0); while (true) { if (mTcpServer.InitServer("", mPort)) { mTcpFlag = true; while (mRevealFlag) { if (mTcpServer.Accept()) { mAcceptFlag = true; break; } } break; } else { if (count >= 3) { WriteAndroidLog(4, "Init socket service false!"); break; } std::this_thread::sleep_for(std::chrono::minutes(1)); count ++; } } } return; } void IsaService::SendBySocket(nlohmann::json& jsonValue) { SetJsonFile(jsonValue); std::string jsonStr = jsonValue.dump(); if (mTcpFlag) { if (mAcceptFlag) { uint64_t hsize = jsonStr.length(); std::string headstr = std::to_string(hsize); char* sendHeader = new char[16]; memset(sendHeader, 0, 16); memcpy(sendHeader, headstr.data(), 16); if (mTcpServer.Send(sendHeader, 16)) { // todo } else { // printf("Tip:sendHeader false!\n"); } char* rev_header = new char[16]; memset(rev_header, 0, 16); if (mTcpServer.RecvDataLength(rev_header, 16)) { std::string header = std::string(rev_header); if (strcmp(header.c_str(), "End") == 0) { // printf("Tip:RecvDataLength End:%s!\n", header.c_str()); mAcceptFlag = false; std::thread func(ForSokcetMessage); #ifdef __linux__ pthread_setname_np(func.native_handle(), "IsaTcpService"); #endif //__linux__ func.detach(); } else { uint32_t data_size = jsonStr.length(); uint32_t array_size = data_size + 1; char* sendData = new char[array_size]; memset(sendData, 0, array_size); memcpy(sendData, jsonStr.data(), data_size); // uint8_t* temp_p = (uint8_t*)sendData; if (mTcpServer.Send(sendData, data_size)) { /*todo*/ } else { // printf("Tip:Send sendData false!\n"); } delete[] sendData; sendData = nullptr; } } else { // printf("Tip:RecvDataLength false!\n"); } delete[] rev_header; rev_header = nullptr; delete[] sendHeader; sendHeader = nullptr; if (mTcpServer.m_broken) { mAcceptFlag = false; std::thread func(ForSokcetMessage); #ifdef __linux__ pthread_setname_np(func.native_handle(), "IsaTcpService"); #endif //__linux__ func.detach(); // printf("Tip:m_broken!\n"); } } // printf("Tip:Send end!\n"); } return; } void IsaService::DetachSocketServer() { if (mTcpFlag) { if (mAcceptFlag) { std::string endflag("End"); uint8_t esize = endflag.length(); char* sendHeader = new char[esize + 1]; memset(sendHeader, 0, esize + 1); memcpy(sendHeader, endflag.data(), esize); mTcpServer.Send(sendHeader, esize); delete[] sendHeader; sendHeader = nullptr; // printf("Tip:Send end!\n"); mAcceptFlag = false; } mTcpFlag = false; } return; } #endif //_VIEWER_TOOL_ // void IsaService::ListenInCarConfig() { // CarService carService; // int8_t delayTime(0); // int8_t naviIsaConfig(0); // if (carService.InitJniEnv()) { // naviIsaConfig = carService.FindStaticIntField("ID_ADAS_ISA_CONFIG", "I"); // if (naviIsaConfig == 1 && mServerConfig == false) { // mServerConfig = true; // delayTime = 0; // } else { // if (delayTime <= 2) delayTime ++; // WriteAndroidLog(1, "ID_ADAS_ISA_CONFIG :" + std::to_string(naviIsaConfig)); // } // } else { // WriteAndroidLog(4, "CarService ListenInCarConfig false!"); // } // return; // } void IsaService::SetCountryType(const NaviCountryType& countryType) { mStatusMutex.lock(); if (mCurrentCountryType != countryType) { mCurrentCountryType = countryType; UTCTimeZone timezone; if (DataManager::getinstance()->GetTimezoneByCountry(countryType, timezone)) { if (timezone.mSign) { UTCTimeDif = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::minutes(timezone.mHour*60 + timezone.mMinute)); } else { UTCTimeDif = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::minutes(-(timezone.mHour*60 + timezone.mMinute))); } } else { UTCTimeDif = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::minutes(0)); } } mStatusMutex.unlock(); return ; } void IsaService::SetSeviceStatus(const ISASeviceStatus& serviceStatus) { mStatusMutex.lock(); mIsaSeviceStatus = serviceStatus; mStatusMutex.unlock(); /*策略修改,匹配失败时播发上一帧数据*/ // if (serviceStatus == ISASeviceStatus::INVALIDNOMAP) { // LocationMsgPtr initLocattion = std::make_shared<LocationMsg>(); // ISAMessagePtr initIsaMsg = std::make_shared<ISAMessage>(); // SetMessage(initLocattion, initIsaMsg); // } return ; } void IsaService::GetCountryCode(CountryCode& countryCode) { bool ret(false); mStatusMutex.lock(); countryCode = PaseraCountryCode(mCurrentCountryType); mStatusMutex.unlock(); return ; } NaviCountryType IsaService::GetCountryType() { // mStatusMutex.lock(); return mCurrentCountryType; mStatusMutex.unlock(); } } } 这段代码哪里体现出json路径

error: The following untracked working tree files would be overwritten by checko ut: .vscode/settings.json Backup/Config/DefaultEngine.ini Backup/Config/DefaultGame.ini Backup/Config/GlobalConfig.ini Docs/UE_5.4 Engine Plugins Media 替换内容/PixelCapture/Binaries/Win64/Un realEditor-PixelCapture.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelCapture/Binaries/Win64/Un realEditor-PixelCaptureShaders.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreaming.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingBlueprint.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingBlueprintEditor.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingEditor.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingHMD.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingInput.dll Docs/UE_5.4 Engine Plugins Media 替换内容/PixelStreaming/Binaries/Win64/ UnrealEditor-PixelStreamingServers.dll Docs/场景元素命名规范.xls DreamCarSim/.gitignore DreamCarSim/Config/Camera_CyberTrunk.json DreamCarSim/Config/Camera_LTFree.json DreamCarSim/Config/Camera_Model3.json DreamCarSim/Config/Camera_XT6.json DreamCarSim/Config/Camera_bZ4X.json DreamCarSim/Config/Config.ini DreamCarSim/Config/DataGenerateConfig.json DreamCarSim/Config/DataGenerateConfig_DF.json DreamCarSim/Config/DefaultCamera_CyberTrunk.json DreamCarSim/Config/DefaultCamera_LTFree.json DreamCarSim/Config/DefaultCamera_Model3.json DreamCarSim/Config/DefaultCamera_XT6.json DreamCarSim/Config/DefaultCamera_bZ4X.json DreamCarSim/Config/DefaultCrypto.ini DreamCarSim/Config/DefaultDGM.ini DreamCarSim/Config/DefaultEditor.ini DreamCarSim/Config/DefaultEditorPerProjectUserSettings.ini DreamCarSim/Config/DefaultEngine.ini DreamCarSim/Config/DefaultGame.ini DreamCarSim/Config/DefaultGameUserSettings.ini DreamCarSim/Config/DefaultGameplayTags.ini DreamCarSim/Config/DefaultInput.ini DreamCarSim/Config/DefaultMass.ini DreamCarSim/Config/DefaultPlugins.ini DreamCarSim/Config/DynamicCar.ini DreamCarSim/Config/GeneralizationConfig.json DreamCarSim/Config/GeneralizationStorage.json DreamCarSim/Config/GlobalConfig.ini DreamCarSim/Config/GroundTruth.ini DreamCarSim/Config/HoloLens/HoloLensEngine.ini DreamCarSim/Config/I-VISTA DRV.7z DreamCarSim/Config/Lidar.ini DreamCarSim/Config/Lidar_BZ4X.ini DreamCarSim/Config/Lidar_CyberTruck.ini DreamCarSim/Config/Lidar_Model3.ini DreamCarSim/Config/Lidar_XT6.ini DreamCarSim/Config/Localization/Language_Compile.ini DreamCarSim/Config/Localization/Language_Export.ini DreamCarSim/Config/Localization/Language_ExportDialogueScript.ini DreamCarSim/Config/Localization/Language_Gather.ini DreamCarSim/Config/Localization/Language_GenerateReports.ini DreamCarSim/Config/Localization/Language_Import.ini DreamCarSim/Config/Localization/Language_ImportDialogue.ini DreamCarSim/Config/Localization/Language_ImportDialogueScript.ini DreamCarSim/Config/Localization/RegenerateLanguage.ini DreamCarSim/Config/Planning_Parameter.yaml DreamCarSim/Config/Template.xlsx DreamCarSim/Config/Template_IVISTA_Drive.xlsx DreamCarSim/Config/UDP.ini DreamCarSim/Config/Weather.json DreamCarSim/Config/Win64/OSMdata/kotei.osm DreamCarSim/Config/Win64/OSMdata/lastRun.csv DreamCarSim/Config/Win64/OSMdata/source.osm DreamCarSim/Config/Win64/OSMdata/target.osm DreamCarSim/Config/Zmq.ini DreamCarSim/Config/config.json DreamCarSim/Config/config/lantu/config2.yaml DreamCarSim/Config/ipconfig.ini DreamCarSim/Config/kotei_BZ4X.ini DreamCarSim/Config/kotei_CyberTruck.ini DreamCarSim/Config/kotei_CyberTruck_old.ini DreamCarSim/Config/kotei_MATLABVehcleDynamic.ini DreamCarSim/Config/kotei_MATLABVehcleDynamic_bak.ini DreamCarSim/Config/kotei_XT6.ini DreamCarSim/Config/obstacles.json DreamCarSim/Config/paramete Aborting

大家在看

recommend-type

HCIE-Storage实验手册06---Oracle主备容灾方案实验手册.docx

HCIE-Storage实验手册06---Oracle主备容灾方案实验手册.docx
recommend-type

通达信DLL插件编程示例(源码)

通达信DLL插件编程示例(源码)
recommend-type

C#调用LibVLCSharp库播放视频 句柄播放 或回调播放

C#调用LibVLCSharp包播放视频 1、句柄播放视频, media = new Media(libVLC, @textBox2.Text/*openDialog.FileName*/, FromType.FromPath); //赋值播放的句柄 mediaPlayer.Hwnd = this.panel1.Handle; mediaPlayer.Play(media); 2、回调函数播放视频 mediaPlayer.SetVideoFormat("RV32", _width, _height, _pitch); mediaPlayer.SetVideoCallbacks(VideoLockCallBack, null/*VideoUnlockCallBack*/, DisplayVideo); mediaPlayer.Play(media); play、pause、stop、TakeSnapshot等常规的函数调用 此项目功能简单,只做启蒙用
recommend-type

思科7960/7940 sip 8.6 固件

Cisco Call Manager 系统从7.1 升级的9.1, 部分电话7941和7942的firmware没有成功从8-3-1s升级到9-3-1SR1。 虽然这样的电话也能工作,但有时会自动重启。没升级成功的主要原因是8-3-1S必须经过一个中间版本8-5-2S才能升级到9-3-1SR1。没升级成功的电话分别在5个站点,Call Manager 在其中一个站点。跨WAN升级很慢。因此想找个本地服务器的方法。
recommend-type

aspweb,免费IIS模拟器,支持ASP

aspweb.exe是一款功能强大的IIS模拟器,支持ASP。使用时将aspweb.exe放在网站的根目录,双击打开就可运行测试该网站程序。对于未安装IIS的XP用户,非常简单实用! IIS强大模拟软件 ASP 必用

最新推荐

recommend-type

opencv4.5.5 基于微信在opencv开源的二维码扫码 opencv-wechat-qrcode.zip

opencv4.5.5 基于微信在opencv开源的二维码扫码 opencv-wechat-qrcode.zip
recommend-type

Kotlin 二维码_条形码.zip

Kotlin 二维码_条形码.zip
recommend-type

Matlab_无人潜水器动力学仿真模型_Matlab_Simulink model of UUV dynamics.zi

Matlab_无人潜水器动力学仿真模型_Matlab_Simulink model of UUV dynamics.zip
recommend-type

mksSandbox.log

mksSandbox
recommend-type

Android二维码扫描和生成小工具.zip

Android二维码扫描和生成小工具.zip
recommend-type

Hyperledger Fabric v2与Accord Project Cicero智能合约开发指南

标题和描述中提到的“hlf-cicero-contract:Accord Project Cicero与Hyperledger Fabric v2签约”以及“半西约合同”暗示了与智能合约和区块链技术相关的知识点。下面详细说明这些知识点: ### 智能合约与区块链技术 智能合约是一套运行在区块链上的程序,当合约条款被触发时,合约会自动执行相应的操作。这种自动执行的特点使得智能合约特别适合于执行多方之间的可信交易,它能减少或消除中介服务的需要,从而降低交易成本并提高效率。 区块链技术是一种分布式账本技术,通过加密算法和共识机制保证了交易数据的不可篡改性和透明性。区块链上的每一笔交易都会被网络中的多个节点验证并记录,确保了交易记录的安全性。 ### Hyperledger Fabric v2 Hyperledger Fabric 是由Linux基金会托管的一个开源项目,它是企业级区块链框架,旨在为商业应用提供安全、模块化、可扩展的区块链平台。Hyperledger Fabric v2.2是该框架的一个版本。 Hyperledger Fabric v2支持链码(Chaincode)概念,链码是部署在Hyperledger Fabric网络上的应用程序,它可以被用来实现各种智能合约逻辑。链码在运行时与网络中的背书节点和排序服务交互,负责验证、执行交易以及维护账本状态。 ### Accord Project Cicero Accord Project Cicero 是一个开源的智能合同模板和执行引擎,它允许开发者使用自然语言来定义合同条款,并将这些合同转换为可以在区块链上执行的智能合约。CiceroMark是基于Markdown格式的一种扩展,它允许在文档中嵌入智能合约逻辑。 通过Accord Project Cicero,可以创建出易于理解、可执行的智能合约。这些合同可以与Hyperledger Fabric集成,利用其提供的安全、透明的区块链网络环境,从而使得合同条款的执行更加可靠。 ### 智能合约的安装与部署 描述中提到了“安装”和“启动”的步骤,这意味着为了使用HLF v2.2和Accord Project Cicero,需要先进行一系列的配置和安装工作。这通常包括设置环境变量(例如HLF_INSTALL_DIR)、安装区块链网络(Test-Net)以及安装其他必需的软件工具(如jq)。 jq是一个轻量级且灵活的命令行JSON处理器,常用于处理JSON数据。在区块链项目中,jq可以帮助开发者处理链码或智能合约的数据,特别是在与网络节点交互时。 ### JavaScript 标签 标签“JavaScript”表明本项目或相关文档中会涉及到JavaScript编程语言。Hyperledger Fabric v2支持多种智能合约语言,其中JavaScript是一个广泛使用的选项。JavaScript在编写链码时提供了灵活的语法和强大的库支持,是进行区块链开发的一个流行选择。 ### 文件结构 文件名称列表“hlf-cicero-contract-master”暗示这是一个包含所有相关文件和资源的项目源代码目录。这个名称通常表明开发者可以从该目录开始探索、安装和配置项目的所有组件。 ### 综合知识点 1. 智能合约与区块链技术可以自动化执行多方面可信交易,降低交易成本并提高效率。 2. Hyperledger Fabric v2为企业提供一个安全、模块化、可扩展的区块链平台。 3. Accord Project Cicero结合Markdown格式的CiceroMark,将自然语言定义的合同条款转换为可执行的智能合约。 4. 智能合约的安装和部署涉及到一系列配置步骤,包括设置环境变量、安装必要的软件工具等。 5. JavaScript是编写智能合约的流行语言之一,为区块链开发提供灵活性和强大的库支持。 6. 项目文件结构表明从一个主目录可以探索和配置所有项目相关文件和资源。 以上是根据文件标题、描述、标签以及文件名称列表所提取的相关知识点。这些知识点对于理解Hyperledger Fabric v2和Accord Project Cicero在智能合约中的应用尤为重要。
recommend-type

深度神经网络优化技巧全解析

# 深度神经网络优化技巧全解析 ## 1 超越 Sigmoid 函数 在神经网络中,Sigmoid 函数曾被广泛使用,但它存在一些问题,如梯度消失。研究人员一直在寻找更好的激活函数,且不同的激活函数在不同场景下表现各异。 ### 1.1 ReLU 函数登场 如今,修正线性单元(ReLU)成为了 Sigmoid 的常用替代函数。与 Sigmoid 相比,ReLU 非常简单,以下是其 Python 实现: ```python def relu(z): if z <= 0: return 0 else: return z ``` ReLU 由两段直
recommend-type

什么是噪声功率密度

<think> 嗯,用户这次问的是噪声功率密度的定义,结合之前的系统指令和站内引用,需要给出清晰准确的中文解释。用户可能是电子工程或通信专业的学生,正在学习噪声相关的理论基础,也可能是工程师需要实际应用概念。从引用来[^1]看,用户对相位噪声的定义有基础认知,但需要系统梳理核心概念。 噪声功率密度最本质的定义应该是单位带宽内的噪声功率。引用[^2]提到电阻热噪声的例子很典型,50Ω电阻在300K环境下功率谱密度是定值(0.9nV/√Hz)²,这说明: 1. 它描述的是噪声功率随频率分布的密度 2. 与带宽强相关(带宽加倍则总功率加倍) 3. 单位通常用W/Hz或V²/Hz 维纳-辛钦定理(
recommend-type

Libshare: Salesforce的高效可重用模块集合

Salesforce是一个云基础的CRM平台,它允许用户构建定制应用程序来满足特定的业务需求。Apex是Salesforce平台上的一个强类型编程语言,用于开发复杂的业务逻辑,通过触发器、类和组件等实现。这些组件使得开发者可以更高效地构建应用程序和扩展Salesforce的功能。 在提到的"libshare:经过测试的Salesforce可重用模块"文件中,首先介绍了一个名为Libshare的工具包。这个工具包包含了一系列已经过测试的可重用模块,旨在简化和加速Salesforce应用程序的开发。 Libshare的各个组成部分的知识点如下: 1. 设置模块:在Salesforce应用程序中,应用程序设置的管理是必不可少的一部分。设置模块提供了一种简便的方式存储应用程序的设置,并提供了一个易用的API来与之交互。这样,开发者可以轻松地为不同的环境配置相同的设置,并且可以快速地访问和修改这些配置。 2. Fluent断言模块:断言是单元测试中的关键组成部分,它们用于验证代码在特定条件下是否表现预期。Fluent断言模块受到Java世界中Assertj的启发,提供了一种更流畅的方式来编写断言。通过这种断言方式,可以编写更易于阅读和维护的测试代码,提高开发效率和测试质量。 3. 秒表模块:在性能调优和效率测试中,记录方法的执行时间是常见的需求。秒表模块为开发者提供了一种方便的方式来记录总时间,并跟踪每种方法所花费的时间。这使得开发者能够识别瓶颈并优化代码性能。 4. JsonMapper模块:随着Web API的广泛应用,JSON数据格式在应用程序开发中扮演了重要角色。JsonMapper模块为开发者提供了一个更高级别的抽象,用于读取和创建JSON内容。这能够大幅简化与JSON数据交互的代码,并提高开发效率。 5. utils模块:在软件开发过程中,经常会遇到需要重复实现一些功能的情况,这些功能可能是通用的,例如日期处理、字符串操作等。utils模块提供了一系列已经编写好的实用工具函数,可以用于节省时间,避免重复劳动,提高开发效率。 6. 记录器模块:记录器通常用于记录应用程序的运行日志,以便于问题诊断和性能监控。系统提供的System.debug功能虽然强大,但在大型应用中,统一的记录器包装器可以使得日志管理更加高效。记录器模块支持记录器名称,并且可以对日志进行适当的封装。 7. App Logger模块:App Logger模块扩展了记录器模块的功能,它允许开发者将日志语句保存到一个精心设计的App Log对象中。此外,App Logger模块支持存储长达56k字符的日志内容,这对于复杂应用的监控和调试非常有用。 8. 应用程序任务模块:在处理异步作业时,例如批量数据处理或定时任务,需要有一个框架来管理和跟踪这些任务。应用程序任务模块提供了一个框架,用于处理可排队的作业,并能够跟踪这些任务的执行情况。 通过Libshare提供的这些模块,Salesforce的开发者能够减少开发工作量,加快开发速度,并提高代码质量。这些模块能够帮助开发者避免重复的“造轮子”工作,专注于核心业务逻辑的实现。同时,由于Libshare作为托管程序包发布,开发者无需担心代码的维护和管理,只需将其添加到自己的Salesforce组织中即可使用。 Libshare的发布也强调了可重用性的重要性,这是软件工程领域中长期提倡的一个原则。通过使用可重用的组件,开发者能够遵循DRY(Don't Repeat Yourself)原则,从而减少代码的冗余,提高生产效率,同时降低因重复编写相同代码而导致错误的风险。 总之,Libshare是一个有价值的资源,对于那些希望在Salesforce平台上快速构建高效、可靠应用程序的开发者来说,这些预置的、经过测试的模块无疑是一个强大的助手。
recommend-type

机器学习技术要点与应用解析

# 机器学习技术要点与应用解析 ## 1. 机器学习基础概念 ### 1.1 数据类型与表示 在编程中,数据类型起着关键作用。Python 具有动态类型特性,允许变量在运行时改变类型。常见的数据类型转换函数包括 `bool()`、`int()`、`str()` 等。例如,`bool()` 函数可将值转换为布尔类型,`int()` 用于将值转换为整数类型。数据类型还包括列表(`lists`)、字典(`dictionaries`)、元组(`tuples`)等集合类型,其中列表使用方括号 `[]` 表示,字典使用花括号 `{}` 表示,元组使用圆括号 `()` 表示。 ### 1.2 变量与命名