Guiliani  Version 2.5 revision 7293 (documentation build 13)
GUIDataPool.h
1/*
2* Copyright (C) TES Electronic Solutions GmbH,
3* All Rights Reserved.
4* Contact: info@guiliani.de
5*
6* This file is part of the Guiliani HMI framework
7* for the development of graphical user interfaces on embedded systems.
8*/
9
10#ifndef GUIDATAPOOL__H_
11#define GUIDATAPOOL__H_
12
13#include "eC_Types.h"
14#include "eC_TList_doubleLinked.h"
15#include "eC_Semaphore.h"
16#include "GUISubject.h"
17#include "GUIObserver.h"
18#include "eC_String.h"
19#include "GUIValue.h"
21#include "GUIDataPoolResource.h"
22
23
24class CDataPoolEntry;
25
27typedef void(*DataPoolCallback)(CDataPoolEntry&);
28
29
30// @guiliani_doxygen toplevel_module DataPool
44// @endguiliani_doxygen
45
46
47
58{
59public:
63 CDataPoolConnector(CGUIObject* pkParentObject = NULL) :
65 m_pkParentObject(pkParentObject)
66 {}
67
71 void SetParentObject(CGUIObject* pkParentObject)
72 {
73 m_pkParentObject = pkParentObject;
74 }
75
76#ifndef GUILIANI_NO_DATAPOOL
80 virtual void OnNotification(CDataPoolEntry& kObservedValue);
81#endif
82
83private:
84 CGUIObject * m_pkParentObject;
85
86 // Unused OnNotification slots. Declared only to prevent compiler warnings.
87 virtual void OnNotification() {}
88 virtual void OnNotification(const eC_String& kMessage) {}
89 virtual void OnNotification(const CGUIObject* const pkUpdatedObject) {}
90 virtual void OnNotification(const CGUIValue& kObservedValue, const CGUIObject* const pkUpdatedObject, const eC_UInt uiX = 0, const eC_UInt uiY = 0) {}
91};
92
93#ifndef GUILIANI_NO_DATAPOOL
94
108{
110 friend class CGUIDataPool;
111
112public:
118 virtual const CGUIValue& Get(const eC_UInt uiX = 0, const eC_UInt uiY = 0);
119
124 void GetQuantity(eC_UInt& uiX, eC_UInt& uiY)
125 {
126 uiX = m_uiMaxX;
127 uiY = m_uiMaxY;
128 }
129
134 {
135 return m_eDataID;
136 }
137
138protected:
141
145 CDataPoolEntry(const CGUIValue& kValue);
146
154 void SetQuantity(const eC_UInt uiX, const eC_UInt uiY, const eC_Bool& bPreserve = false);
155
162 virtual void Set(const CGUIValue& kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0);
163
169 virtual CDataPoolEntry& operator= (const CDataPoolEntry& kDataPoolEntry);
170
175 {
176 CGUISubject::AddObserver(pObserver);
177 }
178
182 void SetCallback(DataPoolCallback pCallback)
183 {
184 m_pDataPoolCallback = pCallback;
185 }
186
189
197 virtual void OnNotification(const CGUIValue& kValue, const CGUIObject* const pkUpdatedObject, const eC_UInt uiX = 0, const eC_UInt uiY = 0);
198
199protected:
201 eC_UInt m_uiMaxX;
203 eC_UInt m_uiMaxY;
204
206 eC_TArray<CGUIValue> m_kValue;
207
210
212 DataPoolCallback m_pDataPoolCallback;
213
215 virtual ~CDataPoolEntry() {}
216
217private:
219 inline void SetID(const DataPoolResource_t &eID)
220 {
221 m_eDataID = eID;
222 }
223
225 void AddObserver(CGUIObserver *pObserver);
226};
227
349
458#define DATAPOOL_FILE_VERSION 3
459
465{
466public:
469
472
480 static void Set(const DataPoolResource_t eDataID, CGUIValue kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0);
481
489 static void Get(const DataPoolResource_t eDataID, CGUIValue& kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0);
490
497 static void SetDataPoolEntry(const DataPoolResource_t eDataID, CDataPoolEntry* pkEntry);
498
506 static void SetQuantity(const DataPoolResource_t eDataID, const eC_UInt uiX, const eC_UInt uiY, const eC_Bool& bPreserve = false);
507
514 static void GetQuantity(const DataPoolResource_t eDataID, eC_UInt& uiX, eC_UInt& uiY);
515
520 static void Get(const DataPoolResource_t eDataID, CDataPoolEntry **ppkEntry);
521
526 static void GetUpdate(CDataPoolConnector* pkObserver);
528
531
533 static eC_Bool Lock() { return ms_kDataPoolSema.Enter(); }
534
537 static eC_Bool Unlock() { return ms_kDataPoolSema.Leave(); }
539
542
547 static void Register(const DataPoolResource_t eDataID, CGUIObject* pkObserver);
548
554 static void Register(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver);
555
561 static void Register(const DataPoolResource_t eDataID, DataPoolCallback pCallback);
562
566 static void UnregisterCallback(const DataPoolResource_t eDataID);
567
572 static void Unregister(const DataPoolResource_t eDataID, CGUIObject* pkObserver);
573
578 static void Unregister(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver);
579
583 static void Unregister(CGUIObject* pkObserver);
584
588 static void Unregister(CDataPoolConnector* pkObserver);
589
597 static void AutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID);
598
604 static void RemoveAutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID);
605
611
612#ifdef GUILIANI_STREAM_GUI
616 static void ReadDataPoolFromFile(const eC_String& rkPath);
617#endif
618
619#ifdef GUILIANI_WRITE_GUI
624 static void WriteDataPoolToFile(const eC_String& rkPath);
625#endif
626
631
637
639 static eC_UInt GetNOFDataPoolResources() { return ms_kDataPool.GetQuantity(); }
640
642 static void Clear();
643
645 static eC_UInt GetNumberOfPendingNotifications() { return ms_kPendingNotifications.GetQuantity(); }
646
649 static void DumpDataPool();
650
651private:
652 // @todo to access private functions: only it may access NotifyOfCreation and NotifyOfDestruction
653 friend class CGUIObject;
654 // @todo to access private functions: only it may access ProcessNotifications
655 friend class CGUI;
656
657 // Called by CGUIObject base class upon construction of an object, or after an object got sucessfully streamed.
658 static void NotifyOfCreation(CGUIObject* pkObject);
659
660 // Once per cycle, the GUI checks for changes in the DataPool and Notifies all registered observers
661 static void ProcessNotifications();
662
663 // Called by CGUI during initialization
664 static void Init();
665
666 // Called by CGUI during DeInit
667 static void DeInit();
668
669 // Never used - declared just to avoid accidental usage
670 CGUIDataPool();
672
673 // Resizes the internal array of data pool entries to the given size
674 static eC_Bool SetNOFDataPoolResources(const eC_UInt uiNumberOfDataPoolResources);
675
676 // Array of all known DataPoolEntries (Index within the Array = DataPoolResource_t of the respective DataPoolEntry)
677 static eC_TArray<CDataPoolEntry*> ms_kDataPool;
678
679 // Convenience typedef for a list of DataPoolEntries
681 // List of data pool entries, which shall be processed (And thus their observers be notified) during the next call to "ProcessNotifications"
682 static DataPoolEntryList ms_kPendingNotifications;
683
684 // The Data registry stores all ObjectIDs, which shall automatically be observing an entry in the datapool if the respective object is created
685 class DataRegistryElement
686 {
687 public:
688 DataRegistryElement(const ObjectHandle_t eObjectHandle) :
689 m_eObjectHandle(eObjectHandle)
690 {}
691
692 DataRegistryElement() :
693 m_eObjectHandle(NO_HANDLE)
694 {}
695
696 ObjectHandle_t m_eObjectHandle;
697 DataIDList m_DataIDList;
698
699 bool operator==(const DataRegistryElement& Value)
700 {
701 return Value.m_eObjectHandle == m_eObjectHandle;
702 }
703 };
704
705 typedef eC_TListDoubleLinked<DataRegistryElement> DataRegistryList;
706 static DataRegistryList ms_kDataRegistry;
707
708 // Semaphores guarding the DataPool
709 static eC_Semaphore ms_kDataPoolSema;
710 static eC_Semaphore ms_kNotificationQueueSema;
711};
712
713#else
714
716class CGUIDataPool
717{
718 friend class CGUIObject;
719 friend class CGUI;
720public:
721 static void Set(const DataPoolResource_t eDataID, CGUIValue kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0) {}
722 static void SetDataPoolEntry(const DataPoolResource_t eDataID, CDataPoolEntry* pkEntry) {}
723 static void Get(const DataPoolResource_t eDataID, CGUIValue& kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0) {}
724 static void Get(const DataPoolResource_t eDataID, CDataPoolEntry* pkEntry) {}
725 static void GetUpdate(CDataPoolConnector* pkObserver) {}
726 static void Register(const DataPoolResource_t eDataID, CGUIObject* pkObserver) {}
727 static void Register(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver) {}
728 static void Register(const DataPoolResource_t eDataID, DataPoolCallback pCallback) {}
729 static void Unregister(const DataPoolResource_t eDataID, CGUIObject* pkObserver) {}
730 static void Unregister(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver) {}
731 static void Unregister(CGUIObject* pkObserver) {}
732 static void Unregister(CDataPoolConnector* pkObserver) {}
733 static void AutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID) {}
734 static void RemoveAutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID) {}
735 static void ReadDataPoolFromFile(const eC_String& kPath) {}
736 static void WriteDataPoolToFile(const eC_String& kPath) {}
737 static const eC_TListDoubleLinked<ObjectHandle_t> GetAutoRegisteredObservers(const DataPoolResource_t eDataID) { static eC_TListDoubleLinked <ObjectHandle_t> kDummyList; return kDummyList; }
738 static DataPoolResource_t RegisterDynamicDataPoolResource() { return DUMMY_DATAPOOLRESOURCE; }
739 static void AddToNotificationQueue(CDataPoolEntry* pkEntry) {}
740 static eC_UInt GetNOFDataPoolResources() { return 0; }
741 static void Clear() {}
742 static eC_UInt GetNumberOfPendingNotifications() { return 0; }
743 static void DumpDataPool() {}
744private:
745
746 static void NotifyOfCreation(CGUIObject* pkObject) {}
747 static void ProcessNotifications() {}
748 static void Init() {}
749 static void DeInit() {}
750};
751
752#endif
753
754#endif
Helper Macros in Guiliani
DataPoolResource_t
List of data pool resource ids.
Definition: GUIDataPoolResource.h:35
Helper Macros in Guiliani
ObjectHandle_t
List of object resource ids.
Definition: GUIObjectHandleResource.h:55
Connects a GUIObject to the DataPool. DataPoolConnectors are used to observe values within the DataPo...
Definition: GUIDataPool.h:58
CDataPoolConnector(CGUIObject *pkParentObject=NULL)
Definition: GUIDataPool.h:63
void SetParentObject(CGUIObject *pkParentObject)
Definition: GUIDataPool.h:71
virtual void OnNotification(CDataPoolEntry &kObservedValue)
A single entry in the DataPool. The DataPoolEntry class represents a single entry (unique id + a valu...
Definition: GUIDataPool.h:108
CDataPoolEntry()
Default constructor.
DataPoolCallback m_pDataPoolCallback
Callback function, which will be called within NotifyDataPoolConnectors.
Definition: GUIDataPool.h:212
CDataPoolEntry(const CGUIValue &kValue)
eC_UInt m_uiMaxY
Maximum Y-Size of internal array.
Definition: GUIDataPool.h:203
void NotifyDataPoolConnectors()
Call OnNotification(CDataPoolEntry&) on observing DataPoolConnectors and call registered callback fun...
virtual ~CDataPoolEntry()
protected Destructor: only friend class CGUIDataPool is allowed to delete DataPoolEntries
Definition: GUIDataPool.h:215
virtual void OnNotification(const CGUIValue &kValue, const CGUIObject *const pkUpdatedObject, const eC_UInt uiX=0, const eC_UInt uiY=0)
virtual void Set(const CGUIValue &kValue, const eC_UInt uiX=0, const eC_UInt uiY=0)
void GetQuantity(eC_UInt &uiX, eC_UInt &uiY)
Definition: GUIDataPool.h:124
void SetQuantity(const eC_UInt uiX, const eC_UInt uiY, const eC_Bool &bPreserve=false)
eC_UInt m_uiMaxX
Maximum X-Size of internal array.
Definition: GUIDataPool.h:201
void SetCallback(DataPoolCallback pCallback)
Definition: GUIDataPool.h:182
virtual CDataPoolEntry & operator=(const CDataPoolEntry &kDataPoolEntry)
virtual const CGUIValue & Get(const eC_UInt uiX=0, const eC_UInt uiY=0)
DataPoolResource_t GetID() const
Definition: GUIDataPool.h:133
void AddObserver(CDataPoolConnector *pObserver)
Definition: GUIDataPool.h:174
eC_TArray< CGUIValue > m_kValue
Internal array of GUIValues.
Definition: GUIDataPool.h:206
DataPoolResource_t m_eDataID
DataPool resource ID associated with this entry.
Definition: GUIDataPool.h:209
Definition: GUIDataPool.h:465
static void Get(const DataPoolResource_t eDataID, CDataPoolEntry **ppkEntry)
static void GetQuantity(const DataPoolResource_t eDataID, eC_UInt &uiX, eC_UInt &uiY)
static DataPoolResource_t RegisterDynamicDataPoolResource()
eC_TListDoubleLinked< DataPoolResource_t > DataIDList
Convenience typedef for a list of DataPoolResource_t.
Definition: GUIDataPool.h:468
static void AddToNotificationQueue(CDataPoolEntry &kEntry)
static void Unregister(CGUIObject *pkObserver)
static void UnregisterCallback(const DataPoolResource_t eDataID)
static void Register(const DataPoolResource_t eDataID, CGUIObject *pkObserver)
static void SetQuantity(const DataPoolResource_t eDataID, const eC_UInt uiX, const eC_UInt uiY, const eC_Bool &bPreserve=false)
static eC_Bool Lock()
Definition: GUIDataPool.h:533
static void GetUpdate(CDataPoolConnector *pkObserver)
static void Get(const DataPoolResource_t eDataID, CGUIValue &kValue, const eC_UInt uiX=0, const eC_UInt uiY=0)
static void Unregister(CDataPoolConnector *pkObserver)
static void SetDataPoolEntry(const DataPoolResource_t eDataID, CDataPoolEntry *pkEntry)
static void Unregister(const DataPoolResource_t eDataID, CDataPoolConnector *pkObserver)
static void Set(const DataPoolResource_t eDataID, CGUIValue kValue, const eC_UInt uiX=0, const eC_UInt uiY=0)
static eC_Bool Unlock()
Definition: GUIDataPool.h:537
static void DumpDataPool()
static void WriteDataPoolToFile(const eC_String &rkPath)
static const eC_TListDoubleLinked< ObjectHandle_t > GetAutoRegisteredObservers(const DataPoolResource_t eDataID)
static void Register(const DataPoolResource_t eDataID, DataPoolCallback pCallback)
static void AutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID)
static void RemoveAutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID)
static void Unregister(const DataPoolResource_t eDataID, CGUIObject *pkObserver)
static eC_UInt GetNOFDataPoolResources()
Definition: GUIDataPool.h:639
static void Clear()
static void ReadDataPoolFromFile(const eC_String &rkPath)
static void Register(const DataPoolResource_t eDataID, CDataPoolConnector *pkObserver)
static eC_UInt GetNumberOfPendingNotifications()
Definition: GUIDataPool.h:645
GUI base class for any Guiliani application.
Definition: GUI.h:47
This is the Guiliani base class all controls are derived from.
Definition: GUIObject.h:79
Observer Base class for Observer-Design-Pattern within Guiliani.
Definition: GUIObserver.h:28
Subject Base class for Observer-Design-Pattern within Guiliani.
Definition: GUISubject.h:34
void AddObserver(CGUIObserver *pObserver)
CGUIValue stores a single value in one specific type.
Definition: GUIValue.h:25
eC_UInt GetQuantity() const
Definition: eC_TList_doubleLinked.h:587
bool operator==(const NSmartPtr::SharedPtr< C1 > &a, const NSmartPtr::SharedPtr< C2 > &b)
Definition: SharedPtr.h:240