F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ActiveComponentBase.cpp
Go to the documentation of this file.
1 #include <FpConfig.hpp>
3 #include <Fw/Types/Assert.hpp>
4 #include <Os/TaskString.hpp>
5 #include <cstdio>
6 
7 //#define DEBUG_PRINT(x,...) printf(x,##__VA_ARGS__); fflush(stdout)
8 #define DEBUG_PRINT(x,...)
9 
10 namespace Fw {
11 
13 
14  public:
16  return sizeof(m_buff);
17  }
18 
20  return m_buff;
21  }
22 
23  const U8* getBuffAddr() const {
24  return m_buff;
25  }
26 
27  private:
28 
30 
31  };
32 
34 
35  }
36 
38  DEBUG_PRINT("ActiveComponent %s destructor.\n",this->getObjName());
39  }
40 
42  QueuedComponentBase::init(instance);
43  }
44 
45 #if FW_OBJECT_TO_STRING == 1 && FW_OBJECT_NAMES == 1
46  void ActiveComponentBase::toString(char* buffer, NATIVE_INT_TYPE size) {
47  FW_ASSERT(size > 0);
48  if (snprintf(buffer, size, "ActComp: %s", this->m_objName) < 0) {
49  buffer[0] = 0;
50  }
51  }
52 #endif
53 
54  void ActiveComponentBase::start(NATIVE_INT_TYPE identifier, NATIVE_INT_TYPE priority, NATIVE_INT_TYPE stackSize, NATIVE_INT_TYPE cpuAffinity) {
55  this->start(static_cast<NATIVE_UINT_TYPE>(priority), static_cast<NATIVE_UINT_TYPE>(stackSize),
56  ((cpuAffinity == -1) ? Os::Task::TASK_DEFAULT : static_cast<NATIVE_UINT_TYPE>(cpuAffinity)),
57  static_cast<NATIVE_UINT_TYPE>(identifier));
58  }
59 
60  void ActiveComponentBase::start(NATIVE_UINT_TYPE priority, NATIVE_UINT_TYPE stackSize, NATIVE_UINT_TYPE cpuAffinity, NATIVE_UINT_TYPE identifier) {
61  Os::TaskString taskName;
62 
63 #if FW_OBJECT_NAMES == 1
64  taskName = this->getObjName();
65 #else
66  char taskNameChar[FW_TASK_NAME_MAX_SIZE];
67  (void)snprintf(taskNameChar,sizeof(taskNameChar),"ActComp_%d",Os::Task::getNumTasks());
68  taskName = taskNameChar;
69 #endif
70 // If running with the baremetal scheduler, use a variant of the task-loop that
71 // does not loop internal, but waits for an external iteration call.
72 #if FW_BAREMETAL_SCHEDULER == 1
73  Os::Task::taskRoutine routine = this->s_baseBareTask;
74 #else
75  Os::Task::taskRoutine routine = this->s_baseTask;
76 #endif
77  Os::Task::TaskStatus status = this->m_task.start(taskName, routine, this, priority, stackSize, cpuAffinity, identifier);
78  FW_ASSERT(status == Os::Task::TASK_OK,static_cast<NATIVE_INT_TYPE>(status));
79  }
80 
83  SerializeStatus stat = exitBuff.serialize(static_cast<I32>(ACTIVE_COMPONENT_EXIT));
84  FW_ASSERT(FW_SERIALIZE_OK == stat,static_cast<NATIVE_INT_TYPE>(stat));
85  (void)this->m_queue.send(exitBuff,0,Os::Queue::QUEUE_NONBLOCKING);
86  DEBUG_PRINT("exit %s\n", this->getObjName());
87  }
88 
90  DEBUG_PRINT("join %s\n", this->getObjName());
91  return this->m_task.join(value_ptr);
92  }
93 
94  void ActiveComponentBase::s_baseBareTask(void* ptr) {
95  FW_ASSERT(ptr != nullptr);
96  ActiveComponentBase* comp = reinterpret_cast<ActiveComponentBase*>(ptr);
97  //Start if not started
98  if (!comp->m_task.isStarted()) {
99  comp->m_task.setStarted(true);
100  comp->preamble();
101  }
102  //Bare components cannot block, so return to the scheduler
103  if (comp->m_queue.getNumMsgs() == 0) {
104  return;
105  }
107  switch (loopStatus) {
108  case ActiveComponentBase::MSG_DISPATCH_OK: // if normal message processing, continue
109  break;
111  comp->finalizer();
112  comp->m_task.setStarted(false);
113  break;
114  default:
115  FW_ASSERT(0,static_cast<NATIVE_INT_TYPE>(loopStatus));
116  }
117  }
118  void ActiveComponentBase::s_baseTask(void* ptr) {
119  // cast void* back to active component
120  ActiveComponentBase* comp = static_cast<ActiveComponentBase*> (ptr);
121  // indicated that task is started
122  comp->m_task.setStarted(true);
123  // print out message when task is started
124  // printf("Active Component %s task started.\n",comp->getObjName());
125  // call preamble
126  comp->preamble();
127  // call main task loop until exit or error
128  comp->loop();
129  // if main loop exits, call finalizer
130  comp->finalizer();
131  }
132 
134 
135  bool quitLoop = false;
136  while (!quitLoop) {
137  MsgDispatchStatus loopStatus = this->doDispatch();
138  switch (loopStatus) {
139  case MSG_DISPATCH_OK: // if normal message processing, continue
140  break;
141  case MSG_DISPATCH_EXIT:
142  quitLoop = true;
143  break;
144  default:
145  FW_ASSERT(0,static_cast<NATIVE_INT_TYPE>(loopStatus));
146  }
147  }
148 
149  }
150 
152  }
153 
155  }
156 
157 }
Os::Task::setStarted
void setStarted(bool started)
set task to started when thread is fully up. Avoids a VxWorks race condition.
Definition: TaskCommon.cpp:26
FW_TASK_NAME_MAX_SIZE
#define FW_TASK_NAME_MAX_SIZE
Max size of task name.
Definition: FpConfig.hpp:207
Fw::ActiveComponentBase::m_task
Os::Task m_task
task object for active component
Definition: ActiveComponentBase.hpp:40
Fw::ActiveComponentExitSerializableBuffer::getBuffAddr
U8 * getBuffAddr()
gets buffer address for data filling
Definition: ActiveComponentBase.cpp:19
Fw::ActiveComponentBase::join
Os::Task::TaskStatus join(void **value_ptr)
provide return value of thread if value_ptr is not NULL
Definition: ActiveComponentBase.cpp:89
Fw::ActiveComponentBase::start
void start(NATIVE_UINT_TYPE priority=Os::Task::TASK_DEFAULT, NATIVE_UINT_TYPE stackSize=Os::Task::TASK_DEFAULT, NATIVE_UINT_TYPE cpuAffinity=Os::Task::TASK_DEFAULT, NATIVE_UINT_TYPE identifier=Os::Task::TASK_DEFAULT)
called by instantiator when task is to be started
Definition: ActiveComponentBase.cpp:54
Os::Task::isStarted
bool isStarted()
check to see if task is started
Definition: TaskCommon.cpp:22
Fw::SerializeBufferBase
Definition: Serializable.hpp:43
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
Fw::ActiveComponentExitSerializableBuffer::getBuffCapacity
NATIVE_UINT_TYPE getBuffCapacity() const
returns capacity, not current size, of buffer
Definition: ActiveComponentBase.cpp:15
Fw::ActiveComponentBase::loop
virtual void loop()
The function that will loop dispatching messages.
Definition: ActiveComponentBase.cpp:133
Fw::SerializeBufferBase::serialize
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
Definition: Serializable.cpp:69
Fw::QueuedComponentBase::doDispatch
virtual MsgDispatchStatus doDispatch()=0
method to dispatch a single message in the queue.
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:73
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:28
Fw::ActiveComponentExitSerializableBuffer::getBuffAddr
const U8 * getBuffAddr() const
gets buffer address for data filling
Definition: ActiveComponentBase.cpp:23
Fw::QueuedComponentBase::m_queue
Os::Queue m_queue
queue object for active component
Definition: QueuedComponentBase.hpp:36
Fw::ActiveComponentBase::exit
void exit()
exit task in active component
Definition: ActiveComponentBase.cpp:81
Os::Task::taskRoutine
void(* taskRoutine)(void *ptr)
prototype for task routine started in task context
Definition: Task.hpp:31
Os::Queue::getNumMsgs
NATIVE_INT_TYPE getNumMsgs() const
get the number of messages in the queue
Definition: Queue.cpp:211
Fw::ActiveComponentExitSerializableBuffer
Definition: ActiveComponentBase.cpp:12
Os::Queue::send
QueueStatus send(const Fw::SerializeBufferBase &buffer, NATIVE_INT_TYPE priority, QueueBlocking block)
send a message
Definition: QueueCommon.cpp:13
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:27
Os::Task::TASK_DEFAULT
static const NATIVE_UINT_TYPE TASK_DEFAULT
Definition: Task.hpp:18
Fw::QueuedComponentBase::MSG_DISPATCH_OK
@ MSG_DISPATCH_OK
Dispatch was normal.
Definition: QueuedComponentBase.hpp:26
Fw::ActiveComponentBase::finalizer
virtual void finalizer()
A function that will be called after exiting the loop.
Definition: ActiveComponentBase.cpp:154
ActiveComponentBase.hpp
Os::Task::TASK_OK
@ TASK_OK
message sent/received okay
Definition: Task.hpp:20
Os::TaskString
Definition: TaskString.hpp:10
Os::Task::TaskStatus
TaskStatus
Definition: Task.hpp:19
DEBUG_PRINT
#define DEBUG_PRINT(x,...)
Definition: ActiveComponentBase.cpp:8
Fw::ActiveComponentBase::ActiveComponentBase
ActiveComponentBase(const char *name)
Constructor.
Definition: ActiveComponentBase.cpp:33
Fw::QueuedComponentBase::MsgDispatchStatus
MsgDispatchStatus
Definition: QueuedComponentBase.hpp:25
Fw::ActiveComponentBase::preamble
virtual void preamble()
A function that will be called before the event loop is entered.
Definition: ActiveComponentBase.cpp:151
Fw::ActiveComponentBase
Definition: ActiveComponentBase.hpp:20
TaskString.hpp
Fw::ObjBase::init
void init()
Object initializer.
Definition: ObjBase.cpp:27
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Fw::QueuedComponentBase
Definition: QueuedComponentBase.hpp:21
Os::Task::start
TaskStatus start(const Fw::StringBase &name, taskRoutine routine, void *arg, NATIVE_UINT_TYPE priority=TASK_DEFAULT, NATIVE_UINT_TYPE stackSize=TASK_DEFAULT, NATIVE_UINT_TYPE cpuAffinity=TASK_DEFAULT, NATIVE_UINT_TYPE identifier=TASK_DEFAULT)
start the task
Definition: Task.cpp:18
Fw::ActiveComponentBase::~ActiveComponentBase
virtual ~ActiveComponentBase()
Destructor.
Definition: ActiveComponentBase.cpp:37
Fw::QueuedComponentBase::MSG_DISPATCH_EXIT
@ MSG_DISPATCH_EXIT
A message was sent requesting an exit of the loop.
Definition: QueuedComponentBase.hpp:29
Os::Queue::QUEUE_NONBLOCKING
@ QUEUE_NONBLOCKING
Queue receive always returns even if there is no message.
Definition: Queue.hpp:42
Os::Task::getNumTasks
static NATIVE_INT_TYPE getNumTasks()
Definition: TaskCommon.cpp:13
Fw::ActiveComponentBase::ACTIVE_COMPONENT_EXIT
@ ACTIVE_COMPONENT_EXIT
message to exit active component task
Definition: ActiveComponentBase.hpp:30
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Fw
Definition: SerIds.hpp:20
Os::Task::join
TaskStatus join(void **value_ptr)
Wait for task to finish.
Definition: Task.cpp:74