You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

100 lines
2.8 KiB

import { computed, observable } from "mobx";
import { ConnectionState } from "./ConnectionState";
import * as req from "./deviceRequests";
import { Program } from "./Program";
import { Section } from "./Section";
import { SectionRunner } from "./SectionRunner";
import { SprinklersRPC } from "./SprinklersRPC";
export abstract class SprinklersDevice {
readonly rpc: SprinklersRPC;
readonly id: string;
@observable
connectionState: ConnectionState = new ConnectionState();
@observable
sections: Section[] = [];
@observable
programs: Program[] = [];
@observable
sectionRunner: SectionRunner;
@computed
get connected(): boolean {
return this.connectionState.isDeviceConnected || false;
}
sectionConstructor: typeof Section = Section;
sectionRunnerConstructor: typeof SectionRunner = SectionRunner;
programConstructor: typeof Program = Program;
private references: number = 0;
protected constructor(rpc: SprinklersRPC, id: string) {
this.rpc = rpc;
this.id = id;
this.sectionRunner = new this.sectionRunnerConstructor(this);
}
abstract makeRequest(request: req.Request): Promise<req.Response>;
/**
* Increase the reference count for this sprinklers device
* @returns The new reference count
*/
acquire(): number {
return ++this.references;
}
/**
* Releases one reference to this device. When the reference count reaches 0, the device
* will be released and no longer updated.
* @returns The reference count after being updated
*/
release(): number {
this.references--;
if (this.references <= 0) {
this.rpc.releaseDevice(this.id);
}
return this.references;
}
runProgram(opts: req.WithProgram) {
return this.makeRequest({ ...opts, type: "runProgram" });
}
cancelProgram(opts: req.WithProgram) {
return this.makeRequest({ ...opts, type: "cancelProgram" });
}
updateProgram(
opts: req.UpdateProgramData
): Promise<req.UpdateProgramResponse> {
return this.makeRequest({ ...opts, type: "updateProgram" }) as Promise<any>;
}
runSection(opts: req.RunSectionData): Promise<req.RunSectionResponse> {
return this.makeRequest({ ...opts, type: "runSection" }) as Promise<any>;
}
cancelSection(opts: req.WithSection) {
return this.makeRequest({ ...opts, type: "cancelSection" });
}
cancelSectionRunId(opts: req.CancelSectionRunIdData) {
return this.makeRequest({ ...opts, type: "cancelSectionRunId" });
}
pauseSectionRunner(opts: req.PauseSectionRunnerData) {
return this.makeRequest({ ...opts, type: "pauseSectionRunner" });
}
toString(): string {
return (
`SprinklersDevice{id="${this.id}", connected=${this.connected}, ` +
`sections=[${this.sections}], ` +
`programs=[${this.programs}], ` +
`sectionRunner=${this.sectionRunner} }`
);
}
}