AudioManager  7.5.11
Native Application Runtime Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
CAmDltWrapper.cpp
Go to the documentation of this file.
1 
26 #include "CAmDltWrapper.h"
27 #include <string>
28 #include <iostream>
29 #include <string.h>
30 #include <chrono>
31 #include <ctime>
32 
33 namespace am
34 {
35 CAmDltWrapper* CAmDltWrapper::mpDLTWrapper = NULL;
36 pthread_mutex_t CAmDltWrapper::mMutex = PTHREAD_MUTEX_INITIALIZER;
37 
38 const std::vector<const char*> CAmDltWrapper::mStr_error =
39 {
40  "E_OK",
41  "E_UNKNOWN",
42  "E_OUT_OF_RANGE",
43  "E_NOT_USED",
44  "E_DATABASE_ERROR",
45  "E_ALREADY_EXISTS",
46  "E_NO_CHANGE",
47  "E_NOT_POSSIBLE",
48  "E_NON_EXISTENT",
49  "E_ABORTED",
50  "E_WRONG_FORMAT",
51  "E_COMMUNICATION",
52  "E_MAX"
53 };
54 
55 const std::vector<const char*> CAmDltWrapper::mStr_sourceState =
56 {
57  "SS_UNKNNOWN",
58  "SS_ON",
59  "SS_OFF",
60  "SS_PAUSED",
61  "SS_MAX"
62 };
63 
64 const std::vector<const char*> CAmDltWrapper::mStr_MuteState =
65 {
66  "MS_UNKNOWN" ,
67  "MS_MUTED" ,
68  "MS_UNMUTED" ,
69  "MS_MAX"
70 };
71 
72 const std::vector<const char*> CAmDltWrapper::mStr_DomainState =
73 {
74  "DS_UNKNOWN",
75  "DS_CONTROLLED",
76  "DS_INDEPENDENT_STARTUP",
77  "DS_INDEPENDENT_RUNDOWN",
78  "DS_MAX"
79 };
80 
81 const std::vector<const char*> CAmDltWrapper::mStr_ConnectionState =
82 {
83  "CS_UNKNOWN",
84  "CS_CONNECTING",
85  "CS_CONNECTED",
86  "CS_DISCONNECTING",
87  "CS_DISCONNECTED",
88  "CS_SUSPENDED",
89  "CS_MAX"
90 };
91 
92 const std::vector<const char*> CAmDltWrapper::mStr_Availability =
93 {
94  "A_UNKNOWN",
95  "A_AVAILABLE",
96  "A_UNAVAILABLE",
97  "A_MAX"
98 };
99 
100 const std::vector<const char*> CAmDltWrapper::mStr_Interrupt =
101 {
102  "IS_UNKNOWN",
103  "IS_OFF",
104  "IS_INTERRUPTED",
105  "IS_MAX"
106 };
107 
108 const std::vector<const char*> CAmDltWrapper::mStr_Handle =
109 {
110  "H_UNKNOWN",
111  "H_CONNECT",
112  "H_DISCONNECT",
113  "H_SETSOURCESTATE",
114  "H_SETSINKVOLUME",
115  "H_SETSOURCEVOLUME",
116  "H_SETSINKSOUNDPROPERTY",
117  "H_SETSOURCESOUNDPROPERTY",
118  "H_SETSINKSOUNDPROPERTIES",
119  "H_SETSOURCESOUNDPROPERTIES",
120  "H_CROSSFADE",
121  "H_SETVOLUMES",
122  "H_SETSINKNOTIFICATION",
123  "H_SETSOURCENOTIFICATION",
124  "H_MAX"
125 };
126 
127 const std::vector<const char*> CAmDltWrapper::mStr_NotificationStatus =
128 {
129  "NS_UNKNOWN",
130  "NS_OFF",
131  "NS_PERIODIC",
132  "NS_MINIMUM",
133  "NS_MAXIMUM",
134  "NS_CHANGE",
135  "NS_MAX"
136 };
137 
138 
139 
140 std::string CAmDltWrapper::now()
141 {
142  std::time_t t(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
143  struct tm * timeinfo(localtime(&t));
144  char buffer[80];
145  std::strftime(buffer,80,"%D %T ",timeinfo);
146  return (std::string(buffer));
147 }
148 
149 CAmDltWrapper* CAmDltWrapper::instanctiateOnce(const char *appid, const char * description, const bool debugEnabled, const logDestination logDest, const std::string Filename,bool onlyError)
150 {
151  if (!mpDLTWrapper)
152  {
153  mpDLTWrapper = new CAmDltWrapper(appid,description,debugEnabled,logDest,Filename,onlyError);
154  }
155  return (mpDLTWrapper);
156 }
157 
159 {
160  return mpDLTWrapper;
161 }
162 
164 {
165  return (mDebugEnabled);
166 }
167 
168 bool CAmDltWrapper::initNoDlt(DltLogLevelType loglevel, DltContext* context)
169 {
170  if (mlogDestination==logDestination::COMMAND_LINE)
171  {
172  if (!context)
173  {
174  switch (loglevel)
175  {
176  case DLT_LOG_OFF :
177  case DLT_LOG_FATAL :
178  case DLT_LOG_ERROR :
179  mNoDltContextData.buffer << "\033[0;31m"<<"[DEF] [Erro] \033[0m";
180  mLogOn=true;
181  break;
182  case DLT_LOG_WARN :
183  if (!mOnlyError)
184  {
185  mNoDltContextData.buffer << "\033[0;33m"<<"[DEF] [Warn] \033[0m";
186  }
187  else
188  mLogOn=false;
189  break;
190  case DLT_LOG_INFO :
191  if (!mOnlyError)
192  {
193  mNoDltContextData.buffer << "\033[0;36m"<<"[DEF] [Info] \033[0m";
194  }
195  else
196  mLogOn=false;
197  break;
198  default:
199  if (!mOnlyError)
200  {
201  mNoDltContextData.buffer << "\033[0;32m"<<"[DEF] [Defa] \033[0m";
202  }
203  else
204  mLogOn=false;
205  }
206  }
207  else
208  {
209  std::string con(mMapContext.at(context));
210  switch (loglevel)
211  {
212  case DLT_LOG_OFF :
213  case DLT_LOG_FATAL :
214  case DLT_LOG_ERROR :
215  mNoDltContextData.buffer << "\033[0;31m["<<con<<"] [Erro] \033[0m";
216  mLogOn=true;
217  break;
218  case DLT_LOG_WARN :
219  if (!mOnlyError)
220  {
221  mNoDltContextData.buffer << "\033[0;33m["<<con<<"] [Warn] \033[0m";
222  }
223  else
224  mLogOn=false;
225  break;
226  case DLT_LOG_INFO :
227  if (!mOnlyError)
228  {
229  mNoDltContextData.buffer << "\033[0;36m["<<con<<"] [Info] \033[0m";
230  }
231  else
232  mLogOn=false;
233 
234  break;
235  default:
236  if (!mOnlyError)
237  {
238  mNoDltContextData.buffer << "\033[0;32m["<<con<<"] [Defa] \033[0m";
239  }
240  else
241  mLogOn=false;
242  }
243  }
244  return true;
245  }
246  else
247  {
248  if (!context)
249  {
250  switch (loglevel)
251  {
252  case DLT_LOG_OFF :
253  case DLT_LOG_FATAL :
254  case DLT_LOG_ERROR :
255  mNoDltContextData.buffer <<"[DEF] [Erro] ";
256  mLogOn=true;
257  break;
258  case DLT_LOG_WARN :
259  if (!mOnlyError)
260  {
261  mNoDltContextData.buffer <<"[DEF] [Warn] ";
262  }
263  else
264  mLogOn=false;
265  break;
266  case DLT_LOG_INFO :
267  if (!mOnlyError)
268  {
269  mNoDltContextData.buffer <<"[DEF] [Info] ";
270  }
271  else
272  mLogOn=false;
273  break;
274  default:
275  if (!mOnlyError)
276  {
277  mNoDltContextData.buffer <<"[DEF] [Defa] ";
278  }
279  else
280  mLogOn=false;
281 
282  }
283  }
284  else
285  {
286  std::string con(mMapContext.at(context));
287  switch (loglevel)
288  {
289  case DLT_LOG_OFF :
290  case DLT_LOG_FATAL :
291  case DLT_LOG_ERROR :
292  mNoDltContextData.buffer << "["<<con<<"] [Erro] ";
293  mLogOn=true;
294  break;
295  case DLT_LOG_WARN :
296  if (!mOnlyError)
297  {
298  mNoDltContextData.buffer << "["<<con<<"] [Warn] ";
299  }
300  else
301  mLogOn=false;
302  break;
303  case DLT_LOG_INFO :
304  if (!mOnlyError)
305  {
306  mNoDltContextData.buffer << "["<<con<<"] [Info] ";
307  }
308  else
309  mLogOn=false;
310 
311  break;
312  default:
313  if (!mOnlyError)
314  {
315  mNoDltContextData.buffer << "["<<con<<"] [Defa] ";
316  }
317  else
318  mLogOn=false;
319  }
320  }
321  return true;
322  }
323 }
324 
325 #ifdef WITH_DLT
326 
327  CAmDltWrapper::CAmDltWrapper(const char *appid, const char * description, const bool debugEnabled, const logDestination logDest, const std::string Filename,bool onlyError) :
328  mDebugEnabled(debugEnabled), //
329  mlogDestination(logDest), //
330  mFilename(NULL), //
331  mOnlyError(onlyError), //
332  mLogOn(true)
333  {
334  if (mDebugEnabled && mlogDestination==logDestination::DAEMON)
335  {
336  dlt_register_app(appid, description);
337  //register a default context
338  dlt_register_context(&mDltContext, "DEF", "Default Context registered by DLTWrapper Class");
339  }
340  else if (mDebugEnabled)
341  {
342  if (mlogDestination==logDestination::COMMAND_LINE)
343  std::cout << "\033[0;36m[DLT] Registering AppID " << appid << " , " << description << "\033[0m"<< std::endl;
344  else
345  {
346  mFilename.open(Filename, std::ofstream::out | std::ofstream::trunc);
347  if (!mFilename.is_open())
348  {
349  throw std::runtime_error("Cannot open file for logging");
350  }
351  mFilename << now() << "[DLT] Registering AppID " << appid << " , " << description << std::endl;
352  }
353  }
354  }
355 
357  {
358  if (mpDLTWrapper && mDebugEnabled && mlogDestination==logDestination::DAEMON)
359  {
360  mpDLTWrapper->unregisterContext(mDltContext);
361  delete mpDLTWrapper;
362  }
363  else if (mpDLTWrapper && mDebugEnabled && mlogDestination==logDestination::COMMAND_LINE)
364  {
365  mFilename.close();
366  }
367  }
368 
370  {
371  if (mDebugEnabled && mlogDestination==logDestination::DAEMON)
372  {
373  dlt_unregister_context(&handle);
374  }
375  }
376 
377  void CAmDltWrapper::deinit()
378  {
379  if (mDebugEnabled)
380  {
381  unregisterContext(mDltContext);
382  }
383  }
384 
385  void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char *description)
386  {
387  if (mDebugEnabled && mlogDestination==logDestination::DAEMON)
388  {
389  dlt_register_context(&handle, contextid, description);
390  }
391  else if (mDebugEnabled)
392  {
393  mMapContext.emplace(&handle,std::string(contextid));
394 
395  if (mlogDestination==logDestination::COMMAND_LINE)
396  std::cout << "\033[0;36m[DLT] Registering Context " << contextid << " , " << description << "\033[0m"<< std::endl;
397  else
398  mFilename << now() << "[DLT] Registering Context " << contextid << " , " << description << std::endl;
399  }
400  }
401 
402  void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char * description,const DltLogLevelType level, const DltTraceStatusType status)
403  {
404  if (mDebugEnabled && mlogDestination==logDestination::DAEMON)
405  {
406  dlt_register_context_ll_ts(&handle, contextid, description, level, status);
407  }
408  else if (mDebugEnabled)
409  {
410  mMapContext.emplace(&handle,std::string(contextid));
411 
412  if (mlogDestination==logDestination::COMMAND_LINE)
413  std::cout << "\033[0;36m[DLT] Registering Context " << contextid << " , " << description << "\033[0m"<< std::endl;
414  else
415  mFilename << now() << " [DLT] Registering Context " << contextid << " , " << description << std::endl;
416  }
417  }
418 
419  bool CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context)
420  {
421  pthread_mutex_lock(&mMutex);
422  if (mlogDestination==logDestination::DAEMON)
423  {
424  if (!context)
425  context = &mDltContext;
426 
427  if(dlt_user_log_write_start(context, &mDltContextData, loglevel) < 0)
428  {
429  pthread_mutex_unlock(&mMutex);
430  return false;
431  }
432  }
433  else
434  {
435  initNoDlt(loglevel,context);
436  }
437  return true;
438  }
439 
440  void CAmDltWrapper::send()
441  {
442  if (mlogDestination==logDestination::DAEMON)
443  {
444  dlt_user_log_write_finish(&mDltContextData);
445  }
446  else
447  {
448  if (mlogDestination==logDestination::COMMAND_LINE && mLogOn)
449  std::cout << mNoDltContextData.buffer.str().c_str() << std::endl;
450  else if (mLogOn)
451  mFilename << now() << mNoDltContextData.buffer.str().c_str() << std::endl;
452 
453  mNoDltContextData.buffer.str("");
454  mNoDltContextData.buffer.clear();
455  }
456  pthread_mutex_unlock(&mMutex);
457  }
458 
459  void CAmDltWrapper::append(const int8_t value)
460  {
461  if (mlogDestination==logDestination::DAEMON)
462  dlt_user_log_write_int8(&mDltContextData, value);
463  else
464  appendNoDLT(value);
465  }
466 
467  void CAmDltWrapper::append(const uint8_t value)
468  {
469  if (mlogDestination==logDestination::DAEMON)
470  dlt_user_log_write_uint8(&mDltContextData, value);
471  else
472  appendNoDLT(value);
473  }
474 
475  void CAmDltWrapper::append(const int16_t value)
476  {
477  if (mlogDestination==logDestination::DAEMON)
478  dlt_user_log_write_int16(&mDltContextData, value);
479  else
480  appendNoDLT(value);
481  }
482 
483  void CAmDltWrapper::append(const uint16_t value)
484  {
485  if (mlogDestination==logDestination::DAEMON)
486  dlt_user_log_write_uint16(&mDltContextData, value);
487  else
488  appendNoDLT(value);
489  }
490 
491  void CAmDltWrapper::append(const int32_t value)
492  {
493  if (mlogDestination==logDestination::DAEMON)
494  dlt_user_log_write_int32(&mDltContextData, value);
495  else
496  appendNoDLT(value);
497  }
498 
499  void CAmDltWrapper::append(const uint32_t value)
500  {
501  if (mlogDestination==logDestination::DAEMON)
502  dlt_user_log_write_uint32(&mDltContextData, value);
503  else
504  appendNoDLT(value);
505  }
506 
507  void CAmDltWrapper::append(const std::string& value)
508  {
509  append(value.c_str());
510  }
511 
512  void CAmDltWrapper::append(const bool value)
513  {
514  if (mlogDestination==logDestination::DAEMON)
515  dlt_user_log_write_bool(&mDltContextData, static_cast<uint8_t>(value));
516  else
517  appendNoDLT(value);
518  }
519 
520  void CAmDltWrapper::append(const int64_t value)
521  {
522  if (mlogDestination==logDestination::DAEMON)
523  dlt_user_log_write_int64(&mDltContextData, value);
524  else
525  appendNoDLT(value);
526  }
527 
528  void CAmDltWrapper::append(const uint64_t value)
529  {
530  if (mlogDestination==logDestination::DAEMON)
531  dlt_user_log_write_uint64(&mDltContextData, value);
532  else
533  appendNoDLT(value);
534  }
535 
536  void CAmDltWrapper::append(const std::vector<uint8_t> & data)
537  {
538  if (mlogDestination==logDestination::DAEMON)
539  dlt_user_log_write_raw(&mDltContextData,(void*)data.data(),data.size());
540  else
541  mNoDltContextData.buffer << data.data();
542  }
543 }
544 
545 #else //------------------------------------------------------------------------------------------------- no DLT !
546 
547  CAmDltWrapper::CAmDltWrapper(const char *appid, const char * description, const bool debugEnabled, const logDestination logDest, const std::string Filename,bool onlyError) :
548  mDebugEnabled(debugEnabled), //
549  mlogDestination(logDest), //
550  mFilename(NULL), //
551  mOnlyError(onlyError), //
552  mLogOn(true)
553  {
554  if (logDest==logDestination::DAEMON)
555  {
556  std::cout << "\033[0;31m[DLT] Cannot Use Daemon Logging, active in CMAKE! Using CommandLine\033[0m"<< std::endl;
557  mlogDestination=logDestination::COMMAND_LINE;
558  }
559  if (mDebugEnabled)
560  {
561  if (mlogDestination==logDestination::COMMAND_LINE)
562  std::cout << "\033[0;36m[DLT] Registering AppID " << appid << " , " << description << "\033[0m"<< std::endl;
563  else
564  {
565  mFilename.open(Filename, std::ofstream::out | std::ofstream::trunc);
566  if (!mFilename.is_open())
567  {
568  throw std::runtime_error("Cannot open file for logging");
569  }
570  mFilename << now() << "[DLT] Registering AppID " << appid << " , " << description << std::endl;
571  }
572  }
573  }
574 
576  {
577  if (mpDLTWrapper && mDebugEnabled && mlogDestination==logDestination::COMMAND_LINE)
578  {
579  mFilename.close();
580  }
581  }
582 
584  {}
585 
587  {}
588 
589  void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char *description)
590  {
591  if (mDebugEnabled)
592  {
593  mMapContext.emplace(&handle,std::string(contextid));
594 
595  if (mlogDestination==logDestination::COMMAND_LINE)
596  std::cout << "\033[0;36m[DLT] Registering Context " << contextid << " , " << description << "\033[0m"<< std::endl;
597  else
598  mFilename << now() << "[DLT] Registering Context " << contextid << " , " << description << std::endl;
599  }
600  }
601 
602  void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char * description,const DltLogLevelType level, const DltTraceStatusType status)
603  {
604  if (mDebugEnabled)
605  {
606  mMapContext.emplace(&handle,std::string(contextid));
607 
608  if (mlogDestination==logDestination::COMMAND_LINE)
609  std::cout << "\033[0;36m[DLT] Registering Context " << contextid << " , " << description << "\033[0m"<< std::endl;
610  else
611  mFilename << now() << " [DLT] Registering Context " << contextid << " , " << description << std::endl;
612  }
613  }
614 
616  {
617  pthread_mutex_lock(&mMutex);
618  initNoDlt(loglevel,context);
619  }
620 
622  {
623  if (mlogDestination==logDestination::COMMAND_LINE && mLogOn)
624  std::cout << mNoDltContextData.buffer.str().c_str() << std::endl;
625  else if (mLogOn)
626  mFilename << now() << mNoDltContextData.buffer.str().c_str() << std::endl;
627 
628  mNoDltContextData.buffer.str("");
629  mNoDltContextData.buffer.clear();
630  pthread_mutex_unlock(&mMutex);
631  }
632 
633  void CAmDltWrapper::append(const int8_t value)
634  {
635  appendNoDLT(value);
636  }
637 
638  void CAmDltWrapper::append(const uint8_t value)
639  {
640  appendNoDLT(value);
641  }
642 
643  void CAmDltWrapper::append(const int16_t value)
644  {
645  appendNoDLT(value);
646  }
647 
648  void CAmDltWrapper::append(const uint16_t value)
649  {
650  appendNoDLT(value);
651  }
652 
653  void CAmDltWrapper::append(const int32_t value)
654  {
655  appendNoDLT(value);
656  }
657 
658  void CAmDltWrapper::append(const uint32_t value)
659  {
660  appendNoDLT(value);
661  }
662 
663  void CAmDltWrapper::append(const std::string& value)
664  {
665  append(value.c_str());
666  }
667 
668  void CAmDltWrapper::append(const bool value)
669  {
670  appendNoDLT(value);
671  }
672 
673  void CAmDltWrapper::append(const int64_t value)
674  {
675  appendNoDLT(value);
676  }
677 
678  void CAmDltWrapper::append(const uint64_t value)
679  {
680  appendNoDLT(value);
681  }
682 
683  void CAmDltWrapper::append(const std::vector<uint8_t> & data)
684  {
685  mNoDltContextData.buffer << data.data();
686  }
687 }
688 #endif //WITH_DLT
689 
690 
Wraps around the dlt.
std::stringstream buffer
buffer for building log message
Log level off.
Definition: CAmDltWrapper.h:79
fatal system error
Definition: CAmDltWrapper.h:80
static CAmDltWrapper * instanctiateOnce(const char *appid, const char *description, const bool debugEnabled=true, const logDestination logDest=logDestination::DAEMON, const std::string Filename="", bool onlyError=false)
Instanciate the Dlt Wrapper.
SPDX license identifier: MPL-2.0.
bool init(DltLogLevelType loglevel, DltContext *context=NULL)
static CAmDltWrapper * instance()
get the Wrapper Instance
void registerContext(DltContext &handle, const char *contextid, const char *description)
register a context
This structure is used for every context used in an application.
Definition: CAmDltWrapper.h:42
informational
Definition: CAmDltWrapper.h:83
void appendNoDLT(T value)
error with impact to correct functionality
Definition: CAmDltWrapper.h:81
DltTraceStatusType
Definition of DLT trace status.
Definition: CAmDltWrapper.h:52
void unregisterContext(DltContext &handle)
warning, correct behaviour could not be ensured
Definition: CAmDltWrapper.h:82
DltLogLevelType
Definitions of DLT log level.
Definition: CAmDltWrapper.h:76