mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-18 04:33:33 +08:00
Added POSIX File event tracer
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2015 David Sidrane <david_s5@nscdg.net>
|
||||||
|
#
|
||||||
|
|
||||||
|
LIBUAVCAN_POSIX_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
|
|
||||||
|
LIBUAVCAN_POSIX_INC := $(LIBUAVCAN_POSIX_DIR)include/
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <uavcan/protocol/dynamic_node_id_server/event.hpp>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
namespace uavcan_posix
|
||||||
|
{
|
||||||
|
namespace dynamic_node_id_server
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* This interface implements a POSIX compliant file based IEventTracer interface
|
||||||
|
*/
|
||||||
|
class FileEventTracer : public uavcan::dynamic_node_id_server::IEventTracer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Maximum length of full path to log file
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum { MaxPathLength = 128, FormatBufferLength = 64 };
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This type is used for the path
|
||||||
|
*/
|
||||||
|
typedef uavcan::Array<uavcan::IntegerSpec<8, uavcan::SignednessUnsigned, uavcan::CastModeTruncate>,
|
||||||
|
uavcan::ArrayModeDynamic, MaxPathLength> PathString;
|
||||||
|
|
||||||
|
|
||||||
|
PathString path_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
FileEventTracer() { }
|
||||||
|
|
||||||
|
virtual void onEvent(uavcan::dynamic_node_id_server::TraceCode code, uavcan::int64_t argument)
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
|
int fd = open(path_.c_str(), O_WRONLY | O_CREAT | O_APPEND);
|
||||||
|
if (fd >= 0 )
|
||||||
|
{
|
||||||
|
char buffer[FormatBufferLength + 1];
|
||||||
|
int n = snprintf(buffer, FormatBufferLength, "%d.%ld,%d,%lld\n", ts.tv_sec, ts.tv_nsec, code, argument);
|
||||||
|
write(fd, buffer, n);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Initializes the File based event trace
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int init(const PathString & path)
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int rv = -uavcan::ErrInvalidParam;
|
||||||
|
|
||||||
|
if (path.size() > 0)
|
||||||
|
{
|
||||||
|
path_ = path.c_str();
|
||||||
|
rv = open(path_.c_str(), O_WRONLY | O_CREAT | O_TRUNC);
|
||||||
|
close(rv);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
-5
@@ -94,16 +94,16 @@ public:
|
|||||||
* Initializes the File based back end storage by passing to a path to
|
* Initializes the File based back end storage by passing to a path to
|
||||||
* the directory where the key named files will be stored.
|
* the directory where the key named files will be stored.
|
||||||
* This the return result should be 0 on success.
|
* This the return result should be 0 on success.
|
||||||
* If it is -EFBIG then the the path name is too long to
|
* If it is -ErrInvalidConfiguration then the the path name is too long to
|
||||||
* Accommodate the trailing slash and max key length;
|
* Accommodate the trailing slash and max key length;
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int init(const String & path)
|
int init(const PathString & path)
|
||||||
{
|
{
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
int rv = -EINVAL;
|
int rv = -uavcan::ErrInvalidParam;
|
||||||
|
|
||||||
if (path.size() > 0)
|
if (path.size() > 0)
|
||||||
{
|
{
|
||||||
@@ -115,8 +115,8 @@ public:
|
|||||||
base_path.pop_back();
|
base_path.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
|
||||||
if (stat(base_path.c_str(), &sb) != 0 || !S_ISDIR(sb.st_mode))
|
if (stat(base_path.c_str(), &sb) != 0 || !S_ISDIR(sb.st_mode))
|
||||||
{
|
{
|
||||||
rv = mkdir(base_path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
|
rv = mkdir(base_path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
@@ -124,7 +124,7 @@ public:
|
|||||||
base_path.push_back('/');
|
base_path.push_back('/');
|
||||||
if ((base_path.size() + MaxStringLength) > MaxPathLength)
|
if ((base_path.size() + MaxStringLength) > MaxPathLength)
|
||||||
{
|
{
|
||||||
rv = -EFBIG;
|
rv = -uavcan::ErrInvalidConfiguration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
Reference in New Issue
Block a user