qpidctrl  0.7.1
qpidlogger.cpp
Go to the documentation of this file.
1 #include "qpiddebug.h"
2 #include "qpidlogger.h"
3 #include "qpidcontroller.h"
4 #include <QThread>
5 #include <stdio.h>
6 #include <errno.h>
7 
8 QPidLogger::QPidLogger(QcepSettingsSaverWPtr saver, QPidControllerWPtr ctrl) :
9  m_ObjectNamer(this, "logger"),
10  m_Saver(saver),
11  m_Controller(ctrl),
12  m_File(NULL),
13  m_Enabled(m_Saver, this, "enabled", true, "Logging Enabled?"),
14  m_FileName(m_Saver, this, "fileName", "pidctrl.log", "Log file name"),
15  m_UpdateInterval(m_Saver, this, "updateInterval", 30, "Logging interval (seconds)"),
16  m_PointLimit(m_Saver, this, "pointLimit", 0, "Start new log scan after this many points"),
17  m_ScanNumber(m_Saver, this, "scanNumber", 0, "Log file scan number"),
18  m_PointCount(QcepSettingsSaverPtr(), this, "pointCount", 0, "Number of points in current log scan"),
19  m_ChannelNames(QcepSettingsSaverPtr(), this, "channelNames", QStringList(), "Log File Column Names")
20 {
21  connect(prop_FileName(), SIGNAL(valueChanged(QString,int)), this, SLOT(onFilenameChanged(QString, int)));
22 }
23 
24 void QPidLogger::logChannelNames(QStringList names)
25 {
26  if (QThread::currentThread() != thread()) {
27  INVOKE_CHECK(QMetaObject::invokeMethod(this, "logChannelNames", Q_ARG(QStringList, names)));
28  } else {
29  if (qcepDebug(DEBUG_LOGGER)) {
30  printMessage(tr("QPidLogger::logChannelNames %1 ,...").arg(names.value(0)));
31  }
32 
33  set_ChannelNames(names);
34  }
35 }
36 
37 void QPidLogger::logChannelValues(QcepDoubleList values)
38 {
39  if (QThread::currentThread() != thread()) {
40  INVOKE_CHECK(QMetaObject::invokeMethod(this, "logChannelValues", Q_ARG(QcepDoubleList, values)));
41  } else {
42  if (qcepDebug(DEBUG_LOGGER)) {
43  printMessage(tr("QPidLogger::logChannelValues %1 ,...").arg(values.value(0)));
44  }
45 
46  if (get_Enabled()) {
48 
49  if (m_File) {
50  if (get_PointCount() == 0) {
51  QStringList names = get_ChannelNames();
52 
53  int n = names.length();
54 
55  fprintf(m_File, "#S %d qpid timescan \"%s\" %g\n",
56  get_ScanNumber(),
57  qPrintable(get_FileName()),
58  get_UpdateInterval());
59 
60  fprintf(m_File, "#D %s\n", qPrintable(QDateTime::currentDateTime().toString("ddd MMM d hh:mm:ss yyyy")));
61  fprintf(m_File, "#N %d\n", n);
62  fprintf(m_File, "#L ");
63 
64  if (n) {
65  fprintf(m_File, "%s", qPrintable(names[0]));
66  }
67 
68  for (int i=1; i<n; i++) {
69  fprintf(m_File, " %s", qPrintable(names[i]));
70  }
71 
72  fprintf(m_File, "\n");
73  fflush(m_File);
74 
75  prop_ScanNumber()->incValue(1);
76  }
77 
78  int n = values.length();
79 
80  if (n) {
81  fprintf(m_File, "%0.15g", values.value(0));
82  }
83 
84  for (int i=1; i<n; i++) {
85  fprintf(m_File, "\t%0.15g", values.value(i));
86  }
87 
88  fprintf(m_File, "\n");
89  fflush(m_File);
90 
91  prop_PointCount()->incValue(1);
92 
93  if ((get_PointLimit() > 0) && (get_PointCount() > get_PointLimit())) {
94  set_PointCount(0);
95  }
96  }
97  }
98  }
99 }
100 
101 void QPidLogger::logString(QString str)
102 {
103  if (QThread::currentThread() != thread()) {
104  INVOKE_CHECK(QMetaObject::invokeMethod(this, "logString", Q_ARG(QString, str)));
105  } else {
106  if (qcepDebug(DEBUG_LOGGER)) {
107  printMessage(tr("QPidLogger::logString %1 ,...").arg(str));
108  }
109 
110  if (get_Enabled()) {
112 
113  if (m_File) {
114  fprintf(m_File, "#C %s. %s.\n", qPrintable(QDateTime::currentDateTime().toString("ddd MMM d hh:mm:ss yyyy")),
115  qPrintable(str));
116  fflush(m_File);
117  }
118  }
119  }
120 }
121 
123 {
124  if (m_File == NULL) {
125  FILE *f = fopen(qPrintable(get_FileName()), "a+");
126 
127  if (f) {
128  m_File = f;
129 
130  rewind(m_File);
131 
132  char buff[4096];
133  int scan=0;
134 
135  do {
136  fgets(buff, sizeof(buff), m_File);
137 
138  if (ferror(m_File)) {
139  printMessage(tr("File error %1").arg(errno));
140  }
141 
142  if (sscanf(buff, "#S %d", &scan) == 1) {
143  set_ScanNumber(scan+1);
144  }
145  } while(!feof(m_File));
146 
147  fprintf(m_File, "#F %s\n", qPrintable(get_FileName()));
148  fprintf(m_File, "#E %d\n", QDateTime::currentDateTime().toTime_t());
149  fprintf(m_File, "#D %s\n", qPrintable(QDateTime::currentDateTime().toString("ddd MMM d hh:mm:ss yyyy")));
150  fflush(m_File);
151  } else {
152  printMessage("Couldn't open log file");
153  set_Enabled(false);
154  }
155  }
156 }
157 
158 void QPidLogger::onFilenameChanged(QString /*name*/, int /*n*/)
159 {
160  if (m_File) {
161  fclose(m_File);
162 
163  m_File = NULL;
164  }
165 }
166 
167 void QPidLogger::printMessage(QString msg, QDateTime ts)
168 {
170 
171  if (ctl) {
172  ctl->printMessage(msg, ts);
173  }
174 }
175 
176 void QPidLogger::writeSettings(QSettings *set, QString section)
177 {
178  QcepProperty::writeSettings(this, &staticMetaObject, section, set);
179 }
180 
181 void QPidLogger::readSettings(QSettings *set, QString section)
182 {
183  QcepProperty::readSettings(this, &staticMetaObject, section, set);
184 }
185 
QPidObjectNamer m_ObjectNamer
Definition: qpidlogger.h:36
QPidLogger(QcepSettingsSaverWPtr saver, QPidControllerWPtr ctrl)
Definition: qpidlogger.cpp:8
QWeakPointer< QPidController > QPidControllerWPtr
QSharedPointer< QPidController > QPidControllerPtr
void logChannelNames(QStringList names)
Definition: qpidlogger.cpp:24
void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())
Definition: qpidlogger.cpp:167
void logChannelValues(QcepDoubleList values)
Definition: qpidlogger.cpp:37
void openLogFileIfNeeded()
Definition: qpidlogger.cpp:122
QPidControllerWPtr m_Controller
Definition: qpidlogger.h:38
void readSettings(QSettings *set, QString section)
Definition: qpidlogger.cpp:181
void writeSettings(QSettings *set, QString section)
Definition: qpidlogger.cpp:176
void logString(QString str)
Definition: qpidlogger.cpp:101
QcepSettingsSaverWPtr m_Saver
Definition: qpidlogger.h:37
FILE * m_File
Definition: qpidlogger.h:39
void onFilenameChanged(QString name, int n)
Definition: qpidlogger.cpp:158