import React, { Component } from "react"; import _ from "lodash"; import { connect } from "react-redux"; import { FlexibleWidthXYPlot, LineSeries, VerticalGridLines, HorizontalGridLines, XAxis, YAxis, DiscreteColorLegend } from "react-vis"; // import "../../../node_modules/react-vis/dist/style.css"; import { color } from "d3-color"; import { interpolateRgb } from "d3-interpolate"; import LiquidFillGauge from "react-liquid-gauge"; import { RadialGauge } from "react-canvas-gauges"; /** Class for Main Page * * @extends React.Component */ class Main extends Component { /** * Map an array of objects to a graph-usable array of objects * * @param {Array} values - list of objects with timestame and value properties * * @returns {Array} list of objects with x and y properties */ mapTimestampAndValuePropToXY(values){ return _.map(values, (val) => { return {x: val.timestamp, y: val.value}; }); } /** * Renders a Liquid Gauge. * * @param {object} tag - the tag structure * @param {string} units - units for the tag * @param {number} maxValue - maximum value to be displayed * @param {number} label - label for the value (typically the tag name) * @returns {ReactElement} liquidGauge */ renderLiquidGauge(tag, units, maxValue, label){ if (!tag){ return ; } const tagValue = tag.value; const endColor = "#1F4788"; const startColor = "#dc143c"; const radius = 100; const interpolate = interpolateRgb(startColor, endColor); const fillColor = interpolate(tagValue / maxValue); const gradientStops = [ { key: "0%", stopColor: color(fillColor).darker(0.5).toString(), stopOpacity: 1, offset: "0%" }, { key: "50%", stopColor: fillColor, stopOpacity: 0.75, offset: "50%" }, { key: "100%", stopColor: color(fillColor).brighter(0.5).toString(), stopOpacity: 0.5, offset: "100%" } ]; return (

{label}

{ const value = Math.round(tagValue); const radius = Math.min(props.height / 2, props.width / 2); const textPixels = (props.textSize * radius / 2); const valueStyle = { fontSize: textPixels }; const percentStyle = { fontSize: textPixels * 0.6 }; return ( {value} {props.percent} ); }} riseAnimation waveAnimation waveFrequency={3} waveAmplitude={2} gradient gradientStops={gradientStops} circleStyle={{ fill: fillColor }} waveStyle={{ fill: fillColor }} textStyle={{ fill: color("#444").toString(), fontFamily: "Arial" }} waveTextStyle={{ fill: color("#fff").toString(), fontFamily: "Arial" }} />
); } /** * Renders a radial gauge. * * @param {Object} tag - the tag structure * @param {string} units - units for the tag * @param {number} maxValue - maximum value to be displayed * @param {number} label - label for the value (typically the tag name) */ renderRadialGauge(tag, units, maxValue, label){ if (!tag){ return ; } const ticks = [ 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 ]; return (

{label}

t * maxValue)} minorTicks={2} >
); } /** * render * * @returns {ReactElement} markup */ render(){ if (!this.props.tagHistory){ return(

Loading...

); } if (this.props.plc.error){ return(

PLC Error

{this.props.plc.error}

); } if (Object.keys(this.props.tags).length === 0){ return(

Waiting for data...

); } return (

Process Values

{this.renderLiquidGauge(this.props.tags.val_FluidLevel, "ft.", 500, "Level")} {this.renderRadialGauge(this.props.tags.val_Flowmeter_BarrelsPerDay, "BPD", 5000, "Flow Rate")} {this.renderRadialGauge(this.props.tags.val_TubingPressure, "PSI", 400, "Tubing Pressure")}

VFD Data

{this.renderRadialGauge(this.props.tags.VFD_OutCurrent, "A.", 100, "Current")} {this.renderRadialGauge(this.props.tags.VFD_SpeedFdbk, "Hz", 60, "Frequency")}
); } } /** * Map Redux state to React props * * @param {Object} state * * @returns {Object} mapped state */ function mapStateToProps(state){ return { tags: state.tags, tagHistory: state.tagHistory, plc: state.plc }; } export default connect(mapStateToProps)(Main);