F´ Flight Software - C/C++ Documentation  NASA-v2.1.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 <stdio.h>
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 
19  U8* getBuffAddr(void) {
20  return m_buff;
21  }
22 
23  const U8* getBuffAddr(void) 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,(NATIVE_INT_TYPE)status);
79  }
80 
83  SerializeStatus stat = exitBuff.serialize((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 != NULL);
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,(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,(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::ActiveComponentBase::m_task
Os::Task m_task
task object for active component
Definition: ActiveComponentBase.hpp:40
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
Fw::QueuedComponentBase::doDispatch
virtual MsgDispatchStatus doDispatch(void)=0
method to dispatch a single message in the queue.
Fw::SerializeBufferBase
Definition: Serializable.hpp:43
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
Os::Task::getNumTasks
static NATIVE_INT_TYPE getNumTasks(void)
Definition: TaskCommon.cpp:13
Fw::SerializeBufferBase::serialize
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
Definition: Serializable.cpp:67
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:76
Fw::QueuedComponentBase::m_queue
Os::Queue m_queue
queue object for active component
Definition: QueuedComponentBase.hpp:36
Fw::ActiveComponentBase::preamble
virtual void preamble(void)
A function that will be called before the event loop is entered.
Definition: ActiveComponentBase.cpp:151
Os::Task::taskRoutine
void(* taskRoutine)(void *ptr)
prototype for task routine started in task context
Definition: Task.hpp:31
Fw::ActiveComponentExitSerializableBuffer
Definition: ActiveComponentBase.cpp:12
Assert.hpp
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Os::Queue::send
QueueStatus send(const Fw::SerializeBufferBase &buffer, NATIVE_INT_TYPE priority, QueueBlocking block)
send a message
Definition: QueueCommon.cpp:13
Fw::ObjBase::init
void init(void)
Object initializer.
Definition: ObjBase.cpp: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
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
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:30
Fw::ActiveComponentExitSerializableBuffer::getBuffAddr
const U8 * getBuffAddr(void) const
gets buffer address for data reading, const version
Definition: ActiveComponentBase.cpp:23
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Os::Task::isStarted
bool isStarted(void)
check to see if task is started
Definition: TaskCommon.cpp:22
Fw::ActiveComponentBase::finalizer
virtual void finalizer(void)
A function that will be called after exiting the loop.
Definition: ActiveComponentBase.cpp:154
Fw::ActiveComponentBase
Definition: ActiveComponentBase.hpp:20
Os::Queue::getNumMsgs
NATIVE_INT_TYPE getNumMsgs(void) const
get the number of messages in the queue
Definition: Queue.cpp:210
TaskString.hpp
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:16
Fw::ActiveComponentExitSerializableBuffer::getBuffCapacity
NATIVE_UINT_TYPE getBuffCapacity(void) const
returns capacity, not current size, of buffer
Definition: ActiveComponentBase.cpp:15
FpConfig.hpp
ISF configuration file.
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
Fw::ActiveComponentExitSerializableBuffer::getBuffAddr
U8 * getBuffAddr(void)
gets buffer address for data filling
Definition: ActiveComponentBase.cpp:19
Fw::ActiveComponentBase::ACTIVE_COMPONENT_EXIT
@ ACTIVE_COMPONENT_EXIT
message to exit active component task
Definition: ActiveComponentBase.hpp:30
FW_TASK_NAME_MAX_SIZE
#define FW_TASK_NAME_MAX_SIZE
Max size of task name.
Definition: FpConfig.hpp:219
Os::Queue::QUEUE_NONBLOCKING
@ QUEUE_NONBLOCKING
Queue receive always returns even if there is no message.
Definition: Queue.hpp:42
Fw::ActiveComponentBase::exit
void exit(void)
exit task in active component
Definition: ActiveComponentBase.cpp:81
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
NULL
#define NULL
NULL.
Definition: BasicTypes.hpp:100
Fw
Definition: Buffer.cpp:21
Os::Task::join
TaskStatus join(void **value_ptr)
Wait for task to finish.
Definition: Task.cpp:72
Fw::ActiveComponentBase::loop
virtual void loop(void)
The function that will loop dispatching messages.
Definition: ActiveComponentBase.cpp:133