F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
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 <cstdio>
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 = nullptr;
23  TlmEntry* prevEntry = nullptr;
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 = nullptr;
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 = nullptr;
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:62
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:8
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