Ejemplo n.º 1
0
	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();
		}
	}
Ejemplo n.º 2
0
	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();
		}
	}
Ejemplo n.º 3
0
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() );
}