mirror of
				http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
				synced 2025-10-25 13:59:44 +08:00 
			
		
		
		
	
		
			
	
	
		
			133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /**
 | ||
|  |     @file   Log.h | ||
|  |     @brief  Interface to Log | ||
|  |     @author Mark Zieg <mark.zieg@oceanoptics.com> | ||
|  | 
 | ||
|  |     LICENSE: | ||
|  | 
 | ||
|  |     SeaBreeze Copyright (C) 2014, Ocean Optics Inc | ||
|  | 
 | ||
|  |     Permission is hereby granted, free of charge, to any person obtaining | ||
|  |     a copy of this software and associated documentation files (the | ||
|  |     "Software"), to deal in the Software without restriction, including | ||
|  |     without limitation the rights to use, copy, modify, merge, publish, | ||
|  |     distribute, sublicense, and/or sell copies of the Software, and to | ||
|  |     permit persons to whom the Software is furnished to do so, subject | ||
|  |     to the following conditions: | ||
|  | 
 | ||
|  |     The above copyright notice and this permission notice shall be included | ||
|  |     in all copies or substantial portions of the Software. | ||
|  | 
 | ||
|  |     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
|  |     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
|  |     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||
|  |     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||
|  |     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||
|  |     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||
|  |     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef SEABREEZE_LOG_H
 | ||
|  | #define SEABREEZE_LOG_H
 | ||
|  | 
 | ||
|  | #include "api/DllDecl.h"
 | ||
|  | 
 | ||
|  | #include <string>
 | ||
|  | #include <stack>
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <stdarg.h>
 | ||
|  | 
 | ||
|  | #ifdef OOI_DEBUG
 | ||
|  |     #define OOI_LOG_PRINT 1
 | ||
|  | #else
 | ||
|  |     #define OOI_LOG_PRINT 0
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | 
 | ||
|  | /**
 | ||
|  | * @brief instantiate logger in the current function | ||
|  | * @param s (Input) function name (typically __FUNCTION__) | ||
|  | */ | ||
|  | #define LOG(s) Log logger(s);
 | ||
|  | 
 | ||
|  | /**
 | ||
|  | * @brief log a printf string (and optional arguments) if debugging is enabled | ||
|  | * @note double parens: call as LOG_DEBUG(("variable x is %d, y is %f", x, y)); | ||
|  | * @see http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing
 | ||
|  | */ | ||
|  | #define LOG_DEBUG(s) do { if (OOI_LOG_PRINT) logger.debug s; } while (0)
 | ||
|  | 
 | ||
|  | //! @see LOG_DEBUG
 | ||
|  | #define LOG_INFO(s)  do { if (OOI_LOG_PRINT) logger.info  s; } while (0)
 | ||
|  | 
 | ||
|  | //! @see LOG_DEBUG
 | ||
|  | #define LOG_WARN(s)  do { if (OOI_LOG_PRINT) logger.warn  s; } while (0)
 | ||
|  | 
 | ||
|  | //! @see LOG_DEBUG
 | ||
|  | #define LOG_ERROR(s) do { if (OOI_LOG_PRINT) logger.error s; } while (0)
 | ||
|  | 
 | ||
|  | #define OOI_LOG_LEVEL_NEVER 0
 | ||
|  | #define OOI_LOG_LEVEL_ERROR 1
 | ||
|  | #define OOI_LOG_LEVEL_WARN  2
 | ||
|  | #define OOI_LOG_LEVEL_INFO  3
 | ||
|  | #define OOI_LOG_LEVEL_DEBUG 4
 | ||
|  | #define OOI_LOG_LEVEL_TRACE 5
 | ||
|  | 
 | ||
|  | /**
 | ||
|  | * @brief Simple logger for OOI applications. | ||
|  | * @todo  Provide better thread support (hard to tell what thread model | ||
|  | *        the caller may be using...) | ||
|  | * @todo  Provide flat C interface (e.g. for NativeUSBWinUSB.c, test apps) | ||
|  | * | ||
|  | * Provides automatic heirarchical call-stack indentation. | ||
|  | */ | ||
|  | class DLL_DECL Log | ||
|  | { | ||
|  |     public: | ||
|  |         Log(const char *s); | ||
|  |        ~Log(); | ||
|  | 
 | ||
|  |         // public class methods
 | ||
|  |         static void setLogLevel(int lvl); | ||
|  |         static void setLogLevel(const std::string& s); | ||
|  |         static void setLogFile(void *f); | ||
|  | 
 | ||
|  |         // public instance methods
 | ||
|  |         void debug(const char *fmt, ...); | ||
|  |         void info (const char *fmt, ...); | ||
|  |         void warn (const char *fmt, ...); | ||
|  |         void error(const char *fmt, ...); | ||
|  | 
 | ||
|  |         // these must be public for C interface to work
 | ||
|  |         static unsigned logLevel; | ||
|  |         void formatAndSend(int lvl, const char *lvlName, | ||
|  |             const char *separator, const char *fmt, va_list args); | ||
|  | 
 | ||
|  |     private: | ||
|  |         // private class attributes
 | ||
|  |         static FILE *logFile; | ||
|  |         static std::stack<std::string>* callstack; | ||
|  | 
 | ||
|  |         // private instance methods
 | ||
|  |         void trace(const char *fmt, ...); | ||
|  | }; | ||
|  | 
 | ||
|  | extern "C" { | ||
|  | #endif /* __cplusplus */
 | ||
|  | 
 | ||
|  | // We need the flattened C interface if we want to call from Cygwin (mainly
 | ||
|  | // to set log level)...see http://cygwin.com/ml/cygwin/2006-04/msg00251.html
 | ||
|  | void DLL_DECL seabreeze_log_set_level_int(int lvl); | ||
|  | void DLL_DECL seabreeze_log_set_level_string(const char *s); | ||
|  | void DLL_DECL seabreeze_log_debug(const char *fmt, ...); | ||
|  | void DLL_DECL seabreeze_log_info (const char *fmt, ...); | ||
|  | void DLL_DECL seabreeze_log_warn (const char *fmt, ...); | ||
|  | void DLL_DECL seabreeze_log_error(const char *fmt, ...); | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | }; | ||
|  | 
 | ||
|  | #endif /* __cplusplus */
 | ||
|  | #endif
 |