void FirmwarePackage::upload( Camera& cam, util::progress::IReportProgress& progress, DeviceTypeDesc overrideDeviceType ) { auto type_pid = overrideDeviceType.product_id ? overrideDeviceType.product_id : cam.product_id(); auto it = device_types_.find( type_pid ); if( it == device_types_.end() ) { throw std::runtime_error( "Device type not found in package" ); } progress.report_group_format( "Upgrade to version %d", version() ); progress.report_group_format( "DeviceType = %s [0x%04X]", it->second.desc.description.c_str(), it->second.desc.product_id ); auto upload_groups = it->second.upload_groups; auto group_progress = util::progress::MapItemProgress( progress, upload_groups.size() ); for( auto upload_group : upload_groups ) { group_progress.report_group( upload_group.name ); if( !check_group_update_required( cam, upload_group ) ) { group_progress.report_step( "Skipping, up to date" ); group_progress.report_item(); continue; } upload_group.port->upload( cam, upload_group.items, group_progress ); group_progress.report_item(); } }
void DevicPortFlash::upload_internal( Camera& cam, const std::vector<UploadItem>& items, util::progress::IReportProgress& progress ) { std::set<uint32_t> erase_requests; for( auto& item : items ) { auto req = calc_erase_requests( item ); erase_requests.insert( req.begin(), req.end() ); } auto erase_progress = util::progress::MapPercentage( progress, 0, 33 ); auto erase_items_progress = util::progress::MapItemProgress( erase_progress, static_cast<int>(erase_requests.size()) ); erase_items_progress.report_step( "Erase Flash" ); for( auto address : erase_requests ) { cam.flash().erase( address, 1 ); erase_items_progress.report_items( 1, "pages/s", 1 ); } auto items_progress = util::progress::MapPercentage( progress, 33, 100 ); auto items_items_progress = util::progress::MapItemProgress( items_progress, static_cast<int>(items.size()) ); for( auto item : items ) { cam.flash().write_verify( item.offset, item.data.data(), static_cast<uint32_t>(item.data.size()), items_items_progress ); items_items_progress.report_item(); } }
void SquashClustering::run( std::vector<MassTree>&& trees ) { // Number of trees we are going to cluster. auto const tree_count = trees.size(); // Init the result object. // LOG_INFO << "Squash Clustering: Initialize"; if( report_initialization ) { report_initialization(); } init_( std::move( trees ) ); // Do a full clustering, until only one is left. for( size_t i = 0; i < tree_count - 1; ++i ) { // LOG_INFO << "Squash Clustering: Step " << (i+1) << " of " << tree_count - 1; if( report_step ) { report_step( i + 1, tree_count - 1 ); } auto const min_pair = min_entry_(); assert( min_pair.first < min_pair.second ); merge_clusters_( min_pair.first, min_pair.second ); } // At the end, we only have one big cluster node. assert( 1 == [&](){ size_t count_active = 0; for( auto const& c : clusters_ ) { if( c.active ) { ++count_active; } } return count_active; }() ); // Furthermore, make sure we have created the right number of mergers and clusters. assert( tree_count + mergers_.size() == clusters_.size() ); }