Guiliani  Version 2.6 revision 7293 (documentation build 12)
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
618 static eC_Bool ReadDataPoolFromFile(const eC_String& rkPath);
619#endif
620
621#ifdef GUILIANI_WRITE_GUI
626 static void WriteDataPoolToFile(const eC_String& rkPath);
627#endif
628
633
639
641 static eC_UInt GetNOFDataPoolResources() { return ms_kDataPool.GetQuantity(); }
642
644 static void Clear();
645
647 static eC_UInt GetNumberOfPendingNotifications() { return ms_kPendingNotifications.GetQuantity(); }
648
651 static void DumpDataPool();
652
653private:
654 // @todo to access private functions: only it may access NotifyOfCreation and NotifyOfDestruction
655 friend class CGUIObject;
656 // @todo to access private functions: only it may access ProcessNotifications
657 friend class CGUI;
658
659 // Called by CGUIObject base class upon construction of an object, or after an object got sucessfully streamed.
660 static void NotifyOfCreation(CGUIObject* pkObject);
661
662 // Once per cycle, the GUI checks for changes in the DataPool and Notifies all registered observers
663 static void ProcessNotifications();
664
665 // Called by CGUI during initialization
666 static void Init();
667
668 // Called by CGUI during DeInit
669 static void DeInit();
670
671 // Resizes the internal array of data pool entries to the given size
672 static eC_Bool SetNOFDataPoolResources(const eC_UInt uiNumberOfDataPoolResources);
673
674private:
675 // The Data registry stores all ObjectIDs, which shall automatically be observing an entry in the datapool if the respective object is created
676 class DataRegistryElement
677 {
678 public:
679 DataRegistryElement(const ObjectHandle_t eObjectHandle) :
680 m_eObjectHandle(eObjectHandle)
681 {}
682
683 DataRegistryElement() :
684 m_eObjectHandle(NO_HANDLE)
685 {}
686
687 ObjectHandle_t m_eObjectHandle;
688 DataIDList m_DataIDList;
689
690 bool operator==(const DataRegistryElement& Value)
691 {
692 return Value.m_eObjectHandle == m_eObjectHandle;
693 }
694 };
695
696 typedef eC_TListDoubleLinked<DataRegistryElement> DataRegistryList;
697
698 // Convenience typedef for a list of DataPoolEntries
699 typedef eC_TListDoubleLinked<CDataPoolEntry*> DataPoolEntryList;
700
701private:
702 // Array of all known DataPoolEntries (Index within the Array = DataPoolResource_t of the respective DataPoolEntry)
703 static eC_TArray<CDataPoolEntry*> ms_kDataPool;
704
705 // List of data pool entries, which shall be processed (And thus their observers be notified) during the next call to "ProcessNotifications"
706 static DataRegistryList ms_kDataRegistry;
707 static DataPoolEntryList ms_kPendingNotifications;
708
709 // Semaphores guarding the DataPool
710 static eC_Semaphore ms_kDataPoolSema;
711 static eC_Semaphore ms_kNotificationQueueSema;
712};
713
714#else
715
717class CGUIDataPool
718{
719 friend class CGUIObject;
720 friend class CGUI;
721public:
722 static void Set(const DataPoolResource_t eDataID, CGUIValue kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0) {}
723 static void SetDataPoolEntry(const DataPoolResource_t eDataID, CDataPoolEntry* pkEntry) {}
724 static void Get(const DataPoolResource_t eDataID, CGUIValue& kValue, const eC_UInt uiX = 0, const eC_UInt uiY = 0) {}
725 static void Get(const DataPoolResource_t eDataID, CDataPoolEntry* pkEntry) {}
726 static void GetUpdate(CDataPoolConnector* pkObserver) {}
727 static void Register(const DataPoolResource_t eDataID, CGUIObject* pkObserver) {}
728 static void Register(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver) {}
729 static void Register(const DataPoolResource_t eDataID, DataPoolCallback pCallback) {}
730 static void Unregister(const DataPoolResource_t eDataID, CGUIObject* pkObserver) {}
731 static void Unregister(const DataPoolResource_t eDataID, CDataPoolConnector* pkObserver) {}
732 static void Unregister(CGUIObject* pkObserver) {}
733 static void Unregister(CDataPoolConnector* pkObserver) {}
734 static void AutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID) {}
735 static void RemoveAutoRegister(const DataPoolResource_t eDataID, const ObjectHandle_t eObjectID) {}
736 static eC_Bool ReadDataPoolFromFile(const eC_String& kPath) {}
737 static void WriteDataPoolToFile(const eC_String& kPath) {}
738 static const eC_TListDoubleLinked<ObjectHandle_t> GetAutoRegisteredObservers(const DataPoolResource_t eDataID) { static eC_TListDoubleLinked <ObjectHandle_t> kDummyList; return kDummyList; }
739 static DataPoolResource_t RegisterDynamicDataPoolResource() { return DUMMY_DATAPOOLRESOURCE; }
740 static void AddToNotificationQueue(CDataPoolEntry* pkEntry) {}
741 static eC_UInt GetNOFDataPoolResources() { return 0; }
742 static void Clear() {}
743 static eC_UInt GetNumberOfPendingNotifications() { return 0; }
744 static void DumpDataPool() {}
745private:
746
747 static void NotifyOfCreation(CGUIObject* pkObject) {}
748 static void ProcessNotifications() {}
749 static void Init() {}
750 static void DeInit() {}
751};
752
753#endif
754
755#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 eC_Bool ReadDataPoolFromFile(const eC_String &rkPath)
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:641
static void Clear()
static void Register(const DataPoolResource_t eDataID, CDataPoolConnector *pkObserver)
static eC_UInt GetNumberOfPendingNotifications()
Definition: GUIDataPool.h:647
GUI base class for any Guiliani application.
Definition: GUI.h:39
This is the Guiliani base class all controls are derived from.
Definition: GUIObject.h:81
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