Skip to content

Commit 8f86b9d

Browse files
committed
Feat (Logic Analyzer): Auto Recapture and Capture Time slider
Capture time slider is changed to allow for larger values and more fine-tuned control. Auto Recapture checkbox added to have the logic analyzer continously recapture until an event is detected. The Graph component is recieving the LA data and if a capture has no event within it and the auto recapture is on, the LA is toggled back on. Standarized UI to use μs which is converted to ms for the backend communication. Fix (Logic Analyzer): Define inputCheck The CustomDialog dispatch needs an inputCheck function to be defined. The Logic Analyzer capture time slider will always be an non-negative float so inputCheck will check for that.
1 parent 2a7f356 commit 8f86b9d

File tree

6 files changed

+95
-119
lines changed

6 files changed

+95
-119
lines changed

src/screen/LogicAnalyzer/LogicAnalyzer.js

Lines changed: 21 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,18 @@ const loadBalancer = window.require('electron-load-balancer');
1313
class LogicAnalyzer extends Component {
1414
constructor(props) {
1515
super(props);
16-
this.captureTimeList = [0.05, 0.1, 0.25, 0.5, 1, 2];
1716
this.state = {
18-
captureTimeIndex: 0,
1917
isReading: false,
18+
isAutoReading: true,
2019
numberOfChannels: 1,
2120
channel1Map: 'ID1',
2221
channel2Map: 'ID2',
2322
trigger1Type: 1,
2423
trigger2Type: 1,
2524
trigger3Type: 1,
2625
trigger4Type: 1,
27-
timeMeasureChannel1: 'ID1',
28-
timeMeasureChannel2: 'ID2',
29-
timeMeasuretrigger1Type: 1,
30-
timeMeasuretrigger2Type: 1,
31-
timeMeasureWrite1: 1,
32-
timeMeasureWrite2: 2,
33-
timeout: 10,
26+
captureTime: 1, // ms
27+
maxCaptureTime: 1e3, // ms
3428
};
3529
}
3630

@@ -49,7 +43,7 @@ class LogicAnalyzer extends Component {
4943
trigger4Type,
5044
} = args;
5145
this.setState({
52-
captureTimeIndex: this.captureTimeList.indexOf(captureTime),
46+
captureTime,
5347
numberOfChannels,
5448
trigger1Type,
5549
trigger2Type,
@@ -80,7 +74,7 @@ class LogicAnalyzer extends Component {
8074
sendConfigToDevice = debounce(() => {
8175
const { isConnected } = this.props;
8276
const {
83-
captureTimeIndex,
77+
captureTime,
8478
numberOfChannels,
8579
trigger1Type,
8680
trigger2Type,
@@ -90,7 +84,7 @@ class LogicAnalyzer extends Component {
9084
isConnected &&
9185
loadBalancer.sendData(ipcRenderer, 'linker', {
9286
command: 'SET_CONFIG_LA',
93-
captureTime: this.captureTimeList[captureTimeIndex],
87+
captureTime: captureTime,
9488
numberOfChannels,
9589
trigger1Type,
9690
trigger2Type,
@@ -112,6 +106,9 @@ class LogicAnalyzer extends Component {
112106
});
113107
}
114108
};
109+
toggleAutoRead = () => {
110+
this.setState(prevState => ({ isAutoReading: !prevState.isAutoReading }));
111+
};
115112

116113
changeNumberOfChannels = event => {
117114
this.setState(
@@ -139,30 +136,10 @@ class LogicAnalyzer extends Component {
139136
);
140137
};
141138

142-
changeTimeMeasureChannel = channelName => event => {
143-
this.setState({
144-
[channelName]: event.target.value,
145-
});
146-
};
147-
changeTimeMeasureTriggerType = triggerNumber => event => {
148-
this.setState({
149-
[triggerNumber]: event.target.value,
150-
});
151-
};
152-
changeTimeMeasureWrite = writeNumber => event => {
153-
this.setState({
154-
[writeNumber]: event.target.value,
155-
});
156-
};
157-
changeTimeout = (event, value) => {
158-
this.setState({
159-
timeout: value,
160-
});
161-
};
162-
onChangeCaptureTimeIndex = (event, value) => {
139+
onChangeCaptureTime = (event, value) => {
163140
this.setState(
164141
() => ({
165-
captureTimeIndex: value,
142+
captureTime: value / 1e3, // convert μs to ms
166143
}),
167144
() => {
168145
this.sendConfigToDevice();
@@ -172,21 +149,16 @@ class LogicAnalyzer extends Component {
172149
render() {
173150
const {
174151
isReading,
152+
isAutoReading,
175153
numberOfChannels,
176154
channel1Map,
177155
channel2Map,
178156
trigger1Type,
179157
trigger2Type,
180158
trigger3Type,
181159
trigger4Type,
182-
timeMeasureChannel1,
183-
timeMeasureChannel2,
184-
timeMeasuretrigger1Type,
185-
timeMeasuretrigger2Type,
186-
timeMeasureWrite1,
187-
timeMeasureWrite2,
188-
timeout,
189-
captureTimeIndex,
160+
captureTime,
161+
maxCaptureTime,
190162
} = this.state;
191163
const { isConnected } = this.props;
192164
return (
@@ -200,38 +172,29 @@ class LogicAnalyzer extends Component {
200172
trigger2Type={trigger2Type}
201173
trigger3Type={trigger3Type}
202174
trigger4Type={trigger4Type}
203-
timeMeasureChannel1={timeMeasureChannel1}
204-
timeMeasureChannel2={timeMeasureChannel2}
205-
timeMeasuretrigger1Type={timeMeasuretrigger1Type}
206-
timeMeasuretrigger2Type={timeMeasuretrigger2Type}
207-
timeMeasureWrite1={timeMeasureWrite1}
208-
timeMeasureWrite2={timeMeasureWrite2}
209-
timeout={timeout}
210175
changeNumberOfChannels={this.changeNumberOfChannels}
211176
changeChannelMap={this.changeChannelMap}
212177
changeTriggerType={this.changeTriggerType}
213-
changeTimeMeasureChannel={this.changeTimeMeasureChannel}
214-
changeTimeMeasureTriggerType={this.changeTimeMeasureTriggerType}
215-
changeTimeMeasureWrite={this.changeTimeMeasureWrite}
216-
changeTimeout={this.changeTimeout}
217-
captureTimeIndex={captureTimeIndex}
218-
captureTime={this.captureTimeList[captureTimeIndex]}
219-
onChangeCaptureTimeIndex={this.onChangeCaptureTimeIndex}
220-
captureTimeListLength={this.captureTimeList.length}
178+
onChangeCaptureTime={this.onChangeCaptureTime}
179+
captureTime={captureTime}
180+
maxCaptureTime={maxCaptureTime}
221181
/>
222182
}
223183
actionButtons={
224184
<ActionButtons
225185
isConnected={isConnected}
226186
isReading={isReading}
227187
toggleRead={this.toggleRead}
188+
isAutoReading={isAutoReading}
189+
toggleAutoRead={this.toggleAutoRead}
228190
/>
229191
}
230192
graph={
231193
<Graph
232194
isReading={isReading}
233-
numberOfChannels={numberOfChannels}
234195
toggleRead={this.toggleRead}
196+
isAutoReading={isAutoReading}
197+
numberOfChannels={numberOfChannels}
235198
dataPath={this.props.dataPath}
236199
/>
237200
}

src/screen/LogicAnalyzer/components/ActionButtons.js

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,49 @@
11
import React from 'react';
2-
import { Button } from '@material-ui/core';
2+
import { Checkbox, FormControlLabel, Button } from '@material-ui/core';
33
import { withStyles } from '@material-ui/core/styles';
4-
import { ButtonWrapper } from './ActionButtons.styles';
4+
import {
5+
ActionButtonsWrapper,
6+
ButtonWrapper,
7+
CheckboxWrapper,
8+
} from './ActionButtons.styles';
59

610
const styles = () => ({
711
buttonMargin: {
812
margin: '0px 0px 0px 16px',
913
},
1014
});
1115

12-
const ActionButtons = ({ isConnected, isReading, toggleRead, classes }) => {
16+
const ActionButtons = ({
17+
isConnected,
18+
isReading,
19+
toggleRead,
20+
isAutoReading,
21+
toggleAutoRead,
22+
classes,
23+
}) => {
1324
return (
14-
<ButtonWrapper>
15-
<Button
16-
fullWidth={true}
17-
variant="contained"
18-
size="large"
19-
disabled={!isConnected}
20-
onClick={toggleRead}
21-
style={{ color: '#d32f2f' }}
22-
>
23-
{isReading ? <b>ANALYZING</b> : <b>ANALYZE</b>}
24-
</Button>
25-
</ButtonWrapper>
25+
<ActionButtonsWrapper>
26+
<ButtonWrapper>
27+
<Button
28+
fullWidth={true}
29+
variant="contained"
30+
size="large"
31+
disabled={!isConnected}
32+
onClick={toggleRead}
33+
style={{ color: '#d32f2f' }}
34+
>
35+
{isReading ? <b>ANALYZING</b> : <b>ANALYZE</b>}
36+
</Button>
37+
</ButtonWrapper>
38+
<CheckboxWrapper>
39+
<FormControlLabel
40+
control={
41+
<Checkbox checked={isAutoReading} onChange={toggleAutoRead} />
42+
}
43+
label="Auto Recapture"
44+
/>
45+
</CheckboxWrapper>
46+
</ActionButtonsWrapper>
2647
);
2748
};
2849

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
import styled from 'styled-components';
2+
import { Card } from '@material-ui/core';
3+
4+
export const ActionButtonsWrapper = styled(Card)`
5+
width: calc(100% - 16px);
6+
margin: 16px;
7+
`;
28

39
export const ButtonWrapper = styled.div`
410
display: flex;
5-
margin: 16px;
11+
margin: 16px 16px 0px 16px;
612
width: calc(100% - 32px);
713
justify-content: center;
814
align-items: center;
915
`;
16+
17+
export const CheckboxWrapper = styled.div`
18+
display: flex;
19+
justify-content: center;
20+
align-items: center;
21+
`;

src/screen/LogicAnalyzer/components/Graph.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,18 @@ class Graph extends Component {
5151

5252
componentDidMount() {
5353
ipcRenderer.on('LA_DATA', (event, args) => {
54-
const { isReading, toggleRead } = this.props;
54+
const { isReading, toggleRead, isAutoReading } = this.props;
5555
if (isReading) {
5656
this.setState({
5757
...args.data,
5858
});
5959
toggleRead();
60+
const reducer = (accumulator, currentArray) =>
61+
accumulator && currentArray.length == 0;
62+
const noEventsDetected = Object.values(args.data).reduce(reducer, true);
63+
if (isAutoReading && noEventsDetected) {
64+
toggleRead();
65+
}
6066
}
6167
});
6268

@@ -112,7 +118,7 @@ class Graph extends Component {
112118
tickCount={20}
113119
interval="preserveStart"
114120
>
115-
<Label value="mSec" position="bottom" />
121+
<Label value="μs" position="bottom" />
116122
</XAxis>
117123
<YAxis yAxisId="left" domain={['dataMin - 2', 'dataMax + 2']} />
118124
<YAxis dataKey="voltage" yAxisId="right" orientation="right" />

src/screen/LogicAnalyzer/components/Settings.js

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,12 @@ const Settings = ({
1616
trigger2Type,
1717
trigger3Type,
1818
trigger4Type,
19-
timeMeasureChannel1,
20-
timeMeasureChannel2,
21-
timeMeasuretrigger1Type,
22-
timeMeasuretrigger2Type,
23-
timeMeasureWrite1,
24-
timeMeasureWrite2,
25-
timeout,
2619
changeNumberOfChannels,
2720
changeChannelMap,
2821
changeTriggerType,
29-
changeTimeMeasureChannel,
30-
changeTimeMeasureTriggerType,
31-
changeTimeMeasureWrite,
32-
changeTimeout,
33-
captureTimeListLength,
34-
captureTimeIndex,
22+
onChangeCaptureTime,
3523
captureTime,
36-
onChangeCaptureTimeIndex,
24+
maxCaptureTime,
3725
}) => (
3826
<SettingsContainer>
3927
<FixedWrapper>
@@ -56,24 +44,10 @@ const Settings = ({
5644
changeTriggerType={changeTriggerType}
5745
/>
5846
<TimeParameters
59-
captureTimeListLength={captureTimeListLength}
60-
captureTimeIndex={captureTimeIndex}
47+
onChangeCaptureTime={onChangeCaptureTime}
6148
captureTime={captureTime}
62-
onChangeCaptureTimeIndex={onChangeCaptureTimeIndex}
49+
maxCaptureTime={maxCaptureTime}
6350
/>
64-
{/* <AnalysisParameters
65-
timeMeasureChannel1={timeMeasureChannel1}
66-
timeMeasureChannel2={timeMeasureChannel2}
67-
timeMeasuretrigger1Type={timeMeasuretrigger1Type}
68-
timeMeasuretrigger2Type={timeMeasuretrigger2Type}
69-
timeMeasureWrite1={timeMeasureWrite1}
70-
timeMeasureWrite2={timeMeasureWrite2}
71-
timeout={timeout}
72-
changeTimeMeasureChannel={changeTimeMeasureChannel}
73-
changeTimeMeasureTriggerType={changeTimeMeasureTriggerType}
74-
changeTimeMeasureWrite={changeTimeMeasureWrite}
75-
changeTimeout={changeTimeout}
76-
/> */}
7751
</Scrollbars>
7852
</ScrollWrapper>
7953
</SettingsContainer>

src/screen/LogicAnalyzer/components/TimeParameters.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { Typography, Divider } from '@material-ui/core';
33
import CustomSliderInput from '../../../components/CustomSliderInput';
44
import { SettingsWrapper, OptionsRowWrapper } from './Settings.styles';
55

6+
const inputCheck = value => {
7+
let regex = /(^([0-9]+([.][0-9]*)?|[.][0-9]+)$|^$)/; // non-negative float or blank
8+
return regex.test(value);
9+
};
10+
611
class TimeParameters extends Component {
712
render() {
8-
const {
9-
captureTimeListLength,
10-
captureTimeIndex,
11-
captureTime,
12-
onChangeCaptureTimeIndex,
13-
} = this.props;
13+
const { onChangeCaptureTime, captureTime, maxCaptureTime } = this.props;
1414
return (
1515
<SettingsWrapper>
1616
<Typography style={{ padding: '0.6rem' }} component="h6" variant="h6">
@@ -20,15 +20,15 @@ class TimeParameters extends Component {
2020
<OptionsRowWrapper>
2121
<CustomSliderInput
2222
title="captureTime"
23-
unit="ms"
24-
onChangeSlider={onChangeCaptureTimeIndex}
25-
value={captureTimeIndex}
26-
min={0}
27-
max={captureTimeListLength - 1}
28-
step={1}
23+
unit="μs"
24+
onChangeSlider={onChangeCaptureTime}
25+
value={captureTime * 1e3} // convert ms to μs
26+
min={10}
27+
max={maxCaptureTime * 1e3} // convert ms to μs
28+
inputCheck={inputCheck}
29+
step={10}
2930
minTitleWidth="60px"
3031
minUnitWidth="66px"
31-
display={captureTime}
3232
/>
3333
</OptionsRowWrapper>
3434
</SettingsWrapper>

0 commit comments

Comments
 (0)