INOS
cinostaskex.h
Go to the documentation of this file.
1//******************************************************************************
26//******************************************************************************
27
28#ifndef INC_CINOSTASKEX_H
29#define INC_CINOSTASKEX_H
30
31//
32//------------------------------------------------------------------------------
33// includes
34//------------------------------------------------------------------------------
35//
36// system
37#include <inos.h>
38#include <inos_lib.h>
39#include <cinosbus.h>
40#include <cinosmcnvram.h>
41#include <cmcresult.h>
42#include <cinostaskexdef.h>
43#include <cincotype.h>
44#include <cinoseventloggerdef.h>
45#include <cinostaskexstatesdef.h>
46#include <cinosmcdata.h>
47
48#ifdef INOS_INCOV
49#include <cincovdispatcher.h>
50#endif
51//
52// C++
53#include <unordered_map>
54#include <string>
55#include <atomic>
56
57//
58// project
59//
60//------------------------------------------------------------------------------
61// defines
62//------------------------------------------------------------------------------
63//
64#ifdef _MSC_VER
65#define INOS_TASKEX_MESSAGE( apFormat, ... ) \
66 InternLog( DF_INOS_EVENT_LOGGER_LEVEL_TASKMSG, \
67 DF_INOS_EVENT_LOGGER_FONT_COLOR_BLUE, apFormat, __VA_ARGS__ )
68#else
69#define INOS_TASKEX_MESSAGE( apFormat, aArgs... ) \
70 InternLog( DF_INOS_EVENT_LOGGER_LEVEL_TASKMSG, \
71 DF_INOS_EVENT_LOGGER_FONT_COLOR_BLUE, apFormat, ##aArgs )
72#endif
73//
74#define DF_INOS_TASKEX_MAX_CMD 128 // max. number of commands (for statistics)
75#define DF_INOS_TASKEX_MAX_AND_TRG 4 // max. number of 'and' trigger
76#define DF_INOS_TASKEX_MAX_TRG_VAL_NAME 256 // max. allowed trigger value name length
77#define DF_INOS_TASKEX_STARTUP_PRIO DF_INOS_TASK_PRIO_USER_HIGHEST // taskex startup priority
78
79#define INOS_MCLOG_REPLY_EX(aMsg,rpl,err) \
80 { \
81 if( CINOSEventLogger::Instance().IsLevelActive(DF_INOS_EVENT_LOGGER_LEVEL_TASKMSG) ) { \
82 if (!aMsg->GetNoTrace()) { \
83 double tim = double(0.000001)*g_pTarget->ConvertToNanoSeconds(GetSystemTicks()); \
84 InternLog( DF_INOS_EVENT_LOGGER_LEVEL_TASKMSG, \
85 DF_INOS_EVENT_LOGGER_FONT_COLOR_BLUE, \
86 "RPL:TimStp,%f:Rec,%s:Id," PFIID ":Snd,%s:Que,%1.6fms:Typ," PFU32 ":Ret," PF0X32,\
87 tim, GetName(), aMsg->GetId(), GetName(), tim, (uint32)rpl, (uint32) err);\
88 } \
89 } \
90 }
91
92// macro to 'force' a mclog conform message reply in the eventlog
93#define INOS_MCLOG_REPLY(aMsg) INOS_MCLOG_REPLY_EX(aMsg,eRplOk,0)
94
95//------------------------------------------------------------------------------
96// forward declarations
97//------------------------------------------------------------------------------
98
99class CINOSMcMessage;
100class CINOSMcNvRam;
101class CINOSMcData;
102class CINOSMcDataInst;
103class CINOSTaskEx;
106
107#ifdef INOS_INCOV
108class CINCOVServerSession;
109class CINCOVOperation;
110class SINCOVLazyContext;
111#endif
112
113//------------------------------------------------------------------------------
114// class CINOSTaskExMsgTrigger
115//------------------------------------------------------------------------------
116//
118{
119 friend class CINOSTaskEx;
120 friend class CINOSTaskExMsg;
121
122 // public members
123 public :
125 enum {
126 eTypVar,
127 eTypEvent,
128 eTypTicks
129 };
131 uint32 GetType()
132 { return m_uType;};
133
134 // protected members
135 protected :
137 explicit CINOSTaskExMsgTrigger (uint32 auType)
138 { m_uType = auType;};
141 {};
143 uint32 m_uType;
144
147};
148//
149//------------------------------------------------------------------------------
150// class CINOSTaskExMsgTriggerVar
151//------------------------------------------------------------------------------
152//
154{
155 friend class CINOSTaskEx;
156 friend class CINOSTaskExMsg;
157
158 // public members
159 public :
161 CINOSTaskExMsgTriggerVar (const char* apVarName, const char* apCompare,
162 real64 arValue);
164 CINOSTaskExMsgTriggerVar (const char* apVarName, const char* apCompare,
165 const char* apValue);
169 const char* GetName()
170 { return &m_cName[0];};
172 const char* GetCompare()
173 { return &m_cCompare[0];};
175 real64 GetValue(CINOSMcData* apData=0);
176
177 // protected members
178 protected :
180 char m_cName[64];
182 char m_cCompare[8];
184 real64 m_rValue;
186 char* m_pValue;
187
190};
191//
192//------------------------------------------------------------------------------
193// class CINOSTaskExMsgTriggerEvent
194//------------------------------------------------------------------------------
195//
197{
198 friend class CINOSTaskEx;
199 friend class CINOSTaskExMsg;
200
201 // public members
202 public :
204 CINOSTaskExMsgTriggerEvent (const char* apSynName, real64 arParamValue,
205 const char* apParamType, const char* apTaskName, const char* apCmdName,
206 const char* apEventName);
208 CINOSTaskExMsgTriggerEvent (const char* apSynName, const char* apParamValue,
209 const char* apParamType, const char* apTaskName, const char* apCmdName,
210 const char* apEventName);
214 const char* GetSynName()
215 { return &m_cSynName[0];};
217 const char* GetTaskName()
218 { return &m_cTaskName[0];};
220 const char* GetCmdName()
221 { return &m_cCmdName[0];};
223 const char* GetEventName()
224 { return &m_cEventName[0];};
226 const char* GetParamType()
227 { return &m_cParamType[0];};
229 real64 GetParamValue(CINOSMcData* apData=0);
230
231 // protected members
232 protected :
234 inosName32 m_cSynName;
236 inosName64 m_cTaskName;
238 inosName64 m_cCmdName;
240 inosName32 m_cEventName;
247
250};
251//
252//------------------------------------------------------------------------------
253// class CINOSTaskExMsgTriggerTicks
254//------------------------------------------------------------------------------
255//
257{
258 friend class CINOSTaskEx;
259 friend class CINOSTaskExMsg;
260
261 // public members
262 public :
264 CINOSTaskExMsgTriggerTicks (const char* apSynName, real64 arParamValue,
265 const char* apParamType, uint64 auBusTicks, uint8 auBusId);
270 const char* GetSynName()
271 { return &m_cSynName[0];};
273 const char* GetParamType()
274 { return &m_cParamType[0];};
277 { return m_rParamValue;};
279 uint64 GetBusTicks()
280 { return m_uBusTicks;};
282 uint64 GetBusId()
283 { return m_uBusId;};
285 void AdjTicksMs(int32 aiMs);
287 void AdjTicks(int32 aiTicks)
288 { m_uBusTicks += aiTicks;};
289
290 // protected members
291 protected :
293 inosName32 m_cSynName;
300 //; bus id
301 uint8 m_uBusId;
302
305};
306//
307//------------------------------------------------------------------------------
308// class CINOSTaskExMsgNode
309//------------------------------------------------------------------------------
310//
312{
313 friend class CINOSTaskEx;
316 { m_pTask = apTask; m_pMsg = apMsg; m_pNext=0;};
318 CINOSTaskEx* m_pTask;
320 CINOSTaskExMsg* m_pMsg;
322 CINOSTaskExMsgNode* m_pNext;
325};
326//
327//------------------------------------------------------------------------------
328// class CINOSTaskExDeferredMsg
329//------------------------------------------------------------------------------
330//
332{
333public:
334 virtual CINOSTaskExMsg* GetMsg() { return m_pMsg; };
335
336private:
337 friend class CINOSTaskEx;
338 friend class CINOSMcModule;
339 friend class CINOSMcRobot;
341 CINOSTaskExDeferredMsg (CINOSTaskExMsg* apMsg, tMsgId auReplyId, void* apHandler,
342 void* apObject, bool abHandlesCommands)
343 { m_pMsg = apMsg; m_uReplyId = auReplyId; m_pHandler = apHandler;
344 m_pObject = apObject; m_pNext=0; m_pPrev = 0;
345 m_bHandlesCommands = abHandlesCommands;};
347 virtual ~CINOSTaskExDeferredMsg() {}
349 CINOSTaskExMsg* m_pMsg;
351 tMsgId m_uReplyId;
353 void* m_pHandler;
355 void* m_pObject;
357 bool m_bHandlesCommands;
359 CINOSTaskExDeferredMsg* m_pNext;
361 CINOSTaskExDeferredMsg* m_pPrev;
364};
365//
366//------------------------------------------------------------------------------
367// class CINOSTaskExCmdDesc
368//------------------------------------------------------------------------------
369//
371{
372 friend class CINOSTaskEx;
376 uint32 m_uCount;
378 nvuint32* m_pCount;
380 uint64 m_uStart;
382 uint64 m_uTime;
384 uint64 m_uTotal;
387};
388
389
390//------------------------------------------------------------------------------
391// class CINOSTaskExMsg
392//------------------------------------------------------------------------------
393//
394class CINOSTaskEx;
396{
397 //--- user interface ---------------------------------------------------
398
399 // public member functions
400 public :
402 CINOSTaskExMsg(uint32 auMsgType, uintptr auMsgCode,
405 CINOSTaskExMsg(uint32 auMsgType, const char* apMsgName, uintptr auMsgCode=0);
410
412 void FstParam()
413 { m_pTmpParam = 0;};
415 void LstParam()
416 { CINOSTaskExMsgParam* p = m_pParam;
417 while (p->m_pNext) p = p->m_pNext;
418 m_pTmpParam = p;
419 };
421 template<class T> CINOSTaskExMsgParam* AddParam(T);
423 template<class T> CINOSTaskExMsgParam* AddParam(const char* apName, T);
425 template<class T> CINOSTaskExMsgDefaultParam* AddDefaultParam(const char* apName, T aValue);
427 CINOSTaskExMsgParam* AddParam(const char* apName, char* apValue);
429 CINOSTaskExMsgParam* AddParam(const char* apName, const char* apValue);
433 CINOSTaskExMsgParam* AddJsonParam(const char* apJson);
434
436 template<class T> T GetParam();
438 template<class T> T GetFirstParam();
440 char* GetParam();
441 CINOSTaskExMsgParam* GetParamPtr() {
442 return iGetParam();
443 }
446 CINOSTaskExMsgParam* GetFirstParamPtr(bool abUseInternalIterator = true);
448 uint32 GetParamCnt() const
449 {return m_uParamCnt;};
450
453 { m_pTmpResult = 0;};
458 template<class T> void AddResult(T, const char* apResultName = NULL);
462 void AddResult(char* apValue, const char* apResultName = NULL);
466 void AddResult(const char* apValue, const char* apResultName = NULL);
467
473 template<class T> void InsertResult(T, const char* apResultName = NULL);
478 void InsertResult(char* apValue, const char* apResultName = NULL);
483 void InsertResult(const char* apValue, const char* apResultName = NULL);
484
490 template<class T> void AppendResult(T, const char* apResultName = NULL);
495 void AppendResult(char* apValue, const char* apResultName = NULL);
500 void AppendResult(const char* apValue, const char* apResultName = NULL);
501
503 tMcAppError AddIncoItemAsResult(CINCOItem* apItem, bool abBitAsNumber = false);
506 void MoveResultsFromMcResult(CMcResult& aResult);
519
521 template<class T> T GetResult();
523 char* GetResult();
525 uint32 GetResultCount() const;
533 void SetTrigger(real64 arValue);
535 void SetTrigger(uint64 auBusTicks, uint8 auBusId);
537 void SetTrigger(const char* apVarName, const char* apCompare,
538 real64 arValue);
540 void SetTrigger(const char* apVarName, const char* apCompare,
541 const char* apValue);
543 void SetTrigger(const char* apSynName, real64 arParamValue,
544 const char* apParamType, const char* apTaskName, const char* apCmdName,
545 const char* apEventName);
547 void SetTrigger(const char* apSynName, const char* apParamValue,
548 const char* apParamType, const char* apTaskName, const char* apCmdName,
549 const char* apEventName);
551 void SetTrigger(const char* apSynName, real64 arParamValue,
552 const char* apParamType, uint64 auBusTicks, uint8 auBusId);
555 { return m_pTrigger;};
558 { if (m_pTrigger) {delete m_pTrigger; m_pTrigger = 0;}};
559
561 void AndTrigger(const char* apSynName, real64 arParamValue,
562 const char* apParamType, const char* apTaskName, const char* apCmdName,
563 const char* apEventName);
565 void AndTrigger(const char* apSynName, real64 arParamValue,
566 const char* apParamType, uint64 auBusTicks, uint8 auBusId);
570 void RemAndTrigger(uint32 auIndex=0, bool abDelete = true);
571
573 void SetSender(CINOSTask* apSender)
574 { m_pSender = apSender;};
576 void SetUser(void* apUser)
577 { m_pUser = apUser;};
579 void SetData(CINOSMcDataInst* apData)
580 { m_pData = apData;};
582 void SetSync(CINOSSync* apSync)
583 { m_pSync = apSync;};
585 void SetId(tMsgId aId)
586 { m_Id = aId;};
588 tMsgId GetId() const
589 { return m_Id;};
591 uint32 GetMsgType() const
592 { return m_uType;};
594 void SetMsgCode(uintnbr auMsgCode)
595 { m_uMsgCode = auMsgCode;};
597 uintnbr GetMsgCode() const
598 { return m_uMsgCode;};
600 void SetMsgSubCode(uint32 auMsgSubCode)
601 { m_uMsgSubCode = auMsgSubCode;};
603 uint32 GetMsgSubCode() const
604 { return m_uMsgSubCode;};
605 CINOSTaskExCmdBase* GetCommand() const
606 { return m_uType == CINOSTaskExDef::eMsgCall ?
607 (CINOSTaskExCmdBase*)m_uMsgCode :
608 nullptr;
609 }
611 void SetRetValue(uint32 auRetValue)
612 { m_uRetValue = auRetValue;};
614 uint32 GetRetValue() const
615 { return m_uRetValue;};
618 { return m_pSender;};
619 uint32 GetSenderId() const
620 { if (nullptr != m_pSender) return m_pSender->GetTaskId(); else return 0;};
623 { return m_pReceiver;};
624 uint32 GetReceiverId() const
625 { if (nullptr != m_pReceiver) return ((CINOSTask*)m_pReceiver)->GetTaskId(); else return 0;};
627 void* GetUser() const
628 { return m_pUser;};
630 CINOSMcDataInst* GetData() const
631 { return m_pData;};
634 { return m_pSync;};
636 uint32 GetFlags()
637 { return m_uFlags;};
639 void SetFlags(uint32 auFlags)
640 { m_uFlags = auFlags;};
642 void AddFlags(uint32 auFlags)
643 { m_uFlags |= auFlags;};
646 { m_uFlags |= eMsgFlgDeferred;};
648 bool GetDeferred() const
649 { return (m_uFlags & eMsgFlgDeferred)!=0;};
651 bool GetDone() const
652 { return (m_uFlags & eMsgFlgDone)!=0;};
654 bool GetPending() const
655 { return (m_uFlags & eMsgFlgPending)!=0;};
658 { m_uFlags |= eMsgFlgPending;};
660 bool GetCanceled() const
661 { return (m_uFlags & eMsgFlgCanceled)!=0;};
664 { m_uFlags |= eMsgFlgCanceled;};
667 { m_uFlags |= eMsgFlgPersistent;};
669 bool GetPersistent() const
670 { return (m_uFlags & eMsgFlgPersistent)!=0;};
673 { m_uFlags |= eMsgFlgFlushResistent;};
675 bool GetFlushResistent() const
676 { return (m_uFlags & eMsgFlgFlushResistent)!=0;};
678 bool GetSingle() const
679 { return (m_uFlags & eMsgFlgSingle)!=0;};
682 { m_uFlags |= eMsgFlgSingle;};
684 bool GetNoTrace() const
685 {
686 return (m_uFlags & eMsgFlgNoTrace)!=0 ||
687 (m_pData && (m_pData->GetFlag() & CINOSMcDataInst::eFlgNoTrace));
688 };
691 { m_uFlags |= eMsgFlgNoTrace;};
693 bool GetStatic() const
694 { return (m_uFlags & eMsgFlgStatic)!=0;};
697 {
698 m_uFlags |= eMsgFlgStatic;
699 INOS_CONCURRENCY_CHECK_FREE(this); // static messages may be used by other tasks.
700 };
703 { m_uFlags &= ~eMsgFlgStatic;};
704 bool GetAlwaysSyncSignal() const
705 { return (m_uFlags & eMsgFlgAlwaysSyncSignal)!=0;};
708 { m_uFlags |= eMsgFlgAlwaysSyncSignal;};
709 bool GetAlwaysReply() const
710 { return (m_uFlags & eMsgFlgAlwaysReply)!=0;};
713 { m_uFlags |= eMsgFlgAlwaysReply;};
715 void SetName(const char* apName)
716 { inos_strncpy(m_cName, apName, sizeof(m_cName));};
725 char* GetName(bool abResolveIfEmpty = false);
727 void SetInfo(const char* apInfo)
728 { inos_strncpy(m_cInfo, apInfo, sizeof(m_cInfo));};
730 char* GetInfo()
731 { return &m_cInfo[0];};
733 void SetBusTicks(uint64 auBusTicks)
734 { m_uBusTicks = auBusTicks;};
736 uint64 GetBusTicks() const
737 { return m_uBusTicks;};
739 uint64 GetQueueTicks() const
740 { return m_uQueueTicks;};
742 void SetBusId(uint8 auBusId)
743 { m_uBusId = auBusId;};
745 uint8 GetBusId() const
746 { return (uint8)m_uBusId;};
748 void SetIdInfo(tMsgId auIdInfo)
749 { m_uIdInfo = auIdInfo;};
752 { return m_uIdInfo;};
754 CINOSTaskExMsgParam* GetParam(const char* apName);
764#ifdef INOS_INCOV
767 bool GetINCOV(CINCOVServerSession*& opSession, CINCOVOperation*& opOperation);
769 void ReleaseINCOV(CINCOVServerSession& aSession);
770 bool InINCOVContext() const {
771 return (m_pIncovContext ? true : false);
772 }
773#else
774 bool InINCOVContext() const {
775 return false;
776 }
777#endif
778
779 // msg flags
780 enum EMsgFlag {
781 eMsgFlgNone = 0x00000000,
782 eMsgFlgSyncron = 0x00000001,
783 eMsgFlgDeferred = 0x00000002,
784 eMsgFlgPending = 0x00000004,
785 eMsgFlgCanceled = 0x00000008,
786 eMsgFlgPersistent = 0x00000010,
787 eMsgFlgFlushResistent = 0x00000020,
788 // The msg receiver can handle additional parameter, that are not
789 // specified in the prototype message object
790 eMsgFlgHasEllipsis = 0x00000040,
791 // Only one instance of the according message is allowed at any time
792 // (e.g. in the message queue or currently running). note that this
793 // won't work if the message code (i.e. the enum value) is 0.
794 eMsgFlgSingle = 0x00000080,
795 // don't give an event log trace, e.g. for inco worker commands
796 eMsgFlgNoTrace = 0x00000100,
797 eMsgFlgStatic = 0x00000200,
798 // message has oversized result
799 eMsgFlgOversizedResult = 0x00000400,
800 eMsgFlgAlwaysSyncSignal = 0x00000800,
801 eMsgFlgAlwaysReply = 0x00001000,
802 eMsgFlgDone = 0x80000000
803 };
804
805 //--- internals --------------------------------------------------------
806
807 friend class CINOSTaskEx;
808 // needs to have access to the first msg param (without tranparently reset
809 // any internal data, such as m_pTmpParam)
810 friend class CINOSTaskExTracer;
811 #if defined(INOS_COORDINATOR_SUPPORT)
812 friend class CINOSMcCoord;
813 #endif
814 #if defined(INOS_LUAINTERPRETER)
815 friend class CINOSMcLua;
816 friend class CINOSMcLuaTask;
817
818 #endif
819 friend class CINOSMcModule;
820 friend class CINOSMcMessage;
821 friend class CMcResult;
822 friend class CINOSTaskExMsgTest;
823 friend class CINOSTaskExMsgHistory;
824
825 // public members
826 public:
829 { return (strcmp(GetName(), aTaskExMsg.GetName())<0);}
830 int operator == (CINOSTaskExMsg& aTaskExMsg)
831 { return (strcmp(GetName(), aTaskExMsg.GetName())==0);}
832 int operator < (const char* aName)
833 { return (strcmp(GetName(), aName)<0);}
834 int operator == (const char* aName)
835 { return (strcmp(GetName(), aName)==0);}
836
837
840
841 // private methods
842 private:
844 CINOSTaskExMsgParam* iGetParam();
846 void iAddResult (CINOSTaskExMsgParam* apResult);
849 void iInsertResult (CINOSTaskExMsgParam* apResult);
852 void iAppendResult (CINOSTaskExMsgParam* apResult);
854 CINOSTaskExMsgParam* iGetResult();
855#ifdef INOS_INCOV
857 void CopyIncovContext(SINCOVContext* apSrc);
859 void CopyIncovContext(SINCOVLazyContext* apSrc);
860#endif
861 // private members
862 private:
864 #if defined(INOS_TASKEXMSG_NAME_EXTENDED_LENGTH)
865 inosName128 m_cName;
866 #else
867 inosName64 m_cName;
868 #endif
870 inosName64 m_cInfo;
872 uint64 m_uQueueTicks;
874 uint64 m_uBusTicks;
876 uint16 m_uType;
878 uint16 m_uBusId;
880 tMsgId m_Id;
882 tMsgId m_uIdInfo;
884 uintptr m_uMsgCode;
886 uint32 m_uMsgSubCode;
888 uint32 m_uRetValue;
890 uint32 m_uFlags;
892 uint32 m_uParamCnt;
894 void* m_pUser;
896 CINOSMcDataInst* m_pData;
898 CINOSSync* m_pSync;
900 CINOSTaskExMsgParam* m_pParam;
902 CINOSTaskExMsgParam* m_pTmpParam;
904 CINOSTaskExMsgParam* m_pResult;
906 CINOSTaskExMsgParam* m_pTmpResult;
908 CINOSTaskExMsgTrigger* m_pTrigger;
910 uint32 m_uAndTriggerInd;
912 CINOSTaskExMsgTrigger* m_pAndTrigger[DF_INOS_TASKEX_MAX_AND_TRG];
914 CINOSTask* m_pSender;
918 CINOSTaskEx* m_pReceiver;
921 bool m_bCreateMcLogTraces;
922
923#ifdef INOS_INCOV
925 SINCOVLazyContext* m_pIncovContext = nullptr;
926#endif
927 public:
928 INOS_CONCURRENCY_CHECK_DECLARE;
929 private:
932};
934template<> const char* CINOSTaskExMsg::GetParam<const char*>();
935template<> char* CINOSTaskExMsg::GetParam<char*>();
936
937//------------------------------------------------------------------------------
938// class CINOSTaskExMsg
939//------------------------------------------------------------------------------
940//
942{
943 //--- user interface ---------------------------------------------------
944
945 // public member functions
946 public :
948 CINOSTaskExMsgUser(uint32 auMsgCode, uint32 auFlags=0)
949 : CINOSTaskExMsg(CINOSTaskExDef::eMsgUser, auMsgCode, DF_INOS_ASYNCHRONOUS)
950 {
951 // set static
952 SetStatic();
953 // set additional flags
954 AddFlags(auFlags);
955 }
956
959};
960
961//------------------------------------------------------------------------------
962// class CINOSTaskEx
963//------------------------------------------------------------------------------
964//
965class CINOSTaskEx : public CINOSTask
966{
967 //--- user interface ---------------------------------------------------
968
969 // public member functions
970 public :
972 uint32 GetState();
974 virtual void SetState(uint32 auState)
975 { m_uState = auState;};
977 bool IsCmdBusy(uintptr auCmdCode);
979 bool IsCmdDeferred(uint32 auCmdCode);
982 virtual bool IsCmdAllowed(CINOSTaskExMsg* apMsg)
983 { return false;};
985 const char* GetParam() const
986 { return &m_cParam[0];};
988 const char* GetType() const
989 { return &m_cType[0];};
991 const char* GetAliasName() const
992 { return &m_cAliasName[0];};
994 void SetAliasName(const char* apAlias)
995 { inos_strncpy(&m_cAliasName[0], apAlias, sizeof(m_cAliasName));};
997 virtual const char* GetIncoName();
999 virtual const char* GetTreeName()
1000 { return m_pTreeName;};
1001
1003 enum {
1004 eSourceIdMsg = 255,
1005 eSourceIdLua = 254,
1006 eSourceIdFastLoad = 253,
1007 };
1010 { return m_uSourceId; };
1011
1014 { return m_pParent;};
1019 static tMsgId GetMsgId(uint32 auId, uint32 auMask);
1020
1022 virtual CMcResult Startup(real64 arStage);
1023
1025 bool GetCommand(const char* apName) const;
1027 bool GetOption(const char* apName) const;
1029 bool GetOption(const char* apBase, const char* apName) const;
1031 bool GetOption(const char* apParams, const char* apBase, const char* apName) const;
1034 bool GetOptionEx(const char* apBase) const;
1036 bool GetOptionStr(const char* apBase, char* apResult, uint32 auSize) const;
1038 bool GetOptionStr(const char* apParams, const char* apBase, char* apResult, uint32 auSize) const;
1040 bool GetOptionNbr(const char* apBase, uintnbr& auNumber) const;
1042 bool GetOptionNbr(const char* apParams, const char* apBase, uintnbr& auNumber) const;
1044 bool GetOption(uint32 auOption) const
1045 {return (m_uOptions & auOption)!=0;};
1047 bool GetFlag(const char* apName) const;
1049 bool GetFlag(uint64 auFlag) const
1050 { return (GetFlags() & auFlag)!=0;};
1052 uint64 GetFlags() const
1053 { return m_uFlags; };
1055 bool GetRequest(uint32 auRequest) const
1056 { return (m_uRequests & auRequest)!=0;};
1058 bool GetCritical(uint32 auCritical) const
1059 { return (m_uCriticals & auCritical)!=0;};
1060
1062 virtual CMcResult SetFlag(const char* apName, CINOSSync* apSync=DF_INOS_SYNCHRONOUS);
1064 virtual CMcResult ClrFlag(const char* apName, CINOSSync* apSync=DF_INOS_SYNCHRONOUS);
1066 virtual CMcResult StopMsg(tMsgId atMsgId, CINOSSync* apSync=DF_INOS_SYNCHRONOUS);
1067
1072 virtual CMcResult SetIdleTimeout(uint32 auIdleTimeout, CINOSSync* apSync=DF_INOS_SYNCHRONOUS);
1073 uint32 GetIdleTimeout() const
1074 { return m_uIdleTimeout; };
1075
1079 void SetDispatchFlag(uint32 auFlag)
1080 { INOS_OR(m_uDispatchFlags, auFlag); };
1082 void ClrDispatchFlag(uint32 auFlag)
1083 { INOS_AND(m_uDispatchFlags, ~auFlag); };
1085 uint32 GetDispatchFlag() const
1086 { return m_uDispatchFlags; };
1087
1089 virtual uint32 Shutdown(CINOSSync* apSync=DF_INOS_SYNCHRONOUS) override;
1090 #ifdef INOS_MULTICORE
1092 void _SwitchCore();
1094 virtual CMcResult SwitchCore(uint32 auCoreId, CINOSSync* apSync=DF_INOS_SYNCHRONOUS);
1095 #endif
1096
1098 virtual tMsgId PutCmd(uint32 auCommand);
1100 virtual CMcResult PutMsg(CINOSTaskExMsg* apMsg, tMsgId aMsgId=0);
1101
1108 virtual CMcResult PutMsgEx(CINOSTaskExMsg* apMsg, uint32 auFlags, tMsgId aMsgId=0);
1109
1111 virtual void PutReply(CINOSTaskExMsg* apMsg, tMsgId aMsgId);
1113 virtual CINOSTaskQueue* GetMsgQueue()
1114 { return m_pMsgQueue;};
1115
1117 CINOSTaskExMsg* GetActMsg() {return m_pActMsg;};
1118
1120 virtual const CINOSTaskExMsg* GetCommandMsg(const char* apName)
1121 { return m_pCommands->Find(apName);};
1122
1130 virtual CINOSTaskExMsg* CreateMsgFromCommand(const char* apName,
1132
1144 template<typename... ParamType>
1145 CMcResult CallCommand(const char* apName,
1146 ParamType... aParams,
1148 {
1149 // Actual task is different to this task?
1150 if(ActualTask() != this) {
1151 // yes -> lock the commands to protect from modification
1152 m_CommandsMutex.Request();
1153 }
1154
1155 // Get the message
1156 CINOSTaskExMsg* pCmdMsg = m_pCommands->Find(apName);
1157 if(nullptr == pCmdMsg) {
1158 if(ActualTask() != this) {
1159 m_CommandsMutex.Release();
1160 }
1161 // Not found, return error
1162 return CMcResult((tMcAppError)INOS_MCMSG_CODE_TSKEX_UNKNOWN);
1163 }
1164 // Create call message
1165 CINOSTaskExMsg* pCallMsg = new CINOSTaskExMsg(pCmdMsg->GetMsgType(),
1166 pCmdMsg->GetMsgCode(), apSync);
1167
1168 // Copy sub-code
1169 pCallMsg->SetMsgSubCode(pCmdMsg->GetMsgSubCode());
1170
1171 // Set Name
1172 pCallMsg->SetName(apName);
1173
1174 // Add the params
1175 CINOSTaskExMsgParam* ParamArray[sizeof...(aParams)] =
1176 { (pCallMsg->AddParam(aParams))... };
1177
1178 // check params
1179 auto pParam = pCmdMsg->GetFirstParamPtr(false);
1180 for(uint32 uIx = 0; uIx < sizeof...(aParams); uIx ++) {
1181 // extra params provided?
1182 if(nullptr == pParam) {
1183 // yes -> allowed?
1184 if((pCmdMsg->GetFlags() & CINOSTaskExMsg::eMsgFlgHasEllipsis)
1185 == 0) {
1186 // Not allowed -> Return error
1187 delete pCallMsg;
1189 }
1190 break;
1191 }
1192 // Check type
1193 if(pParam->GetType() != ParamArray[uIx]->GetType() ||
1194 pParam->GetTypeInfo() != ParamArray[uIx]->GetTypeInfo()) {
1195 // Wrong type -> return error
1196 delete pCallMsg;
1198 }
1199 pParam = pParam->GetNext();
1200 }
1201 // check for further needed params
1202 while(nullptr != pParam) {
1203 // further param mandatory?
1204 if(pParam->GetFlag() & CINOSTaskExMsgParam::eFlgMandatory) {
1205 // yes -> return error
1206 delete pCallMsg;
1208 }
1209 // Copy the default param
1210 pCallMsg->AddParam(pParam);
1211 pParam = pParam->GetNext();
1212 }
1213
1214 // Release commands mutex
1215 if(ActualTask() != this) {
1216 m_CommandsMutex.Release();
1217 }
1218
1219 // Finally put the message to call the command
1220 return PutMsg(pCallMsg);
1221 }
1222
1224 virtual const CINOSTaskExCmdHookBase* GetCommandHook(const char* apName)
1225 { return m_CommandHookRegister.Find(apName);};
1226
1228 virtual CINCOObject* GetRegister(CINCOObject* apObject=0);
1230 virtual CINCOObject* SetCmdObj(CINCOObject* apCmd);
1232 virtual CINCOObject* GetCmdObj();
1234 virtual CINCOObject* GetPropObj();
1236 virtual CINCOObject* GetOptionsObj()
1237 { return m_pOptions;};
1239 virtual CINCOObject* GetFlagsObj()
1240 { return m_pFlags;};
1242 virtual CINCOObject* GetRequestsObj()
1243 { return m_pRequests;};
1245 virtual CINCOObject* GetCriticalsObj()
1246 { return m_pCriticals;};
1248 virtual CINCOObject* GetActObj();
1250 virtual CINCOObject* GetStatObj();
1251
1253 virtual void AddProp(CINCOItem* apItem);
1255 virtual void AddProp(const char* apName);
1257 virtual void AddProp();
1259 virtual void AddProp(const char* apName, nvreal64& aMember,
1260 real64 arDefault, real64 arMin, real64 arMax, const char* apUnit,
1261 uint32 auDigits, uint32 auCharactristics = defCharShowFix);
1263 virtual void AddProp(const char* apName, nvuint32& aMember,
1264 uint32 auDefault, uint32 auMin, uint32 auMax, const char* apUnit,
1265 uint32 auCharacteristics=defCharShowDec);
1267 virtual void AddProp(const char* apName, nvstring& aMember,
1268 const char* apDefault="", const char* apComboData=NULL);
1270 virtual void AddProp(const char* apName, nvlstring& aMember,
1271 const char* apDefault="");
1273 virtual void AddProp(const char* apName, nvbool& aMember,
1274 bool abDefault, uint32 auCharactristics=defCharShowDec);
1276 virtual void RemProp(const char* apName);
1277
1279 virtual void AddActual(CINCOItem* apItem);
1281 virtual void AddActual(const char* apName);
1283 virtual void AddActual();
1285 virtual void AddActual(const char* apName, nvreal64& aMember,
1286 real64 arDefault, real64 arMin, real64 arMax, const char* apUnit,
1287 uint32 auDigits);
1289 virtual void AddActual(const char* apName, nvuint32& aMember,
1290 uint32 auDefault, uint32 auMin, uint32 auMax, const char* apUnit,
1291 uint32 auCharacteristics=defCharShowDec);
1293 virtual void AddActual(const char* apName, nvstring& aMember,
1294 const char* apDefault=nullptr, const char* apComboData=nullptr);
1296 virtual void AddActual(const char* apName, nvlstring& aMember,
1297 const char* apDefault=nullptr);
1299 virtual void AddActual(const char* apName, nvbool& aMember,
1300 bool abDefault, uint32 auCharactristics=defCharShowDec);
1302 virtual void RemActual(const char* apName);
1303
1306 CINOSMcDataInst* apData, const char* apAlias);
1307
1309 constexpr static int GetLastCmd() {
1310 return eCmdINOSTaskExLast;
1311 }
1313 constexpr static int GetLastUsr() {
1314 return eUsrINOSTaskExLast;
1315 }
1317 friend CINOSMcMessage* GetMessageHnd(bool abSearch);
1319 CINOSMcMessage* GetMessageHndEx();
1321 void SetMessageHnd(CINOSMcMessage* apMessageHnd)
1322 {m_pMessageHnd = apMessageHnd;};
1324 friend tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode,
1325 uint32 auFlags, CINOSMcData* apInfo);
1327 friend tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode,
1328 uint32 auFlags, const char* apText, CINOSMcData* apInfo);
1330 friend tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode,
1331 uint32 auFlags, const char* apProperties);
1333 friend tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode,
1334 uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
1336 friend CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode,
1337 uint32 auFlags, CINOSMcData* apInfo);
1339 friend CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode,
1340 uint32 auFlags, const char* apText, CINOSMcData* apInfo);
1342 virtual CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode,
1343 uint32 auFlags, CINOSMcData* apInfo=0);
1345 virtual CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode,
1346 uint32 auFlags, const char* apText, CINOSMcData* apInfo=0);
1348 friend CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode,
1349 uint32 auFlags, const char* apProperties);
1351 friend CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode,
1352 uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
1354 friend CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode,
1355 uint32 auFlags, CINOSMcData* apInfo, const char* apText);
1357 virtual CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode,
1358 uint32 auFlags, CINOSMcData* apInfo=0, const char* apText=nullptr);
1360 friend CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode,
1361 uint32 auFlags, const char* apProperties);
1363 friend CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode,
1364 uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
1365
1367 friend CMcResult AckMessage(tMsgId aMsgId, uint32 auFlags);
1368 friend CMcResult AckMessageDelayed(tMsgId aMsgId, uint32 auFlags, uint32 auTime);
1370 friend CMcResult AckMessage(uint32 auMsgCode, uint32 auFlags, uint32 auMask);
1371 friend CMcResult AckMessageDelayed(uint32 auMsgCode, uint32 auFlags, uint32 auMask, uint32 auTime);
1373 friend CMcResult AckMessage(const CINOSTask* apOwner, uint32 auMsgType, uint32 auFlag);
1375 friend CMcResult RemMessage(const CINOSTask* apOwner);
1377 friend CMcResult RequestListen(uint32 auMsgType, uint32 auSetId, uint32 auAckId);
1379 friend CMcResult ReleaseListen();
1380
1382 friend CINOSMcNvRamGrp* GetNvRamGrp(bool abSearch);
1383
1384#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
1386 uint32 GetSuspendTimingCheckLimit() const {
1387 return m_uSuspendTimingCheckLimit;
1388 }
1390 void SetSuspendTimingCheckLimit(uint32 auLimit) {
1391 m_uSuspendTimingCheckLimit = auLimit;
1392 }
1393#endif
1394
1395 // public enumerations
1396 public :
1397
1399 enum {
1400 eMsgCmd=CINOSTaskExDef::eMsgCmd,
1401 eMsgCall=CINOSTaskExDef::eMsgCall,
1402 eMsgEvent=CINOSTaskExDef::eMsgEvent,
1403 eMsgReply=CINOSTaskExDef::eMsgReply,
1404 eMsgUser=CINOSTaskExDef::eMsgUser,
1405 eMsgSub=CINOSTaskExDef::eMsgSub,
1406 eMsgInternal=CINOSTaskExDef::eMsgInternal,
1407 eMsgMessage=CINOSTaskExDef::eMsgMessage
1408 };
1409
1411 enum ERplId {
1412 eRplOk=CINOSTaskExDef::eRplOk,
1413 eRplSkipped=CINOSTaskExDef::eRplSkipped,
1414 eRplInComplete=CINOSTaskExDef::eRplInComplete,
1415 eRplIgnored=CINOSTaskExDef::eRplIgnored,
1416 eRplPaused=CINOSTaskExDef::eRplPaused,
1417 eRplStopped=CINOSTaskExDef::eRplStopped,
1418 eRplCanceled=CINOSTaskExDef::eRplCanceled,
1419 eRplRejected=CINOSTaskExDef::eRplRejected,
1420 eRplFailed=CINOSTaskExDef::eRplFailed,
1421 eRplError=CINOSTaskExDef::eRplError,
1422 eRplFatal=CINOSTaskExDef::eRplFatal,
1423 eRplTimeout=CINOSTaskExDef::eRplTimeout
1424 };
1425
1426 // command codes
1427 enum {
1428 eCmdINOSTaskExFirst,
1429 eCmdFailure,
1430 eCmdStartup,
1431 eCmdShutdown,
1432 eCmdShutdownRequest,
1433 eCmdSwitchCore,
1434 eCmdSetFlag,
1435 eCmdClrFlag,
1436 eCmdStopMsg,
1437 eCmdSetIdleTimeout,
1438 eCmdINOSTaskExLast
1439 };
1440
1441 // user command codes
1442 enum {
1443 eUsrINOSTaskExFirst,
1444 eUsrMsgDone,
1445 eUsrNvUpdate,
1446 eUsrIdleTimeout,
1447 eUsrINOSTaskExLast
1448 };
1449
1450 // internal command codes
1451 enum {
1452 eIntINOSTaskExFirst,
1453 eIntAddCommand,
1454 eIntRemCommand,
1455 eIntDeleteCommand,
1456 eIntGetCommands,
1457 eIntGetProp,
1458 eIntSetProp,
1459 eIntAddProp,
1460 eIntGetActual,
1461 eIntSetActual,
1462 eIntAddActual,
1463 eIntINOSTaskExLast
1464 };
1465
1466 // message command codes
1467 enum {
1468 eMessageAdd,
1469 eMessageRemove,
1470 eMessageModify,
1471 eMessageAcknowledge,
1472 };
1473
1474 public:
1475
1476 // event codes
1477 enum {
1478 eEvtTicks,
1479 eEvtNs
1480 };
1481
1482 // states
1483 enum {
1484 eStaStartup = DEF_eStaStartup,
1485 eStaOff = DEF_eStaOff,
1486 eStaWait = DEF_eStaWait,
1487 eStaOn = DEF_eStaOn,
1488 eStaReady = DEF_eStaReady,
1489 eStaBusy = DEF_eStaBusy,
1490 eStaError = DEF_eStaError,
1491 eStaINOSTaskExLast
1492 };
1493
1494 // options
1495 enum {
1496 eOptOwner = 0x00000001, // owner protection (obsolete)
1497 eOptStat = 0x00000002, // statistics support
1498 eOptMsg = 0x00000004, // message handler
1499 eOptNvR = 0x00000008, // nvram handler
1500 eOptOvld = 0x0000010, // overloaded command names
1501 eOptCaS = 0x0000020, // check for asynch result support
1502 eOptResTsk2 = 0x0000040, // reserved for future use
1503 eOptResTsk3 = 0x0000080 // reserved for future use
1504 };
1505
1506 // flags (R - read only, W - read/write)
1507 enum {
1508 eFlgError = 0x00000001, // R error pending
1509 eFlgFatal = 0x00000002, // R fatal error pending
1510 eFlgEmergency=0x00000004, // R emergency pending
1511 eFlgSTO = 0x00000008, // R safe torque off (STO) pending
1512 eFlgResTsk4 = 0x00000010, // reserved for future use
1513 eFlgResTsk5 = 0x00000020, // reserved for future use
1514 eFlgResTsk6 = 0x00000040, // reserved for future use
1515 eFlgResTsk7 = 0x00000080 // reserved for future use
1516 };
1517
1518 // requests
1519 enum {
1520 eReqResTsk0 = 0x00000001, // reserved for future use
1521 eReqResTsk1 = 0x00000002, // reserved for future use
1522 eReqResTsk2 = 0x00000004, // reserved for future use
1523 eReqResTsk3 = 0x00000008, // reserved for future use
1524 eReqResTsk4 = 0x00000010, // reserved for future use
1525 eReqResTsk5 = 0x00000020, // reserved for future use
1526 eReqResTsk6 = 0x00000040, // reserved for future use
1527 eReqResTsk7 = 0x00000080 // reserved for future use
1528 };
1529
1530 // critical sections
1531 enum {
1532 eCrtSendMsg = 0x00000001, // send message pending
1533 eCrtResTsk1 = 0x00000002, // reserved for future use
1534 eCrtResTsk2 = 0x00000004, // reserved for future use
1535 eCrtResTsk3 = 0x00000008, // reserved for future use
1536 eCrtResTsk4 = 0x00000010, // reserved for future use
1537 eCrtResTsk5 = 0x00000020, // reserved for future use
1538 eCrtResTsk6 = 0x00000040, // reserved for future use
1539 eCrtResTsk7 = 0x00000080 // reserved for future use
1540 };
1541
1542 // dispatch flags
1543 enum {
1544 eDispFlagINCOSync = 0x00000001,
1545 };
1546
1547 // Flags to use in PutMsgEx/AddToInputQueue
1548 enum eTaskExMsgFlags {
1549 eMsgFlagNone = 0x00000000, //
1550 eMsgFlagNoWait = 0x00000001,
1551 };
1552
1553 // Enum to be used to determine how to dispatch a message
1554 enum EDispatchStyle {
1555 eDispatchNone,
1556 eDispatchNormal,
1557 eDispatchInternal,
1558 eDispatchPre
1559 };
1560
1561
1562 //--- internals --------------------------------------------------------
1563
1564 friend void _INI_0000_CINOSTaskEx();
1565 friend void _INI_0201_CINOSTaskEx();
1566 friend void _INI_0510_CINOSTaskEx();
1567 friend class CINOSTaskExState;
1568 friend class CINOSMcSync;
1569 friend class CINOSMcModule;
1570 friend class CINOSMcRobot;
1571 #if defined(INOS_COORDINATOR_SUPPORT)
1572 friend class CINOSMcCoord;
1573 #endif
1574 friend class CINOSMcLua;
1575 friend class CINOSMcMessage;
1576 friend class CINOSTaskExMsg;
1577 friend class CINOSTaskExMsgTest;
1578 friend class CINOSEventLogger;
1579
1580 // constructor / destructor
1581 public :
1583 CINOSTaskEx (const char* apName, const char* apParam=0,
1584 uint32 aStackSize=defDefaultStackSize,
1585 uint32 aPriority=defLowestPriority, bool aFloatingPoint=true,
1586 uint32 aTimeSlice=defDefaultTimeSlice, bool aInterruptsDisabled=false);
1588 CINOSTaskEx (const char* apName, const char* apType, const char* apParam=0,
1589 uint32 aStackSize=defDefaultStackSize,
1590 uint32 aPriority=defLowestPriority, bool aFloatingPoint=true,
1591 uint32 aTimeSlice=defDefaultTimeSlice, bool aInterruptsDisabled=false);
1593 virtual ~CINOSTaskEx();
1594
1595 // public members (used by container class)
1596 public:
1598 virtual void PostCreate(void* apParent);
1600 virtual bool PreDestroy(bool& bDeleteSelf);
1601
1604 { return (strcasecmp(GetTreeName(), aTaskEx.GetTreeName())<0);}
1605 int operator == (CINOSTaskEx& aTaskEx)
1606 { return (strcasecmp(GetTreeName(), aTaskEx.GetTreeName())==0);}
1607 int operator < (const char* aName)
1608 { return (strcasecmp(GetTreeName(), aName)<0);}
1609 int operator == (const char* aName)
1610 { return (strcasecmp(GetTreeName(), aName)==0);}
1611
1612 // private member functions
1613 private :
1615 static intnbr HandleTicksTriggers0(void*, intnbr);
1616 static intnbr HandleTicksTriggers1(void*, intnbr);
1617 static intnbr HandleTicksTriggers2(void*, intnbr);
1618 static intnbr HandleTicksTriggers3(void*, intnbr);
1619 static void HandleTicksTriggers(uint8 auBusId);
1623 uint32* GetEvtLevel(const uint32 auBitNumber) {
1625 const uint8 uArrayIndex = (uint8)(auBitNumber / 32);
1626 return &m_pLevel[uArrayIndex];
1627 }
1630 inline uint32 IsLevelActive(const uint32 auBitNumber) const {
1631 const uint8 uArrayIndex = (uint8)(auBitNumber / 32);
1632 const uint32 uLevel = (uint32)(1 << (auBitNumber % 32));
1633 return (m_pLevel[uArrayIndex] & uLevel);
1634 }
1635
1636 // protected member functions
1637 protected :
1639 void Create();
1641 virtual void Action() override;
1643 // Implements pre dispatch callback support for commands of type TINOSTaskExCmd.
1644 virtual bool PreDispatchMsg(CINOSTaskExMsg* apMsg);
1645
1647 virtual void PostDispatchMsg() {};
1649 virtual bool DispatchCmd(CINOSTaskExMsg* apMsg);
1651 virtual bool DispatchTmd(CINOSTaskExMsg* apMsg);
1653 virtual bool DispatchEvent(CINOSTaskExMsg* apMsg);
1655 virtual bool DispatchReply(CINOSTaskExMsg* apMsg);
1657 virtual bool DispatchUser(CINOSTaskExMsg* apMsg);
1659 virtual bool DispatchSub(CINOSTaskExMsg* apMsg);
1661 virtual bool DispatchInternal(CINOSTaskExMsg* apMsg);
1663 virtual bool DispatchMessage(CINOSTaskExMsg* apMsg);
1665 virtual bool DispatchOther(CINOSTaskExMsg* apMsg);
1666
1668 virtual void iFailure(CINOSTaskExMsg* apMsg);
1669
1671 virtual void iStartup(CINOSTaskExMsg* apMsg);
1673 virtual void iStartup(real64 arStage);
1675 virtual bool iPostStartup();
1677 virtual uint32 iAddRegisteredCommands();
1678
1680 virtual void iShutdown(CINOSTaskExMsg* apMsg);
1681 virtual void iShutdownRequest(CINOSTaskExMsg* apMsg);
1683 #ifdef INOS_MULTICORE
1684 virtual uint32 iSwitchCore(uint8 auCoreId);
1685 virtual void iSwitchCore(CINOSTaskExMsg* apMsg);
1686 #endif
1687
1689 virtual void iSetFlag(CINOSTaskExMsg* apMsg);
1690 virtual void iiSetFlag(const char* apName);
1692 virtual void iClrFlag(CINOSTaskExMsg* apMsg);
1694 virtual void iStopMsg(CINOSTaskExMsg* apMsg);
1696 virtual void iSetIdleTimeout(CINOSTaskExMsg* apMsg);
1698 virtual void iHandleIdleTimeout();
1701
1703 virtual void iCancelDeferred();
1704
1706 virtual void iAddCommand(CINOSTaskExMsg* apMsg);
1707
1709 virtual void iRemCommand(CINOSTaskExMsg* apMsg);
1710
1712 virtual void iDeleteCommand(CINOSTaskExMsg* apMsg);
1713
1715 virtual void iGetCommands(CINOSTaskExMsg* apMsg);
1716
1718 virtual void iGetProp(CINOSTaskExMsg* apMsg);
1719
1721 virtual void iSetProp(CINOSTaskExMsg* apMsg);
1722
1724 virtual void iAddProp(CINOSTaskExMsg* apMsg);
1725
1727 virtual void iGetActual(CINOSTaskExMsg* apMsg);
1728
1730 virtual void iSetActual(CINOSTaskExMsg* apMsg);
1731
1733 virtual void iAddActual(CINOSTaskExMsg* apMsg);
1734
1736 static uint32 iSetIncoItemsFromParamStruct(CINCOItem* apIncoItem,
1737 long alOffset, CINOSTaskExMsgParam* apParams, bool abOverwrite,
1738 inosName128& oErrorItemName);
1739
1741 virtual void iMessageAdd(CINOSTaskExMsg* apMsg);
1743 virtual void iMessageRemove(CINOSTaskExMsg* apMsg);
1745 virtual void iMessageModify(CINOSTaskExMsg* apMsg);
1748
1750 void Reply(CINOSTaskExMsg* apMsg, uint32 auReply, tMcAppError aAppError=0);
1752 template<class T> void ReplyParam(uint32 auReply, T);
1753
1755 virtual void SetTreeName(const char* apTreeName)
1756 { m_pTreeName = apTreeName;};
1758 virtual const char* GetStateText();
1759
1761 virtual void MsgDone(tMsgId aMsgId, tMcAppError aAppError = 0);
1762 // special public declaration (method is public but just callable in the
1763 // own task context)
1764 public:
1766 virtual void MsgDone(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1768 virtual void MsgDone(CINOSTaskExMsg* apMsg, ERplId aRplId, tMcAppError aAppError = 0);
1769 // protected again
1771 virtual void MsgDonePnd(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1773 virtual void MsgDonePnd(CINOSTaskExMsg* apMsg, ERplId aRplId, tMcAppError aAppError = 0);
1775 virtual void MsgInComplete(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1777 virtual void MsgIgnored(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1779 virtual void MsgPaused(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1781 virtual void MsgStopped(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1783 virtual void MsgCanceled(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1785 virtual void MsgRejected(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1787 virtual void MsgFailed(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1789 virtual void MsgError(CINOSTaskExMsg* apMsg, tMcAppError aAppError);
1791 virtual void MsgFatal(CINOSTaskExMsg* apMsg, tMcAppError aAppError);
1792
1793 // special public declaration (method is public but just callable in the
1794 // own task context)
1795 public:
1797 virtual tMsgId MsgDefer(CINOSTaskExMsg* apMsg, void* apHandler=0,
1798 void* apObject=0, bool abHandlesCommands = false);
1801 virtual tMsgId MsgDefer(CINOSTaskExMsg* apMsg, tMsgId aMsgId,
1802 void* apHandler=0, void* apObject=0, bool abHandlesCommands = false);
1803 // protected again
1804 protected:
1806 // tasks than the module task
1807 virtual void iUsrMsgDone(CINOSTaskExMsg* apMsg);
1809 friend void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName,
1810 uint64 auTicks, uint8 auBusId);
1812 friend void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName,
1813 uint64 auTicks, uint8 auBusId, uint32 auFlags);
1815 friend void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName,
1816 uint32 auMs);
1818 friend void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName,
1819 uint32 auFlags, uint32 auMs);
1820
1822 virtual void FlushTmd(tMsgId aId=0);
1823
1824 protected:
1826 virtual void _AddCommand(CINOSTaskExMsg* apMsg, CINCOObject* apMsgCmdObj,
1827 int16 aiOrder = 0);
1828 // special public declaration (method is public but just callable in the
1829 // own task context)
1830 public:
1832 virtual void AddCommand(const char* apName, uint32 auCode, CINCOProcedure* apProc);
1834 virtual void AddCommand(CINOSTaskExMsg* apMsg,
1835 uint64 aChar=0, // characteristics of object
1836 uint16 aKeyLevel=cKeyLevelMin, // keylevel of object
1837 bool abRegisterInco=true);
1839 virtual void AddCommand(CINOSTaskExMsg* apMsg, CINCOObject* apMsgCmdObj);
1841 virtual void AddCommand(const char* apName, uint32 auCode, uint32 auType=eMsgCmd);
1843 virtual void RemCommand(const char* apName);
1845 virtual void AddParam(const char* apName, real64 arValue, real64 arMin,
1846 real64 arMax, const char* apUnit, uint32 auChar, uint32 auFlags = 0);
1848 virtual void AddParam(const char* apName, const char* apValue, uint32 auFlags = 0);
1850 virtual void AddParam(const char* apName, const char* apValue,
1851 const char* apComboData, uint32 auFlags = 0);
1853 virtual void AddParam(const char* apName, const char* apUnit,
1854 uint32 auValue, uint32 auMin, uint32 auMax, uint32 auChar, uint32 auFlags = 0);
1856 virtual void AddParam_int32(const char* apName, const char* apUnit,
1857 int32 aiValue, int32 aiMin, int32 aiMax, uint32 auChar, uint32 auFlags = 0);
1859 // NOTE: we cannot overload AddParam for this like uint32, as this would break
1860 // compatibility with existing code (compiler complains about ambiguous calls)
1861 virtual void AddParam_uint64(const char* apName, const char* apUnit,
1862 uint64 auValue, uint64 auMin, uint64 auMax, uint32 auChar, uint32 auFlags = 0);
1864 virtual void AddParam_int64(const char* apName, const char* apUnit,
1865 int64 aiValue, int64 aiMin, int64 aiMax, uint32 auChar, uint32 auFlags = 0);
1867 virtual void AddParam(const char* apName, const char* apComboData,
1868 uint32 auValue, uint32 auMin, uint32 auMax, const char* apUnit,
1869 uint32 auChar, uint32 auFlags = 0);
1871 virtual void AddParam(const char* apName, bool abValue, uint32 auChar,
1872 uint32 auFlags = 0);
1880 template <typename T>
1881 void AddParam(CINCOItem* apItem, T aValue, uint32 auFlags = 0) {
1882 // ensure this method is only called in our own context
1883 ASSERT_ALWAYS(ActualTask()==this);
1884 // add param to actual message
1885 CINOSTaskExMsgParam* param=m_pTmpMsg->AddParam(apItem->GetName(), aValue);
1886 param->m_uFlags = auFlags;
1887 // add inco registration
1888 if (m_pActMsgObj) {
1889 m_pActMsgObj->Add(apItem, (int16)(m_uActParamCount++));
1890 } // end if
1891 }
1892 void ProcedureArgCheck(CINCOObject& aObject,
1893 const char* apParamName, const uint32 auExpectedIncoType);
1895 virtual void AddEllipsis();
1897 virtual void AddChildCommand(const char* apModuleName,
1898 const char* apFunctionName,
1899 CINOSTaskExMsg* apCmdMsg,
1900 bool abRegisterInco = true) {};
1902 virtual void RemChildCommand(const char* apModuleName,
1903 const char* apFunctionName) {};
1905 virtual void AddChildModule(const char* apModuleName) {};
1907 virtual void RemChildModule(const char* apModuleName) {};
1908
1910 // or may be added later
1912
1915
1916 // protected again
1917 protected:
1919 virtual void AdjTrigger(CINOSTaskExMsg* apMsg);
1920
1925
1928
1931
1933 void SetParent(CINOSTaskEx* apParent)
1934 { m_pParent = apParent;};
1935
1937 void MptHook();
1939 void NvUpdate();
1940 virtual void iNvUpdate(CINOSTaskExMsg* apMsg);
1941
1943 virtual void SetFlag(uint64 auFlag, bool abUpdateState = false)
1944 {
1945 m_uFlags |= auFlag;
1946 };
1948 virtual void ClrFlag(uint64 auFlag, bool abUpdateState = false)
1949 {
1950 m_uFlags &= ~auFlag;
1951 };
1953 virtual void SetRequest(uint32 auRequest)
1954 { INOS_OR(m_uRequests, auRequest); };
1956 virtual void ClrRequest(uint32 auRequest)
1957 { INOS_AND(m_uRequests, ~auRequest); };
1959 void SetCritical(uint32 auCritical)
1960 { INOS_OR(m_uCriticals, auCritical); };
1962 void ClrCritical(uint32 auCritical)
1963 { INOS_AND(m_uCriticals, ~auCritical); };
1964
1966 virtual CINOSSync* GetSync() override
1967 { return &m_sSyncCall; };
1969 virtual void SetCallResult(CMcResult aResult) override
1970 { m_SyncCallResult = aResult;};
1972 virtual CMcResult GetCallResult() override
1973 { return m_SyncCallResult;};
1974
1977 { m_sCritical.Request();};
1980 { m_sCritical.Release();};
1981
1990 bool AddToInputQueue(CINOSTaskExMsg* apMsg, uint32 auFlags=0);
1991
1997 virtual void MsgCompleted(CINOSTaskExMsg*& apMsg);
1998
2001 { return m_uReqPriority; };
2003 void SetRequestedPriority(uint8 auPrio)
2004 { m_uReqPriority = auPrio; };
2005
2006
2008 void HandleTriggerMsg(CINOSTaskExMsg* apMsg, EDispatchStyle aeDispStyle);
2009
2025 static void INCOItemToMessageResult(CINCOItem* apItem,
2026 const char* apParentPath, CINOSTaskExMsg* apMsg);
2027
2046 static void INCOItemsToMessageResults(CINCOItem* apItem,
2047 const char* apParentPath, CINOSTaskExMsg* apMsg);
2048
2050 CINOSTaskExMsg* GetTmpMsg() { return m_pTmpMsg; }
2051
2052#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
2054 virtual void OnResume(uint32 auLastState, uint32 auElapsedUs, void* apSync) override;
2055#endif
2056
2057 // public static functions
2058 public :
2065 static CINOSHook* AddMsgDoneHook(void* apHandler, void* apObject = NULL);
2066
2071 static void RemoveMsgDoneHook(CINOSHook* apHook);
2072
2073 static uint32 EncodeReplyCode(uint32 auReply, tMcAppError aAppError);
2074
2075 // protected static functions
2076 protected :
2077
2081 static void CallMsgDoneHooks(CINOSTaskExMsg* apMsg, ERplId aRplId, tMcAppError aAppError);
2082
2083 // private members
2084 private :
2086 inosName32 m_cType;
2088 inosName32 m_cAliasName;
2090 char m_cParam[1024];
2092 uint32 m_uSavState;
2094 CINOSTaskEx* m_pParent{};
2096 CINOSMcMessage* m_pMessageHnd{};
2098 CINOSMcNvRamGrp* m_pNvRamGrp;
2100 uintptr m_uDispatchCmdId;
2102 const char* m_pTreeName;
2103 protected :
2105 CINCOObject* m_pRegister;
2109 std::atomic<uint64> m_uFlags;
2115 uint32 m_uState;
2116 // private members
2117 private :
2121 uint32 m_uIdleTimeout;
2122 uint32 m_uIdleTimeoutAct;
2124 CINOSxmsHandler* m_pIdleTimeoutHook = nullptr;
2125#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
2126 protected :
2128 uint32 m_uSuspendTimingCheckLimit = DF_INOS_TIMINIG_CHECKS_SUSPEND_MAX_TIME_US;
2129#endif
2130 // private members
2131 private :
2133 #if defined(INOS_KERNEL_MSGID_64)
2134 static std::atomic<tMsgId> m_MsgId;
2135 #else
2136 static tMsgId m_MsgId;
2137 #endif
2139 CINOSTaskQueue* m_pMsgQueue;
2141 CINOSTaskExMsg* m_pTmpMsg;
2143 CINOSTaskExMsg* m_pActMsg;
2145 CINOSTaskExMsg* m_pSavMsg;
2147 CINOSTaskExMsgUser* m_pMsgUsrIdleTimeout;
2149 CINOSTaskExMsgUser* m_pMsgUsrNvUpdate;
2151 CINCOObject* m_pActMsgObj;
2153 uint32 m_uActParamCount;
2155 // if the commands binary tree is modified (add or remove) or if
2156 // the access to the command is from a different task.
2157 CINOSMutex m_CommandsMutex;
2159 TINOSNameBalancedBinaryTree<CINOSTaskExMsg>* m_pCommands;
2161 TINOSNameBalancedBinaryTree<CINOSTaskExCmdBase> m_CommandRegister;
2163 TINOSNameBalancedBinaryTree<CINOSTaskExCmdHookBase> m_CommandHookRegister;
2165 CINOSTaskExDeferredMsg* m_pDeferredMsg;
2167 uint32 m_uCmdCount;
2169 int16 m_iCurCmdOrder = 1;
2171 int16 m_iCurCmdRegOrder = 1;
2172
2174 CINOSTaskExCmdDesc* m_pCmdDesc[DF_INOS_TASKEX_MAX_CMD];
2176 uintid m_uMptHookId;
2178 uint32 m_uMptState;
2180 uint64 m_uMptTimeBase;
2182 uint64 m_uStaTotal;
2184 uint64 m_uStaTime[eStaINOSTaskExLast];
2186 nvuint64* m_pNvStaTime[eStaINOSTaskExLast];
2188 uint8 m_uNvStaIndex;
2190 CINOSxmsHandler* m_pNvUpdateHook = nullptr;
2192 uint8 m_uReqPriority;
2193
2195 CINCOObject* m_pCmd;
2197 CINCOObject* m_pProp;
2199 CINCOObject* m_pOptions;
2201 CINCOObject* m_pFlags;
2203 CINCOObject* m_pRequests;
2205 CINCOObject* m_pCriticals;
2207 CINCOObject* m_pAct;
2209 CINCOObject* m_pStat;
2211 CINCOObject* m_pStatState;
2213 CINCOObject* m_pStatCmd;
2214
2218 CINOSSync* m_pStartupSync;
2220 CINOSMutex m_sCritical;
2222 CINOSSync m_sSyncCall;
2224 CMcResult m_SyncCallResult;
2225
2230 uint32 m_uDispatchFlags;
2231
2233 uint32 m_uPutMsgFlags;
2234
2235 // nvprop helpers
2236
2237 // we use protected members here to give descendents a chance to work
2238 // with their own nv variable flavours
2239 protected:
2241 CINCOObject* m_pNvInitObj;
2246
2247 private:
2252 uint32 m_pLevel[DF_INOS_EVENT_LOGGER_LEVEL_ARRAY_SIZE];
2253
2255 CINOSTaskExMsg* m_pDeferedStartupMsg = nullptr;
2256
2260 struct SDynamicItem {
2261 public:
2262 SDynamicItem(CINOSMcVal* apValue, const char* apName, const char* apUnit,
2263 const char* apComboData) :
2264 m_pMcValue(apValue) {
2265
2266 // Copy the name
2267 const size_t cBufSize = strlen(apName) + 1;
2268 m_pName = new char[cBufSize];
2269 strncpy(m_pName, apName, cBufSize);
2270
2271 // Copy the unit, if any
2272 if (apUnit != nullptr && apUnit[0] != '\0') {
2273 const size_t cBufSize = strlen(apUnit) + 1;
2274 m_pUnit = new char[cBufSize];
2275 strncpy(m_pUnit, apUnit, cBufSize);
2276 }
2277 else {
2278 m_pUnit = nullptr;
2279 }
2280
2281 // Do we have combo data?
2282 if (apComboData != nullptr) {
2283 // yes -> Copy the combo data in new buffer
2284 const size_t cBufSize = strlen(apComboData) + 1;
2285 m_pComboData = new char[cBufSize];
2286 strncpy(m_pComboData, apComboData, cBufSize);
2287 }
2288 else {
2289 // no -> set pointer to null
2290 m_pComboData = nullptr;
2291 }
2292 };
2293
2294 SDynamicItem(SDynamicItem&& aItem) :
2295 m_pMcValue(aItem.m_pMcValue),
2296 m_pName(aItem.m_pName),
2297 m_pUnit(aItem.m_pUnit),
2298 m_pComboData(aItem.m_pComboData)
2299 {
2300 // As ownership is moved, old pointers need to be reset to avoid
2301 // double deletes
2302 aItem.m_pMcValue = nullptr;
2303 aItem.m_pName = nullptr;
2304 aItem.m_pUnit = nullptr;
2305 aItem.m_pComboData = nullptr;
2306 };
2307
2308 ~SDynamicItem() {
2309 // Delete members if needed
2310 if(m_pMcValue != nullptr) {
2311 delete m_pMcValue;
2312 }
2313 if(m_pName != nullptr) {
2314 delete [] m_pName;
2315 }
2316 if(m_pUnit != nullptr) {
2317 delete [] m_pUnit;
2318 }
2319 if(m_pComboData != nullptr) {
2320 delete [] m_pComboData;
2321 }
2322 }
2323
2324 CINOSMcVal* m_pMcValue;
2325 char* m_pName;
2326 char* m_pUnit;
2327 char* m_pComboData;
2328 };
2329
2331 std::unordered_map <std::string, SDynamicItem> m_DynamicProps;
2332 std::unordered_map <std::string, SDynamicItem> m_DynamicActuals;
2333
2335 uint32 m_uSourceId;
2337 uint32 m_uSourceIdChild;
2339 static uint32 g_uSourceId;
2340
2341 // private static members
2342 private :
2344 static uint32 m_uTicksMsgValid[DF_INOS_BUS_MAX_NUMBER];
2346 #if defined(INOS_MULTICORE)
2347 static CINOSTaskExMsgNode* m_pTicksMsg[DF_INOS_MAX_CORES][DF_INOS_BUS_MAX_NUMBER];
2348 #else
2349 static CINOSTaskExMsgNode* m_pTicksMsg[DF_INOS_BUS_MAX_NUMBER];
2350 #endif
2352 static CINOSTaskExMsgNode* m_pVarMsg;
2354 static CINOSHooks s_MsgDoneHooks;
2356 static CINOSMutex s_MsgDoneHooksLock;
2357
2360};
2361
2365 private:
2368
2369 public:
2382 static void MsgFctCall(CINOSTaskExMsg& aMsg,
2383 const uint32 auTraceLevel = DF_INOS_EVENT_LOGGER_LEVEL_TASKCMD,
2384 const uint32 auTraceColor = DF_INOS_EVENT_LOGGER_FONT_COLOR_GREEN,
2385 CINCOObject* apCmd = NULL);
2388 static void McLog(CINOSTaskExMsg& aMsg);
2389
2390};
2391
2392/* gcc 10.x does not allow friends with default parameters */
2393CINOSMcMessage* GetMessageHnd(bool abSearch=true);
2394tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0);
2395tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apText, CINOSMcData* apInfo=0);
2396CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0);
2397CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apText, CINOSMcData* apInfo=0);
2398CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0, const char* apText=nullptr);
2399CMcResult AckMessage(const CINOSTask* apOwner, uint32 auMsgType=0xffffffff, uint32 auFlag=0);
2400CINOSMcNvRamGrp* GetNvRamGrp(bool abSearch=true);
2401void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint32 auMs=0);
2402void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint32 auFlags, uint32 auMs=0);
2403
2404// gcc 4.x.x needs additinal 'extern' declaration for friends
2405extern CINOSMcNvRamGrp* GetNvRamGrp(bool abSearch);
2406extern CINOSMcMessage* GetMessageHnd(bool abSearch);
2407extern void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint64 auTicks, uint8 auBusId);
2408extern void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint32 auMs);
2409extern void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint64 auTicks, uint8 auBusId, uint32 auFlags);
2410extern void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint32 auFlags, uint32 auMs);
2411extern CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2412extern CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apFormat, CINOSMcData* apInfo);
2413extern CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2414extern CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2415extern CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2416extern CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2417extern CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2418extern tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2419extern tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apFormat, CINOSMcData* apInfo);
2420extern tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2421extern tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2422extern CMcResult AckMessage(tMsgId auMsgId, uint32 auFlags);
2423extern CMcResult AckMessageDelayed(tMsgId aMsgId, uint32 auFlags, uint32 auTime);
2424extern CMcResult AckMessage(uint32 auMsgCode, uint32 auFlags, uint32 auMask);
2425extern CMcResult AckMessageDelayed(uint32 auMsgCode, uint32 auFlags, uint32 auMask, uint32 auTime);
2426
2427//------------------------------------------------------------------------------
2428// template function implementations
2429//------------------------------------------------------------------------------
2430
2431//------------------------------------------------------------------------------
2432//
2434{
2435 // create param
2436 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, nullptr, InINCOVContext());
2437 return iAddParam(p);
2438
2439 // end CINOSTaskExMsg::AddParam
2440}
2441
2442//------------------------------------------------------------------------------
2443//
2444template<class T> CINOSTaskExMsgParam* CINOSTaskExMsg::AddParam(const char* apName, T aValue)
2445{
2446 // create param
2447 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apName, InINCOVContext());
2448 // add it at the end of the list
2449 return iAddParam(p);
2450
2451 // end CINOSTaskExMsg::AddParam
2452}
2453
2454//------------------------------------------------------------------------------
2455//
2456template<class T> CINOSTaskExMsgDefaultParam* CINOSTaskExMsg::AddDefaultParam(const char* apName, T aValue)
2457{
2458 // create param
2460 p->SetName(apName);
2461 // add it at the end of the list
2462 iAddParam(p);
2463 return p;
2464 // end CINOSTaskExMsg::AddParam
2465}
2466//------------------------------------------------------------------------------
2467//
2468template<class T> T CINOSTaskExMsg::GetParam ()
2469{
2470 // get pointer to param
2471 CINOSTaskExMsgParam* p = iGetParam();
2472 // did we get one ?
2473 if (p) {
2474 // yes -> return result
2475 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2476 return p->CINOSTaskExMsgParam::template GetTypedValue<T>();
2477 } // end if
2478 else {
2479 // no -> return "zero"
2480 return T();
2481 }
2482 // end CINOSTaskExMsg::GetParam
2483}
2484
2485//------------------------------------------------------------------------------
2486//
2487template<class T> T CINOSTaskExMsg::GetFirstParam ()
2488{
2489 // reset internal pointer
2490 m_pTmpParam = 0;
2491 // call main
2492 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2493 T val = CINOSTaskExMsg::template GetParam<T>();
2494 return val;
2495
2496 // end CINOSTaskExMsg::GetFirstParam
2497}
2498
2499//------------------------------------------------------------------------------
2500//
2501template<class T> void CINOSTaskExMsg::AddResult(T aValue, const char* apResultName /*= NULL*/)
2502{
2503 // create param
2504 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2505 // add it at the end of the list
2506 iAddResult(p);
2507
2508} // end CINOSTaskExMsg::AddResult
2509
2510//------------------------------------------------------------------------------
2511//
2512template<class T> void CINOSTaskExMsg::InsertResult(T aValue, const char* apResultName /*= NULL*/)
2513{
2514 // create param
2515 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2516 // insert it at the beginning of the list
2517 iInsertResult(p);
2518
2519} // end CINOSTaskExMsg::InsertResult
2520
2521//------------------------------------------------------------------------------
2522//
2523template<class T> void CINOSTaskExMsg::AppendResult(T aValue, const char* apResultName /*= NULL*/)
2524{
2525 // create param
2526 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2527 // add it at the end of the list
2528 iAppendResult(p);
2529
2530} // end CINOSTaskExMsg::AppendResult
2531
2532//------------------------------------------------------------------------------
2533//
2534template<class T> T CINOSTaskExMsg::GetResult ()
2535{
2536 // get pointer to param
2537 CINOSTaskExMsgParam* p = iGetResult();
2538 // did we get one ?
2539 if (p) {
2540 // yes -> return result
2541 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2542 return p->CINOSTaskExMsgParam::template GetTypedValue<T>();
2543 } // end if
2544 else {
2545 // no -> return "zero"
2546 return (T) 0;
2547 }
2548 // end CINOSTaskExMsg::GetResult
2549}
2550
2551//------------------------------------------------------------------------------
2552//
2553template<class T> void CINOSTaskEx::ReplyParam(uint32 auReply, T aValue)
2554{
2555 // ensure that we have a command
2556 if (m_pActMsg){
2557 // get pointer to sender of actual command
2558 CINOSTask* snd = m_pActMsg->m_pSender;
2559 // reply only allowed if task exists and was inherited from CINOSTaskEx
2560 if (snd && (snd->mClassSize == sizeof(CINOSTaskEx))){
2561 // create reply
2562 CINOSTaskExMsg* pRpl = new CINOSTaskExMsg(eMsgReply, auReply);
2563 // copy also user data to reply
2564 pRpl->SetUser(m_pActMsg->GetUser());
2565 // add requested param
2566 pRpl->AddParam(aValue);
2567 // and put it into the sender's queue
2568 ((CINOSTaskEx*)snd)->PutReply(pRpl, m_pActMsg->m_Id);
2569 } // end if
2570 } // end if
2571
2572 // end CINOSTaskEx::Reply
2573}
2574
2578{
2579 CINOSTask* pTask = ActualTask();
2580 if (pTask->GetClassSize() == sizeof(CINOSTaskEx)) {
2581 return static_cast<CINOSTaskEx*>(pTask);
2582 }
2583 else {
2584 return nullptr;
2585 }
2586}
2587
2588//------------------------------------------------------------------------------
2589// class definition
2590//------------------------------------------------------------------------------
2591//
2593{
2594 //--- user interface ---------------------------------------------------
2595
2596 // public members
2597 public:
2599 CINOSMcSync(CINOSTaskExMsg* apMsg, void* apHandler=NULL, void* apObject=NULL);
2600
2601 //--- internals --------------------------------------------------------
2602
2603 // protected members
2604 protected :
2606 virtual void Signal() override;
2607
2608 // private members
2609 private :
2611 CINOSTaskEx* m_pTask;
2613 tMsgId m_MsgId;
2614
2617};
2618
2619//------------------------------------------------------------------------------
2620// class definition
2621//------------------------------------------------------------------------------
2622// Helper sync object that implements a event queue. This can be used
2623// if a task needs to wait for an event of a command synchronously.
2625{
2626 //--- user interface ---------------------------------------------------
2627
2628 // public members
2629 public:
2632
2633 virtual ~CINOSMcSyncEvent();
2634
2636 ICACHE virtual bool MsgEvent(CINOSTaskExMsg* apMsg) override;
2637
2639 virtual CINOSTaskQueue* GetEventQueue() { return m_pEventQueue; };
2640
2642 // deletes all events that occur before that event
2643 // is never nullptr as the function waits forever for the event.
2644 virtual CINOSTaskExMsg* WaitForEvent(const char* apEventName);
2645
2646 // private members
2647 private :
2649 CINOSTaskQueue* m_pEventQueue;
2650
2653};
2654
2655
2656//------------------------------------------------------------------------------
2657// class definition
2658//------------------------------------------------------------------------------
2659//
2683{
2684 private:
2688 public:
2699 CINOSTaskExMsg* apMsg);
2700 /* Overwritten to perform specific stuff. */
2701 virtual void Signal() override;
2702
2703 private:
2704 CINOSTaskEx& m_Task;
2705 CINOSTaskExMsg* m_pMsg;
2706
2708};
2709
2710//------------------------------------------------------------------------------
2711// CINCOTaskExProcedure
2712//------------------------------------------------------------------------------
2713
2714class CINCOTaskExProcedure : public CINCOProcedure
2715{
2716 // constructor
2717 public:
2719 char* apName, // object name
2720 uint32 auMsgType,
2721 uintptr auMsgCode,
2722 uint32 auMsgSubCode,
2723 uint32 auMsgFlags,
2724 CINOSTaskEx* apTask,
2725 uint32 auNumberOfParameters, // number of parameters
2726 uint32 auTypeOfParameters, // first 16 bit long paras / string;
2727 // after float paras
2728 uint32 auIntTypeOfParameters, // first 16 bit signed, second 16 bit bool
2729 uint64 auChar, // characteristics of object
2730 uint16 auKeyLevel // keylevel of object
2731 );
2732
2733 // call procedure
2734 virtual void Call(void* aParameters=0, void* aResult=0, long aOffset=0,bool aCallProcEx=true) override;
2735#ifdef INOS_FAST_CALLPROCEDURE
2736 // call procedure consolidated
2737 virtual void Call(CINCOParamReader& aParameters, CINCOResult& aResult, long aOffset=0) override;
2738#endif
2739
2740 protected:
2741 CINOSTaskEx* m_pTask;
2742 uint32 m_uMsgType;
2743 uintptr m_uMsgCode;
2744 uint32 m_uMsgSubCode;
2745 uint32 m_uMsgFlags;
2746 uint32 m_uSubTypeOfParameters;
2747
2748
2750};
2751
2752//------------------------------------------------------------------------------
2753// Include CINCOTaskEx templates. Must be at the bottom of the file to
2754// avoid cyclic includes.
2755//------------------------------------------------------------------------------
2756
2757#include <cinostaskextmpl.h>
2758
2759
2760//------------------------------------------------------------------------------
2761
2762#endif // INC_CINOSTASKEX_H
2763
2764
2765//------------------------------------------------------------------------------
2766// end of file
Short comment.
#define DECLARE_DYNAMIC(aClass)
Definition cinospartitionmemory.h:328
CINOSTaskEx * ActualTaskEx()
Definition cinostaskex.h:2577
uint32 tMcAppError
Definition cinostaskexdef.h:53
Helper class and templates definition for CINOSTaskEx.
Definition cinostaskex.h:2715
Definition cinostaskex.h:2625
virtual CINOSTaskQueue * GetEventQueue()
Gets the message queue from the sync object.
Definition cinostaskex.h:2639
virtual CINOSTaskExMsg * WaitForEvent(const char *apEventName)
Waits for an event of given and returns the message, the return.
CINOSMcSyncEvent()
constructor
virtual ICACHE bool MsgEvent(CINOSTaskExMsg *apMsg) override
overloaded signal
Definition cinostaskex.h:2683
static CINOSMcSyncMsg * Create(CINOSTaskEx &aTask, CINOSTaskExMsg *apMsg)
virtual void Signal() override
Put object into the signaled state.
Definition cinostaskex.h:2593
virtual void Signal() override
overloaded signal
CINOSMcSync(CINOSTaskExMsg *apMsg, void *apHandler=NULL, void *apObject=NULL)
constructor
Definition cinosmutex.h:36
ICACHE void Release(bool aSuspend=false, uint32 auState=defINOSTaskPureSuspended)
ICACHE uint32 Request(uint32 aTimeout=INOS_WAIT_FOREVER)
Definition inos_syn.h:67
Definition cinostaskextmpl.h:435
Definition cinostaskex.h:371
Definition cinostaskextmpl.h:262
Definition cinostaskexdef.h:70
Definition cinostaskex.h:332
Definition cinostaskexdef.h:610
Definition cinostaskex.h:312
Definition cinostaskexdef.h:129
CINOSTaskExMsgParam * GetNext() const
Definition cinostaskexdef.h:284
Definition cinostaskex.h:197
inosName64 m_cCmdName
command name
Definition cinostaskex.h:238
char * m_pParamValue
value
Definition cinostaskex.h:246
inosName32 m_cEventName
event name
Definition cinostaskex.h:240
const char * GetParamType()
get paramtype
Definition cinostaskex.h:226
const char * GetCmdName()
get cmd name
Definition cinostaskex.h:220
real64 GetParamValue(CINOSMcData *apData=0)
get param value
const char * GetEventName()
get event name
Definition cinostaskex.h:223
inosName64 m_cTaskName
task name
Definition cinostaskex.h:236
const char * GetSynName()
get syn name
Definition cinostaskex.h:214
DECLARE_DYNAMIC(CINOSTaskExMsgTriggerEvent)
dynamic object handling
real64 m_rParamValue
value
Definition cinostaskex.h:244
const char * GetTaskName()
get task name
Definition cinostaskex.h:217
CINOSTaskExMsgTriggerEvent(const char *apSynName, real64 arParamValue, const char *apParamType, const char *apTaskName, const char *apCmdName, const char *apEventName)
constructor
virtual ~CINOSTaskExMsgTriggerEvent()
destructor
inosName32 m_cSynName
sync name
Definition cinostaskex.h:234
char m_cParamType[8]
param type
Definition cinostaskex.h:242
CINOSTaskExMsgTriggerEvent(const char *apSynName, const char *apParamValue, const char *apParamType, const char *apTaskName, const char *apCmdName, const char *apEventName)
constructor
Definition cinostaskex.h:257
inosName32 m_cSynName
sync name
Definition cinostaskex.h:293
char m_cParamType[8]
param type
Definition cinostaskex.h:295
void AdjTicksMs(int32 aiMs)
adjust bus ticks
uint64 GetBusId()
get bus id
Definition cinostaskex.h:282
const char * GetSynName()
get syn name
Definition cinostaskex.h:270
uint64 m_uBusTicks
bus ticks
Definition cinostaskex.h:299
DECLARE_DYNAMIC(CINOSTaskExMsgTriggerTicks)
dynamic object handling
uint64 GetBusTicks()
get bus ticks
Definition cinostaskex.h:279
CINOSTaskExMsgTriggerTicks(const char *apSynName, real64 arParamValue, const char *apParamType, uint64 auBusTicks, uint8 auBusId)
constructor
const char * GetParamType()
get paramtype
Definition cinostaskex.h:273
virtual ~CINOSTaskExMsgTriggerTicks()
destructor
Definition cinostaskex.h:267
real64 GetParamValue()
get param value
Definition cinostaskex.h:276
void AdjTicks(int32 aiTicks)
adjust bus ticks
Definition cinostaskex.h:287
real64 m_rParamValue
value
Definition cinostaskex.h:297
Definition cinostaskex.h:154
CINOSTaskExMsgTriggerVar(const char *apVarName, const char *apCompare, const char *apValue)
constructor
const char * GetCompare()
get compare
Definition cinostaskex.h:172
CINOSTaskExMsgTriggerVar(const char *apVarName, const char *apCompare, real64 arValue)
constructor
char m_cCompare[8]
compare string
Definition cinostaskex.h:182
virtual ~CINOSTaskExMsgTriggerVar()
destructor
real64 m_rValue
value
Definition cinostaskex.h:184
DECLARE_DYNAMIC(CINOSTaskExMsgTriggerVar)
dynamic object handling
real64 GetValue(CINOSMcData *apData=0)
get value
const char * GetName()
get var name
Definition cinostaskex.h:169
char * m_pValue
value
Definition cinostaskex.h:186
char m_cName[64]
variable name
Definition cinostaskex.h:180
Definition cinostaskex.h:118
uint32 GetType()
return trigger type
Definition cinostaskex.h:131
virtual ~CINOSTaskExMsgTrigger()
destructor
Definition cinostaskex.h:140
uint32 m_uType
trigger type
Definition cinostaskex.h:143
DECLARE_DYNAMIC(CINOSTaskExMsgTrigger)
dynamic object handling
CINOSTaskExMsgTrigger(uint32 auType)
constructor
Definition cinostaskex.h:137
Definition cinostaskex.h:942
CINOSTaskExMsgUser(uint32 auMsgCode, uint32 auFlags=0)
constructor
Definition cinostaskex.h:948
DECLARE_DYNAMIC(CINOSTaskExMsgUser)
dynamic object handling
Definition cinostaskex.h:396
void * GetUser() const
get pointer to user data
Definition cinostaskex.h:627
void SetTrigger(const char *apSynName, real64 arParamValue, const char *apParamType, const char *apTaskName, const char *apCmdName, const char *apEventName)
set message trigger
T GetResult()
get result
Definition cinostaskex.h:2534
void AndTrigger(const char *apSynName, real64 arParamValue, const char *apParamType, const char *apTaskName, const char *apCmdName, const char *apEventName)
add 'and' message trigger
void SetFlags(uint32 auFlags)
set flags
Definition cinostaskex.h:639
char * GetInfo()
get info
Definition cinostaskex.h:730
void SetTrigger(const char *apVarName, const char *apCompare, real64 arValue)
set message trigger (e.g. variable == value)
void DestroyResults()
destroys all result params
void SetTrigger(const char *apSynName, const char *apParamValue, const char *apParamType, const char *apTaskName, const char *apCmdName, const char *apEventName)
set message trigger
void SetBusId(uint8 auBusId)
set busid
Definition cinostaskex.h:742
void SetTrigger(const char *apSynName, real64 arParamValue, const char *apParamType, uint64 auBusTicks, uint8 auBusId)
set message trigger
uint64 GetQueueTicks() const
get QueueTicks
Definition cinostaskex.h:739
void FstParam()
reset internal pointer to first param
Definition cinostaskex.h:412
bool GetDeferred() const
get deferred flag
Definition cinostaskex.h:648
char * GetFirstParam()
get first param
void AddResultsFromMsgParams(CINOSTaskExMsg *apMsg)
Removes all params of apMsgParam and adds them to the results of this message.
bool GetFlushResistent() const
get flush resistent flag
Definition cinostaskex.h:675
void AddFlags(uint32 auFlags)
add flags
Definition cinostaskex.h:642
CINOSTaskExMsgParam * AddParam(T)
add param
Definition cinostaskex.h:2433
tMcAppError AddIncoItemAsResult(CINCOItem *apItem, bool abBitAsNumber=false)
add the value of an INCO item as result
uint32 GetMsgSubCode() const
get message code
Definition cinostaskex.h:603
CINOSTaskExMsgTrigger * GetAndTrigger(uint32 auIndex=0)
get 'and' message trigger
bool GetNoTrace() const
Get notrace flag.
Definition cinostaskex.h:684
uint32 GetFlags()
get flags
Definition cinostaskex.h:636
void AppendResult(const char *apValue, const char *apResultName=NULL)
void AddResult(char *apValue, const char *apResultName=NULL)
void DestroyParams()
destroys all params
void RemTrigger()
remove trigger from message
Definition cinostaskex.h:557
T GetFirstParam()
get first param
Definition cinostaskex.h:2487
void SetStatic()
Set static flag.
Definition cinostaskex.h:696
tMsgId GetIdInfo() const
get id info
Definition cinostaskex.h:751
uint32 GetResultCount() const
Get the count of results.
void SetSync(CINOSSync *apSync)
set pointer to sync object
Definition cinostaskex.h:582
void SetPending()
set pending flag
Definition cinostaskex.h:657
CINOSTaskExMsgParam * iAddParam(CINOSTaskExMsgParam *apParam)
internal addparam
void InsertResult(T, const char *apResultName=NULL)
Definition cinostaskex.h:2512
void SetDeferred()
get deferred flag
Definition cinostaskex.h:645
void AppendResult(T, const char *apResultName=NULL)
Definition cinostaskex.h:2523
void SetMsgCode(uintnbr auMsgCode)
get message code
Definition cinostaskex.h:594
CINOSTaskExMsg(uint32 auMsgType, uintptr auMsgCode, CINOSSync *apSync=DF_INOS_ASYNCHRONOUS)
constructor
char * GetParam()
get param
bool GetStatic() const
Get notrace flag.
Definition cinostaskex.h:693
CINOSMcDataInst * GetData() const
get pointer to material
Definition cinostaskex.h:630
bool AreMcLogTracesRequested() const
void LstParam()
reset internal pointer to the last param
Definition cinostaskex.h:415
void MoveResultsFromMcResult(CMcResult &aResult)
CINOSTaskExMsgParam * AddJsonParam(const char *apJson)
add params form JSON string
void SetNoTrace()
Set notrace flag.
Definition cinostaskex.h:690
void InsertResult(char *apValue, const char *apResultName=NULL)
CINOSTaskExMsgParam * AddParam(const char *apName, const char *apValue)
add named 'const char*' param
void SetSingle()
set single flag
Definition cinostaskex.h:681
void AppendResult(char *apValue, const char *apResultName=NULL)
void AddResult(T, const char *apResultName=NULL)
Definition cinostaskex.h:2501
tMsgId GetId() const
get message id
Definition cinostaskex.h:588
void SetInfo(const char *apInfo)
set info
Definition cinostaskex.h:727
CINOSTaskExMsgParam * AddParam(CINOSTaskExMsgParam *apParam)
add copy of param
void ClearStatic()
Clear static flag.
Definition cinostaskex.h:702
void SetTrigger(const char *apVarName, const char *apCompare, const char *apValue)
set message trigger (e.g. variable == value)
void SetRetValue(uint32 auRetValue)
set return value. !!!OBSOLETE!!! Will be removed soon
Definition cinostaskex.h:611
void SetTrigger(uint64 auBusTicks, uint8 auBusId)
set message trigger []
void SetTrigger(real64 arValue)
set message trigger [ms]
uintnbr GetMsgCode() const
get message code
Definition cinostaskex.h:597
void MoveResultsToParams(CINOSTaskExMsg &aMsg)
void InsertResult(const char *apValue, const char *apResultName=NULL)
bool GetDone() const
get touched flag
Definition cinostaskex.h:651
void AddResult(const char *apValue, const char *apResultName=NULL)
CINOSTask * GetSender() const
get pointer to sender
Definition cinostaskex.h:617
uint32 GetMsgType() const
get message type
Definition cinostaskex.h:591
CINOSTaskExMsg(const CINOSTaskExMsg &aMsg)
constructor
uint64 GetBusTicks() const
get busticks
Definition cinostaskex.h:736
char * GetName(bool abResolveIfEmpty=false)
int operator<(CINOSTaskExMsg &aTaskExMsg)
binary tree operators
Definition cinostaskex.h:828
T GetParam()
get param
Definition cinostaskex.h:2468
CINOSTaskExMsgDefaultParam * AddDefaultParam(const char *apName, T aValue)
add default param
Definition cinostaskex.h:2456
void SetBusTicks(uint64 auBusTicks)
set busticks
Definition cinostaskex.h:733
void SetSender(CINOSTask *apSender)
set pointer to sender
Definition cinostaskex.h:573
bool GetPending() const
get pending flag
Definition cinostaskex.h:654
void SetFlushResistent()
set flush resistant flag
Definition cinostaskex.h:672
CINOSSync * GetSync() const
get pointer to sync object
Definition cinostaskex.h:633
void MoveParamsFromMsg(CINOSTaskExMsg *apMsg)
Moves all params of apMsg to this message.
bool GetSingle() const
get single flag
Definition cinostaskex.h:678
uint32 GetRetValue() const
get return value. !!!OBSOLETE!!! Will be removed soon
Definition cinostaskex.h:614
CINOSTaskExMsgTrigger * GetTrigger()
get message trigger
Definition cinostaskex.h:554
void DontCreateMcLogTraces()
char * GetResult()
get string result
void SetAlwaysSyncSignal()
Set notrace flag.
Definition cinostaskex.h:707
void SetIdInfo(tMsgId auIdInfo)
set id info
Definition cinostaskex.h:748
bool GetCanceled() const
get canceled flag
Definition cinostaskex.h:660
void SetId(tMsgId aId)
set message id
Definition cinostaskex.h:585
CINOSTaskExMsg(uint32 auMsgType, const char *apMsgName, uintptr auMsgCode=0)
constructor
void SetPersistent()
set persistent flag
Definition cinostaskex.h:666
void SetUser(void *apUser)
set pointer to user data
Definition cinostaskex.h:576
CINOSTaskEx * GetReceiver() const
get pointer to receiver task
Definition cinostaskex.h:622
CINOSTaskExMsgParam * GetFirstResultPtr()
Get pointer to iterate over results.
void SetMsgSubCode(uint32 auMsgSubCode)
get message code
Definition cinostaskex.h:600
void AddResults(CINOSTaskExMsgParam *apMsgParam)
void SetAlwaysReply()
Set notrace flag.
Definition cinostaskex.h:712
CINOSTaskExMsgParam * GetParam(const char *apName)
get name
void SetData(CINOSMcDataInst *apData)
set pointer to data
Definition cinostaskex.h:579
bool GetPersistent() const
get persistent flag
Definition cinostaskex.h:669
uint8 GetBusId() const
get busid
Definition cinostaskex.h:745
void SetName(const char *apName)
set name
Definition cinostaskex.h:715
void FstResult()
reset internal pointer to first result
Definition cinostaskex.h:452
~CINOSTaskExMsg()
destructor
void SetCanceled()
set canceled flag
Definition cinostaskex.h:663
void RemAndTrigger(uint32 auIndex=0, bool abDelete=true)
remove 'and' message trigger
void AndTrigger(const char *apSynName, real64 arParamValue, const char *apParamType, uint64 auBusTicks, uint8 auBusId)
add 'and' message trigger
uint32 GetParamCnt() const
get number of param's
Definition cinostaskex.h:448
CINOSTaskExMsgParam * AddParam(const char *apName, char *apValue)
add named 'char*' param
Definition cinostaskex.h:2364
static void McLog(CINOSTaskExMsg &aMsg)
static void MsgFctCall(CINOSTaskExMsg &aMsg, const uint32 auTraceLevel=DF_INOS_EVENT_LOGGER_LEVEL_TASKCMD, const uint32 auTraceColor=DF_INOS_EVENT_LOGGER_FONT_COLOR_GREEN, CINCOObject *apCmd=NULL)
Definition cinostaskex.h:966
virtual CMcResult GetCallResult() override
get sync call result
Definition cinostaskex.h:1972
virtual void MsgDone(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message done -> reply or signal initiator if requested
virtual void AddProp(const char *apName, nvuint32 &aMember, uint32 auDefault, uint32 auMin, uint32 auMax, const char *apUnit, uint32 auCharacteristics=defCharShowDec)
add nvuint32 property to the 'Prop' folder
char * GetMsgName(CINOSTaskExMsg *apMsg)
get message name
static void RemoveMsgDoneHook(CINOSHook *apHook)
Remove a previously added MsgDone() hook. This function is thread-safe.
bool GetOptionStr(const char *apParams, const char *apBase, char *apResult, uint32 auSize) const
return option string belonging to apBase 'apBase=optionstring'
virtual void AddParam(const char *apName, const char *apValue, const char *apComboData, uint32 auFlags=0)
add string param with combobox data
virtual void PostDispatchMsg()
PostDispatchMsg.
Definition cinostaskex.h:1647
bool GetOption(const char *apName) const
return true if option 'aName' is requested in params
virtual const CINOSTaskExMsg * GetCommandMsg(const char *apName)
get pointer to command apName or NULL if not found
Definition cinostaskex.h:1120
virtual ~CINOSTaskEx()
destructor
friend void MsgEventFlg(CINOSTaskExMsg *apMsg, const char *apName, uint32 auFlags, uint32 auMs)
put event
virtual void RemChildModule(const char *apModuleName)
remove child command
Definition cinostaskex.h:1907
virtual void iUsrMsgDone(CINOSTaskExMsg *apMsg)
internal user message done, used to handle message dones from other
virtual void iSetIdleTimeout(CINOSTaskExMsg *apMsg)
internal set idle timeout
friend CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo, const char *apProperties)
modify message
virtual void AddCommand(const char *apName, uint32 auCode, uint32 auType=eMsgCmd)
add internal command
virtual CINCOObject * GetFlagsObj()
get pointer to 'Flags' inco folder
Definition cinostaskex.h:1239
virtual void FlushTmd(tMsgId aId=0)
remove triggered messages auId of type eMsgCmd or all if auId==0
const char * GetAliasName() const
get pointer to alias name
Definition cinostaskex.h:991
uint32 m_uCriticals
task critical sections
Definition cinostaskex.h:2113
bool IsCmdDeferred(uint32 auCmdCode)
return true if task has a deferred command 'auCmdCode'
virtual const char * GetIncoName()
get requested inco folder name
virtual void RemProp(const char *apName)
remove object property apName
static void INCOItemToMessageResult(CINCOItem *apItem, const char *apParentPath, CINOSTaskExMsg *apMsg)
Add value of INCO item to results of apMsg.
virtual void AddParam_int32(const char *apName, const char *apUnit, int32 aiValue, int32 aiMin, int32 aiMax, uint32 auChar, uint32 auFlags=0)
Add int32 parameter to command. You can use INT32MIN/MAX to allow all possible values.
void ClrDispatchFlag(uint32 auFlag)
clr dispatch flag. see SetDispatchFlag for further information
Definition cinostaskex.h:1082
static CINOSHook * AddMsgDoneHook(void *apHandler, void *apObject=NULL)
Add a hook to call some member function when MsgDone() gets called. This function is thread-safe.
bool GetOption(const char *apBase, const char *apName) const
return true if option 'apBase=aName' is requested in params
virtual const char * GetTreeName()
get requested binary tree name
Definition cinostaskex.h:999
virtual void AdjTrigger(CINOSTaskExMsg *apMsg)
adjust trigger
void SetAliasName(const char *apAlias)
set alias name
Definition cinostaskex.h:994
virtual void AddActual(const char *apName, nvlstring &aMember, const char *apDefault=nullptr)
add nvlstring to the 'Act' folder
virtual void iSetFlag(CINOSTaskExMsg *apMsg)
internal switch core
virtual void iMessageRemove(CINOSTaskExMsg *apMsg)
internal message remove
virtual bool DispatchReply(CINOSTaskExMsg *apMsg)
dispatch reply message
void RemDeferredMsg(CINOSTaskExDeferredMsg *apDef)
remove deferred message from list
virtual void AddParam(const char *apName, const char *apValue, uint32 auFlags=0)
add param to command
bool GetOptionStr(const char *apBase, char *apResult, uint32 auSize) const
return option string belonging to apBase 'apBase=optionstring'
CINOSTaskEx(const char *apName, const char *apType, const char *apParam=0, uint32 aStackSize=defDefaultStackSize, uint32 aPriority=defLowestPriority, bool aFloatingPoint=true, uint32 aTimeSlice=defDefaultTimeSlice, bool aInterruptsDisabled=false)
constructor
static void CallMsgDoneHooks(CINOSTaskExMsg *apMsg, ERplId aRplId, tMcAppError aAppError)
Call hooks to notify observers about MsgDone, passing all arguments for inspection....
void ReplyParam(uint32 auReply, T)
reply to actual message with param
Definition cinostaskex.h:2553
virtual void AddProp(const char *apName, nvreal64 &aMember, real64 arDefault, real64 arMin, real64 arMax, const char *apUnit, uint32 auDigits, uint32 auCharactristics=defCharShowFix)
add nvreal property to the 'Prop' folder
bool GetOptionNbr(const char *apBase, uintnbr &auNumber) const
return option number belonging to apBase 'apBase=number'
uint32 GetState()
get state
virtual void MsgFatal(CINOSTaskExMsg *apMsg, tMcAppError aAppError)
message fatal error
friend CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apProperties)
modify message
virtual bool IsCmdAllowed(CINOSTaskExMsg *apMsg)
Definition cinostaskex.h:982
virtual void iCancelDeferred()
internal cancel all deferred messages
virtual void MsgCanceled(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message canceled
uint32 GetSourceId()
get source id
Definition cinostaskex.h:1009
virtual CINCOObject * SetCmdObj(CINCOObject *apCmd)
set pointer to 'Cmd' inco folder and return old one
virtual CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apText, CINOSMcData *apInfo=0)
post message
friend CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apText, CINOSMcData *apInfo)
post message
CINOSTaskExDeferredMsg * GetDeferredMsg(tMsgId auReplyId)
get pointer to deferred message with given reply id
static constexpr int GetLastUsr()
return last taskex user id
Definition cinostaskex.h:1313
virtual bool DispatchEvent(CINOSTaskExMsg *apMsg)
dispatch event message
virtual tMsgId MsgDefer(CINOSTaskExMsg *apMsg, tMsgId aMsgId, void *apHandler=0, void *apObject=0, bool abHandlesCommands=false)
virtual void MsgCompleted(CINOSTaskExMsg *&apMsg)
virtual void MsgStopped(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message stopped
void SetCritical(uint32 auCritical)
set critical
Definition cinostaskex.h:1959
virtual const CINOSTaskExCmdHookBase * GetCommandHook(const char *apName)
get pointer to command hook apName or NULL if not found
Definition cinostaskex.h:1224
virtual CINCOObject * GetCmdObj()
get pointer to 'Cmd' inco folder
virtual bool DispatchOther(CINOSTaskExMsg *apMsg)
dispatch other message
virtual void AddActual(const char *apName, nvstring &aMember, const char *apDefault=nullptr, const char *apComboData=nullptr)
add nvstring to the 'Act' folder
virtual void iDeleteCommand(CINOSTaskExMsg *apMsg)
internal delete command (only used for commands of type call)
virtual CINCOObject * GetActObj()
get pointer to 'Act' inco folder
void NvUpdate()
nvram update
virtual CINOSTaskExMsg * CreateMsg(CINOSTaskExMsg *apMsg, CINOSMcDataInst *apData, const char *apAlias)
create message from apMsg
virtual tMsgId PutCmd(uint32 auCommand)
put command to queue and return command id
bool GetFlag(const char *apName) const
return true if flag 'aName' is requested in params
virtual void iFailure(CINOSTaskExMsg *apMsg)
internal command handling failure
virtual void AddActual(CINCOItem *apItem)
add actual to the 'Act' folder
virtual CINCOObject * GetRegister(CINCOObject *apObject=0)
get pointer to inco registration
uint32 m_uPropOrder
prop folder order
Definition cinostaskex.h:2243
virtual void iStopMsg(CINOSTaskExMsg *apMsg)
stop message
virtual void AddParam(const char *apName, const char *apUnit, uint32 auValue, uint32 auMin, uint32 auMax, uint32 auChar, uint32 auFlags=0)
Add uint32 parameter to command. You can use UINT32MIN/MAX to allow all possible values.
virtual void iSetProp(CINOSTaskExMsg *apMsg)
internal set property
std::atomic< uint64 > m_uFlags
task flags
Definition cinostaskex.h:2109
virtual void MsgPaused(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message paused. Deprecated!
virtual bool DispatchInternal(CINOSTaskExMsg *apMsg)
dispatch internal message
virtual void MsgIgnored(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message ignored
virtual void iShutdown(CINOSTaskExMsg *apMsg)
internal shutdown task
virtual void AddProp(const char *apName, nvlstring &aMember, const char *apDefault="")
add nvlstring property to the 'Prop' folder
CINOSTaskEx * GetParent() const
get parent
Definition cinostaskex.h:1013
virtual void MsgFailed(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message failed
virtual CMcResult SetIdleTimeout(uint32 auIdleTimeout, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
virtual uint32 Shutdown(CINOSSync *apSync=DF_INOS_SYNCHRONOUS) override
shutdown task
virtual void PutReply(CINOSTaskExMsg *apMsg, tMsgId aMsgId)
put reply message to queue
static tMsgId GetMsgId(uint32 auId, uint32 auMask)
void HandleTriggerMsg(CINOSTaskExMsg *apMsg, EDispatchStyle aeDispStyle)
handle message with a trigger
virtual CMcResult PutMsg(CINOSTaskExMsg *apMsg, tMsgId aMsgId=0)
put message to queue and return command id
const char * GetType() const
get pointer to type
Definition cinostaskex.h:988
bool GetCommand(const char *apName) const
return true if command 'aName' is requested in params
int operator<(CINOSTaskEx &aTaskEx)
binary tree operators
Definition cinostaskex.h:1603
virtual void AddProp()
add object property to the 'Prop' folder
uint32 GetDispatchFlag() const
set dispatch flag. see SetDispatchFlag for further information
Definition cinostaskex.h:1085
static tMsgId GetMsgId()
get system wide unique message id
bool GetOption(uint32 auOption) const
return true if option available
Definition cinostaskex.h:1044
void MptHook()
measure hook
virtual void AddProp(const char *apName)
add object property to the 'Prop' folder
bool GetRequest(uint32 auRequest) const
return true if request set
Definition cinostaskex.h:1055
friend void MsgEvent(CINOSTaskExMsg *apMsg, const char *apName, uint32 auMs)
put event
virtual CINOSTaskExMsg * CreateMsgFromCommand(const char *apName, CINOSSync *apSync=DF_INOS_ASYNCHRONOUS)
create a new message from command name or NULL if command not found. To call a command directly the t...
friend tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apProperties)
send message
uint32 m_uActOrder
act folder order
Definition cinostaskex.h:2245
friend CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo, const char *apText)
modify message
CINCOObject * m_pRegister
pointer to my inco registration
Definition cinostaskex.h:2105
friend void MsgEvent(CINOSTaskExMsg *apMsg, const char *apName, uint64 auTicks, uint8 auBusId)
return an informational event to the sender of apMsg
virtual void MsgDonePnd(CINOSTaskExMsg *apMsg, ERplId aRplId, tMcAppError aAppError=0)
message done (and set 'pending' flag)
virtual void iRemCommand(CINOSTaskExMsg *apMsg)
internal add command
virtual void AddProp(CINCOItem *apItem)
add property to the 'Prop' folder
virtual CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo=0)
post message
virtual void iGetActual(CINOSTaskExMsg *apMsg)
internal get actual
bool GetOptionEx(const char *apBase) const
virtual void _AddCommand(CINOSTaskExMsg *apMsg, CINCOObject *apMsgCmdObj, int16 aiOrder=0)
add inco command
friend CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo, const char *apProperties)
post message
bool GetOption(const char *apParams, const char *apBase, const char *apName) const
return true if option 'apBase=aName' is requested in apParams
friend CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apProperties)
post message
virtual void SetTreeName(const char *apTreeName)
set requested binary tree name
Definition cinostaskex.h:1755
virtual void PostCreate(void *apParent)
called after creation
uint32 m_uRequests
task requests
Definition cinostaskex.h:2111
CINOSTaskExMsg * GetDeferredMsgCmd(uint32 auCmdCode)
get pointer to deferred message with given command code
friend tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char *apText, CINOSMcData *apInfo)
send message
virtual void MsgDone(CINOSTaskExMsg *apMsg, ERplId aRplId, tMcAppError aAppError=0)
message done -> reply or signal initiator if requested
virtual void AddParam_uint64(const char *apName, const char *apUnit, uint64 auValue, uint64 auMin, uint64 auMax, uint32 auChar, uint32 auFlags=0)
Add uint64 parameter to command. You can use UINT64MIN/MAX to allow all possible values.
friend CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo)
post message
virtual void RemActual(const char *apName)
remove object actual apName
CINOSMcMessage * GetMessageHndEx()
get message handler
friend CMcResult AckMessage(const CINOSTask *apOwner, uint32 auMsgType, uint32 auFlag)
ack message
virtual CINOSTaskQueue * GetMsgQueue()
get pointer to message queue
Definition cinostaskex.h:1113
void SetParent(CINOSTaskEx *apParent)
set parent pointer
Definition cinostaskex.h:1933
virtual void AddActual(const char *apName, nvbool &aMember, bool abDefault, uint32 auCharactristics=defCharShowDec)
add nvbool property to the 'Act' folder and register it as checkbox.
virtual void iAddProp(CINOSTaskExMsg *apMsg)
internal set property
virtual void AddChildModule(const char *apModuleName)
add child command
Definition cinostaskex.h:1905
const char * GetParam() const
get pointer to param
Definition cinostaskex.h:985
uint64 GetFlags() const
return all flags
Definition cinostaskex.h:1052
friend tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo)
send message
virtual void AddActual()
add object property to the 'Act' folder
virtual CMcResult Startup(real64 arStage)
startup task (always asynchronous)
static void INCOItemsToMessageResults(CINCOItem *apItem, const char *apParentPath, CINOSTaskExMsg *apMsg)
Add the value of the INCO item apItem and all its children (if any) as named results to the message (...
bool AddToInputQueue(CINOSTaskExMsg *apMsg, uint32 auFlags=0)
virtual bool DispatchCmd(CINOSTaskExMsg *apMsg)
dispatch command message
virtual void iMessageAcknowledge(CINOSTaskExMsg *apMsg)
internal message acknowledge
void SetMessageHnd(CINOSMcMessage *apMessageHnd)
set message handler
Definition cinostaskex.h:1321
virtual const char * GetStateText()
return actual state text
virtual bool iPostStartup()
internal post startup
uint32 m_uOptions
task options
Definition cinostaskex.h:2107
void RegisterHook(CINOSTaskExCmdHookBase *apHook)
register a command hook which can be set to a command later
virtual void RemChildCommand(const char *apModuleName, const char *apFunctionName)
remove child command
Definition cinostaskex.h:1902
virtual CMcResult ClrFlag(const char *apName, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
clear flag apName
virtual void SetState(uint32 auState)
set state
Definition cinostaskex.h:974
friend CMcResult ReleaseListen()
request listen
virtual bool DispatchSub(CINOSTaskExMsg *apMsg)
dispatch sub message
virtual void iHandleIdleTimeout()
internal handle idle timeout
virtual void Action() override
main action
CINOSTaskExMsg * GetTmpMsg()
Get temporary message (used for subclasses overriding AddCommand)
Definition cinostaskex.h:2050
bool GetCritical(uint32 auCritical) const
return true if critical set
Definition cinostaskex.h:1058
virtual CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo=0, const char *apText=nullptr)
modify message
virtual CMcResult PutMsgEx(CINOSTaskExMsg *apMsg, uint32 auFlags, tMsgId aMsgId=0)
Put a message with flags to adjust behaviour.
virtual CINCOObject * GetPropObj()
get pointer to 'Prop' inco folder
static uint32 iSetIncoItemsFromParamStruct(CINCOItem *apIncoItem, long alOffset, CINOSTaskExMsgParam *apParams, bool abOverwrite, inosName128 &oErrorItemName)
Helper function for commands that set INCO items from a parameter stucture.
virtual bool DispatchMessage(CINOSTaskExMsg *apMsg)
dispatch message message
virtual void AddParam_int64(const char *apName, const char *apUnit, int64 aiValue, int64 aiMin, int64 aiMax, uint32 auChar, uint32 auFlags=0)
Add int64 parameter to command. You can use INT64MIN/MAX to allow all possible values.
void AddParam(CINCOItem *apItem, T aValue, uint32 auFlags=0)
Definition cinostaskex.h:1881
void ClrCritical(uint32 auCritical)
clr critical
Definition cinostaskex.h:1962
virtual void MsgError(CINOSTaskExMsg *apMsg, tMcAppError aAppError)
message error
virtual void ClrFlag(uint64 auFlag, bool abUpdateState=false)
clr flag
Definition cinostaskex.h:1948
virtual void AddEllipsis()
Add ellipsis to command.
virtual void SetFlag(uint64 auFlag, bool abUpdateState=false)
set flag
Definition cinostaskex.h:1943
uint8 GetRequestedPriority()
get requested priority
Definition cinostaskex.h:2000
virtual void iStartup(real64 arStage)
internal startup task
virtual void AddParam(const char *apName, const char *apComboData, uint32 auValue, uint32 auMin, uint32 auMax, const char *apUnit, uint32 auChar, uint32 auFlags=0)
Add combo box parameter to command. You can use UINT32MIN/MAX to allow all possible values.
void SetDispatchFlag(uint32 auFlag)
Definition cinostaskex.h:1079
virtual void AddParam(const char *apName, bool abValue, uint32 auChar, uint32 auFlags=0)
Add parameter of type bool to command.
friend CINOSMcNvRamGrp * GetNvRamGrp(bool abSearch)
get nvram group
CINOSTaskEx(const char *apName, const char *apParam=0, uint32 aStackSize=defDefaultStackSize, uint32 aPriority=defLowestPriority, bool aFloatingPoint=true, uint32 aTimeSlice=defDefaultTimeSlice, bool aInterruptsDisabled=false)
constructor
void iCheckIdleTimeout()
internal check idle timeout
virtual CMcResult SetFlag(const char *apName, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
set flag apName
virtual void AddCommand(const char *apName, uint32 auCode, CINCOProcedure *apProc)
add inco command
virtual void AddChildCommand(const char *apModuleName, const char *apFunctionName, CINOSTaskExMsg *apCmdMsg, bool abRegisterInco=true)
add child command
Definition cinostaskex.h:1897
virtual CMcResult StopMsg(tMsgId atMsgId, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
stop message
friend CMcResult RemMessage(const CINOSTask *apOwner)
rem message
virtual void AddProp(const char *apName, nvstring &aMember, const char *apDefault="", const char *apComboData=NULL)
add nvstring property to the 'Prop' folder
virtual void AddCommand(CINOSTaskExMsg *apMsg, CINCOObject *apMsgCmdObj)
add inco command
virtual uint32 iAddRegisteredCommands()
add registered commands (done between startup and post startup)
static constexpr int GetLastCmd()
return last taskex command id
Definition cinostaskex.h:1309
virtual void iStartup(CINOSTaskExMsg *apMsg)
internal startup task
virtual void AddProp(const char *apName, nvbool &aMember, bool abDefault, uint32 auCharactristics=defCharShowDec)
add nvbool property to the 'Prop' folder and register it as checkbox.
virtual void iGetCommands(CINOSTaskExMsg *apMsg)
internal get commands
virtual void iGetProp(CINOSTaskExMsg *apMsg)
internal get property
friend CMcResult AckMessage(tMsgId aMsgId, uint32 auFlags)
ack message
virtual void iMessageModify(CINOSTaskExMsg *apMsg)
internal message modify
virtual void iAddCommand(CINOSTaskExMsg *apMsg)
internal add command
CINCOObject * m_pNvInitObj
pointer to temporary nvobj
Definition cinostaskex.h:2241
bool GetOptionNbr(const char *apParams, const char *apBase, uintnbr &auNumber) const
return option number belonging to apBase 'apBase=number'
void RequestCritical()
request critical section
Definition cinostaskex.h:1976
virtual void iSetActual(CINOSTaskExMsg *apMsg)
internal set actual
ERplId
reply id's
Definition cinostaskex.h:1411
virtual void MsgDone(tMsgId aMsgId, tMcAppError aAppError=0)
message done (used for deferred messages)
virtual void RemCommand(const char *apName)
remove command
virtual void MsgInComplete(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message incomplete
virtual void MsgRejected(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message rejected
virtual void MsgDonePnd(CINOSTaskExMsg *apMsg, tMcAppError aAppError=0)
message done (and set 'pending' flag)
virtual CINCOObject * GetStatObj()
get pointer to 'Stat' inco folder
virtual void AddActual(const char *apName)
add object property to the 'Act' folder
CINOSTaskExMsg * GetActMsg()
get pointer to actually handled message
Definition cinostaskex.h:1117
virtual bool PreDestroy(bool &bDeleteSelf)
called before destruction (return false if destruction not allowed)
virtual void ClrRequest(uint32 auRequest)
clr request
Definition cinostaskex.h:1956
bool IsCmdBusy(uintptr auCmdCode)
return true if task is actual command 'auCmdCode' busy
virtual void SetCallResult(CMcResult aResult) override
set sync call result
Definition cinostaskex.h:1969
CMcResult CallCommand(const char *apName, ParamType... aParams, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
calls a command given the command name. The function can be called using less than defined parameters...
Definition cinostaskex.h:1145
virtual void iAddActual(CINOSTaskExMsg *apMsg)
reply to actual message
void RegisterCommand(CINOSTaskExCmdBase *apCommand)
register a command that will be added at startup (depending in the option)
uint32 m_uState
task state
Definition cinostaskex.h:2115
virtual bool DispatchUser(CINOSTaskExMsg *apMsg)
dispatch user message
bool GetFlag(uint64 auFlag) const
return true if flag available
Definition cinostaskex.h:1049
virtual bool PreDispatchMsg(CINOSTaskExMsg *apMsg)
Pre dispatcher.
virtual void AddCommand(CINOSTaskExMsg *apMsg, uint64 aChar=0, uint16 aKeyLevel=cKeyLevelMin, bool abRegisterInco=true)
add inco command
virtual tMsgId MsgDefer(CINOSTaskExMsg *apMsg, void *apHandler=0, void *apObject=0, bool abHandlesCommands=false)
defer message and return according MsgId
virtual void AddActual(const char *apName, nvreal64 &aMember, real64 arDefault, real64 arMin, real64 arMax, const char *apUnit, uint32 auDigits)
add nvreal to the 'Act' folder
virtual CINCOObject * GetRequestsObj()
get pointer to 'Requests' inco folder
Definition cinostaskex.h:1242
void SetRequestedPriority(uint8 auPrio)
set requested priority
Definition cinostaskex.h:2003
virtual CINCOObject * GetOptionsObj()
get pointer to 'Options' inco folder
Definition cinostaskex.h:1236
virtual void AddParam(const char *apName, real64 arValue, real64 arMin, real64 arMax, const char *apUnit, uint32 auChar, uint32 auFlags=0)
add param to command. You can use REAL64MIN/MAX to allow all possible values.
virtual void AddActual(const char *apName, nvuint32 &aMember, uint32 auDefault, uint32 auMin, uint32 auMax, const char *apUnit, uint32 auCharacteristics=defCharShowDec)
add nvuint32 to the 'Act' folder
virtual void SetRequest(uint32 auRequest)
set request
Definition cinostaskex.h:1953
virtual void iMessageAdd(CINOSTaskExMsg *apMsg)
internal message add
friend tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData *apInfo, const char *apProperties)
send message
friend CINOSMcMessage * GetMessageHnd(bool abSearch)
get message handler
void ReleaseCritical()
release critical section
Definition cinostaskex.h:1979
friend CMcResult RequestListen(uint32 auMsgType, uint32 auSetId, uint32 auAckId)
request listen
friend void MsgEventFlg(CINOSTaskExMsg *apMsg, const char *apName, uint64 auTicks, uint8 auBusId, uint32 auFlags)
return an informational event to the sender of apMsg
virtual CINOSSync * GetSync() override
get task sync object
Definition cinostaskex.h:1966
virtual CINCOObject * GetCriticalsObj()
get pointer to 'Criticals' inco folder
Definition cinostaskex.h:1245
friend CMcResult AckMessage(uint32 auMsgCode, uint32 auFlags, uint32 auMask)
ack message
virtual void iClrFlag(CINOSTaskExMsg *apMsg)
internal clear flag
virtual bool DispatchTmd(CINOSTaskExMsg *apMsg)
dispatch triggered command message
void Reply(CINOSTaskExMsg *apMsg, uint32 auReply, tMcAppError aAppError=0)
reply to actual message
void Create()
do main creation work
Definition cinostask.h:52
Definition inos_1ms.h:91
CINOSTask * ActualTask()
#define DF_INOS_TIMINIG_CHECKS_SUSPEND_MAX_TIME_US
Definition inosdefault.h:257
#define DF_INOS_MAX_CORES
Definition inosdefine.h:164
uint32 INOS_MCMSG_CODE_TSKEX_PARAM_MISSING
Definition inoserror.h:1681
uint32 INOS_MCMSG_CODE_TSKEX_UNKNOWN
Definition inoserror.h:1681
uint32 INOS_MCMSG_CODE_TSKEX_WRONG_PARAMS
Definition inoserror.h:1681
#define INOS_OR(variable, mask)
Definition inosmacro.h:201
#define DF_INOS_ASYNCHRONOUS
Definition inosmacro.h:337
#define DF_INOS_SYNCHRONOUS
Definition inosmacro.h:332
#define ASSERT_ALWAYS(f)
Definition inosmacro.h:696
#define INOS_AND(variable, mask)
Definition inosmacro.h:210
int32 tMsgId
Definition inostype.h:186