cec: added -f and --log-file parameters to cec-client
[deb_libcec.git] / src / testclient / main.cpp
index 8ca3faafe05ab892f14283a56e8ea37a2711bebc..be3018c68646a66bfa58361984e1d3f1c0d342f9 100644 (file)
@@ -35,6 +35,7 @@
 #include <cstdio>
 #include <fcntl.h>
 #include <iostream>
+#include <fstream>
 #include <string>
 #include <sstream>
 #include "../lib/platform/threads.h"
@@ -46,6 +47,8 @@ using namespace std;
 #define CEC_TEST_CLIENT_VERSION 8
 
 #include <cecloader.h>
+int g_cecLogLevel = CEC_LOG_ALL;
+ofstream g_logOutput;
 
 inline bool HexStrToInt(const std::string& data, uint8_t& value)
 {
@@ -104,28 +107,37 @@ void flush_log(ICECAdapter *cecParser)
   cec_log_message message;
   while (cecParser && cecParser->GetNextLogMessage(&message))
   {
-    switch (message.level)
+    if ((message.level & g_cecLogLevel) == message.level)
     {
-    case CEC_LOG_ERROR:
-      cout << "ERROR:   ";
-      break;
-    case CEC_LOG_WARNING:
-      cout << "WARNING: ";
-      break;
-    case CEC_LOG_NOTICE:
-      cout << "NOTICE:  ";
-      break;
-    case CEC_LOG_TRAFFIC:
-      cout << "TRAFFIC: ";
-      break;
-    case CEC_LOG_DEBUG:
-      cout << "DEBUG:   ";
-      break;
-    }
+      CStdString strLevel;
+      switch (message.level)
+      {
+      case CEC_LOG_ERROR:
+        strLevel = "ERROR:   ";
+        break;
+      case CEC_LOG_WARNING:
+        strLevel = "WARNING: ";
+        break;
+      case CEC_LOG_NOTICE:
+        strLevel = "NOTICE:  ";
+        break;
+      case CEC_LOG_TRAFFIC:
+        strLevel = "TRAFFIC: ";
+        break;
+      case CEC_LOG_DEBUG:
+        strLevel = "DEBUG:   ";
+        break;
+      default:
+        break;
+      }
 
-    CStdString strMessageTmp;
-    strMessageTmp.Format("[%16lld]\t%s", message.time, message.message);
-    cout << strMessageTmp.c_str() << endl;
+      CStdString strMessageTmp;
+      strMessageTmp.Format("[%16lld]\t%s", message.time, message.message);
+      cout << strLevel.c_str() << strMessageTmp.c_str() << endl;
+
+      if (g_logOutput.is_open())
+        g_logOutput << strLevel.c_str() << strMessageTmp.c_str() << endl;
+    }
   }
 }
 
@@ -159,6 +171,7 @@ void show_help(const char* strExec)
       "parameters:" << endl <<
       "\t-h --help            Shows this help text" << endl <<
       "\t-l --list-devices    List all devices on this system" << endl <<
+      "\t-f --log-file {file} Writes all libCEC log message to a file" << endl <<
       "\t[COM PORT]           The com port to connect to. If no COM port is given, the client tries to connect to the first device that is detected" << endl <<
       endl <<
       "Type 'h' or 'help' and press enter after starting the client to display all available commands" << endl;
@@ -190,6 +203,7 @@ void show_console_help(void)
   "[osd 0 Test Message]      displays 'Test Message' on the TV" << endl <<
   endl <<
   "[mon] {1|0}               enable or disable CEC bus monitoring." << endl <<
+  "[log] {1 - 31}            change the log level. see cectypes.h for values." << endl <<
   "[ping]                    send a ping command to the CEC adapter." << endl <<
   "[bl]                      to let the adapter enter the bootloader, to upgrade" << endl <<
   "                          the flash rom." << endl <<
@@ -224,7 +238,22 @@ int main (int argc, char *argv[])
 #endif
 
   string strPort;
-  if (argc < 2)
+  int iArgPtr = 0;
+  if (argc >= 3)
+  {
+    if (!strcmp(argv[1], "-f"))
+    {
+      g_logOutput.open(argv[2]);
+      iArgPtr = 2;
+    }
+    else if (!strcmp(argv[1], "--file"))
+    {
+      g_logOutput.open(argv[2]);
+      iArgPtr = 2;
+    }
+  }
+
+  if (argc < 2 + iArgPtr)
   {
     cout << "no serial port given. trying autodetect: ";
     cec_adapter devices[10];
@@ -242,22 +271,23 @@ int main (int argc, char *argv[])
       strPort = devices[0].comm;
     }
   }
-  else if (!strcmp(argv[1], "--list-devices") || !strcmp(argv[1], "-l"))
+  else if (!strcmp(argv[1 + iArgPtr], "--list-devices") || !strcmp(argv[1 + iArgPtr], "-l"))
   {
     list_devices(parser);
     UnloadLibCec(parser);
     return 0;
   }
-  else if (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))
+  else if (!strcmp(argv[1 + iArgPtr], "--help") || !strcmp(argv[1 + iArgPtr], "-h"))
   {
     show_help(argv[0]);
     return 0;
   }
   else
   {
-    strPort = argv[1];
+    strPort = argv[1 + iArgPtr];
   }
 
+
   if (!parser->Open(strPort.c_str()))
   {
     cout << "unable to open the device on port " << strPort << endl;
@@ -402,6 +432,19 @@ int main (int argc, char *argv[])
         {
           bContinue = false;
         }
+        else if (command == "log")
+        {
+          CStdString strLevel;
+          if (GetWord(input, strLevel))
+          {
+            int iNewLevel = atoi(strLevel);
+            if (iNewLevel >= CEC_LOG_ERROR && iNewLevel <= CEC_LOG_ALL)
+            {
+              g_cecLogLevel = iNewLevel;
+              cout << "log level changed to " << strLevel.c_str() << endl;
+            }
+          }
+        }
       }
       if (bContinue)
         cout << "waiting for input" << endl;
@@ -413,5 +456,9 @@ int main (int argc, char *argv[])
   parser->Close();
   flush_log(parser);
   UnloadLibCec(parser);
+
+  if (g_logOutput.is_open())
+    g_logOutput.close();
+
   return 0;
 }