Skip to content

Commit

Permalink
chore: internal-release->edge for 1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
sfoster1 committed Nov 16, 2023
2 parents e4c123f + c80798d commit dc93386
Show file tree
Hide file tree
Showing 18 changed files with 539 additions and 1,301 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/app-test-build-deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ jobs:
echo "Configuring project, bucket, and folder for ot3"
echo "project=ot3" >> $GITHUB_OUTPUT
echo "bucket=${{env._APP_DEPLOY_BUCKET_OT3}}" >> $GITHUB_OUTPUT
echo "folder=${{env._APP_DEPLOY_BUCKET_OT3}}" >> $GITHUB_OUTPUT
echo "folder=${{env._APP_DEPLOY_FOLDER_OT3}}" >> $GITHUB_OUTPUT
fi
- uses: 'actions/checkout@v3'
with:
Expand Down
47 changes: 6 additions & 41 deletions api/release-notes-internal.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,17 @@ For more details about this release, please see the full [technical change log][

---

# Internal Release 0.14.0
# Internal Release 1.0.0

## New Stuff In This Release

- Return tip heights and some other pipette behaviors are now properly executed based on the kind of tip being used
- Release Flex robot software builds are now cryptographically signed. If you run a release build, you can only install other properly signed release builds. Note that if the robot was previously on a non-release build this won't latch; remove the update server config file at ``/var/lib/otupdate/config.json`` to go back to signed builds only.
- Error handling has been overhauled; all errors now display with an error code for easier reporting. Many of those error codes are the 4000 catchall still but this will improve over time.
- If there's an error during the post-run cleanup steps, where the robot homes and drops tips, the run should no longer get stuck in a permanent "finishing" state. It should get marked as failed.
- Further updates to Flex motion control parameters from hardware testing for both gantry and plunger speeds and acceleration
- Pipette overpressure detection is now integrated.
- All instrument flows should now show errors if they occur instead of skipping a step
- Fixes to several incorrect status displays in ODD (i.e. protocols skipping the full-color outcome splash)
- Robot can now handle json protocol v7
- Support for PVT (v1.1) grippers
- Update progress should get displayed after restart for firmware updates
- Removed `use_pick_up_location_lpc_offset` and `use_drop_location_lpc_offset` from `protocol_context.move_labware` arguments. So they should be removed from any protocols that used them. This change also requires resetting the protocol run database on the robot.
- Added 'contextual' gripper offsets to deck, labware and module definitions. So, any labware movement offsets that were previously being specified in the protocol should now be removed or adjusted or they will get added twice.
- Fixed an issue where the robot wasn't actually checking for updates; you will now correctly get prompted to update your robot from the settings tab of the ODD when an update is available, including during onboarding
- You can update the robot by putting a system update (ot3-system.zip) on a flash drive and plugging it in the front USB port, then going to robot settings
- Support for 96-channel pipettes in protocols
- Early provisional support for deck configuration and trash chutes in protocols


## Big Things That Don't Work Yet So Don't Report Bugs About Them

### Robot Control
- Pipette pressure sensing for liquid-level sensing purposes
- Labware pick up failure with gripper
- E-stop integrated handling especially with modules

## Big Things That Do Work Please Do Report Bugs About Them
### Robot Control
- Protocol behavior
- Labware movement between slots/modules, both manual and with gripper, from python protocols
- Labware drop/gripper crash errors, but they're very insensitive
- Pipette and gripper automated offset calibration
- Network connectivity and discoverability
- Firmware update for all devices
- Cancelling a protocol run. We're even more sure we fixed this so definitely tell us if it's not.
- USB connectivity
- Stall detection firing basically ever unless you clearly ran into something

### ODD
- Protocol execution including end-of-protocol screen
- Protocol run monitoring
- Attach and calibrate
- Network connection management, including viewing IP addresses and connecting to wifi networks
- Automatic updates of robot software when new internal releases are created
- Chrome remote devtools - if you enable them and then use Chrome to go to robotip:9223 you'll get devtools
- After a while, the ODD should go into idle; if you touch it, it will come back online



- Pipette partial tip pickup is present but not fully validated or developed yet. Partial tip pickup on 96 channel pipettes will not use correct motion parameters; using the front channel of a pipette in partial tip pickup does not work.
4 changes: 3 additions & 1 deletion app-shell-odd/src/system-update/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,9 @@ const getVersionFromZipIfValid = (path: string): Promise<FileDetails> =>
const fakeReleaseNotesForMassStorage = (version: string): string => `
# Opentrons Robot Software Version ${version}
This update is from a USB mass storage device connected to your flex, and release notes cannot be shown.
This update is from a USB mass storage device connected to your Flex, and release notes cannot be shown.
Don't remove the USB mass storage device while the update is in progress.
`

export const getLatestMassStorageUpdateFiles = (
Expand Down
18 changes: 5 additions & 13 deletions app-shell/build/release-notes-internal.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,18 @@ For more details about this release, please see the full [technical changelog][]

---

# Internal Release 0.14.0
# Internal Release 1.0.0

This is 0.14.0, an internal release for the app supporting the Opentrons Flex.
This is 1.0.0, an internal release for the app supporting the Opentrons Flex.

This is still pretty early in the process, so some things are known not to work, and are listed below. Some things that may surprise you do work, and are also listed below. There may also be some littler things of note, and those are at the bottom.


## New Stuff In This Release
- All instrument flows should display errors properly now
- Update robot flows don't say OT-2s anymore
- There should be fewer surprise scroll bars on Windows
- The configuration of the on-device display can be factory-reset, which lets you go back to the first-time setup flow
- Support for running labware position check using the calibration adapter for added accuracy (note: not an automated flow, just uses the adapter instead of a tip)
- Support for 96-channel pipettes in protocols
- Early provisional support for deck configuration and trash chutes in protocols



## Big Things That Do Work Please Do Report Bugs About Them
- Connecting to a Flex, including via USB
- Running protocols on those Flexs including simulate, play/pause, labware position check
- Except for gripper; no LPC for gripper
- Attach, detach, and calibration flows for pipettes and gripper when started from the device page
- Automatic updates of app and robot when new internal-releases are created


3 changes: 2 additions & 1 deletion app/src/assets/localization/en/protocol_command_text.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"closing_tc_lid": "Closing Thermocycler lid",
"comment": "Comment",
"configure_for_volume": "Configure {{pipette}} to aspirate {{volume}} µL",
"configure_nozzle_layout": "Configure {{pipette}} to use {{amount}} nozzles",
"confirm_and_resume": "Confirm and resume",
"deactivate_hs_shake": "Deactivating shaker",
"deactivate_temperature_module": "Deactivating Temperature Module",
Expand Down Expand Up @@ -42,7 +43,7 @@
"opening_tc_lid": "Opening Thermocycler lid",
"pause_on": "Pause on {{robot_name}}",
"pause": "Pause",
"pickup_tip": "Picking up tip from {{well_name}} of {{labware}} in {{labware_location}}",
"pickup_tip": "Picking up tip(s) from {{well_range}} of {{labware}} in {{labware_location}}",
"prepare_to_aspirate": "Preparing {{pipette}} to aspirate",
"return_tip": "Returning tip to {{well_name}} of {{labware}} in {{labware_location}}",
"save_position": "Saving position",
Expand Down
16 changes: 15 additions & 1 deletion app/src/organisms/CommandText/PipettingCommandText.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import {
getLabwareName,
getLabwareDisplayLocation,
getFinalLabwareLocation,
getWellRange,
} from './utils'
import type { PipetteName } from '@opentrons/shared-data'

import type { PipettingRunTimeCommand } from '@opentrons/shared-data'

Expand Down Expand Up @@ -109,8 +111,20 @@ export const PipettingCommandText = ({
})
}
case 'pickUpTip': {
const pipetteId = command.params.pipetteId
const pipetteName:
| PipetteName
| undefined = robotSideAnalysis.pipettes.find(
pip => pip.id === pipetteId
)?.pipetteName

return t('pickup_tip', {
well_name: wellName,
well_range: getWellRange(
pipetteId,
allPreviousCommands,
wellName,
pipetteName
),
labware: getLabwareName(robotSideAnalysis, labwareId),
labware_location: displayLocation,
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ describe('CommandText', () => {
{ i18nInstance: i18n }
)[0]
getByText(
'Picking up tip from A1 of Opentrons 96 Tip Rack 300 µL in Slot 9'
'Picking up tip(s) from A1 of Opentrons 96 Tip Rack 300 µL in Slot 9'
)
}
})
Expand Down
19 changes: 19 additions & 0 deletions app/src/organisms/CommandText/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,25 @@ export function CommandText(props: Props): JSX.Element | null {
</StyledText>
)
}
case 'configureNozzleLayout': {
const { configuration_params, pipetteId } = command.params
const pipetteName = robotSideAnalysis.pipettes.find(
pip => pip.id === pipetteId
)?.pipetteName

// TODO (sb, 11/9/23): Add support for other configurations when needed
return (
<StyledText as="p" {...styleProps}>
{t('configure_nozzle_layout', {
amount: configuration_params.style === 'COLUMN' ? '8' : 'all',
pipette:
pipetteName != null
? getPipetteNameSpecs(pipetteName)?.displayName
: '',
})}
</StyledText>
)
}
case 'prepareToAspirate': {
const { pipetteId } = command.params
const pipetteName = robotSideAnalysis.pipettes.find(
Expand Down
46 changes: 46 additions & 0 deletions app/src/organisms/CommandText/utils/getWellRange.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import {
getPipetteNameSpecs,
PipetteName,
RunTimeCommand,
} from '@opentrons/shared-data'

/**
* @param pipetteName name of pipette being used
* @param commands list of commands to search within
* @param wellName the target well for pickup tip
* @returns WellRange string of wells pipette will pickup tips from
*/
export function getWellRange(
pipetteId: string,
commands: RunTimeCommand[],
wellName: string,
pipetteName?: PipetteName
): string {
const pipetteChannels = pipetteName
? getPipetteNameSpecs(pipetteName)?.channels ?? 1
: 1
let usedChannels = pipetteChannels
if (pipetteChannels === 96) {
for (const c of commands.reverse()) {
if (
c.commandType === 'configureNozzleLayout' &&
c.params?.pipetteId === pipetteId
) {
// TODO(sb, 11/9/23): add support for quadrant and row configurations when needed
if (c.params.configuration_params.style === 'SINGLE') {
usedChannels = 1
} else if (c.params.configuration_params.style === 'COLUMN') {
usedChannels = 8
}
break
}
}
}
if (usedChannels === 96) {
return 'A1 - H12'
} else if (usedChannels === 8) {
const column = wellName.substr(1)
return `A${column} - H${column}`
}
return wellName
}
1 change: 1 addition & 0 deletions app/src/organisms/CommandText/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export * from './getModuleDisplayLocation'
export * from './getLiquidDisplayName'
export * from './getLabwareDisplayLocation'
export * from './getFinalLabwareLocation'
export * from './getWellRange'
3 changes: 2 additions & 1 deletion app/src/organisms/LabwarePositionCheck/AttachProbe.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ export const AttachProbe = (props: AttachProbeProps): JSX.Element | null => {
(instrument): instrument is PipetteData =>
instrument.ok && instrument.mount === pipetteMount
)
const is96Channel = attachedPipette?.data.channels === 96

React.useEffect(() => {
// move into correct position for probe attach on mount
Expand All @@ -103,7 +104,7 @@ export const AttachProbe = (props: AttachProbeProps): JSX.Element | null => {
setIsPending(true)
refetch()
.then(() => {
if (attachedPipette?.state?.tipDetected) {
if (is96Channel || attachedPipette?.state?.tipDetected) {
chainRunCommands(
[
{ commandType: 'home', params: { axes: [pipetteZMotorAxis] } },
Expand Down
2 changes: 1 addition & 1 deletion app/src/organisms/PipetteWizardFlows/AttachProbe.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const AttachProbe = (props: AttachProbeProps): JSX.Element | null => {
setIsPending(true)
refetch()
.then(() => {
if (attachedPipette?.state?.tipDetected) {
if (is96Channel || attachedPipette?.state?.tipDetected) {
chainRunCommands?.(
[
{
Expand Down
37 changes: 37 additions & 0 deletions shared-data/command/types/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,20 @@ export interface LoadFixtureRunTimeCommand
result?: LoadLabwareResult
}

export interface ConfigureNozzleLayoutCreateCommand
extends CommonCommandCreateInfo {
commandType: 'configureNozzleLayout'
params: ConfigureNozzleLayoutParams
}

export interface ConfigureNozzleLayoutRunTimeCommand
extends CommonCommandRunTimeInfo,
ConfigureNozzleLayoutCreateCommand {
result?: {}
}

export type SetupRunTimeCommand =
| ConfigureNozzleLayoutRunTimeCommand
| LoadPipetteRunTimeCommand
| LoadLabwareRunTimeCommand
| LoadFixtureRunTimeCommand
Expand All @@ -79,6 +92,7 @@ export type SetupRunTimeCommand =
| MoveLabwareRunTimeCommand

export type SetupCreateCommand =
| ConfigureNozzleLayoutCreateCommand
| LoadPipetteCreateCommand
| LoadLabwareCreateCommand
| LoadFixtureCreateCommand
Expand Down Expand Up @@ -160,3 +174,26 @@ interface LoadFixtureParams {
loadName: string
fixtureId?: string
}

const COLUMN = 'COLUMN'
const SINGLE = 'SINGLE'
const ROW = 'ROW'
const QUADRANT = 'QUADRANT'
const EMPTY = 'EMPTY'

export type NozzleConfigurationStyle =
| typeof COLUMN
| typeof SINGLE
| typeof ROW
| typeof QUADRANT
| typeof EMPTY

interface NozzleConfigurationParams {
primary_nozzle: string
style: NozzleConfigurationStyle
}

interface ConfigureNozzleLayoutParams {
pipetteId: string
configuration_params: NozzleConfigurationParams
}
Loading

0 comments on commit dc93386

Please sign in to comment.