Apollo  6.0
Open source self driving car software
bridge_header.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2019 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
17 #pragma once
18 
19 #include <cstring>
20 #include <string>
21 
23 
24 namespace apollo {
25 namespace bridge {
26 
27 typedef uint32_t hsize;
28 
29 constexpr char BRIDGE_HEADER_FLAG[] = "ApolloBridgeHeader";
30 constexpr size_t HEADER_FLAG_SIZE = sizeof(BRIDGE_HEADER_FLAG);
31 constexpr size_t Item_Header_Size = sizeof(HType) + sizeof(bsize) + 2;
32 
33 class BridgeHeader {
34  public:
35  BridgeHeader() = default;
36  ~BridgeHeader() = default;
37 
38  public:
39  bool Serialize(char *buf, size_t size);
40  bool Diserialize(const char *buf, size_t buf_size);
41  bool IsAvailable(const char *buf);
42 
43  uint32_t GetHeaderVer() const { return header_ver_.value_; }
44  hsize GetHeaderSize() const {
45  return static_cast<hsize>(header_body_size_ + HEADER_FLAG_SIZE +
46  sizeof(hsize) + 2);
47  }
48  bsize GetHeaderBodySize() const { return header_body_size_; }
49  std::string GetMsgName() const { return msg_name_.value_; }
50  uint32_t GetMsgID() const { return msg_id_.value_; }
51  uint32_t GetTotalFrames() const { return total_frames_.value_; }
52  uint32_t GetIndex() const { return index_.value_; }
53  double GetTimeStamp() const { return time_stamp_.value_; }
54  bsize GetMsgSize() const { return msg_size_.value_; }
55  bsize GetFrameSize() const { return frame_size_.value_; }
56  bsize GetFramePos() const { return frame_pos_.value_; }
57 
58  void SetHeaderVer(uint32_t header_ver) {
59  header_ver_ = header_ver;
60  header_body_size_ +=
61  static_cast<hsize>(Item_Header_Size + 1 + sizeof(uint32_t));
62  }
63  void SetMsgName(const std::string &msg_name) {
64  msg_name_ = msg_name;
65  header_body_size_ +=
66  static_cast<hsize>(Item_Header_Size + 1 + msg_name.length() + 1);
67  }
68  void SetMsgID(uint32_t msg_id) {
69  msg_id_ = msg_id;
70  header_body_size_ +=
71  static_cast<hsize>(Item_Header_Size + 1 + sizeof(uint32_t));
72  }
73  void SetTotalFrames(uint32_t total_frames) {
74  total_frames_ = total_frames;
75  header_body_size_ +=
76  static_cast<hsize>(Item_Header_Size + 1 + sizeof(uint32_t));
77  }
78  void SetFrameSize(bsize frame_size) {
79  frame_size_ = frame_size;
80  header_body_size_ +=
81  static_cast<hsize>(Item_Header_Size + 1 + sizeof(bsize));
82  }
83  void SetFramePos(bsize frame_pos) {
84  frame_pos_ = frame_pos;
85  header_body_size_ +=
86  static_cast<hsize>(Item_Header_Size + 1 + sizeof(bsize));
87  }
88  void SetIndex(uint32_t index) {
89  index_ = index;
90  header_body_size_ +=
91  static_cast<hsize>(Item_Header_Size + 1 + sizeof(uint32_t));
92  }
93  void SetTimeStamp(double time_stamp) {
94  time_stamp_ = time_stamp;
95  header_body_size_ +=
96  static_cast<hsize>(Item_Header_Size + 1 + sizeof(double));
97  }
98  void SetMsgSize(bsize msg_size) {
99  msg_size_ = msg_size;
100  header_body_size_ +=
101  static_cast<hsize>(Item_Header_Size + 1 + sizeof(bsize));
102  }
103 
104  private:
105  template <typename T, size_t S>
106  char *SerializeBasicType(const T *value, char *buf, size_t size) {
107  if (!buf || size < S) {
108  return nullptr;
109  }
110  char *res = buf;
111  memcpy(res, value, S);
112  res[S] = '\n';
113  res += S + 1;
114  return res;
115  }
116 
117  template <typename T, size_t S>
118  bool DiserializeBasicType(T *value, const char *buf) {
119  if (!buf) {
120  return false;
121  }
122  char temp[S] = {0};
123  memcpy(temp, buf, S);
124  *value = *(reinterpret_cast<T *>(temp));
125  return true;
126  }
127 
128  char *SerializeHeaderFlag(char *buf, size_t size);
129  char *SerializeHeaderSize(char *buf, size_t size);
130 
131  private:
135  HeaderItem<Msg_Size, bsize> msg_size_;
136  HeaderItem<Msg_Frames, uint32_t> total_frames_;
137  HeaderItem<Frame_Size, bsize> frame_size_;
138  HeaderItem<Frame_Pos, bsize> frame_pos_;
140  HeaderItem<Time_Stamp, double> time_stamp_;
141  hsize header_body_size_ = 0;
142  HeaderItemBase *header_item[Header_Tail] = {
143  &header_ver_, &msg_name_, &msg_id_, &msg_size_, &total_frames_,
144  &frame_size_, &frame_pos_, &index_, &time_stamp_,
145  };
146 };
147 
148 } // namespace bridge
149 } // namespace apollo
void SetTotalFrames(uint32_t total_frames)
Definition: bridge_header.h:73
void SetMsgName(const std::string &msg_name)
Definition: bridge_header.h:63
Definition: bridge_header_item.h:40
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
bsize GetFramePos() const
Definition: bridge_header.h:56
std::string GetMsgName() const
Definition: bridge_header.h:49
bsize GetMsgSize() const
Definition: bridge_header.h:54
void SetMsgSize(bsize msg_size)
Definition: bridge_header.h:98
Definition: bridge_header.h:33
uint32_t GetIndex() const
Definition: bridge_header.h:52
void SetFramePos(bsize frame_pos)
Definition: bridge_header.h:83
uint32_t bsize
Definition: bridge_header_item.h:24
uint32_t GetMsgID() const
Definition: bridge_header.h:50
bool IsAvailable(const char *buf)
T value_
Definition: bridge_header_item.h:111
constexpr char BRIDGE_HEADER_FLAG[]
Definition: bridge_header.h:29
bsize GetHeaderBodySize() const
Definition: bridge_header.h:48
void SetIndex(uint32_t index)
Definition: bridge_header.h:88
uint32_t GetTotalFrames() const
Definition: bridge_header.h:51
void SetFrameSize(bsize frame_size)
Definition: bridge_header.h:78
constexpr size_t HEADER_FLAG_SIZE
Definition: bridge_header.h:30
Definition: bridge_header_item.h:37
void SetMsgID(uint32_t msg_id)
Definition: bridge_header.h:68
apollo::cyber::base::std value
bool Diserialize(const char *buf, size_t buf_size)
HType
Definition: bridge_header_item.h:26
void SetHeaderVer(uint32_t header_ver)
Definition: bridge_header.h:58
void SetTimeStamp(double time_stamp)
Definition: bridge_header.h:93
hsize GetHeaderSize() const
Definition: bridge_header.h:44
uint32_t hsize
Definition: bridge_header.h:27
uint32_t GetHeaderVer() const
Definition: bridge_header.h:43
bsize GetFrameSize() const
Definition: bridge_header.h:55
constexpr size_t Item_Header_Size
Definition: bridge_header.h:31
bool Serialize(char *buf, size_t size)
double GetTimeStamp() const
Definition: bridge_header.h:53