onstar2mqtt/src/diagnostic.js
2021-06-11 10:15:14 -04:00

79 lines
2.0 KiB
JavaScript

const _ = require('lodash');
const Measurement = require('./measurement');
class Diagnostic {
constructor(diagResponse) {
this.name = diagResponse.name;
const validEle = _.filter(
diagResponse.diagnosticElement,
d => _.has(d, 'value') && _.has(d, 'unit')
);
this.diagnosticElements = _.map(validEle, e => new DiagnosticElement(e));
const converted = _.map(_.filter(this.diagnosticElements, e => e.isConvertible),
e => DiagnosticElement.convert(e));
this.diagnosticElements.push(... converted);
}
hasElements() {
return this.diagnosticElements.length >= 1;
}
toString() {
let elements = '';
_.forEach(this.diagnosticElements, e => elements += ` ${e.toString()}\n`)
return `${this.name}:\n` + elements;
}
}
class DiagnosticElement {
/**
*
* @param {DiagnosticElement} element
*/
static convert(element) {
const {name, unit, value} = element;
const convertedUnit = Measurement.convertUnit(unit);
return new DiagnosticElement({
name: DiagnosticElement.convertName(name, convertedUnit),
unit: convertedUnit,
value: Measurement.convertValue(value, unit)
})
}
static convertName(name, unit) {
return `${name} ${_.replace(_.toUpper(unit), /\W/g, '')}`;
}
/**
* @param {string} ele.name
* @param {string|number} ele.value
* @param {string} ele.unit
*/
constructor(ele) {
this._name = ele.name;
this.measurement = new Measurement(ele.value, ele.unit);
}
get name() {
return this._name;
}
get value() {
return this.measurement.value;
}
get unit() {
return this.measurement.unit;
}
get isConvertible() {
return this.measurement.isConvertible;
}
toString() {
return `${this.name}: ${this.measurement.toString()}`;
}
}
module.exports = {Diagnostic, DiagnosticElement};