Get uptime from sys/sysinfo.h instead of parsing uptime output. Fixes #2

This commit is contained in:
Mikko Ahlroth 2014-02-01 20:22:34 +02:00
parent f63db9fdb1
commit 0c463f24bf
12 changed files with 253 additions and 40 deletions

View file

@ -10,10 +10,14 @@ TARGET = harbour-sailtime
CONFIG += sailfishapp CONFIG += sailfishapp
HEADERS += src/uptimechecker.h HEADERS += src/uptimechecker.h \
src/sysinfoc.h \
src/sysload.h
SOURCES += src/harbour-sailtime.cpp \ SOURCES += src/harbour-sailtime.cpp \
src/uptimechecker.cpp src/uptimechecker.cpp \
src/sysinfoc.cpp \
src/sysload.cpp
OTHER_FILES += qml/harbour-sailtime.qml \ OTHER_FILES += qml/harbour-sailtime.qml \
qml/cover/CoverPage.qml \ qml/cover/CoverPage.qml \

View file

@ -6,7 +6,9 @@
import QtQuick 2.0 import QtQuick 2.0
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
import harbour.sailtime.UptimeChecker 1.0 import harbour.sailtime.UptimeChecker 2.0
import harbour.sailtime.SysinfoC 1.0
import harbour.sailtime.Sysload 1.0
import "cover" import "cover"
import "pages" import "pages"
@ -61,36 +63,21 @@ ApplicationWindow
} }
function updateDisplay() { function updateDisplay() {
var uptime_str = checker.fetchUptime(); var sysinfo = checker.fetchUptime();
uptime_str = uptime_str.replace(/^\s+|\s+$/g, ''); var uptime_s = sysinfo.uptime;
var uptime_re = /\d+:\d\d:\d\d up\s+(?:(\d+) days?,\s+)?(?:(?:(\d+):(\d+))|(?:(\d?\d) min)),\s+(\d+) users?,\s+load average: (\d+).(\d\d), (\d+).(\d\d), (\d+).(\d\d)/; var days = Math.floor(uptime_s / 84600);
var match = uptime_str.match(uptime_re) var hours = Math.floor(uptime_s / 3600 % 24);
//console.log(uptime_str) var minutes = Math.floor(uptime_s / 60 % 60);
var seconds = Math.floor(uptime_s % 60);
var days = match[1]
if (days === undefined) {
days = 0
}
var hours = match[2]
if (hours === undefined) {
hours = 0
}
var minutes = match[3]
if (minutes === undefined) {
minutes = match[4]
}
var uptime = { var uptime = {
"days": days, "days": days,
"hours": hours, "hours": hours,
"minutes": minutes, "minutes": minutes,
"users": match[5], "load1": sysinfo.loads.avg_1,
"load1": parseInt(match[6]) + match[7] / 100, "load5": sysinfo.loads.avg_5,
"load5": parseInt(match[8]) + match[9] / 100, "load15": sysinfo.loads.avg_15,
"load15": parseInt(match[10]) + match[11] / 100,
} }
firstpage.updatePage(uptime); firstpage.updatePage(uptime);

View file

@ -29,7 +29,7 @@ Page {
Label { Label {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
text: "SailTime 1.0.2" text: "SailTime 1.1.0"
color: Theme.highlightColor color: Theme.highlightColor
font.pixelSize: Theme.fontSizeLarge font.pixelSize: Theme.fontSizeLarge
} }

View file

@ -13,7 +13,7 @@ Name: harbour-sailtime
%{!?qtc_make:%define qtc_make make} %{!?qtc_make:%define qtc_make make}
%{?qtc_builddir:%define _builddir %qtc_builddir} %{?qtc_builddir:%define _builddir %qtc_builddir}
Summary: SailTime Summary: SailTime
Version: 1.0.2 Version: 1.1.0
Release: 1 Release: 1
Group: Qt/Qt Group: Qt/Qt
License: MIT Expat licence License: MIT Expat licence

View file

@ -1,6 +1,6 @@
Name: harbour-sailtime Name: harbour-sailtime
Summary: SailTime Summary: SailTime
Version: 1.0.2 Version: 1.1.0
Release: 1 Release: 1
Group: Qt/Qt Group: Qt/Qt
URL: http://example.org/ URL: http://example.org/

View file

@ -5,10 +5,13 @@
*/ */
#include <QtQuick> #include <QtQuick>
#include <QtQml>
#include <sailfishapp.h> #include <sailfishapp.h>
#include "uptimechecker.h" #include "uptimechecker.h"
#include "sysinfoc.h"
#include "sysload.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -22,7 +25,11 @@ int main(int argc, char *argv[])
// //
// To display the view, call "show()" (will show fullscreen on device). // To display the view, call "show()" (will show fullscreen on device).
qmlRegisterType<UptimeChecker>("harbour.sailtime.UptimeChecker", 1, 0, "UptimeChecker"); // Register needed metatypes
qmlRegisterType<UptimeChecker>("harbour.sailtime.UptimeChecker", 2, 0, "UptimeChecker");
qmlRegisterUncreatableType<SysinfoC>("harbour.sailtime.SysinfoC", 1, 0, "SysinfoC", "Cannot create sysinfo");
qmlRegisterUncreatableType<Sysload>("harbour.sailtime.Sysload", 1, 0, "Sysload", "Cannot create sysload");
return SailfishApp::main(argc, argv); return SailfishApp::main(argc, argv);
} }

90
src/sysinfoc.cpp Normal file
View file

@ -0,0 +1,90 @@
#include "sysinfoc.h"
#include <linux/kernel.h>
SysinfoC::SysinfoC(const struct sysinfo* info, QObject* parent) :
QObject(parent),
uptime(info->uptime),
totalram(info->totalram),
freeram(info->freeram),
sharedram(info->sharedram),
bufferram(info->bufferram),
totalswap(info->totalswap),
freeswap(info->freeswap),
procs(info->procs),
totalhigh(info->totalhigh),
freehigh(info->freehigh),
mem_unit(info->mem_unit)
{
float in_loads[3] = {0.0, 0.0, 0.0};
in_loads[0] = load2Float(info->loads[0]);
in_loads[1] = load2Float(info->loads[1]);
in_loads[2] = load2Float(info->loads[2]);
this->loads = new Sysload(in_loads, this);
}
float SysinfoC::load2Float(unsigned long load)
{
// As per http://stackoverflow.com/a/4993273
return load / ((float) (1 << SI_LOAD_SHIFT));
}
long SysinfoC::getUptime() const
{
return uptime;
}
Sysload* SysinfoC::getLoads() const
{
return loads;
}
unsigned long SysinfoC::getTotalram() const
{
return totalram;
}
unsigned long SysinfoC::getFreeram() const
{
return freeram;
}
unsigned long SysinfoC::getSharedram() const
{
return sharedram;
}
unsigned long SysinfoC::getBufferram() const
{
return bufferram;
}
unsigned long SysinfoC::getTotalswap() const
{
return totalswap;
}
unsigned long SysinfoC::getFreeswap() const
{
return freeswap;
}
unsigned short SysinfoC::getProcs() const
{
return procs;
}
unsigned long SysinfoC::getTotalhigh() const
{
return totalhigh;
}
unsigned long SysinfoC::getFreehigh() const
{
return freehigh;
}
unsigned int SysinfoC::getMemunit() const
{
return mem_unit;
}

70
src/sysinfoc.h Normal file
View file

@ -0,0 +1,70 @@
#ifndef SYSINFO_H
#define SYSINFO_H
#include <QObject>
#include <sys/sysinfo.h>
#include "sysload.h"
/*
* This class exists because we cannot pass plain structs onto the QML side,
* we need to inherit from QObject.
*/
class SysinfoC : public QObject
{
Q_OBJECT
public:
explicit SysinfoC(const struct sysinfo* info, QObject* parent = 0);
/*
* Loads are reported as unsigned longs in the sysinfo struct, this function
* will convert them to floats which are usually used for displaying loads.
*/
static float load2Float(unsigned long load);
Q_PROPERTY(long uptime READ getUptime)
Q_PROPERTY(Sysload* loads READ getLoads)
Q_PROPERTY(unsigned long totalram READ getTotalram)
Q_PROPERTY(unsigned long freeram READ getFreeram)
Q_PROPERTY(unsigned long sharedram READ getSharedram)
Q_PROPERTY(unsigned long bufferram READ getBufferram)
Q_PROPERTY(unsigned long totalswap READ getTotalswap)
Q_PROPERTY(unsigned long freeswap READ getFreeswap)
Q_PROPERTY(unsigned short procs READ getProcs)
Q_PROPERTY(unsigned long totalhigh READ getTotalhigh)
Q_PROPERTY(unsigned long freehigh READ getFreehigh)
Q_PROPERTY(unsigned int mem_unit READ getMemunit)
long getUptime() const;
Sysload* getLoads() const;
unsigned long getTotalram() const;
unsigned long getFreeram() const;
unsigned long getSharedram() const;
unsigned long getBufferram() const;
unsigned long getTotalswap() const;
unsigned long getFreeswap() const;
unsigned short getProcs() const;
unsigned long getTotalhigh() const;
unsigned long getFreehigh() const;
unsigned int getMemunit() const;
signals:
public slots:
private:
long uptime; /* Seconds since boot */
Sysload* loads; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
};
#endif // SYSINFO_H

24
src/sysload.cpp Normal file
View file

@ -0,0 +1,24 @@
#include "sysload.h"
Sysload::Sysload(float loads[3], QObject *parent) :
QObject(parent),
avg_1(loads[0]),
avg_5(loads[1]),
avg_15(loads[2])
{
}
float Sysload::getAvg1() const
{
return avg_1;
}
float Sysload::getAvg5() const
{
return avg_5;
}
float Sysload::getAvg15() const
{
return avg_15;
}

33
src/sysload.h Normal file
View file

@ -0,0 +1,33 @@
#ifndef SYSLOAD_H
#define SYSLOAD_H
#include <QObject>
#include <sys/sysinfo.h>
class Sysload : public QObject
{
Q_OBJECT
public:
explicit Sysload(float loads[3], QObject* parent = 0);
Q_PROPERTY(float avg_1 READ getAvg1)
Q_PROPERTY(float avg_5 READ getAvg5)
Q_PROPERTY(float avg_15 READ getAvg15)
float getAvg1() const;
float getAvg5() const;
float getAvg15() const;
signals:
public slots:
private:
float avg_1;
float avg_5;
float avg_15;
};
#endif // SYSLOAD_H

View file

@ -11,11 +11,9 @@ UptimeChecker::UptimeChecker(QObject *parent) :
QObject(parent) QObject(parent)
{} {}
QString UptimeChecker::fetchUptime() SysinfoC* UptimeChecker::fetchUptime()
{ {
QProcess process; struct sysinfo info;
process.start("uptime"); sysinfo(&info);
process.waitForFinished(-1); return new SysinfoC(&info, this);
QByteArray out = process.readAllStandardOutput();
return QString(out);
} }

View file

@ -8,8 +8,8 @@
#define UPTIMECHECKER_H #define UPTIMECHECKER_H
#include <QObject> #include <QObject>
#include <QByteArray> #include "sys/sysinfo.h"
#include <QProcess> #include "sysinfoc.h"
class UptimeChecker : public QObject class UptimeChecker : public QObject
{ {
@ -17,7 +17,7 @@ class UptimeChecker : public QObject
public: public:
explicit UptimeChecker(QObject *parent = 0); explicit UptimeChecker(QObject *parent = 0);
Q_INVOKABLE QString fetchUptime(); Q_INVOKABLE SysinfoC* fetchUptime();
}; };
#endif // UPTIMECHECKER_H #endif // UPTIMECHECKER_H