Commit 82b16c1c authored by Leander Schulten's avatar Leander Schulten
Browse files

Add Comments

parent 6d140c9e
......@@ -59,6 +59,7 @@ public:
const std::vector<std::pair<Channel*,DMXChannelFilter*>> & getChannelFilter()const{return filter;}
// static methods for the sync service:
static void update (const ID &id, const QString &name,const QString &value){
auto d = IDBase<Device>::getIDBaseObjectByID(id);
if(d){
......
......@@ -45,6 +45,7 @@ public:
void writeJsonObject(QJsonObject &o)const;
public:
//static methods for the syncService:
static void update (const ID &id, const QString &name,const QString &value){
auto d = IDBase<DevicePrototype>::getIDBaseObjectByID(id);
if(d){
......
......@@ -3,9 +3,20 @@
#include <QObject>
/**
* @brief The DMXChannelFilter class filter channel values
* Die Klasse kann einen Default value, einen Override value (überschreibt den value vom Programmen)
* einen min und einen max value festlegen und methoden angeben, wie mit den beiden werten umgegangen
* werden soll
*/
class DMXChannelFilter : QObject{
Q_OBJECT
public:
/**
* @brief The Operation enum legt die Operationen für den min und max value fest
* CUT : Scheident die werte einfach ab
* REMAP : die werte werden auf den neuen bereich skaliert
*/
enum Operation{CUT, REMAP};
Q_ENUM(Operation)
private:
......@@ -36,7 +47,17 @@ public:
void initValue(unsigned char * value);
void filterValue(unsigned char * value);
public:
/**
* @brief initValues sets the default values for every channel
* @param values the values
* @param numberOfChannels the number of channels
*/
static void initValues(unsigned char *values, unsigned int numberOfChannels);
/**
* @brief filterValues filters the values that are generated from the programms
* @param values
* @param numberOfChannels
*/
static void filterValues(unsigned char *values, unsigned int numberOfChannels);
signals:
void maxOperationChanged(Operation);
......@@ -47,4 +68,4 @@ signals:
void shouldOverrideValueChanged(unsigned char);
};
#endif // DMXCHANNEL_H
\ No newline at end of file
#endif // DMXCHANNEL_H
......@@ -29,6 +29,9 @@
template<typename Subclass, typename enableDataModel>
class IDBase{
ID id;
/**
* @brief The Deleter class deletes all Objects that are on the heap when the deleter gets destroyed
*/
class Deleter{
public:
~Deleter(){
......@@ -133,6 +136,10 @@
typename IDBase<Subclass,enableDataModel>::Deleter IDBase<Subclass,enableDataModel>::deleter;
/**
* Ein IDBase data model um alle IDBases einer bestimmten Gruppe zb in einer Liste anzeigen zu lassen.
* Aktualisiert sich komplett vollständig
*/
template<typename IDBaseWithNamedObject>
class IDBaseDataModel : public QAbstractListModel{
private:
......@@ -153,6 +160,12 @@
static void endRemoveIDBaseObject(){
singletone()->endRemoveRows();
}
/**
* @brief dataCheck returns the data if the subclass has NamedObject as parent class
* @param index
* @param role
* @return
*/
QVariant dataCheck(const QModelIndex &index, int role, std::true_type,std::true_type)const{
if(index.row()>=0 && index.row()<static_cast<decltype(index.row())>(IDBase<IDBaseWithNamedObject>::getAllIDBases().size())){
if(role==Qt::DisplayRole){
......@@ -168,6 +181,10 @@
return QVariant();
}
public:
/**
* @brief singletone gibt das dataModel zurück
* @return
*/
static IDBaseDataModel * singletone(){static IDBaseDataModel s;existDataModel = true;return &s;}
virtual int rowCount(const QModelIndex &parent = QModelIndex())const override {Q_UNUSED(parent)return IDBase<IDBaseWithNamedObject>::getAllIDBases().size();}
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole)const {
......@@ -183,6 +200,7 @@
template<typename Subclass,typename enable>
void IDBase<Subclass,enable>::removeIDBaseObject(IDBase<Subclass,enable> * c)const{
// checken ob das dataModel enabled ist und ob es exestiert
if(std::is_same<enable,std::true_type>::value && IDBaseDataModel<Subclass>::existDataModel){
const auto iter = idBaseObjectsByID.find(static_cast<Subclass*>(c));
IDBaseDataModel<Subclass>::beginRemoveIDBaseObject(iter);
......@@ -195,6 +213,7 @@
template<typename Subclass,typename enable>
void IDBase<Subclass,enable>::addIDBaseObject(IDBase<Subclass,enable> * c)const{
// checken ob das dataModel enabled ist und ob es exestiert
if(std::is_same<enable,std::true_type>::value && IDBaseDataModel<Subclass>::existDataModel){
const auto iter = idBaseObjectsByID.lower_bound(static_cast<Subclass*>(c));
IDBaseDataModel<Subclass>::beginAddIDBaseObject(iter);
......
......@@ -11,6 +11,9 @@ class NamedObject : public QObject
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString description READ getDescription WRITE setDescription NOTIFY descriptionChanged)
private:
/**
* @brief syncClassName ein hässlicher trick um den SyncService benutzten zu können
*/
QString * syncClassName;
/**
* @brief name Der Name des Objects
......
......@@ -7,6 +7,9 @@
#include <map>
#include <cmath>
/**
* @brief The DeviceProgramm class saves a Device in combination with a ProgrammPrototype and an offset
*/
class DeviceProgramm : public QObject , public IDBase<DeviceProgramm>{
Q_OBJECT
Q_PROPERTY(ProgrammPrototype* programmPrototype READ getProgrammPrototyp WRITE setProgrammPrototype NOTIFY programmPrototypeChanged)
......@@ -15,11 +18,15 @@ class DeviceProgramm : public QObject , public IDBase<DeviceProgramm>{
Q_PROPERTY(Device* device READ getDevice CONSTANT)
private:
ProgrammPrototype * programmPrototype;
double offset;
double offset = 0.0;
double speed = 1.0;
public:
const Device * device;
Device * getDevice()const{return const_cast<Device *>(device);}
/**
* @brief setOffset setzt den offset des DeviceProgramms, um diese zeit läuft dieses Programm nach dem Programm
* @param o der offset
*/
Q_SLOT void setOffset(double o){if(o==offset)return;offset=o;emit offsetChanged();SyncService::addUpdateMessage("DeviceProgramm",getID(),"offset",QString::number(offset));}
double getOffset()const{return offset;}
Q_SLOT void setSpeed(double s){if(s==speed)return;speed=s;emit speedChanged(speed);}
......@@ -57,6 +64,9 @@ signals:
void programmPrototypeChanged();
};
/**
* @brief The TimeDistortion class distort the time for a Programm
*/
class TimeDistortion : public QObject{
Q_OBJECT
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
......@@ -71,14 +81,18 @@ public:
bool isEnabled()const{return enabled;}
Q_SLOT void setDistortionCurve(QEasingCurve d){if(d==distortionCurve)return;distortionCurve=d;emit distortionCurveChanged(distortionCurve);}
QEasingCurve getDistortionCurve()const{return distortionCurve;}
/**
* @brief setIntervall setzt das Intervall in dem die distortion Curve arbeitet, zu dem Zeitpunkten intervall * int ist die Zeit wieder "normal"
* @param i das intervall
*/
Q_SLOT void setIntervall(double i){if(i==intervall)return;intervall=i;emit intervallChanged(intervall);}
bool getIntervall()const{return intervall;}
public:
double distort(double time){
double diff = std::fmodf(time,intervall);
double offset = time-diff;
diff = distortionCurve.valueForProgress(diff/intervall)*intervall;
return offset+diff;
double diff = std::fmodf(time,intervall); // wie weit sind wir in aktuellen intervall
double offset = time-diff; // offset zum intervall start
diff = distortionCurve.valueForProgress(diff/intervall)*intervall;// die verzerrung für den Aktuellen fortchritt im intervall mal die intervall größe
return offset+diff; // den offset plus der verzerrte Fortschritt im intervall
}
signals:
void enabledChanged(bool);
......@@ -86,6 +100,10 @@ signals:
void intervallChanged(double);
};
/**
* @brief Ein Programm ist das am meinsten bündelnde object. Ein Programm besteht aus verschiedenen Device Programmen, die jeweils aus einem Device und einen ProgrammPrototype für eine bestimmte DevicePrototype Gruppe.
* Ein Programm besitzt eine TimeDistortion einheit, die bestimmte bereiche des Programms schneller oder langsamer machen kann, außerdem besitzt ein Programm eine ganz normale geschwindigkeit, genau so wie die Darunter liegenden DeviveProgramme.
*/
class Programm : public NamedObject, public IDBase<Programm>
{
Q_OBJECT
......@@ -101,15 +119,32 @@ public:
Programm(const QJsonObject &o);
Programm(QString name,QString description = ""):NamedObject(name,description,&syncServiceClassName){}
Q_SLOT void setRunning(bool run){if(run != isRunning_)emit runningChanged(run);isRunning_ = run;SyncService::addUpdateMessage("Programm",getID(),"running",run?"true":"false");}
// Für jedes Programm für jedes Device für jeden Channel
/**
* @brief run lässt das Programm laufen, wenn es keine Konflikte mit anderen laufenden Programmen gibt
* @return Ein Container mit allen auftretenden Konflikten
*/
std::map<Programm*,std::map<Device*,std::vector<Channel*>>> run();
Q_SLOT void setSpeed(double s){if(s==speed)return;speed=s;emit speedChanged(speed);}
double getSpeed()const{return speed;}
void stop(){setRunning(false);}
bool isRunning()const{return isRunning_;}
/**
* @brief fill füllt data mit den von den Laufenden Programmen laufenden values auf
* @param data
* @param length
* @param time die aktualle zeit, an der sich die Programme gerade befinden sollen
*/
static void fill(unsigned char * data, size_t length, double time);
void writeJsonObject(QJsonObject &o)const;
const std::vector<DeviceProgramm*>& getDeviceProgramms()const{return programms;}
/**
* @brief addDeviceProgramm fügt ein Device Programm dem Programm an
* @param device Das Gerät
* @param programmPrototype Der Programm Prototype, muss den gleichen DevicePrototypen wie das Device haben
* @param offset Die Verzögerung des Programms start zur normalen zeit
* @return true wenn erfolgreich, sonst false
*/
bool addDeviceProgramm(Device * device, ProgrammPrototype * programmPrototype, double offset = 0);
TimeDistortion * getTimeDistortion(){return &timeDistortion;}
private:
......@@ -117,6 +152,7 @@ private:
private slots:
void deviceProgrammDeleted(QObject*);
public:
// statische methoden für den syncService:
static void update (const ID &id, const QString &name,const QString &value){
auto d = IDBase<Programm>::getIDBaseObjectByID(id);
if(d){
......
......@@ -4,6 +4,9 @@
#include "deviceprototype.h"
#include <QEasingCurve>
/**
* @brief The TimePoint class holds a time and a corresponding value and a QEasingCurve that describe how to interpolate to the next timepoint
*/
class TimePoint{
public:
TimePoint(const QJsonObject &o);
......@@ -17,7 +20,13 @@ public:
void writeJsonObject(QJsonObject &o)const;
};
/**
* @brief The RepeatPolicy enum describe what happens, when the time reach the end of the timeline
*/
enum RepeatPolicy{Continue, Oscillate};
/**
* @brief The ChannelProgramm class holds a channel, the repeatPolicy and the Timeline
*/
class ChannelProgramm : public QObject{
Q_OBJECT
Q_ENUM(RepeatPolicy)
......@@ -37,6 +46,9 @@ signals:
void repeatPolicyChanged();
};
/**
* @brief The ProgrammPrototype class describe for a DevicePrototype for each Channel a ChannelProgramm
*/
class ProgrammPrototype : public NamedObject, public IDBase<ProgrammPrototype>
{
Q_OBJECT
......
......@@ -9,20 +9,26 @@
#include <vector>
/**
* @brief The SyncService class has static methods to add Sync Messages and is an Interface to implement an real SyncService that have to implement UserManagment
*/
class SyncService {
public:
// function definitions
typedef void (*CreateMethod) (const QJsonObject &);
typedef void (*UpdateMethod) (const ID &, const QString &,const QString &);
typedef void (*RemoveMethod) (const ID &);
typedef void (*CreateMemberMethod) (const ID &,const QString &,const QJsonObject &);
typedef void (*RemoveMemberMethod) (const ID &,const QString &,const ID &);
private:
// all active syncServices
static std::vector<SyncService*> syncServices;
// all registered classes
static std::map<QString,std::tuple<CreateMethod,UpdateMethod,RemoveMethod,CreateMemberMethod,RemoveMemberMethod>> classes;
enum MethodTupleIndex{CreateMethodIndex,UpdateMethodIndex,RemoveMethodIndex,CreateMemberMethodIndex,RemoveMemberMethodIndex};
protected:
const std::map<QString,std::tuple<CreateMethod,UpdateMethod,RemoveMethod,CreateMemberMethod,RemoveMemberMethod>> & getRegisteredClasses()const{return classes;}
// Methods for your own SyncService to Process messages
void processCreateMessage(const QString &className, const QJsonObject &o);
void processCreateMemberMessage(const QString &className,const QString &id,const QString &memberName, const QJsonObject &o);
void processUpdateMessage(const QString &className, const QString &id, const QString &varName,const QString &varValue);
......@@ -48,6 +54,10 @@ public:
static void registerClass(const QString &name,CreateMethod createMethod, UpdateMethod updateMethod,RemoveMethod removeMethod, CreateMemberMethod createMemberMethod, RemoveMemberMethod removeMemberMethod){classes.insert(std::make_pair(name,std::make_tuple(createMethod,updateMethod,removeMethod,createMemberMethod,removeMemberMethod)));}
protected:
/**
* @brief enableSyncService you habe to enable your own syncService
* @param b enable or disbale
*/
void enableSyncService(bool b);
public:
virtual void addCreateMessageImpl(const QString &className, const QJsonObject &o) = 0;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment