import { observable, IObservableArray } from "mobx"; export abstract class Section { public device: SprinklersDevice; @observable public name: string = ""; @observable public state: boolean = false; constructor(device: SprinklersDevice) { this.device = device; } public run(duration: Duration) { return this.device.runSection(this, duration); } public toString(): string { return `Section{name="${this.name}", state=${this.state}}`; } } export interface ITimeOfDay { hour: number; minute: number; second: number; millisecond: number; } export enum Weekday { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, } export class Schedule { public times: ITimeOfDay[] = []; public weekdays: Weekday[] = []; public from?: Date = null; public to?: Date = null; } export class Duration { public static fromSeconds(seconds: number): Duration { return new Duration(Math.floor(seconds / 60), seconds % 60); } public minutes: number = 0; public seconds: number = 0; constructor(minutes: number, seconds: number) { this.minutes = minutes; this.seconds = seconds; } public toSeconds(): number { return this.minutes * 60 + this.seconds; } public withSeconds(newSeconds: number): Duration { let newMinutes = this.minutes; if (newSeconds >= 60) { newMinutes++; newSeconds = 0; } if (newSeconds < 0) { newMinutes = Math.max(0, newMinutes - 1); newSeconds = 59; } return new Duration(newMinutes, newSeconds); } public withMinutes(newMinutes: number): Duration { if (newMinutes < 0) { newMinutes = 0; } return new Duration(newMinutes, this.seconds); } public toString(): string { return `${this.minutes}M ${this.seconds}S`; } } export interface IProgramItem { // the section number section: number; // duration of the run duration: Duration; } export class Program { public device: SprinklersDevice; constructor(device: SprinklersDevice) { this.device = device; } @observable public name: string = ""; @observable public enabled: boolean = false; @observable public schedule: Schedule = new Schedule(); @observable public sequence: IProgramItem[] = []; @observable public running: boolean = false; public run() { return this.device.runProgram(this); } public toString(): string { return `Program{name="${this.name}", enabled=${this.enabled}, schedule=${this.schedule}, sequence=${this.sequence}, running=${this.running}}`; } } export abstract class SprinklersDevice { @observable public connected: boolean = false; @observable public sections: IObservableArray
= [] as IObservableArray
; @observable public programs: IObservableArray = [] as IObservableArray; public abstract runSection(section: number | Section, duration: Duration): Promise<{}>; public abstract runProgram(program: number | Program): Promise<{}>; abstract get id(): string; } export interface ISprinklersApi { start(); getDevice(id: string): SprinklersDevice; removeDevice(id: string); }