Pārlūkot izejas kodu

1、优化部分函数,减少代码;
2、FC字段的处理

sat23 3 gadi atpakaļ
vecāks
revīzija
0f6f1b0f9e
2 mainītis faili ar 58 papildinājumiem un 87 dzēšanām
  1. 57 87
      TCLCommand/TCLCommand/Command.cpp
  2. 1 0
      TCLCommand/TCLCommand/Command.h

+ 57 - 87
TCLCommand/TCLCommand/Command.cpp

@@ -99,19 +99,9 @@ bool TCLCommand::parse_pair_key(std::string& RetValue, std::string strLine, TCHA
 
 int TCLCommand::parse_cmds_from_file(const 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;
-
+    TCHAR buf[MAX_PATH] = { 0 };
     if (!file_name || file_name[0] == '\0')
         return ret;
 
@@ -131,40 +121,9 @@ int TCLCommand::parse_cmds_from_file(const TCHAR* file_name, std::vector<Command
             }
         }
 
-#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("head"));
-            parse_pair_key(cp.code, code, _T("cmd"));
-            parse_pair_key(cp.param, param, _T("param"));
-
-            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("returnParam"));
-            cp.returnParam = !_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();
-
+        CommandParam cp;
+        if (ParseCommandFromString(buf, cp))
             vtCommandParams.push_back(cp);
-        }
     }
 
     ret = 0;
@@ -178,14 +137,6 @@ void TCLCommand::parse_cmds_from_string(std::string str, std::vector<CommandPara
 {
     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 
     {
@@ -226,41 +177,58 @@ void TCLCommand::parse_cmds_from_string(std::string str, std::vector<CommandPara
             str = "";
         }
 
+        CommandParam cp;
+        if (ParseCommandFromString(buf, cp))
+            vtCommandParams.push_back(cp);
+    } while (str.size());
+}
+
+bool TCLCommand::ParseCommandFromString(std::string str, CommandParam &cmdParam)
+{
+    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 };
+
 #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(str.c_str(), "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", 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(str.c_str(), "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%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("head"));
-            parse_pair_key(cp.code, code, _T("cmd"));
-            parse_pair_key(cp.param, param, _T("param"));
-
-            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("returnParam"));
-            cp.returnParam = !_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();
+    {
+        parse_pair_key(cmdParam.name, name, _T("name"));
+        parse_pair_key(cmdParam.head, head, _T("head"));
+        parse_pair_key(cmdParam.code, code, _T("cmd"));
+        parse_pair_key(cmdParam.param, param, _T("param"));
+
+        std::string value;
+        parse_pair_key(value, option, _T("option"));
+        if (!_tcsicmp(value.c_str(), _T("None")))
+            cmdParam.nOption = CMDOPT_None;
+        else if (!_tcsicmp(value.c_str(), _T("Get")))
+            cmdParam.nOption = CMDOPT_Get;
+        else if (!_tcsicmp(value.c_str(), _T("Set")))
+            cmdParam.nOption = CMDOPT_Set;
+
+        parse_pair_key(value, multicode, _T("returnParam"));
+        cmdParam.returnParam = !_tcsicmp(value.c_str(), _T("true")) ? true : false;
+
+        parse_pair_key(value, read_wait_time, _T("readWaitTime"));
+        cmdParam.read_wait_time = pares_time_value(value.c_str());
+
+        parse_pair_key(value, cmd_wait_time, _T("cmdWaitTime"));
+        cmdParam.cmd_wait_time = pares_time_value(value.c_str());
+        cmdParam.UpdateRtnCode();
 
-            vtCommandParams.push_back(cp);
-        }
-    } while (str.size());
+        return true;
+    }
+
+    return false;
 }
 
 bool TCLCommand::GetCommandParams(std::string name, CommandParam& cmdPara)
@@ -512,7 +480,7 @@ bool TCLCommand::TheSecondPartForFC(CommandParam& cmdPara, std::string data)
         }
 
         // 返回的数据;
-        ++nDataPos;// 返回码占一字节;
+        ++nDataPos;// code返回码占一字节;
 #if 0 // FireTV的返回的指令参数与code没有规律对应;returnParam要外部根据协议来判断;
         if (cmdPara.returnParam) {
             // 返回的指令参数
@@ -592,8 +560,7 @@ void TCLCommand::PackingCommand(CommandParam& cmdPara, LPVOID data, const int& d
         szlen[0] = (len >> 8) & 0xFF;
         szlen[1] = len & 0xFF;
         command.insert(2, (char*)szlen, 2);
-    }
-    else {
+    } else {
         // 2位crc + 1位长度;
         len = command.size() + 3;
         //if ( _tcsicmp(cmdPara.code.c_str(), "99 00") == 0 )
@@ -649,7 +616,10 @@ bool TCLCommand::ParseResultString(CommandParam& cmdPara, std::string data, cons
         break;
     case CMDOPT_Get:
     case CMDOPT_Set:
-        return TheSecondPart(cmdPara, data.substr(5));
+        if ( _tcsicmp(cmdPara.code.c_str(), _T("FC")) )
+            return TheSecondPart(cmdPara, data.substr(5));
+        else
+            return TheSecondPartForFC(cmdPara, data.substr(5));
         break;
     default:
         break;

+ 1 - 0
TCLCommand/TCLCommand/Command.h

@@ -18,6 +18,7 @@ private:
     bool parse_pair_key(std::string& RetValue, std::string strLine, TCHAR* lpszText);
     int parse_cmds_from_file(const TCHAR* file_name, std::vector<CommandParam>& vtCommandParams);
     void parse_cmds_from_string(std::string str, std::vector<CommandParam>& vtCommandParams);
+    bool ParseCommandFromString(std::string str, CommandParam &cmdParam);
 
     bool TheFirstPart(CommandParam& cmdPara, std::string data);
     bool TheSecondPart(CommandParam& cmdPara, std::string data);