Source: model.js

/**
 * @module model
 */ 

var daiad = require('./index')

daiad.model || (daiad.model = {});

/**
 * @class Measurement
 */ 
function Measurement(id, timestamp, value) {
  if (!(timestamp instanceof Date)) {
    throw new Error('Expected a instance of Date as timestamp');
  }
  this.id = parseInt(id);
  this.timestamp = timestamp;
  this.value = (value == null)? null : parseFloat(value);
  return this;
}

Measurement.prototype.getValue = function(precision) {
  return this.value.toFixed(precision || 2) +
    ' (' + this.constructor.value.unit.toString() + ')';
}

var value_getter = function (m) {return m.value};

$.extend(Measurement, {
  
  //
  // Class attributes
  //

  timestamp: {
    name: 'timestamp',
    title: 'Time',
    unit: 'milliseconds'
  },
  value: {
    name: 'value',
    title: 'Value',
    unit: null
  },
  
  //
  // Class methods
  //

  // Compute the range for a series
  computeRange: function (data) 
  {
    if (!(data && data.length > 0))
      return [-Infinity, +Infinity];
    var miny = Math.min.apply(null, $.map(data, value_getter)), 
      maxy = Math.max.apply(null, $.map(data, value_getter));
    return [miny, maxy];
  },

  // Compute the range [0, M] for a series of positive values
  computePositiveRange: function (data)
  {
    if (!(data && data.length > 0))
      return [.0, +Infinity];
    var maxy = Math.max.apply(null, $.map(data, value_getter));
    
    if (!(maxy > 0))
      console.warn('Expected positive maximum value (' + maxy + ')');
    return [.0, maxy];
  },

  formatLabel: function()
  {
    return this.value.title + ' (' + this.value.unit + ')';
  },

});

// Set default method for getting the range of values (override in "derived" objects)
Measurement.getRange = Measurement.computePositiveRange;

function EnergyMeasurement(id, timestamp, value) {
  Measurement.call(this, id, timestamp, value);
  return this;
}

$.extend(EnergyMeasurement.prototype, Measurement.prototype, {
  // noop
});

$.extend(EnergyMeasurement, Measurement, {
  value: {
    name: 'value',
    title: 'Energy',
    unit: 'kW'
  },
});

//
// Export model
//

daiad.model = module.exports = {
  Measurement: Measurement,
};