functionality of class Dump integrated into BusCommand.

This commit is contained in:
Roland Jax
2014-11-20 08:15:00 +01:00
parent 84bd787fbb
commit 61d618825b
5 changed files with 63 additions and 131 deletions
+1 -3
View File
@@ -6,9 +6,7 @@ AM_CXXFLAGS = -fpic \
bin_PROGRAMS = ebusd
ebusd_SOURCES = dump.cpp \
dump.h \
busloop.cpp \
ebusd_SOURCES = busloop.cpp \
busloop.h \
network.cpp \
network.h \
+29 -5
View File
@@ -20,6 +20,7 @@
#include "busloop.h"
#include "logger.h"
#include "appl.h"
#include <fstream>
#include <iomanip>
extern Logger& L;
@@ -78,8 +79,9 @@ BusLoop::BusLoop(Commands* commands)
if (m_port->isOpen() == false)
L.log(bus, error, "can't open %s", A.getOptVal<const char*>("device"));
m_dump = new Dump(A.getOptVal<const char*>("dumpfile"), A.getOptVal<long>("dumpsize"));
m_dumpState = A.getOptVal<bool>("dump");
m_dumpFile = A.getOptVal<const char*>("dumpfile");
m_dumpSize = A.getOptVal<long>("dumpsize");
m_dumping = A.getOptVal<bool>("dump");
m_logRawData = A.getOptVal<bool>("lograwdata");
@@ -100,7 +102,6 @@ BusLoop::~BusLoop()
m_port->close();
delete m_port;
delete m_dump;
}
void* BusLoop::run()
@@ -234,6 +235,29 @@ void* BusLoop::run()
return NULL;
}
int BusLoop::writeDumpFile(const char* byte)
{
int ret = 0;
std::ofstream fs(m_dumpFile.c_str(), std::ios::out | std::ios::binary | std::ios::app);
if (fs == 0)
return -1;
fs.write(byte, 1);
if (fs.tellp() >= m_dumpSize * 1024) {
std::string oldfile;
oldfile += m_dumpFile;
oldfile += ".old";
ret = rename(m_dumpFile.c_str(), oldfile.c_str());
}
fs.close();
return ret;
}
unsigned char BusLoop::fetchByte()
{
unsigned char byte;
@@ -241,8 +265,8 @@ unsigned char BusLoop::fetchByte()
// fetch byte
byte = m_port->byte();
if (m_dumpState == true)
m_dump->write((const char*) &byte);
if (m_dumping == true)
writeDumpFile((const char*) &byte);
if (m_logRawData == true)
L.log(bus, event, "%02x", byte);
+33 -9
View File
@@ -22,7 +22,6 @@
#include "commands.h"
#include "port.h"
#include "dump.h"
#include "wqueue.h"
#include "thread.h"
#include "symbol.h"
@@ -31,7 +30,7 @@
/** the maximum time [us] allowed for retrieving a byte from an addressed slave */
#define RECV_TIMEOUT 10000
enum MessageType { invalid, broadcast, masterMaster, masterSlave };
enum CommandType { invalid, broadcast, masterMaster, masterSlave };
class BusMessage
{
@@ -40,7 +39,7 @@ public:
BusMessage(const std::string command, const bool poll, const bool scan);
~BusMessage();
MessageType getType() const { return m_type; }
CommandType getType() const { return m_type; }
bool isPoll() const { return m_poll; }
bool isScan() const { return m_scan; }
@@ -58,7 +57,7 @@ public:
void sendSignal() { pthread_cond_signal(&m_cond); }
private:
MessageType m_type;
CommandType m_type;
bool m_poll;
bool m_scan;
SymbolString m_command;
@@ -82,19 +81,37 @@ public:
void addMessage(BusMessage* message) { m_busQueue.add(message); }
void dump() { m_dumpState == true ? m_dumpState = false : m_dumpState = true ; }
void raw() { m_logRawData == true ? m_logRawData = false : m_logRawData = true ; }
void reload(Commands* commands) { m_commands = commands; }
void scan(const bool full=false) { m_scan = true; m_scanFull = full; m_scanIndex = 0; }
void raw() { m_logRawData == true ? m_logRawData = false : m_logRawData = true ; }
/**
* @brief set the name of dump file.
* @param name the file name of dump file.
*/
void setDumpFile(const std::string& dumpFile) { m_dumpFile = dumpFile; }
/**
* @brief set the max size of dump file.
* @param size the max. size of the dump file, before switching.
*/
void setDumpSize(const long dumpSize) { m_dumpSize = dumpSize; }
void dump() { m_dumping == true ? m_dumping = false : m_dumping = true ; }
private:
Commands* m_commands;
Port* m_port;
Dump* m_dump;
bool m_dumpState;
/** the name of dump file*/
std::string m_dumpFile;
/** max. size of dump file */
long m_dumpSize;
bool m_dumping;
bool m_logRawData;
@@ -118,6 +135,13 @@ private:
bool m_scanFull;
size_t m_scanIndex;
/**
* @brief write byte to dump file.
* @param byte to write
* @return -1 if dump file cannot opened or renaming of dump file failed.
*/
int writeDumpFile(const char* byte);
unsigned char fetchByte();
void collectCycData(const int numRecv);
void analyseCycData();
-46
View File
@@ -1,46 +0,0 @@
/*
* Copyright (C) Roland Jax 2012-2014 <ebusd@liwest.at>
*
* This file is part of ebusd.
*
* ebusd is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ebusd is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ebusd. If not, see http://www.gnu.org/licenses/.
*/
#include "dump.h"
#include <fstream>
#include <cstdio>
int Dump::write(const char* byte)
{
int ret = 0;
std::ofstream fs(m_name.c_str(), std::ios::out | std::ios::binary | std::ios::app);
if (fs == 0)
return -1;
fs.write(byte, 1);
if (fs.tellp() >= m_size * 1024) {
std::string oldfile;
oldfile += m_name;
oldfile += ".old";
ret = rename(m_name.c_str(), oldfile.c_str());
}
fs.close();
return ret;
}
-68
View File
@@ -1,68 +0,0 @@
/*
* Copyright (C) Roland Jax 2012-2014 <ebusd@liwest.at>
*
* This file is part of ebusd.
*
* ebusd is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ebusd is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ebusd. If not, see http://www.gnu.org/licenses/.
*/
#ifndef DUMP_H_
#define DUMP_H_
#include <string>
/**
* @brief class for writing raw bytes to binary file.
*/
class Dump
{
public:
/**
* @brief create a new instance to write dump files.
* @param name the file name of dump file.
* @param size the max. size of the dump file, before switching.
*/
Dump(std::string name, long size)
: m_name(name), m_size(size) {}
/**
* @brief write byte to dump file.
* @param byte to write
* @return -1 if dump file cannot opened or renaming of dump file failed.
*/
int write(const char* byte);
/**
* @brief set the name of dump file.
* @param name the file name of dump file.
*/
void setName(const std::string& name) { m_name = name; }
/**
* @brief set the max size of dump file.
* @param size the max. size of the dump file, before switching.
*/
void setSize(const long size) { m_size = size; }
private:
/** the name of dump file*/
std::string m_name;
/** max. size of dump file */
long m_size;
};
#endif // DUMP_H_