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
109class CINCOVOperation;
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 };
132 { return m_uType;};
133
134 // protected members
135 protected :
141 {};
144
147};
148//
149//------------------------------------------------------------------------------
150// class CINOSTaskExMsgTriggerVar
151//------------------------------------------------------------------------------
152//
154{
155 friend class CINOSTaskEx;
156 friend class CINOSTaskExMsg;
157
158 // public members
159 public :
162 real64 arValue);
165 const char* apValue);
169 const char* GetName()
170 { return &m_cName[0];};
172 const char* GetCompare()
173 { return &m_cCompare[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 :
205 const char* apParamType, const char* apTaskName, const char* apCmdName,
206 const char* apEventName);
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];};
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 :
270 const char* GetSynName()
271 { return &m_cSynName[0];};
273 const char* GetParamType()
274 { return &m_cParamType[0];};
277 { return m_rParamValue;};
280 { return m_uBusTicks;};
283 { return m_uBusId;};
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;
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 :
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);
429 CINOSTaskExMsgParam* AddParam(const char* apName, const char* apValue);
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);
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
519
521 template<class T> T GetResult();
523 char* GetResult();
533 void SetTrigger(real64 arValue);
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,
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,
570 void RemAndTrigger(uint32 auIndex=0, bool abDelete = true);
571
574 { m_pSender = apSender;};
576 void SetUser(void* apUser)
577 { m_pUser = apUser;};
580 { m_pData = apData;};
583 { m_pSync = apSync;};
586 { m_Id = aId;};
588 tMsgId GetId() const
589 { return m_Id;};
592 { return m_uType;};
595 { m_uMsgCode = auMsgCode;};
598 { return m_uMsgCode;};
601 { m_uMsgSubCode = auMsgSubCode;};
604 { return m_uMsgSubCode;};
605 CINOSTaskExCmdBase* GetCommand() const
606 { return m_uType == CINOSTaskExDef::eMsgCall ?
607 (CINOSTaskExCmdBase*)m_uMsgCode :
608 nullptr;
609 }
612 { m_uRetValue = auRetValue;};
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;};
631 { return m_pData;};
634 { return m_pSync;};
637 { return m_uFlags;};
640 { m_uFlags = 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];};
734 { m_uBusTicks = auBusTicks;};
737 { return m_uBusTicks;};
740 { return m_uQueueTicks;};
743 { m_uBusId = auBusId;};
746 { return (uint8)m_uBusId;};
749 { m_uIdInfo = auIdInfo;};
752 { return m_uIdInfo;};
764#ifdef INOS_INCOV
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);}
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
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
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 :
950 {
951 // set static
952 SetStatic();
953 // set additional flags
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;};
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);
1067
1073 uint32 GetIdleTimeout() const
1074 { return m_uIdleTimeout; };
1075
1080 { INOS_OR(m_uDispatchFlags, auFlag); };
1083 { INOS_AND(m_uDispatchFlags, ~auFlag); };
1085 uint32 GetDispatchFlag() const
1086 { return m_uDispatchFlags; };
1087
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);
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
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
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,
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,
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,
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,
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;};
1325 uint32 auFlags, CINOSMcData* apInfo);
1328 uint32 auFlags, const char* apText, CINOSMcData* apInfo);
1331 uint32 auFlags, const char* apProperties);
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 RequestListen(uint32 auMsgType, uint32 auSetId, uint32 auAckId);
1377 friend CMcResult ReleaseListen();
1378
1381
1382#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
1384 uint32 GetSuspendTimingCheckLimit() const {
1386 }
1388 void SetSuspendTimingCheckLimit(uint32 auLimit) {
1390 }
1391#endif
1392
1393 // public enumerations
1394 public :
1395
1397 enum {
1398 eMsgCmd=CINOSTaskExDef::eMsgCmd,
1399 eMsgCall=CINOSTaskExDef::eMsgCall,
1400 eMsgEvent=CINOSTaskExDef::eMsgEvent,
1401 eMsgReply=CINOSTaskExDef::eMsgReply,
1402 eMsgUser=CINOSTaskExDef::eMsgUser,
1403 eMsgSub=CINOSTaskExDef::eMsgSub,
1404 eMsgInternal=CINOSTaskExDef::eMsgInternal,
1405 eMsgMessage=CINOSTaskExDef::eMsgMessage
1406 };
1407
1409 enum ERplId {
1410 eRplOk=CINOSTaskExDef::eRplOk,
1411 eRplSkipped=CINOSTaskExDef::eRplSkipped,
1412 eRplInComplete=CINOSTaskExDef::eRplInComplete,
1413 eRplIgnored=CINOSTaskExDef::eRplIgnored,
1414 eRplPaused=CINOSTaskExDef::eRplPaused,
1415 eRplStopped=CINOSTaskExDef::eRplStopped,
1416 eRplCanceled=CINOSTaskExDef::eRplCanceled,
1417 eRplRejected=CINOSTaskExDef::eRplRejected,
1418 eRplFailed=CINOSTaskExDef::eRplFailed,
1419 eRplError=CINOSTaskExDef::eRplError,
1420 eRplFatal=CINOSTaskExDef::eRplFatal,
1421 eRplTimeout=CINOSTaskExDef::eRplTimeout
1422 };
1423
1424 // command codes
1425 enum {
1426 eCmdINOSTaskExFirst,
1427 eCmdFailure,
1428 eCmdStartup,
1429 eCmdShutdown,
1430 eCmdShutdownRequest,
1431 eCmdSwitchCore,
1432 eCmdSetFlag,
1433 eCmdClrFlag,
1434 eCmdStopMsg,
1435 eCmdSetIdleTimeout,
1436 eCmdINOSTaskExLast
1437 };
1438
1439 // user command codes
1440 enum {
1441 eUsrINOSTaskExFirst,
1442 eUsrMsgDone,
1443 eUsrNvUpdate,
1444 eUsrIdleTimeout,
1445 eUsrINOSTaskExLast
1446 };
1447
1448 // internal command codes
1449 enum {
1450 eIntINOSTaskExFirst,
1451 eIntAddCommand,
1452 eIntRemCommand,
1453 eIntDeleteCommand,
1454 eIntGetCommands,
1455 eIntGetProp,
1456 eIntSetProp,
1457 eIntAddProp,
1458 eIntGetActual,
1459 eIntSetActual,
1460 eIntAddActual,
1461 eIntINOSTaskExLast
1462 };
1463
1464 // message command codes
1465 enum {
1466 eMessageAdd,
1467 eMessageRemove,
1468 eMessageModify,
1469 eMessageAcknowledge,
1470 };
1471
1472 public:
1473
1474 // event codes
1475 enum {
1476 eEvtTicks,
1477 eEvtNs
1478 };
1479
1480 // states
1481 enum {
1482 eStaStartup = DEF_eStaStartup,
1483 eStaOff = DEF_eStaOff,
1484 eStaWait = DEF_eStaWait,
1485 eStaOn = DEF_eStaOn,
1486 eStaReady = DEF_eStaReady,
1487 eStaBusy = DEF_eStaBusy,
1488 eStaError = DEF_eStaError,
1489 eStaINOSTaskExLast
1490 };
1491
1492 // options
1493 enum {
1494 eOptOwner = 0x00000001, // owner protection (obsolete)
1495 eOptStat = 0x00000002, // statistics support
1496 eOptMsg = 0x00000004, // message handler
1497 eOptNvR = 0x00000008, // nvram handler
1498 eOptOvld = 0x0000010, // overloaded command names
1499 eOptCaS = 0x0000020, // check for asynch result support
1500 eOptResTsk2 = 0x0000040, // reserved for future use
1501 eOptResTsk3 = 0x0000080 // reserved for future use
1502 };
1503
1504 // flags (R - read only, W - read/write)
1505 enum {
1506 eFlgError = 0x00000001, // R error pending
1507 eFlgFatal = 0x00000002, // R fatal error pending
1508 eFlgEmergency=0x00000004, // R emergency pending
1509 eFlgSTO = 0x00000008, // R safe torque off (STO) pending
1510 eFlgResTsk4 = 0x00000010, // reserved for future use
1511 eFlgResTsk5 = 0x00000020, // reserved for future use
1512 eFlgResTsk6 = 0x00000040, // reserved for future use
1513 eFlgResTsk7 = 0x00000080 // reserved for future use
1514 };
1515
1516 // requests
1517 enum {
1518 eReqResTsk0 = 0x00000001, // reserved for future use
1519 eReqResTsk1 = 0x00000002, // reserved for future use
1520 eReqResTsk2 = 0x00000004, // reserved for future use
1521 eReqResTsk3 = 0x00000008, // reserved for future use
1522 eReqResTsk4 = 0x00000010, // reserved for future use
1523 eReqResTsk5 = 0x00000020, // reserved for future use
1524 eReqResTsk6 = 0x00000040, // reserved for future use
1525 eReqResTsk7 = 0x00000080 // reserved for future use
1526 };
1527
1528 // critical sections
1529 enum {
1530 eCrtSendMsg = 0x00000001, // send message pending
1531 eCrtResTsk1 = 0x00000002, // reserved for future use
1532 eCrtResTsk2 = 0x00000004, // reserved for future use
1533 eCrtResTsk3 = 0x00000008, // reserved for future use
1534 eCrtResTsk4 = 0x00000010, // reserved for future use
1535 eCrtResTsk5 = 0x00000020, // reserved for future use
1536 eCrtResTsk6 = 0x00000040, // reserved for future use
1537 eCrtResTsk7 = 0x00000080 // reserved for future use
1538 };
1539
1540 // dispatch flags
1541 enum {
1542 eDispFlagINCOSync = 0x00000001,
1543 };
1544
1545 // Flags to use in PutMsgEx/AddToInputQueue
1546 enum eTaskExMsgFlags {
1547 eMsgFlagNone = 0x00000000, //
1548 eMsgFlagNoWait = 0x00000001,
1549 };
1550
1551 // Enum to be used to determine how to dispatch a message
1552 enum EDispatchStyle {
1553 eDispatchNone,
1554 eDispatchNormal,
1555 eDispatchInternal,
1556 eDispatchPre
1557 };
1558
1559
1560 //--- internals --------------------------------------------------------
1561
1562 friend void _INI_0000_CINOSTaskEx();
1563 friend void _INI_0201_CINOSTaskEx();
1564 friend void _INI_0510_CINOSTaskEx();
1565 friend class CINOSTaskExState;
1566 friend class CINOSMcSync;
1567 friend class CINOSMcModule;
1568 friend class CINOSMcRobot;
1569 #if defined(INOS_COORDINATOR_SUPPORT)
1570 friend class CINOSMcCoord;
1571 #endif
1572 friend class CINOSMcLua;
1573 friend class CINOSMcMessage;
1574 friend class CINOSTaskExMsg;
1575 friend class CINOSTaskExMsgTest;
1576 friend class CINOSEventLogger;
1577
1578 // constructor / destructor
1579 public :
1581 CINOSTaskEx (const char* apName, const char* apParam=0,
1583 uint32 aPriority=defLowestPriority, bool aFloatingPoint=true,
1586 CINOSTaskEx (const char* apName, const char* apType, const char* apParam=0,
1588 uint32 aPriority=defLowestPriority, bool aFloatingPoint=true,
1591 virtual ~CINOSTaskEx();
1592
1593 // public members (used by container class)
1594 public:
1596 virtual void PostCreate(void* apParent);
1598 virtual bool PreDestroy(bool& bDeleteSelf);
1599
1602 { return (strcasecmp(GetTreeName(), aTaskEx.GetTreeName())<0);}
1604 { return (strcasecmp(GetTreeName(), aTaskEx.GetTreeName())==0);}
1605 int operator < (const char* aName)
1606 { return (strcasecmp(GetTreeName(), aName)<0);}
1607 int operator == (const char* aName)
1608 { return (strcasecmp(GetTreeName(), aName)==0);}
1609
1610 // private member functions
1611 private :
1613 static intnbr HandleTicksTriggers0(void*, intnbr);
1614 static intnbr HandleTicksTriggers1(void*, intnbr);
1615 static intnbr HandleTicksTriggers2(void*, intnbr);
1616 static intnbr HandleTicksTriggers3(void*, intnbr);
1617 static void HandleTicksTriggers(uint8 auBusId);
1621 uint32* GetEvtLevel(const uint32 auBitNumber) {
1623 const uint8 uArrayIndex = (uint8)(auBitNumber / 32);
1624 return &m_pLevel[uArrayIndex];
1625 }
1628 inline uint32 IsLevelActive(const uint32 auBitNumber) const {
1629 const uint8 uArrayIndex = (uint8)(auBitNumber / 32);
1630 const uint32 uLevel = (uint32)(1 << (auBitNumber % 32));
1631 return (m_pLevel[uArrayIndex] & uLevel);
1632 }
1633
1634 // protected member functions
1635 protected :
1637 void Create();
1639 virtual void Action() override;
1641 // Implements pre dispatch callback support for commands of type TINOSTaskExCmd.
1642 virtual bool PreDispatchMsg(CINOSTaskExMsg* apMsg);
1643
1645 virtual void PostDispatchMsg() {};
1647 virtual bool DispatchCmd(CINOSTaskExMsg* apMsg);
1649 virtual bool DispatchTmd(CINOSTaskExMsg* apMsg);
1651 virtual bool DispatchEvent(CINOSTaskExMsg* apMsg);
1653 virtual bool DispatchReply(CINOSTaskExMsg* apMsg);
1655 virtual bool DispatchUser(CINOSTaskExMsg* apMsg);
1657 virtual bool DispatchSub(CINOSTaskExMsg* apMsg);
1659 virtual bool DispatchInternal(CINOSTaskExMsg* apMsg);
1661 virtual bool DispatchMessage(CINOSTaskExMsg* apMsg);
1663 virtual bool DispatchOther(CINOSTaskExMsg* apMsg);
1664
1666 virtual void iFailure(CINOSTaskExMsg* apMsg);
1667
1669 virtual void iStartup(CINOSTaskExMsg* apMsg);
1671 virtual void iStartup(real64 arStage);
1673 virtual bool iPostStartup();
1675 virtual uint32 iAddRegisteredCommands();
1676
1678 virtual void iShutdown(CINOSTaskExMsg* apMsg);
1679 virtual void iShutdownRequest(CINOSTaskExMsg* apMsg);
1681 #ifdef INOS_MULTICORE
1682 virtual uint32 iSwitchCore(uint8 auCoreId);
1683 virtual void iSwitchCore(CINOSTaskExMsg* apMsg);
1684 #endif
1685
1687 virtual void iSetFlag(CINOSTaskExMsg* apMsg);
1688 virtual void iiSetFlag(const char* apName);
1690 virtual void iClrFlag(CINOSTaskExMsg* apMsg);
1692 virtual void iStopMsg(CINOSTaskExMsg* apMsg);
1694 virtual void iSetIdleTimeout(CINOSTaskExMsg* apMsg);
1696 virtual void iHandleIdleTimeout();
1699
1701 virtual void iCancelDeferred();
1702
1704 virtual void iAddCommand(CINOSTaskExMsg* apMsg);
1705
1707 virtual void iRemCommand(CINOSTaskExMsg* apMsg);
1708
1710 virtual void iDeleteCommand(CINOSTaskExMsg* apMsg);
1711
1713 virtual void iGetCommands(CINOSTaskExMsg* apMsg);
1714
1716 virtual void iGetProp(CINOSTaskExMsg* apMsg);
1717
1719 virtual void iSetProp(CINOSTaskExMsg* apMsg);
1720
1722 virtual void iAddProp(CINOSTaskExMsg* apMsg);
1723
1725 virtual void iGetActual(CINOSTaskExMsg* apMsg);
1726
1728 virtual void iSetActual(CINOSTaskExMsg* apMsg);
1729
1731 virtual void iAddActual(CINOSTaskExMsg* apMsg);
1732
1736 inosName128& oErrorItemName);
1737
1739 virtual void iMessageAdd(CINOSTaskExMsg* apMsg);
1741 virtual void iMessageRemove(CINOSTaskExMsg* apMsg);
1743 virtual void iMessageModify(CINOSTaskExMsg* apMsg);
1746
1750 template<class T> void ReplyParam(uint32 auReply, T);
1751
1753 virtual void SetTreeName(const char* apTreeName)
1754 { m_pTreeName = apTreeName;};
1756 virtual const char* GetStateText();
1757
1760 // special public declaration (method is public but just callable in the
1761 // own task context)
1762 public:
1764 virtual void MsgDone(CINOSTaskExMsg* apMsg, tMcAppError aAppError = 0);
1767 // protected again
1790
1791 // special public declaration (method is public but just callable in the
1792 // own task context)
1793 public:
1795 virtual tMsgId MsgDefer(CINOSTaskExMsg* apMsg, void* apHandler=0,
1796 void* apObject=0, bool abHandlesCommands = false);
1800 void* apHandler=0, void* apObject=0, bool abHandlesCommands = false);
1801 // protected again
1802 protected:
1804 // tasks than the module task
1805 virtual void iUsrMsgDone(CINOSTaskExMsg* apMsg);
1807 friend void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName,
1808 uint64 auTicks, uint8 auBusId);
1810 friend void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName,
1811 uint64 auTicks, uint8 auBusId, uint32 auFlags);
1813 friend void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName,
1814 uint32 auMs);
1816 friend void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName,
1817 uint32 auFlags, uint32 auMs);
1818
1820 virtual void FlushTmd(tMsgId aId=0);
1821
1822 protected:
1824 virtual void _AddCommand(CINOSTaskExMsg* apMsg, CINCOObject* apMsgCmdObj,
1825 int16 aiOrder = 0);
1826 // special public declaration (method is public but just callable in the
1827 // own task context)
1828 public:
1830 virtual void AddCommand(const char* apName, uint32 auCode, CINCOProcedure* apProc);
1832 virtual void AddCommand(CINOSTaskExMsg* apMsg,
1833 uint64 aChar=0, // characteristics of object
1834 uint16 aKeyLevel=cKeyLevelMin, // keylevel of object
1835 bool abRegisterInco=true);
1837 virtual void AddCommand(CINOSTaskExMsg* apMsg, CINCOObject* apMsgCmdObj);
1839 virtual void AddCommand(const char* apName, uint32 auCode, uint32 auType=eMsgCmd);
1841 virtual void RemCommand(const char* apName);
1843 virtual void AddParam(const char* apName, real64 arValue, real64 arMin,
1844 real64 arMax, const char* apUnit, uint32 auChar, uint32 auFlags = 0);
1846 virtual void AddParam(const char* apName, const char* apValue, uint32 auFlags = 0);
1848 virtual void AddParam(const char* apName, const char* apValue,
1849 const char* apComboData, uint32 auFlags = 0);
1851 virtual void AddParam(const char* apName, const char* apUnit,
1852 uint32 auValue, uint32 auMin, uint32 auMax, uint32 auChar, uint32 auFlags = 0);
1854 virtual void AddParam_int32(const char* apName, const char* apUnit,
1855 int32 aiValue, int32 aiMin, int32 aiMax, uint32 auChar, uint32 auFlags = 0);
1857 // NOTE: we cannot overload AddParam for this like uint32, as this would break
1858 // compatibility with existing code (compiler complains about ambiguous calls)
1859 virtual void AddParam_uint64(const char* apName, const char* apUnit,
1860 uint64 auValue, uint64 auMin, uint64 auMax, uint32 auChar, uint32 auFlags = 0);
1862 virtual void AddParam_int64(const char* apName, const char* apUnit,
1863 int64 aiValue, int64 aiMin, int64 aiMax, uint32 auChar, uint32 auFlags = 0);
1865 virtual void AddParam(const char* apName, const char* apComboData,
1866 uint32 auValue, uint32 auMin, uint32 auMax, const char* apUnit,
1867 uint32 auChar, uint32 auFlags = 0);
1869 virtual void AddParam(const char* apName, bool abValue, uint32 auChar,
1870 uint32 auFlags = 0);
1878 template <typename T>
1879 void AddParam(CINCOItem* apItem, T aValue, uint32 auFlags = 0) {
1880 // ensure this method is only called in our own context
1881 ASSERT_ALWAYS(ActualTask()==this);
1882 // add param to actual message
1883 CINOSTaskExMsgParam* param=m_pTmpMsg->AddParam(apItem->GetName(), aValue);
1884 param->m_uFlags = auFlags;
1885 // add inco registration
1886 if (m_pActMsgObj) {
1887 m_pActMsgObj->Add(apItem, (int16)(m_uActParamCount++));
1888 } // end if
1889 }
1890 void ProcedureArgCheck(CINCOObject& aObject,
1891 const char* apParamName, const uint32 auExpectedIncoType);
1893 virtual void AddEllipsis();
1895 virtual void AddChildCommand(const char* apModuleName,
1896 const char* apFunctionName,
1898 bool abRegisterInco = true) {};
1900 virtual void RemChildCommand(const char* apModuleName,
1901 const char* apFunctionName) {};
1903 virtual void AddChildModule(const char* apModuleName) {};
1905 virtual void RemChildModule(const char* apModuleName) {};
1906
1908 // or may be added later
1910
1913
1914 // protected again
1915 protected:
1917 virtual void AdjTrigger(CINOSTaskExMsg* apMsg);
1918
1923
1926
1929
1932 { m_pParent = apParent;};
1933
1935 void MptHook();
1937 void NvUpdate();
1938 virtual void iNvUpdate(CINOSTaskExMsg* apMsg);
1939
1941 virtual void SetFlag(uint64 auFlag, bool abUpdateState = false)
1942 {
1943 m_uFlags |= auFlag;
1944 };
1946 virtual void ClrFlag(uint64 auFlag, bool abUpdateState = false)
1947 {
1948 m_uFlags &= ~auFlag;
1949 };
1951 virtual void SetRequest(uint32 auRequest)
1954 virtual void ClrRequest(uint32 auRequest)
1962
1964 virtual CINOSSync* GetSync() override
1965 { return &m_sSyncCall; };
1967 virtual void SetCallResult(CMcResult aResult) override
1968 { m_SyncCallResult = aResult;};
1970 virtual CMcResult GetCallResult() override
1971 { return m_SyncCallResult;};
1972
1975 { m_sCritical.Request();};
1978 { m_sCritical.Release();};
1979
1989
1995 virtual void MsgCompleted(CINOSTaskExMsg*& apMsg);
1996
1999 { return m_uReqPriority; };
2002 { m_uReqPriority = auPrio; };
2003
2004
2006 void HandleTriggerMsg(CINOSTaskExMsg* apMsg, EDispatchStyle aeDispStyle);
2007
2024 const char* apParentPath, CINOSTaskExMsg* apMsg);
2025
2045 const char* apParentPath, CINOSTaskExMsg* apMsg);
2046
2048 CINOSTaskExMsg* GetTmpMsg() { return m_pTmpMsg; }
2049
2050#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
2052 virtual void OnResume(uint32 auLastState, uint32 auElapsedUs, void* apSync) override;
2053#endif
2054
2055 // public static functions
2056 public :
2064
2070
2071 static uint32 EncodeReplyCode(uint32 auReply, tMcAppError aAppError);
2072
2073 // protected static functions
2074 protected :
2075
2080
2081 // private members
2082 private :
2084 inosName32 m_cType;
2086 inosName32 m_cAliasName;
2088 char m_cParam[1024];
2090 uint32 m_uSavState;
2092 CINOSTaskEx* m_pParent{};
2094 CINOSMcMessage* m_pMessageHnd{};
2096 CINOSMcNvRamGrp* m_pNvRamGrp;
2098 uintptr m_uDispatchCmdId;
2100 const char* m_pTreeName;
2101 protected :
2103 CINCOObject* m_pRegister;
2107 std::atomic<uint64> m_uFlags;
2113 uint32 m_uState;
2114 // private members
2115 private :
2119 uint32 m_uIdleTimeout;
2120 uint32 m_uIdleTimeoutAct;
2122 CINOSxmsHandler* m_pIdleTimeoutHook = nullptr;
2123#if defined(INOS_TIMINIG_CHECKS_SUSPEND)
2124 protected :
2127#endif
2128 // private members
2129 private :
2131 #if defined(INOS_KERNEL_MSGID_64)
2132 static std::atomic<tMsgId> m_MsgId;
2133 #else
2134 static tMsgId m_MsgId;
2135 #endif
2137 CINOSTaskQueue* m_pMsgQueue;
2139 CINOSTaskExMsg* m_pTmpMsg;
2141 CINOSTaskExMsg* m_pActMsg;
2143 CINOSTaskExMsg* m_pSavMsg;
2145 CINOSTaskExMsgUser* m_pMsgUsrIdleTimeout;
2147 CINOSTaskExMsgUser* m_pMsgUsrNvUpdate;
2149 CINCOObject* m_pActMsgObj;
2151 uint32 m_uActParamCount;
2153 // if the commands binary tree is modified (add or remove) or if
2154 // the access to the command is from a different task.
2155 CINOSMutex m_CommandsMutex;
2163 CINOSTaskExDeferredMsg* m_pDeferredMsg;
2165 uint32 m_uCmdCount;
2167 int16 m_iCurCmdOrder = 1;
2169 int16 m_iCurCmdRegOrder = 1;
2170
2172 CINOSTaskExCmdDesc* m_pCmdDesc[DF_INOS_TASKEX_MAX_CMD];
2174 uintid m_uMptHookId;
2176 uint32 m_uMptState;
2178 uint64 m_uMptTimeBase;
2180 uint64 m_uStaTotal;
2182 uint64 m_uStaTime[eStaINOSTaskExLast];
2184 nvuint64* m_pNvStaTime[eStaINOSTaskExLast];
2186 uint8 m_uNvStaIndex;
2188 CINOSxmsHandler* m_pNvUpdateHook = nullptr;
2190 uint8 m_uReqPriority;
2191
2193 CINCOObject* m_pCmd;
2195 CINCOObject* m_pProp;
2197 CINCOObject* m_pOptions;
2199 CINCOObject* m_pFlags;
2201 CINCOObject* m_pRequests;
2203 CINCOObject* m_pCriticals;
2205 CINCOObject* m_pAct;
2207 CINCOObject* m_pStat;
2209 CINCOObject* m_pStatState;
2211 CINCOObject* m_pStatCmd;
2212
2216 CINOSSync* m_pStartupSync;
2218 CINOSMutex m_sCritical;
2220 CINOSSync m_sSyncCall;
2222 CMcResult m_SyncCallResult;
2223
2228 uint32 m_uDispatchFlags;
2229
2231 uint32 m_uPutMsgFlags;
2232
2233 // nvprop helpers
2234
2235 // we use protected members here to give descendents a chance to work
2236 // with their own nv variable flavours
2237 protected:
2239 CINCOObject* m_pNvInitObj;
2244
2245 private:
2251
2253 CINOSTaskExMsg* m_pDeferedStartupMsg = nullptr;
2254
2258 struct SDynamicItem {
2259 public:
2260 SDynamicItem(CINOSMcVal* apValue, const char* apName, const char* apUnit,
2261 const char* apComboData) :
2262 m_pMcValue(apValue) {
2263
2264 // Copy the name
2265 const size_t cBufSize = strlen(apName) + 1;
2266 m_pName = new char[cBufSize];
2267 strncpy(m_pName, apName, cBufSize);
2268
2269 // Copy the unit, if any
2270 if (apUnit != nullptr && apUnit[0] != '\0') {
2271 const size_t cBufSize = strlen(apUnit) + 1;
2272 m_pUnit = new char[cBufSize];
2273 strncpy(m_pUnit, apUnit, cBufSize);
2274 }
2275 else {
2276 m_pUnit = nullptr;
2277 }
2278
2279 // Do we have combo data?
2280 if (apComboData != nullptr) {
2281 // yes -> Copy the combo data in new buffer
2282 const size_t cBufSize = strlen(apComboData) + 1;
2283 m_pComboData = new char[cBufSize];
2284 strncpy(m_pComboData, apComboData, cBufSize);
2285 }
2286 else {
2287 // no -> set pointer to null
2288 m_pComboData = nullptr;
2289 }
2290 };
2291
2292 SDynamicItem(SDynamicItem&& aItem) :
2293 m_pMcValue(aItem.m_pMcValue),
2294 m_pName(aItem.m_pName),
2295 m_pUnit(aItem.m_pUnit),
2296 m_pComboData(aItem.m_pComboData)
2297 {
2298 // As ownership is moved, old pointers need to be reset to avoid
2299 // double deletes
2300 aItem.m_pMcValue = nullptr;
2301 aItem.m_pName = nullptr;
2302 aItem.m_pUnit = nullptr;
2303 aItem.m_pComboData = nullptr;
2304 };
2305
2306 ~SDynamicItem() {
2307 // Delete members if needed
2308 if(m_pMcValue != nullptr) {
2309 delete m_pMcValue;
2310 }
2311 if(m_pName != nullptr) {
2312 delete [] m_pName;
2313 }
2314 if(m_pUnit != nullptr) {
2315 delete [] m_pUnit;
2316 }
2317 if(m_pComboData != nullptr) {
2318 delete [] m_pComboData;
2319 }
2320 }
2321
2322 CINOSMcVal* m_pMcValue;
2323 char* m_pName;
2324 char* m_pUnit;
2325 char* m_pComboData;
2326 };
2327
2329 std::unordered_map <std::string, SDynamicItem> m_DynamicProps;
2330 std::unordered_map <std::string, SDynamicItem> m_DynamicActuals;
2331
2333 uint32 m_uSourceId;
2335 uint32 m_uSourceIdChild;
2337 static uint32 g_uSourceId;
2338
2339 // private static members
2340 private :
2342 static uint32 m_uTicksMsgValid[DF_INOS_BUS_MAX_NUMBER];
2344 #if defined(INOS_MULTICORE)
2345 static CINOSTaskExMsgNode* m_pTicksMsg[DF_INOS_MAX_CORES][DF_INOS_BUS_MAX_NUMBER];
2346 #else
2347 static CINOSTaskExMsgNode* m_pTicksMsg[DF_INOS_BUS_MAX_NUMBER];
2348 #endif
2350 static CINOSTaskExMsgNode* m_pVarMsg;
2352 static CINOSHooks s_MsgDoneHooks;
2354 static CINOSMutex s_MsgDoneHooksLock;
2355
2358};
2359
2363 private:
2366
2367 public:
2383 CINCOObject* apCmd = NULL);
2387
2388};
2389
2390/* gcc 10.x does not allow friends with default parameters */
2391CINOSMcMessage* GetMessageHnd(bool abSearch=true);
2392tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0);
2393tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apText, CINOSMcData* apInfo=0);
2394CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0);
2395CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apText, CINOSMcData* apInfo=0);
2396CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo=0, const char* apText=nullptr);
2397CMcResult AckMessage(const CINOSTask* apOwner, uint32 auMsgType=0xffffffff, uint32 auFlag=0);
2398CINOSMcNvRamGrp* GetNvRamGrp(bool abSearch=true);
2399void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint32 auMs=0);
2400void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint32 auFlags, uint32 auMs=0);
2401
2402// gcc 4.x.x needs additinal 'extern' declaration for friends
2403extern CINOSMcNvRamGrp* GetNvRamGrp(bool abSearch);
2404extern CINOSMcMessage* GetMessageHnd(bool abSearch);
2405extern void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint64 auTicks, uint8 auBusId);
2406extern void MsgEvent(CINOSTaskExMsg* apMsg, const char* apName, uint32 auMs);
2407extern void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint64 auTicks, uint8 auBusId, uint32 auFlags);
2408extern void MsgEventFlg(CINOSTaskExMsg* apMsg, const char* apName, uint32 auFlags, uint32 auMs);
2409extern CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2410extern CMcResult PostMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apFormat, CINOSMcData* apInfo);
2411extern CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2412extern CMcResult PostMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2413extern CMcResult ModifyMessage(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2414extern CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2415extern CMcResult ModifyMessageEx(tMsgId aiId, uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2416extern tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo);
2417extern tMcAppError SendMessage(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apFormat, CINOSMcData* apInfo);
2418extern tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, const char* apProperties);
2419extern tMcAppError SendMessageEx(uint32 auMsgType, uint32 auMsgCode, uint32 auFlags, CINOSMcData* apInfo, const char* apProperties);
2420extern CMcResult AckMessage(tMsgId auMsgId, uint32 auFlags);
2421extern CMcResult AckMessageDelayed(tMsgId aMsgId, uint32 auFlags, uint32 auTime);
2422extern CMcResult AckMessage(uint32 auMsgCode, uint32 auFlags, uint32 auMask);
2423extern CMcResult AckMessageDelayed(uint32 auMsgCode, uint32 auFlags, uint32 auMask, uint32 auTime);
2424
2425//------------------------------------------------------------------------------
2426// template function implementations
2427//------------------------------------------------------------------------------
2428
2429//------------------------------------------------------------------------------
2430//
2432{
2433 // create param
2434 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, nullptr, InINCOVContext());
2435 return iAddParam(p);
2436
2437 // end CINOSTaskExMsg::AddParam
2438}
2439
2440//------------------------------------------------------------------------------
2441//
2443{
2444 // create param
2445 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apName, InINCOVContext());
2446 // add it at the end of the list
2447 return iAddParam(p);
2448
2449 // end CINOSTaskExMsg::AddParam
2450}
2451
2452//------------------------------------------------------------------------------
2453//
2455{
2456 // create param
2458 p->SetName(apName);
2459 // add it at the end of the list
2460 iAddParam(p);
2461 return p;
2462 // end CINOSTaskExMsg::AddParam
2463}
2464//------------------------------------------------------------------------------
2465//
2466template<class T> T CINOSTaskExMsg::GetParam ()
2467{
2468 // get pointer to param
2469 CINOSTaskExMsgParam* p = iGetParam();
2470 // did we get one ?
2471 if (p) {
2472 // yes -> return result
2473 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2474 return p->CINOSTaskExMsgParam::template GetTypedValue<T>();
2475 } // end if
2476 else {
2477 // no -> return "zero"
2478 return T();
2479 }
2480 // end CINOSTaskExMsg::GetParam
2481}
2482
2483//------------------------------------------------------------------------------
2484//
2486{
2487 // reset internal pointer
2488 m_pTmpParam = 0;
2489 // call main
2490 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2491 T val = CINOSTaskExMsg::template GetParam<T>();
2492 return val;
2493
2494 // end CINOSTaskExMsg::GetFirstParam
2495}
2496
2497//------------------------------------------------------------------------------
2498//
2499template<class T> void CINOSTaskExMsg::AddResult(T aValue, const char* apResultName /*= NULL*/)
2500{
2501 // create param
2502 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2503 // add it at the end of the list
2504 iAddResult(p);
2505
2506} // end CINOSTaskExMsg::AddResult
2507
2508//------------------------------------------------------------------------------
2509//
2510template<class T> void CINOSTaskExMsg::InsertResult(T aValue, const char* apResultName /*= NULL*/)
2511{
2512 // create param
2513 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2514 // insert it at the beginning of the list
2515 iInsertResult(p);
2516
2517} // end CINOSTaskExMsg::InsertResult
2518
2519//------------------------------------------------------------------------------
2520//
2521template<class T> void CINOSTaskExMsg::AppendResult(T aValue, const char* apResultName /*= NULL*/)
2522{
2523 // create param
2524 CINOSTaskExMsgParam* p = new CINOSTaskExMsgParam(aValue, apResultName, InINCOVContext());
2525 // add it at the end of the list
2526 iAppendResult(p);
2527
2528} // end CINOSTaskExMsg::AppendResult
2529
2530//------------------------------------------------------------------------------
2531//
2532template<class T> T CINOSTaskExMsg::GetResult ()
2533{
2534 // get pointer to param
2535 CINOSTaskExMsgParam* p = iGetResult();
2536 // did we get one ?
2537 if (p) {
2538 // yes -> return result
2539 // (work around for gcc bug 1058: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1058)
2540 return p->CINOSTaskExMsgParam::template GetTypedValue<T>();
2541 } // end if
2542 else {
2543 // no -> return "zero"
2544 return (T) 0;
2545 }
2546 // end CINOSTaskExMsg::GetResult
2547}
2548
2549//------------------------------------------------------------------------------
2550//
2551template<class T> void CINOSTaskEx::ReplyParam(uint32 auReply, T aValue)
2552{
2553 // ensure that we have a command
2554 if (m_pActMsg){
2555 // get pointer to sender of actual command
2556 CINOSTask* snd = m_pActMsg->m_pSender;
2557 // reply only allowed if task exists and was inherited from CINOSTaskEx
2558 if (snd && (snd->mClassSize == sizeof(CINOSTaskEx))){
2559 // create reply
2560 CINOSTaskExMsg* pRpl = new CINOSTaskExMsg(eMsgReply, auReply);
2561 // copy also user data to reply
2562 pRpl->SetUser(m_pActMsg->GetUser());
2563 // add requested param
2564 pRpl->AddParam(aValue);
2565 // and put it into the sender's queue
2566 ((CINOSTaskEx*)snd)->PutReply(pRpl, m_pActMsg->m_Id);
2567 } // end if
2568 } // end if
2569
2570 // end CINOSTaskEx::Reply
2571}
2572
2576{
2578 if (pTask->GetClassSize() == sizeof(CINOSTaskEx)) {
2579 return static_cast<CINOSTaskEx*>(pTask);
2580 }
2581 else {
2582 return nullptr;
2583 }
2584}
2585
2586//------------------------------------------------------------------------------
2587// class definition
2588//------------------------------------------------------------------------------
2589//
2591{
2592 //--- user interface ---------------------------------------------------
2593
2594 // public members
2595 public:
2598
2599 //--- internals --------------------------------------------------------
2600
2601 // protected members
2602 protected :
2604 virtual void Signal();
2605
2606 // private members
2607 private :
2609 CINOSTaskEx* m_pTask;
2611 tMsgId m_MsgId;
2612
2615};
2616
2617//------------------------------------------------------------------------------
2618// class definition
2619//------------------------------------------------------------------------------
2620// Helper sync object that implements a event queue. This can be used
2621// if a task needs to wait for an event of a command synchronously.
2623{
2624 //--- user interface ---------------------------------------------------
2625
2626 // public members
2627 public:
2630
2631 virtual ~CINOSMcSyncEvent();
2632
2634 ICACHE virtual bool MsgEvent(CINOSTaskExMsg* apMsg) override;
2635
2637 virtual CINOSTaskQueue* GetEventQueue() { return m_pEventQueue; };
2638
2640 // deletes all events that occur before that event
2641 // is never nullptr as the function waits forever for the event.
2643
2644 // private members
2645 private :
2647 CINOSTaskQueue* m_pEventQueue;
2648
2651};
2652
2653
2654//------------------------------------------------------------------------------
2655// class definition
2656//------------------------------------------------------------------------------
2657//
2681{
2682 private:
2686 public:
2697 CINOSTaskExMsg* apMsg);
2698 /* Overwritten to perform specific stuff. */
2699 virtual void Signal();
2700
2701 private:
2702 CINOSTaskEx& m_Task;
2703 CINOSTaskExMsg* m_pMsg;
2704
2706};
2707
2708//------------------------------------------------------------------------------
2709// CINCOTaskExProcedure
2710//------------------------------------------------------------------------------
2711
2712class CINCOTaskExProcedure : public CINCOProcedure
2713{
2714 // constructor
2715 public:
2717 char* apName, // object name
2723 uint32 auNumberOfParameters, // number of parameters
2724 uint32 auTypeOfParameters, // first 16 bit long paras / string;
2725 // after float paras
2726 uint32 auIntTypeOfParameters, // first 16 bit signed, second 16 bit bool
2727 uint64 auChar, // characteristics of object
2728 uint16 auKeyLevel // keylevel of object
2729 );
2730
2731 // call procedure
2732 virtual void Call(void* aParameters=0, void* aResult=0, long aOffset=0,bool aCallProcEx=true) override;
2733#ifdef INOS_FAST_CALLPROCEDURE
2734 // call procedure consolidated
2735 virtual void Call(CINCOParamReader& aParameters, CINCOResult& aResult, long aOffset=0) override;
2736#endif
2737
2738 protected:
2739 CINOSTaskEx* m_pTask;
2740 uint32 m_uMsgType;
2741 uintptr m_uMsgCode;
2742 uint32 m_uMsgSubCode;
2743 uint32 m_uMsgFlags;
2744 uint32 m_uSubTypeOfParameters;
2745
2746
2748};
2749
2750//------------------------------------------------------------------------------
2751// Include CINCOTaskEx templates. Must be at the bottom of the file to
2752// avoid cyclic includes.
2753//------------------------------------------------------------------------------
2754
2755#include <cinostaskextmpl.h>
2756
2757
2758//------------------------------------------------------------------------------
2759
2760#endif // INC_CINOSTASKEX_H
2761
2762
2763//------------------------------------------------------------------------------
2764// end of file
Short comment.
#define DECLARE_DYNAMIC(aClass)
Definition cinospartitionmemory.h:328
CINOSTaskEx * ActualTaskEx()
Definition cinostaskex.h:2575
uint32 tMcAppError
Definition cinostaskexdef.h:53
Helper class and templates definition for CINOSTaskEx.
Definition cinostaskex.h:2713
CINOSMcModuleWaitObj * m_pNext
pointer to next in chain
Definition cinosmcmodule.h:1890
Definition cinosmcmodule.h:1900
Definition cinosmcmodule.h:296
Definition cinosmcrobot.h:206
Definition cinostaskex.h:2623
virtual CINOSTaskQueue * GetEventQueue()
Gets the message queue from the sync object.
Definition cinostaskex.h:2637
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:2681
virtual void Signal()
Put object into the signaled state.
static CINOSMcSyncMsg * Create(CINOSTaskEx &aTask, CINOSTaskExMsg *apMsg)
Definition cinostaskex.h:2591
virtual void Signal()
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
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:2532
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:2431
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:2485
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:2510
void SetDeferred()
get deferred flag
Definition cinostaskex.h:645
void AppendResult(T, const char *apResultName=NULL)
Definition cinostaskex.h:2521
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:2499
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:2466
CINOSTaskExMsgDefaultParam * AddDefaultParam(const char *apName, T aValue)
add default param
Definition cinostaskex.h:2454
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:2362
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:1970
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:1645
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:1905
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:2111
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:2551
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:1957
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:2241
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:2107
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:1601
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:2243
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:2103
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:1753
virtual void PostCreate(void *apParent)
called after creation
uint32 m_uRequests
task requests
Definition cinostaskex.h:2109
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:1931
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:1903
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:2105
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:1900
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:2048
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:1879
void ClrCritical(uint32 auCritical)
clr critical
Definition cinostaskex.h:1960
virtual void MsgError(CINOSTaskExMsg *apMsg, tMcAppError aAppError)
message error
virtual void ClrFlag(uint64 auFlag, bool abUpdateState=false)
clr flag
Definition cinostaskex.h:1946
virtual void AddEllipsis()
Add ellipsis to command.
virtual void SetFlag(uint64 auFlag, bool abUpdateState=false)
set flag
Definition cinostaskex.h:1941
uint8 GetRequestedPriority()
get requested priority
Definition cinostaskex.h:1998
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:1895
virtual CMcResult StopMsg(tMsgId atMsgId, CINOSSync *apSync=DF_INOS_SYNCHRONOUS)
stop 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:2239
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:1974
virtual void iSetActual(CINOSTaskExMsg *apMsg)
internal set actual
ERplId
reply id's
Definition cinostaskex.h:1409
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:1954
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:1967
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:2113
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:2001
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:1951
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:1977
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:1964
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:143
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:1677
uint32 INOS_MCMSG_CODE_TSKEX_UNKNOWN
Definition inoserror.h:1677
uint32 INOS_MCMSG_CODE_TSKEX_WRONG_PARAMS
Definition inoserror.h:1677
#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