Files
2014-06-16 11:16:21 +02:00

199 lines
3.8 KiB
C++

/*
* TfAbstractDevice.h
*
* Created on: 12.06.2014
* Author: matzman
*/
#ifndef TFABSTRACTDEVICE_H_
#define TFABSTRACTDEVICE_H_
#include <tfcppsimple/TfTypes.h>
#include <tfcppsimple/TfConnection.h>
#include <log4cpp/Category.hh>
#include <cstdint>
#include <string>
#include <map>
namespace tfcppsimple {
class TfConnection;
class TfDevice;
enum class TfDevicePosition : char {
//'0' - '8' (Position in Stapel). Für Bricklets: 'a' - 'd' (Position an Brick).
BRICK0 = '0',
BRICK1 = '1',
BRICK2 = '2',
BRICK3 = '3',
BRICK4 = '4',
BRICK5 = '5',
BRICK6 = '6',
BRICK7 = '7',
BRICK8 = '8',
BRICKLET0 = 'a',
BRICKLET1 = 'b',
BRICKLET2 = 'c',
BRICKLET3 = 'd',
};
enum class TfDeviceIdentifier : uint16_t {
UNKNOWN = 0,
UNKNOWN_BRICK = 0,
UNKNOWN_BRICKLET = 0,
MASTER = 13,
LCD20x4 = 212,
HUMIDITY = 27,
IO16 = 28,
TEMPERATURE = 216
};
enum class TfDeviceType : int {
UNKNOWN = 0,
BRICK = 1,
BRICKLET = 2
};
enum class TfDeviceState : int {
UNKNOWN,
AVAILABLE,
CONNECTED,
DISCONNECTED,
CONNECTION_LOST
};
struct TfVersion {
uint8_t _major;
uint8_t _minor;
uint8_t _release;
} __attribute__((packed));
class TfDeviceStateListener {
public:
virtual ~TfDeviceStateListener() {}
virtual void stateChangeCallback(TfDevice& device, TfDeviceState oldstate, TfDeviceState newstate) {}
virtual void shutdownCallback(TfDevice& device) {}
};
class TfDevice : public ObservableTemplate<TfDeviceStateListener> {
friend class TfDeviceFactory;
friend class TfConnection;
public:
protected:
static log4cpp::Category& logger;
TfConnection& connection;
std::string uid;
std::string connected_uid;
TfDevicePosition position;
TfVersion hardware_version;
TfVersion firmware_version;
uint16_t raw_device_identifier;
TfDeviceIdentifier device_identifier;
TfDevice* parent;
std::map<TfDevicePosition, TfDevice*> children;
TfDeviceType deviceType;
TfDeviceState state = TfDeviceState::UNKNOWN;
bool configuredFlag = false;
TfDevice(TfConnection& connection,
std::string uid,
std::string connected_uid,
TfDevicePosition position,
TfVersion hardware_version,
TfVersion firmware_version,
uint16_t raw_device_identifier,
TfDeviceIdentifier device_identifier,
TfDevice* parent,
TfDeviceType deviceType
);
virtual bool changeDeviceState(TfDeviceState newstate);
virtual void doConfigureDevice();
virtual void doReconfigureDevice();
virtual void doUnconfigureDevice();
virtual void doConnectionLost();
virtual void doShutdown();
void signalEnumerationCallback(TfCallbackEnumerationType enumeration_type);
void signalConnectedCallback(TfCallbackConnectReason connect_reason);
void signalDisconnectedCallback(TfCallbackDisconnectReason disconnect_reason);
void signalShutdown();
public:
virtual ~TfDevice();
bool connect();
bool disconnect();
const std::string& getConnectedUid() {
return connected_uid;
}
TfDeviceIdentifier getDeviceIdentifier() {
return device_identifier;
}
const TfVersion& getFirmwareVersion() {
return firmware_version;
}
const TfVersion& getHardwareVersion() {
return hardware_version;
}
TfDevicePosition getPosition() {
return position;
}
uint16_t getRawDeviceIdentifier() {
return raw_device_identifier;
}
const std::string& getUid() {
return uid;
}
const std::map<TfDevicePosition, TfDevice*>& getChildren() {
return children;
}
TfDevice* getChild(TfDevicePosition pos) {
auto ret = children.find(pos);
return ret == children.end() ? nullptr : ret->second;
}
TfDevice* getParent() {
return parent;
}
TfDeviceType getDeviceType() {
return deviceType;
}
TfConnection& getConnection() {
return connection;
}
TfDeviceState getDeviceState() { return state; }
bool isConfigured() { return configuredFlag; }
virtual std::string getDeviceName(bool extended = true);
};
} /* namespace tfcppsimple */
#endif /* TFABSTRACTDEVICE_H_ */