diff --git a/lib/Scheduler.js b/lib/Scheduler.js index 301e6d2..f2b38c7 100644 --- a/lib/Scheduler.js +++ b/lib/Scheduler.js @@ -75,14 +75,10 @@ Scheduler.prototype.update = function() { if (minutesThisStep < step.rampMinutes) { // Ramp - var previousTemperature = ( - self.status.stepIndex > 0 - ? self.schedule[self.status.stepIndex - 1].temperature - : self.settings.minTemperature - ); + var startTemperature = step.rampStartTemperature; desiredTemperature = ( - previousTemperature + - (step.temperature - previousTemperature) * (minutesThisStep / step.rampMinutes) + startTemperature + + (step.temperature - startTemperature) * (minutesThisStep / step.rampMinutes) ); } else if (minutesThisStep < step.rampMinutes + step.soakMinutes) { // Soak @@ -150,11 +146,11 @@ Scheduler.prototype.validateSchedule = function(schedule) { throw new Error('Schedule must have at least one step'); } - schedule.forEach(function(step) { + schedule.forEach(function(step, index) { if ( typeof step.temperature !== 'number' || - schedule.temperature < self.settings.minTemperature || - schedule.temperature > self.settings.maxTemperature + step.temperature < self.settings.minTemperature || + step.temperature > self.settings.maxTemperature ) { throw new Error(util.format( 'Step temperature must be a number between %d and %d', @@ -189,6 +185,30 @@ Scheduler.prototype.validateSchedule = function(schedule) { if (step.rampMinutes === 0 && step.soakMinutes === 0) { throw new Error('Step ramp and soak times cannot both be zero'); } + + if (step.rampMinutes > 0) { + if (typeof step.rampStartTemperature === 'undefined') { + if (index === 0) { + step.rampStartTemperature = self.settings.minTemperature; + } else { + step.rampStartTemperature = schedule[index - 1].temperature; + } + } + + if ( + typeof step.rampStartTemperature !== 'number' || + step.rampStartTemperature < self.settings.minTemperature || + step.rampStartTemperature > self.settings.maxTemperature + ) { + throw new Error(util.format( + 'Step temperature must be a number between %d and %d', + self.settings.minTemperature, + self.settings.maxTemperature + )); + } + } else { + delete step.rampStartTemperature; + } }); return schedule;