Apollo 10.0
自动驾驶开放平台
record_player_factory.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 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 *****************************************************************************/
17
18namespace apollo {
19namespace dreamview {
20using RLock = boost::shared_lock<boost::shared_mutex>;
21using WLock = boost::unique_lock<boost::shared_mutex>;
22
23RecordPlayerFactory::RecordPlayerFactory() {
24 // unified init cyber for all player related node.
25 apollo::cyber::Init("record_player_factory");
26 current_record_ = "";
27}
28
30 for (auto iter = s_record_player_map_.begin();
31 iter != s_record_player_map_.end();) {
32 iter->second = nullptr;
33 s_record_player_map_.erase(iter++);
34 }
35 current_record_ = "";
36}
37
39
41 const std::string& record_name) {
42 auto iter = s_record_player_map_.find(record_name);
43 if (iter == s_record_player_map_.end()) {
44 AERROR << "Failed to get " << record_name << " related player pointer.";
45 return;
46 }
47 iter->second = nullptr;
48 s_record_player_map_.erase(record_name);
49 {
50 WLock wlock(mutex_);
51 auto vec_iter =
52 std::find(loaded_record_.begin(), loaded_record_.end(), record_name);
53 if (vec_iter != loaded_record_.end()) {
54 loaded_record_.erase(vec_iter);
55 }
56 }
57 return;
58}
59
61 const std::string& record_name, const std::string& record_file_path) {
63 play_param.is_play_all_channels = true;
64 // use play_param struct default value
65 // loop playback is not allowed
66 play_param.is_loop_playback = false;
67 std::vector<std::string> opt_black_channels;
68 // When using DV play recorder, need to block some real-time channels
69 // to avoid conflicts with real-time DV information.
70 opt_black_channels.push_back("/apollo/hmi/status");
71 opt_black_channels.push_back("/apollo/monitor/system_status");
72 opt_black_channels.push_back("/apollo/cyber/record_info");
73 play_param.black_channels.insert(opt_black_channels.begin(),
74 opt_black_channels.end());
75 // play_param.play_rate = 1.0f;
76 // play_param.begin_time_ns = 0;
77 // play_param.end_time_ns = std::numeric_limits<uint64_t>::max();
78 // play_param.start_time_s = 0;
79 // play_param.delay_time_s = 0;
80 // preload time and delay time is no used when nohup player process
81 play_param.preload_time_s = 1;
82 play_param.record_id = record_name;
83 play_param.files_to_play.insert(record_file_path);
84 const std::string node_name = "record_player_factory_" + record_name;
85 s_record_player_map_[record_name] = std::unique_ptr<Player>(
86 new Player(play_param, apollo::cyber::CreateNode(node_name), true));
87 s_record_player_map_[record_name]->Init();
88 {
89 WLock wlock(mutex_);
90 loaded_record_.push_back(record_name);
91 }
92 return true;
93}
94
95void RecordPlayerFactory::GetAllRecords(std::vector<std::string>* records) {
96 for (auto iter = s_record_player_map_.begin();
97 iter != s_record_player_map_.end(); iter++) {
98 records->push_back(iter->first);
99 }
100}
101void RecordPlayerFactory::SetCurrentRecord(const std::string& record_name) {
102 current_record_ = record_name;
103}
104
105std::string RecordPlayerFactory::GetCurrentRecord() { return current_record_; }
106
107Player* RecordPlayerFactory::GetRecordPlayer(const std::string& record_name) {
108 auto iter = s_record_player_map_.find(record_name);
109 if (iter == s_record_player_map_.end()) {
110 AERROR << "Failed to get " << record_name << " related player pointer.";
111 return nullptr;
112 }
113 return iter->second.get();
114}
115
117 {
118 RLock rlock(mutex_);
119 return loaded_record_.size();
120 }
121}
122
124 return GetLoadedRecordNum() < PRELOAD_RECORD_NUM;
125}
126
128 return GetLoadedRecordNum() < LOADED_RECORD_NUM;
129}
130
132 const std::string& record_name) {
133 WLock wlock(mutex_);
134 auto iter =
135 std::find(loaded_record_.begin(), loaded_record_.end(), record_name);
136 if (iter == loaded_record_.end()) {
137 AERROR << "Current record is not loaded,invalid operation!";
138 return;
139 }
140 loaded_record_.erase(iter);
141 loaded_record_.push_back(record_name);
142 return;
143}
144
145bool RecordPlayerFactory::RemoveLRURecord(std::string* remove_record_id) {
146 if (EnableContinueLoad()) {
147 AERROR << "No need to remove record.";
148 return false;
149 }
150 {
151 RLock rlock(mutex_);
152 auto iter = loaded_record_.begin();
153 *remove_record_id = *loaded_record_.begin();
154 while (iter != loaded_record_.end()) {
155 // Can not remove selected record
156 if (*iter != current_record_) {
157 *remove_record_id = *iter;
158 break;
159 }
160 iter++;
161 }
162 }
163 UnregisterRecordPlayer(*remove_record_id);
164 return true;
165}
166
167} // namespace dreamview
168} // namespace apollo
Player * GetRecordPlayer(const std::string &record_name)
void SetCurrentRecord(const std::string &record_name)
bool RemoveLRURecord(std::string *remove_record_id)
void GetAllRecords(std::vector< std::string > *records)
void IncreaseRecordPriority(const std::string &record_name)
bool RegisterRecordPlayer(const std::string &record_namem, const std::string &record_file_path)
void UnregisterRecordPlayer(const std::string &record_name)
#define AERROR
Definition log.h:44
bool Init(const char *binary_name, const std::string &dag_info)
Definition init.cc:98
std::unique_ptr< Node > CreateNode(const std::string &node_name, const std::string &name_space)
Definition cyber.cc:33
boost::shared_lock< boost::shared_mutex > RLock
boost::unique_lock< boost::shared_mutex > WLock
class register implement
Definition arena_queue.h:37
std::set< std::string > black_channels
Definition play_param.h:41
std::set< std::string > files_to_play
Definition play_param.h:39