Lodestar
An integrated real-time control package in C++
ProtoMsgOutBlock.hpp
1 //
2 // Created by Hamza El-Kebir on 2/10/22.
3 //
4 
5 #ifndef LODESTAR_PROTOMSGOUTBLOCK_HPP
6 #define LODESTAR_PROTOMSGOUTBLOCK_HPP
7 
8 #include "Lodestar/blocks/Block.hpp"
9 #include <Lodestar/io/NanopbWrapper.hpp>
10 
11 namespace ls {
12  namespace blocks {
13  namespace std {
14  template<typename TType, bool BEncrypt = false>
16  public Block<
17  ::std::tuple<TType>,
18  ::std::tuple<pb_ostream_t *>,
19  ::std::tuple<pb_ostream_t *>
20  > {
21  public:
22  using Base =
23  Block<
24  ::std::tuple<TType>,
25  ::std::tuple<pb_ostream_t *>,
26  ::std::tuple<pb_ostream_t *>
27  >;
28 
30  {
31  bindEquation();
32  }
33 
34  typename ::std::tuple_element<0, typename Base::Params>::type &
35  stream()
36  {
37  return this->template p<0>();
38  }
39 
40  const typename ::std::tuple_element<0, typename Base::Params>::type &
41  stream() const
42  {
43  return this->template p<0>();
44  }
45 
46  const ls::io::MsgInfo &info() const
47  {
48  static ls::io::MsgInfo info;
49  info.encrypted = BEncrypt;
50  info.slot = this->template i<0>().connectionPtrs.begin()->slotId;
51  info.id = this->template i<0>().connectionPtrs.begin()->blockId;
52 
53  return info;
54  }
55 
56  protected:
57  void bindEquation()
58  {
59  this->equation = ::std::bind(
61  this,
62  ::std::placeholders::_1
63  );
64  }
65 
66  void triggerFunction(Base &b)
67  {
68  ls::io::NanopbWrapper<TType>::encode(b->template i<0>().object, info(), stream());
69  b.template o<0>() = b.template p<0>();
70  }
71  };
72  }
73 
74  template<typename TType>
76  public:
77  static constexpr const BlockType blockType = BlockType::ProtoMsgOutBlock;
78  enum {
79  directFeedthrough = false
80  };
81 
83  using Base = typename type::Base;
84 
85  enum {
86  kIns = Base::kIns,
87  kOuts = Base::kOuts,
88  kPars = Base::kPars
89  };
90 
91  static const ::std::array<::std::string, kIns> inTypes;
92  static const ::std::array<::std::string, kOuts> outTypes;
93  static const ::std::array<::std::string, kPars> parTypes;
94 
95  static const ::std::array<::std::string, 1> templateTypes;
96  };
97 
98  template<typename TType>
99  const ::std::array<::std::string, BlockTraits<std::ProtoMsgOutBlock<TType>>::kIns> BlockTraits<std::ProtoMsgOutBlock<TType>>::inTypes =
100  {demangle(typeid(TType).name())};
101 
102  template<typename TType>
103  const ::std::array<::std::string, BlockTraits<std::ProtoMsgOutBlock<TType>>::kOuts> BlockTraits<std::ProtoMsgOutBlock<TType>>::outTypes =
104  {demangle(typeid(pb_ostream_t *).name())};
105 
106  template<typename TType>
107  const ::std::array<::std::string, BlockTraits<std::ProtoMsgOutBlock<TType>>::kPars> BlockTraits<std::ProtoMsgOutBlock<TType>>::parTypes =
108  {demangle(typeid(pb_ostream_t *).name())};
109 
110  template<typename TType>
111  const ::std::array<::std::string, 1> BlockTraits<std::ProtoMsgOutBlock<TType>>::templateTypes =
112  {demangle(typeid(pb_ostream_t *).name())};
113  }
114 }
115 
116 #endif //LODESTAR_PROTOMSGOUTBLOCK_HPP
ls::blocks::BlockTraits
A traits object that exposes information about TBlock.
Definition: BlockTraits.hpp:37
ls::blocks::BlockType
BlockType
Block type information.
Definition: BlockType.hpp:25
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::blocks::std::ProtoMsgOutBlock
Definition: ProtoMsgOutBlock.hpp:15
ls::io::MsgInfo
Definition: NanopbWrapper.hpp:35
ls::blocks::Block
Generic base template class for all tuple-based Block instances.
Definition: Block.hpp:45
ls::io::NanopbWrapper
Definition: NanopbWrapper.hpp:45
ls::blocks::BlockType::ProtoMsgOutBlock
@ ProtoMsgOutBlock
Protocol Buffers output block.