You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/ksysguard/gui/SensorDisplayLib/SensorLogger.cc

438 lines
11 KiB

/*
KSysGuard, the KDE System Guard
Copyright (c) 2001 Tobias Koenig <tokoe@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of version 2 of the GNU General Public
License as published by the Free Software Foundation.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <kapplication.h>
#include <kiconloader.h>
#include <klocale.h>
#include <ksgrd/SensorManager.h>
#include <ksgrd/StyleEngine.h>
#include <tqfile.h>
#include "SensorLogger.moc"
#include "SensorLoggerSettings.h"
SLListViewItem::SLListViewItem(TQListView *parent)
: TQListViewItem(parent)
{
}
LogSensor::LogSensor(TQListView *parent)
: timerID( NONE ), lowerLimitActive( 0 ), upperLimitActive( 0 ),
lowerLimit( 0 ), upperLimit( 0 )
{
TQ_CHECK_PTR(parent);
monitor = parent;
lvi = new SLListViewItem(monitor);
TQ_CHECK_PTR(lvi);
pixmap_running = UserIcon( "running" );
pixmap_waiting = UserIcon( "waiting" );
lvi->setPixmap(0, pixmap_waiting);
lvi->setTextColor(monitor->colorGroup().text());
monitor->insertItem(lvi);
}
LogSensor::~LogSensor(void)
{
if ((lvi) && (monitor))
delete lvi;
}
void
LogSensor::startLogging(void)
{
lvi->setPixmap(0, pixmap_running);
timerOn();
}
void
LogSensor::stopLogging(void)
{
lvi->setPixmap(0, pixmap_waiting);
lvi->setTextColor(monitor->colorGroup().text());
lvi->repaint();
timerOff();
}
void
LogSensor::timerEvent(TQTimerEvent*)
{
KSGRD::SensorMgr->sendRequest(hostName, sensorName, (KSGRD::SensorClient*) this, 42);
}
void
LogSensor::answerReceived(int id, const TQString& answer)
{
TQFile logFile(fileName);
if (!logFile.open(IO_ReadWrite | IO_Append))
{
stopLogging();
return;
}
switch (id)
{
case 42: {
TQTextStream stream(&logFile);
double value = answer.toDouble();
if (lowerLimitActive && value < lowerLimit)
{
timerOff();
lowerLimitActive = false;
lvi->setTextColor(monitor->colorGroup().foreground());
lvi->repaint();
KNotifyClient::event(monitor->winId(), "sensor_alarm", TQString("sensor '%1' at '%2' reached lower limit").arg(sensorName).arg(hostName));
timerOn();
} else if (upperLimitActive && value > upperLimit)
{
timerOff();
upperLimitActive = false;
lvi->setTextColor(monitor->colorGroup().foreground());
lvi->repaint();
KNotifyClient::event(monitor->winId(), "sensor_alarm", TQString("sensor '%1' at '%2' reached upper limit").arg(sensorName).arg(hostName));
timerOn();
}
TQDate date = TQT_TQDATE_OBJECT(TQDateTime::currentDateTime().date());
TQTime time = TQT_TQTIME_OBJECT(TQDateTime::currentDateTime().time());
stream << TQString("%1 %2 %3 %4 %5: %6\n").arg(date.shortMonthName(date.month())).arg(date.day()).arg(time.toString()).arg(hostName).arg(sensorName).arg(value);
}
}
logFile.close();
}
SensorLogger::SensorLogger(TQWidget *parent, const char *name, const TQString& title)
: KSGRD::SensorDisplay(parent, name, title)
{
monitor = new TQListView(this, "monitor");
TQ_CHECK_PTR(monitor);
monitor->addColumn(i18n("Logging"));
monitor->addColumn(i18n("Timer Interval"));
monitor->addColumn(i18n("Sensor Name"));
monitor->addColumn(i18n("Host Name"));
monitor->addColumn(i18n("Log File"));
TQColorGroup cgroup = monitor->colorGroup();
cgroup.setColor(TQColorGroup::Text, KSGRD::Style->firstForegroundColor());
cgroup.setColor(TQColorGroup::Base, KSGRD::Style->backgroundColor());
cgroup.setColor(TQColorGroup::Foreground, KSGRD::Style->alarmColor());
monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
monitor->setSelectionMode(TQListView::NoSelection);
connect(monitor, TQT_SIGNAL(rightButtonClicked(TQListViewItem*, const TQPoint&, int)), this, TQT_SLOT(RMBClicked(TQListViewItem*, const TQPoint&, int)));
setTitle(i18n("Sensor Logger"));
logSensors.setAutoDelete(true);
setPlotterWidget(monitor);
setMinimumSize(50, 25);
setModified(false);
}
SensorLogger::~SensorLogger(void)
{
}
bool
SensorLogger::addSensor(const TQString& hostName, const TQString& sensorName, const TQString& sensorType, const TQString&)
{
if (sensorType != "integer" && sensorType != "float")
return (false);
sld = new SensorLoggerDlg(this, "SensorLoggerDlg");
TQ_CHECK_PTR(sld);
if (sld->exec()) {
if (!sld->fileName().isEmpty()) {
LogSensor *sensor = new LogSensor(monitor);
TQ_CHECK_PTR(sensor);
sensor->setHostName(hostName);
sensor->setSensorName(sensorName);
sensor->setFileName(sld->fileName());
sensor->setTimerInterval(sld->timerInterval());
sensor->setLowerLimitActive(sld->lowerLimitActive());
sensor->setUpperLimitActive(sld->upperLimitActive());
sensor->setLowerLimit(sld->lowerLimit());
sensor->setUpperLimit(sld->upperLimit());
logSensors.append(sensor);
setModified(true);
}
}
delete sld;
sld = 0;
return (true);
}
bool
SensorLogger::editSensor(LogSensor* sensor)
{
sld = new SensorLoggerDlg(this, "SensorLoggerDlg");
TQ_CHECK_PTR(sld);
sld->setFileName(sensor->getFileName());
sld->setTimerInterval(sensor->getTimerInterval());
sld->setLowerLimitActive(sensor->getLowerLimitActive());
sld->setLowerLimit(sensor->getLowerLimit());
sld->setUpperLimitActive(sensor->getUpperLimitActive());
sld->setUpperLimit(sensor->getUpperLimit());
if (sld->exec()) {
if (!sld->fileName().isEmpty()) {
sensor->setFileName(sld->fileName());
sensor->setTimerInterval(sld->timerInterval());
sensor->setLowerLimitActive(sld->lowerLimitActive());
sensor->setUpperLimitActive(sld->upperLimitActive());
sensor->setLowerLimit(sld->lowerLimit());
sensor->setUpperLimit(sld->upperLimit());
setModified(true);
}
}
delete sld;
sld = 0;
return (true);
}
void
SensorLogger::configureSettings()
{
TQColorGroup cgroup = monitor->colorGroup();
sls = new SensorLoggerSettings(this, "SensorLoggerSettings");
TQ_CHECK_PTR(sls);
connect( sls, TQT_SIGNAL( applyClicked() ), TQT_SLOT( applySettings() ) );
sls->setTitle(title());
sls->setForegroundColor(cgroup.text());
sls->setBackgroundColor(cgroup.base());
sls->setAlarmColor(cgroup.foreground());
if (sls->exec())
applySettings();
delete sls;
sls = 0;
}
void
SensorLogger::applySettings()
{
TQColorGroup cgroup = monitor->colorGroup();
setTitle(sls->title());
cgroup.setColor(TQColorGroup::Text, sls->foregroundColor());
cgroup.setColor(TQColorGroup::Base, sls->backgroundColor());
cgroup.setColor(TQColorGroup::Foreground, sls->alarmColor());
monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
setModified(true);
}
void
SensorLogger::applyStyle(void)
{
TQColorGroup cgroup = monitor->colorGroup();
cgroup.setColor(TQColorGroup::Text, KSGRD::Style->firstForegroundColor());
cgroup.setColor(TQColorGroup::Base, KSGRD::Style->backgroundColor());
cgroup.setColor(TQColorGroup::Foreground, KSGRD::Style->alarmColor());
monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
setModified(true);
}
bool
SensorLogger::restoreSettings(TQDomElement& element)
{
TQColorGroup cgroup = monitor->colorGroup();
cgroup.setColor(TQColorGroup::Text, restoreColor(element, "textColor", Qt::green));
cgroup.setColor(TQColorGroup::Base, restoreColor(element, "backgroundColor", Qt::black));
cgroup.setColor(TQColorGroup::Foreground, restoreColor(element, "alarmColor", Qt::red));
monitor->setPalette(TQPalette(cgroup, cgroup, cgroup));
logSensors.clear();
TQDomNodeList dnList = element.elementsByTagName("logsensors");
for (uint i = 0; i < dnList.count(); i++) {
TQDomElement element = dnList.item(i).toElement();
LogSensor* sensor = new LogSensor(monitor);
TQ_CHECK_PTR(sensor);
sensor->setHostName(element.attribute("hostName"));
sensor->setSensorName(element.attribute("sensorName"));
sensor->setFileName(element.attribute("fileName"));
sensor->setTimerInterval(element.attribute("timerInterval").toInt());
sensor->setLowerLimitActive(element.attribute("lowerLimitActive").toInt());
sensor->setLowerLimit(element.attribute("lowerLimit").toDouble());
sensor->setUpperLimitActive(element.attribute("upperLimitActive").toInt());
sensor->setUpperLimit(element.attribute("upperLimit").toDouble());
logSensors.append(sensor);
}
SensorDisplay::restoreSettings(element);
setModified(false);
return (true);
}
bool
SensorLogger::saveSettings(TQDomDocument& doc, TQDomElement& element, bool save)
{
saveColor(element, "textColor", monitor->colorGroup().text());
saveColor(element, "backgroundColor", monitor->colorGroup().base());
saveColor(element, "alarmColor", monitor->colorGroup().foreground());
for (LogSensor* sensor = logSensors.first(); sensor != 0; sensor = logSensors.next())
{
TQDomElement log = doc.createElement("logsensors");
log.setAttribute("sensorName", sensor->getSensorName());
log.setAttribute("hostName", sensor->getHostName());
log.setAttribute("fileName", sensor->getFileName());
log.setAttribute("timerInterval", sensor->getTimerInterval());
log.setAttribute("lowerLimitActive", TQString("%1").arg(sensor->getLowerLimitActive()));
log.setAttribute("lowerLimit", TQString("%1").arg(sensor->getLowerLimit()));
log.setAttribute("upperLimitActive", TQString("%1").arg(sensor->getUpperLimitActive()));
log.setAttribute("upperLimit", TQString("%1").arg(sensor->getUpperLimit()));
element.appendChild(log);
}
SensorDisplay::saveSettings(doc, element);
if (save)
setModified(false);
return (true);
}
void
SensorLogger::answerReceived(int, const TQString&)
{
// we do not use this, since all answers are received by the LogSensors
}
void
SensorLogger::resizeEvent(TQResizeEvent*)
{
frame()->setGeometry(0, 0, this->width(), this->height());
monitor->setGeometry(10, 20, this->width() - 20, this->height() - 30);
}
LogSensor*
SensorLogger::getLogSensor(TQListViewItem* item)
{
for (LogSensor* sensor = logSensors.first(); sensor != 0; sensor = logSensors.next())
{
if (item == sensor->getListViewItem()) {
return sensor;
}
}
return NULL;
}
void
SensorLogger::RMBClicked(TQListViewItem* item, const TQPoint& point, int)
{
TQPopupMenu pm;
if (hasSettingsDialog())
pm.insertItem(i18n("&Properties"), 1);
pm.insertItem(i18n("&Remove Display"), 2);
pm.insertSeparator(-1);
pm.insertItem(i18n("&Remove Sensor"), 3);
pm.insertItem(i18n("&Edit Sensor..."), 4);
if ( !item )
{
pm.setItemEnabled( 3, false );
pm.setItemEnabled( 4, false );
}
else
{
LogSensor* sensor = getLogSensor(item);
if ( sensor->isLogging() )
pm.insertItem(i18n("St&op Logging"), 6);
else
pm.insertItem(i18n("S&tart Logging"), 5);
}
switch (pm.exec(point))
{
case 1:
configureSettings();
break;
case 2: {
TQCustomEvent* ev = new TQCustomEvent(TQEvent::User);
ev->setData(this);
kapp->postEvent(parent(), ev);
break;
}
case 3: {
LogSensor* sensor = getLogSensor(item);
if (sensor)
logSensors.remove(sensor);
break;
}
case 4: {
LogSensor* sensor = getLogSensor(item);
if (sensor)
editSensor(sensor);
break;
}
case 5: {
LogSensor* sensor = getLogSensor(item);
if (sensor)
sensor->startLogging();
break;
}
case 6: {
LogSensor* sensor = getLogSensor(item);
if (sensor)
sensor->stopLogging();
break;
}
}
}