#ifndef _EXAMPLES_DEVICE_H_
#define _EXAMPLES_DEVICE_H_
#include "Property.h"
class Lock
{
pthread_mutex_t* mut;
public:
Lock(pthread_mutex_t& m) : mut(&m)
{
pthread_mutex_lock(mut);
}
~Lock()
{
pthread_mutex_unlock(mut);
}
};
class Device
{
char* name;
pthread_mutex_t deviceAccess;
Property** properties;
int numProperties;
Property* findProperty(const char* property)
{
Property* result = 0;
for (int i = 0; i < numProperties; i++)
{
if (!strcmp(properties[i]->getName(), property))
{
result = properties[i];
break;
}
}
if (result == 0) throw rdaBadParameter("No such property");
return result;
}
public:
Device(const char* deviceName)
{
name = strdup(deviceName);
numProperties = 2;
properties = new Property* [numProperties];
properties[0] = new Measurement;
properties[1] = new Setting;
pthread_mutex_init(&deviceAccess, 0);
}
virtual ~Device()
{
for (int i = 0; i < numProperties; i++) delete properties[i];
delete [] properties;
delete name;
pthread_mutex_destroy(&deviceAccess);
}
const char* getName()
{
return name;
}
void update()
{
Lock lock(deviceAccess);
int r = rand() % 100;
double jitter = ((double)r)/10.0 - 5.0;
double newValue = properties[1]->getValue() + jitter;
((Measurement*)properties[0])->update(newValue);
}
rdaData* get(const char* propName)
{
Lock lock(deviceAccess);
Property* property = findProperty(propName);
return property->get();
}
void set(const char* propName, const rdaData& value)
{
Lock lock(deviceAccess);
Property* property = findProperty(propName);
property->set(value);
}
void monitorOn(const char* propName, rdaValueChangeListener* listener)
{
Lock lock(deviceAccess);
Property* property = findProperty(propName);
property->addListener(listener);
}
void monitorOff(const char* propName, rdaValueChangeListener* listener)
{
Lock lock(deviceAccess);
Property* property = findProperty(propName);
property->removeListener(listener);
}
};
#endif