|
@@ -10,353 +10,448 @@ TCLCommand::TCLCommand(bool bSync):CBaseSerial(bSync ? 0 : FILE_FLAG_OVERLAPPED)
|
|
|
|
|
|
TCLCommand::~TCLCommand(void)
|
|
|
{
|
|
|
-
|
|
|
+ m_vtExternalCMDParams.clear();
|
|
|
+ m_vtInternalCMDParams.clear();
|
|
|
}
|
|
|
|
|
|
int TCLCommand::pares_time_value(std::string strTime)
|
|
|
{
|
|
|
- int nTimes = 0;
|
|
|
+ int nTimes = 0;
|
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
|
- if (strstr(strTime.c_str(), _T("ms")) || strstr(strTime.c_str(), _T("MS")))
|
|
|
- {
|
|
|
- nTimes = atol(strTime.c_str());
|
|
|
- }
|
|
|
- else if (strstr(strTime.c_str(), _T("s")) || strstr(strTime.c_str(), _T("S")))
|
|
|
- {
|
|
|
- nTimes = atol(strTime.c_str()) * 1000;
|
|
|
- }
|
|
|
- else if (strstr(strTime.c_str(), _T("m")) || strstr(strTime.c_str(), _T("M")))
|
|
|
- {
|
|
|
- nTimes = atol(strTime.c_str()) * 6000;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // 不带单位或其他的,默认ms;
|
|
|
- nTimes = atol(strTime.c_str());
|
|
|
- }
|
|
|
+ if (strstr(strTime.c_str(), _T("ms")) || strstr(strTime.c_str(), _T("MS")))
|
|
|
+ {
|
|
|
+ nTimes = atol(strTime.c_str());
|
|
|
+ }
|
|
|
+ else if (strstr(strTime.c_str(), _T("s")) || strstr(strTime.c_str(), _T("S")))
|
|
|
+ {
|
|
|
+ nTimes = atol(strTime.c_str()) * 1000;
|
|
|
+ }
|
|
|
+ else if (strstr(strTime.c_str(), _T("m")) || strstr(strTime.c_str(), _T("M")))
|
|
|
+ {
|
|
|
+ nTimes = atol(strTime.c_str()) * 6000;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 不带单位或其他的,默认ms;
|
|
|
+ nTimes = atol(strTime.c_str());
|
|
|
+ }
|
|
|
#elif _MSC_VER >= 1500
|
|
|
- if (_tcsstr(strTime.c_str(), _T("ms")) || _tcsstr(strTime.c_str(), _T("MS")))
|
|
|
- {
|
|
|
- nTimes = _tstol(strTime.c_str());
|
|
|
- }
|
|
|
- else if (_tcsstr(strTime.c_str(), _T("s")) || _tcsstr(strTime.c_str(), _T("S")))
|
|
|
- {
|
|
|
- nTimes = _tstol(strTime.c_str()) * 1000;
|
|
|
- }
|
|
|
- else if (_tcsstr(strTime.c_str(), _T("m")) || _tcsstr(strTime.c_str(), _T("M")))
|
|
|
- {
|
|
|
- nTimes = _tstol(strTime.c_str()) * 6000;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // 不带单位或其他的,默认ms;
|
|
|
- nTimes = _tstol(strTime.c_str());
|
|
|
- }
|
|
|
+ if (_tcsstr(strTime.c_str(), _T("ms")) || _tcsstr(strTime.c_str(), _T("MS")))
|
|
|
+ {
|
|
|
+ nTimes = _tstol(strTime.c_str());
|
|
|
+ }
|
|
|
+ else if (_tcsstr(strTime.c_str(), _T("s")) || _tcsstr(strTime.c_str(), _T("S")))
|
|
|
+ {
|
|
|
+ nTimes = _tstol(strTime.c_str()) * 1000;
|
|
|
+ }
|
|
|
+ else if (_tcsstr(strTime.c_str(), _T("m")) || _tcsstr(strTime.c_str(), _T("M")))
|
|
|
+ {
|
|
|
+ nTimes = _tstol(strTime.c_str()) * 6000;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 不带单位或其他的,默认ms;
|
|
|
+ nTimes = _tstol(strTime.c_str());
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
- return nTimes;
|
|
|
+ return nTimes;
|
|
|
}
|
|
|
|
|
|
bool TCLCommand::parse_pair_key(std::string& RetValue, std::string strLine, TCHAR* lpszText)
|
|
|
{
|
|
|
- TCHAR szText[MAX_PATH] = { 0 };
|
|
|
- TCHAR szValue[MAX_PATH] = { 0 };
|
|
|
- // 去除空格;
|
|
|
+ TCHAR szText[MAX_PATH] = { 0 };
|
|
|
+ TCHAR szValue[MAX_PATH] = { 0 };
|
|
|
+ // 去除空格;
|
|
|
#if _MSC_VER > 1900
|
|
|
- strLine.erase(std::remove_if(strLine.begin(), strLine.end(), [](unsigned char x) {return std::isspace(x); }), strLine.end()); //C++17
|
|
|
+ strLine.erase(std::remove_if(strLine.begin(), strLine.end(), [](unsigned char x) {return std::isspace(x); }), strLine.end()); //C++17
|
|
|
#else
|
|
|
- for (std::string::iterator it = strLine.begin(); it != strLine.end();) {
|
|
|
- !isspace(*it) ? it++ : it = it = strLine.erase(it);
|
|
|
- }
|
|
|
+ for (std::string::iterator it = strLine.begin(); it != strLine.end();) {
|
|
|
+ !isspace(*it) ? it++ : it = it = strLine.erase(it);
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500 // VC6.0~8.0
|
|
|
- if (2 == sscanf(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH))
|
|
|
+ if (2 == sscanf(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH))
|
|
|
#else
|
|
|
- if (2 == _stscanf_s(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH))
|
|
|
+ if (2 == _stscanf_s(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH))
|
|
|
#endif
|
|
|
- {
|
|
|
- if (_tcsstr(szText, lpszText)) {
|
|
|
- RetValue = szValue;
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
+ {
|
|
|
+ if (_tcsstr(szText, lpszText)) {
|
|
|
+ RetValue = szValue;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
-int TCLCommand::parse_cmd_param_from_file(TCHAR* file_name, std::vector<CommandParam>& vtCommandParams)
|
|
|
+int TCLCommand::parse_cmds_from_file(TCHAR* file_name, std::vector<CommandParam>& vtCommandParams)
|
|
|
{
|
|
|
- TCHAR buf[MAX_PATH] = { 0 };
|
|
|
- TCHAR name[MAX_PATH] = { 0 };
|
|
|
- TCHAR option[MAX_PATH] = { 0 };
|
|
|
- TCHAR head[MAX_PATH] = { 0 };
|
|
|
- TCHAR code[MAX_PATH] = { 0 };
|
|
|
- TCHAR param[MAX_PATH] = { 0 };
|
|
|
- TCHAR multicode[MAX_PATH] = { 0 };
|
|
|
- TCHAR cmd_wait_time[MAX_PATH] = { 0 };
|
|
|
- TCHAR read_wait_time[MAX_PATH] = { 0 };
|
|
|
-
|
|
|
- int ret = -1;
|
|
|
- FILE* fp = NULL;
|
|
|
-
|
|
|
- if (!file_name || file_name[0] == '\0')
|
|
|
- return ret;
|
|
|
-
|
|
|
- fp = fopen(file_name, "r");
|
|
|
- if (!fp)
|
|
|
- goto EXIT;
|
|
|
-
|
|
|
- while ((fgets((char*)buf, MAX_PATH, fp) != NULL)) {
|
|
|
- int tmp_len = 0;
|
|
|
- unsigned short keycode = 0;
|
|
|
- unsigned int protocol = 0;
|
|
|
- unsigned int scancode = 0;
|
|
|
-
|
|
|
- tmp_len = _tcslen(buf);
|
|
|
- if (tmp_len >= 1) {
|
|
|
- if (buf[tmp_len - 1] == '\r' || buf[tmp_len - 1] == '\n')
|
|
|
- buf[tmp_len - 1] = 0;
|
|
|
- if (tmp_len >= 2) {
|
|
|
- if (buf[tmp_len - 2] == '\r' || buf[tmp_len - 2] == '\n')
|
|
|
- buf[tmp_len - 2] = 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ TCHAR buf[MAX_PATH] = { 0 };
|
|
|
+ TCHAR name[MAX_PATH] = { 0 };
|
|
|
+ TCHAR option[MAX_PATH] = { 0 };
|
|
|
+ TCHAR head[MAX_PATH] = { 0 };
|
|
|
+ TCHAR code[MAX_PATH] = { 0 };
|
|
|
+ TCHAR param[MAX_PATH] = { 0 };
|
|
|
+ TCHAR multicode[MAX_PATH] = { 0 };
|
|
|
+ TCHAR cmd_wait_time[MAX_PATH] = { 0 };
|
|
|
+ TCHAR read_wait_time[MAX_PATH] = { 0 };
|
|
|
+
|
|
|
+ int ret = -1;
|
|
|
+ FILE* fp = NULL;
|
|
|
+
|
|
|
+ if (!file_name || file_name[0] == '\0')
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ fp = fopen(file_name, "r");
|
|
|
+ if (!fp)
|
|
|
+ goto EXIT;
|
|
|
+
|
|
|
+ while ((fgets((char*)buf, MAX_PATH, fp) != NULL)) {
|
|
|
+ int tmp_len = 0;
|
|
|
+ tmp_len = _tcslen(buf);
|
|
|
+ if (tmp_len >= 1) {
|
|
|
+ if (buf[tmp_len - 1] == '\r' || buf[tmp_len - 1] == '\n')
|
|
|
+ buf[tmp_len - 1] = 0;
|
|
|
+ if (tmp_len >= 2) {
|
|
|
+ if (buf[tmp_len - 2] == '\r' || buf[tmp_len - 2] == '\n')
|
|
|
+ buf[tmp_len - 2] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500 // VC6.0~8.0
|
|
|
- if (sscanf(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, option, head, code, param, multicode, read_wait_time, cmd_wait_time) == 8)
|
|
|
+ if (sscanf(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, option, head, code, param, multicode, read_wait_time, cmd_wait_time) == 8)
|
|
|
#elif _MSC_VER >= 1500
|
|
|
- //if ( _stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8) // 等价下面;
|
|
|
- if (_stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%s", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8)
|
|
|
+ //if ( _stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8) // 等价下面;
|
|
|
+ if (_stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%s", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8)
|
|
|
#endif
|
|
|
- {
|
|
|
- CommandParam cp;
|
|
|
- parse_pair_key(cp.name, name, _T("Name"));
|
|
|
- parse_pair_key(cp.head, head, _T("HeadCode"));
|
|
|
- parse_pair_key(cp.code, code, _T("Command"));
|
|
|
- parse_pair_key(cp.param, param, _T("CMDParam"));
|
|
|
-
|
|
|
- std::string value;
|
|
|
- parse_pair_key(value, option, _T("Option"));
|
|
|
- if (!_tcsicmp(value.c_str(), _T("None")))
|
|
|
- cp.nOption = CMDOPT_None;
|
|
|
- else if (!_tcsicmp(value.c_str(), _T("Get")))
|
|
|
- cp.nOption = CMDOPT_Get;
|
|
|
- else if (!_tcsicmp(value.c_str(), _T("Set")))
|
|
|
- cp.nOption = CMDOPT_Set;
|
|
|
-
|
|
|
- parse_pair_key(value, multicode, _T("MultiParams"));
|
|
|
- cp.bMulticode = !_tcsicmp(value.c_str(), _T("true")) ? true : false;
|
|
|
-
|
|
|
- parse_pair_key(value, read_wait_time, _T("ReadWaitTime"));
|
|
|
- cp.read_wait_time = pares_time_value(value.c_str());
|
|
|
-
|
|
|
- parse_pair_key(value, cmd_wait_time, _T("CMDWaitTime"));
|
|
|
- cp.cmd_wait_time = pares_time_value(value.c_str());
|
|
|
- cp.UpdateRtnCode();
|
|
|
-
|
|
|
- vtCommandParams.push_back(cp);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ret = 0;
|
|
|
+ {
|
|
|
+ CommandParam cp;
|
|
|
+ parse_pair_key(cp.name, name, _T("Name"));
|
|
|
+ parse_pair_key(cp.head, head, _T("HeadCode"));
|
|
|
+ parse_pair_key(cp.code, code, _T("Command"));
|
|
|
+ parse_pair_key(cp.param, param, _T("CMDParam"));
|
|
|
+
|
|
|
+ std::string value;
|
|
|
+ parse_pair_key(value, option, _T("Option"));
|
|
|
+ if (!_tcsicmp(value.c_str(), _T("None")))
|
|
|
+ cp.nOption = CMDOPT_None;
|
|
|
+ else if (!_tcsicmp(value.c_str(), _T("Get")))
|
|
|
+ cp.nOption = CMDOPT_Get;
|
|
|
+ else if (!_tcsicmp(value.c_str(), _T("Set")))
|
|
|
+ cp.nOption = CMDOPT_Set;
|
|
|
+
|
|
|
+ parse_pair_key(value, multicode, _T("MultiParams"));
|
|
|
+ cp.bMulticode = !_tcsicmp(value.c_str(), _T("true")) ? true : false;
|
|
|
+
|
|
|
+ parse_pair_key(value, read_wait_time, _T("ReadWaitTime"));
|
|
|
+ cp.read_wait_time = pares_time_value(value.c_str());
|
|
|
+
|
|
|
+ parse_pair_key(value, cmd_wait_time, _T("CMDWaitTime"));
|
|
|
+ cp.cmd_wait_time = pares_time_value(value.c_str());
|
|
|
+ cp.UpdateRtnCode();
|
|
|
+
|
|
|
+ vtCommandParams.push_back(cp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = 0;
|
|
|
EXIT:
|
|
|
- if (fp)
|
|
|
- fclose(fp);
|
|
|
- return ret;
|
|
|
+ if (fp)
|
|
|
+ fclose(fp);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void TCLCommand::parse_cmds_from_string(std::string str, std::vector<CommandParam>& vtCommandParams)
|
|
|
+{
|
|
|
+ int nPos(0);
|
|
|
+ TCHAR buf[MAX_PATH] = { 0 };
|
|
|
+ TCHAR name[MAX_PATH] = { 0 };
|
|
|
+ TCHAR option[MAX_PATH] = { 0 };
|
|
|
+ TCHAR head[MAX_PATH] = { 0 };
|
|
|
+ TCHAR code[MAX_PATH] = { 0 };
|
|
|
+ TCHAR param[MAX_PATH] = { 0 };
|
|
|
+ TCHAR multicode[MAX_PATH] = { 0 };
|
|
|
+ TCHAR cmd_wait_time[MAX_PATH] = { 0 };
|
|
|
+ TCHAR read_wait_time[MAX_PATH] = { 0 };
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ memset(buf, 0, MAX_PATH);
|
|
|
+ int nPos1 = str.find_first_of('\r');
|
|
|
+ int nPos2 = str.find_first_of('\n');
|
|
|
+ if ( std::string::npos != nPos1 && std::string::npos != nPos2 ) {
|
|
|
+ nPos = nPos1 > nPos2 ? nPos1 : nPos2;
|
|
|
+ _stprintf_s(buf, _T("%s"), str.substr(0, nPos - 1).c_str());
|
|
|
+ str = str.substr(nPos+1);
|
|
|
+ }
|
|
|
+ else if ( std::string::npos != nPos1 ) {
|
|
|
+ _stprintf_s(buf, _T("%s"), str.substr(0, nPos1 - 1).c_str());
|
|
|
+ str = str.substr(nPos + 1);
|
|
|
+ }
|
|
|
+ else if ( std::string::npos != nPos2 ) {
|
|
|
+ _stprintf_s(buf, _T("%s"), str.substr(0, nPos2 - 1).c_str());
|
|
|
+ str = str.substr(nPos + 1);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ _stprintf_s(buf, _T("%s"), str.c_str());
|
|
|
+ str.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+#if _MSC_VER >= 1200 && _MSC_VER < 1500 // VC6.0~8.0
|
|
|
+ if (sscanf(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, option, head, code, param, multicode, read_wait_time, cmd_wait_time) == 8)
|
|
|
+#elif _MSC_VER >= 1500
|
|
|
+ //if ( _stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8) // 等价下面;
|
|
|
+ if (_stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%s", name, MAX_PATH, option, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 8)
|
|
|
+#endif
|
|
|
+ {
|
|
|
+ CommandParam cp;
|
|
|
+ parse_pair_key(cp.name, name, _T("Name"));
|
|
|
+ parse_pair_key(cp.head, head, _T("HeadCode"));
|
|
|
+ parse_pair_key(cp.code, code, _T("Command"));
|
|
|
+ parse_pair_key(cp.param, param, _T("CMDParam"));
|
|
|
+
|
|
|
+ std::string value;
|
|
|
+ parse_pair_key(value, option, _T("Option"));
|
|
|
+ if (!_tcsicmp(value.c_str(), _T("None")))
|
|
|
+ cp.nOption = CMDOPT_None;
|
|
|
+ else if (!_tcsicmp(value.c_str(), _T("Get")))
|
|
|
+ cp.nOption = CMDOPT_Get;
|
|
|
+ else if (!_tcsicmp(value.c_str(), _T("Set")))
|
|
|
+ cp.nOption = CMDOPT_Set;
|
|
|
+
|
|
|
+ parse_pair_key(value, multicode, _T("MultiParams"));
|
|
|
+ cp.bMulticode = !_tcsicmp(value.c_str(), _T("true")) ? true : false;
|
|
|
+
|
|
|
+ parse_pair_key(value, read_wait_time, _T("ReadWaitTime"));
|
|
|
+ cp.read_wait_time = pares_time_value(value.c_str());
|
|
|
+
|
|
|
+ parse_pair_key(value, cmd_wait_time, _T("CMDWaitTime"));
|
|
|
+ cp.cmd_wait_time = pares_time_value(value.c_str());
|
|
|
+ cp.UpdateRtnCode();
|
|
|
+
|
|
|
+ vtCommandParams.push_back(cp);
|
|
|
+ }
|
|
|
+ } while (str.size());
|
|
|
}
|
|
|
|
|
|
-int TCLCommand::parse_cmd_from_string(std::string str, std::vector<CommandParam>& vtCommandParams)
|
|
|
+bool TCLCommand::GetCommandParams(std::string name, CommandParam& cmdPara)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ bool bget = false;
|
|
|
+ // 外部优先;
|
|
|
+ for (std::vector<CommandParam>::iterator it = m_vtExternalCMDParams.begin(); it != m_vtExternalCMDParams.end(); it++ )
|
|
|
+ {
|
|
|
+ if ( !_tcsicmp(name.c_str(), it->name.c_str()) ) {
|
|
|
+ bget = true;
|
|
|
+ cmdPara = *it;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( !bget )
|
|
|
+ {
|
|
|
+ for (std::vector<CommandParam>::iterator it = m_vtInternalCMDParams.begin(); it != m_vtInternalCMDParams.end(); it++ )
|
|
|
+ {
|
|
|
+ if ( !_tcsicmp(name.c_str(), it->name.c_str()) ) {
|
|
|
+ bget = true;
|
|
|
+ cmdPara = *it;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清除状态;
|
|
|
+ cmdPara.Clean();
|
|
|
+
|
|
|
+ return bget;
|
|
|
}
|
|
|
|
|
|
bool TCLCommand::TheFirstPart(CommandParam& cmdPara, std::string data)
|
|
|
{
|
|
|
- if (data.size() == NoneOptLen) {
|
|
|
- if ((byte)data[0] == cmdPara._rtnCode) {
|
|
|
- // 长度;
|
|
|
- int nPacketLen = (byte)data[1];
|
|
|
- if (nPacketLen != NoneOptLen) {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误:%ld", __FUNCTION__, (byte)data[1]);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 执行状态;
|
|
|
- cmdPara._rtnStatus = (byte)data[2];
|
|
|
- //utils::_dprintf(_T("[%s] rtnStatus=%02X"), __FUNCTION__, cmdPara._rtnStatus);
|
|
|
-
|
|
|
- // 校验crc;
|
|
|
- unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
|
|
|
- if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1]) {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误", __FUNCTION__);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ if (data.size() == NoneOptLen) {
|
|
|
+ if ((byte)data[0] == cmdPara._rtnCode) {
|
|
|
+ // 长度;
|
|
|
+ int nPacketLen = (byte)data[1];
|
|
|
+ if (nPacketLen != NoneOptLen) {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误:%ld", __FUNCTION__, (byte)data[1]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 执行状态;
|
|
|
+ cmdPara._rtnStatus = (byte)data[2];
|
|
|
+ //utils::_dprintf(_T("[%s] rtnStatus=%02X"), __FUNCTION__, cmdPara._rtnStatus);
|
|
|
+
|
|
|
+ // 校验crc;
|
|
|
+ unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
|
|
|
+ if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1]) {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误", __FUNCTION__);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
|
|
|
{
|
|
|
- // 数据起始位;
|
|
|
- int nDataPos = 0;
|
|
|
- // 数据包长度;
|
|
|
- int nPacketLen = 0;
|
|
|
- if ((byte)data[0] == cmdPara._rtnCode) {
|
|
|
- // 获取长度;
|
|
|
- if ((byte)data[1] == 0xFE) {
|
|
|
- nDataPos = 4;
|
|
|
- nPacketLen = (byte)data[2] << 8 | (byte)data[3];
|
|
|
- if (data.size() < 255 && data[2] != 0) {
|
|
|
- cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- nDataPos = 2;
|
|
|
- nPacketLen = (byte)data[1];
|
|
|
+ // 数据起始位;
|
|
|
+ int nDataPos = 0;
|
|
|
+ // 数据包长度;
|
|
|
+ int nPacketLen = 0;
|
|
|
+ if ((byte)data[0] == cmdPara._rtnCode) {
|
|
|
+ // 获取长度;
|
|
|
+ if ((byte)data[1] == 0xFE) {
|
|
|
+ nDataPos = 4;
|
|
|
+ nPacketLen = (byte)data[2] << 8 | (byte)data[3];
|
|
|
+ if (data.size() < 255 && data[2] != 0) {
|
|
|
+ cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ nDataPos = 2;
|
|
|
+ nPacketLen = (byte)data[1];
|
|
|
#if 0 // 如果数据包含有非协议包内的数据,会判断异常;
|
|
|
- if (data.size() > 255) {
|
|
|
- //nPackageLen = data[1] << 8 | data[2];
|
|
|
- cmdPara._rtnError = _dprintf(_T("长度异常"));
|
|
|
- return false;
|
|
|
- }
|
|
|
+ if (data.size() > 255) {
|
|
|
+ //nPackageLen = data[1] << 8 | data[2];
|
|
|
+ cmdPara._rtnError = _dprintf(_T("长度异常"));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
#endif
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
#if 0
|
|
|
- // 计算出的长度,必等于包长;// 如果包含有其他非包数据,会判断异常;
|
|
|
- if (nPackageLen != data.size())
|
|
|
- return false;
|
|
|
+ // 计算出的长度,必等于包长;// 如果包含有其他非包数据,会判断异常;
|
|
|
+ if (nPackageLen != data.size())
|
|
|
+ return false;
|
|
|
#endif
|
|
|
|
|
|
- if (_tcsicmp(cmdPara.code.c_str(), utils::ByteToChars((byte)data[nDataPos] - 1).c_str()) != 0) {
|
|
|
- cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令错误, %s, %02X"), __FUNCTION__, cmdPara.head.c_str(), (byte)data[nDataPos]);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // 返回的数据;
|
|
|
- ++nDataPos;// 返回码占一字节;
|
|
|
- if (cmdPara.bMulticode) {
|
|
|
- if (_tcsicmp(cmdPara.param.c_str(), utils::ByteToChars((byte)data[nDataPos]).c_str()) != 0) {
|
|
|
- cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令参数错误, %s, %02X"), __FUNCTION__, cmdPara.param.c_str(), (byte)data[nDataPos]);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- ++nDataPos;// 指令参数码占一字节;
|
|
|
- }
|
|
|
-
|
|
|
- cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
|
|
|
- utils::_dprintf(_T("rtnData=%s"), utils::BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
|
|
|
-
|
|
|
- // 校验crc;
|
|
|
- unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
|
|
|
- if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
|
|
|
- {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (data.size() > nPacketLen)
|
|
|
- utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
|
|
|
- }
|
|
|
- else {
|
|
|
- cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ if (_tcsicmp(cmdPara.code.c_str(), utils::ByteToChars((byte)data[nDataPos] - 1).c_str()) != 0) {
|
|
|
+ cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令错误, %s, %02X"), __FUNCTION__, cmdPara.head.c_str(), (byte)data[nDataPos]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回的数据;
|
|
|
+ ++nDataPos;// 返回码占一字节;
|
|
|
+ if (cmdPara.bMulticode) {
|
|
|
+ if (_tcsicmp(cmdPara.param.c_str(), utils::ByteToChars((byte)data[nDataPos]).c_str()) != 0) {
|
|
|
+ cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令参数错误, %s, %02X"), __FUNCTION__, cmdPara.param.c_str(), (byte)data[nDataPos]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ ++nDataPos;// 指令参数码占一字节;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
|
|
|
+ utils::_dprintf(_T("rtnData=%s"), utils::BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
|
|
|
+
|
|
|
+ // 校验crc;
|
|
|
+ unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
|
|
|
+ if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
|
|
|
+ {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data.size() > nPacketLen)
|
|
|
+ utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
std::string TCLCommand::PackingCommand(CommandParam& cmdPara, std::string data, const int& dataLen)
|
|
|
{
|
|
|
- // Tag:[命令头][全命令长度][命令码]<命令码参数><附加数据>[crc1][crc2]
|
|
|
- std::string command;
|
|
|
- // 命令头标识位;
|
|
|
- command.append(utils::HexStringToBytes(cmdPara.head, 2).c_str(), cmdPara.head.size() / 2);
|
|
|
- // 命令码;
|
|
|
- command.append(utils::HexStringToBytes(cmdPara.code, 2).c_str(), cmdPara.code.size() / 2);
|
|
|
- // 命令码参数;
|
|
|
- command.append(utils::HexStringToBytes(cmdPara.param, 2).c_str(), cmdPara.param.size() / 2);
|
|
|
- // 附加的数据;
|
|
|
- if (dataLen > 0)
|
|
|
- command.append(data.c_str(), dataLen);
|
|
|
-
|
|
|
- int len(0);
|
|
|
- // 长度:可能1字节表示,超过255用2字节表示;
|
|
|
- byte szlen[2] = { 0 };
|
|
|
- //if ((byte)command[1] == 0xFE)
|
|
|
- //if ( cmdPara.head.size() >= 4 && cmdPara.head.find("FE", 2, 2) != std::string::npos )
|
|
|
- if (_tcsicmp(_T("AAFE"), cmdPara.head.c_str()) == 0)
|
|
|
- {// 长度超过255,需要2字节表示;
|
|
|
- len = command.size() + 4; // 2位crc + 2位长度;
|
|
|
- szlen[0] = (len >> 8) & 0xFF;
|
|
|
- szlen[1] = len & 0xFF;
|
|
|
- command.insert(2, (char*)szlen, 2);
|
|
|
- }
|
|
|
- else {
|
|
|
- // 2位crc + 1位长度;
|
|
|
- len = command.size() + 3;
|
|
|
- //if ( _tcsicmp(cmdPara.code.c_str(), "99 00") == 0 )
|
|
|
- // len -= 2;
|
|
|
-
|
|
|
- if (len > 255) {// 长度超过255,多一个占位符;
|
|
|
- ++len;
|
|
|
- szlen[0] = (len >> 8) & 0xFF;
|
|
|
- szlen[1] = len & 0xFF;
|
|
|
- command.insert(1, (char*)szlen, 2);
|
|
|
- }
|
|
|
- else {
|
|
|
- szlen[0] = len & 0xFF;
|
|
|
- command.insert(1, (char*)szlen, 1);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // crc校验;
|
|
|
- byte szcrc[2] = { 0 };
|
|
|
- WORD usCRCValue = utils::CRC16Calculate((byte*)command.c_str(), command.size()); // 如果有0断开有危险;
|
|
|
- //WORD usCRCValue = CRC16Calculate((byte *)command.c_str(), len - 2);
|
|
|
- szcrc[0] = (usCRCValue >> 8) & 0xFF;
|
|
|
- szcrc[1] = usCRCValue & 0xFF;
|
|
|
- command.append((char*)szcrc, 2);
|
|
|
-
|
|
|
- cmdPara._cmdContext = utils::BytesToHexString((byte*)command.c_str(), command.size(), ' ');
|
|
|
- utils::_dprintf(_T("指令:%s"), cmdPara._cmdContext.c_str());
|
|
|
-
|
|
|
- return command;
|
|
|
+ // Tag:[命令头][全命令长度][命令码]<命令码参数><附加数据>[crc1][crc2]
|
|
|
+ std::string command;
|
|
|
+ // 命令头标识位;
|
|
|
+ command.append(utils::HexStringToBytes(cmdPara.head, 2).c_str(), cmdPara.head.size() / 2);
|
|
|
+ // 命令码;
|
|
|
+ command.append(utils::HexStringToBytes(cmdPara.code, 2).c_str(), cmdPara.code.size() / 2);
|
|
|
+ // 命令码参数;
|
|
|
+ command.append(utils::HexStringToBytes(cmdPara.param, 2).c_str(), cmdPara.param.size() / 2);
|
|
|
+ // 附加的数据;
|
|
|
+ if (dataLen > 0)
|
|
|
+ command.append(data.c_str(), dataLen);
|
|
|
+
|
|
|
+ int len(0);
|
|
|
+ // 长度:可能1字节表示,超过255用2字节表示;
|
|
|
+ byte szlen[2] = { 0 };
|
|
|
+ //if ((byte)command[1] == 0xFE)
|
|
|
+ //if ( cmdPara.head.size() >= 4 && cmdPara.head.find("FE", 2, 2) != std::string::npos )
|
|
|
+ if (_tcsicmp(_T("AAFE"), cmdPara.head.c_str()) == 0)
|
|
|
+ {// 长度超过255,需要2字节表示;
|
|
|
+ len = command.size() + 4; // 2位crc + 2位长度;
|
|
|
+ szlen[0] = (len >> 8) & 0xFF;
|
|
|
+ szlen[1] = len & 0xFF;
|
|
|
+ command.insert(2, (char*)szlen, 2);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 2位crc + 1位长度;
|
|
|
+ len = command.size() + 3;
|
|
|
+ //if ( _tcsicmp(cmdPara.code.c_str(), "99 00") == 0 )
|
|
|
+ // len -= 2;
|
|
|
+
|
|
|
+ if (len > 255) {// 长度超过255,多一个占位符;
|
|
|
+ ++len;
|
|
|
+ szlen[0] = (len >> 8) & 0xFF;
|
|
|
+ szlen[1] = len & 0xFF;
|
|
|
+ command.insert(1, (char*)szlen, 2);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ szlen[0] = len & 0xFF;
|
|
|
+ command.insert(1, (char*)szlen, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // crc校验;
|
|
|
+ byte szcrc[2] = { 0 };
|
|
|
+ WORD usCRCValue = utils::CRC16Calculate((byte*)command.c_str(), command.size()); // 如果有0断开有危险;
|
|
|
+ //WORD usCRCValue = CRC16Calculate((byte *)command.c_str(), len - 2);
|
|
|
+ szcrc[0] = (usCRCValue >> 8) & 0xFF;
|
|
|
+ szcrc[1] = usCRCValue & 0xFF;
|
|
|
+ command.append((char*)szcrc, 2);
|
|
|
+
|
|
|
+ cmdPara._cmdContext = utils::BytesToHexString((byte*)command.c_str(), command.size(), ' ');
|
|
|
+ utils::_dprintf(_T("指令:%s = %s"), cmdPara.name.c_str(), cmdPara._cmdContext.c_str());
|
|
|
+
|
|
|
+ return command;
|
|
|
}
|
|
|
|
|
|
void TCLCommand::ParseResultString(CommandParam& cmdPara, std::string data, const int& dataLen)
|
|
|
{
|
|
|
- // Tag:[返回头][全数据长度][返回码]<返回码子项><附加数据>[crc16]
|
|
|
- if (!TheFirstPart(cmdPara, data.substr(0, 5)))
|
|
|
- return;
|
|
|
-
|
|
|
- if (cmdPara._rtnStatus != 0x0A) {
|
|
|
- utils::_dprintf("[%s] 执行结果错误:%02X", __FUNCTION__, cmdPara._rtnStatus);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- switch (cmdPara.nOption)
|
|
|
- {
|
|
|
- case CMDOPT_None:
|
|
|
- break;
|
|
|
- case CMDOPT_Get:
|
|
|
- case CMDOPT_Set:
|
|
|
- TheSecondPart(cmdPara, data.substr(5));
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+ // Tag:[返回头][全数据长度][返回码]<返回码子项><附加数据>[crc16]
|
|
|
+ if (!TheFirstPart(cmdPara, data.substr(0, 5)))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (cmdPara._rtnStatus != 0x0A) {
|
|
|
+ utils::_dprintf("[%s] 执行结果错误:%02X", __FUNCTION__, cmdPara._rtnStatus);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (cmdPara.nOption)
|
|
|
+ {
|
|
|
+ case CMDOPT_None:
|
|
|
+ break;
|
|
|
+ case CMDOPT_Get:
|
|
|
+ case CMDOPT_Set:
|
|
|
+ TheSecondPart(cmdPara, data.substr(5));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|