Move burn state log to app controller

This change required re-architecting the way we store the burn state.
This commit is contained in:
Juan Cruz Viotti 2016-01-22 12:30:42 -04:00
parent 9026e6ce2d
commit 84d87e5a10
4 changed files with 39 additions and 150 deletions

View File

@ -76,7 +76,12 @@ app.controller('AppController', function($q, $log, DriveScannerService, Selectio
this.restart = function(options) {
$log.debug('Restarting');
this.selection.clear(options);
this.writer.reset();
self.state = {
progress: 0,
percentage: 0
};
this.scanner.start(2000).on('scan', function(drives) {
// Notice we only autoselect the drive if there is an image,
@ -154,7 +159,10 @@ app.controller('AppController', function($q, $log, DriveScannerService, Selectio
self.scanner.stop();
$log.debug(`Burning ${image} to ${drive.device}`);
return self.writer.burn(image, drive).then(function() {
return self.writer.burn(image, drive, function(state) {
self.state = state;
$log.debug(`Progress: ${self.state.progress}% at ${self.state.speed} MB/s`);
}).then(function() {
$log.debug('Done!');
}).catch(dialog.showError);
};

View File

@ -31,75 +31,10 @@ if (window.mocha) {
const imageWriter = angular.module('ResinEtcher.image-writer', []);
imageWriter.service('ImageWriterService', function($q, $timeout, $log) {
imageWriter.service('ImageWriterService', function($q, $timeout) {
let self = this;
let burning = false;
/*
* @summary Progress state
* @type Object
* @public
*/
this.state = {
/**
* @summary Progress percentage
* @type Number
* @public
*/
progress: 0,
/**
* @summary Progress speed
* @type Number
* @public
*/
speed: 0
};
/**
* @summary Set progress state
* @function
* @private
*
* @param {Object} state - progress state
* @param {Number} state.percentage - progress percentage
*
* @example
* ImageWriterService.setProgressState({
* percentage: 50
* });
*/
this.setProgressState = function(state) {
// Safely bring the state to the world of Angular
$timeout(function() {
self.state.progress = Math.floor(state.percentage);
// Transform bytes to megabytes preserving only two decimal places
self.state.speed = Math.floor(state.speed / 1e+6 * 100) / 100 || 0;
$log.debug(`Progress: ${self.state.progress}% at ${self.state.speed} MB/s`);
});
};
/**
* @summary Reset progress state
* @function
* @public
*
* @example
* ImageWriterService.reset();
*/
this.reset = function() {
self.setProgressState({
percentage: 0,
speed: 0
});
};
/**
* @summary Check if currently burning
* @function
@ -121,6 +56,9 @@ imageWriter.service('ImageWriterService', function($q, $timeout, $log) {
* @function
* @private
*
* @description
* This function is extracted for testing purposes.
*
* @param {Boolean} status - burning status
*
* @example
@ -175,7 +113,7 @@ imageWriter.service('ImageWriterService', function($q, $timeout, $log) {
* console.log('Write completed!');
* });
*/
this.burn = function(image, drive) {
this.burn = function(image, drive, onProgress) {
// Avoid writing more than once
if (self.isBurning()) {
@ -184,7 +122,21 @@ imageWriter.service('ImageWriterService', function($q, $timeout, $log) {
self.setBurning(true);
return self.performWrite(image, drive, self.setProgressState).finally(function() {
return self.performWrite(image, drive, function(state) {
// Safely bring the state to the world of Angular
$timeout(function() {
return onProgress({
progress: Math.floor(state.percentage),
// Transform bytes to megabytes preserving only two decimal places
speed: Math.floor(state.speed / 1e+6 * 100) / 100 || 0
});
});
}).finally(function() {
self.setBurning(false);
});
};

View File

@ -20,7 +20,7 @@
<body ng-app="ResinEtcher" ng-controller="AppController as app" style="display: none">
<div class="content row middle-xs space-horizontal-large">
<div class="col-xs">
<div class="row around-xs space-bottom-huge" ng-hide="app.writer.state.progress == 100 && !app.writer.isBurning()">
<div class="row around-xs space-bottom-huge" ng-hide="app.state.progress == 100 && !app.writer.isBurning()">
<div class="col-xs">
<div class="box text-center">
<hero-icon path="images/image.svg" label="SELECT IMAGE"></hero-icon>
@ -78,23 +78,23 @@
<hero-badge class="block space-vertical-medium" ng-disabled="!app.selection.hasImage() || !app.selection.hasDrive()">3</hero-badge>
<div class="space-vertical-large">
<hero-progress-button percentage="{{ app.writer.state.progress }}" active="{{ app.writer.isBurning() }}"
<hero-progress-button percentage="{{ app.state.progress }}" active="{{ app.writer.isBurning() }}"
ng-click="app.burn(app.selection.getImage(), app.selection.getDrive())"
ng-disabled="!app.selection.hasImage() || !app.selection.hasDrive()">
<span ng-show="app.writer.state.progress == 100 && app.writer.isBurning()">Finishing...</span>
<span ng-show="app.writer.state.progress == 0 && !app.writer.isBurning()">Burn!</span>
<span ng-show="app.writer.state.progress == 0 && app.writer.isBurning() && !app.writer.state.speed">Starting...</span>
<span ng-show="app.writer.state.speed && app.writer.state.progress != 100"
ng-bind="app.writer.state.progress + '% '"></span>
<span ng-show="app.state.progress == 100 && app.writer.isBurning()">Finishing...</span>
<span ng-show="app.state.progress == 0 && !app.writer.isBurning()">Burn!</span>
<span ng-show="app.state.progress == 0 && app.writer.isBurning() && !app.state.speed">Starting...</span>
<span ng-show="app.state.speed && app.state.progress != 100"
ng-bind="app.state.progress + '% '"></span>
</hero-progress-button>
<p class="step-footer" ng-bind="app.writer.state.speed.toFixed(2) + ' MB/s'" ng-show="app.writer.state.speed && app.writer.state.progress != 100"></p>
<p class="step-footer" ng-bind="app.state.speed.toFixed(2) + ' MB/s'" ng-show="app.state.speed && app.state.progress != 100"></p>
</div>
</div>
</div>
</div>
<div class="row around-xs space-bottom-huge" ng-show="app.writer.state.progress == 100 && !app.writer.isBurning()">
<div class="row around-xs space-bottom-huge" ng-show="app.state.progress == 100 && !app.writer.isBurning()">
<div class="col-xs">
<div class="box text-center">
<h3><hero-tick type="success" class="space-right-tiny"></hero-tick> Burn Complete!</h3>

View File

@ -23,14 +23,6 @@ describe('Browser: ImageWriter', function() {
ImageWriterService = _ImageWriterService_;
}));
it('should set progress to zero by default', function() {
m.chai.expect(ImageWriterService.state.progress).to.equal(0);
});
it('should set speed to zero by default', function() {
m.chai.expect(ImageWriterService.state.speed).to.equal(0);
});
describe('.isBurning()', function() {
it('should return false by default', function() {
@ -66,69 +58,6 @@ describe('Browser: ImageWriter', function() {
});
describe('.setProgressState()', function() {
it('should be able to set the progress', function() {
ImageWriterService.setProgressState({
percentage: 50,
speed: 949624
});
$timeout.flush();
m.chai.expect(ImageWriterService.state.progress).to.equal(50);
m.chai.expect(ImageWriterService.state.speed).to.equal(0.94);
});
it('should floor the percentage', function() {
ImageWriterService.setProgressState({
percentage: 49.9999
});
$timeout.flush();
m.chai.expect(ImageWriterService.state.progress).to.equal(49);
});
it('should assume speed zero if no speed', function() {
ImageWriterService.setProgressState({
percentage: 25
});
$timeout.flush();
m.chai.expect(ImageWriterService.state.speed).to.equal(0);
});
});
describe('.reset()', function() {
it('should reset progress percentage to 0', function() {
ImageWriterService.setProgressState({
percentage: 50,
speed: 949624
});
$timeout.flush();
m.chai.expect(ImageWriterService.state.progress).to.equal(50);
ImageWriterService.reset();
$timeout.flush();
m.chai.expect(ImageWriterService.state.progress).to.equal(0);
});
it('should reset speed to 0', function() {
ImageWriterService.setProgressState({
percentage: 50,
speed: 949624
});
$timeout.flush();
m.chai.expect(ImageWriterService.state.speed).to.equal(0.94);
ImageWriterService.reset();
$timeout.flush();
m.chai.expect(ImageWriterService.state.speed).to.equal(0);
});
});
describe('.burn()', function() {
describe('given a succesful write', function() {