Skip to content

Commit a15ea50

Browse files
authored
traffic light server (#574)
1 parent d6cf355 commit a15ea50

File tree

4 files changed

+86
-3
lines changed

4 files changed

+86
-3
lines changed

Diff for: packages/drivers/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ export * from "./indexedscreen"
1313
export * from "./dotmatrix"
1414
export * from "./st7735"
1515
export * from "./uc8151"
16+
export * from "./trafficlight"
1617

1718
configureHardware({ scanI2C: false })

Diff for: packages/drivers/src/trafficlight.ts

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import * as ds from "@devicescript/core"
2+
import { AsyncValue, GPIOMode, OutputPin, TrafficLightServerSpec } from "@devicescript/core";
3+
import { Server, ServerOptions, startServer } from "@devicescript/server";
4+
5+
export interface TrafficLightOptions extends ServerOptions {
6+
red: OutputPin,
7+
yellow: OutputPin,
8+
green: OutputPin
9+
}
10+
11+
class TrafficLightServer extends Server implements TrafficLightServerSpec {
12+
private lights: { pin: OutputPin, state: boolean }[] = []
13+
14+
constructor(options: TrafficLightOptions) {
15+
super(ds.TrafficLight.spec, options)
16+
this.lights = [
17+
{pin: options.red, state: false},
18+
{pin: options.yellow, state: false},
19+
{pin: options.green, state: false}
20+
]
21+
for(const light of this.lights) {
22+
light.pin?.setMode(GPIOMode.Output)
23+
light.pin?.write(light.state)
24+
}
25+
}
26+
27+
private setState(index: number, value: boolean) {
28+
this.lights[index].state = !!value
29+
this.lights[index].pin?.write(this.lights[index].state)
30+
}
31+
32+
red(): AsyncValue<boolean> {
33+
return this.lights[0].state
34+
}
35+
set_red(value: boolean): AsyncValue<void> {
36+
return this.setState(0, value)
37+
}
38+
yellow(): AsyncValue<boolean> {
39+
return this.lights[1].state
40+
}
41+
set_yellow(value: boolean): AsyncValue<void> {
42+
return this.setState(1, value)
43+
}
44+
green(): AsyncValue<boolean> {
45+
return this.lights[2].state
46+
}
47+
set_green(value: boolean): AsyncValue<void> {
48+
return this.setState(2, value)
49+
}
50+
}
51+
52+
/**
53+
* Starts a traffic light driver over 3 output pins
54+
*/
55+
export async function startTrafficLight(options: TrafficLightOptions & ServerOptions) {
56+
const server = new TrafficLightServer(options)
57+
return new ds.TrafficLight(startServer(server))
58+
}

Diff for: packages/sampleprj/src/maintrafficlight.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import { Temperature, TrafficLight } from "@devicescript/core"
1+
import { pins } from "@dsboard/pico_w"
2+
import { Temperature } from "@devicescript/core"
3+
import { startTrafficLight } from "@devicescript/drivers"
24

35
const temp = new Temperature()
4-
const light = new TrafficLight()
6+
const light = await startTrafficLight({
7+
red: pins.GP10,
8+
yellow: pins.GP11,
9+
green: pins.GP12,
10+
})
511
temp.reading.subscribe(async t => {
612
if (t > 30) {
713
await light.green.write(false)
@@ -15,5 +21,5 @@ temp.reading.subscribe(async t => {
1521
await light.green.write(true)
1622
await light.yellow.write(false)
1723
await light.red.write(false)
18-
}
24+
}
1925
})

Diff for: website/docs/api/drivers/trafficlight.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Traffic Light
2+
3+
The traffic light driver, `startTrafficLight` is used to control a toy traffic light, driving 3 LEDs.
4+
5+
```ts
6+
import { pins } from "@dsboard/pico_w"
7+
import { startTrafficLight } from "@devicescript/drivers"
8+
9+
const light = await startTrafficLight({
10+
red: pins.GP10,
11+
yellow: pins.GP11,
12+
green: pins.GP12,
13+
})
14+
15+
await light.green.write(true)
16+
await light.yellow.write(false)
17+
await light.red.write(false)
18+
```

0 commit comments

Comments
 (0)