Skip to content

Commit daadb45

Browse files
authored
feat(protocol-designer, step-generation): wire flexStacker formToArgs (#20334)
# Overview This PR wires up the stacker step form fields to step generation by transforming forms to arguments and creates commands for all possible stacker steps ## Test Plan and Hands on Testing - wrote unit tests, will need to be smoke tested later ## Changelog - added flex stacker command types for step generation - connected commands to form
1 parent 13e6b75 commit daadb45

File tree

8 files changed

+188
-1
lines changed

8 files changed

+188
-1
lines changed

protocol-designer/src/file-data/helpers/index.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,29 @@ export const commandCreatorFromStepArgs = (
103103
StepGeneration.absorbanceReaderCloseInitialize,
104104
args
105105
)
106+
case 'flexStackerEmpty':
107+
return StepGeneration.curryCommandCreator(
108+
StepGeneration.flexStackerEmpty,
109+
{ ...args, strategy: 'logical' }
110+
)
111+
case 'flexStackerFillItems':
112+
return StepGeneration.curryCommandCreator(
113+
StepGeneration.flexStackerFill,
114+
{ ...args, strategy: 'manualWithPause' }
115+
)
116+
case 'flexStackerRetrieve':
117+
return StepGeneration.curryCommandCreator(
118+
StepGeneration.flexStackerRetrieve,
119+
args
120+
)
121+
case 'flexStackerStore':
122+
return StepGeneration.curryCommandCreator(
123+
StepGeneration.flexStackerStore,
124+
{ ...args, strategy: 'automatic' }
125+
)
106126
}
107127
// @ts-expect-error we've exhausted all command creators, but keeping this console warn
108-
// for when we impelement the next command creator
128+
// for when we implement the next command creator
109129
console.warn(`unhandled commandCreatorFnName: ${args.commandCreatorFnName}`)
110130
return null
111131
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type { FlexStackerArgs } from '@opentrons/step-generation'
2+
import type { HydratedFlexStackerFormData } from '../../../form-types'
3+
import type { GetCastFormData } from '../../fieldLevel'
4+
5+
export const flexStackerFormToArgs = (
6+
castFormData: GetCastFormData<HydratedFlexStackerFormData>
7+
): FlexStackerArgs | null => {
8+
const {
9+
fillLabwareUri,
10+
flexStackerFormType,
11+
interventionMessage,
12+
moduleId,
13+
fillQuantity,
14+
} = castFormData
15+
switch (flexStackerFormType) {
16+
case 'empty':
17+
return {
18+
moduleId: moduleId!,
19+
commandCreatorFnName: 'flexStackerEmpty',
20+
interventionMessage: interventionMessage,
21+
}
22+
case 'fill':
23+
return {
24+
moduleId: moduleId!,
25+
commandCreatorFnName: 'flexStackerFillItems',
26+
fillLabwareUri: fillLabwareUri,
27+
fillQuantity: fillQuantity,
28+
}
29+
case 'retrieve':
30+
return {
31+
moduleId: moduleId!,
32+
commandCreatorFnName: 'flexStackerRetrieve',
33+
}
34+
case 'store':
35+
return {
36+
moduleId: moduleId!,
37+
commandCreatorFnName: 'flexStackerStore',
38+
}
39+
40+
default:
41+
return null
42+
}
43+
}

protocol-designer/src/steplist/formLevel/stepFormToArgs/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { castField } from '../../../steplist/fieldLevel'
44
import { absorbanceReaderFormToArgs } from './absorbanceReaderFormToArgs'
55
import { cameraFormToArgs } from './cameraFormToArgs'
66
import { commentFormToArgs } from './commentFormToArgs'
7+
import { flexStackerFormToArgs } from './flexStackerFormToArgs'
78
import { heaterShakerFormToArgs } from './heaterShakerFormToArgs'
89
import { magnetFormToArgs } from './magnetFormToArgs'
910
import { mixFormToArgs } from './mixFormToArgs'
@@ -85,6 +86,9 @@ export const stepFormToArgs = (
8586
stepArgs = absorbanceReaderFormToArgs(_castForm(hydratedForm))
8687
break
8788
}
89+
case 'flexStacker': {
90+
stepArgs = flexStackerFormToArgs(_castForm(hydratedForm))
91+
}
8892
}
8993

9094
if (stepArgs == null) {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { beforeEach, describe, expect, it } from 'vitest'
2+
3+
import { flexStackerFormToArgs } from '../flexStackerFormToArgs'
4+
5+
import type {
6+
FlexStackerFormType,
7+
HydratedFlexStackerFormData,
8+
} from '/protocol-designer/form-types'
9+
import type { GetCastFormData } from '/protocol-designer/steplist/fieldLevel'
10+
11+
describe('flexStackerFormToArgs', () => {
12+
let baseFormData: GetCastFormData<HydratedFlexStackerFormData>
13+
beforeEach(() => {
14+
baseFormData = {
15+
stepType: 'flexStacker',
16+
id: 'stacker-id',
17+
fillLabwareUri: null,
18+
fillQuantity: null,
19+
flexStackerFormType: null,
20+
interventionMessage: null,
21+
moduleId: 'moduleId',
22+
stepName: 'step name',
23+
stepDetails: 'stacker fill step',
24+
stepNumber: 1,
25+
}
26+
})
27+
it('returns flex stacker empty command creator', () => {
28+
const formData = {
29+
...baseFormData,
30+
flexStackerFormType: 'empty' as FlexStackerFormType,
31+
interventionMessage: 'empty message',
32+
}
33+
const expected = {
34+
moduleId: 'moduleId',
35+
commandCreatorFnName: 'flexStackerEmpty',
36+
interventionMessage: 'empty message',
37+
}
38+
expect(flexStackerFormToArgs(formData)).toEqual(expected)
39+
})
40+
it('returns flex stacker fill command creator', () => {
41+
const formData = {
42+
...baseFormData,
43+
flexStackerFormType: 'fill' as FlexStackerFormType,
44+
fillLabwareUri: 'labware',
45+
fillQuantity: 1,
46+
}
47+
const expected = {
48+
moduleId: 'moduleId',
49+
commandCreatorFnName: 'flexStackerFillItems',
50+
fillLabwareUri: 'labware',
51+
fillQuantity: 1,
52+
}
53+
expect(flexStackerFormToArgs(formData)).toEqual(expected)
54+
})
55+
it('returns flex stacker retrieve command creator', () => {
56+
const formData = {
57+
...baseFormData,
58+
flexStackerFormType: 'retrieve' as FlexStackerFormType,
59+
}
60+
const expected = {
61+
moduleId: 'moduleId',
62+
commandCreatorFnName: 'flexStackerRetrieve',
63+
}
64+
expect(flexStackerFormToArgs(formData)).toEqual(expected)
65+
})
66+
it('returns flex stacker store command creator', () => {
67+
const formData = {
68+
...baseFormData,
69+
flexStackerFormType: 'store' as FlexStackerFormType,
70+
}
71+
const expected = {
72+
moduleId: 'moduleId',
73+
commandCreatorFnName: 'flexStackerStore',
74+
}
75+
expect(flexStackerFormToArgs(formData)).toEqual(expected)
76+
})
77+
})

step-generation/src/commandCreators/atomic/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ import { dispenseInPlace } from './dispenseInPlace'
1919
import { dropTip } from './dropTip'
2020
import { dropTipInPlace } from './dropTipInPlace'
2121
import { engageMagnet } from './engageMagnet'
22+
import { flexStackerEmpty } from './flexStackerEmpty'
23+
import { flexStackerFill } from './flexStackerFill'
24+
import { flexStackerRetrieve } from './flexStackerRetrieve'
25+
import { flexStackerStore } from './flexStackerStore'
2226
import { liquidProbe } from './liquidProbe'
2327
import { moveLabware } from './moveLabware'
2428
import { moveToAddressableArea } from './moveToAddressableArea'
@@ -52,6 +56,10 @@ export {
5256
dropTip,
5357
dropTipInPlace,
5458
engageMagnet,
59+
flexStackerEmpty,
60+
flexStackerFill,
61+
flexStackerRetrieve,
62+
flexStackerStore,
5563
liquidProbe,
5664
moveLabware,
5765
moveToAddressableArea,

step-generation/src/commandCreators/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ export {
2929
dropTip,
3030
dropTipInPlace,
3131
engageMagnet,
32+
flexStackerEmpty,
33+
flexStackerFill,
34+
flexStackerRetrieve,
35+
flexStackerStore,
3236
moveLabware,
3337
moveToAddressableArea,
3438
moveToAddressableAreaForDropTip,

step-generation/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ export {
2020
dropTipInTrash,
2121
dropTipInWasteChute,
2222
engageMagnet,
23+
flexStackerEmpty,
24+
flexStackerFill,
25+
flexStackerRetrieve,
26+
flexStackerStore,
2327
heaterShaker,
2428
mix,
2529
moveLabware,

step-generation/src/types.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,32 @@ export interface CaptureImageArgs extends CommonArgs {
634634
saturation: number
635635
}
636636

637+
export interface FlexStackerEmptyArgs extends CommonArgs {
638+
moduleId: string
639+
commandCreatorFnName: 'flexStackerEmpty'
640+
interventionMessage: string | null
641+
}
642+
export interface FlexStackerFillItemsArgs extends CommonArgs {
643+
moduleId: string
644+
commandCreatorFnName: 'flexStackerFillItems'
645+
fillLabwareUri: string | null
646+
fillQuantity: number | null
647+
}
648+
export interface FlexStackerStoreArgs extends CommonArgs {
649+
moduleId: string
650+
commandCreatorFnName: 'flexStackerStore'
651+
}
652+
export interface FlexStackerRetrieveArgs extends CommonArgs {
653+
moduleId: string
654+
commandCreatorFnName: 'flexStackerRetrieve'
655+
}
656+
657+
export type FlexStackerArgs =
658+
| FlexStackerEmptyArgs
659+
| FlexStackerFillItemsArgs
660+
| FlexStackerRetrieveArgs
661+
| FlexStackerStoreArgs
662+
637663
export type CommandCreatorArgs =
638664
| AbsorbanceReaderInitializeArgs
639665
| AbsorbanceReaderReadArgs
@@ -654,6 +680,7 @@ export type CommandCreatorArgs =
654680
| HeaterShakerArgs
655681
| MoveLabwareArgs
656682
| CommentArgs
683+
| FlexStackerArgs
657684

658685
export interface LocationLiquidState {
659686
[ingredGroup: string]: { volume: number }

0 commit comments

Comments
 (0)