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
HEADERS += src/uptimechecker.h
HEADERS += src/uptimechecker.h \
src/sysinfoc.h \
src/sysload.h
SOURCES += src/harbour-sailtime.cpp \
src/uptimechecker.cpp
src/uptimechecker.cpp \
src/sysinfoc.cpp \
src/sysload.cpp
OTHER_FILES += qml/harbour-sailtime.qml \
qml/cover/CoverPage.qml \

View file

@ -6,7 +6,9 @@
import QtQuick 2.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 "pages"
@ -61,36 +63,21 @@ ApplicationWindow
}
function updateDisplay() {
var uptime_str = checker.fetchUptime();
uptime_str = uptime_str.replace(/^\s+|\s+$/g, '');
var sysinfo = checker.fetchUptime();
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 match = uptime_str.match(uptime_re)
//console.log(uptime_str)
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 days = Math.floor(uptime_s / 84600);
var hours = Math.floor(uptime_s / 3600 % 24);
var minutes = Math.floor(uptime_s / 60 % 60);
var seconds = Math.floor(uptime_s % 60);
var uptime = {
"days": days,
"hours": hours,
"minutes": minutes,
"users": match[5],
"load1": parseInt(match[6]) + match[7] / 100,
"load5": parseInt(match[8]) + match[9] / 100,
"load15": parseInt(match[10]) + match[11] / 100,
"load1": sysinfo.loads.avg_1,
"load5": sysinfo.loads.avg_5,
"load15": sysinfo.loads.avg_15,
}
firstpage.updatePage(uptime);

View file

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

View file

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

View file

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

View file

@ -5,10 +5,13 @@
*/
#include <QtQuick>
#include <QtQml>
#include <sailfishapp.h>
#include "uptimechecker.h"
#include "sysinfoc.h"
#include "sysload.h"
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).
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);
}

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)
{}
QString UptimeChecker::fetchUptime()
SysinfoC* UptimeChecker::fetchUptime()
{
QProcess process;
process.start("uptime");
process.waitForFinished(-1);
QByteArray out = process.readAllStandardOutput();
return QString(out);
struct sysinfo info;
sysinfo(&info);
return new SysinfoC(&info, this);
}

View file

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