F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TlmChanImplRecv.cpp
Go to the documentation of this file.
1 /*
2  * TelemChanImpl.cpp
3  *
4  * Created on: Mar 28, 2014
5  * Author: tcanham
6  */
7 
9 #include <cstring>
10 #include <Fw/Types/BasicTypes.hpp>
11 #include <Fw/Types/Assert.hpp>
12 
13 #include <stdio.h>
14 
15 namespace Svc {
16 
17  void TlmChanImpl::TlmRecv_handler(NATIVE_INT_TYPE portNum, FwChanIdType id, Fw::Time &timeTag, Fw::TlmBuffer &val) {
18 
19  // Compute index for entry
20 
21  NATIVE_UINT_TYPE index = this->doHash(id);
22  TlmEntry* entryToUse = 0;
23  TlmEntry* prevEntry = 0;
24 
25  // Search to see if channel has already been stored or a bucket needs to be added
26  if (this->m_tlmEntries[this->m_activeBuffer].slots[index]) {
27  entryToUse = this->m_tlmEntries[this->m_activeBuffer].slots[index];
28  for (NATIVE_UINT_TYPE bucket = 0; bucket < TLMCHAN_HASH_BUCKETS; bucket++) {
29  if (entryToUse) {
30  if (entryToUse->id == id) { // found the matching entry
31  break;
32  } else { // try next entry
33  prevEntry = entryToUse;
34  entryToUse = entryToUse->next;
35  }
36  } else {
37  // Make sure that we haven't run out of buckets
38  FW_ASSERT(this->m_tlmEntries[this->m_activeBuffer].free < TLMCHAN_HASH_BUCKETS);
39  // add new bucket from free list
40  entryToUse = &this->m_tlmEntries[this->m_activeBuffer].buckets[this->m_tlmEntries[this->m_activeBuffer].free++];
41  FW_ASSERT(prevEntry);
42  prevEntry->next = entryToUse;
43  // clear next pointer
44  entryToUse->next = 0;
45  break;
46  }
47  }
48  } else {
49  // Make sure that we haven't run out of buckets
50  FW_ASSERT(this->m_tlmEntries[this->m_activeBuffer].free < TLMCHAN_HASH_BUCKETS);
51  // create new entry at slot head
52  this->m_tlmEntries[this->m_activeBuffer].slots[index] = &this->m_tlmEntries[this->m_activeBuffer].buckets[this->m_tlmEntries[this->m_activeBuffer].free++];
53  entryToUse = this->m_tlmEntries[this->m_activeBuffer].slots[index];
54  entryToUse->next = 0;
55  }
56 
57  // copy into entry
58  FW_ASSERT(entryToUse);
59  entryToUse->used = true;
60  entryToUse->id = id;
61  entryToUse->updated = true;
62  entryToUse->lastUpdate = timeTag;
63  entryToUse->buffer = val;
64 
65  }
66 }
Fw::Time
Definition: Time.hpp:10
TlmChanImpl.hpp
Component that stores telemetry channel values.
Fw::TlmBuffer
Definition: TlmBuffer.hpp:21
FwChanIdType
#define FwChanIdType
Type representation for a channel id.
Definition: FpConfig.hpp:66
Assert.hpp
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:30
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Svc
Definition: ActiveRateGroupImplCfg.hpp:18
BasicTypes.hpp
Declares ISF basic types.
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Svc::TlmChanImpl::doHash
virtual NATIVE_UINT_TYPE doHash(FwChanIdType id)
Definition: TlmChanImpl.cpp:61