#include "AtSimInit.h" #include "IPeripheralManager.h" #include "Log.h" #include "sf_opera_adapt_v2.h" #include const char *AT_COMMAND_ATE = "ATE1\r"; // class NetworkATTaskV2 : public VNetworkTask // { // public: // NetworkATTaskV2(const char *command, ResponseCode (AtSimInit::*response)(const char *, const unsigned int &), // std::shared_ptr network) // : mATCommand(command), mResponse(response), mNetwork(network) // { // } // ~NetworkATTaskV2() // { // } // const char *GetWriteBuf(void) override // { // return mATCommand; // } // unsigned int GetWriteBufLength(void) override // { // return strlen(mATCommand); // } // bool IsTaskBlock(void) override // { // return true; // } // unsigned int RetryTimes(void) override // { // return 200; // } // ResponseCode Response(const char *buf, const unsigned int &length) override // { // if (mResponse) // { // ResponseCode code = ((dynamic_cast(mNetwork.get()))->*mResponse)(buf, length); // return code; // } // return ResponseCode::RESPONSE_OK; // } // const char *mATCommand; // ResponseCode (AtSimInit::*mResponse)(const char *, const unsigned int &); // std::shared_ptr mNetwork; // }; AtSimInit::AtSimInit() { mModuelV05 = 0; memset(GsnSaved, 0, GSN_BUF_LENGTH); memset(ModuleVersion, 0, SF_MODULE_VER_MAX_LEN); memset(lastICCID, 0, ICCID_BUF_LENGTH); mInitRuning = false; } void AtSimInit::UnInit(void) { LogInfo("AtSimInit::UnInit.\n"); mInitRuning = false; if (mInitThread.joinable()) { mInitThread.join(); } } RETURN_CODE AtSimInit::AtSimCardInit(void) { // TODO: 4G module has already connected ??? auto SimInitThreadStart = [](std::shared_ptr atCommand) { std::dynamic_pointer_cast(atCommand)->AtSimInitStart(); }; // std::thread simInit(SimInitThreadStart, SharedFromThis()); // simInit.detach(); if (mInitRuning) { LogWarning("AtSimCardInit runing.\n"); return VReturnCode::NewCode(VReturnCodeDefine::NOT_OK_UNDEFINE_REASON); } mInitRuning = true; mInitThread = std::thread(SimInitThreadStart, SharedFromThis()); return VReturnCode::NewCode(VReturnCodeDefine::OK); } void AtSimInit::AtSimInitStart(void) { ATE_Handle(); } bool AtSimInit::SimInitRetry(void) { if (!mInitRuning) { LogWarning("Stop Init.\n"); return false; } constexpr int SIM_INIT_CALL_RETRY = 200; AtCallOnce(); if (GetAtCallTimes() <= SIM_INIT_CALL_RETRY) { LogInfo("Retry to call, call times = %d.\n", GetAtCallTimes()); return true; } // SetAtCallTimes(); LogError("Sim card init failed.\n"); // TODO: return false; } void AtSimInit::ATE_Handle(void) { LogInfo("AT-Command:ATE1\n"); SetAtCallTimes(0); char response[RESPONSE_BUF_LENGTH] = {0}; std::shared_ptr task = std::make_shared(AT_COMMAND_ATE, response, RESPONSE_BUF_LENGTH); ATE_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("AtSimInitStart. response = %s\n", response); if (strstr(response, "OK")) { LogInfo("ATE_Handle response ok.\n"); AT_GSN_Handle(); return; } if (SimInitRetry()) { goto ATE_RETRY; } } const char *AT_GSN = "AT+GSN\r"; void AtSimInit::AT_GSN_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_GSN, response, RESPONSE_BUF_LENGTH); AT_GSN_RETRY: if (!mInitRuning) { LogWarning("Stop Init.\n"); return; } memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); unsigned int length = std::dynamic_pointer_cast(task)->ActualResponseLength(); LogInfo("AT_GSN_Handle. response = %s\n", response); UINT16 index = 0; SF_CHAR GsnNow[GSN_BUF_LENGTH] = {0}; if (response[0] != '\0') { for (index = 0; index < length; index++) { if ((response[index] == '8') && (response[index + 1] == '6')) { SF_CHAR tempImei[16] = {0}; UINT8 p = 0; for (p = 0; p < IMEI_LEN; p++) { if ((response[p + index] >= '0') && (response[p + index] <= '9')) tempImei[p] = response[p + index]; else tempImei[p] = '\0'; } tempImei[15] = '\0'; strcpy(GsnNow, tempImei); break; } } } LogInfo("GsnNow = %s\n", GsnNow); LogInfo("GsnSaved = %s\n", GsnSaved); if ((GsnNow[0] != '\0') && (strncmp(GsnNow, GsnSaved, IMEI_LEN) == 0)) { AtGetIMEI(GsnNow); ATI_Handle(); return; } else { LogWarning("RESPONSE_FAILED_RETRY.\n"); strcpy(GsnSaved, GsnNow); goto AT_GSN_RETRY; } if (SimInitRetry()) { goto AT_GSN_RETRY; } } const char *AT_ATI = "ATI\r"; void AtSimInit::ATI_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_ATI, response, RESPONSE_BUF_LENGTH); ATI_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("ATI_Handle.buf = %s\n", response); SF_CHAR *pTemp = nullptr; SF_CHAR *p = nullptr; if ((strstr(response, "OK") != nullptr) || (strstr(response, "ERROR") != nullptr)) { pTemp = strstr(response, "Revision:"); if (pTemp != nullptr) { SF_CHAR modulVerStr[256] = {0}; strcpy(modulVerStr, pTemp + 10); pTemp = strtok(modulVerStr, "OK"); p = strtok(pTemp, "\r\n"); if (strcasecmp(p, ModuleVersion) != 0) { strcpy(ModuleVersion, p); } } if ((strstr(response, "AFAR05"))) { SetModuleV05(1); std::this_thread::sleep_for(std::chrono::milliseconds(500)); QFLST_1_Handle("at+qflst=\"../../usr/fota_ip_a/update_report.ur\"\r"); } else if (strstr(response, "AFAR07")) { std::this_thread::sleep_for(std::chrono::milliseconds(500)); QFLST_1_Handle("at+qflst=\"../../data/fota_ip_a/update_report.ur\"\r"); } else { std::this_thread::sleep_for(std::chrono::milliseconds(100)); QGMR_Handle(); } return; } std::this_thread::sleep_for(std::chrono::milliseconds(100)); if (SimInitRetry()) { goto ATI_RETRY; } } const char *AT_QGMR = "AT+QGMR\r"; void AtSimInit::QGMR_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QGMR, response, RESPONSE_BUF_LENGTH); QGMR_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QGMR_Handle.response = %s\n", response); if (strstr(response, GPRS_MODULE_TYPE_EG91) != nullptr) { char subTemp[SF_MODULE_VER_MAX_LEN] = {0}; eg91_parse_module_version((SF_CHAR *)strstr(response, GPRS_MODULE_TYPE_EG91), subTemp); AtGetModuleSubVersion(subTemp); if (strstr(ModuleVersion, GPRS_MODULE_TYPE_EG91_V)) { QNVFR_Handle(); } else { QSIMSTAT_Handle(); } return; } else if (strstr(response, GPRS_MODULE_TYPE_EG95) != nullptr) { char subTemp[SF_MODULE_VER_MAX_LEN] = {0}; eg91_parse_module_version((SF_CHAR *)strstr(response, GPRS_MODULE_TYPE_EG95), subTemp); AtGetModuleSubVersion(subTemp); if (strstr(ModuleVersion, GPRS_MODULE_TYPE_EG95_V)) { QNVFR_Handle(); } else { QSIMSTAT_Handle(); } return; } else { if (GetAtCallTimes() > 5) { if (strstr(ModuleVersion, GPRS_MODULE_TYPE_EG91_V)) { QNVFR_Handle(); } else if (strstr(ModuleVersion, GPRS_MODULE_TYPE_EG95_V)) { QNVFR_Handle(); } else { QSIMSTAT_Handle(); } return; } if (SimInitRetry()) { goto QGMR_RETRY; } } } const char *AT_QSIMSTAT = "AT+QSIMSTAT?\r"; void AtSimInit::QSIMSTAT_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QSIMSTAT, response, RESPONSE_BUF_LENGTH); QSIMSTAT_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QSIMSTAT_Handle. response=%s\n", response); if (strstr(response, "+QSIMSTAT: 0,0")) { if (GetAtCallTimes() > 50) { LogError("SimCard not inserted.\n"); AtSimInitResult(SimInitResult::SIM_INIT_NOT_INSERTED); return; } if (SimInitRetry()) { LogWarning("QSIMSTAT_RETRY.\n"); goto QSIMSTAT_RETRY; } } else if (strstr(response, "+QSIMSTAT: 0,1")) { LogInfo("SIM_INIT_QURCCFG.\n"); QURCCFG_Handle(); return; } else if (strstr(response, "+CPIN: NOT INSERTED")) { LogError("SimCard not inserted.\n"); AtSimInitResult(SimInitResult::SIM_INIT_NOT_INSERTED); return; } if (SimInitRetry()) { goto QSIMSTAT_RETRY; } } void AtSimInit::AT_END_Handle(char *atCommand) { constexpr int AT_LENGTH = 1024; SetAtCallTimes(0); char response[RESPONSE_BUF_LENGTH] = {0}; char at[AT_LENGTH] = {0}; memcpy(at, atCommand, strlen(atCommand)); std::shared_ptr task = std::make_shared(atCommand, response, RESPONSE_BUF_LENGTH); // AT_END_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("AT_END_Handle. response = %s\n", response); if (strstr(response, "OK")) { LogInfo("Sim card init ok.\n"); AtSimInitResult(SimInitResult::SIM_INIT_OK); return; } else if (strstr(response, "NOT")) { LogError("Sim card init failed, no sim card.\n"); AtSimInitResult(SimInitResult::SIM_INIT_NOT_INSERTED); return; } else { LogWarning("What happened?\n"); if ((GetAtCallTimes() % 10) == 0) { // TODO: What happend? No need to handle response? memset(response, 0, RESPONSE_BUF_LENGTH); std::shared_ptr task2 = std::make_shared("AT+CPIN?\r", response, RESPONSE_BUF_LENGTH); // TODO: SendAtCommandTask(task2); } } } void AtSimInit::QNVFR_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared("at+qnvfr=\"/nv/item_files/modem/uim/gstk/feature_bmsk\"\r", response, RESPONSE_BUF_LENGTH); QNVFR_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QNVFR_Handle.\n"); if (strstr(response, "+QNVFR: 11000000")) { QNVFW_Handle(); return; } else { AT_END_Handle((char *)"AT\r"); return; } if (SimInitRetry()) { goto QNVFR_RETRY; } } void AtSimInit::QNVFW_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared("at+qnvfw=\"/nv/item_files/modem/uim/gstk/feature_bmsk\",01000000\r", response, RESPONSE_BUF_LENGTH); QNVFW_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QNVFW_Handle.\n"); if (strstr(response, "OK")) { AT_END_Handle((char *)"AT\r"); return; } if (SimInitRetry()) { goto QNVFW_RETRY; } } void AtSimInit::QFLST_1_Handle(const char *atCommand) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(atCommand, response, RESPONSE_BUF_LENGTH); QFLST_1_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QFLST_1_Handle.\n"); if (strstr(response, "OK")) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); QGMR_Handle(); return; } else if (strstr(response, "ERROR: 417")) { UINT8 modulev05 = GetModuleV05(); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); if (modulev05 == 1) { QFLST_2_Handle("at+qfopen=\"../../usr/fota_ip_a/update_report.ur\",1\r"); } else { QFLST_2_Handle("at+qfopen=\"../../data/fota_ip_a/update_report.ur\",1\r"); } return; } else { if (GetAtCallTimes() > 10) { SetAtCallTimes(0); std::this_thread::sleep_for(std::chrono::milliseconds(100)); QFLST_2_Handle("ATI\r"); return; } std::this_thread::sleep_for(std::chrono::milliseconds(500)); if (SimInitRetry()) { goto QFLST_1_RETRY; } } } void AtSimInit::QFLST_2_Handle(const char *atCommand) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(atCommand, response, RESPONSE_BUF_LENGTH); QFLST_2_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QFLST_2_Handle.\n"); if (strstr(response, "OK")) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); QGMR_Handle(); return; } else { std::this_thread::sleep_for(std::chrono::milliseconds(100)); ATI_Handle(); return; } if (SimInitRetry()) { goto QFLST_2_RETRY; } } const char *AT_QURCCFG = "AT+QURCCFG=\"urcport\",\"usbat\"\r"; void AtSimInit::QURCCFG_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; std::shared_ptr task = std::make_shared(AT_QURCCFG, response, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QSIMSTAT_Handle. response=%s\n", response); // TODO: ?? QCFG_1_Handle(); } const char *AT_QCFG = "AT+QCFG=\"risignaltype\",\"physical\"\r"; void AtSimInit::QCFG_1_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QCFG, response, RESPONSE_BUF_LENGTH); QCFG_1_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QCFG_1_Handle. response=%s\n", response); if (strstr(response, "OK")) { QCFG_2_Handle(); return; } if (SimInitRetry()) { goto QCFG_1_RETRY; } } const char *AT_QCFG_2 = "AT+QCFG=\"urc/ri/other\",\"off\"\r"; void AtSimInit::QCFG_2_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QCFG_2, response, RESPONSE_BUF_LENGTH); QCFG_2_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QCFG_2_Handle. response=%s\n", response); if (strstr(response, "OK")) { QLWCFG_1_Handle(); return; } if (SimInitRetry()) { goto QCFG_2_RETRY; } } const char *AT_QLWCFG = "AT+QLWCFG=\"urc\",0\r"; void AtSimInit::QLWCFG_1_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QLWCFG, response, RESPONSE_BUF_LENGTH); QLWCFG_1_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QLWCFG_1_Handle. response=%s\n", response); if (strstr(response, "OK")) { QLWCFG_2_Handle(); return; } if (SimInitRetry()) { goto QLWCFG_1_RETRY; } } const char *AT_QLWCFG_2 = "AT+QLWCFG=\"startup\",0\r"; void AtSimInit::QLWCFG_2_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QLWCFG_2, response, RESPONSE_BUF_LENGTH); QLWCFG_2_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QLWCFG_2_Handle. response=%s\n", response); if (strstr(response, "OK")) { CPIN_Handle(); return; } if (SimInitRetry()) { goto QLWCFG_2_RETRY; } } const char *AT_CPIN = "AT+CPIN?\r"; void AtSimInit::CPIN_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_CPIN, response, RESPONSE_BUF_LENGTH); CPIN_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("CPIN_Handle. response=%s\n", response); if (strstr(response, "READY")) { QCCID_Handle(); return; } if (SimInitRetry()) { goto CPIN_RETRY; } } const char *AT_QCCID = "AT+QCCID\r"; void AtSimInit::QCCID_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_QCCID, response, RESPONSE_BUF_LENGTH); QCCID_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("QCCID_Handle. response=%s\n", response); SF_CHAR *pStr = nullptr; SF_CHAR tempICCID[ICCID_BUF_LENGTH] = {0}; if ((strstr(response, "+QCCID: ") != nullptr)) { pStr = strstr(response, "+QCCID: "); memcpy(tempICCID, pStr + 8, 20); if ((tempICCID[19] <= '9') && (tempICCID[19] >= '0')) tempICCID[20] = '\0'; else tempICCID[19] = '\0'; if (strncmp(lastICCID, tempICCID, 21) == 0) { LogInfo("ICCID=%s\n", tempICCID); AtGetICCID(tempICCID); CIMI_Handle(); return; } else { strcpy(lastICCID, tempICCID); memset(tempICCID, '\0', sizeof(tempICCID)); goto QCCID_RETRY; } } if (SimInitRetry()) { goto QCCID_RETRY; } } const char *AT_CIMI = "AT+CIMI\r"; void AtSimInit::CIMI_Handle(void) { char response[RESPONSE_BUF_LENGTH] = {0}; SetAtCallTimes(0); std::shared_ptr task = std::make_shared(AT_CIMI, response, RESPONSE_BUF_LENGTH); CIMI_RETRY: memset(response, 0, RESPONSE_BUF_LENGTH); SendAtCommandTask(task); LogInfo("CIMI_Handle. response=%s\n", response); SF_CHAR operationCode[OPERATION_CODE_LENGTH] = {0}; SF_CHAR *pTemp = nullptr; SIM_INFO_S simInfo = {0}; pTemp = strstr(response, "AT+CIMI"); constexpr int SF_TTYUSB_RECV_MAX = 580; SF_CHAR ttyData[SF_TTYUSB_RECV_MAX] = {0}; if (pTemp) { memcpy(operationCode, pTemp + 10, 5); LogInfo("operationCode:%s\n", operationCode); sprintf(simInfo.OperatorCode, "%s", operationCode); sf_auto_operation_adaptation(simInfo.OperatorCode, &simInfo); LogInfo("ApnGPRS:%s\n", simInfo.ApnGPRS); if ((strstr(simInfo.ApnGPRS, APNGPRS_WUYUAN2)) || (strstr(simInfo.ApnGPRS, APNGPRS_WUYUAN))) // 20408 sifar kpn sim { AtGetSimType(SF_SIM_MEGA); // 1. mega sim,set pdp 1 apn eg91_module_Polling_Comparison_CIMI(operationCode); // mega sim,recorde sim operation code sprintf(ttyData, "AT+CGDCONT=1,\"IPV4V6\",\"%s\"\r", simInfo.ApnGPRS); AT_END_Handle(ttyData); return; } else if (strstr(simInfo.ApnGPRS, APNGPRSTEMP)) { AtGetSimType(SF_SIM_MEGA_IOT); AT_END_Handle((char *)"AT+CGDCONT=1,\"IPV4V6\",\"\"\r"); return; } else { // AtSimInitResult(SimInitResult::SIM_INIT_NOT_SUPPORT_MOBILE_NETWORK); AtSimInitResult(SimInitResult::SIM_INIT_OK); return; } } std::this_thread::sleep_for(std::chrono::milliseconds(500)); if (SimInitRetry()) { goto CIMI_RETRY; } } void AtSimInit::CGDCONT_Handle(void) { // LogInfo("CGDCONT_Handle. buf=%s\n", buf); } SINT32 AtSimInit::eg91_parse_module_version(SF_CHAR *pTemp, SF_CHAR *version) { SF_CHAR *pT1 = nullptr; SF_CHAR *pT2 = nullptr; SF_CHAR *pT3 = nullptr; SF_CHAR *pT4 = nullptr; pT1 = strstr(pTemp, "FAR"); pT2 = strstr(pTemp, "_"); pT3 = strstr(pTemp, "GAR"); pT4 = strstr(pTemp, "OCPU"); LogInfo("pTemp = %s\n", pTemp); LogInfo("pT1 = %s\n", pT1); LogInfo("pT2 = %s\n", pT2); LogInfo("pT3 = %s\n", pT3); if (pT1 != nullptr) eg91_parse_module_version_detail(pTemp, pT1, pT2, pT4, version); else if (pT3 != nullptr) eg91_parse_module_version_detail(pTemp, pT3, pT2, pT4, version); LogInfo("version:%s\n", version); return SF_SUCCESS; } void AtSimInit::eg91_parse_module_version_detail(SF_CHAR *pTemp, SF_CHAR *pT1, SF_CHAR *pT2, SF_CHAR *pT4, SF_CHAR *version) { // FILE_HEADER *sim_info_t = sf_statistics_param_get(); const char *moduleVersion = GetModuleVersionParam(); SF_CHAR str0[5] = {0}; SF_CHAR str1[5] = {0}; SF_CHAR str2[5] = {0}; SF_CHAR str3[5] = {0}; SF_CHAR str4[256] = {0}; SF_CHAR str5[256] = {0}; SF_CHAR *pT5 = nullptr; memcpy(str1, pTemp + 4, pT1 - pTemp - 4); // printf("str1 = %s\n", str1); memcpy(str2, pT1 + 3, 2); // printf("str2 = %s\n", str2); memcpy(str3, pT1 + 6, 2); // printf("str3 = %s\n", str3); if (strstr(moduleVersion, GPRS_MODULE_TYPE_EG91)) { sprintf(str0, "%s", "91"); } else if (strstr(moduleVersion, GPRS_MODULE_TYPE_EG95)) { sprintf(str0, "%s", "95"); } else { sprintf(str0, "%s", "UN"); } if (pT2 != nullptr) { strcpy(str4, pT2 + 1); // printf("str4 = %s\n", str4); pT5 = strtok(str4, "\r\n"); if (pT5 != nullptr) { strcpy(str5, pT5); // printf("str5 = %s\n",str5); if (pT4 != nullptr) sprintf(version, "S%sY%sY%sY%sY%sOS", str0, str1, str2, str3, str5); else sprintf(version, "S%sY%sY%sY%sY%sS", str0, str1, str2, str3, str5); } else { if (pT4 != nullptr) sprintf(version, "S%sY%sY%sY%sOS", str0, str1, str2, str3); else sprintf(version, "S%sY%sY%sY%sS", str0, str1, str2, str3); } } else { if (pT4 != nullptr) sprintf(version, "S%sY%sY%sY%sOS", str0, str1, str2, str3); else sprintf(version, "S%sY%sY%sY%sS", str0, str1, str2, str3); } LogInfo("module_QGver = %s\n", version); return; }