00001 #ifndef _USIGNALS_H
00002 #define _USIGNALS_H
00003
00004 #include <sigc++/sigc++.h>
00005 #include <UniSetTypes.h>
00006 #include <MessageType.h>
00007 #include <glibmm/ustring.h>
00008 #include <glibmm/convert.h>
00009 #include <ctime>
00010
00011 class GuiPM;
00012
00013 namespace USignals
00014 {
00015 class ValueMapItem;
00016 }
00017
00018 namespace UMessages
00019 {
00026 struct MessageId
00027 {
00028 MessageId(UniSetTypes::ObjectId id,
00029 UniSetTypes::ObjectId node,
00030 long value ):
00031 _id(id), _node(node), _value(value) {}
00032 MessageId() :
00033 _id(UniSetTypes::DefaultObjectId),
00034 _node(UniSetTypes::DefaultObjectId)
00035 {}
00036 UniSetTypes::ObjectId _id;
00037 UniSetTypes::ObjectId _node;
00038 long _value;
00039 bool operator==(const MessageId& x) const
00040 { return ( _id == x._id && _node == x._node && _value == x._value );}
00041 bool operator!=(const MessageId& x) const
00042 { return !(*this==x); }
00043 bool operator<(const MessageId& x)const {
00044 if (_id < x._id) return true;
00045 if (_id > x._id) return false;
00046 if (_node < x._node) return true;
00047 if (_node > x._node) return false;
00048 if (_value < x._value) return true;
00049 else return false;
00050 }
00051 };
00057 class Message
00058 {
00059 public:
00060 Message(const USignals::ValueMapItem& item, const UMessages::MessageId& id) : _item(&item), id_(id) {}
00061
00065 Message() : _item(NULL) {}
00066
00067 MessageId getMessageId() const;
00069 time_t getLastTime() const;
00070 time_t getTimeUsec() const;
00072 const Glib::ustring& getText() const;
00074 int getMessageType() const;
00076 bool valid() const;
00078 private:
00079 const USignals::ValueMapItem* _item;
00080 const UMessages::MessageId id_;
00081 };
00083 enum MessageType { INFO=1, WARNING=2, ALARM=3 };
00084 }
00085
00086 namespace USignals
00087 {
00088 class SigControllerImpl;
00089
00090 typedef sigc::slot<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, long>
00091 ValueChangedSlot;
00092 typedef sigc::slot<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, float>
00093 AnalogValueChangedSlot;
00094 typedef sigc::slot<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, long>
00095 ValueInOutSlot;
00096 typedef sigc::slot<void, UMessages::MessageId, Glib::ustring> MessageSlot;
00097 typedef sigc::slot<void, UMessages::MessageId, int, time_t, Glib::ustring> FullMessageSlot;
00098
00099 typedef sigc::signal<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, long>
00100 ValueChangedSignal;
00101 typedef sigc::signal<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, float>
00102 AnalogValueChangedSignal;
00103 typedef sigc::signal<void, UniSetTypes::ObjectId, UniSetTypes::ObjectId, long>
00104 ValueInOutSignal;
00105 typedef sigc::signal<void, UMessages::MessageId, Glib::ustring> MessageSignal;
00106
00107 typedef sigc::signal<void, UMessages::MessageId, int, time_t, Glib::ustring> FullMessageSignal;
00108
00113 class Connection : public sigc::connection
00114 {
00115 public:
00116 Connection( ) {}
00117
00118 Connection( sigc::connection conn) :
00119 sigc::connection(conn)
00120 {}
00121
00122 virtual void disconnect()
00123 {
00124 sigc::connection::disconnect();
00125 }
00126 };
00131 struct VConn
00132 {
00133 sigc::connection conn;
00134 UniSetTypes::ObjectId id;
00135 UniSetTypes::ObjectId node;
00136 long value;
00137 void disconnect();
00138 };
00139
00147 class SigController
00148 {
00149 public:
00150 SigController(GuiPM* gpm);
00151 ~SigController();
00153 Connection connect_value_changed( const ValueChangedSlot& slot,
00154 UniSetTypes::ObjectId id,
00155 UniSetTypes::ObjectId node );
00157 Connection connect_analog_value_changed( const AnalogValueChangedSlot& slot,
00158 UniSetTypes::ObjectId id,
00159 UniSetTypes::ObjectId node );
00161 VConn connect_value_in( const ValueInOutSlot& slot,
00162 UniSetTypes::ObjectId id,
00163 UniSetTypes::ObjectId node,
00164 long value);
00166 VConn connect_value_out( const ValueInOutSlot& slot,
00167 UniSetTypes::ObjectId id,
00168 UniSetTypes::ObjectId node,
00169 long value);
00171 Connection connect_on_any_message( const MessageSlot& slot);
00173 Connection connect_on_message( const MessageSlot& slot,
00174 UMessages::MessageId id);
00176 Connection connect_on_any_message_full ( const FullMessageSlot& slot );
00178 long get_value(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
00180 long get_value_from_gpm(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
00182 float get_analog_value(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
00184 UMessages::Message get_message( const UMessages::MessageId& id);
00186 std::list<UMessages::Message > get_message_list( const UMessages::MessageId& id);
00188 std::list<UMessages::Message > get_all_messages_list();
00190 void sensorInfo(UniSetTypes::SensorMessage *sm);
00191 void on_connect();
00192 private:
00193 SigController();
00194 SigControllerImpl* _impl;
00195 };
00196
00197 }
00198 #endif