Skip to content

Commit

Permalink
fix: support for seven segment set number
Browse files Browse the repository at this point in the history
  • Loading branch information
pelikhan committed Sep 25, 2023
1 parent 4f205a6 commit fb9928c
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 27 deletions.
11 changes: 10 additions & 1 deletion src/jdom/servers/registerserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,14 @@ export class JDRegisterServer<
)
}

/**
* Sets the value on the register
* @param values values to set
* @param skipChangeEvent true to avoid emitting CHANGE
* @returns true if values changed; false otherwise
*/
setValues(values: TValues, skipChangeEvent?: boolean) {
if (this.readOnly) return
if (this.readOnly) return false

if (this.shouldNormalize()) this.normalize(values)
if (this.valueProcessor) values = this.valueProcessor(values)
Expand All @@ -154,7 +160,10 @@ export class JDRegisterServer<
if (!bufferEq(this.data, d)) {
this.data = d
if (!skipChangeEvent) this.emit(CHANGE)
return true
}

return false
}

reset() {
Expand Down
1 change: 1 addition & 0 deletions src/servers/jacdac-servers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ export * from "./planarpositionserver"
export * from "./serialserver"
export * from "./rosserver"
export * from "./indexedscreenserver"
export * from "./sevensegmentdisplayserver"
31 changes: 5 additions & 26 deletions src/servers/servers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ import { genFieldInfo, isNumericType } from "../../jacdac-spec/spectool/jdspec"
import { RosServer } from "./rosserver"
import { IndexedScreenServer } from "./indexedscreenserver"
import { randomDeviceId } from "../jdom/random"
import { SevenSegmentDisplayServer } from "./sevensegmentdisplayserver"

const indoorThermometerOptions: AnalogSensorServerOptions = {
readingValues: [21.5],
Expand Down Expand Up @@ -358,39 +359,17 @@ function initProviders() {
name: "7-segment (4 segments)",
serviceClasses: [SRV_SEVEN_SEGMENT_DISPLAY],
services: () => [
new JDServiceServer(SRV_SEVEN_SEGMENT_DISPLAY, {
intensityValues: [0xffff],
valueValues: [fromHex("00000000")],
registerValues: [
{
code: SevenSegmentDisplayReg.DigitCount,
values: [4],
},
{
code: SevenSegmentDisplayReg.DecimalPoint,
values: [true],
},
],
new SevenSegmentDisplayServer({
digits: fromHex("00000000"),
}),
],
},
{
name: "7-segment (8 segments)",
serviceClasses: [SRV_SEVEN_SEGMENT_DISPLAY],
services: () => [
new JDServiceServer(SRV_SEVEN_SEGMENT_DISPLAY, {
intensityValues: [0xffff],
valueValues: [fromHex("0000000000000000")],
registerValues: [
{
code: SevenSegmentDisplayReg.DigitCount,
values: [8],
},
{
code: SevenSegmentDisplayReg.DecimalPoint,
values: [true],
},
],
new SevenSegmentDisplayServer({
digits: fromHex("0000000000000000"),
}),
],
},
Expand Down
52 changes: 52 additions & 0 deletions src/servers/sevensegmentdisplayserver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import {
SRV_SEVEN_SEGMENT_DISPLAY,
SevenSegmentDisplayCmd,
SevenSegmentDisplayCmdPack,
SevenSegmentDisplayReg,
} from "../jdom/constants"
import { Packet } from "../jdom/packet"
import { JDRegisterServer } from "../jdom/servers/registerserver"
import { JDServiceServer } from "../jdom/servers/serviceserver"
import { sevenSegmentDigitEncode } from "../jdom/sevensegment"

export class SevenSegmentDisplayServer extends JDServiceServer {
readonly digits: JDRegisterServer<[Uint8Array]>
readonly digitCount: JDRegisterServer<[number]>
readonly decimalPoint: JDRegisterServer<[boolean]>
constructor(options: { digits: Uint8Array; decimalPoint?: boolean }) {
super(SRV_SEVEN_SEGMENT_DISPLAY, {
intensityValues: [0xffff],
})

const { digits, decimalPoint } = options

this.digitCount = this.addRegister<[number]>(
SevenSegmentDisplayReg.DigitCount,
[digits.length],
)
this.decimalPoint = this.addRegister<[boolean]>(
SevenSegmentDisplayReg.DecimalPoint,
[!!decimalPoint],
)
this.digits = this.addRegister<[Uint8Array]>(
SevenSegmentDisplayReg.Digits,
[digits],
)

this.addCommand(
SevenSegmentDisplayCmd.SetNumber,
this.handleSetNumber.bind(this),
)
}

private async handleSetNumber(pkt: Packet) {
const [digitCount] = this.digitCount.values()
const [value] = pkt.jdunpack<[number]>(
SevenSegmentDisplayCmdPack.SetNumber,
)
const digits = isNaN(value)
? new Uint8Array(0)
: sevenSegmentDigitEncode(value, digitCount)
if (this.digits.setValues([digits])) await this.digits.sendGetAsync()
}
}

0 comments on commit fb9928c

Please sign in to comment.