From 45fa6ccc29f1a42183c467b845e9265de3c3224c Mon Sep 17 00:00:00 2001 From: Rebecca Williams Date: Wed, 15 May 2024 11:01:44 +0100 Subject: [PATCH 1/2] Fix BOB parsing for precision and units --- src/ui/widgets/EmbeddedDisplay/bobParser.ts | 13 ++++++++++++- src/ui/widgets/EmbeddedDisplay/opiParser.test.ts | 4 ++-- src/ui/widgets/EmbeddedDisplay/parser.ts | 12 ++++++++++++ src/ui/widgets/Readback/readback.tsx | 9 +++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/ui/widgets/EmbeddedDisplay/bobParser.ts b/src/ui/widgets/EmbeddedDisplay/bobParser.ts index fe1f673..07f8f5a 100644 --- a/src/ui/widgets/EmbeddedDisplay/bobParser.ts +++ b/src/ui/widgets/EmbeddedDisplay/bobParser.ts @@ -106,6 +106,16 @@ function bobParsePosition(props: any): Position { ); } +function bobParseFormatType(jsonProp: ElementCompact): string { + const formats: { [key: number]: string } = { + 0: "default", + 1: "decimal", + 2: "exponential", + 6: "string" + }; + return formats[bobParseNumber(jsonProp) ?? 0]; +} + export function bobParseFont(jsonProp: ElementCompact): Font { const opiStyles: { [key: number]: FontStyle } = { 0: FontStyle.Regular, @@ -248,7 +258,8 @@ export function parseBob( imageFile: ["file", opiParseString], points: ["points", bobParsePoints], resize: ["resize", bobParseResizing], - squareLed: ["square", opiParseBoolean] + squareLed: ["square", opiParseBoolean], + formatType: ["format", bobParseFormatType] }; const complexParsers = { diff --git a/src/ui/widgets/EmbeddedDisplay/opiParser.test.ts b/src/ui/widgets/EmbeddedDisplay/opiParser.test.ts index 2ef5438..2e6ee05 100644 --- a/src/ui/widgets/EmbeddedDisplay/opiParser.test.ts +++ b/src/ui/widgets/EmbeddedDisplay/opiParser.test.ts @@ -271,7 +271,7 @@ describe("opi widget parser", (): void => { 20 - not-a-bool + not-a-bool `; it("doesn't parse an invalid bool", (): void => { @@ -279,7 +279,7 @@ describe("opi widget parser", (): void => { log.setLevel("error"); const widget = parseOpi(invalidBool, "ca", PREFIX) .children?.[0] as WidgetDescription; - expect(widget.showUnits).toBeUndefined(); + expect(widget.enabled).toBeUndefined(); log.setLevel("info"); }); const xygraphString = ` diff --git a/src/ui/widgets/EmbeddedDisplay/parser.ts b/src/ui/widgets/EmbeddedDisplay/parser.ts index 56b1838..7b7d0b6 100644 --- a/src/ui/widgets/EmbeddedDisplay/parser.ts +++ b/src/ui/widgets/EmbeddedDisplay/parser.ts @@ -151,5 +151,17 @@ export function parseWidget( filepath ); }); + + // Default to true if precision is not defined. + // Applicable to BOB files. + if (widgetDescription.precision === undefined) { + widgetDescription.precisionFromPv = true; + } + // Default to true if showUnits is not defined. + // Applicable to BOB files. + if (widgetDescription.showUnits === undefined) { + widgetDescription.showUnits = true; + } + return widgetDescription; } diff --git a/src/ui/widgets/Readback/readback.tsx b/src/ui/widgets/Readback/readback.tsx index 9fe56be..1d4c6bd 100644 --- a/src/ui/widgets/Readback/readback.tsx +++ b/src/ui/widgets/Readback/readback.tsx @@ -89,6 +89,15 @@ export const ReadbackComponent = ( } else { displayedValue = DType.coerceString(value); } + } else if (value.getArrayValue() !== undefined && prec !== undefined) { + displayedValue = ""; + const array = Array.prototype.slice.call(value.getArrayValue()); + for (let i = 0; i < array.length; i++) { + displayedValue = displayedValue.concat(array[i].toFixed(prec)); + if (i < array.length - 1) { + displayedValue = displayedValue.concat(", "); + } + } } else { displayedValue = DType.coerceString(value); } From 0485b95ea82178cdfca7cec0dc2a30005bdf7fb6 Mon Sep 17 00:00:00 2001 From: Rebecca Williams Date: Tue, 21 May 2024 12:46:43 +0100 Subject: [PATCH 2/2] Add tests for parsing precision, units, and formats from BOB files --- .../widgets/EmbeddedDisplay/bobParser.test.ts | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/ui/widgets/EmbeddedDisplay/bobParser.test.ts b/src/ui/widgets/EmbeddedDisplay/bobParser.test.ts index 23a75e4..da29d1a 100644 --- a/src/ui/widgets/EmbeddedDisplay/bobParser.test.ts +++ b/src/ui/widgets/EmbeddedDisplay/bobParser.test.ts @@ -91,4 +91,76 @@ describe("opi widget parser", (): void => { // Is this correct? expect(display.x).toEqual(undefined); }); + + const readbackDefaults = ` + + 0 + 0 + 300 + 300 + + Text Update + abc + 12 + 62 + 140 + 50 + false + + `; + it("parses defaults", (): void => { + const widget = parseBob(readbackDefaults, "xxx", PREFIX) + .children?.[0] as WidgetDescription; + expect(widget.precisionFromPv).toEqual(true); + expect(widget.showUnits).toEqual(true); + }); + + const readbackPrecisionUnits = ` + + 0 + 0 + 300 + 300 + + Text Update + abc + 12 + 62 + 140 + 50 + false + 2 + false + + `; + it("parses precision and units", (): void => { + const widget = parseBob(readbackPrecisionUnits, "xxx", PREFIX) + .children?.[0] as WidgetDescription; + expect(widget.precisionFromPv).toEqual(undefined); + expect(widget.precision).toEqual(2); + expect(widget.showUnits).toEqual(false); + }); + + const readbackStringFormat = ` + + 0 + 0 + 300 + 300 + + Text Update + abc + 12 + 62 + 140 + 50 + false + 6 + + `; + it("parses string format", (): void => { + const widget = parseBob(readbackStringFormat, "xxx", PREFIX) + .children?.[0] as WidgetDescription; + expect(widget.formatType).toEqual("string"); + }); });