101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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} }`
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |