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
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} }` |
|
); |
|
} |
|
}
|
|
|