Skip to content

Commit ebd894e

Browse files
committed
WIP Build out demo UI
1 parent e2ac458 commit ebd894e

File tree

8 files changed

+238
-23
lines changed

8 files changed

+238
-23
lines changed

Assets/Scripts/Models/MainReducers.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ public static MainState SetIsAutomationEnabledReducer(MainState state, IAction<b
1313
return state with { IsAutomationEnabled = action.payload };
1414
}
1515

16-
public static MainState SetIsDemoEnabledReducer(MainState state, IAction<bool> action)
17-
{
18-
return state with { IsDemoEnabled = action.payload };
19-
}
20-
2116
public static MainState SetMainSplitViewStateReducer(
2217
MainState state,
2318
IAction<SplitView.State> action
@@ -40,9 +35,6 @@ public static class MainActions
4035
public static readonly ActionCreator<bool> SET_IS_AUTOMATION_ENABLED =
4136
$"{SliceNames.MAIN_SLICE}/SetIsAutomationEnabled";
4237

43-
public static readonly ActionCreator<bool> SET_IS_DEMO_ENABLED =
44-
$"{SliceNames.MAIN_SLICE}/SetIsDemoEnabled";
45-
4638
public static readonly ActionCreator<SplitView.State> SET_MAIN_SPLIT_VIEW_STATE =
4739
$"{SliceNames.MAIN_SLICE}/SetMainSplitViewState";
4840

Assets/Scripts/Models/Scene/ManipulatorState.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,15 @@ public record ManipulatorState
7070
public int DrivePastDistance;
7171

7272
#endregion
73+
74+
#region Demo
75+
76+
public Vector4 DemoHomeCoordinate;
77+
78+
public Vector4 DemoTargetCoordinate;
79+
80+
public bool IsDemoRunning;
81+
82+
#endregion
7383
}
7484
}

Assets/Scripts/Models/Scene/SceneReducers.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,54 @@ public static SceneState SetManipulatorManualControlEnabledReducer(
680680
return state with { Manipulators = manipulatorsCopy };
681681
}
682682

683+
public static SceneState SetManipulatorDemoHomeCoordinateReducer(
684+
SceneState state,
685+
IAction<(string Id, Vector4 DemoHomeCoordinate)> action
686+
)
687+
{
688+
var index = state.Manipulators.FindIndex(m => m.Id == action.payload.Id);
689+
if (index == -1)
690+
return state;
691+
var manipulatorsCopy = state.Manipulators.ToList();
692+
manipulatorsCopy[index] = manipulatorsCopy[index] with
693+
{
694+
DemoHomeCoordinate = action.payload.DemoHomeCoordinate,
695+
};
696+
return state with { Manipulators = manipulatorsCopy };
697+
}
698+
699+
public static SceneState SetManipulatorDemoTargetCoordinateReducer(
700+
SceneState state,
701+
IAction<(string Id, Vector4 DemoTargetCoordinate)> action
702+
)
703+
{
704+
var index = state.Manipulators.FindIndex(m => m.Id == action.payload.Id);
705+
if (index == -1)
706+
return state;
707+
var manipulatorsCopy = state.Manipulators.ToList();
708+
manipulatorsCopy[index] = manipulatorsCopy[index] with
709+
{
710+
DemoTargetCoordinate = action.payload.DemoTargetCoordinate,
711+
};
712+
return state with { Manipulators = manipulatorsCopy };
713+
}
714+
715+
public static SceneState SetManipulatorDemoRunningReducer(
716+
SceneState state,
717+
IAction<(string Id, bool IsDemoRunning)> action
718+
)
719+
{
720+
var index = state.Manipulators.FindIndex(m => m.Id == action.payload.Id);
721+
if (index == -1)
722+
return state;
723+
var manipulatorsCopy = state.Manipulators.ToList();
724+
manipulatorsCopy[index] = manipulatorsCopy[index] with
725+
{
726+
IsDemoRunning = action.payload.IsDemoRunning,
727+
};
728+
return state with { Manipulators = manipulatorsCopy };
729+
}
730+
683731
#endregion
684732

685733
#region Automation Reducers
@@ -1138,6 +1186,24 @@ bool ManualControlEnabled
11381186
)> SET_MANIPULATOR_MANUAL_CONTROL_ENABLED =
11391187
$"{SliceNames.SCENE_SLICE}/SetManipulatorManualControlEnabled";
11401188

1189+
public static readonly ActionCreator<(
1190+
string Id,
1191+
Vector4 DemoHomeCoordinate
1192+
)> SET_MANIPULATOR_DEMO_HOME_COORDINATE =
1193+
$"{SliceNames.SCENE_SLICE}/SetManipulatorDemoHomeCoordinate";
1194+
1195+
public static readonly ActionCreator<(
1196+
string Id,
1197+
Vector4 DemoTargetCoordinate
1198+
)> SET_MANIPULATOR_DEMO_TARGET_COORDINATE =
1199+
$"{SliceNames.SCENE_SLICE}/SetManipulatorDemoTargetCoordinate";
1200+
1201+
public static readonly ActionCreator<(
1202+
string Id,
1203+
bool IsDemoRunning
1204+
)> SET_MANIPULATOR_DEMO_RUNNING =
1205+
$"{SliceNames.SCENE_SLICE}/SetManipulatorDemoRunning";
1206+
11411207
#endregion
11421208

11431209
#region Automation Actions

Assets/Scripts/Services/EphysLinkService.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -669,13 +669,13 @@ public async Task SetManipulatorDuraOffsetToCurrentDepth(string manipulatorId)
669669
var visualizationProbeState = currentSceneState.Probes.FirstOrDefault(state =>
670670
state.Name == currentSceneState.ActiveManipulatorState.VisualizationProbeName
671671
);
672-
672+
673673
Debug.Log("Collecting info");
674-
674+
675675
// Exit if we cannot find the visualization probe manager or state.
676676
if (visualizationProbeManager == null || visualizationProbeState == null)
677677
return;
678-
678+
679679
Debug.Log("Found viz states and manager");
680680

681681
if (visualizationProbeManager.IsProbeInBrain())
@@ -693,7 +693,7 @@ public async Task SetManipulatorDuraOffsetToCurrentDepth(string manipulatorId)
693693
// We need to calculate the surface coordinate ourselves
694694
var (brainSurfaceCoordinateIdx, _) =
695695
visualizationProbeManager.CalculateEntryCoordinate();
696-
696+
697697
// Exit if not in brain.
698698
if (float.IsNaN(brainSurfaceCoordinateIdx.x))
699699
return;
@@ -716,6 +716,28 @@ public async Task SetManipulatorDuraOffsetToCurrentDepth(string manipulatorId)
716716
);
717717
}
718718

719+
public async Task SetManipulatorDemoHomeCoordinateToCurrentPosition(string manipulatorId)
720+
{
721+
var currentPositionResponse = await GetPosition(manipulatorId);
722+
if (HasError(currentPositionResponse.Error))
723+
return;
724+
_storeService.Store.Dispatch(
725+
SceneActions.SET_MANIPULATOR_DEMO_HOME_COORDINATE,
726+
(manipulatorId, currentPositionResponse.Position)
727+
);
728+
}
729+
730+
public async Task SetManipulatorDemoTargetCoordinateToCurrentPosition(string manipulatorId)
731+
{
732+
var currentPositionResponse = await GetPosition(manipulatorId);
733+
if (HasError(currentPositionResponse.Error))
734+
return;
735+
_storeService.Store.Dispatch(
736+
SceneActions.SET_MANIPULATOR_DEMO_TARGET_COORDINATE,
737+
(manipulatorId, currentPositionResponse.Position)
738+
);
739+
}
740+
719741
#endregion
720742
}
721743
}

Assets/Scripts/Services/StoreService.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ public StoreService(LocalStorageService localStorageService)
6060
MainActions.SET_IS_AUTOMATION_ENABLED,
6161
MainReducers.SetIsAutomationEnabledReducer
6262
)
63-
.AddCase(
64-
MainActions.SET_IS_DEMO_ENABLED,
65-
MainReducers.SetIsDemoEnabledReducer
66-
)
6763
.AddCase(
6864
MainActions.SET_MAIN_SPLIT_VIEW_STATE,
6965
MainReducers.SetMainSplitViewStateReducer
@@ -157,6 +153,18 @@ public StoreService(LocalStorageService localStorageService)
157153
SceneActions.SET_MANIPULATOR_MANUAL_CONTROL_ENABLED,
158154
SceneReducers.SetManipulatorManualControlEnabledReducer
159155
)
156+
.AddCase(
157+
SceneActions.SET_MANIPULATOR_DEMO_HOME_COORDINATE,
158+
SceneReducers.SetManipulatorDemoHomeCoordinateReducer
159+
)
160+
.AddCase(
161+
SceneActions.SET_MANIPULATOR_DEMO_TARGET_COORDINATE,
162+
SceneReducers.SetManipulatorDemoTargetCoordinateReducer
163+
)
164+
.AddCase(
165+
SceneActions.SET_MANIPULATOR_DEMO_RUNNING,
166+
SceneReducers.SetManipulatorDemoRunningReducer
167+
)
160168
// Automation.
161169
.AddCase(
162170
SceneActions.SET_TARGET_INSERTION_PROBE_NAME,

Assets/Scripts/UI/ViewModels/ManipulatorInspectorViewModel.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ public partial class ManipulatorInspectorViewModel
4848
[ObservableProperty]
4949
private bool _isManualControlEnabled;
5050

51+
[ObservableProperty]
52+
private Vector4 _demoHomeCoordinate;
53+
54+
[ObservableProperty]
55+
private Vector4 _demoTargetCoordinate;
56+
57+
[ObservableProperty]
58+
private bool _isDemoRunning;
59+
5160
#endregion
5261

5362
public ManipulatorInspectorViewModel(
@@ -81,6 +90,9 @@ private void OnSceneStateChanged(SceneState sceneState)
8190
ReferenceCoordinateOffset = sceneState.ActiveManipulatorState.ReferenceCoordinateOffset;
8291
DuraOffset = sceneState.ActiveManipulatorState.DuraOffset;
8392
IsManualControlEnabled = sceneState.ActiveManipulatorState.ManualControlEnabled;
93+
DemoHomeCoordinate = sceneState.ActiveManipulatorState.DemoHomeCoordinate;
94+
DemoTargetCoordinate = sceneState.ActiveManipulatorState.DemoTargetCoordinate;
95+
IsDemoRunning = sceneState.ActiveManipulatorState.IsDemoRunning;
8496
}
8597

8698
private void OnShuttingDown()
@@ -162,6 +174,49 @@ private void SetManualControlEnabled(bool isEnabled)
162174
);
163175
}
164176

177+
[ICommand]
178+
private void SetDemoHomeCoordinate(Vector4 coordinate)
179+
{
180+
_storeService.Store.Dispatch(
181+
SceneActions.SET_MANIPULATOR_DEMO_HOME_COORDINATE,
182+
(ActiveManipulatorId, coordinate)
183+
);
184+
}
185+
186+
[ICommand]
187+
private async void SetDemoHomeToCurrentPosition()
188+
{
189+
await _ephysLinkService.SetManipulatorDemoHomeCoordinateToCurrentPosition(
190+
ActiveManipulatorId
191+
);
192+
}
193+
194+
[ICommand]
195+
private void SetDemoTargetCoordinate(Vector4 coordinate)
196+
{
197+
_storeService.Store.Dispatch(
198+
SceneActions.SET_MANIPULATOR_DEMO_TARGET_COORDINATE,
199+
(ActiveManipulatorId, coordinate)
200+
);
201+
}
202+
203+
[ICommand]
204+
private async void SetDemoTargetToCurrentPosition()
205+
{
206+
await _ephysLinkService.SetManipulatorDemoTargetCoordinateToCurrentPosition(
207+
ActiveManipulatorId
208+
);
209+
}
210+
211+
[ICommand]
212+
private void SetIsDemoRunning(bool isRunning)
213+
{
214+
_storeService.Store.Dispatch(
215+
SceneActions.SET_MANIPULATOR_DEMO_RUNNING,
216+
(ActiveManipulatorId, isRunning)
217+
);
218+
}
219+
165220
#endregion
166221
}
167222
}

Assets/Scripts/UI/Views/ManipulatorInspectorView.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,19 @@ public ManipulatorInspectorView(ManipulatorInspectorViewModel manipulatorInspect
8383
"manipulator-inspector__manual-control-toggle"
8484
);
8585

86+
var demoHomeCoordinateField = root.Q<Vector4Field>(
87+
"manipulator-inspector__demo--home-field"
88+
);
89+
var demoSetHomeButton = root.Q<Button>("manipulator-inspector__demo--set-home-button");
90+
var demoTargetCoordinateField = root.Q<Vector4Field>(
91+
"manipulator-inspector__demo--target-field"
92+
);
93+
var demoSetTargetButton = root.Q<Button>(
94+
"manipulator-inspector__demo--set-target-button"
95+
);
96+
var runDemoButton = root.Q<Button>("manipulator-inspector__demo--run-button");
97+
var stopDemoButton = root.Q<Button>("manipulator-inspector__demo--stop-button");
98+
8699
// Register event handlers.
87100
addNeuropixels10.clickable.clicked += () =>
88101
manipulatorInspectorViewModel.AddVisualizationProbeCommand.Execute(
@@ -162,6 +175,24 @@ public ManipulatorInspectorView(ManipulatorInspectorViewModel manipulatorInspect
162175
{
163176
manipulatorInspectorViewModel.SetManualControlEnabledCommand.Execute(evt.newValue);
164177
});
178+
demoHomeCoordinateField.RegisterValueChangedCallback(evt =>
179+
{
180+
manipulatorInspectorViewModel.SetDemoHomeCoordinateCommand.Execute(evt.newValue);
181+
});
182+
demoSetHomeButton.clickable.clicked += manipulatorInspectorViewModel
183+
.SetDemoHomeToCurrentPositionCommand
184+
.Execute;
185+
demoTargetCoordinateField.RegisterValueChangedCallback(evt =>
186+
{
187+
manipulatorInspectorViewModel.SetDemoTargetCoordinateCommand.Execute(evt.newValue);
188+
});
189+
demoSetTargetButton.clickable.clicked += manipulatorInspectorViewModel
190+
.SetDemoTargetToCurrentPositionCommand
191+
.Execute;
192+
runDemoButton.clickable.clicked += () =>
193+
manipulatorInspectorViewModel.SetIsDemoRunningCommand.Execute(true);
194+
stopDemoButton.clickable.clicked += () =>
195+
manipulatorInspectorViewModel.SetIsDemoRunningCommand.Execute(false);
165196

166197
// Customize field units.
167198
anglesField.Q<FloatField>("appui-vector3field__x-field").unit = "Yaw";
@@ -219,6 +250,15 @@ public static void RegisterMainViewConverters()
219250
"ManipulatorHandednessToRightButtonSelected",
220251
(ref ManipulatorHandedness handedness) => handedness == ManipulatorHandedness.Right
221252
);
253+
254+
DataTypeConverters.RegisterUnidirectionalConverterGroup<bool, StyleEnum<DisplayStyle>>(
255+
"DemoIsRunningToRunButtonVisibility",
256+
(ref bool isDemoRunning) => isDemoRunning ? DisplayStyle.None : DisplayStyle.Flex
257+
);
258+
DataTypeConverters.RegisterUnidirectionalConverterGroup(
259+
"DemoIsRunningToInputsEnabled",
260+
(ref bool isDemoRunning) => !isDemoRunning
261+
);
222262
}
223263
}
224264
}

Assets/UI/Views/ManipulatorInspector.uxml

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,36 @@
103103
</ui:VisualElement>
104104
<ui:VisualElement class="inspector-panel" style="flex-grow: 1;">
105105
<Unity.AppUI.UI.Heading text="Demo" size="S" />
106-
<Unity.AppUI.UI.Heading text="Home" size="XS" />
107-
<Unity.AppUI.UI.Vector4Field />
108-
<Unity.AppUI.UI.Button title="Use Current Position" />
109-
<Unity.AppUI.UI.Heading text="Target" size="XS" />
110-
<Unity.AppUI.UI.Vector4Field />
111-
<Unity.AppUI.UI.Button title="Use Current Position" />
106+
<ui:VisualElement>
107+
<Unity.AppUI.UI.Heading text="Home" size="XS" />
108+
<Unity.AppUI.UI.Vector4Field name="manipulator-inspector__demo--home-field">
109+
<Bindings>
110+
<ui:DataBinding property="value" data-source-path="DemoHomeCoordinate" binding-mode="ToTarget" />
111+
</Bindings>
112+
</Unity.AppUI.UI.Vector4Field>
113+
<Unity.AppUI.UI.Button title="Use Current Position" name="manipulator-inspector__demo--set-home-button" />
114+
<Unity.AppUI.UI.Heading text="Target" size="XS" />
115+
<Unity.AppUI.UI.Vector4Field name="manipulator-inspector__demo--target-field">
116+
<Bindings>
117+
<ui:DataBinding property="value" data-source-path="DemoTargetCoordinate" binding-mode="ToTarget" />
118+
</Bindings>
119+
</Unity.AppUI.UI.Vector4Field>
120+
<Unity.AppUI.UI.Button title="Use Current Position" name="manipulator-inspector__demo--set-target-button" />
121+
<Bindings>
122+
<ui:DataBinding property="enabledSelf" data-source-path="IsDemoRunning" binding-mode="ToTarget" source-to-ui-converters="DemoIsRunningToInputsEnabled" />
123+
</Bindings>
124+
</ui:VisualElement>
112125
<Unity.AppUI.UI.Spacer />
113-
<Unity.AppUI.UI.Button title="Open Demo Mode" variant="Accent" />
126+
<Unity.AppUI.UI.Button title="Run" variant="Accent" name="manipulator-inspector__demo--run-button">
127+
<Bindings>
128+
<ui:DataBinding property="style.display" data-source-path="IsDemoRunning" binding-mode="ToTarget" source-to-ui-converters="DemoIsRunningToRunButtonVisibility" />
129+
</Bindings>
130+
</Unity.AppUI.UI.Button>
131+
<Unity.AppUI.UI.Button title="Stop" variant="Destructive" name="manipulator-inspector__demo--stop-button">
132+
<Bindings>
133+
<ui:DataBinding property="style.display" data-source-path="IsDemoRunning" binding-mode="ToTarget" />
134+
</Bindings>
135+
</Unity.AppUI.UI.Button>
114136
</ui:VisualElement>
115137
</ui:VisualElement>
116138
</ui:UXML>

0 commit comments

Comments
 (0)