Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions src/components/AlarmBorder/alarmBorder.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
import React, { ReactNode } from "react";
import { Alarm, NType } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";
import { Alarm, alarmOf, AlarmSeverity } from "../../vtypes/alarm";

import classes from "./alarmBorder.module.css";

export const AlarmBorder = (props: {
connected: boolean;
value?: NType;
value?: VType;
children: ReactNode;
}): JSX.Element => {
let { connected, value = null } = props;
let alarm: Alarm = { severity: 0, status: 0, message: "" };
if (value && value.alarm) {
alarm = value.alarm;
}
let alarm: Alarm = alarmOf(value);
// Sort out alarm border classes
let alarmClasses = [classes.Border, classes.Children];
if (connected === false) {
alarmClasses.push(classes.NotConnected);
} else if (alarm.severity === 1) {
} else if (alarm.getSeverity() === AlarmSeverity.MINOR) {
alarmClasses.push(classes.MinorAlarm);
} else if (alarm.severity === 2) {
} else if (alarm.getSeverity() === AlarmSeverity.MAJOR) {
alarmClasses.push(classes.MajorAlarm);
}

Expand Down
4 changes: 2 additions & 2 deletions src/components/ConnectionWrapper/connectionWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useId } from "react-id-generator";
import { useSubscription } from "../../hooks/useCs";
import { useSelector } from "react-redux";
import { CsState } from "../../redux/csState";
import { NType } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";

export interface PvProps extends React.PropsWithChildren<any> {
pvName: string;
Expand All @@ -22,7 +22,7 @@ export const connectionWrapper = <P extends object>(
useSubscription(id, props.pvName);
const [connected, latestValue] = useSelector((state: CsState): [
boolean,
NType?
VType?
] => {
let pvState = state.valueCache[props.pvName];
let connected = false;
Expand Down
19 changes: 12 additions & 7 deletions src/components/CopyWrapper/copyWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,21 @@ import copyToClipboard from "clipboard-copy";
import Popover from "react-tiny-popover";

import { connectionWrapper } from "../ConnectionWrapper/connectionWrapper";
import { NType } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";
import classes from "./copyWrapper.module.css";
import { vtypeToString } from "../../vtypes/utils";
import { timeOf } from "../../vtypes/time";
import { alarmOf } from "../../vtypes/alarm";

export const CopyWrapper = (props: {
pvName: string;
connected: boolean;
value?: NType;
value?: VType;
children: ReactNode;
style?: object;
}): JSX.Element => {
const [popoverOpen, setPopoverOpen] = useState(false);
let { connected, pvName, value = null } = props;
let { connected, pvName, value } = props;

let displayValue = "";
if (!connected) {
Expand All @@ -28,7 +31,7 @@ export const CopyWrapper = (props: {
if (!value) {
displayValue = "Warning: Waiting for value";
} else {
displayValue = value.value.toString();
displayValue = vtypeToString(value);
}
}

Expand All @@ -48,14 +51,16 @@ export const CopyWrapper = (props: {
}
};
// Compose the text which should be shown on the tooltip
let time = timeOf(value);
let alarm = alarmOf(value);
let toolTipText = [
displayValue,
value
? value.time
? new Date(value.time.secondsPastEpoch * 1000)
? time
? new Date(time.getInstant().secondsPastEpoch * 1000)
: ""
: "",
value ? (value.alarm ? value.alarm.message : "") : ""
value ? (alarm ? alarm.getName() : "") : ""
]
.filter((word): boolean => word !== "")
.join(", ");
Expand Down
16 changes: 7 additions & 9 deletions src/components/Input/input.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import React, { useState } from "react";
import { connectionWrapper } from "../ConnectionWrapper/connectionWrapper";
import { writePv } from "../../hooks/useCs";
import { NType, ntOrNullToString } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";

import classes from "./input.module.css";
import { vtypeToString, stringToVtype } from "../../vtypes/utils";

export interface InputProps {
pvName: string;
Expand Down Expand Up @@ -32,7 +33,7 @@ interface ConnectedInputProps {

interface SmartInputProps {
pvName: string;
value?: NType;
value?: VType;
}

export const SmartInput: React.FC<SmartInputProps> = (
Expand All @@ -42,10 +43,7 @@ export const SmartInput: React.FC<SmartInputProps> = (
const [editing, setEditing] = useState(false);
function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {
if (event.key === "Enter") {
writePv(props.pvName, {
type: "NTScalar",
value: event.currentTarget.value
});
writePv(props.pvName, stringToVtype(event.currentTarget.value));
setInputValue("");
setEditing(false);
}
Expand All @@ -63,11 +61,11 @@ export const SmartInput: React.FC<SmartInputProps> = (
function onBlur(event: React.ChangeEvent<HTMLInputElement>): void {
setEditing(false);
/* When focus lost show PV value. */
setInputValue(ntOrNullToString(props.value));
setInputValue(vtypeToString(props.value));
}

if (!editing && inputValue !== ntOrNullToString(props.value)) {
setInputValue(ntOrNullToString(props.value));
if (!editing && inputValue !== vtypeToString(props.value)) {
setInputValue(vtypeToString(props.value));
}

return (
Expand Down
12 changes: 7 additions & 5 deletions src/components/ProgressBar/progressBar.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import React from "react";

import { NType, ntOrNullToNumber } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";
import classes from "./progressBar.module.css";

import { connectionWrapper } from "../ConnectionWrapper/connectionWrapper";
import { CopyWrapper } from "../CopyWrapper/copyWrapper";
import { AlarmBorder } from "../AlarmBorder/alarmBorder";
import { vtypeOrUndefinedToNumber } from "../../vtypes/utils";

interface ProgressBarProps {
connected: boolean;
value?: NType;
value?: VType;
min: number;
max: number;
vertical?: boolean;
Expand All @@ -25,7 +26,7 @@ interface ProgressBarProps {
// Same as ProgressBarProps but without connected and value as these are
// collected from the store
interface ConnectedProgressBarProps {
value?: NType;
value?: VType;
pvName: string;
min: number;
max: number;
Expand Down Expand Up @@ -62,7 +63,8 @@ export const ProgressBar: React.FC<ProgressBarProps> = (
height: height,
width: width
};
let numValue = ntOrNullToNumber(value);
// eslint-disable-next-line no-undef
let numValue = vtypeOrUndefinedToNumber(value);
let onPercent =
numValue < min
? 0
Expand Down Expand Up @@ -116,7 +118,7 @@ export const ConnectedProgressBar: React.FC<

export const StandaloneProgressBar = (props: {
pvName: string;
value: NType;
value: VType;
connected: boolean;
min: number;
max: number;
Expand Down
14 changes: 5 additions & 9 deletions src/components/Readback/readback.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,20 @@ import React from "react";
import { Readback } from "./readback";
import { shallow } from "enzyme";
import renderer from "react-test-renderer";
import { vstringOf } from "../../vtypes/vtypes";
import { stringToVtype } from "../../vtypes/utils";

test("snapshot matches", (): void => {
const readback = renderer.create(
<Readback
connected={true}
value={{ type: "NTScalarDouble", value: "hello" }}
/>
<Readback connected={true} value={vstringOf("hello")} />
);
let json = readback.toJSON();
expect(json).toMatchSnapshot();
});

it("renders a basic element", (): void => {
const wrapper = shallow(
<Readback
connected={true}
value={{ type: "NTScalarDouble", value: "hello" }}
/>
<Readback connected={true} value={vstringOf("hello")} />
);
expect(wrapper.text()).toEqual("hello");
});
Expand All @@ -28,7 +24,7 @@ it("applies precision to numbers", (): void => {
const wrapper = shallow(
<Readback
connected={true}
value={{ type: "NTScalarDouble", value: "3.14159265359" }}
value={stringToVtype("3.14159265359")}
precision={2}
/>
);
Expand Down
30 changes: 10 additions & 20 deletions src/components/Readback/readback.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import React from "react";
import {
NType,
Alarm,
NO_ALARM,
ntToNumericString,
ntToString
} from "../../ntypes";
import { connectionWrapper } from "../ConnectionWrapper/connectionWrapper";
import { CopyWrapper } from "../CopyWrapper/copyWrapper";
import { AlarmBorder } from "../AlarmBorder/alarmBorder";

import classes from "./readback.module.css";
import { VType } from "../../vtypes/vtypes";
import { Alarm, alarmOf, AlarmSeverity } from "../../vtypes/alarm";
import { vtypeToString } from "../../vtypes/utils";

export const Readback = (props: {
connected: boolean;
value?: NType;
value?: VType;
precision?: number;
style?: {};
}): JSX.Element => {
Expand All @@ -24,18 +20,12 @@ export const Readback = (props: {
precision = undefined,
style = { backgroundColor: "#383838", color: "#00bb00" }
} = props;
let alarm = NO_ALARM;
if (value && value.alarm != null) {
alarm = value.alarm;
}
const alarm = alarmOf(value);
let displayedValue;
if (!value) {
displayedValue = "Waiting for value";
} else if (precision && precision >= 0) {
value = value as NType;
displayedValue = ntToNumericString(value, precision);
} else {
displayedValue = ntToString(value);
displayedValue = vtypeToString(value, precision);
}

// Change text color depending on connection state or alarm
Expand All @@ -44,13 +34,13 @@ export const Readback = (props: {
...style,
color: "#ffffff"
};
} else if (alarm.severity === 1) {
} else if (alarm.getSeverity() === AlarmSeverity.MINOR) {
// Minor alarm
style = {
...style,
color: "#eeee00"
};
} else if (alarm.severity === 2) {
} else if (alarm.getSeverity() === AlarmSeverity.MAJOR) {
// Major alarm
style = {
...style,
Expand Down Expand Up @@ -84,7 +74,7 @@ interface ConnectedCopyReadbackProps {

export const CopyReadback = (props: {
pvName: string;
value: NType;
value: VType;
connected: boolean;
precision?: number;
style?: object;
Expand Down Expand Up @@ -114,7 +104,7 @@ interface ConnectedStandaloneReadbackProps {

export const StandaloneReadback = (props: {
pvName: string;
value: NType;
value: VType;
connected: boolean;
precision?: number;
style?: object;
Expand Down
12 changes: 5 additions & 7 deletions src/components/SlideControl/slideControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@
import React, { useState } from "react";
import { ProgressBar } from "../ProgressBar/progressBar";
import { writePv } from "../../hooks/useCs";
import { NType, ntOrNullToString } from "../../ntypes";
import { VType } from "../../vtypes/vtypes";

import classes from "./slideControl.module.css";
import { connectionWrapper } from "../ConnectionWrapper/connectionWrapper";
import { vtypeToString, stringToVtype } from "../../vtypes/utils";

interface SlideControlProps {
pvName: string;
connected: boolean;
value?: NType;
value?: VType;
min: number;
max: number;
vertical?: boolean;
Expand Down Expand Up @@ -57,13 +58,10 @@ export const SlideControl: React.FC<SlideControlProps> = (
}
function onMouseUp(event: React.MouseEvent<HTMLInputElement>): void {
setEditing(false);
writePv(pvName, {
type: "NTScalar",
value: event.currentTarget.value
});
writePv(pvName, stringToVtype(event.currentTarget.value));
}

let stringValue = ntOrNullToString(value);
let stringValue = vtypeToString(value);
if (!editing && inputValue !== stringValue) {
setInputValue(stringValue);
}
Expand Down
8 changes: 4 additions & 4 deletions src/connection/coniql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { WebSocketLink } from "apollo-link-ws";
import { getMainDefinition } from "apollo-utilities";
import gql from "graphql-tag";
import { InMemoryCache, NormalizedCacheObject } from "apollo-cache-inmemory";
import { NType } from "../ntypes";
import { VType, vdoubleOf } from "../vtypes/vtypes";
import {
Connection,
ConnectionChangedCallback,
Expand Down Expand Up @@ -87,12 +87,12 @@ export class ConiqlPlugin implements Connection {
});
}

public putPv(pvName: string, value: NType): void {
public putPv(pvName: string, value: VType): void {
// noop
}

public getValue(pvName: string): NType {
return { type: "NTScalarDouble", value: "" };
public getValue(pvName: string): VType {
return vdoubleOf(0);
}

public unsubscribe(pvName: string): void {
Expand Down
8 changes: 4 additions & 4 deletions src/connection/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NType } from "../ntypes";
import { VType } from "../vtypes/vtypes";

export const nullConnCallback: ConnectionChangedCallback = (_p, _v): void => {};
export const nullValueCallback: ValueChangedCallback = (_p, _v): void => {};
Expand All @@ -11,12 +11,12 @@ export type ConnectionChangedCallback = (
pvName: string,
value: ConnectionState
) => void;
export type ValueChangedCallback = (pvName: string, value: NType) => void;
export type ValueChangedCallback = (pvName: string, value: VType) => void;

export interface Connection {
subscribe: (pvName: string) => void;
putPv: (pvName: string, value: NType) => void;
getValue: (pvName: string) => NType;
putPv: (pvName: string, value: VType) => void;
getValue: (pvName: string) => VType;
connect: (
connectionCallback: ConnectionChangedCallback,
valueCallback: ValueChangedCallback
Expand Down
Loading