{"version":3,"sources":["waterlinked_logo.svg","Components/ErrorBoundary.js","lib/format.js","Stores/Velocity.js","Stores/Fusion.js","Stores/Orientation.js","Stores/Version.js","Stores/Trail.js","Toast.js","Stores/WarningMessagesStore.js","Stores/ConnectionStatusStore.js","lib/ws.js","Stores/use-stores.js","Components/Map/DeadReckoningStatus.js","Components/Map/Marker.js","Components/Map/Grid.js","Components/Map/Trail.js","Components/Map/Position.js","Components/Map/Coordinates.js","Components/HelpText.js","Components/Map/Buttons.js","Components/Map/PositionMap.js","Components/DopplerDetails.js","lib/fetch.js","Components/DopplerDirection.js","Components/DopplerVertical.js","Components/DeadReckoningStatus.js","Routes/Dashboard.js","Components/CorrelatorGraph.js","Components/useLongpress.js","Components/LEDButton.js","Components/SignalStrength.js","Components/Debug/StatusView.js","Components/RangeMode.js","Components/ConfigGeneric.js","Components/PeriodicCycling.js","Routes/Diagnostic.js","lib/useForm.js","Components/FactoryResetButton.js","Components/ExpandableSettings.js","lib/validator.js","Components/ButtonSelector.js","Components/FormStore.js","Components/ApplyFeedbackButton.js","Components/ConfigNetwork.js","Components/ConfigTime.js","Components/RebootButton.js","Routes/Config.js","Components/ReleaseNotes.js","Components/VersionInfo.js","Routes/About.js","lib/useEditable.js","Routes/Outputs.js","Routes/Collect.js","Routes/Debug.js","Components/ProductNameAndVersion.js","lib/helpers.js","Stores/NetworkConfig.js","Components/Warnings/WarningMessages.js","Components/Warnings/WarnIMUReset.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","ErrorBoundary","props","state","error","errorInfo","console","log","this","setState","Message","icon","Icon","name","Content","Header","style","whiteSpace","toString","componentStack","children","React","Component","formatDecimals","val","digits","parseFloat","toLocaleString","navigator","language","minimumFractionDigits","maximumFractionDigits","RoundDecimalPlaces","pow","Math","round","GetArrayIndexOrFallback","arr","idx","fallback","undefined","IsDefinedFinite","obj","isFinite","times","Velocity","vx","vy","vz","fom","altitude","velocity_valid","range_mode","beam_nsd","beam_rssi","beam_velocity","beam_distance","beam_valid","fps","loadSuccess","isLoading","loadingError","isRunning","speed","sqrt","isNaN","horizontalSpeed","horizontalStationary","direction","atan2","PI","map","d","id","velocity","distance","rssi","nsd","snr","lock","now","performance","length","shift","push","data","addFpsEntry","std","t","transducers","i","is_valid","axios","get","then","response","setTimeout","fetch","catch","e","decorate","observable","computed","verticalSpeed","action","setFromWs","updateFps","FusionStore","mode","connected","ip_address","positionLocal","positionLocalStd","velocityStd","rollPitchYaw","setPositionFromWs","setPositionStdFromWs","setVelocityFromWs","setVelocityStdFromWs","rad2deg","rad","deg","OrientationStore","pitch","roll","yaw","pitchDeg","rollDeg","yawDeg","VersionStore","hasChecked","isLatest","latestRelease","url","updateAvailable","loading","chipid","version","baseUrl","post","current","status","Error","is_latest","latest_release","err","AboutInfoStore","versionShort","versionStore","TrailStore","trail","localStorage","getItem","parsed","JSON","parse","initTrail","trailSeconds","parseInt","initTrailSeconds","trailFrequency","reducedLength","fullResLength","wait","localStorageTimer","fullResolution","slice","ratio","ceil","reducedResolution","filter","value","index","Arr","setItem","position","xyPos","toFixed","unshift","stringify","reducedTrail","addPostition","setTrailLength","bound","resetTrail","Notyf","duration","x","y","dismissible","ripple","types","type","background","MessageModel","message","severity","visible","numericSeverity","dismiss","severityCompare","a","b","MessageStore","hasLoaded","isStoring","messageRegistry","toastsActive","Map","size","values","Array","from","keys","sort","clear","set","has","addMessageIfNotExists","removeIds","addMessage","toast","toastMaster","open","idList","forEach","delete","timeout","currentIds","remove","allIds","indexOf","setConnectionClosed","count","all","allSorted","startFetching","stopFetching","setConnectionOpen","ConnectionStatusStore","is_connected","setConnected","wsUrl","proto","window","location","protocol","host","velocityStore","VelocityStore","fusionStore","orientationStore","aboutInfoStore","warningMessageStore","WarningMessageStore","connectionStatusStore","trailStore","setInterval","socket","ReconnectingWebSocket","onopen","onclose","onmessage","json","raw","channel","payload","setRollPitchYawFromWs","setPositionLocalFromWs","setPositionLocalStdFromWs","updateStores","storesContext","createContext","useStores","useContext","DeadReckoningDetails","positionStd","Table","unstackable","basic","compact","zIndex","right","bottom","backgroundColor","width","padding","Body","Row","textAlign","Cell","paddingLeft","colSpan","singleLine","border","DeadReckoningStatus","observer","origoIcon","iconUrl","iconSize","iconAnchor","OrigoMarker","description","Marker","Popup","generateGrid","gridSize","gridRange","grid","delta","min","max","AcousticGrid","range","inner","latLng","transform","Grid","Polyline","key","positions","color","opacity","weight","propTypes","PropTypes","number","shape","isRequired","bringToFrontTimer","Trail","createPathComponent","context","instance","L","smoothFactor","overlayContainer","setLatLngs","bringToFront","Position","center","StdCircle","circleRef","useRef","useEffect","circleSize","Circle","ref","radius","dvlIcon","height","divIcon","className","html","ReactDOMServer","renderToString","alt","src","DvlMarker","zIndexOffset","Coordinates","left","fontSize","HeaderWithHelp","heading","help","as","text","HelpPopup","trigger","content","on","Buttons","isFullScreen","setIsFullscreen","setGridSize","Button","Group","vertical","top","ButtonPanMap","label","title","iconName","Dropdown","Menu","ButtonFullscreen","fullscreenOptions","userAgent","eventHandlers","enterFullscreen","event","target","fullscreenControl","link","firstElementChild","classList","add","exitFullscreen","onClick","panTo","labelPosition","ButtonResetFusion","method","r","lat","lng","ButtonResetGyro","asButton","useState","setOpen","submitInProgress","setSubmitInProgress","Item","onMouseDown","document","Modal","Description","Actions","disabled","res","mutate","positive","ButtonTrail","menuText","setMenuText","item","simple","pointing","Divider","ButtonGrid","outside","num","bounds","PositionMap","setMap","setCenter","zoom","setZoom","setGridRange","pos","getBounds","_southWest","_northEast","setView","MapContainer","whenCreated","maxZoom","crs","CRS","Simple","ScaleControl","MapEvents","updateGrid","mapEvents","getZoom","getCenter","useMapEvents","zoomend","moveend","resize","DopplerDetails","validAltitude","setValidAltitude","validSpeed","setValidSpeed","validFom","setValidFom","columns","paddingTop","paddingRight","fetcher","headers","DopplerDirectionInner","screenDirection","clampSpeed","cos","sin","velocityValidColor","viewBox","orient","markerWidth","markerHeight","refX","refY","fill","fillOpacity","cx","cy","stroke","strokeOpacity","strokeWidth","x1","y1","x2","y2","markerEnd","mounting_rotation_offset","points","DopplerDirection","useSWR","DopplerVerticalDirection","speedValue","abs","ShowDopplerDetails","ShowDopplerDirection","ShowDopplerVertical","DopplerVertical","Dashboard","Segment","attached","divided","Column","mobile","tablet","computer","largeScreen","widescreen","centered","transducer_colors","legendKeys","Axis","axis","axisCreator","select","GraphGrid","GridLayoutPopup","onHandleEvent","setGraphAxisType","onYMnValueChange","evt","setCustomYMin","onYMxValueChange","setCustomYMax","Form","Field","Radio","checked","graphDisplay","onChange","Input","defaultValue","customYMx","customYMn","float","Legends","mod","legendTitleFont","legendTextFont","ltx","lty","circleR","circleX","circleY","textX","textY","yDelta","legendsTransform","textDecorationLine","fontWeight","GraphInner","margin","outerWidth","outerHeight","legendsMarginTop","legendsMarginRight","canvasRef","yMin","yMax","x_min","graph","px","x_max","_yMx","customYAxisMax","_yMn","customYAxisMin","y_extents","extent","py","y_min","y_max","xScale","scaleLinear","domain","nice","yScale","getContext","nWidth","canvas","clientWidth","nHeight","clientHeight","ctx","clearRect","tr","beginPath","strokeStyle","lineWidth","lineTo","drawPoint","xAxis","axisBottom","yAxis","axisLeft","xAxisTop","axisTop","xTransform","yTransform","labelXTransform","labelYTransform","gridX","tickSize","tickFormat","gridY","hidden","marginBottom","marginLeft","marginTop","overflow","labelX","labelY","killInf","NaN","downsample","x_scale","y_scale","x_offset","y_offset","dataPrPixel","r0","r1","r2","r3","buckets","bucketSize","bucket","arguments","BucketSampler","geometry","CorrelatorGraphFetcher","active","changeCustomAxisYMinValue","changeCustomAxisYMaxValue","x_display_name","interval","defYMin","defYMax","clearInterval","createMedia","breakpoints","sm","md","lg","xl","MediaContextProvider","Media","Graph","at","greaterThanOrEqual","preventDefault","isTouchEvent","touches","useLongPress","onLongPress","shouldPreventDefault","delay","longPressTriggered","setLongPressTriggered","start","useCallback","addEventListener","passive","shouldTriggerClick","clearTimeout","removeEventListener","onTouchStart","onMouseUp","onMouseLeave","onTouchEnd","useLedBlink","isActive","setIsActive","isSubmitFail","setIsSubmitFail","ok","LEDButton","WaterLinkedLogoWithLedBlink","withRouter","history","blinkLed","longPressEvent","Image","wrapped","logo","marginRight","clamp","SignalStrengthImage","_bars","bars","verticalAlign","innerHeight","rx","unitHeight","SignalStrengthIcon","NoiseStrengthImage","percent","split","NoiseStrengthIllustration","desc","TableRow","StatusView","detailed","collapsing","refreshInterval","dedupingInterval","temperature","cpu_load","disk_free","Object","entries","shallowerDistance","deeperDisance","shallowestToDistance","deeperstToDistance","ShowRangeModeURIIfNotAuto","warn","URI","shallowest","deepest","ForceRangeModeSetting","ForceRangeModeSettingInner","lowerMode","upperMode","options","body","submitMessage","setSubmitMessage","setLowerMode","setUpperMode","change","submit","PostForceRangeMode","ApplyGenericConfig","speedOfSound","acousticEnabled","darkModeEnabled","mountingOffset","periodicCyclingEnabled","speed_of_sound","Number","acoustic_enabled","dark_mode_enabled","periodic_cycling_enabled","ShowIfPeriodicCyclingIsDisabled","PeriodicCyclingSetting","PeriodicCyclingSettingInner","setChecked","result","Checkbox","toggle","VelocityDetail","VelocityDetailsInternal","ValidIcon","store","TransducerDetail","TransducerOverview","Diagnostic","horizontal","stackable","useForm","callback","validate","initial","setValues","errors","setErrors","isSubmitting","setIsSubmitting","handleChange","handleSubmit","FactoryResetButton","isSubmitSuccess","setIsSubmitSuccess","submitError","setSubmitError","reset","header","onOpen","ExpandableSettings","rules","convFactor","decimals","String","ErrorList","first","field","list","reduce","acc","cur","Validator","input","passes","isArray","rule","ButtonSelector","GenericFormStore","extendObservable","getFlattenedValues","valueKey","form","toJS","fields","getFlattenedAbsoluteValues","convFunc","getFlattenedAbsoluteMetricValues","toMetric","onFieldChange","validation","factor","meta","unitFactor","unitDecimals","isValid","onAbsoluteMetricFieldChange","negated","toUserPrefered","getAbsolute","getAbsoluteMetric","setError","errMsg","SimpleFormInput","Configurator","FormSetupError","FormIsLoading","ApplyFeedbackButton","storeSuccess","storeFailure","warning","remap","NetworkConfigFormView","widths","fluid","address","prefix","gateway","dns","NetworkConfig","inject","networkConfigStore","formStore","dhcp","storeError","onChangeStore","info","CurrentNetwork","localeCompare","entry","Network","SetNTP","ntp_server","SetManual","time","refreshNTP","CurrentNTPServer","date","Date","ntp_enabled","ntp_synchronized","NTPSet","ntpServer","setNtpServer","onSubmit","negative","ManualSet","currentTime","setCurrentTime","secTimer","toISOString","NTPConfig","ntpEnabled","setNTPEnabled","FetchNTP","RebootButton","statusText","Promise","reject","SetGyro","HelpText","isNumberWithin","ConfigForm","checkStatus","onChangeCheckBox","Config","configData","configError","ReleaseItemList","items","ReleaseNote","changes","knownIssues","defaultExpanded","expanded","setExpanded","ReleaseNotes","revalidateOnFocus","IconWithTitle","VersionOK","VersionNeedsUpdate","href","VersionLoadError","UpdateAvailableIcon","VersionStatusIconView","VersionDetail","updateURL","List","relaxed","Label","LoadingMessage","ErrorMessage","VersionView","About","useEditable","isEdit","setIsEdit","ShowRow","ShowRowIfTruthy","ApplyOutputSettings","port","format","clients","onSubmitHandler","stopEdit","validatePorts","EditPort","validBaudRates","slowBaudRates","validateBaudRate","includes","join","baudRateOptions","rate","EditBaudRate","button","validateFormat","availableFormats","formatOptions","formatNameSortedByCapacity","capacity","BaudRateWarning","EditFormat","ValueWithEditIcon","editable","startEdit","ShowValueOrEditPort","ShowValueOrEditBaudRate","ShowValueOrEditFormat","initialValue","ShowProtocol","portIsEditable","isSerial","formatValue","formatId","OutputInner","el","OutputRoute","SelectDuration","onSelectDuration","flowing","ButtonGroup","Collect","setDescription","setDuration","TextArea","placeholder","onInput","rows","Debug","ProductNameAndVersion","s","include_title","productVersion","variant","productName","product_name","charAt","toUpperCase","version_short","NetworkConfigFormStore","NetworkConfigStore","put","success","ShowWarning","paddingBottom","severityToColorMapping","code","WarningMessages","messages","WarningMessagesView","severityToColor","buttonColor","buttonIcon","buttonTitle","onDismiss","WarnIMUReset","setVisible","need_reset","App","menuVisible","setMenuVisible","navigate","secondary","display","inverted","Responsive","minWidth","maxWidth","Sidebar","Pushable","minHeight","animation","to","exact","path","render","component","Outputs","Boolean","hostname","match","ReactDOM","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.e75abc52.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/waterlinked_logo.207ebab4.svg\";","import React from 'react';\nimport { Message, Icon } from 'semantic-ui-react'\n\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { error: null, errorInfo: null };\n }\n\n componentDidCatch(error, errorInfo) {\n console.log(\"Error boundary\")\n this.setState({\n error: error,\n errorInfo: errorInfo,\n });\n // TODO: Log error to some service in case the user has innernet access\n }\n\n render() {\n if (this.state.errorInfo) {\n // You can render any custom fallback UI\n return (\n \n \n \n Woops\n

The component stopped working. If this failure happens again,\n please record the steps you have taken which triggered the failure\n and notify Water Linked with the details below.

\n
\n {this.state.error && this.state.error.toString()}\n
\n {this.state.errorInfo.componentStack}\n
\n
\n
\n )\n }\n // Rendering the children if no error occured\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary","function formatDecimals(val, digits=2) {\n val = parseFloat(val)\n return val.toLocaleString(navigator.language, {minimumFractionDigits: digits, maximumFractionDigits: digits})\n}\n\nfunction RoundDecimalPlaces(val, digits=2) {\n let pow = Math.pow(10, digits)\n return Math.round(val * pow) / pow\n}\n\nfunction GetArrayIndexOrFallback(arr, idx, fallback) {\n if (arr === undefined) {\n return fallback\n }\n if (arr[idx] === undefined) {\n return fallback\n }\n return arr[idx]\n}\n\nfunction IsDefinedFinite(obj, name) {\n if (!(name in obj)) {\n // Don't exist in obj\n return false;\n }\n if (typeof obj[name] !== 'number') {\n // Not a number\n return false;\n }\n // Is defined?\n return isFinite(obj[name])\n}\n\nconst NoValue = -1e6\n\nexport { formatDecimals, RoundDecimalPlaces, GetArrayIndexOrFallback, IsDefinedFinite, NoValue }\n","import { observable, action, decorate, computed } from 'mobx'\nimport axios from 'axios'\nimport { GetArrayIndexOrFallback, IsDefinedFinite, NoValue } from '../lib/format'\n\nconst times = [];\n\nclass Velocity {\n // Observable values\n vx = 0\n vy = 0\n vz = 0\n fom = 0\n altitude = 0\n velocity_valid = false\n range_mode = -1\n beam_nsd = [0, 0, 0, 0]\n beam_rssi = [0, 0, 0, 0]\n beam_velocity = [0, 0, 0, 0]\n beam_distance = [0, 0, 0, 0]\n beam_valid = [0, 0, 0, 0]\n fps = 0\n\n // Fetching state\n loadSuccess = false\n isLoading = true\n loadingError = \"\"\n isRunning = false\n\n // Computed values\n get speed() {\n // Total speed\n var speed = Math.sqrt(this.vx*this.vx + this.vy*this.vy + this.vz*this.vz)\n if (isNaN(speed)) {\n speed = 0\n }\n return speed\n }\n\n\n get horizontalSpeed() {\n // Horizontal speed\n var speed = Math.sqrt(this.vx*this.vx + this.vy*this.vy + this.vz*this.vz)\n if (isNaN(speed)) {\n speed = 0\n }\n return speed\n }\n\n get verticalSpeed() {\n // Convenience function for vertical speed\n return this.vz\n }\n\n get horizontalStationary() {\n return this.horizontalSpeed < 0.1\n }\n\n get direction() {\n // Horizontal direction\n if (this.horizontalStationary) {\n return 0.0\n }\n\n var direction = 180.0 * Math.atan2(this.vy, this.vx) / Math.PI\n if (direction < 0) {\n direction += 360\n }\n if (isNaN(direction)) {\n direction = 0\n }\n return direction\n }\n\n get transducers() {\n // The HTTP API is not transducer oriented, so we need to remap\n // to work better with React\n return [0, 1, 2, 3].map(d => {\n return {\n id: d,\n velocity: GetArrayIndexOrFallback(this.beam_velocity, d, NoValue),\n distance: GetArrayIndexOrFallback(this.beam_distance, d, NoValue),\n rssi: GetArrayIndexOrFallback(this.beam_rssi, d, NoValue),\n nsd: GetArrayIndexOrFallback(this.beam_nsd, d, NoValue),\n snr: GetArrayIndexOrFallback(this.beam_rssi - this.beam_nsd +42, d, NoValue),\n lock: GetArrayIndexOrFallback(this.beam_valid, d, 0) > 0,\n }\n })\n }\n\n // updateFPS removes the old entries from the log and updates \"fps\" to\n // the frames per second for averaged over \"avgTime\"\n updateFps() {\n const avgTime = 3; // seconds to average over\n const now = performance.now();\n // Remove entries older than \"avgTime\" from the list\n while (times.length > 0 && times[0] <= now - 1000*avgTime) {\n times.shift();\n }\n // update frames pr second\n if (times.length === 0) {\n this.fps = 0;\n return;\n }\n this.fps = times.length / avgTime;\n }\n\n // addFpsEntry adds a new velocity measurement to the list of measurements\n addFpsEntry() {\n const now = performance.now();\n times.push(now);\n }\n\n // Actions\n setFromWs(data) {\n this.addFpsEntry();\n if (IsDefinedFinite(data, \"vx\")) {this.vx = data.vx}\n if (IsDefinedFinite(data, \"vy\")) {this.vy = data.vy}\n if (IsDefinedFinite(data, \"vz\")) {this.vz = data.vz}\n if (IsDefinedFinite(data, \"std\")) {this.fom = data.std /* TODO: Rename \"std\" to \"fom\" in backend */}\n if (IsDefinedFinite(data, \"altitude\")) {this.altitude = data.altitude}\n if (IsDefinedFinite(data, \"range_mode\")) {this.range_mode = data.range_mode}\n this.velocity_valid = (data.velocity_valid ? true : false)\n\n const t = data.transducers\n for (let i=0; i<4; i++) {\n this.beam_distance[i] = t[i].distance || 0\n this.beam_velocity[i] = t[i].velocity || 0\n this.beam_nsd[i] = t[i].nsd ||0\n this.beam_rssi[i] = t[i].rssi || 0\n this.beam_valid[i] = t[i].is_valid ? 1 : 0\n }\n }\n\n fetch() {\n if (!this.isRunning) { return false }\n this.isLoading = true\n axios.get('/api/v1/velocity')\n .then(response => {\n this.addFpsEntry();\n this.loadSuccess = true\n this.isLoading = false\n this.loadingError = \"\"\n if (IsDefinedFinite(response.data, \"vx\")) {this.vx = response.data.vx}\n if (IsDefinedFinite(response.data, \"vy\")) {this.vy = response.data.vy}\n if (IsDefinedFinite(response.data, \"vz\")) {this.vz = response.data.vz}\n if (IsDefinedFinite(response.data, \"fom\")) {this.fom = response.data.fom}\n if (IsDefinedFinite(response.data, \"altitude\")) {this.altitude = response.data.altitude}\n if (IsDefinedFinite(response.data, \"range_mode\")) {this.range_mode = response.data.range_mode}\n (response.data.velocity_valid) ? this.velocity_valid = response.data.velocity_valid : this.velocity_valid = false\n this.beam_distance = response.data.beam_distance\n this.beam_velocity = response.data.beam_velocity\n this.beam_nsd = response.data.beam_nsd\n this.beam_rssi = response.data.beam_rssi\n this.beam_valid = response.data.beam_valid\n setTimeout(() => this.fetch(), 200) // 200ms seems like a good trade-off between CPU usage and update speed\n })\n .catch((e) => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = e.toString()\n\n this.vx = 0\n this.vy = 0\n this.vz = 0\n this.fom = 1000\n this.altitude = -1\n this.velocity_valid = false\n this.range_mode = -1\n this.beam_distance = [0,0,0,0]\n this.beam_velocity = [0,0,0,0]\n this.beam_nsd = [0,0,0,0]\n this.beam_rssi = [0,0,0,0]\n this.beam_valid = [0,0,0,0]\n\n console.log(\"error\", e)\n setTimeout(() => this.fetch(), 2000)\n })\n }\n\n startFetching() {\n if (this.isRunning) {\n console.log(\"already running\")\n return false\n }\n this.isRunning = true\n this.fetch()\n }\n stopFetching() {\n console.log(\"stopping\")\n this.isRunning = false\n }\n}\n\ndecorate(Velocity, {\n vx: observable,\n vy: observable,\n vz: observable,\n altitude: observable,\n velocity_valid: observable,\n beam_distance: observable,\n beam_velocity: observable,\n beam_nsd: observable,\n beam_rssi: observable,\n beam_valid: observable,\n fps: observable,\n speed: computed,\n horizontalSpeed: computed,\n verticalSpeed: computed,\n horizontalStationary: computed,\n direction: computed,\n transducers: computed,\n fetch: action,\n setFromWs: action,\n updateFps: action,\n addFpsEntry: action,\n})\n\nexport default Velocity\n","import { observable, decorate, action } from 'mobx'\nimport axios from 'axios'\n\nclass FusionStore {\n // Observable values\n mode = \"Idle\"\n connected = false\n ip_address = \"Unknown\"\n\n positionLocal = [0,0,0]\n positionLocalStd = 0\n velocity = [0,0,0]\n velocityStd = 0\n rollPitchYaw = [0,0,0]\n\n\n // Fetching state\n loadSuccess = false\n isLoading = true\n loadingError = \"\"\n isRunning = false\n\n fetch() {\n if (!this.isRunning) { return false }\n this.isLoading = true\n axios.get('/api/v1/fusion/status')\n .then(response => {\n this.loadSuccess = true\n this.isLoading = false\n this.loadingError = \"\"\n\n this.mode = response.data[\"mode\"]\n this.connected = response.data[\"fusion_connected\"]\n this.ip_address = response.data[\"ip_address\"]\n setTimeout(() => this.fetch(), 200) // 200ms seems like a good trade-off between CPU usage and update speed\n })\n .catch((e) => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = e.toString()\n\n this.mode = \"Idle\"\n this.connected = false\n\n console.log(\"error\", e)\n setTimeout(() => this.fetch(), 1000)\n })\n }\n \n setPositionLocalFromWs(data) {\n this.positionLocal = data\n }\n setPositionLocalStdFromWs(data) {\n this.positionLocalStd = data\n }\n setVelocityFromWs(data) {\n this.velocity = data\n }\n setVelocityStdFromWs(data) {\n this.velocityStd = data\n }\n setRollPitchYawFromWs(data) {\n this.rollPitchYaw = data\n }\n\n startFetching() {\n if (this.isRunning) {\n console.log(\"already running\")\n return false\n }\n this.isRunning = true\n this.fetch()\n }\n stopFetching() {\n console.log(\"stopping\")\n this.isRunning = false\n }\n}\n\ndecorate(FusionStore, {\n positionLocal: observable,\n positionLocalStd: observable,\n velocity: observable,\n velocityStd: observable,\n rollPitchYaw: observable,\n mode: observable,\n connected: observable,\n ip_address: observable,\n setPositionFromWs:action,\n setPositionStdFromWs:action,\n setVelocityFromWs:action,\n setVelocityStdFromWs:action\n})\n\nexport default FusionStore\n","import { observable, computed, decorate, action } from 'mobx'\nimport qte from 'quaternion-to-euler';\nimport axios from 'axios'\n\nfunction rad2deg(rad) {\n let deg = 180 * rad / Math.PI\n if (deg < 0) {\n return (360 + deg)\n }\n if (deg > 360) {\n return (deg - 360)\n\n } else {\n return deg\n }\n}\n\nclass OrientationStore {\n // Observable values\n pitch = 0\n roll = 0\n yaw = 0\n\n // Fetching state\n loadSuccess = false\n isLoading = false\n loadingError = \"\"\n isRunning = false\n\n // Computed values\n get pitchDeg() {\n return rad2deg(this.pitch)\n }\n\n get rollDeg() {\n return rad2deg(this.roll)\n }\n get yawDeg() {\n return rad2deg(this.yaw)\n }\n\n fetch() {\n if (!this.isRunning) { return false }\n this.isLoading = true\n //axios.get('/api/v1/orientation')\n axios.get(\"/api/v1/imu/\")\n .then(response => {\n this.loadSuccess = true\n this.isLoading = false\n this.loadingError = \"\"\n if (false) {\n var euler = qte([response.data.x, response.data.y, response.data.z, response.data.w]);\n this.pitch = euler[0] // this.rad2deg(euler[0])\n this.roll = euler[1] //this.rad2deg(euler[1])\n this.yaw = euler[2] //this.rad2deg(euler[2])\n } else {\n this.yaw = response.data.yaw\n this.pitch = response.data.pitch\n this.roll = response.data.roll\n }\n setTimeout(() => this.fetch(), 500)\n })\n .catch((e) => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = e.toString()\n //console.log(this.loadingError)\n setTimeout(() => this.fetch(), 2000)\n })\n }\n startFetching() {\n if (this.isRunning) {\n console.log(\"orientation store already running\")\n return false\n }\n this.isRunning = true\n this.fetch()\n }\n stopFetching() {\n this.isRunning = false\n }\n}\n\ndecorate(OrientationStore, {\n rollPitchYaw:observable,\n pitch: observable,\n roll: observable,\n yaw: observable,\n pitchDeg: computed,\n rollDeg: computed,\n yawDeg: computed,\n fetch: action,\n setFromWs:action\n})\n\nexport default OrientationStore\n\n","import { decorate, observable } from 'mobx';\nimport axios from 'axios'\n\nclass VersionStore {\n // Observable values\n hasChecked = false\n isLatest = true\n latestRelease = \"\"\n url = \"\"\n updateAvailable = false\n loading = true\n error = \"\"\n\n fetch(chipid, version){\n //const baseUrl = \"http://127.0.0.1:8080\"\n const baseUrl = \"https://update.waterlinked.com\"\n axios.post(`${baseUrl}/api/v1/latest`, {\n chipid: chipid,\n current: version,\n })\n .then(response => {\n this.loading = false\n if (!response.status === 200) {\n throw Error(response)\n }\n return response.data\n })\n .then(data => {\n var url = data.url\n if (url[0] === \"/\") {\n url = baseUrl + url\n }\n this.isLatest = data.is_latest\n this.latestRelease = data.latest_release\n this.url = url\n this.loading = false\n this.error = \"\"\n this.hasChecked = true\n this.updateAvailable = this.hasChecked && !this.isLatest\n\n }).catch(err => {\n this.loading = false\n this.error = \"Request failed \" + err.toString()\n this.hasChecked = true\n })\n }\n}\n\ndecorate(VersionStore, {\n hasChecked: observable,\n isLatest: observable,\n latestRelease: observable,\n url: observable,\n updateAvailable: observable,\n loading: observable,\n error: observable,\n\n})\n\nclass AboutInfoStore {\n // Observable values\n version = \"unknown\"\n versionShort = \"unknown\"\n chipid = \"unknown\"\n isLoading = true\n versionStore = new VersionStore()\n\n // Fetching state\n loadSuccess = false\n loadingError = \"\"\n isRunning = false\n\n // Actions\n fetch() {\n if (!this.isRunning) { return false }\n this.isLoading = true\n axios.get('/api/v1/about')\n .then(response => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = \"\"\n this.chipid = response.data[\"chipid\"]\n this.version = response.data[\"version\"]\n this.versionShort = response.data[\"version_short\"]\n this.versionStore.fetch(this.chipid, this.versionShort)\n })\n .catch(err => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = \"Request failed \" + err.toString()\n console.log(\"error: \", err)\n setTimeout(() => this.fetch(), 5000)\n })\n }\n\n startFetching() {\n if (this.isRunning) {\n console.log(\"already running\")\n return false\n }\n this.isRunning = true\n this.fetch()\n }\n stopFetching() {\n console.log(\"stopping\")\n this.isRunning = false\n }\n}\n\ndecorate(AboutInfoStore, {\n chipid: observable,\n version: observable,\n versionShort: observable,\n isLoading: observable,\n versionStore: observable,\n\n})\n\nexport default AboutInfoStore\n","import { observable, decorate, action, computed } from 'mobx';\n\nconst initTrail = () => {\n if (localStorage.getItem('trail')) {\n try {\n const parsed = JSON.parse(localStorage.getItem('trail'));\n if (parsed?.length >= 1 && parsed[0]?.length === 2) {\n return parsed;\n }\n } catch (err) {\n console.log('ERR', err);\n return [];\n }\n }\n\n return [];\n};\nconst initTrailSeconds = () => {\n if (localStorage.getItem('trailSeconds')) {\n try {\n const parsed = parseInt(localStorage.getItem('trailSeconds'));\n if (parsed > 0) {\n return parsed;\n }\n } catch (err) {\n console.log('ERR', err);\n return 0;\n }\n }\n\n return 0;\n};\n\nclass TrailStore {\n trail = initTrail();\n trailSeconds = initTrailSeconds();\n trailFrequency = 3;\n reducedLength = 2500;\n fullResLength = 500;\n wait = null;\n localStorageTimer = null;\n\n //localStorage.getItem(\"trail\")? JSON.parse(localStorage.getItem(\"trail\"))\n\n get reducedTrail() {\n //this.trail = this.trail.filter(position=>!!position)\n if (this.trail.length > this.reducedLength) {\n const fullResolution = this.trail.slice(0, this.fullResLength);\n const ratio = Math.ceil(this.trail.length / this.reducedLength);\n const reducedResolution = this.trail.slice(this.fullResLength).filter(function (value, index, Arr) {\n return index % ratio === 0;\n });\n\n const reducedTrail = [...fullResolution, ...reducedResolution];\n return reducedTrail;\n }\n\n return this.trail;\n }\n\n resetTrail() {\n if (this.trail.length) {\n this.trail.length = 0;\n }\n localStorage.setItem('trail', '[]');\n }\n\n addPostition(position) {\n if (!this.trailSeconds || this.wait || !position || !position.length || position.length !== 3) {\n return;\n } else {\n this.wait = setTimeout(() => {\n this.wait = null;\n }, 1000 / this.trailFrequency);\n\n const xyPos = [parseFloat(position[0].toFixed(3)), parseFloat(position[1].toFixed(3))];\n\n this.trail.unshift(xyPos);\n\n if (this.trail.length > this.trailSeconds * this.trailFrequency) {\n this.trail.length = this.trailSeconds * this.trailFrequency;\n }\n\n if (!this.localStorageTimer) {\n this.localStorageTimer = setTimeout(() => {\n localStorage.setItem('trail', JSON.stringify(this.trail));\n this.localStorageTimer = null;\n }, 2000);\n }\n }\n }\n setTrailLength(trailSeconds) {\n this.trailSeconds = trailSeconds;\n localStorage.setItem('trailSeconds', trailSeconds);\n }\n}\n\ndecorate(TrailStore, {\n trail: observable,\n trailSeconds: observable,\n reducedTrail: computed,\n addPostition: action,\n setTrailLength: action.bound,\n resetTrail: action.bound,\n});\n\nexport default TrailStore;\n","import { Notyf } from 'notyf';\n\n/*\nToast is a popup notification shown to the user.\n\nSetup the Toast and all the supported classes.\n*/\nexport default new Notyf({\n duration: 0,\n position: {x: 'center', y: 'top'},\n dismissible: true,\n ripple: true,\n\n types: [\n {\n type: 'success',\n background: '#21ba45', // green\n icon: false,\n // icon: {\n // className: 'check circle icon',\n // tagName: 'i',\n // text: ''\n // }\n },\n {\n type: 'info',\n background: '#2185d0', // blue\n icon: false,\n // icon: {\n // className: 'check circle icon',\n // tagName: 'i',\n // text: ''\n // }\n },\n {\n type: 'warning',\n background: '#f2711c', // orange\n icon: false,\n // icon: {\n // className: 'exclamation icon',\n // tagName: 'i',\n // text: ''\n // }\n },\n {\n type: 'error',\n background: '#db2828', // red\n icon: false,\n // icon: {\n // className: 'exclamation icon',\n // tagName: 'i',\n // text: ''\n // }\n }\n ],\n})\n","import { computed, observable, action, decorate } from 'mobx'\nimport axios from 'axios'\nimport toastMaster from '../Toast';\n\nclass MessageModel {\n // Observable values\n id = 0\n message = \"\"\n severity = \"\"\n visible = true\n\n constructor(id, message, severity) {\n this.id = id\n this.message = message\n this.severity = severity\n this.visible = true\n }\n\n // Computed values\n get numericSeverity() {\n if (this.severity === \"error\") { return 2 }\n if (this.severity === \"warning\") { return 1 }\n return 0\n }\n\n // Actions\n dismiss() {\n console.log(\"dismissing\", this.id)\n this.visible = false\n }\n}\n\ndecorate(MessageModel, {\n id: observable,\n message: observable,\n severity:observable,\n visible: observable,\n numericSeverity: computed,\n dismiss: action,\n})\n\nconst temperature_high_id = 'warnings:temperature_high'\nconst connection_error_id = 'conn-err'\nconst connection_error_severity = 'error'\nconst connection_error_msg_lost = 'No connection with DVL. Reconnecting...';\nconst connection_error_msg_shutdown = 'No connection with DVL. The DVL is likely in thermal shutdown and will reboot once temperature lowers to 50 °C.';\n\n\nfunction severityCompare(a, b) {\n if (a.numericSeverity > b.numericSeverity) {\n return -1\n }\n if (a.numericSeverity < b.numericSeverity) {\n return 1\n }\n return 0\n}\n\nclass MessageStore {\n // Fetching state\n hasLoaded = false\n isLoading = false\n isStoring = false\n isRunning = false\n messageRegistry = observable.map()\n toastsActive = new Map()\n\n // Computed values\n get count(){\n return this.messageRegistry.size\n }\n get all(){\n return this.messageRegistry.values()\n }\n get allIds(){\n return Array.from(this.messageRegistry.keys())\n }\n get allSorted(){\n // Sort messages by priority\n let arr = Array.from(this.messageRegistry.values())\n return arr.sort(severityCompare)\n }\n\n // Actions\n clear(){\n this.messageRegistry.clear()\n }\n get(id){\n return this.messageRegistry.get(id)\n }\n addMessage(id, message, severity){\n this.messageRegistry.set(id, new MessageModel(id, message, severity))\n }\n setConnectionClosed() {\n if (this.messageRegistry.has(temperature_high_id)) {\n // Temperature high is asserted, show message indicating likely thermal shutdown\n this.addMessageIfNotExists(connection_error_id, connection_error_msg_shutdown, connection_error_severity)\n } else {\n // Normal disconnection message\n this.addMessageIfNotExists(connection_error_id, connection_error_msg_lost, connection_error_severity)\n }\n }\n setConnectionOpen() {\n this.removeIds([connection_error_id]);\n }\n addMessageIfNotExists(id, message, severity){\n if (!this.messageRegistry.has(id)) {\n this.addMessage(id, message, severity)\n }\n\n if (!this.toastsActive.has(id)) {\n // Toast is not already showing, add it\n let toast = toastMaster.open({\n type: severity,\n message: message\n })\n this.toastsActive.set(id, toast)\n }\n }\n removeIds(idList){\n idList.forEach(id => {\n this.messageRegistry.delete(id)\n if (this.toastsActive.has(id)) {\n // Remove toast, it is no longer relevant.\n const toast = this.toastsActive.get(id)\n toastMaster.dismiss(toast)\n this.toastsActive.delete(id)\n }\n })\n }\n fetch(){\n this.isLoading = true\n axios.get('/api/v1/warnings/', { timeout: 3000})\n .then(response => {\n this.hasLoaded = true\n this.isLoading = false\n this.loadingError = \"\"\n\n const currentIds = response.data.map(d => d.id)\n\n // Find ids in registry to that are no longer active\n const remove = this.allIds.filter(id => currentIds.indexOf(id) === -1)\n this.removeIds(remove)\n\n // Add new messages\n response.data.forEach(d => { this.addMessageIfNotExists(d.id, d.message, d.severity) })\n setTimeout(() => this.fetch(), 3000)\n\n })\n .catch(e => {\n console.log(\"err\", e)\n this.isLoading = false\n this.loadingError = e.toString()\n this.setConnectionClosed()\n setTimeout(() => this.fetch(), 3000)\n })\n }\n startFetching() {\n if (this.isRunning) {\n console.log(\"already running\")\n return false\n }\n this.isRunning = true\n this.fetch()\n }\n stopFetching() {\n console.log(\"stopping\")\n this.isRunning = false\n }\n}\n\ndecorate(MessageStore, {\n hasLoaded: observable,\n isLoading: observable,\n isStoring: observable,\n isRunning: observable,\n messageRegistry: observable,\n count: computed,\n all: computed,\n allIds: computed,\n allSorted: computed,\n clear: action,\n get: action,\n addMessage: action,\n addMessageIfNotExists: action,\n removeIds: action,\n fetch: action,\n startFetching: action,\n stopFetching: action,\n setConnectionClosed: action,\n setConnectionOpen: action,\n})\n\nexport default MessageStore\n","import { decorate, observable, action } from 'mobx';\n\nclass ConnectionStatusStore {\n // Observable values\n connected = false\n error = \"\"\n\n setConnected(is_connected) {\n this.connected = is_connected\n }\n}\n\ndecorate(ConnectionStatusStore, {\n connected: observable,\n error: observable,\n setConnected: action,\n\n})\n\nexport default ConnectionStatusStore\n","function wsUrl() {\n const proto = (window.location.protocol === \"https:\") ? \"wss\" : \"ws\"\n if (process.env.REACT_APP_DEVMODE === \"true\") {\n // Somehow the websocket proxy in setupProxy.js is not working.\n // This workaround is needed until that is fixed.\n //console.log(\"DEVELOPMENT\", proto, window.location.host)\n return proto + \"://127.0.0.1:8080/ws\"\n //return `${proto}://10.11.12.119:8080/ws`\n //return `${proto}://${window.location.host}/ws`\n\n\n }\n return `${proto}://${window.location.host}/ws`\n}\n\nexport default wsUrl\n\n// var connection = new WebSocket(\n// url.format({\n// protocol: window.location.protocol === 'https:' ? 'wss' : 'ws',\n// hostname: process.env.WDS_SOCKET_HOST || window.location.hostname,\n// port: process.env.WDS_SOCKET_PORT || window.location.port,\n// // Hardcoded in WebpackDevServer\n// pathname: process.env.WDS_SOCKET_PATH || '/sockjs-node',\n// slashes: true,\n// })\n// );\n// WDS_SOCKET_HOST=10.11.12.127 WDS_SOCKET_PORT=80 WDS_SOCKET_PATH=ws npm run start\n","import React from 'react';\nimport VelocityStore from './Velocity';\nimport FusionStore from './Fusion';\nimport OrientationStore from './Orientation';\nimport AboutInfoStore from './Version';\nimport TrailStore from './Trail';\nimport WarningMessageStore from './WarningMessagesStore';\nimport ConnectionStatusStore from './ConnectionStatusStore';\nimport ReconnectingWebSocket from 'reconnecting-websocket';\nimport wsUrl from '../lib/ws';\n\nlet velocityStore = new VelocityStore();\nlet fusionStore = new FusionStore();\nlet orientationStore = new OrientationStore();\nlet aboutInfoStore = new AboutInfoStore();\nlet warningMessageStore = new WarningMessageStore();\nlet connectionStatusStore = new ConnectionStatusStore();\nlet trailStore = new TrailStore();\n\n//orientationStore fetching is started when needed, don't need to start it here\naboutInfoStore.startFetching();\nwarningMessageStore.startFetching();\n\n// periodically update the fps display\nsetInterval(() => {\n velocityStore.updateFps();\n}, 1000);\n\nfunction updateStores() {\n const url = wsUrl();\n const socket = new ReconnectingWebSocket(url);\n\n socket.onopen = () => {\n console.log('store ws open');\n connectionStatusStore.setConnected(true);\n warningMessageStore.setConnectionOpen();\n };\n\n socket.onclose = () => {\n console.log('store ws close');\n connectionStatusStore.setConnected(false);\n warningMessageStore.setConnectionClosed();\n };\n\n socket.onmessage = (e) => {\n const json = (function (raw) {\n try {\n return JSON.parse(raw);\n } catch (err) {\n return false;\n }\n })(e.data);\n\n if (!json) {\n return;\n }\n\n if (json.channel === 'velocity') {\n velocityStore.setFromWs(json.payload);\n }\n if (json.channel === 'roll_pitch_yaw') {\n fusionStore.setRollPitchYawFromWs(json.payload);\n }\n if (json.channel === 'position_local') {\n fusionStore.setPositionLocalFromWs(json.payload);\n trailStore.addPostition(json.payload);\n }\n if (json.channel === 'position_local_std') {\n fusionStore.setPositionLocalStdFromWs(json.payload);\n }\n if (json.channel === 'fusion_velocity') {\n fusionStore.setVelocityFromWs(json.payload);\n }\n if (json.channel === 'fusion_velocity_std') {\n fusionStore.setVelocityStdFromWs(json.payload);\n }\n if (json.channel === 'fusion_reset') {\n trailStore.resetTrail();\n }\n };\n}\n\nupdateStores();\n\nconst storesContext = React.createContext({\n velocityStore: velocityStore,\n fusionStore: fusionStore,\n orientationStore: orientationStore,\n aboutInfoStore: aboutInfoStore,\n warningMessageStore: warningMessageStore,\n connectionStatusStore: connectionStatusStore,\n trailStore: trailStore,\n});\n\nexport const useStores = () => React.useContext(storesContext);\n","import React from 'react';\nimport { Table } from 'semantic-ui-react'\nimport { formatDecimals } from '../../lib/format';\nimport { observer } from 'mobx-react'\nimport { useStores } from '../../Stores/use-stores';\n\n\n\n\nconst DeadReckoningDetails = ({rollPitchYaw, position, positionStd, velocity, velocityStd}) => (\n <>\n \n \n\n {/* \n \n X\n \n Y\n \n Down\n \n \n FOM \n \n */}\n\n \n \n Speed \n \n \n {formatDecimals(velocity[0], 3)} \n \n \n {formatDecimals(velocity[1], 3)} \n \n \n {formatDecimals(velocity[2], 3)} \n \n \n {formatDecimals(velocityStd, 3)}\n \n \n m/s\n \n \n\n \n \n Position \n \n \n {formatDecimals(position[0], 3)} \n \n \n {formatDecimals(position[1], 3)} \n \n \n {formatDecimals(position[2], 3)} \n \n \n {formatDecimals(positionStd, 3)}\n \n \n m\n \n \n\n \n  \n \n\n\n\n \n \n Orentation \n \n \n {formatDecimals(rollPitchYaw[0], 1)} \n \n \n {formatDecimals(rollPitchYaw[1], 1)} \n \n \n {formatDecimals(rollPitchYaw[2], 1)} \n \n \n °\n \n \n\n\n\n \n
\n {/* */}\n\n)\n\n\nconst DeadReckoningStatus = observer(() => {\n const { fusionStore } = useStores()\n const { positionLocal, positionLocalStd, velocity, velocityStd, rollPitchYaw } = fusionStore\n\n return (\n
\n \n
\n )\n})\n\n\n\n\nexport default DeadReckoningStatus\n","import React from 'react';\nimport { icon } from 'leaflet'\nimport { Marker, Popup } from 'react-leaflet'\nimport { PropTypes } from 'prop-types';\n\nvar origoIcon = icon({\n iconUrl: '/record-circle-outline.svg',\n iconSize: [30, 30],\n iconAnchor: [15, 15],\n \n})\n\nconst OrigoMarker = ({position, description}) => {\n return (\n {description}\n)}\n\nOrigoMarker.propTypes = {\n position: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired,\n description: PropTypes.string.isRequired,\n}\n\n\nexport { OrigoMarker }\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { Polyline } from 'react-leaflet'\nimport { latLng } from 'leaflet'\n\n// Convert XY values to Leaflet map CRS coordinate system coordinates\nfunction xyToLeflet(x, y) {\n return latLng(x, y)\n}\n\nfunction defaultGrid() {\n const maxRange = 500\n return { x: { min: -maxRange, max: maxRange}, y: { min: -maxRange, max: maxRange }}\n}\n\n// Generating grid based on grid settings\nfunction generateGrid(gridSize, gridRange){\n const grid = []\n const delta = gridSize\n\n gridRange = gridRange? gridRange :defaultGrid()\n\n if((gridRange.y.max - gridRange.y.min)/delta > 500 || (gridRange.x.max - gridRange.x.min)/delta > 500) {\n return grid;\n }\n\n\n // Positive y\n for (let y = 0; y <= gridRange.y.max; y += delta) {\n grid.push([[gridRange.x.min, y], [gridRange.x.max, y]])\n }\n // Negative y\n for (let y = 0; y >= gridRange.y.min; y -= delta) {\n grid.push([[gridRange.x.min, y], [gridRange.x.max, y]])\n }\n\n // Positive x\n for (let x = 0; x <= gridRange.x.max; x += delta) {\n grid.push([[x, gridRange.y.min], [x, gridRange.y.max]])\n }\n // Negative x\n for (let x = 0; x >= gridRange.x.min; x -= delta) {\n grid.push([[x, gridRange.y.min], [x, gridRange.y.max]])\n }\n return grid\n}\n\nconst AcousticGrid = ({gridSize, range, zIndex}) => {\n const getGrid = () => {\n const generated = generateGrid(gridSize, range)\n\n return generated\n }\n const transform = (grid) => {\n const map = grid.map(d => d.map(inner => xyToLeflet(inner[0], inner[1])))\n\n return map\n }\n if(!gridSize) {\n return null;\n }\n const grid = getGrid()\n return ( \n \n \n \n )\n}\n\n\n// AcousticGrid.propTypes = {\n// fullGrid: PropTypes.bool,\n// gridSize: PropTypes.number.isRequired,\n// range: PropTypes.shape({\n// x: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired}),\n// y: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired})\n// })\n// }\n\nconst Grid = ({grid}) => {\n return (\n grid.length > 0 && grid.map((d, idx) => \n \n )\n )\n}\n\n\nGrid.propTypes = {\n gridSize: PropTypes.number,\n gridRange: PropTypes.shape({\n x: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired}),\n y: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired})\n })\n}\n\ngenerateGrid.propTypes = {\n gridSize: PropTypes.number,\n gridRange: PropTypes.shape({\n x: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired}),\n y: PropTypes.shape({min: PropTypes.number.isRequired, max: PropTypes.number.isRequired})\n })\n}\n\nexport { AcousticGrid }\n","import L from 'leaflet';\nimport { createPathComponent } from '@react-leaflet/core';\n\nlet bringToFrontTimer;\n\nconst createTrail = (props, context) => {\n const instance = new L.Polyline(props.trail.length > 1 ? props.trail : [], {\n smoothFactor: 5,\n color: '#4292c6',\n });\n\n return { instance, context: { ...context, overlayContainer: instance } };\n};\n\nconst updateTrail = (instance, props) => {\n if (!props.trail || !props.trail.length) {\n return;\n }\n instance.setLatLngs(props.trail);\n\n if (!bringToFrontTimer) {\n bringToFrontTimer = setTimeout(() => {\n bringToFrontTimer = null;\n }, 2000);\n instance.bringToFront();\n }\n};\n\nconst Trail = createPathComponent(createTrail, updateTrail);\n\nexport { Trail };\n","import React, { useEffect, useRef } from 'react';\nimport { divIcon } from 'leaflet';\nimport { Marker, Popup, Circle } from 'react-leaflet';\nimport { PropTypes } from 'prop-types';\nimport ReactDOMServer from 'react-dom/server';\nimport { Trail } from './Trail';\nimport { observer } from 'mobx-react';\nimport { useStores } from '../../Stores/use-stores';\n\nconst Position = observer(({ connected }) => {\n const { fusionStore, trailStore } = useStores();\n const { rollPitchYaw, positionLocal, positionLocalStd } = fusionStore;\n const { reducedTrail } = trailStore;\n\n return (\n <>\n \n \n \n \n );\n});\n\nconst StdCircle = ({ center, connected, std }) => {\n const circleRef = useRef();\n\n useEffect(() => {\n circleRef && circleRef.current && circleRef.current.bringToFront();\n });\n\n const circleSize = std > 1000 ? 1000 : std; // Clamp at 1000m\n return (\n <>\n {connected && }\n {!connected && }\n \n );\n};\n\nconst dvlIcon = (direction) => {\n const iconSize = [50, 50];\n const style = {\n transform: 'rotate3d(0,0,1, ' + direction + 'deg) translateY(-10px)',\n width: iconSize[0],\n height: iconSize[1],\n };\n return divIcon({\n className: 'custom-icon',\n iconSize: iconSize,\n html: ReactDOMServer.renderToString(\"dvl\"),\n });\n};\n\nconst DvlMarker = ({ position, direction, description }) => (\n \n \n {description}\n \n \n);\n\nPosition.propTypes = {\n position: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n description: PropTypes.string,\n};\n\nexport { Position };\n","\nimport React from 'react';\nimport {Icon} from 'semantic-ui-react'\n\nconst Coordinates = () => {\n return (\n
\n x\n y\n
\n \n
\n)}\n\n\n\nexport { Coordinates }\n\n","import React from 'react';\nimport { Header, Icon, Popup } from 'semantic-ui-react'\nimport { PropTypes } from 'prop-types';\n\nconst HeaderWithHelp = ({heading, help, as}) => (\n
{heading}\n \n
\n)\n\nHeaderWithHelp.propTypes = {\n heading: PropTypes.string.isRequired,\n help: PropTypes.string.isRequired,\n as: PropTypes.string,\n}\n\nconst HelpPopup = ({text, size}) => (\n }\n content={text}\n on={[\"hover\", \"click\"]}\n />\n)\n\nHelpPopup.propTypes = {\n text: PropTypes.string.isRequired,\n size: PropTypes.string,\n}\n\nexport { HeaderWithHelp, HelpPopup }\n","import React, { useState, useEffect } from 'react';\nimport { Button, Modal, Icon, Dropdown } from 'semantic-ui-react';\nimport { observer } from 'mobx-react';\nimport { useStores } from '../../Stores/use-stores';\nimport Fullscreen from 'react-leaflet-fullscreen-plugin';\nimport { mutate } from 'swr';\nimport toastMaster from '../../Toast';\nimport { HelpPopup } from '../HelpText';\n\nconst Buttons = ({\n map,\n trailSeconds,\n resetTrail,\n setTrailLength,\n isFullScreen,\n setIsFullscreen,\n gridSize,\n setGridSize,\n}) => (\n <>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nconst ButtonFullscreen = ({ setIsFullscreen }) => {\n const fullscreenIcon = '';\n\n const fullscreenOptions = {\n position: 'topleft', // change the position of the button can be topleft, topright, bottomright or bottomleft, default topleft\n content: fullscreenIcon, // change the content of the button, can be HTML, default null\n //forcePseudoFullscreen: true, // force use of pseudo full screen even if full screen API is available, default false\n };\n return (\n <>\n {navigator.userAgent.indexOf('iPhone') < 0 && (\n {\n event.target.fullscreenControl.link.firstElementChild.classList.remove('expand');\n event.target.fullscreenControl.link.firstElementChild.classList.add('compress');\n setIsFullscreen(true);\n //event.target._container.requestFullscreen()\n },\n exitFullscreen: (event) => {\n event.target.fullscreenControl.link.firstElementChild.classList.remove('compress');\n event.target.fullscreenControl.link.firstElementChild.classList.add('expand');\n //event.target._container.classList.remove(\"\")\n // if(document.fullscreenElement) {\n // document.exitFullscreen()\n // }\n setIsFullscreen(false);\n },\n }}\n {...fullscreenOptions}\n />\n )}\n \n );\n\n // const [iconName, setIconName] = useState(\"expand\")\n\n // return (\n // {\n // if(handle.active) {\n // handle.exit()\n // setIconName(\"expand\")\n // }\n // else {\n // handle.enter()\n // setIconName(\"compress\")\n // }\n // }}\n // >\n // \n // {handle && handle.active? \"Exit fullscreen\": \"Fullscreen\"}\n // \n // )\n};\nconst ButtonPanMap = observer(({ label, title, iconName, map }) => {\n const { fusionStore } = useStores();\n const { positionLocal } = fusionStore;\n\n const setPosition = () => {\n map.panTo(positionLocal);\n };\n\n return (\n \n );\n});\nconst ButtonResetFusion = ({ map, resetTrail }) => {\n const onClick = () => {\n fetch('/api/positioning/reset', { method: 'POST' }).then((r) => {\n resetTrail();\n map.panTo({ lat: 0, lng: 0 });\n });\n };\n return (\n \n );\n};\n\nconst ButtonResetGyro = ({ isFullScreen, asButton }) => {\n const [open, setOpen] = useState(false);\n const [submitInProgress, setSubmitInProgress] = useState(false);\n\n const doResetGyros = () => {\n setSubmitInProgress(true);\n fetch('/api/v1/imu/reset_gyros', { method: 'POST' })\n .then((res) => {\n setSubmitInProgress(false);\n if (res.status !== 200) {\n //alert('Could not communicate with dvl');\n toastMaster.open({\n type: \"error\",\n message: \"Failed performing gyro compensation. Code: \"+res.status,\n duration: 3000,\n })\n return;\n }\n mutate('/api/v1/imu/reset_gyros')\n setOpen(false);\n toastMaster.open({\n type: \"success\",\n message: \"Gyro compensation performed successfully.\",\n duration: 3000,\n })\n })\n .catch((err) => {\n //alert('Could not communicate with dvl');\n toastMaster.open({\n type: \"error\",\n message: \"Failed performing gyro compensation. No communication with DVL.\",\n duration: 3000,\n })\n console.log('error', err);\n setSubmitInProgress(false);\n })\n }\n\n const trigger = asButton ? (\n \n ) : (\n {\n isFullScreen && document.exitFullscreen();\n setOpen(true);\n }}>\n Calibrate gyro\n \n )\n return (\n \n Compensate and save gyro drift\n \n \n \n \n {/*
Stationary
*/}\n

Ensure that DVL is not moving.

\n

Ready?

\n
\n
\n \n \n \n \n \n );\n};\nconst ButtonTrail = ({ trailSeconds, setTrailLength, resetTrail }) => {\n const [menuText, setMenuText] = useState('');\n\n const clearTrail = () => {\n resetTrail();\n };\n useEffect(() => {\n setMenuText(\n parseInt(trailSeconds) === 0\n ? `Trailing is off`\n : trailSeconds < 60\n ? `Trail ${trailSeconds} sec`\n : trailSeconds < 3600\n ? `Trail ${trailSeconds / 60} min`\n : trailSeconds < 999999\n ? `Trail ${trailSeconds / 3600} hour`\n : 'Trail unlimited'\n );\n }, [trailSeconds]);\n return (\n \n \n {trailSeconds > 0 && (\n <>\n \n \n \n )}\n setTrailLength(10)} />\n setTrailLength(180)} />\n setTrailLength(3600)} />\n setTrailLength(999999)} />\n \n setTrailLength(0)} />\n \n \n );\n};\nconst ButtonGrid = ({ setGridSize, gridSize }) => {\n const [menuText, setMenuText] = useState('');\n useEffect(() => {\n setMenuText(parseFloat(gridSize) === 0 ? `Grid is off` : `Grid ${gridSize} m`);\n localStorage.setItem('gridSize', gridSize);\n }, [gridSize]);\n\n return (\n \n \n setGridSize(0)} />\n setGridSize(0.1)} />\n setGridSize(1)} />\n setGridSize(5)} />\n setGridSize(10)} />\n setGridSize(50)} />\n setGridSize(100)} />\n \n \n );\n};\n\nexport { Buttons, ButtonResetGyro };\n","import React, { useEffect, useState } from 'react';\nimport { observer } from 'mobx-react';\nimport { MapContainer, ScaleControl, useMapEvents } from 'react-leaflet';\nimport L from 'leaflet';\nimport 'leaflet/dist/leaflet.css';\nimport { useStores } from '../../Stores/use-stores';\nimport DeadReckoningStatus from './DeadReckoningStatus';\nimport { OrigoMarker } from './Marker';\nimport { AcousticGrid } from './Grid';\nimport { Position } from './Position';\nimport { Coordinates } from './Coordinates';\nimport { Buttons } from './Buttons';\n\n// outside returs true if value is less than -bounds or larger than bounds\nconst outside = (num, bounds) => num < -bounds || num > bounds;\n\nconst PositionMap = observer(({ isFullScreen, setIsFullscreen }) => {\n const { connectionStatusStore, trailStore } = useStores();\n const { connected } = connectionStatusStore;\n const { resetTrail, trailSeconds, setTrailLength } = trailStore;\n\n const [map, setMap] = useState(null);\n const [center, setCenter] = useState([0, 0]);\n const [zoom, setZoom] = useState(8);\n const [gridSize, setGridSize] = useState(1);\n const [gridRange, setGridRange] = useState({ x: { min: -5, max: 5 }, y: { min: -5, max: 5 } });\n\n const setCenterBounds = (pos) => {\n // Avoid crashing leaflet if the position is far away\n if (pos && pos.length && pos.length === 2) {\n const outOfBounds = outside(pos[0], 1e5) || outside(pos[1], 1e5)\n if (!outOfBounds) {\n setCenter(pos)\n } else {\n console.log(\"position out of bounds, not setting center\")\n }\n }\n }\n\n useEffect(() => {\n if (localStorage.getItem('center')) {\n try {\n const parsed = JSON.parse(localStorage.getItem('center'));\n if (parsed && parsed.length && parsed.length === 2) {\n setCenterBounds(parsed);\n }\n } catch (err) {\n console.log(err);\n }\n }\n if (localStorage.getItem('zoom')) {\n try {\n const parsed = parseInt(localStorage.getItem('zoom'));\n if (parsed > 0) {\n setZoom(parsed);\n }\n } catch (err) {\n console.log('ERR', err);\n }\n }\n if (localStorage.getItem('gridSize')) {\n try {\n const parsed = parseFloat(localStorage.getItem('gridSize'));\n if (parsed > 0) {\n setGridSize(parsed);\n }\n } catch (err) {\n console.log('ERR', err);\n }\n }\n }, [map]);\n\n useEffect(() => {\n if (map) {\n const { _southWest, _northEast } = map.getBounds();\n const range = {\n x: { min: _southWest.lat, max: _northEast.lat },\n y: { min: _southWest.lng, max: _northEast.lng },\n };\n setGridRange(range);\n map.setView(center, zoom);\n }\n }, [map, center, zoom]);\n\n return (\n <>\n \n \n\n \n \n \n\n \n {isFullScreen && }\n \n \n \n \n );\n});\n\nconst MapEvents = ({ setGridRange }) => {\n const updateGrid = () => {\n const zoom = mapEvents.getZoom();\n const { lat, lng } = mapEvents.getCenter();\n const { _southWest, _northEast } = mapEvents.getBounds();\n const range = { x: { min: _southWest.lat, max: _northEast.lat }, y: { min: _southWest.lng, max: _northEast.lng } };\n localStorage.setItem('center', JSON.stringify([lat, lng]));\n localStorage.setItem('zoom', zoom);\n setGridRange(range);\n };\n\n const mapEvents = useMapEvents({\n zoomend: () => {\n updateGrid();\n },\n moveend: () => {\n updateGrid();\n },\n resize: () => {\n updateGrid();\n },\n });\n\n return null;\n};\n\nexport default PositionMap;\n","import React, {useEffect, useState} from 'react';\nimport { Table, Icon } from 'semantic-ui-react'\nimport { formatDecimals } from '../lib/format.js'\nimport { PropTypes } from 'prop-types';\nimport { HelpPopup } from './HelpText'\n\nconst DopplerDetails = ({altitude, speed, fom, velocity_valid, fps}) => {\n const [validAltitude, setValidAltitude] = useState(altitude)\n const [validSpeed, setValidSpeed] = useState(speed)\n const [validFom, setValidFom] = useState(fom)\n\n\n useEffect(()=> {\n //Only display valid values\n //Format values\n if(velocity_valid) {\n setValidAltitude(formatDecimals(altitude, 2))\n setValidSpeed(formatDecimals(speed, 3))\n setValidFom(formatDecimals(fom, 4))\n }\n }, [velocity_valid, altitude, speed, fom])\n\n\n return (\n \n \n\n \n \n Speed\n \n \n {validSpeed}\n \n \n m/s\n \n\n \n\n \n \n Altitude\n \n \n {validAltitude}\n \n \n m\n \n\n \n\n \n \n Figure of merit \n \n \n {validFom}\n \n \n m/s\n \n \n\n \n \n Ping rate \n \n \n {formatDecimals(fps, 0)}\n \n \n Hz\n \n \n\n \n \n Velocity valid\n \n \n {velocity_valid ? (\n \n ) : (\n \n )}\n \n \n \n
\n\n )\n}\n\n\nDopplerDetails.propTypes = {\n altitude: PropTypes.number.isRequired,\n speed: PropTypes.number.isRequired,\n direction: PropTypes.number.isRequired,\n fom: PropTypes.number.isRequired,\n velocity_valid: PropTypes.bool.isRequired,\n}\n\nexport default DopplerDetails\n","import fetch from 'unfetch'\n\nconst fetcher = (url) => {\n var headers = {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n }\n return fetch(url, {headers: headers})\n .then(r => r.json())\n}\n\nfunction superFetch(endpoint, authenticated) {\n var headers = {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n }\n let token = localStorage.getItem('access_token') || null\n if (authenticated) {\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`\n } else {\n throw Error(\"No token saved!\")\n }\n }\n return fetch(endpoint, {\n headers: headers,\n method: \"GET\",\n //body: JSON.stringify(payload)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(\"Response: \" + response.statusText)\n }\n return response\n })\n .then(response => { return response.json() })\n}\n\n\nfunction superFetchPost(endpoint, authenticated, method, payload) {\n var headers = {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n }\n let token = localStorage.getItem('access_token') || null\n if (authenticated) {\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`\n } else {\n throw Error(\"No token saved!\")\n }\n }\n return fetch(endpoint, {\n headers: headers,\n method: method,\n body: JSON.stringify(payload)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(\"Response: \" + response.statusText)\n }\n return response\n })\n}\n\nfunction superFetchHeaders(endpoint, method, data) {\n var headers = {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n }\n return fetch(endpoint, {\n method: method,\n headers: headers,\n body: JSON.stringify(data)\n })\n}\n\n\nexport { superFetch, superFetchPost, fetcher, superFetchHeaders };\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { fetcher } from '../lib/fetch'\nimport useSWR from 'swr'\n\nclass DopplerDirectionInner extends React.Component {\n /*\n\n Device coordinates\n\n ^ x\n |\n | angle positive from x towards y\n |\n ------> y\n\n\n Screen coordinates\n\n ------> x\n |\n | angle positve from x towards y\n |\n v y\n\n From device to screen: subtract 90 degrees to angle\n\n */\n render() {\n const width = 220\n const height = 240\n const radius = 50\n const maxSpeed = 1.0 // The speed that is needed to show full direction arrow (speeds above this is clamped)\n const stationarySpeed = 0.1 // Speeds below this is shown as a dot. This is to avoid arrow looking erratic.\n let {direction, speed, velocity_valid} = this.props\n let screenDirection = direction - 90\n if (screenDirection < 0) {\n screenDirection += 360\n }\n const rad = screenDirection / 180.0 * Math.PI\n let clampSpeed = Math.min(speed, maxSpeed)\n const circumferenceStroke = 10\n const arrowHeadSize = 8 // This should probably be based on the marker drawing below, now it is just set to a value that looks good\n let x = ((radius-circumferenceStroke/2-arrowHeadSize)*clampSpeed/maxSpeed)*Math.cos(rad)\n let y = ((radius-circumferenceStroke/2-arrowHeadSize)*clampSpeed/maxSpeed)*Math.sin(rad)\n const velocityValidColor = velocity_valid ? '#4292c6' : \"#fa1f1f\"\n return (\n
\n \n \n \n \n \n \n {/* Circumference: */}\n \n {/* Speed arrow or dot if slow movement: */}\n {speed > stationarySpeed ? (\n \n ) : (\n \n )}\n \n {/* Dot indicating Forward/LED position: */}\n \n {/* Illustration of LEMO Connector */}\n \n \n \n
\n )\n }\n}\n\nconst DopplerDirection = (props) => {\n const { data, error } = useSWR('/api/v1/config', fetcher)\n if (error) {\n console.log(\"DopplerDirection has no mounting rotation offset\")\n }\n const mounting_rotation_offset = (data) ? data.mounting_rotation_offset || 0 : 0\n return (\n \n )\n}\n\n\nDopplerDirection.propTypes = {\n direction: PropTypes.number.isRequired,\n speed: PropTypes.number.isRequired,\n velocity_valid: PropTypes.bool.isRequired,\n}\n\nexport default DopplerDirection\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\n\nclass DopplerVerticalDirection extends React.Component {\n /*\n\n Device coordinates\n\n ^ x\n |\n | angle positive from x towards y\n |\n ------> y\n\n\n Screen coordinates\n\n ------> x\n |\n | angle positve from x towards y\n |\n v y\n\n From device to screen: subtract 90 degrees to angle\n\n */\n render() {\n const width = 220\n const height = 240\n const radius = 50\n const maxSpeed = 0.5 // The speed that is needed to show full direction arrow (speeds above this is clamped)\n const stationarySpeed = 0.1 // Speeds below this is shown as a dot. This is to avoid arrow looking erratic.\n const { speed } = this.props\n const direction = speed > 0 ? 90 : -90\n const speedValue = Math.abs(speed)\n\n const rad = direction / 180.0 * Math.PI;\n const clampSpeed = Math.min(speedValue, maxSpeed)\n const circumferenceStroke = 10\n const arrowHeadSize = 8 // This should probably be based on the marker drawing below, now it is just set to a value that looks good\n const x = ((radius-circumferenceStroke/2-arrowHeadSize)*clampSpeed/maxSpeed)*Math.cos(rad)\n const y = ((radius-circumferenceStroke/2-arrowHeadSize)*clampSpeed/maxSpeed)*Math.sin(rad)\n const velocityValidColor = \"#4292c6\" //velocity_valid ? '#4292c6' : \"#fa1f1f\"\n return (\n
\n \n \n \n \n \n \n {/* Surrounding box: */}\n \n {/* Speed arrow or dot if slow movement: */}\n {speedValue > stationarySpeed ? (\n \n ) : (\n \n )}\n \n
\n )\n }\n}\n\n\nDopplerVerticalDirection.propTypes = {\n speed: PropTypes.number.isRequired,\n}\n\nexport default DopplerVerticalDirection\n","import React from 'react';\nimport { Icon, Table, Popup } from 'semantic-ui-react'\nimport { formatDecimals } from '../lib/format';\nimport { HelpPopup } from './HelpText'\nimport { observer } from 'mobx-react'\nimport { useStores } from '../Stores/use-stores';\n\n\n\n\nconst DeadReckoningDetails = ({rollPitchYaw, position, positionStd, velocity, velocityStd}) => (\n\n \n \n\n \n \n X\n \n Y\n \n Down\n \n \n FOM \n \n \n\n \n \n Speed \n \n \n {formatDecimals(velocity[0], 3)} \n \n \n {formatDecimals(velocity[1], 3)} \n \n \n {formatDecimals(velocity[2], 3)} \n \n \n {formatDecimals(velocityStd, 3)}\n \n \n m/s\n \n \n\n \n \n Position \n \n \n {formatDecimals(position[0], position[0] >= 100 && position[0] < -100? 0: 3)} \n \n \n {formatDecimals(position[1], position[1] >= 100 && position[1] < -100? 0: 3)} \n \n \n {formatDecimals(position[2], position[2] >= 100 && position[2] < -100? 0: 3)} \n \n \n {formatDecimals(positionStd, positionStd >= 100 && positionStd < -100? 0: 3)}\n \n \n m\n \n \n\n \n  \n \n\n\n \n \n Roll, pitch and yaw }>\n {/* Attitude and heading reference system */}\n {/* Orientation */}\n \n Orientation (from gyro)\n \n \n \n \n {formatDecimals(rollPitchYaw[0], 1)} \n \n \n {formatDecimals(rollPitchYaw[1], 1)} \n \n \n {formatDecimals(rollPitchYaw[2], 1)} \n \n \n °\n \n \n\n\n\n \n
\n)\n\n\nconst DeadReckoningStatus = observer(() => {\n const { fusionStore } = useStores()\n const { positionLocal, positionLocalStd, velocity, velocityStd, rollPitchYaw } = fusionStore\n\n return (\n
\n \n
\n )\n})\n\n\n\n\nexport default DeadReckoningStatus\n","import React from 'react';\nimport { Segment, Grid, Header } from 'semantic-ui-react';\nimport '../Graph.css';\nimport { observer } from 'mobx-react';\nimport { useStores } from '../Stores/use-stores';\nimport PositionMap from '../Components/Map/PositionMap';\nimport DopplerDetails from '../Components/DopplerDetails';\nimport DopplerDirection from '../Components/DopplerDirection';\nimport DopplerVertical from '../Components/DopplerVertical';\nimport DeadReckoningStatus from '../Components/DeadReckoningStatus';\n\nconst ShowDopplerDetails = observer(() => {\n const { velocityStore } = useStores();\n const { altitude, speed, direction, fom, velocity_valid, fps } = velocityStore;\n return (\n \n );\n});\n\nconst ShowDopplerDirection = observer(() => {\n const { velocityStore } = useStores();\n const { horizontalSpeed, direction, velocity_valid } = velocityStore;\n return ;\n});\n\nconst ShowDopplerVertical = observer(() => {\n const { velocityStore } = useStores();\n return ;\n});\n\n\nconst Dashboard = ({ isFullScreen, setIsFullscreen }) => {\n return (\n \n \n {!isFullScreen && (\n <>\n \n
Doppler velocity
\n \n
\n\n \n
\n Dead reckoning\n
\n \n
\n\n \n
Horizontal velocity
\n \n
\n\n \n
Vertical velocity
\n \n
\n \n )}\n
\n\n \n \n \n \n \n \n \n \n \n
\n );\n};\n\nexport default Dashboard;\n","import React, { useRef, useEffect} from 'react';\nimport axios from 'axios'\nimport './CorrelatorGraph.css'\nimport { range } from 'd3-array'\nimport { extent, min, max } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\nimport { axisLeft, axisBottom, axisTop } from 'd3-axis'\nimport { select } from 'd3-selection'\nimport { createMedia } from \"@artsy/fresnel\"\nimport { Popup, Icon, Input, Radio, Form, Divider } from 'semantic-ui-react'\n\nconst transducer_colors = [\"#0000ff\", \"#00ff00\", \"#ff0000\", \"#000000\"]\nconst legendKeys = [\"t1\", \"t2\", \"t3\", \"t4\"];\n\nconst Axis = props => {\n // https://stackoverflow.com/a/56029853\n const axisRef = axis => {\n axis && props.axisCreator(select(axis));\n };\n return ;\n};\n\nconst GraphGrid = props => {\n // https://stackoverflow.com/a/56029853\n const axisRef = axis => {\n axis && props.axisCreator(select(axis));\n };\n return ;\n}; \n\nconst GridLayoutPopup = props => {\n\n const onHandleEvent = props.setGraphAxisType\n\n const onYMnValueChange = (evt, data) => {\n props.setCustomYMin(data.value)\n }\n\n const onYMxValueChange = (evt, data) => {\n props.setCustomYMax(data.value)\n }\n\n const GridLayoutOptions = () => {\n return (\n
\n \n Axis options\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n return (\n }\n position='top right'\n />\n )\n}\n\nconst Legends = props => {\n\n if (props.mod === 0) return <>\n\n // All base values for outerWidth = 1500, outerHeight = 600\n let legendTitleFont = 16 * props.mod\n let legendTextFont = 12 * props.mod\n let ltx = 32 * props.mod\n let lty = -10 * props.mod\n let circleR = 6 * props.mod\n let circleX = 40 * props.mod\n let circleY = 10 * props.mod\n let textX = 60 * props.mod\n let textY = 15 * props.mod\n let yDelta = 25 * props.mod\n\n return (\n \n Transducer\n \n {legendKeys[0]}\n \n {legendKeys[1]}\n \n {legendKeys[2]}\n \n {legendKeys[3]}\n \n )\n};\n\nconst GraphInner = props => {\n\n const margin = {top: 20, right: 15, bottom: 30, left: 30};\n const outerWidth = props.width;\n const outerHeight = props.height;\n const width = outerWidth - margin.left - margin.right;\n const height = outerHeight - margin.top - margin.bottom;\n\n const legendsMarginTop = margin.top * 6 * props.mod;\n const legendsMarginRight = margin.right * 16 * props.mod;\n \n const canvasRef = useRef(null)\n const yMin = useRef(new Array(10))\n const yMax = useRef(new Array(10))\n\n const x_min = props.graph[0][0].px\n const x_max = props.graph[0][props.graph[0].length-1].px\n\n let _yMx = props.customYAxisMax || props.customYAxisMax === 0 || 100\n let _yMn = props.customYAxisMin || props.customYAxisMax === 0 || 50\n\n if (props.graphDisplay === \"auto\") {\n const y_extents = props.graph.map(item => {\n return extent(item, d => d.py)\n })\n const y_min = min(y_extents, d => d[0])\n const y_max = max(y_extents, d => d[1])\n\n yMax.current.shift(0)\n yMax.current.push(y_max)\n yMin.current.shift(0)\n yMin.current.push(y_min)\n\n _yMx = max(yMax.current)\n _yMn = min(yMin.current)\n\n // Gives the automatic graph some padding\n _yMx += 10\n _yMn -= 10\n }\n\n const xScale = scaleLinear()\n .domain([x_min, x_max])\n .range([0, width])\n .nice();\n\n const yScale = scaleLinear()\n .domain([_yMn, _yMx])\n //.domain([10, 100])\n .range([height, 0])\n .nice();\n\n useEffect(() => {\n const canvas = canvasRef.current\n const context = canvas.getContext('2d')\n\n var nWidth = context.canvas.clientWidth;\n var nHeight = context.canvas.clientHeight;\n\n context.canvas.width = nWidth;\n context.canvas.height = nHeight;\n\n const drawPoint = (ctx, x, y) => {\n const px = xScale(x);\n const py = yScale(y);\n ctx.lineTo(px, py)\n }\n\n const draw = (ctx) => {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n\n if (!props.graph) {\n return\n }\n props.graph.forEach((tr, idx) => {\n ctx.beginPath()\n // ctx.moveTo(xScale(0),yScale(0))\n ctx.strokeStyle = transducer_colors[idx]\n ctx.lineWidth = 1\n tr.forEach(d => {\n drawPoint(ctx, d.px, d.py)\n })\n ctx.stroke()\n })\n }\n\n draw(context)\n\n }, [props.graph, xScale, yScale])\n\n \n const xAxis = axisBottom(xScale)\n const yAxis = axisLeft(yScale)\n const xAxisTop = axisTop(xScale)\n const xTransform = `translate(${margin.left}, ${outerHeight - margin.bottom})`;\n const yTransform = `translate(${margin.left}, ${margin.top})`;\n const legendsTransform = `translate(${outerWidth - legendsMarginRight}, ${legendsMarginTop})`;\n\n const labelXTransform = `translate(${outerWidth/2 - 40}, ${outerHeight + 10}) `;\n const labelYTransform = `translate(-10, ${outerHeight/2 + 70}) rotate(-90)`;\n\n\n const gridX = axisBottom(xScale)\n .tickSize(-height)\n .tickFormat('')\n \n const gridY = axisLeft(yScale)\n .tickSize(-width)\n .tickFormat('')\n\n return (\n
\n \n\n
\n )\n}\n\n\nexport function BucketSampler() {\n // https://github.com/d3fc/d3fc-sample/blob/master/src/bucket.js\n var bucketSize = 10;\n\n var bucket = (data) => bucketSize <= 1\n ? data.map((d) => [d])\n : range(0, Math.ceil(data.length / bucketSize))\n .map((i) => data.slice(i * bucketSize, (i + 1) * bucketSize));\n\n bucket.bucketSize = function(x) {\n if (!arguments.length) {\n return bucketSize;\n }\n\n bucketSize = x;\n return bucket;\n };\n return bucket\n }\n\nfunction killInf(val) {\n // Remove negative infinity from the graph\n if (val < -1e9) {\n return NaN\n }\n return val\n}\n\n\nfunction downsample(payload, x_scale, y_scale, x_offset, y_offset) {\n // Downsample to 1 entry pr pixel in chart (if needed)\n //var dataPrPixel = payload.length / this.width // Downsample to number of pixels available (responsive)\n var dataPrPixel = payload.length / 500 // Downsample to fixed number of entries\n //dataPrPixel = 1;\n\n var r0 = payload.map(function(d) { return d[0] })\n var r1 = payload.map(function(d) { return d[1] })\n var r2 = payload.map(function(d) { return d[2] })\n var r3 = payload.map(function(d) { return d[3] })\n\n if (dataPrPixel > 1) {\n // Downsample with BucketSampler\n var bs = BucketSampler()\n var buckets = bs.bucketSize(dataPrPixel)\n\n r0 = buckets(r0).map(function (d) { return Math.max(...d) })\n r1 = buckets(r1).map(function (d) { return Math.max(...d) })\n r2 = buckets(r2).map(function (d) { return Math.max(...d) })\n r3 = buckets(r3).map(function (d) { return Math.max(...d) })\n } else {\n // Use data without downsampling\n dataPrPixel = 1;\n }\n\n var geometry = [[], [], [], []]\n for (var index = 0; index < r0.length; index++) {\n const px = index * dataPrPixel * x_scale + x_offset\n geometry[0][index] = {px: px, py: y_offset + y_scale * killInf(r0[index])}\n geometry[1][index] = {px: px, py: y_offset + y_scale * killInf(r1[index])}\n geometry[2][index] = {px: px, py: y_offset + y_scale * killInf(r2[index])}\n geometry[3][index] = {px: px, py: y_offset + y_scale * killInf(r3[index])}\n }\n return geometry\n}\n\nclass CorrelatorGraphFetcher extends React.Component {\n constructor() {\n super()\n this.state = {\n graph: [],\n x_scale: 1,\n y_scale: 1,\n error: \"\",\n graphDisplay: \"fixed\",\n customYAxisMin: 0,\n customYAxisMax: 100,\n x_display_name: \"test1\"\n\n }\n this.active = true\n }\n fetch = () => {\n const url = this.props.url || '/api/graph'\n axios.get(url)\n .then(response => {\n if (!this.active) {\n return\n }\n if (response.data.data === undefined) {\n console.log(\"Got no data\")\n this.setState({error: \"No data available\"})\n return\n }\n const x_offset = response.data.x_offset || 0;\n const y_offset = response.data.y_offset || 0;\n const graph = downsample(response.data.data, response.data.x_scale, response.data.y_scale, x_offset, y_offset)\n this.setState({graph: graph, x_scale: response.data.x_scale, y_scale: response.data.y_scale, error: \"\"})\n })\n .catch(err => {\n console.log(\"Error\", err)\n this.setState({graph: [], error: err.toString()})\n })\n\n }\n setGraphAxisType = (e, { value }) => { \n this.setState({ graphDisplay: value }) }\n\n changeCustomAxisYMinValue = (value) => {\n this.setState({ customYAxisMin: value})\n }\n\n changeCustomAxisYMaxValue = (value) => {\n this.setState({ customYAxisMax: value})\n }\n\n componentDidMount() {\n this.fetch()\n this.interval = setInterval(this.fetch, 100)\n if (this.props.defYMin !== undefined) this.changeCustomAxisYMinValue(this.props.defYMin)\n if (this.props.defYMax !== undefined) this.changeCustomAxisYMaxValue(this.props.defYMax)\n }\n componentWillUnmount() {\n this.active = false\n clearInterval(this.interval)\n }\n render() {\n if (this.state.error) {\n return (\n
No data available
\n )\n }\n return (\n
\n {this.state.graph.length > 0 && (\n \n )}\n
\n )\n }\n}\n\nconst { MediaContextProvider, Media } = createMedia({\n breakpoints: {\n sm: 0,\n md: 600,\n lg: 1024,\n xl: 1920,\n },\n})\n\nconst Graph = props => {\n return ( \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default CorrelatorGraphFetcher\n","// https://stackoverflow.com/a/48057286\nimport { useCallback, useRef, useState } from \"react\";\n\nconst useLongPress = (\n onLongPress,\n onClick,\n { shouldPreventDefault = true, delay = 300 } = {}\n ) => {\n const [longPressTriggered, setLongPressTriggered] = useState(false);\n const timeout = useRef();\n const target = useRef();\n\n const start = useCallback(\n event => {\n if (shouldPreventDefault && event.target) {\n event.target.addEventListener(\"touchend\", preventDefault, {\n passive: false\n });\n target.current = event.target;\n }\n timeout.current = setTimeout(() => {\n onLongPress(event);\n setLongPressTriggered(true);\n }, delay);\n },\n [onLongPress, delay, shouldPreventDefault]\n );\n\n const clear = useCallback(\n (event, shouldTriggerClick = true) => {\n timeout.current && clearTimeout(timeout.current);\n shouldTriggerClick && !longPressTriggered && onClick();\n setLongPressTriggered(false);\n if (shouldPreventDefault && target.current) {\n target.current.removeEventListener(\"touchend\", preventDefault);\n }\n },\n [shouldPreventDefault, onClick, longPressTriggered]\n );\n\n return {\n onMouseDown: e => start(e),\n onTouchStart: e => start(e),\n onMouseUp: e => clear(e),\n onMouseLeave: e => clear(e, false),\n onTouchEnd: e => clear(e)\n };\n};\n\nconst isTouchEvent = event => {\nreturn \"touches\" in event;\n};\n\nconst preventDefault = event => {\nif (!isTouchEvent(event)) return;\n\nif (event.touches.length < 2 && event.preventDefault) {\n event.preventDefault();\n}\n};\n\nexport default useLongPress;\n","import React, { useState } from 'react';\nimport { Button, Image } from 'semantic-ui-react'\nimport logo from '../waterlinked_logo.svg';\nimport './LEDButton.css'\nimport { withRouter } from \"react-router-dom\";\nimport useLongPress from './useLongpress'\n\nconst BlinkLED = () => {\n return fetch('/api/v1/about/led')\n .then(r => r.ok)\n .catch((e) => {\n console.log(\"Error: \", e.toString())\n return false\n })\n}\n\nfunction useLedBlink() {\n const [isActive, setIsActive] = useState(false)\n const [isSubmitFail, setIsSubmitFail] = useState(false)\n const onClick = () => {\n if (isActive) { return }\n setIsActive(true)\n BlinkLED().then(ok => {\n if (ok) {\n console.log(\"success\")\n setTimeout(() => {\n setIsActive(false)\n }, 3000)\n } else {\n console.log(\"fail\")\n setIsActive(false)\n setIsSubmitFail(true)\n setTimeout(() => {\n setIsSubmitFail(false)\n }, 3000)\n }\n })\n }\n return [isActive, isSubmitFail, onClick]\n}\n\nconst LEDButton = () => {\n const [isActive, isSubmitFail, onClick] = useLedBlink()\n\n return (\n \n Flash Led\n \n )\n\n /*\n return (\n \n )\n */\n}\n\n\nconst WaterLinkedLogoWithLedBlinkNav = ({history}) => {\n const [isActive, isSubmitFail, blinkLed] = useLedBlink()\n const border = isActive ? \"ledactive\" : (isSubmitFail ? \"lederror\" : \"ledborder\")\n\n const onLongPress = () => {\n history.push(\"/debug\")\n };\n\n const onClick = () => {\n blinkLed();\n }\n\n const defaultOptions = {\n shouldPreventDefault: true,\n delay: 500,\n };\n const longPressEvent = useLongPress(onLongPress, onClick, defaultOptions);\n\n return (\n
\n \n
\n\n )\n}\n\nconst WaterLinkedLogoWithLedBlink = withRouter(WaterLinkedLogoWithLedBlinkNav)\n\nexport{ LEDButton, BlinkLED, WaterLinkedLogoWithLedBlink}\n","import React from 'react';\n\nfunction clamp(val, min, max) {\n return Math.min(Math.max(val, min), max)\n}\n\nconst SignalStrengthImage = ({bars}) => {\n const _bars = clamp(bars, 0, 4)\n const width = 35;\n const height = 20;\n\n const innerHeight = 100\n const heightPadding = 5\n const unitHeight = 20;\n\n const barWidth = 20;\n const barSpacing = 8;\n return (\n \n 0 ? \"#21ba45\" : \"none\"}}\n />\n 1 ? \"#21ba45\" : \"none\"}}\n />\n 2 ? \"#21ba45\" : \"none\"}}\n />\n 3 ? \"#21ba45\" : \"none\"}}\n />\n \n )\n}\n\nconst SignalStrengthIcon = ({rssi}) => {\n // Signal strength | bars\n // <-100 dBm | 0 \n // -100 - -85 dBm | 1\n // -85 - -70 dBm | 2\n // -70 - -55 dBm | 3\n // >-55 dBm | 4\n let bars = 0;\n let description = \"Weak\"\n if (rssi <= -100) {\n bars = 0;\n description = \"Weak\"\n } else if (rssi <= -85) {\n bars = 1\n description = \"Weak\"\n } else if (rssi <= -70) {\n description = \"Medium\"\n bars = 2\n } else if (rssi <= -55) {\n description = \"Strong\"\n bars = 3\n } else {\n bars = 4\n description = \"Strong\"\n }\n return (\n \n \n \n )\n}\n\nconst NoiseStrengthImage = ({percent, color}) => {\n const width = 40\n const height = 15\n\n const split = width * clamp(percent, 1, 100) / 100;\n\n return (\n \n \n \n \n )\n}\n\nconst NoiseStrengthIllustration = ({nsd}) => {\n // 100% is lots of noise\n // 25% is not much noise\n const percent = nsd > -50 ? 100 :\n nsd > -75 ? 75 :\n nsd > -85 ? 50 :\n 25;\n const color = nsd > -75 ? \"#db2828\" :\n nsd > -85 ? \"#f2711c\" :\n \"#21ba45\";\n const desc = percent > 75 ? \"high\" :\n percent > 50 ? \"moderate\" :\n \"low\";\n\n return (\n \n \n \n )\n}\n\nexport { SignalStrengthIcon, NoiseStrengthIllustration }\n","import React from 'react';\nimport { Table } from 'semantic-ui-react';\nimport { fetcher } from '../../lib/fetch';\nimport useSWR from 'swr';\nimport { formatDecimals } from '../../lib/format';\n\nconst TableRow = ({ title, children }) => (\n \n {title}\n {children}\n \n \n);\n\nconst StatusView = ({ detailed = false, collapsing = false }) => {\n const { data, error } = useSWR('/api/v1/about/status', fetcher, { refreshInterval: 3000, dedupingInterval: 100 });\n if (error) {\n return

Error loading status

;\n }\n if (!data) {\n return

Loading..

;\n }\n const temperature = data.temperature ?? -1;\n const cpu_load = data.cpu_load ?? -1;\n const disk_free = Object.entries(data.disk_free) ?? [];\n return (\n \n \n \n {formatDecimals(temperature, 1)} C\n \n\n {detailed && (\n <>\n \n {formatDecimals(cpu_load, 2)} \n \n\n {disk_free.map(([name, size]) => (\n \n Disk free {name} partition\n \n }\n >\n {formatDecimals(size, 2)} GB\n \n ))}\n \n )}\n \n
\n );\n};\n\nexport default StatusView;\n","import React, { useState } from 'react';\nimport { Button, Header } from 'semantic-ui-react';\nimport fetch from 'unfetch';\nimport { fetcher } from '../lib/fetch';\nimport useSWR, { mutate } from 'swr';\nimport { HelpPopup } from './HelpText';\n\nconst forceAdvancedUrl = '/api/force/advanced';\n\nconst shallowerDistance = [0.05, 0.3, 1.54, 7.68, 15.36];\nconst deeperDisance = [0.58, 3.07, 14.4, 36.0, \"max\"];\n\nconst shallowestToDistance = (mode) => {\n return shallowerDistance[mode] ?? '-';\n};\n\nconst deeperstToDistance = (mode) => {\n return deeperDisance[mode] ?? '-';\n};\n\nfunction ShowRangeModeURIIfNotAuto() {\n const { data, error } = useSWR(forceAdvancedUrl, fetcher, { refreshInterval: 5000, dedupingInterval: 100 });\n if (error) {\n console.warn(\"Unable to fetch range mode\")\n return null\n }\n if (!data) {\n return null\n }\n\n if (data.URI === \"auto\") {\n return \"\"\n }\n const range = shallowestToDistance(data.shallowest) + \" to \" + deeperstToDistance(data.deepest) + \" m\"\n return (\n ({data.URI} )\n );\n}\n\nfunction ForceRangeModeSetting() {\n const { data, error } = useSWR(forceAdvancedUrl, fetcher, { refreshInterval: 5000, dedupingInterval: 100 });\n if (error) {\n return

Error loading range mode

;\n }\n if (!data) {\n return

No data

;\n }\n return ;\n}\n\nasync function PostForceRangeMode(lowerMode, upperMode) {\n const data = {\n shallowest: lowerMode,\n deepest: upperMode,\n };\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n };\n console.log('sumbit', data);\n return fetch(forceAdvancedUrl, options);\n}\n\nfunction ForceRangeModeSettingInner({ shallowest, deepest }) {\n const [submitMessage, setSubmitMessage] = useState('');\n const [lowerMode, setLowerMode] = useState(shallowest);\n const [upperMode, setUpperMode] = useState(deepest);\n\n const change = (mode) => {\n if (mode === -1) {\n // Auto\n setLowerMode(-1);\n setUpperMode(-1);\n } else if (lowerMode === -1 || upperMode === -1) {\n // Reset from auto to manual\n setLowerMode(mode);\n setUpperMode(mode);\n }\n if (mode < lowerMode) {\n setLowerMode(mode);\n } else if (mode > upperMode) {\n setUpperMode(mode);\n } else {\n setLowerMode(mode);\n setUpperMode(mode);\n }\n };\n\n const submit = () => {\n setSubmitMessage('');\n PostForceRangeMode(lowerMode, upperMode)\n .then((r) => {\n if (!r.ok) {\n throw new Error('Unsuccessful' + r.status);\n }\n return r.text();\n })\n .then((r) => {\n setSubmitMessage('Forced mode: ' + r);\n mutate(forceAdvancedUrl);\n })\n .catch((e) => {\n console.log('Error', e);\n setSubmitMessage('Set error: ' + e.toString());\n });\n };\n\n\n return (\n
\n
Force range mode
\n\n
\n change(-1)}\n />\n\n = lowerMode ? 'green' : null}\n onClick={() => change(0)}\n />\n = lowerMode ? 'green' : null}\n onClick={() => change(1)}\n />\n = lowerMode ? 'green' : null}\n onClick={() => change(2)}\n />\n = lowerMode ? 'green' : null}\n onClick={() => change(3)}\n />\n = lowerMode ? 'green' : null}\n onClick={() => change(4)}\n />\n
\n
\n Range {shallowestToDistance(lowerMode)} m to{' '}\n {deeperstToDistance(upperMode)} m\n
\n
\n
\n
{submitMessage}
\n
\n );\n}\n\nexport { ShowRangeModeURIIfNotAuto, ForceRangeModeSetting };\n","import fetch from 'unfetch';\n\nasync function ApplyGenericConfig(\n speedOfSound,\n acousticEnabled,\n darkModeEnabled,\n mountingOffset,\n periodicCyclingEnabled = undefined\n) {\n const data = {\n speed_of_sound: Number(speedOfSound),\n acoustic_enabled: acousticEnabled,\n dark_mode_enabled: darkModeEnabled,\n mounting_rotation_offset: Number(mountingOffset),\n };\n if (periodicCyclingEnabled !== undefined) {\n data.periodic_cycling_enabled = periodicCyclingEnabled;\n }\n const options = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n };\n console.log('ApplyGenericConfig', data);\n return fetch('/api/v1/config', options);\n}\n\nexport { ApplyGenericConfig };\n","import React, { useState } from 'react';\nimport { Icon, Header, Button, Checkbox } from 'semantic-ui-react';\nimport { fetcher } from '../lib/fetch';\nimport useSWR, { mutate } from 'swr';\nimport { HelpPopup } from './HelpText';\nimport { ApplyGenericConfig } from './ConfigGeneric';\n\nfunction ShowIfPeriodicCyclingIsDisabled() {\n const { data, error } = useSWR('/api/v1/config', fetcher, { refreshInterval: 5000, dedupingInterval: 100 });\n\n if (error) {\n console.warn('Unable to fetch periodic cycling');\n return null;\n }\n\n if (!data) {\n return null;\n }\n\n if (data.periodic_cycling_enabled !== undefined && !data.periodic_cycling_enabled) {\n return (\n \n {' '}\n \n \n );\n }\n\n return '';\n}\n\nfunction PeriodicCyclingSetting() {\n const { data, error } = useSWR('/api/v1/config', fetcher);\n if (error) {\n return

Error loading config

;\n }\n if (!data) {\n // We are loading, show nothing until loaded\n return null;\n }\n if (data.periodic_cycling_enabled === undefined) {\n return

Config failed to load

;\n }\n return ;\n}\n\nfunction PeriodicCyclingSettingInner({ data }) {\n const [submitMessage, setSubmitMessage] = useState('');\n const [checked, setChecked] = useState(data.periodic_cycling_enabled);\n\n const submit = async () => {\n setSubmitMessage('');\n const result = await ApplyGenericConfig(\n data.speed_of_sound,\n data.acoustic_enabled,\n data.dark_mode_enabled,\n data.mounting_rotation_offset,\n checked\n );\n if (result.ok) {\n const body = await result.text();\n setSubmitMessage('Success: ' + body);\n } else {\n const body = await result.text();\n setSubmitMessage('Failed to submit (' + result.status + '): ' + (body ? body : 'empty reply'));\n }\n mutate('/api/v1/config');\n };\n\n const onChange = (e, data) => {\n setChecked(data.checked);\n };\n\n return (\n
\n
Periodic cycling
\n\n
\n \n
\n\n
\n
\n
{submitMessage}
\n
\n );\n}\n\nexport { ShowIfPeriodicCyclingIsDisabled, PeriodicCyclingSetting };\n","import React from 'react';\nimport { Segment, Header, Grid, Icon, Table, Divider } from 'semantic-ui-react'\nimport { observer } from 'mobx-react'\nimport CorrelatorGraph from '../Components/CorrelatorGraph';\nimport { useStores } from '../Stores/use-stores'\nimport { formatDecimals } from '../lib/format';\nimport { PropTypes } from 'prop-types';\nimport { HelpPopup } from '../Components/HelpText';\nimport { LEDButton } from '../Components/LEDButton';\nimport {SignalStrengthIcon, NoiseStrengthIllustration} from '../Components/SignalStrength';\nimport StatusView from '../Components/Debug/StatusView';\nimport { ShowRangeModeURIIfNotAuto } from '../Components/RangeMode'\nimport { ShowIfPeriodicCyclingIsDisabled } from '../Components/PeriodicCycling'\n\n\nconst VelocityDetail = observer(() => {\n let store = useStores()\n const velocityStore = store.velocityStore\n\n return ()\n})\n\nconst ValidIcon = ({is_valid}) => {\n if (is_valid) {\n return (\n \n )\n }\n return (\n \n )\n}\n\nconst VelocityDetailsInternal = observer(() => {\n const stores = useStores()\n const store = stores.velocityStore\n return (\n \n \n \n Altitude\n {formatDecimals(store.altitude, 2)}\n m \n \n\n \n Velocity\n {formatDecimals(store.speed, 3)}\n m/s\n \n\n\n \n Vx\n {formatDecimals(store.vx, 3)}\n m/s\n \n\n \n Vy\n {formatDecimals(store.vy, 3)}\n m/s\n \n\n \n Vz\n {formatDecimals(store.vz, 3)}\n m/s\n \n\n \n Figure of merit\n {formatDecimals(store.fom, 4)}\n m/s \n \n\n \n Ping rate\n {formatDecimals(store.fps, 0)}\n Hz \n \n\n \n Velocity Valid\n \n \n \n\n \n
\n )\n })\n\n\nconst TransducerDetail = ({data}) => {\n return (\n \n {data.id+1}\n \n {data.velocity > 0 && (+)}{formatDecimals(data.velocity, 2)} m/s\n \n \n {formatDecimals(data.distance, 2)} m\n \n \n {formatDecimals(data.rssi, 0)} dBm\n \n \n \n {formatDecimals(data.nsd, 0)} dBm\n \n \n \n {data.lock ? (\n // Beam valid\n \n ) : (\n // Beam not valid\n \n )}\n \n \n )\n}\n\n\nTransducerDetail.propTypes = {\n data: PropTypes.shape({\n id: PropTypes.number.isRequired,\n velocity: PropTypes.number.isRequired,\n distance: PropTypes.number.isRequired,\n rssi: PropTypes.number.isRequired,\n nsd: PropTypes.number.isRequired,\n lock: PropTypes.bool.isRequired,\n })\n}\n\nconst TransducerOverview = observer(() => {\n const { velocityStore } = useStores()\n return (\n \n \n \n No. \n Velocity \n Distance \n Signal strength \n Noise \n Beam Valid \n\n \n \n \n {velocityStore.transducers.map(d => (\n \n ))}\n\n \n
\n )\n})\n\nfunction Diagnostic() {\n return (\n \n\n Diagnostic\n\n \n\n \n
Doppler velocity
\n \n
\n\n \n
Transducer details
\n \n
\n\n
\n\n Acoustic signal view\n\n \n\n Spectrum\n \n\n Hardware\n

Verify active connection to DVL by clicking by flashing the LED.

\n \n\n Status\n\n \n
\n )\n}\n\nexport default Diagnostic\n","import { useState, useEffect } from 'react';\n\nconst useForm = (callback, validate, initial) => {\n\n const [values, setValues] = useState(initial || {});\n const [errors, setErrors] = useState({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n if (Object.keys(errors).length === 0 && isSubmitting) {\n setIsSubmitting(false);\n callback(values);\n }\n }, [errors, values, callback, isSubmitting]);\n\n const handleSubmit = (event) => {\n if (event) event.preventDefault();\n setErrors(validate(values));\n setIsSubmitting(true);\n };\n\n /*\n const handleChange = (event) => {\n event.persist();\n setValues(values => ({ ...values, [event.target.name]: event.target.value }));\n };\n */\n const handleChange = (name, value) => {\n console.log(\"change\", name, value)\n setValues(values => ({ ...values, [name]: value}));\n }\n\n return {\n handleChange,\n handleSubmit,\n values,\n errors,\n }\n};\n\nexport default useForm;\n","import React, { useState } from 'react';\nimport { Popup, Button, Message } from 'semantic-ui-react';\n\nfunction SendFactoryReset() {\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n return fetch('/api/v1/about/factoryreset', options);\n}\n\nconst FactoryResetButton = () => {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n const [submitError, setSubmitError] = useState('');\n\n const reset = () => {\n setIsSubmitting(false);\n setIsSubmitSuccess(false);\n setSubmitError('');\n };\n\n const onClick = async () => {\n if (isSubmitting) {\n return;\n }\n reset();\n const result = await SendFactoryReset();\n if (!result.ok) {\n const body = await result.json();\n console.log('submit error', body);\n setSubmitError(\"Error \"+body.error);\n setIsSubmitSuccess(false);\n } else {\n console.log('submit success');\n setIsSubmitSuccess(true);\n setSubmitError('');\n setTimeout(() => {\n setIsSubmitSuccess(false);\n }, 5000);\n }\n setIsSubmitting(false);\n };\n\n return (\n \n Factory reset\n \n }\n content={\n
\n Warning: all settings, including network settings, will be lost! Are you sure? Will be applied when the DVL\n next boots.\n \n
\n {submitError && }\n
\n
\n }\n on=\"click\"\n position=\"bottom left\"\n onOpen={reset}\n />\n );\n};\n\nexport { FactoryResetButton };\n","import React, { useState } from 'react';\nimport { Icon } from 'semantic-ui-react'\n\nconst ExpandableSettings = ({title, children}) => {\n const [open, setOpen] = useState(false);\n const toggleExpanded = () => setOpen(!open)\n const icon = open ? \"angle double up\" : \"angle double down\"\n return (\n
\n

{title}

\n {open && (children)}\n
\n )\n}\n\nexport { ExpandableSettings }\n","import { RoundDecimalPlaces } from '../lib/format'\n\nvar rules = {\n // Return true if valid, false if invalid\n between: (min, max) => {\n return function(value, convFactor, decimals) {\n const val = RoundDecimalPlaces(value / convFactor, decimals)\n return val <= max && val >=min\n }\n },\n numeric: () => {\n return function(val, convFactor, decimals) {\n return isNumeric(val)\n }\n },\n string: () => {\n return function(val, convFactor, decimals) {\n return (typeof val === 'string' || val instanceof String)\n }\n },\n}\n\nclass ErrorList {\n constructor() {\n this.list = {}\n }\n add(key, data) {\n if (this.list[key] === undefined) {\n this.list[key] = []\n }\n this.list[key].push(data)\n }\n first = (field) => {\n if (this.list[field] === undefined) {\n return false\n }\n let err = this.list[field]\n return err ? err : null\n }\n count = () => {\n let all = Object.keys(this.list)\n let count = all.reduce((acc, cur) => acc + this.list[cur].length, 0)\n return count\n }\n}\n\nfunction isNumeric(n) {\n let num = parseFloat(n)\n return !isNaN(num) && isFinite(num);\n}\n\nclass Validator {\n constructor(input, rules) {\n this.input = input\n this.rules = rules\n this.errors = new ErrorList()\n }\n passes = (convFactor=1) => {\n Object.keys(this.input).forEach(field => {\n let val = this.input[field]\n let rules = this.rules[field]\n if (!Array.isArray(rules)) {\n //return false\n throw new Error(\"Rules need to be an array\")\n }\n rules.forEach(rule => {\n let isValid = rule(val, convFactor)\n if (!isValid) {\n this.errors.add(field, \"Invalid\")\n }\n })\n });\n return this.errors.count() === 0\n }\n}\n\nexport { Validator, rules }\n","import React, { Component } from 'react';\nimport { Button } from 'semantic-ui-react'\n//import { PropTypes } from 'mobx-react';\n\nclass ButtonSelector extends Component {\n onChange = (e) => {\n this.props.onChange(e.target.name, e.target.value);\n e.preventDefault();\n }\n render() {\n return (\n \n {this.props.options.map(item => (\n \n ))}\n \n )\n }\n}\n\n/*\nButtonSelector.propTypes = {\n options: PropTypes.arrayOf(PropTypes.shape({\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n description: PropTypes.string,\n })).isRequired,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired,\n onChange: PropTypes.func.isRequired,\n}\n*/\n\nexport default ButtonSelector;\n","import React, { Component } from 'react';\nimport { extendObservable, action, toJS } from 'mobx'\nimport { Validator } from '../lib/validator';\nimport PropTypes from 'prop-types';\nimport { Input, Form, Segment, Message, Icon } from 'semantic-ui-react'\nimport ButtonSelector from '../Components/ButtonSelector'\nimport { HeaderWithHelp } from './HelpText'\nimport { RoundDecimalPlaces } from '../lib/format'\n\nclass GenericFormStore {\n constructor() {\n extendObservable(this, {\n getFlattenedValues: (valueKey = 'value') => {\n let data = {};\n let form = toJS(this.form).fields;\n Object.keys(form).forEach(key => {\n data[key] = form[key][valueKey]\n });\n return data\n },\n getFlattenedAbsoluteValues: (convFunc, decimals=-1) => {\n let data = {}\n let form = toJS(this.form).fields;\n Object.keys(form).forEach(key => {\n data[key] = parseFloat(form[key][\"value\"])\n if (typeof convFunc === \"function\") {\n data[key] = convFunc(data[key])\n }\n if (decimals > 0) {\n data[key] = RoundDecimalPlaces(data[key], decimals)\n }\n if (form[key][\"negated\"]) {\n data[key] = -data[key]\n }\n })\n return data\n },\n getFlattenedAbsoluteMetricValues: (decimals=-1) => {\n return this.getFlattenedAbsoluteValues(this.toMetric, decimals)\n },\n onFieldChange: action((field, value) => {\n this.form.fields[field].value = value;\n var validation = new Validator(\n this.getFlattenedValues('value'),\n this.getFlattenedValues('rule'));\n const factor = this.form.meta.unitFactor || 1.0\n const decimals = this.form.meta.unitDecimals || 3\n this.form.meta.isValid = validation.passes(factor, decimals);\n this.form.fields[field].error = validation.errors.first(field)\n }),\n\n onAbsoluteMetricFieldChange: action((field, value, decimals=-1) => {\n this.form.fields[field].negated = value < 0\n let val = Math.abs(this.toUserPrefered(value))\n if (decimals >= 0) {\n val = RoundDecimalPlaces(val, decimals)\n }\n this.onFieldChange(field, val)\n }),\n\n getAbsolute: (field) => {\n let value = parseFloat(this.form.fields[field].value)\n return this.form.fields[field].negated ? -value : value\n },\n\n getAbsoluteMetric: (field) => {\n return this.toMetric(this.getAbsolute(field))\n },\n\n toMetric: (value) => {\n const factor = this.form.meta.unitFactor || 1.0\n return value / factor\n },\n toUserPrefered: (value) => {\n const factor = this.form.meta.unitFactor || 1.0\n return value * factor\n },/*\n unitName: computed(() => {\n return this.form.meta.unitName || \"meter\"\n }),*/\n setError: action((errMsg) => {\n this.form.meta.error = errMsg\n }),\n })\n }\n}\n\nconst SimpleFormInput = ({error, ...props}) => (\n props.onChange(e.target.name, e.target.value)}\n />\n)\n\n\nSimpleFormInput.propTypes = {\n // Not possible to check for string or null\n //error: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n}\n\nconst FormInput = ({error, ...props}) => (\n \n props.onChange(e.target.name, e.target.value)}/>\n \n)\n\n\nFormInput.propTypes = {\n // Not possible to check for string or null\n //error: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n}\n\nclass Configurator extends Component {\n render() {\n const { heading, help, options, value, onChange } = this.props\n return (\n
\n \n \n {this.props.children}\n
\n )\n }\n}\n\nConfigurator.propTypes = {\n options: PropTypes.arrayOf(PropTypes.shape({\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]),\n description: PropTypes.string,\n })).isRequired,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.bool,\n ]).isRequired,\n onChange: PropTypes.func.isRequired,\n heading: PropTypes.string.isRequired,\n help: PropTypes.string.isRequired,\n}\n\n\n\nconst FormSetupError = ({header, children}) => (\n \n \n {header}\n

\n {children}\n

\n
\n
\n)\n\nconst FormIsLoading = () => (\n \n \n \n \n Hang on\n

Loading data

\n
\n
\n
\n)\n\nexport { GenericFormStore, SimpleFormInput, FormInput, Configurator, FormSetupError, FormIsLoading }\n","import React, { Component } from 'react';\nimport { Button, Icon, Message } from 'semantic-ui-react'\nimport { PropTypes } from 'prop-types';\n\nclass ApplyFeedbackButton extends Component {\n render() {\n const { onClick, type, disabled, isStoring, storeSuccess, storeFailure } = this.props\n return (\n
\n \n {storeFailure && (\n Failed to store\n

{storeFailure}

\n
\n )}\n
\n )\n }\n}\n\nApplyFeedbackButton.propTypes = {\n type: PropTypes.string.isRequired,\n onClick: PropTypes.func.isRequired,\n disabled: PropTypes.bool.isRequired,\n isStoring: PropTypes.bool.isRequired,\n storeSuccess: PropTypes.bool.isRequired,\n storeFailure: PropTypes.string.isRequired,\n}\n\nexport default ApplyFeedbackButton;\n","import React, { Component, Fragment } from 'react';\nimport { Segment, Header, Message, Form, Table } from 'semantic-ui-react';\nimport { observer, inject } from 'mobx-react';\nimport { FormSetupError, FormIsLoading, SimpleFormInput, Configurator } from '../Components/FormStore';\nimport ApplyFeedbackButton from '../Components/ApplyFeedbackButton';\nimport { fetcher } from '../lib/fetch';\nimport useSWR from 'swr';\n\n// Simplify setting preset options for the GenericFormStore\nfunction remap(value, desc) {\n return { value: value, description: desc };\n}\n\nconst NetworkConfigFormView = observer(({ form, onChange }) => (\n
\n \n \n \n \n \n \n
\n));\n\nconst NetworkConfig = inject('networkConfigStore')(\n observer(\n class NetworkForm extends Component {\n componentDidMount() {\n this.props.networkConfigStore.fetch();\n }\n onChange = (key, val) => {\n console.log('Change ', key, val);\n this.props.networkConfigStore.formStore.form.fields.dhcp.value = val;\n this.props.networkConfigStore.storeError = ''; // Reset error on change\n };\n\n render() {\n const networkConfigStore = this.props.networkConfigStore;\n if (networkConfigStore.isLoading) {\n return ;\n }\n if (!networkConfigStore.loadSuccess) {\n return Error getting network configuration.;\n }\n let form = networkConfigStore.formStore.form;\n const onChangeStore = networkConfigStore.formStore.onFieldChange;\n return (\n
\n \n\n {form.fields.dhcp.value === 'false' && (\n
\n
\n \n
\n )}\n
\n {\n networkConfigStore.store();\n }}\n disabled={!form.meta.isValid || networkConfigStore.isStoring}\n isStoring={networkConfigStore.isStoring}\n storeSuccess={networkConfigStore.storeSuccess}\n storeFailure={networkConfigStore.storeSuccess ? '' : networkConfigStore.storeError}\n />\n {networkConfigStore.storeSuccess && (\n \n )}\n
\n );\n }\n }\n )\n);\n\nconst CurrentNetwork = () => {\n const { data, error } = useSWR('/api/v1/ip/current', fetcher);\n if (error) {\n return

Error loading status

;\n }\n if (!data) {\n return

Loading..

;\n }\n\n const entries = (data) ? (data) : []\n entries.sort((a, b) => a.address.localeCompare(b.address))\n return (\n <>\n
Network status
\n \n \n {entries.map((entry) => (\n \n \n IP address\n {entry.address}\n \n{/*\n \n Subnet Prefix\n \n {entry.prefix}\n \n \n */}\n \n ))}\n \n
\n \n );\n};\n\nconst Network = () => (\n \n
Network configuration
\n \n \n \n \n \n \n
\n);\n\nexport default Network;\n","import React, { useState, useEffect } from 'react';\nimport { Segment, Icon, Header, Form, Button, Table, Message } from 'semantic-ui-react';\nimport { fetcher } from '../lib/fetch';\nimport useSWR, { mutate } from 'swr';\nimport fetch from 'unfetch';\nimport { Configurator } from '../Components/FormStore';\n\nfunction SetNTP(ntp_server) {\n const data = {\n ntp_server: String(ntp_server),\n };\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n };\n return fetch('/api/v1/time/ntp', options);\n}\n\nfunction SetManual(time) {\n const data = {\n time: String(time),\n };\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n };\n return fetch('/api/v1/time/manual', options);\n}\n\nconst refreshNTP = () => {\n mutate('/api/v1/time');\n};\n\nfunction CurrentNTPServer() {\n const { data, error } = useSWR('/api/v1/time', fetcher);\n if (error) {\n console.log('config load error', error);\n return (\n \n );\n }\n if (!data) {\n return ;\n }\n\n const date = new Date(data.time).toString() || '?';\n return (\n <>\n
System time status
\n \n \n \n Time source\n \n {data.ntp_enabled ? 'Network Time Protocol' : 'Manual'}\n \n \n\n \n Time synchronized from NTP\n \n {data.ntp_synchronized ? 'Yes' : 'No'}\n \n \n\n \n NTP server\n \n {data.ntp_server}\n \n \n\n \n System time\n \n {date}\n \n \n \n
\n \n \n );\n}\n\nfunction NTPSet({ ntp_server }) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n const [submitError, setSubmitError] = useState('');\n const [ntpServer, setNtpServer] = useState(ntp_server);\n\n const onSubmit = async () => {\n setIsSubmitting(true);\n setIsSubmitSuccess(false);\n setSubmitError('');\n const result = await SetNTP(ntpServer);\n if (!result.ok) {\n const body = await result.json();\n console.log('submit error', body);\n setSubmitError(body.error);\n setIsSubmitSuccess(false);\n } else {\n console.log('submit success');\n setIsSubmitSuccess(true);\n setSubmitError('');\n setTimeout(() => {\n setIsSubmitSuccess(false);\n }, 5000);\n }\n setIsSubmitting(false);\n refreshNTP();\n };\n const onChangeNtpServer = (e) => {\n setNtpServer(e.target.value);\n };\n\n return (\n <>\n \n \n \n\n
\n \n Apply\n {isSubmitting && }\n {isSubmitSuccess && }\n \n
\n
\n {submitError && }\n
\n \n );\n}\n\nfunction ManualSet() {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n const [submitError, setSubmitError] = useState('');\n const [currentTime, setCurrentTime] = useState(new Date());\n\n useEffect(() => {\n let secTimer = setInterval(() => {\n setCurrentTime(new Date());\n }, 1000);\n\n return () => clearInterval(secTimer);\n }, []);\n\n const onSubmit = async () => {\n setIsSubmitting(true);\n setIsSubmitSuccess(false);\n setSubmitError('');\n const now = new Date().toISOString();\n const result = await SetManual(now);\n if (!result.ok) {\n const data = await result.json();\n console.log('submit error', data);\n setSubmitError(data.error || 'unknown error');\n setIsSubmitSuccess(false);\n } else {\n console.log('submit success');\n setIsSubmitSuccess(true);\n setSubmitError('');\n setTimeout(() => {\n setIsSubmitSuccess(false);\n }, 5000);\n }\n setIsSubmitting(false);\n refreshNTP();\n };\n console.log('err', submitError);\n return (\n <>\n
Your computer time
\n
\n {currentTime.toString()}\n
\n
\n \n Set manual time\n {isSubmitting && }\n {isSubmitSuccess && }\n \n
\n\n
\n {submitError && }\n
\n \n );\n}\n\nfunction remap(value, desc) {\n return { value: value, description: desc };\n}\n\nfunction NTPConfig({ ntp_server, ntp_enabled }) {\n const [ntpEnabled, setNTPEnabled] = useState(ntp_enabled);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n };\n const onChangeCheckBox = (e) => {\n setNTPEnabled(!ntpEnabled);\n };\n return (\n <>\n \n
\n \n\n
{ntpEnabled ? : }
\n \n
\n\n \n \n \n \n );\n}\n\nconst FetchNTP = () => {\n const { data, error } = useSWR('/api/v1/time', fetcher);\n if (error) {\n console.log('config load error', error);\n return ;\n }\n if (!data) {\n return ;\n }\n\n return ;\n};\n\nexport default FetchNTP;\n","import React, { useState } from 'react';\nimport { Popup, Button, Message } from 'semantic-ui-react';\n\nfunction SendReboot() {\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n return fetch('/api/v1/about/reboot', options);\n}\n\nconst RebootButton = () => {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n const [submitError, setSubmitError] = useState('');\n\n const reset = () => {\n setIsSubmitting(false);\n setIsSubmitSuccess(false);\n setSubmitError('');\n };\n\n const onClick = async () => {\n if (isSubmitting) {\n return;\n }\n reset();\n const result = await SendReboot();\n if (!result.ok) {\n const body = await result.json();\n console.log('submit error', body);\n setSubmitError(\"Error \" + body.error);\n setIsSubmitSuccess(false);\n } else {\n console.log('submit success');\n setIsSubmitSuccess(true);\n setSubmitError('');\n //setTimeout(() => {\n // setIsSubmitSuccess(false);\n //}, 5000);\n }\n setIsSubmitting(false);\n };\n\n return (\n \n Reboot\n \n }\n content={\n
\n \n
\n {submitError && }\n {isSubmitSuccess && }\n
\n
\n }\n on=\"click\"\n position=\"top left\"\n onOpen={reset}\n />\n );\n};\n\nexport { RebootButton };\n","import React, { useState } from 'react';\nimport { Segment, Icon, Header, Form, Button, Popup, Message } from 'semantic-ui-react';\nimport { fetcher } from '../lib/fetch';\nimport useSWR, { mutate } from 'swr';\nimport useForm from '../lib/useForm';\nimport { ApplyGenericConfig } from '../Components/ConfigGeneric';\nimport { FactoryResetButton } from '../Components/FactoryResetButton';\nimport { ExpandableSettings } from '../Components/ExpandableSettings';\nimport NetworkConfig from '../Components/ConfigNetwork';\nimport TimeConfig from '../Components/ConfigTime';\nimport { RebootButton } from '../Components/RebootButton';\nimport { ButtonResetGyro } from '../Components/Map/Buttons';\n\nasync function checkStatus(response) {\n if (response.ok) {\n return response;\n } else {\n const text = await response.text();\n var error = new Error(response.status + ' ' + response.statusText + ' ' + text);\n error.response = response;\n return Promise.reject(error);\n }\n}\n\nfunction Config() {\n const { data: configData, error: configError } = useSWR('/api/v1/config', fetcher);\n\n if (configError) {\n console.log('Config load error', configError);\n return (\n \n );\n }\n\n if (!configData) {\n return ;\n }\n\n return (\n
\n \n {\n \n
IMU
\n \n
\n }\n\n \n \n \n\n \n
System time configuration
\n \n
\n\n \n
Manage
\n \n \n
\n
\n
\n
\n );\n}\n\nconst SetGyro = () => {\n return (\n \n );\n};\n\nfunction HelpText({ help, header }) {\n return (\n }\n content={help}\n header={header}\n on={['hover', 'click']}\n />\n );\n}\n\nfunction isNumberWithin(val, min, max) {\n if (isNaN(val)) {\n return false;\n }\n if (val < min) {\n return false;\n }\n if (val > max) {\n return false;\n }\n return true;\n}\n\nfunction validate(values) {\n let errors = {};\n if (!isNumberWithin(values.speedOfSound, 1000, 2000)) {\n errors.speedOfSound = 'Speed of sound must be between 1000 and 2000';\n }\n if (!isNumberWithin(values.mountingOffset, 0, 360)) {\n errors.mountingOffset = 'Mounting rotation offset must be between 0 and 360';\n }\n console.log('Validate', values, errors);\n return errors;\n}\n\nfunction ConfigForm({ speedOfSound, mountingOffset, darkModeEnabled, acousticEnabled }) {\n const onSubmit = (values) => {\n console.log('Submit', values);\n setSubmitError(false);\n setIsSubmitSuccess(false);\n setIsSubmitting(true);\n ApplyGenericConfig(values.speedOfSound, values.acousticEnabled, values.darkModeEnabled, values.mountingOffset)\n .then((r) => {\n setIsSubmitting(false);\n setIsSubmitSuccess(true);\n setTimeout(() => {\n setIsSubmitSuccess(false);\n mutate('/api/v1/config');\n }, 1000);\n if (r.status === 503) {\n // Simulated\n setSubmitError('Not supported in simulation mode');\n } else {\n return checkStatus(r);\n }\n })\n .catch((e) => {\n console.log('Submit error', e, e.response);\n setIsSubmitting(false);\n setSubmitError(e.toString());\n mutate('/api/v1/config');\n });\n };\n\n const initial = {\n speedOfSound,\n mountingOffset,\n darkModeEnabled,\n acousticEnabled,\n };\n const { values, errors, handleChange, handleSubmit } = useForm(onSubmit, validate, initial);\n const [submitError, setSubmitError] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n\n const onChange = (e) => {\n handleChange(e.target.name, e.target.value);\n };\n\n const onChangeCheckBox = (e, val) => {\n const { name, checked } = val;\n handleChange(name, checked);\n };\n\n return (\n
\n \n
Acoustics
\n \n \n Speed of sound{' '}\n \n

\n }\n />\n
\n\n \n \n \n \n\n \n \n \n \n\n
Mounting
\n \n \n Mounting rotation offset{' '}\n \n

\n }\n />\n
\n\n \n\n {submitError && }\n
\n
\n );\n}\n\nexport default Config;\n","import React, { useState } from 'react';\nimport { Segment, Icon, Header } from 'semantic-ui-react'\nimport useSWR from 'swr';\nimport { fetcher } from '../lib/fetch'\n\n\nconst ReleaseItemList = ({items}) => (\n
    \n {items.map((d) => (
  • {d}
  • ))}\n
\n)\n\nconst ReleaseNote = ({version, changes, knownIssues, expanded: defaultExpanded}) => {\n const [expanded, setExpanded] = useState(defaultExpanded)\n\n const toggleExpanded = (e) => {\n setExpanded(!expanded)\n }\n const icon = expanded ? \"angle double up\" : \"angle double down\"\n\n return (\n \n
Release {version}
\n {expanded && (\n
\n
Changes
\n \n {knownIssues.length > 0 && (\n
\n
Known issues
\n \n
\n )}\n
\n )}\n
\n )\n}\n\n\nconst ReleaseNotes = () => {\n const {data, error} = useSWR('/api/v1/about/changes', fetcher, {revalidateOnFocus: false})\n if (error) {\n return \n }\n if (!data) {\n return
\n }\n return (\n
\n {data.map((d, i) => ())}\n
\n)\n}\n\nexport default ReleaseNotes;\n","import React from 'react';\nimport { observer } from 'mobx-react';\nimport { Icon, Message, List, Label, Button, Popup } from 'semantic-ui-react'\nimport { useStores } from '../Stores/use-stores'\n\nconst IconWithTitle = ({name, color, title}) => (\n \n }\n content={title}\n on={[\"hover\", \"click\"]}\n />\n \n)\n\nconst colorOK = \"#16a04f\"\n//const colorWarn = \"#f1c40f\"\nconst colorWarn = \"#eaae00\"\n\nconst VersionOK = () => (\n \n)\n\nconst VersionNeedsUpdate = ({url, version}) => (\n \n \n New version available ({version}) \n \n)\n\nconst VersionLoadError = ({error}) => (\n \n)\n\nconst UpdateAvailableIcon = observer(() => {\n const { aboutInfoStore } = useStores()\n const { updateAvailable, latestRelease } = aboutInfoStore.versionStore\n if (updateAvailable) {\n return (\n \n )\n }\n return ()\n})\n\nconst VersionStatusIconView = observer(() => {\n const { aboutInfoStore } = useStores()\n const { loading, error, latestRelease, updateAvailable, url } = aboutInfoStore.versionStore\n if (loading) {\n return ()\n } else if (error) {\n return ()\n }else if (updateAvailable) {\n return ()\n }\n return ()\n})\n\nconst VersionDetail = ({version, versionShort, chipid, updateURL}) => (\n \n \n \n \n Software version\n \n

\n \n \n \n)\n\nconst VersionView = observer(() => {\n const { aboutInfoStore } = useStores()\n const { version, versionShort, chipid, loadingError, isLoading } =aboutInfoStore\n\n const proto = window.location.protocol // http or https\n const host = window.location.host.split(\":\")[0] // Remove any port (if present)\n let updateURL = `${proto}//${host}:9000`\n if (isLoading) {\n return ()\n } else if (loadingError) {\n return ({loadingError})\n }\n return (\n \n )\n})\n\n/*\nconst HardwareSection = () => {\n return (\n

\n

Hardware

\n \n Click to flash LED on DVL.\n

\n Click to reset all settings to factory defaults.\n \n

\n )\n}\n*/\n\nclass About extends Component {\n render() {\n return (\n \n \n

Version information

\n \n

Browser compatibility

\n

This GUI has been tested and verified to work with the following browsers:

\n \n \n \n \n
\n\n \n\n

Release notes

\n \n\n

 

\n
\n )\n }\n}\n\nexport default About;\n","import { useState } from 'react';\n\nconst useEditable = () => {\n\n const [isEdit, setIsEdit] = useState(false);\n const startEdit = () => {\n setIsEdit(true);\n };\n const stopEdit = () => {\n setIsEdit(false);\n }\n\n return [\n isEdit,\n startEdit,\n stopEdit\n ]\n};\n\nexport default useEditable;\n","import React, { useState } from 'react';\nimport { Dropdown, Form, Header, Icon, Message, Segment, Table } from 'semantic-ui-react';\nimport useSWR, { mutate } from 'swr';\nimport { HeaderWithHelp, HelpPopup } from '../Components/HelpText';\nimport { fetcher } from '../lib/fetch';\nimport toastMaster from '../Toast';\nimport useForm from '../lib/useForm';\nimport useEditable from '../lib/useEditable';\n\nconst ShowRow = ({ title, children }) => (\n \n {title}\n {children}\n \n);\n\nconst ShowRowIfTruthy = ({ title, value }) => {\n if (!value) {\n return null;\n }\n return (\n \n {value}\n \n );\n};\n\nfunction isNumberWithin(val, min, max) {\n if (isNaN(val)) {\n return false;\n }\n if (val < min) {\n return false;\n }\n if (val > max) {\n return false;\n }\n return true;\n}\n\nasync function ApplyOutputSettings(id, port, speed, format) {\n const newPort = port || ''; // string\n const newSpeed = speed || 0; // integer\n const newFormat = format || \"\"; // string\n const body = {\n id: id,\n name: '',\n type: '',\n port: newPort,\n clients: 0,\n speed: newSpeed,\n format: newFormat,\n error: '',\n };\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n };\n console.log('ApplyOutputSettings', body);\n return fetch('/api/v1/outputs/' + id, options);\n}\n\nasync function onSubmitHandler(id, values, setIsSubmitting, setSubmitError, setIsSubmitSuccess, stopEdit) {\n setSubmitError(false);\n setIsSubmitSuccess(false);\n setIsSubmitting(true);\n const result = await ApplyOutputSettings(id, values.port, values.speed, values.format);\n\n if (!result.ok) {\n result.json().then((body) => {\n console.log('submit error', body);\n if (body.error) {\n setSubmitError(body.error);\n } else {\n // GOA errors don't have a 'error' field\n setSubmitError(JSON.stringify(body));\n }\n setIsSubmitSuccess(false);\n toastMaster.open({\n type: \"error\",\n message: \"Failed to apply output configuration\",\n duration: 3000,\n })\n });\n } else {\n console.log('submit success');\n setIsSubmitSuccess(true);\n setSubmitError('');\n mutate('/api/v1/outputs');\n setTimeout(() => {\n stopEdit();\n }, 50);\n toastMaster.open({\n type: \"success\",\n message: \"Output configuration success\",\n duration: 3000,\n })\n }\n setIsSubmitting(false);\n};\n\nfunction validatePorts(values) {\n let errors = {};\n if (!isNumberWithin(values.port, 1024, 9999)) {\n errors.port = 'Must be between 1024 and 9999';\n }\n console.log('Validation of ports', values, errors);\n return errors;\n}\n\nconst EditPort = ({ id, port, stopEdit }) => {\n const [submitError, setSubmitError] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n\n const onSubmit = () => onSubmitHandler(id, values, setIsSubmitting, setSubmitError, setIsSubmitSuccess, stopEdit);\n const initial = { port, speed: 0, format: '' };\n const { values, errors, handleChange, handleSubmit } = useForm(onSubmit, validatePorts, initial);\n\n const onChange = (e) => {\n handleChange(e.target.name, e.target.value);\n };\n\n return (\n \n
\n \n \n\n \n Apply \n {isSubmitting && }\n {isSubmitSuccess && }\n \n\n \n Cancel \n {isSubmitting && }\n \n \n\n {submitError && }\n \n
\n );\n};\n\nconst validBaudRates = [9600, 19200, 38400, 57600, 115200];\nconst slowBaudRates = [9600, 19200];\n\nfunction validateBaudRate(values) {\n let errors = {};\n if (!validBaudRates.includes(parseInt(values.speed))) {\n errors.speed = 'Must be one of ' + validBaudRates.join(', ');\n }\n console.log('Validation of baud rate', values, errors);\n return errors;\n}\n\nconst baudRateOptions = validBaudRates.map((rate) => ({\n key: rate,\n text: rate,\n value: rate,\n}));\n\nconst EditBaudRate = ({ id, speed, stopEdit }) => {\n const [submitError, setSubmitError] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n\n const onSubmit = () => onSubmitHandler(id, values, setIsSubmitting, setSubmitError, setIsSubmitSuccess, stopEdit);\n const initial = { speed, port: \"\", format: ''};\n const { values, errors, handleChange, handleSubmit } = useForm(onSubmit, validateBaudRate, initial);\n\n const onChange = (e, data) => {\n //handleChange(e.target.name, e.target.value);\n handleChange(\"speed\", data.value);\n };\n\n return (\n \n
\n \n \n\n \n Apply \n {isSubmitting && }\n {isSubmitSuccess && }\n \n\n \n Cancel \n {isSubmitting && }\n \n\n \n \n\n {submitError && }\n \n
\n );\n};\n\nfunction validateFormat(values) {\n let errors = {};\n if (!isNumberWithin(values.format, 0, 6)) {\n errors.port = 'Must be between 0 and 6';\n }\n console.log('Form validation', values, errors);\n return errors;\n}\n\nconst formatDisabled = '0';\n// list of available formats for the user to select. ordered by what seems logical to the user\n// capacity is the ranking of the required data volume. lower value means lower capacity requirement\nconst availableFormats = [\n {\"id\": '0', \"name\": \"Disabled\", \"capacity\": -1},\n {\"id\": '3', \"name\": \"WL - Serial V2\", \"capacity\": 3},\n {\"id\": '1', \"name\": \"WL - Serial V1 and V2\", \"capacity\": 4},\n {\"id\": '6', \"name\": \"PD4\", \"capacity\": 1},\n {\"id\": '2', \"name\": \"PD6\", \"capacity\": 2},\n // Disabled: {\"id\": '4', \"name\": \"V2, velocity only\", \"capacity\": -1},\n // Disabled: {\"id\": '5', \"name\": \"V2, position only\", \"capacity\": -1},\n];\n// create the array that DropDown needs\nconst formatOptions = availableFormats.map((format) => ({\n key: format.id,\n text: format.name,\n value: format.id,\n}));\n\n// array with available formats that have capacity > 0\nconst formatNamesWithCapacity = availableFormats.filter((format) => format.capacity > 0);\n// sort formats by data/volume capacity. lowest capacity first\nconst formatNameSortedByCapacity = formatNamesWithCapacity.sort((a, b) => a.capacity - b.capacity).map((format) => format.name);\n\n\nconst BaudRateWarning = ({speed}) => {\n if (!slowBaudRates.includes(speed)) {\n return null\n }\n\n const description = \"Baud rates \" + slowBaudRates.join(\", \") + \" might drop messages at high ping rates \" +\n \"(up to 15 Hz at low altitudes) depending on protocol in use.\\n\\n\" +\n \"Protocols ordered by data volume (least to most): \" + formatNameSortedByCapacity.join(\", \") + \".\\n\\n\" +\n \"Use a higher baud rate to avoid dropping messages.\\n\\n\" +\n \"An error will be shown on this page when messages are being dropped.\"\n\n return (\n Baud rate {speed} might drop messages\n \n \n )\n}\n\n\nconst EditFormat = ({ id, format, stopEdit }) => {\n const [submitError, setSubmitError] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSubmitSuccess, setIsSubmitSuccess] = useState(false);\n\n const onSubmit = () => onSubmitHandler(id, values, setIsSubmitting, setSubmitError, setIsSubmitSuccess, stopEdit);\n const initial = { format, port: \"\", speed: 0};\n const { values, errors, handleChange, handleSubmit } = useForm(onSubmit, validateFormat, initial);\n\n const onChange = (e, data) => {\n handleChange('format', data.value);\n };\n return (\n \n
\n \n \n \n Apply \n {isSubmitting && }\n {isSubmitSuccess && }\n \n\n \n Cancel \n {isSubmitting && }\n \n \n {submitError && }\n \n
\n );\n};\n\nconst ValueWithEditIcon = ({ title, value, editable, startEdit, children }) => (\n \n {value}\n  \n {editable && }\n {children}\n \n);\n\nconst ShowValueOrEditPort = ({ id, title, value, editable }) => {\n const [isEdit, startEdit, stopEdit] = useEditable();\n return (\n <>\n {isEdit ? (\n \n ) : (\n \n )}\n \n );\n};\n\nconst ShowValueOrEditBaudRate = ({ id, title, value, editable }) => {\n const [isEdit, startEdit, stopEdit] = useEditable();\n return (\n <>\n {isEdit ? (\n \n ) : (\n \n \n \n )}\n \n );\n};\n\nconst ShowValueOrEditFormat = ({ id, title, initialValue, value, editable }) => {\n const [isEdit, startEdit, stopEdit] = useEditable();\n return (\n <>\n {isEdit ? (\n \n ) : (\n \n )}\n \n );\n};\n\nconst ShowProtocol = ({ id, title, port, type, format, speed, clients, error }) => {\n const portIsEditable = id === 'tcp_pd6' || id === \"tcp_pd4\";\n const isSerial = id === 'serial';\n const formatValue = isSerial ? format.split(',')[0] : format;\n const formatId = isSerial ? format.split(',')[1] || formatDisabled : formatDisabled;\n return (\n \n
{title}
\n \n \n {port &&\n \n }\n \n {format && (\n \n )}\n {clients >= 0 && (\n \n {clients} \n {clients > 0 && }\n \n )}\n {speed > 0 && (\n \n )}\n \n \n
\n
\n );\n};\n\nconst OutputInner = () => {\n const { data, error } = useSWR('/api/v1/outputs/', fetcher, { refreshInterval: 2000, dedupingInterval: 100 });\n if (error) {\n return

Error getting outputs

;\n }\n if (!data) {\n return

Loading..

;\n }\n return (\n <>\n {data.map((el) => (\n \n ))}\n \n );\n};\n\nconst OutputRoute = () => (\n \n \n \n \n);\n\nexport default OutputRoute;\n","import React, { useState } from 'react';\nimport { Segment, Divider, Icon, Message, Button, Form, TextArea, Header, Popup, ButtonGroup } from 'semantic-ui-react'\nimport '../Graph.css'\n\n\nfunction SelectDuration({duration, onSelectDuration}) {\n return (\n {duration}
}\n content={\n \n \n \n \n \n \n }\n />\n )\n}\n\nconst defaultCollectionTime = 15;\n\nfunction Collect() {\n const [description, setDescription] = useState(\"\")\n const [duration, setDuration] = useState(defaultCollectionTime)\n\n const onChange = (e) => {\n setDescription(e.target.value)\n }\n\n return (\n \n\n Diagnostic report\n \n \n \n \n Generate report for analysis by Water Linked support\n \n
\n

Please make sure the DVL is in water and showing the behaviour you want assistance with.

\n
Clicking the button below initiates a \n \n  second data capture to share with the support team.\n
\n
\n
\n
\n\n
\n \n {duration !== defaultCollectionTime && ()}\n
Describe your setup and what you you are experiencing
\n \n \n \n \n \n \n
\n\n
\n )\n}\n\nexport default Collect\n","import React from 'react';\nimport { Segment, Divider } from 'semantic-ui-react';\nimport { ForceRangeModeSetting } from '../Components/RangeMode';\nimport { PeriodicCyclingSetting } from '../Components/PeriodicCycling';\nimport StatusView from '../Components/Debug/StatusView';\n//import Ekkolodd from '../Components/Debug/Ekkolodd';\n//import Rotation from '../Components/Debug/AhrsRotation';\n//import TempShutdownSetting from '../Components/Debug/DebugTempShutdown';\n\nfunction Debug() {\n return (\n \n Debug\n\n \n\n \n\n Status\n \n\n {/* [Dev] Temperature shutdown\n */}\n\n {/* [Dev] Rotation view\n */}\n\n {/* [Dev] Echo sounder view\n */}\n \n );\n}\n\nexport default Debug;\n","import React from 'react';\nimport { version } from '../../package.json';\nimport { fetcher } from '../lib/fetch';\nimport { capitalize } from '../lib/helpers';\nimport useSWR from 'swr';\n\n\nexport default function ProductNameAndVersion({include_title}) {\n const { data, error } = useSWR('/api/v1/about', fetcher);\n var productVersion = version;\n var variant = '';\n var productName = 'DVL';\n if (!error) {\n if (data) {\n productName = data.product_name;\n variant = capitalize(data.variant);\n productVersion = data.version_short;\n }\n }\n\n return (\n \n {include_title && (\n Water Linked DVL \n )}\n \n {productName} ({productVersion} {variant})\n \n \n );\n}\n","const capitalize = (s) => {\n if (typeof s !== 'string') return ''\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\n\nexport { capitalize }","import { extendObservable } from 'mobx'\nimport { GenericFormStore } from '../Components/FormStore'\nimport { rules } from '../lib/validator'\nimport axios from 'axios'\n\nclass NetworkConfigFormStore extends GenericFormStore {\n constructor() {\n super()\n extendObservable(this, {\n form: {\n fields: {\n address: {\n value: \"10.11.12.95\",\n error: null,\n rule:[rules.string()],\n },\n prefix: {\n value: 24,\n error: null,\n rule: [rules.between(1, 31)],\n },\n gateway: {\n value: \"10.11.12.1\",\n error: null,\n rule: [rules.string()],\n },\n dns: {\n value: \"10.11.12.1\",\n error: null,\n rule: [rules.string()],\n },\n dhcp: {\n value: \"true\",\n error: null,\n rule: [rules.string()],\n },\n },\n meta: {\n isValid: true,\n error: null,\n },\n },\n error: \"\",\n })\n }\n}\nclass NetworkConfigStore {\n constructor() {\n extendObservable(this, {\n formStore: new NetworkConfigFormStore(),\n loadSuccess: false,\n isLoading: false,\n isStoring: false,\n storeSuccess: false,\n loadingError: \"\",\n storeError: \"\",\n });\n }\n fetch() {\n this.isLoading = true\n axios.get('/api/v1/ip')\n .then((response) => {\n this.loadSuccess = true\n this.isLoading = false\n this.loadingError = \"\"\n this.formStore.form.fields.address.value = response.data.address\n this.formStore.form.fields.prefix.value = response.data.prefix\n this.formStore.form.fields.gateway.value = response.data.gateway\n this.formStore.form.fields.dns.value = response.data.dns\n this.formStore.form.fields.dhcp.value = response.data.dhcp ? \"true\" : \"false\"\n })\n .catch((e) => {\n this.loadSuccess = false\n this.isLoading = false\n this.loadingError = e.toString()\n console.log(this.loadingError)\n })\n\n }\n store() {\n this.isStoring = true\n let data = {\n \"address\": this.formStore.form.fields.address.value,\n \"prefix\": parseInt(this.formStore.form.fields.prefix.value,10),\n \"gateway\": this.formStore.form.fields.gateway.value,\n \"dns\": this.formStore.form.fields.dns.value,\n \"dhcp\": this.formStore.form.fields.dhcp.value === \"true\",\n }\n axios.put('/api/v1/ip', data)\n .then(response => {\n if (!response.data.success) {\n // Get error message from \"error\" field of the JSON and pass on\n throw new Error(response)\n }\n return response\n })\n .then(response => {\n console.log(\"stored\", response);\n this.storeSuccess = true;\n this.isStoring = false;\n this.storeError = \"\";\n return response\n })\n .catch((e) => {\n console.log(\"store error\", e.response.data.error.toString());\n this.isStoring = false;\n this.storeSuccess = false;\n this.storeError = e.response.data.error.toString()\n })\n }\n}\n\nexport default NetworkConfigStore\n\n","import React from 'react';\nimport { Message, Popup, Button, Icon } from 'semantic-ui-react';\nimport { observer } from 'mobx-react';\nimport { useStores } from '../../Stores/use-stores';\n\nconst ShowWarning = ({ message, color }) => (\n {message}}\n />\n);\n\n// colors matching the semantic ui colors\nconst severityToColorMapping = {\n info: {name: \"blue\", code:\"#2185d0\"},\n warning: {name: \"orange\", code: '#f2711c'},\n error: {name: \"red\", code: '#f02101'},\n};\n\nconst WarningMessages = observer(() => {\n const { warningMessageStore } = useStores();\n return ;\n});\n\nconst WarningMessagesView = ({messages}) => {\n const severityToColor = (severity) => {\n return severityToColorMapping[severity] || {name: \"blue\", code:'#2185d0'};\n };\n // Default everything is good.\n let buttonColor = \"black\"\n let buttonIcon = \"check\"\n let buttonTitle = \"Operational\"\n if (messages.length > 0) {\n // Messages are sorted with the most important message first\n const severity = messages[0].severity;\n const description = severity === \"error\" ? \"Error\" : \"Warning\"\n buttonColor = severityToColor(severity).name\n buttonTitle = `${description} ( ${messages.length} )`\n buttonIcon = \n }\n return (\n }\n content={\n
\n {messages.map((d) => (\n \n ))}\n {messages.length === 0 && (

No problems detected

)}\n
\n }\n on=\"click\"\n position=\"bottom right\"\n flowing\n />\n );\n}\n\nexport { WarningMessages };\n","import React, { useState } from 'react';\nimport { Message, Icon } from 'semantic-ui-react';\nimport { fetcher } from '../../lib/fetch';\nimport useSWR from 'swr';\nimport { ButtonResetGyro } from '../Map/Buttons';\n\nfunction WarnIMUReset() {\n const [visible, setVisible] = useState(true)\n const { data, error } = useSWR('/api/v1/imu/reset_gyros', fetcher);\n if (!data) {\n return null;\n }\n if (error) {\n return null;\n }\n if (!visible) {\n return null;\n }\n if (data.need_reset) {\n return (\n setVisible(false)}>\n \n \n Improve dead reckoning performance\n Reset IMU drift compensation for optimum dead reckoning performance.\n
\n \n
\n
\n );\n }\n return null;\n}\n\nexport default WarnIMUReset;\n","import React, { useState } from 'react';\nimport { HashRouter as Router, Route, Link, Switch } from 'react-router-dom';\nimport { Menu, Icon } from 'semantic-ui-react';\nimport { Sidebar, Segment, Responsive } from 'semantic-ui-react';\nimport { Provider } from 'mobx-react';\nimport ErrorBoundary from './Components/ErrorBoundary';\nimport './App.css';\nimport 'semantic-ui-css-offline';\nimport 'notyf/notyf.min.css';\nimport Dashboard from './Routes/Dashboard';\nimport Diagnostic from './Routes/Diagnostic';\nimport Config from './Routes/Config';\nimport About from './Routes/About';\nimport Outputs from './Routes/Outputs';\nimport Collect from './Routes/Collect';\nimport Debug from './Routes/Debug';\nimport ProductNameAndVersion from './Components/ProductNameAndVersion';\nimport NetworkConfigStore from './Stores/NetworkConfig';\nimport { WarningMessages } from './Components/Warnings/WarningMessages';\nimport { UpdateAvailableIcon } from './Components/VersionInfo';\nimport { WaterLinkedLogoWithLedBlink } from './Components/LEDButton';\nimport WarnIMUReset from './Components/Warnings/WarnIMUReset';\n\nconst networkConfigStore = new NetworkConfigStore();\n\n\nconst App = () => {\n const [isFullScreen, setIsFullscreen] = useState(false);\n const [menuVisible, setMenuVisible] = useState(false);\n const toggleVisibility = () => setMenuVisible(!menuVisible);\n const navigate = (e) => {\n setMenuVisible(false);\n };\n\n return (\n \n \n \n \n \n Menu   \n \n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Dashboard\n \n \n \n \n \n Outputs\n \n \n \n \n \n Configuration\n \n \n \n \n \n Diagnostic\n \n \n \n \n \n Diagnostic report\n \n \n \n \n \n About\n \n \n \n \n \n \n \n \n {/* */}\n \n \n \n \n (\n \n )}\n />\n \n \n \n \n \n \n \n \n \n {/* */}\n \n \n \n );\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}