Skip to content

Commit 7691a03

Browse files
committed
Merge pull request #364 from xlz/logging
Logging refactoring continued
2 parents 6f9ec3f + 5172def commit 7691a03

21 files changed

+776
-531
lines changed

examples/protonect/CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ SET(SOURCES
101101
src/resource.cpp
102102
src/command_transaction.cpp
103103
src/registration.cpp
104-
src/timer.cpp
104+
src/logging.cpp
105105
src/libfreenect2.cpp
106106

107107
${LIBFREENECT2_THREADING_SOURCE}
@@ -166,6 +166,13 @@ IF(ENABLE_OPENCL)
166166
LIST(APPEND RESOURCES
167167
src/opencl_depth_packet_processor.cl
168168
)
169+
170+
# Major Linux distro stable releases have buggy OpenCL ICD loader.
171+
# The workaround of disabling exceptions can only be set up during compile time.
172+
# Diabling it for all should be harmless. The flag is the same for GCC/Clang/ICC.
173+
IF(UNIX AND NOT APPLE)
174+
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
175+
ENDIF()
169176
ENDIF(OPENCL_FOUND)
170177
ENDIF(ENABLE_OPENCL)
171178

examples/protonect/Protonect.cpp

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <libfreenect2/threading.h>
3434
#include <libfreenect2/registration.h>
3535
#include <libfreenect2/packet_pipeline.h>
36+
#include <libfreenect2/logger.h>
3637
#ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT
3738
#include "viewer.h"
3839
#endif
@@ -45,6 +46,29 @@ void sigint_handler(int s)
4546
protonect_shutdown = true;
4647
}
4748

49+
//The following demostrates how to create a custom logger
50+
#include <fstream>
51+
#include <cstdlib>
52+
class MyFileLogger: public libfreenect2::Logger
53+
{
54+
private:
55+
std::ofstream logfile_;
56+
public:
57+
MyFileLogger(const char *filename)
58+
: logfile_(filename)
59+
{
60+
level_ = Debug;
61+
}
62+
bool good()
63+
{
64+
return logfile_.good();
65+
}
66+
virtual void log(Level level, const std::string &message)
67+
{
68+
logfile_ << "[" << libfreenect2::Logger::level2str(level) << "] " << message << std::endl;
69+
}
70+
};
71+
4872
int main(int argc, char *argv[])
4973
{
5074
std::string program_path(argv[0]);
@@ -58,6 +82,12 @@ int main(int argc, char *argv[])
5882
}
5983

6084
libfreenect2::Freenect2 freenect2;
85+
// create a console logger with debug level (default is console logger with info level)
86+
libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Debug));
87+
MyFileLogger *filelogger = new MyFileLogger(getenv("LOGFILE"));
88+
if (filelogger->good())
89+
libfreenect2::setGlobalLogger(filelogger);
90+
6191
libfreenect2::Freenect2Device *dev = 0;
6292
libfreenect2::PacketPipeline *pipeline = 0;
6393

@@ -69,6 +99,8 @@ int main(int argc, char *argv[])
6999

70100
std::string serial = freenect2.getDefaultDeviceSerialNumber();
71101

102+
bool viewer_enabled = true;
103+
72104
for(int argI = 1; argI < argc; ++argI)
73105
{
74106
const std::string arg(argv[argI]);
@@ -100,6 +132,10 @@ int main(int argc, char *argv[])
100132
{
101133
serial = arg;
102134
}
135+
else if(arg == "-noviewer")
136+
{
137+
viewer_enabled = false;
138+
}
103139
else
104140
{
105141
std::cout << "Unknown argument: " << arg << std::endl;
@@ -137,9 +173,13 @@ int main(int argc, char *argv[])
137173

138174
libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams());
139175

176+
size_t framecount = 0;
140177
#ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT
141178
Viewer viewer;
142-
viewer.initialize();
179+
if (viewer_enabled)
180+
viewer.initialize();
181+
#else
182+
viewer_enabled = false;
143183
#endif
144184

145185
while(!protonect_shutdown)
@@ -151,15 +191,22 @@ int main(int argc, char *argv[])
151191

152192
registration->apply(rgb, depth, &undistorted, &registered);
153193

194+
framecount++;
195+
if (!viewer_enabled)
196+
{
197+
if (framecount % 100 == 0)
198+
std::cout << "The viewer is turned off. Received " << framecount << " frames. Ctrl-C to stop." << std::endl;
199+
listener.release(frames);
200+
continue;
201+
}
202+
154203
#ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT
155204
viewer.addFrame("RGB", rgb);
156205
viewer.addFrame("ir", ir);
157206
viewer.addFrame("depth", depth);
158207
viewer.addFrame("registered", &registered);
159208

160-
protonect_shutdown = viewer.render();
161-
#else
162-
protonect_shutdown = true;
209+
protonect_shutdown = protonect_shutdown || viewer.render();
163210
#endif
164211

165212
listener.release(frames);

examples/protonect/include/libfreenect2/timer.h renamed to examples/protonect/include/libfreenect2/logger.h

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,46 @@
2424
* either License.
2525
*/
2626

27-
#ifndef TIMER_H_
28-
#define TIMER_H_
27+
#ifndef LIBFREENECT2_LOGGER_H_
28+
#define LIBFREENECT2_LOGGER_H_
29+
30+
#include <string>
31+
#include <sstream>
2932

3033
#include <libfreenect2/config.h>
3134

3235
namespace libfreenect2
3336
{
3437

35-
class TimerImpl;
38+
class LIBFREENECT2_API Logger
39+
{
40+
public:
41+
enum Level
42+
{
43+
None = 0,
44+
Error = 1,
45+
Warning = 2,
46+
Info = 3,
47+
Debug = 4,
48+
};
49+
static Level getDefaultLevel();
50+
static std::string level2str(Level level);
3651

37-
class Timer {
38-
public:
39-
Timer();
40-
virtual ~Timer();
52+
virtual ~Logger();
4153

42-
void start();
43-
double stop();
54+
virtual Level level() const;
4455

45-
private:
46-
TimerImpl *impl_;
56+
virtual void log(Level level, const std::string &message) = 0;
57+
protected:
58+
Level level_;
4759
};
4860

49-
} /* namespace libfreenect2 */
61+
LIBFREENECT2_API Logger *createConsoleLogger(Logger::Level level);
62+
LIBFREENECT2_API Logger *createConsoleLoggerWithDefaultLevel();
5063

51-
#endif /* TIMER_H_ */
64+
//libfreenect2 frees the memory of the logger passed in.
65+
LIBFREENECT2_API Logger *getGlobalLogger();
66+
LIBFREENECT2_API void setGlobalLogger(Logger *logger);
67+
68+
} /* namespace libfreenect2 */
69+
#endif /* LIBFREENECT2_LOGGER_H_ */
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* This file is part of the OpenKinect Project. http://www.openkinect.org
3+
*
4+
* Copyright (c) 2014 individual OpenKinect contributors. See the CONTRIB file
5+
* for details.
6+
*
7+
* This code is licensed to you under the terms of the Apache License, version
8+
* 2.0, or, at your option, the terms of the GNU General Public License,
9+
* version 2.0. See the APACHE20 and GPL2 files for the text of the licenses,
10+
* or the following URLs:
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
* http://www.gnu.org/licenses/gpl-2.0.txt
13+
*
14+
* If you redistribute this file in source form, modified or unmodified, you
15+
* may:
16+
* 1) Leave this header intact and distribute it under the same terms,
17+
* accompanying it with the APACHE20 and GPL20 files, or
18+
* 2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or
19+
* 3) Delete the GPL v2 clause and accompany it with the APACHE20 file
20+
* In all cases you must keep the copyright notice intact and include a copy
21+
* of the CONTRIB file.
22+
*
23+
* Binary distributions must follow the binary distribution requirements of
24+
* either License.
25+
*/
26+
27+
#ifndef LOGGING_H_
28+
#define LOGGING_H_
29+
30+
#include <string>
31+
#include <sstream>
32+
33+
#include <libfreenect2/config.h>
34+
#include <libfreenect2/logger.h>
35+
36+
namespace libfreenect2
37+
{
38+
39+
class WithPerfLoggingImpl;
40+
41+
class WithPerfLogging
42+
{
43+
public:
44+
WithPerfLogging();
45+
virtual ~WithPerfLogging();
46+
void startTiming();
47+
std::ostream &stopTiming(std::ostream &stream);
48+
private:
49+
WithPerfLoggingImpl *impl_;
50+
};
51+
52+
class LogMessage
53+
{
54+
private:
55+
Logger *logger_;
56+
Logger::Level level_;
57+
std::ostringstream stream_;
58+
public:
59+
LogMessage(Logger *logger, Logger::Level level);
60+
~LogMessage();
61+
62+
std::ostream &stream();
63+
};
64+
65+
std::string getShortName(const char *func);
66+
67+
} /* namespace libfreenect2 */
68+
69+
#if defined(__GNUC__) or defined(__clang__)
70+
#define LOG_SOURCE ::libfreenect2::getShortName(__PRETTY_FUNCTION__)
71+
#elif defined(_MSC_VER)
72+
#define LOG_SOURCE ::libfreenect2::getShortName(__FUNCSIG__)
73+
#else
74+
#define LOG_SOURCE ""
75+
#endif
76+
77+
#define LOG(LEVEL) (::libfreenect2::LogMessage(::libfreenect2::getGlobalLogger(), ::libfreenect2::Logger::LEVEL).stream() << "[" << LOG_SOURCE << "] ")
78+
#define LOG_DEBUG LOG(Debug)
79+
#define LOG_INFO LOG(Info)
80+
#define LOG_WARNING LOG(Warning)
81+
#define LOG_ERROR LOG(Error)
82+
83+
#endif /* LOGGING_H_ */

examples/protonect/include/libfreenect2/packet_processor.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
#ifndef PACKET_PROCESSOR_H_
2828
#define PACKET_PROCESSOR_H_
2929

30-
#include <libfreenect2/timer.h>
31-
3230
namespace libfreenect2
3331
{
3432

examples/protonect/src/command_transaction.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
*/
2626

2727
#include <libfreenect2/protocol/command_transaction.h>
28+
#include <libfreenect2/logging.h>
2829

2930
#include <stdint.h>
30-
#include <iostream>
3131

3232
namespace libfreenect2
3333
{
@@ -106,7 +106,7 @@ void CommandTransaction::execute(const CommandBase& command, Result& result)
106106

107107
if(complete)
108108
{
109-
std::cerr << "[CommandTransaction::execute] received premature response complete!" << std::endl;
109+
LOG_ERROR << "received premature response complete!";
110110
result.code = Error;
111111
}
112112

@@ -119,7 +119,7 @@ void CommandTransaction::execute(const CommandBase& command, Result& result)
119119

120120
if(!complete)
121121
{
122-
std::cerr << "[CommandTransaction::execute] missing response complete!" << std::endl;
122+
LOG_ERROR << "missing response complete!";
123123
result.code = Error;
124124
}
125125

@@ -135,13 +135,13 @@ CommandTransaction::ResultCode CommandTransaction::send(const CommandBase& comma
135135

136136
if(r != LIBUSB_SUCCESS)
137137
{
138-
std::cerr << "[CommandTransaction::send] bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r) << std::endl;
138+
LOG_ERROR << "bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r);
139139
code = Error;
140140
}
141141

142142
if(transferred_bytes != command.size())
143143
{
144-
std::cerr << "[CommandTransaction::send] sent number of bytes differs from expected number! expected: " << command.size() << " got: " << transferred_bytes << std::endl;
144+
LOG_ERROR << "sent number of bytes differs from expected number! expected: " << command.size() << " got: " << transferred_bytes;
145145
code = Error;
146146
}
147147

@@ -157,7 +157,7 @@ void CommandTransaction::receive(CommandTransaction::Result& result)
157157

158158
if(r != LIBUSB_SUCCESS)
159159
{
160-
std::cerr << "[CommandTransaction::receive] bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r) << std::endl;
160+
LOG_ERROR << "bulk transfer failed! libusb error " << r << ": " << libusb_error_name(r);
161161
result.code = Error;
162162
}
163163
}
@@ -176,7 +176,7 @@ bool CommandTransaction::isResponseCompleteResult(CommandTransaction::Result& re
176176

177177
if(data[1] != sequence)
178178
{
179-
std::cerr << "[CommandTransaction::isResponseCompleteResult] response complete with wrong sequence number! expected: " << sequence << " got: " << data[1]<< std::endl;
179+
LOG_ERROR << "response complete with wrong sequence number! expected: " << sequence << " got: " << data[1];
180180
}
181181
}
182182
}

0 commit comments

Comments
 (0)