Apollo 10.0
自动驾驶开放平台
apollo::drivers::canbus::MessageManager< SensorType > 模板类 参考

message manager manages protocols. 更多...

#include <message_manager.h>

apollo::drivers::canbus::MessageManager< SensorType > 的协作图:

Public 成员函数

 MessageManager ()
 
virtual ~MessageManager ()=default
 
virtual void Parse (const uint32_t message_id, const uint8_t *data, int32_t length)
 parse data and store parsed info in receive protocol data
 
virtual void ParseSender (const uint32_t message_id, const uint8_t *data, int32_t length)
 parse data and store parsed info in send protocol data
 
void ClearSensorData ()
 
void ClearSensorRecvData ()
 
void ClearSensorCheckRecvData ()
 
void ClearSensorSenderData ()
 
void ClearSensorCheckSenderData ()
 
std::condition_variable * GetMutableCVar ()
 
ProtocolData< SensorType > * GetMutableProtocolDataById (const uint32_t message_id)
 get mutable protocol data by message id
 
common::ErrorCode GetSensorData (SensorType *const sensor_data)
 get chassis detail.
 
common::ErrorCode GetSensorRecvData (SensorType *const sensor_recv_data)
 get chassis recv detail.
 
common::ErrorCode GetSensorCheckRecvData (SensorType *const sensor_recv_data)
 get chassis recv detail.
 
common::ErrorCode GetSensorSenderData (SensorType *const sensor_sender_data)
 get chassis sender detail.
 
common::ErrorCode GetSensorCheckSenderData (SensorType *const sensor_sender_data)
 get chassis sender detail.
 
void ResetSendMessages ()
 

Protected 成员函数

template<class T , bool need_check>
void AddRecvProtocolData ()
 
template<class T , bool need_check>
void AddSendProtocolData ()
 

Protected 属性

std::vector< std::unique_ptr< ProtocolData< SensorType > > > send_protocol_data_
 
std::vector< std::unique_ptr< ProtocolData< SensorType > > > recv_protocol_data_
 
std::unordered_map< uint32_t, ProtocolData< SensorType > * > protocol_data_map_
 
std::unordered_map< uint32_t, ProtocolData< SensorType > * > recv_protocol_data_map_
 
std::unordered_map< uint32_t, ProtocolData< SensorType > * > sender_protocol_data_map_
 
std::unordered_map< uint32_t, CheckIdArgcheck_ids_
 
std::set< uint32_t > received_ids_
 
std::mutex sensor_data_mutex_
 
SensorType sensor_data_
 
std::mutex sensor_data_recv_mutex_
 
SensorType sensor_recv_data_
 
std::mutex sensor_data_check_recv_mutex_
 
SensorType sensor_check_recv_data_
 
std::mutex sensor_data_sender_mutex_
 
SensorType sensor_sender_data_
 
std::mutex sensor_data_check_sender_mutex_
 
SensorType sensor_check_sender_data_
 
bool is_received_on_time_ = false
 
std::condition_variable cvar_
 

详细描述

template<typename SensorType>
class apollo::drivers::canbus::MessageManager< SensorType >

message manager manages protocols.

It supports parse and can get protocol data by message id.

在文件 message_manager.h69 行定义.

构造及析构函数说明

◆ MessageManager()

template<typename SensorType >
apollo::drivers::canbus::MessageManager< SensorType >::MessageManager ( )
inline

在文件 message_manager.h74 行定义.

74{}

◆ ~MessageManager()

template<typename SensorType >
virtual apollo::drivers::canbus::MessageManager< SensorType >::~MessageManager ( )
virtualdefault

成员函数说明

◆ AddRecvProtocolData()

template<typename SensorType >
template<class T , bool need_check>
void MessageManager::AddRecvProtocolData ( )
protected

在文件 message_manager.h191 行定义.

191 {
192 recv_protocol_data_.emplace_back(new T());
193 auto *dt = recv_protocol_data_.back().get();
194 if (dt == nullptr) {
195 return;
196 }
197 recv_protocol_data_map_[T::ID] = dt;
198 protocol_data_map_[T::ID] = dt;
199 if (need_check) {
200 check_ids_[T::ID].period = dt->GetPeriod();
201 check_ids_[T::ID].real_period = 0;
202 check_ids_[T::ID].last_time = 0;
203 check_ids_[T::ID].error_count = 0;
204 }
205}
std::unordered_map< uint32_t, ProtocolData< SensorType > * > protocol_data_map_
std::unordered_map< uint32_t, ProtocolData< SensorType > * > recv_protocol_data_map_
std::vector< std::unique_ptr< ProtocolData< SensorType > > > recv_protocol_data_
std::unordered_map< uint32_t, CheckIdArg > check_ids_

◆ AddSendProtocolData()

template<typename SensorType >
template<class T , bool need_check>
void MessageManager::AddSendProtocolData ( )
protected

在文件 message_manager.h209 行定义.

209 {
210 send_protocol_data_.emplace_back(new T());
211 auto *dt = send_protocol_data_.back().get();
212 if (dt == nullptr) {
213 return;
214 }
215 sender_protocol_data_map_[T::ID] = dt;
216 protocol_data_map_[T::ID] = dt;
217 if (need_check) {
218 check_ids_[T::ID].period = dt->GetPeriod();
219 check_ids_[T::ID].real_period = 0;
220 check_ids_[T::ID].last_time = 0;
221 check_ids_[T::ID].error_count = 0;
222 }
223}
std::unordered_map< uint32_t, ProtocolData< SensorType > * > sender_protocol_data_map_
std::vector< std::unique_ptr< ProtocolData< SensorType > > > send_protocol_data_

◆ ClearSensorCheckRecvData()

template<typename SensorType >
void MessageManager::ClearSensorCheckRecvData ( )

在文件 message_manager.h340 行定义.

340 {
341 std::lock_guard<std::mutex> lock(sensor_data_check_recv_mutex_);
343}

◆ ClearSensorCheckSenderData()

template<typename SensorType >
void MessageManager::ClearSensorCheckSenderData ( )

在文件 message_manager.h352 行定义.

352 {
353 std::lock_guard<std::mutex> lock(sensor_data_check_sender_mutex_);
355}

◆ ClearSensorData()

template<typename SensorType >
void MessageManager::ClearSensorData ( )

在文件 message_manager.h328 行定义.

328 {
329 std::lock_guard<std::mutex> lock(sensor_data_mutex_);
330 sensor_data_.Clear();
331}

◆ ClearSensorRecvData()

template<typename SensorType >
void MessageManager::ClearSensorRecvData ( )

在文件 message_manager.h334 行定义.

334 {
335 std::lock_guard<std::mutex> lock(sensor_data_recv_mutex_);
336 sensor_recv_data_.Clear();
337}

◆ ClearSensorSenderData()

template<typename SensorType >
void MessageManager::ClearSensorSenderData ( )

在文件 message_manager.h346 行定义.

346 {
347 std::lock_guard<std::mutex> lock(sensor_data_sender_mutex_);
348 sensor_sender_data_.Clear();
349}

◆ GetMutableCVar()

template<typename SensorType >
std::condition_variable * MessageManager::GetMutableCVar ( )

在文件 message_manager.h358 行定义.

358 {
359 return &cvar_;
360}

◆ GetMutableProtocolDataById()

template<typename SensorType >
ProtocolData< SensorType > * MessageManager::GetMutableProtocolDataById ( const uint32_t  message_id)

get mutable protocol data by message id

参数
message_idthe id of the message
返回
a pointer to the protocol data

在文件 message_manager.h227 行定义.

228 {
229 ADEBUG << "get protocol data message_id is:" << Byte::byte_to_hex(message_id);
230 if (protocol_data_map_.find(message_id) == protocol_data_map_.end()) {
231 ADEBUG << "Unable to get protocol data because of invalid message_id:"
232 << Byte::byte_to_hex(message_id);
233 return nullptr;
234 }
235 return protocol_data_map_[message_id];
236}
static std::string byte_to_hex(const uint8_t value)
Transform an integer with the size of one byte to its hexadecimal represented by a string.
Definition byte.cc:42
#define ADEBUG
Definition log.h:41

◆ GetSensorCheckRecvData()

template<typename SensorType >
ErrorCode MessageManager::GetSensorCheckRecvData ( SensorType *const  sensor_recv_data)

get chassis recv detail.

used lock_guard in this function to avoid concurrent read/write issue.

参数
chassis_detailchassis_detail to be filled.

在文件 message_manager.h387 行定义.

388 {
389 if (sensor_recv_data == nullptr) {
390 AERROR << "Failed to get receiver data due to nullptr.";
391 return ErrorCode::CANBUS_ERROR;
392 }
393 std::lock_guard<std::mutex> lock(sensor_data_check_recv_mutex_);
394 sensor_recv_data->CopyFrom(sensor_check_recv_data_);
395 return ErrorCode::OK;
396}
#define AERROR
Definition log.h:44

◆ GetSensorCheckSenderData()

template<typename SensorType >
ErrorCode MessageManager::GetSensorCheckSenderData ( SensorType *const  sensor_sender_data)

get chassis sender detail.

used lock_guard in this function to avoid concurrent read/write issue.

参数
chassis_detailchassis_detail to be filled.

在文件 message_manager.h411 行定义.

412 {
413 if (sensor_sender_data == nullptr) {
414 AERROR << "Failed to get sender data due to nullptr.";
415 return ErrorCode::CANBUS_ERROR;
416 }
417 std::lock_guard<std::mutex> lock(sensor_data_check_sender_mutex_);
418 sensor_sender_data->CopyFrom(sensor_check_sender_data_);
419 return ErrorCode::OK;
420}

◆ GetSensorData()

template<typename SensorType >
ErrorCode MessageManager::GetSensorData ( SensorType *const  sensor_data)

get chassis detail.

used lock_guard in this function to avoid concurrent read/write issue.

参数
chassis_detailchassis_detail to be filled.

在文件 message_manager.h363 行定义.

364 {
365 if (sensor_data == nullptr) {
366 AERROR << "Failed to get sensor_data due to nullptr.";
367 return ErrorCode::CANBUS_ERROR;
368 }
369 std::lock_guard<std::mutex> lock(sensor_data_mutex_);
370 sensor_data->CopyFrom(sensor_data_);
371 return ErrorCode::OK;
372}

◆ GetSensorRecvData()

template<typename SensorType >
ErrorCode MessageManager::GetSensorRecvData ( SensorType *const  sensor_recv_data)

get chassis recv detail.

used lock_guard in this function to avoid concurrent read/write issue.

参数
chassis_detailchassis_detail to be filled.

在文件 message_manager.h375 行定义.

376 {
377 if (sensor_recv_data == nullptr) {
378 AERROR << "Failed to get receiver data due to nullptr.";
379 return ErrorCode::CANBUS_ERROR;
380 }
381 std::lock_guard<std::mutex> lock(sensor_data_recv_mutex_);
382 sensor_recv_data->CopyFrom(sensor_recv_data_);
383 return ErrorCode::OK;
384}

◆ GetSensorSenderData()

template<typename SensorType >
ErrorCode MessageManager::GetSensorSenderData ( SensorType *const  sensor_sender_data)

get chassis sender detail.

used lock_guard in this function to avoid concurrent read/write issue.

参数
chassis_detailchassis_detail to be filled.

在文件 message_manager.h399 行定义.

400 {
401 if (sensor_sender_data == nullptr) {
402 AERROR << "Failed to get sender data due to nullptr.";
403 return ErrorCode::CANBUS_ERROR;
404 }
405 std::lock_guard<std::mutex> lock(sensor_data_sender_mutex_);
406 sensor_sender_data->CopyFrom(sensor_sender_data_);
407 return ErrorCode::OK;
408}

◆ Parse()

template<typename SensorType >
void MessageManager::Parse ( const uint32_t  message_id,
const uint8_t *  data,
int32_t  length 
)
virtual

parse data and store parsed info in receive protocol data

参数
message_idthe id of the message
dataa pointer to the data array to be parsed
lengththe length of data array

apollo::drivers::conti_radar::ContiRadarMessageManager , 以及 apollo::drivers::nano_radar::NanoRadarMessageManager 重载.

在文件 message_manager.h239 行定义.

240 {
241 ProtocolData<SensorType> *protocol_data =
242 GetMutableProtocolDataById(message_id);
243 if (protocol_data == nullptr) {
244 return;
245 }
246 // parse all
247 {
248 std::lock_guard<std::mutex> lock(sensor_data_mutex_);
249 protocol_data->Parse(data, length, &sensor_data_);
250 }
251
252 // parse revceiver
253 {
254 std::lock_guard<std::mutex> lock(sensor_data_recv_mutex_);
255 protocol_data->Parse(data, length, &sensor_recv_data_);
256 }
257 {
258 std::lock_guard<std::mutex> lock(sensor_data_check_recv_mutex_);
259 protocol_data->Parse(data, length, &sensor_check_recv_data_);
260 }
261 if (recv_protocol_data_map_.find(message_id) ==
263 AERROR << "Failed to get recv data, " << "message is " << message_id;
264 }
265
266 received_ids_.insert(message_id);
267 // check if need to check period
268 const auto it = check_ids_.find(message_id);
269 if (it != check_ids_.end()) {
270 const int64_t time = Time::Now().ToNanosecond() / 1e3;
271 it->second.real_period = time - it->second.last_time;
272 // if period 1.5 large than base period, inc error_count
273 const double period_multiplier = 1.5;
274 if (static_cast<double>(it->second.real_period) >
275 (static_cast<double>(it->second.period) * period_multiplier)) {
276 it->second.error_count += 1;
277 } else {
278 it->second.error_count = 0;
279 }
280 it->second.last_time = time;
281 }
282}
uint64_t ToNanosecond() const
convert time to nanosecond.
Definition time.cc:83
static Time Now()
get the current time.
Definition time.cc:57
ProtocolData< SensorType > * GetMutableProtocolDataById(const uint32_t message_id)
get mutable protocol data by message id

◆ ParseSender()

template<typename SensorType >
void MessageManager::ParseSender ( const uint32_t  message_id,
const uint8_t *  data,
int32_t  length 
)
virtual

parse data and store parsed info in send protocol data

参数
message_idthe id of the message
dataa pointer to the data array to be parsed
lengththe length of data array

在文件 message_manager.h285 行定义.

287 {
288 ProtocolData<SensorType> *protocol_data =
289 GetMutableProtocolDataById(message_id);
290 if (protocol_data == nullptr) {
291 return;
292 }
293
294 // parse sender
295 {
296 std::lock_guard<std::mutex> lock(sensor_data_sender_mutex_);
297 protocol_data->Parse(data, length, &sensor_sender_data_);
298 }
299 {
300 std::lock_guard<std::mutex> lock(sensor_data_check_sender_mutex_);
301 protocol_data->Parse(data, length, &sensor_check_sender_data_);
302 }
303 if (sender_protocol_data_map_.find(message_id) ==
305 AERROR << "Failed to get prase sender data, " << "message is "
306 << message_id;
307 }
308
309 received_ids_.insert(message_id);
310 // check if need to check period
311 const auto it = check_ids_.find(message_id);
312 if (it != check_ids_.end()) {
313 const int64_t time = Time::Now().ToNanosecond() / 1e3;
314 it->second.real_period = time - it->second.last_time;
315 // if period 1.5 large than base period, inc error_count
316 const double period_multiplier = 1.5;
317 if (static_cast<double>(it->second.real_period) >
318 (static_cast<double>(it->second.period) * period_multiplier)) {
319 it->second.error_count += 1;
320 } else {
321 it->second.error_count = 0;
322 }
323 it->second.last_time = time;
324 }
325}

◆ ResetSendMessages()

template<typename SensorType >
void MessageManager::ResetSendMessages ( )

在文件 message_manager.h423 行定义.

423 {
424 for (auto &protocol_data : send_protocol_data_) {
425 if (protocol_data == nullptr) {
426 AERROR << "Invalid protocol data.";
427 } else {
428 protocol_data->Reset();
429 }
430 }
431}

类成员变量说明

◆ check_ids_

template<typename SensorType >
std::unordered_map<uint32_t, CheckIdArg> apollo::drivers::canbus::MessageManager< SensorType >::check_ids_
protected

在文件 message_manager.h171 行定义.

◆ cvar_

template<typename SensorType >
std::condition_variable apollo::drivers::canbus::MessageManager< SensorType >::cvar_
protected

在文件 message_manager.h186 行定义.

◆ is_received_on_time_

template<typename SensorType >
bool apollo::drivers::canbus::MessageManager< SensorType >::is_received_on_time_ = false
protected

在文件 message_manager.h184 行定义.

◆ protocol_data_map_

template<typename SensorType >
std::unordered_map<uint32_t, ProtocolData<SensorType> *> apollo::drivers::canbus::MessageManager< SensorType >::protocol_data_map_
protected

在文件 message_manager.h165 行定义.

◆ received_ids_

template<typename SensorType >
std::set<uint32_t> apollo::drivers::canbus::MessageManager< SensorType >::received_ids_
protected

在文件 message_manager.h172 行定义.

◆ recv_protocol_data_

template<typename SensorType >
std::vector<std::unique_ptr<ProtocolData<SensorType> > > apollo::drivers::canbus::MessageManager< SensorType >::recv_protocol_data_
protected

在文件 message_manager.h163 行定义.

◆ recv_protocol_data_map_

template<typename SensorType >
std::unordered_map<uint32_t, ProtocolData<SensorType> *> apollo::drivers::canbus::MessageManager< SensorType >::recv_protocol_data_map_
protected

在文件 message_manager.h167 行定义.

◆ send_protocol_data_

template<typename SensorType >
std::vector<std::unique_ptr<ProtocolData<SensorType> > > apollo::drivers::canbus::MessageManager< SensorType >::send_protocol_data_
protected

在文件 message_manager.h162 行定义.

◆ sender_protocol_data_map_

template<typename SensorType >
std::unordered_map<uint32_t, ProtocolData<SensorType> *> apollo::drivers::canbus::MessageManager< SensorType >::sender_protocol_data_map_
protected

在文件 message_manager.h169 行定义.

◆ sensor_check_recv_data_

template<typename SensorType >
SensorType apollo::drivers::canbus::MessageManager< SensorType >::sensor_check_recv_data_
protected

在文件 message_manager.h179 行定义.

◆ sensor_check_sender_data_

template<typename SensorType >
SensorType apollo::drivers::canbus::MessageManager< SensorType >::sensor_check_sender_data_
protected

在文件 message_manager.h183 行定义.

◆ sensor_data_

template<typename SensorType >
SensorType apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_
protected

在文件 message_manager.h175 行定义.

◆ sensor_data_check_recv_mutex_

template<typename SensorType >
std::mutex apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_check_recv_mutex_
protected

在文件 message_manager.h178 行定义.

◆ sensor_data_check_sender_mutex_

template<typename SensorType >
std::mutex apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_check_sender_mutex_
protected

在文件 message_manager.h182 行定义.

◆ sensor_data_mutex_

template<typename SensorType >
std::mutex apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_mutex_
protected

在文件 message_manager.h174 行定义.

◆ sensor_data_recv_mutex_

template<typename SensorType >
std::mutex apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_recv_mutex_
protected

在文件 message_manager.h176 行定义.

◆ sensor_data_sender_mutex_

template<typename SensorType >
std::mutex apollo::drivers::canbus::MessageManager< SensorType >::sensor_data_sender_mutex_
protected

在文件 message_manager.h180 行定义.

◆ sensor_recv_data_

template<typename SensorType >
SensorType apollo::drivers::canbus::MessageManager< SensorType >::sensor_recv_data_
protected

在文件 message_manager.h177 行定义.

◆ sensor_sender_data_

template<typename SensorType >
SensorType apollo::drivers::canbus::MessageManager< SensorType >::sensor_sender_data_
protected

在文件 message_manager.h181 行定义.


该类的文档由以下文件生成: