Added POSIX File event tracer

This commit is contained in:
David Sidrane 2015-05-12 13:18:59 -10:00
parent adeb1ef58f
commit e43cf6b553
3 changed files with 88 additions and 5 deletions

View File

@ -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/

View File

@ -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;
}
};
}
}

View File

@ -94,16 +94,16 @@ public:
* Initializes the File based back end storage by passing to a path to
* the directory where the key named files will be stored.
* 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;
*
*/
int init(const String & path)
int init(const PathString & path)
{
using namespace std;
int rv = -EINVAL;
int rv = -uavcan::ErrInvalidParam;
if (path.size() > 0)
{
@ -115,8 +115,8 @@ public:
base_path.pop_back();
}
rv = 0;
struct stat sb;
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);
@ -124,7 +124,7 @@ public:
base_path.push_back('/');
if ((base_path.size() + MaxStringLength) > MaxPathLength)
{
rv = -EFBIG;
rv = -uavcan::ErrInvalidConfiguration;
}
}
return rv;