145 lines
4.8 KiB
TypeScript
145 lines
4.8 KiB
TypeScript
import { pond } from "protobuf-ts/pond";
|
|
import { quack } from "protobuf-ts/pond";
|
|
import { or } from "utils/types";
|
|
import { cloneDeep } from "lodash";
|
|
import { getSubtypes } from "pbHelpers/ComponentType";
|
|
import { getFriendlyAddressTypeName, getHumanReadableAddress } from "pbHelpers/AddressType";
|
|
// import { getSubtypes } from "pbHelpers/ComponentType";
|
|
|
|
export class Component {
|
|
public settings: pond.ComponentSettings = pond.ComponentSettings.create();
|
|
public status: pond.ComponentStatus = pond.ComponentStatus.create();
|
|
public lastMeasurement: pond.UnitMeasurementsForComponent[] = [];
|
|
public lastGoodMeasurement: pond.UnitMeasurementsForComponent[] = [];
|
|
public permissions: pond.Permission[] = [];
|
|
|
|
public static create(pb?: pond.Component): Component {
|
|
let my = new Component();
|
|
if (pb) {
|
|
my.settings = pond.ComponentSettings.fromObject(
|
|
or(pb.settings, pond.ComponentSettings.create())
|
|
);
|
|
my.status = pond.ComponentStatus.fromObject(or(pb.status, pond.ComponentStatus.create()));
|
|
my.lastMeasurement = pb.lastMeasurement ?? pond.UnitMeasurementsForComponent.create();
|
|
//my.lastGoodMeasurement = pb.status?.lastGoodMeasurement ?? pond.UnitMeasurementsForComponent.create();
|
|
my.permissions = pb.permissions ?? [];
|
|
}
|
|
return my;
|
|
}
|
|
|
|
public static clone(other?: Component): Component {
|
|
if (other) {
|
|
return Component.create(
|
|
pond.Component.fromObject(cloneDeep({ settings: other.settings, status: other.status }))
|
|
);
|
|
}
|
|
return Component.create();
|
|
}
|
|
|
|
public static any(data: any): Component {
|
|
let my = Component.create(pond.Component.fromObject(cloneDeep(data)));
|
|
if (data && data.status && data.status.lastMeasurement) {
|
|
my.status.lastMeasurement = data.status.lastMeasurement;
|
|
}
|
|
if (data && data.status && data.status.lastGoodMeasurement) {
|
|
my.status.lastGoodMeasurement = [];
|
|
data.status.lastGoodMeasurement.forEach((m: any) => {
|
|
my.status.lastGoodMeasurement.push(m);
|
|
});
|
|
}
|
|
return my;
|
|
}
|
|
|
|
public update(other: Component) {
|
|
this.settings = other.settings;
|
|
this.status = other.status;
|
|
}
|
|
|
|
public name(): string {
|
|
return this.settings.name !== "" ? this.settings.name : "Component " + this.key();
|
|
}
|
|
|
|
public key(): string {
|
|
return this.settings.key;
|
|
}
|
|
|
|
public location(): quack.ComponentID {
|
|
return quack.ComponentID.fromObject({
|
|
type: this.settings.type,
|
|
addressType: this.settings.addressType,
|
|
address: this.settings.address,
|
|
expansionLine: this.settings.expansionLine,
|
|
muxLine: this.settings.muxLine
|
|
});
|
|
}
|
|
|
|
public locationString(): string {
|
|
let compositeLocation = or(this.settings.type, 0).toString() +
|
|
"-" +
|
|
or(this.settings.addressType, 0).toString() +
|
|
"-" +
|
|
or(this.settings.address, 0).toString()
|
|
if(this.settings.expansionLine){
|
|
compositeLocation = compositeLocation + "-" + this.settings.expansionLine
|
|
}
|
|
if(this.settings.muxLine){
|
|
compositeLocation = compositeLocation + ":" + this.settings.muxLine
|
|
}
|
|
return compositeLocation;
|
|
}
|
|
|
|
public type(): quack.ComponentType {
|
|
return this.settings.type;
|
|
}
|
|
|
|
public subType(): number {
|
|
return this.settings.subtype;
|
|
}
|
|
|
|
public subTypeName(): string {
|
|
let subtypes = getSubtypes(this.settings.type);
|
|
let subName = "Default";
|
|
subtypes.forEach(sub => {
|
|
if (this.settings.subtype === sub.key) {
|
|
subName = sub.friendlyName;
|
|
}
|
|
});
|
|
return subName;
|
|
}
|
|
|
|
public numNodes(): number {
|
|
if (this.lastMeasurement[0] && this.lastMeasurement[0].values[0]) {
|
|
return this.lastMeasurement[0].values[0].values.length;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public addressDescription(deviceProduct?: pond.DeviceProduct): string {
|
|
if (
|
|
this.settings.addressType === quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY ||
|
|
(this.settings.addressType >= quack.AddressType.ADDRESS_TYPE_PIN_OFFSET1 &&
|
|
this.settings.addressType <= quack.AddressType.ADDRESS_TYPE_PIN_OFFSET100)
|
|
) {
|
|
let addressDescription = getHumanReadableAddress(
|
|
this.settings.addressType,
|
|
this.settings.type,
|
|
this.settings.address,
|
|
deviceProduct
|
|
);
|
|
if (addressDescription === "") {
|
|
addressDescription = "Internal";
|
|
}
|
|
let port = "Port: " + addressDescription;
|
|
let cableID = "";
|
|
if (
|
|
this.settings.addressType >= quack.AddressType.ADDRESS_TYPE_PIN_OFFSET1 &&
|
|
this.settings.addressType <= quack.AddressType.ADDRESS_TYPE_PIN_OFFSET100
|
|
) {
|
|
cableID = "Cable: " + (this.settings.addressType - 8);
|
|
}
|
|
return port + " " + cableID;
|
|
} else {
|
|
return getFriendlyAddressTypeName(this.settings.addressType);
|
|
}
|
|
};
|
|
}
|