switched from qsettings to json added editng of actors

This commit is contained in:
2019-06-06 21:19:12 +02:00
parent b04fbfb5bc
commit df27b622a0
141 changed files with 4402 additions and 5068 deletions

View File

@ -0,0 +1,42 @@
#include "ocupancysensor.h"
#include <QTimer>
#include <QDebug>
OcupancySensorSource::OcupancySensorSource(QObject *parent): QObject (parent)
{
connect(&ping, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(pingExit(int, QProcess::ExitStatus)));
Timeout();
}
void OcupancySensorSource::sensorEvent(Sensor sensor)
{
if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f)
{
QTimer::singleShot(240000, this, &OcupancySensorSource::Timeout);
qDebug()<<"starting timer";
}
}
void OcupancySensorSource::Timeout()
{
qDebug()<<"starting ping";
ping.start("ping 192.168.0.104 -c 1 -W 1");
}
void OcupancySensorSource::pingExit(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug()<<"ping finished";
if(exitStatus == QProcess::ExitStatus::NormalExit)
{
qDebug()<<"Exit Code "<<exitCode;
if(exitCode == 0)
{
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy"));
}
else
{
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 0, "Occupancy"));
}
}
}

View File

@ -0,0 +1,27 @@
#pragma once
#include <QObject>
#include <QProcess>
#include "sensor.h"
class OcupancySensorSource : public QObject
{
Q_OBJECT
private:
QProcess ping;
public:
explicit OcupancySensorSource(QObject *parent = nullptr);
public slots:
void sensorEvent(Sensor sensor);
private slots:
void Timeout();
void pingExit(int exitCode, QProcess::ExitStatus exitStatus);
signals:
void stateChanged(Sensor sensor);
};

45
src/sensors/sensor.cpp Normal file
View File

@ -0,0 +1,45 @@
#include "sensor.h"
#include <QDebug>
SensorStore::SensorStore(QObject *parent): QObject(parent)
{
sensors_.push_back(Sensor(0,1,0,"Front door"));
sensors_.push_back(Sensor(0,0,0,"Bedroom door"));
}
void SensorStore::sensorGotState(const Sensor& sensor)
{
bool exsisting = false;
for(unsigned i = 0; i < sensors_.size(); ++i)
{
if(sensor.type == sensors_[i].type && sensor.id == sensors_[i].id)
{
sensors_[i].updateSeen();
if(sensors_[i].field != sensor.field)
{
sensors_[i].field = sensor.field;
sensorChangedState(sensor);
stateChenged(sensors_);
}
exsisting = true;
break;
}
}
if(!exsisting)
{
sensors_.push_back(sensor);
sensorChangedState(sensor);
stateChenged(sensors_);
}
for(unsigned i = 0; i < sensors_.size(); ++i)
{
if(sensors_[i].type > 0 && sensors_[i].type < 128 && QDateTime::currentDateTime() > sensors_[i].lastSeen.addSecs(1800))
{
sensorDeleted(sensors_[i]);
stateChenged(sensors_);
sensors_.erase(sensors_.begin()+i);
}
}
}

77
src/sensors/sensor.h Normal file
View File

@ -0,0 +1,77 @@
#pragma once
#include <stdint.h>
#include<QString>
#include<QDateTime>
#include<QObject>
#include<vector>
class Sensor
{
public:
static constexpr uint8_t TYPE_DOOR = 0;
static constexpr uint8_t TYPE_TEMPERATURE = 1;
static constexpr uint8_t TYPE_HUMIDITY = 2;
static constexpr uint8_t TYPE_PRESSURE = 3;
static constexpr uint8_t TYPE_BRIGHTNESS = 4;
static constexpr uint8_t TYPE_LOWBATTERY = 128;
static constexpr uint8_t TYPE_SHUTDOWN_IMMINENT = 251;
static constexpr uint8_t TYPE_OCUPANCY = 252;
static constexpr uint8_t TYPE_SUN_ALTITUDE = 253;
static constexpr uint8_t TYPE_AUDIO_OUTPUT = 254;
static constexpr uint8_t TYPE_DUMMY = 255;
uint8_t type;
uint8_t id;
float field;
QString name;
QDateTime lastSeen;
Sensor(uint8_t typeIn, uint8_t idIn, float fieldIn = 0, QString nameIn = ""): type(typeIn), id(idIn), field(fieldIn), name(nameIn)
{
lastSeen = QDateTime::currentDateTime();
if(nameIn == "") generateName();
}
Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn)
{
lastSeen = QDateTime::currentDateTime();
}
inline bool operator==(const Sensor& in){ return type==in.type && id == in.id; }
inline bool operator!=(const Sensor& in){ return !(*this==in); }
inline void updateSeen(){lastSeen = QDateTime::currentDateTime();}
inline void generateName()
{
if(type == TYPE_TEMPERATURE) name = "Temperature " + QString::number(id);
else if(type == TYPE_DOOR) name = "Door " + QString::number(id);
else if(type == TYPE_AUDIO_OUTPUT) name = "Speakers " + QString::number(id);
else if(type == TYPE_HUMIDITY) name = "Humidity " + QString::number(id);
else if(type == TYPE_SUN_ALTITUDE) name = "Solar Altitude";
else if(type == TYPE_SHUTDOWN_IMMINENT) name = "Shutdown Imminent";
else name = "Sensor Type " + QString::number(type) + " Id " + QString::number(id);
}
};
class SensorStore: public QObject
{
Q_OBJECT
private:
std::vector<Sensor> sensors_;
public:
SensorStore(QObject *parent = nullptr);
virtual ~SensorStore(){}
inline std::vector<Sensor>* getSensors(){ return &sensors_; }
public slots:
void sensorGotState(const Sensor& sensor);
signals:
void stateChenged(std::vector<Sensor> sensors);
void sensorChangedState(Sensor sensor);
void sensorDeleted(Sensor sensor);
};

View File

@ -0,0 +1,59 @@
#include "speakersensor.h"
#include <QDebug>
SpeakerSensorSource::SpeakerSensorSource(QString name, QObject *parent) : QObject(parent), name_(name)
{
silenceCount = 0;
}
SpeakerSensorSource::~SpeakerSensorSource()
{
abort();
}
void SpeakerSensorSource::run()
{
abort();
arecord.start( "arecord --disable-softvol -r 8000 -D front -" );
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
timer.setInterval(500);
timer.start();
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
}
void SpeakerSensorSource::abort()
{
if(arecord.state() == QProcess::Running)arecord.close();
if(timer.isActive())timer.stop();
}
void SpeakerSensorSource::doTick()
{
if(arecord.state() == QProcess::Running)
{
QByteArray buffer = arecord.readAllStandardOutput();
//qDebug()<<(int16_t)buffer[0];
for(long i = 0; i < buffer.size(); i++)
{
if((int16_t)buffer.at(i) != -128)
{
silenceCount = 0;
}
}
if(silenceCount > 40 && state)
{
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 0, name_));
state = false;
}
else if(silenceCount == 0 && !state)
{
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
state = true;
}
silenceCount++;
}
}

View File

@ -0,0 +1,45 @@
#ifndef AMPMANAGER_H
#define AMPMANAGER_H
#include <iostream>
#include <QObject>
#include <QRunnable>
#include <QScopedPointer>
#include <QEventLoop>
#include <QTimer>
#include <QProcess>
#include <QByteArray>
#include "sensor.h"
class SpeakerSensorSource : public QObject
{
Q_OBJECT
private:
QString name_;
bool state = true;
QTimer timer;
public:
explicit SpeakerSensorSource(QString name = "", QObject *parent = nullptr);
~SpeakerSensorSource();
public slots:
void run();
void abort();
signals:
void stateChanged(Sensor sensor);
private slots:
void doTick();
private:
long silenceCount = 0;
QProcess arecord;
};
#endif // AMPMANAGER_H

25
src/sensors/sunsensor.cpp Normal file
View File

@ -0,0 +1,25 @@
#include "sunsensor.h"
SunSensorSource::SunSensorSource(double lat, double lon, QObject *parent): QObject(parent), sun_(lat, lon)
{
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
}
void SunSensorSource::run()
{
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
timer.setInterval(10000); //10s
timer.start();
doTick();
}
void SunSensorSource::abort()
{
if(timer.isActive())timer.stop();
}
void SunSensorSource::doTick()
{
stateChanged(Sensor(Sensor::TYPE_SUN_ALTITUDE, 0, static_cast<float>(sun_.altitude())));
}

29
src/sensors/sunsensor.h Normal file
View File

@ -0,0 +1,29 @@
#pragma once
#include <QTimer>
#include "../sun.h"
#include "sensor.h"
class SunSensorSource : public QObject
{
Q_OBJECT
private:
Sun sun_;
QTimer timer;
public:
explicit SunSensorSource(double lat, double lon, QObject *parent = nullptr);
public slots:
void run();
void abort();
signals:
void stateChanged(Sensor sensor);
private slots:
void doTick();
};