import React, { TouchEvent } from 'react'; import { useSubscribeString, usePublishAnalog, useSubscribeAnalog } from 'react-ch5'; import logo from './assets/logo.svg'; import avsp from './assets/avsp.png'; import './App.css'; import PushButton from './components/PushButton'; // TODO set this to your machine name or IP address on the same network as the panel to see live updating version via the "navigate there" link // if this is set to your dev machine, when you run "yarn start", then click the "navigate there" link on the panel, you will have live hot-module-reload const devMachine = "my-laptop"; const InterlockedButtons = () => ( <> Interlocked: <PushButton publishSignalName="21" subscribeSignalName="21" >A</PushButton> <PushButton publishSignalName="22" subscribeSignalName="22" >B</PushButton> <PushButton publishSignalName="23" subscribeSignalName="23" >C</PushButton> <PushButton publishSignalName="24" subscribeSignalName="24" >D</PushButton> </> ) const ToggleButtons = () => ( <> Toggles: <PushButton publishSignalName="31" subscribeSignalName="31" >1</PushButton> <PushButton publishSignalName="32" subscribeSignalName="32" >2</PushButton> </> ) type StringDivProps = { stringsubscribeSignalName: string, } const StringDiv: React.FunctionComponent<StringDivProps> = (props) => { const value = useSubscribeString(props.stringsubscribeSignalName); return <div style={{ margin: '0 1rem', display: "flex", justifyContent: 'center', alignItems: 'center', border: '5px solid black', width: '20rem', height: '4rem', backgroundColor: '#aaa' }}>{value}</div>; } type AnalogDivProps = { analogSendSignalName: string, analogsubscribeSignalName: string, } function clamp(value: number, min: number, max: number) { if (value < min) return min; else if (value > max) return max; return value; } const AnalogDiv: React.FunctionComponent<AnalogDivProps> = (props) => { const publish = usePublishAnalog(props.analogSendSignalName); const value = useSubscribeAnalog(props.analogsubscribeSignalName); const divref = React.useRef<HTMLDivElement>(null); const percent = value * 100 / 65535; const percentString = percent + '%'; const touch = (event:TouchEvent<HTMLDivElement>) => { if (divref.current) { const clientRect = divref.current.getBoundingClientRect(); const width = clientRect.right - clientRect.left; for (var i = 0; i < event.changedTouches.length; i++) { const value = clamp(Math.round(65535 * (event.changedTouches[i].pageX - clientRect.left) / width), 0, 65535); publish(value); console.log(value); } } } return ( <div ref={divref} onTouchStart={touch} onTouchMove={touch} style={{ margin: '0 1rem', border: '1px solid black', display: 'inline-block', width: '20rem', height: '4rem', backgroundColor: '#aaa' }}> <div style={{backgroundColor: '#2f2', width: percentString, height: '4rem'}}></div> </div> ); } const Container: React.FunctionComponent = (props) => ( <div className="App-container"> {props.children} </div> ) const VolumeControl = () => ( <> Volume: <PushButton publishSignalName="35" subscribeSignalName="35" >-</PushButton> <AnalogDiv analogSendSignalName="21" analogsubscribeSignalName="21" /> <PushButton publishSignalName="34" subscribeSignalName="34" >+</PushButton> </> ) function App() { return ( <div className="App"> <header className="App-header"> <div className="App-wrap-logo"> <img src={logo} className="App-logo" alt="react logo" /> <img src={avsp} className="App-logo" alt="avsp logo" /> </div> <div> <p> Configure your development machine's address in the top of <code>App.tsx</code>, it is currently set to <code>{devMachine}</code><br /> Use <code>yarn start</code> then <a href={"http://" + devMachine + ":3000/"}>navigate there</a> to see live updates<br /> Edit <code>src/App.tsx</code> and save to reload </p> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> </div> <div> <Container><InterlockedButtons /><StringDiv stringsubscribeSignalName="21" /></Container> <Container><ToggleButtons /></Container> <Container><VolumeControl /></Container> </div> </header> <footer> {window.location.href /* this way, we can see whether we are looking at internal panel url or live dev server*/} </footer> </div> ); } export default App;