diff --git a/packages/drivers/src/index.ts b/packages/drivers/src/index.ts index 36bd2bbe8a..352ee3834f 100644 --- a/packages/drivers/src/index.ts +++ b/packages/drivers/src/index.ts @@ -13,5 +13,6 @@ export * from "./indexedscreen" export * from "./dotmatrix" export * from "./st7735" export * from "./uc8151" +export * from "./trafficlight" configureHardware({ scanI2C: false }) diff --git a/packages/drivers/src/trafficlight.ts b/packages/drivers/src/trafficlight.ts new file mode 100644 index 0000000000..d1f235dda0 --- /dev/null +++ b/packages/drivers/src/trafficlight.ts @@ -0,0 +1,58 @@ +import * as ds from "@devicescript/core" +import { AsyncValue, GPIOMode, OutputPin, TrafficLightServerSpec } from "@devicescript/core"; +import { Server, ServerOptions, startServer } from "@devicescript/server"; + +export interface TrafficLightOptions extends ServerOptions { + red: OutputPin, + yellow: OutputPin, + green: OutputPin +} + +class TrafficLightServer extends Server implements TrafficLightServerSpec { + private lights: { pin: OutputPin, state: boolean }[] = [] + + constructor(options: TrafficLightOptions) { + super(ds.TrafficLight.spec, options) + this.lights = [ + {pin: options.red, state: false}, + {pin: options.yellow, state: false}, + {pin: options.green, state: false} + ] + for(const light of this.lights) { + light.pin?.setMode(GPIOMode.Output) + light.pin?.write(light.state) + } + } + + private setState(index: number, value: boolean) { + this.lights[index].state = !!value + this.lights[index].pin?.write(this.lights[index].state) + } + + red(): AsyncValue { + return this.lights[0].state + } + set_red(value: boolean): AsyncValue { + return this.setState(0, value) + } + yellow(): AsyncValue { + return this.lights[1].state + } + set_yellow(value: boolean): AsyncValue { + return this.setState(1, value) + } + green(): AsyncValue { + return this.lights[2].state + } + set_green(value: boolean): AsyncValue { + return this.setState(2, value) + } +} + +/** + * Starts a traffic light driver over 3 output pins + */ +export async function startTrafficLight(options: TrafficLightOptions & ServerOptions) { + const server = new TrafficLightServer(options) + return new ds.TrafficLight(startServer(server)) +} \ No newline at end of file diff --git a/packages/sampleprj/src/maintrafficlight.ts b/packages/sampleprj/src/maintrafficlight.ts index 391804cc0c..dd9359e68e 100644 --- a/packages/sampleprj/src/maintrafficlight.ts +++ b/packages/sampleprj/src/maintrafficlight.ts @@ -1,7 +1,13 @@ -import { Temperature, TrafficLight } from "@devicescript/core" +import { pins } from "@dsboard/pico_w" +import { Temperature } from "@devicescript/core" +import { startTrafficLight } from "@devicescript/drivers" const temp = new Temperature() -const light = new TrafficLight() +const light = await startTrafficLight({ + red: pins.GP10, + yellow: pins.GP11, + green: pins.GP12, +}) temp.reading.subscribe(async t => { if (t > 30) { await light.green.write(false) @@ -15,5 +21,5 @@ temp.reading.subscribe(async t => { await light.green.write(true) await light.yellow.write(false) await light.red.write(false) - } + } }) diff --git a/website/docs/api/drivers/trafficlight.md b/website/docs/api/drivers/trafficlight.md new file mode 100644 index 0000000000..49ac0581e1 --- /dev/null +++ b/website/docs/api/drivers/trafficlight.md @@ -0,0 +1,18 @@ +# Traffic Light + +The traffic light driver, `startTrafficLight` is used to control a toy traffic light, driving 3 LEDs. + +```ts +import { pins } from "@dsboard/pico_w" +import { startTrafficLight } from "@devicescript/drivers" + +const light = await startTrafficLight({ + red: pins.GP10, + yellow: pins.GP11, + green: pins.GP12, +}) + +await light.green.write(true) +await light.yellow.write(false) +await light.red.write(false) +``` \ No newline at end of file