| 174 | } |
| 175 | |
| 176 | void SidepanelReplay::loadLog(const QByteArray &content) |
| 177 | { |
| 178 | const char* buffer = reinterpret_cast<const char*>(content.data()); |
| 179 | |
| 180 | size_t bt_header_size = flatbuffers::ReadScalar<uint32_t>(buffer); |
| 181 | |
| 182 | flatbuffers::Verifier verifier( reinterpret_cast<const uint8_t*>(buffer+4), |
| 183 | size_t(content.data() -4)); |
| 184 | |
| 185 | bool valid_tree = Serialization::VerifyBehaviorTreeBuffer(verifier); |
| 186 | if( ! valid_tree ) |
| 187 | { |
| 188 | QMessageBox::warning( this, "Flatbuffer verification failed", |
| 189 | "Failed to load this file.\n" |
| 190 | "Its format is not compatible with the current one"); |
| 191 | return; |
| 192 | } |
| 193 | |
| 194 | |
| 195 | auto fb_behavior_tree = Serialization::GetBehaviorTree( &buffer[4] ); |
| 196 | |
| 197 | |
| 198 | auto res_pair = BuildTreeFromFlatbuffers( fb_behavior_tree ); |
| 199 | |
| 200 | _loaded_tree = res_pair.first; |
| 201 | const auto& uid_to_index = res_pair.second; |
| 202 | |
| 203 | for (const auto& tree_node: _loaded_tree.nodes() ) |
| 204 | { |
| 205 | const QString& ID = tree_node.model.registration_ID; |
| 206 | if( BuiltinNodeModels().count( ID ) == 0) |
| 207 | { |
| 208 | emit addNewModel( tree_node.model ); |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | emit loadBehaviorTree( _loaded_tree, "BehaviorTree" ); |
| 213 | |
| 214 | _transitions.clear(); |
| 215 | _transitions.reserve( (content.size() - 4 - bt_header_size) / 12 ); |
| 216 | |
| 217 | for (size_t offset = 4+bt_header_size; offset < content.size(); offset += 12) |
| 218 | { |
| 219 | Transition transition; |
| 220 | const double t_sec = flatbuffers::ReadScalar<uint32_t>( &buffer[offset] ); |
| 221 | const double t_usec = flatbuffers::ReadScalar<uint32_t>( &buffer[offset+4] ); |
| 222 | double timestamp = t_sec + t_usec* 0.000001; |
| 223 | transition.timestamp = timestamp; |
| 224 | const uint16_t uid = flatbuffers::ReadScalar<uint16_t>(&buffer[offset+8]); |
| 225 | transition.index = uid_to_index.at(uid); |
| 226 | transition.prev_status = convert(flatbuffers::ReadScalar<Serialization::NodeStatus>(&buffer[offset+10] )); |
| 227 | transition.status = convert(flatbuffers::ReadScalar<Serialization::NodeStatus>(&buffer[offset+11] )); |
| 228 | |
| 229 | _transitions.push_back(transition); |
| 230 | } |
| 231 | |
| 232 | _timepoint.clear(); |
| 233 | _prev_row = -1; |