Skip to content

Commit 6e1eeda

Browse files
committed
Merge back branch 'chore_release-8.5.0' into 'chore_release-pd-8.5.0'
2 parents 6a67bb8 + 55ba823 commit 6e1eeda

File tree

26 files changed

+1245
-1146
lines changed

26 files changed

+1245
-1146
lines changed

.github/workflows/app-test-build-deploy.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,32 @@ jobs:
221221
run: |
222222
make -C app dist
223223
224+
- name: Install and Invoke TrustedSigning @0.5.3 on dummy executable
225+
# Work around from https://github.com/electron-userland/electron-builder/issues/9076#issuecomment-2855541018
226+
if: startsWith(matrix.os, 'windows') && contains(needs.determine-build-type.outputs.type, 'release')
227+
shell: pwsh
228+
run: |
229+
Install-Module -Name TrustedSigning -RequiredVersion 0.5.3 -Force -Repository PSGallery
230+
# Create a dummy executable file
231+
$dummyExePath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "dummy.exe"
232+
Set-Content -Path $dummyExePath -Value "This is a dummy executable for testing purposes."
233+
# Invoke Trusted Signing on the dummy executable
234+
# Necessary to force dependency resolution
235+
try {
236+
Invoke-TrustedSigning `
237+
-Endpoint 'https://eus.codesigning.azure.net/' `
238+
-CertificateProfileName 'dummyName' `
239+
-CodeSigningAccountName 'dummyName' `
240+
-TimestampRfc3161 'http://timestamp.acs.microsoft.com' `
241+
-TimestampDigest 'SHA256' `
242+
-FileDigest 'SHA256' `
243+
-Files $dummyExePath
244+
} catch {
245+
Write-Host "Invoke-TrustedSigning failed: $($_.Exception.Message)"
246+
# Prevent the script from exiting with a non-zero status
247+
exit 0
248+
}
249+
224250
# build the desktop app and deploy it
225251
- name: 'build ${{matrix.variant}} app for ${{ matrix.os }}'
226252
if: matrix.target == 'desktop'

api/release-notes.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ By installing and using Opentrons software, you agree to the Opentrons End-User
88

99
---
1010

11+
## Opentrons Robot Software Changes in 8.4.1
12+
13+
There are no changes to the robot software in v8.4.1, but it is required for running protocols in v8.4.1 of the Opentrons App.
14+
15+
---
16+
1117
## Opentrons Robot Software Changes in 8.4.0
1218

1319
Welcome to the v8.4.0 release of the Opentrons robot software! This release includes updated liquid handling commands for pipetting relative to a liquid meniscus, and other new features, improvements, and bug fixes.

api/src/opentrons/hardware_control/backends/flex_protocol.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from ..dev_types import OT3AttachedInstruments
4545
from .types import HWStopCondition
4646

47+
4748
Cls = TypeVar("Cls")
4849

4950

@@ -476,3 +477,27 @@ async def get_hepa_uv_state(self) -> Optional[HepaUVState]:
476477
async def increase_evo_disp_count(self, mount: OT3Mount) -> None:
477478
"""Tell a pipette to increase it's evo-tip-dispense-count in eeprom."""
478479
...
480+
481+
async def read_env_temp_sensor(
482+
self, mount: OT3Mount, primary: bool
483+
) -> Optional[float]:
484+
"""Read and return the current sensor information."""
485+
...
486+
487+
async def read_env_hum_sensor(
488+
self, mount: OT3Mount, primary: bool
489+
) -> Optional[float]:
490+
"""Read and return the current sensor information."""
491+
...
492+
493+
async def read_pressure_sensor(
494+
self, mount: OT3Mount, primary: bool
495+
) -> Optional[float]:
496+
"""Read and return the current sensor information."""
497+
...
498+
499+
async def read_capacitive_sensor(
500+
self, mount: OT3Mount, primary: bool
501+
) -> Optional[float]:
502+
"""Read and return the current sensor information."""
503+
...

api/src/opentrons/hardware_control/backends/ot3controller.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,13 @@
219219
from .types import HWStopCondition
220220
from .flex_protocol import FlexBackend
221221
from .status_bar_state import StatusBarStateController
222-
from opentrons_hardware.sensors.types import SensorDataType
222+
from opentrons_hardware.sensors.sensor_types import (
223+
EnvironmentSensor,
224+
CapacitiveSensor,
225+
PressureSensor,
226+
)
227+
from opentrons_hardware.sensors.types import SensorDataType, EnvironmentSensorDataType
228+
from opentrons_hardware.sensors.sensor_driver import SensorDriver
223229
from opentrons_hardware.sensors.utils import send_evo_dispense_count_increase
224230

225231
from .. import modules
@@ -1864,3 +1870,72 @@ async def increase_evo_disp_count(self, mount: OT3Mount) -> None:
18641870
await send_evo_dispense_count_increase(
18651871
self._messenger, sensor_node_for_pipette(OT3Mount(mount.value))
18661872
)
1873+
1874+
async def _read_env_sensor(
1875+
self, mount: OT3Mount, primary: bool
1876+
) -> Optional[EnvironmentSensorDataType]:
1877+
"""Read and return the current sensor information."""
1878+
sensor = EnvironmentSensor.build(
1879+
sensor_id=SensorId.S0 if primary else SensorId.S1,
1880+
node_id=sensor_node_for_mount(mount),
1881+
)
1882+
s_driver = SensorDriver()
1883+
sensor_data = await s_driver.read(
1884+
can_messenger=self._messenger,
1885+
sensor=sensor,
1886+
offset=False,
1887+
)
1888+
assert sensor_data is None or isinstance(sensor_data, EnvironmentSensorDataType)
1889+
return sensor_data
1890+
1891+
async def read_env_temp_sensor(
1892+
self, mount: OT3Mount, primary: bool
1893+
) -> Optional[float]:
1894+
"""Read and return the current sensor information."""
1895+
s_data = await self._read_env_sensor(mount, primary)
1896+
if s_data is None or s_data.temperature is None:
1897+
return None
1898+
return s_data.temperature.to_float()
1899+
1900+
async def read_env_hum_sensor(
1901+
self, mount: OT3Mount, primary: bool
1902+
) -> Optional[float]:
1903+
"""Read and return the current sensor information."""
1904+
s_data = await self._read_env_sensor(mount, primary)
1905+
if s_data is None or s_data.humidity is None:
1906+
return None
1907+
return s_data.humidity.to_float()
1908+
1909+
async def read_pressure_sensor(
1910+
self, mount: OT3Mount, primary: bool
1911+
) -> Optional[float]:
1912+
"""Read and return the current sensor information."""
1913+
sensor = PressureSensor.build(
1914+
sensor_id=SensorId.S0 if primary else SensorId.S1,
1915+
node_id=sensor_node_for_mount(mount),
1916+
)
1917+
s_driver = SensorDriver()
1918+
sensor_data = await s_driver.read(
1919+
can_messenger=self._messenger,
1920+
sensor=sensor,
1921+
offset=False,
1922+
)
1923+
assert sensor_data is None or isinstance(sensor_data, SensorDataType)
1924+
return sensor_data.to_float() if sensor_data else None
1925+
1926+
async def read_capacitive_sensor(
1927+
self, mount: OT3Mount, primary: bool
1928+
) -> Optional[float]:
1929+
"""Read and return the current sensor information."""
1930+
sensor = CapacitiveSensor.build(
1931+
sensor_id=SensorId.S0 if primary else SensorId.S1,
1932+
node_id=sensor_node_for_mount(mount),
1933+
)
1934+
s_driver = SensorDriver()
1935+
sensor_data = await s_driver.read(
1936+
can_messenger=self._messenger,
1937+
sensor=sensor,
1938+
offset=False,
1939+
)
1940+
assert sensor_data is None or isinstance(sensor_data, SensorDataType)
1941+
return sensor_data.to_float() if sensor_data else None

api/src/opentrons/hardware_control/backends/ot3simulator.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
FlexBackend,
6868
)
6969

70+
7071
log = logging.getLogger(__name__)
7172

7273
AXIS_TO_SUBSYSTEM = {
@@ -877,3 +878,29 @@ def _update_tip_state(self, mount: OT3Mount, status: bool) -> None:
877878

878879
async def increase_evo_disp_count(self, mount: OT3Mount) -> None:
879880
pass
881+
882+
async def read_env_temp_sensor(
883+
self, mount: OT3Mount, primary: bool
884+
) -> Optional[float]:
885+
"""Read and return the current sensor information."""
886+
887+
return 0.0
888+
889+
async def read_env_hum_sensor(
890+
self, mount: OT3Mount, primary: bool
891+
) -> Optional[float]:
892+
"""Read and return the current sensor information."""
893+
894+
return 0.0
895+
896+
async def read_pressure_sensor(
897+
self, mount: OT3Mount, primary: bool
898+
) -> Optional[float]:
899+
"""Read and return the current sensor information."""
900+
return 0.0
901+
902+
async def read_capacitive_sensor(
903+
self, mount: OT3Mount, primary: bool
904+
) -> Optional[float]:
905+
"""Read and return the current sensor information."""
906+
return 0.0

api/src/opentrons/hardware_control/ot3api.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,3 +3165,35 @@ async def increase_evo_disp_count(
31653165
"""Tell a pipette to increase its evo-tip-dispense-count in eeprom."""
31663166
realmount = OT3Mount.from_mount(mount)
31673167
await self._backend.increase_evo_disp_count(realmount)
3168+
3169+
async def read_stem_temperature(
3170+
self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3171+
) -> float:
3172+
"""Read and return the current stem temperature."""
3173+
realmount = OT3Mount.from_mount(mount)
3174+
s_data = await self._backend.read_env_temp_sensor(realmount, primary)
3175+
return s_data if s_data else 0.0
3176+
3177+
async def read_stem_humidity(
3178+
self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3179+
) -> float:
3180+
"""Read and return the current primary stem humidity."""
3181+
realmount = OT3Mount.from_mount(mount)
3182+
s_data = await self._backend.read_env_hum_sensor(realmount, primary)
3183+
return s_data if s_data else 0.0
3184+
3185+
async def read_stem_pressure(
3186+
self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3187+
) -> float:
3188+
"""Read and return the current primary stem pressure."""
3189+
realmount = OT3Mount.from_mount(mount)
3190+
s_data = await self._backend.read_pressure_sensor(realmount, primary)
3191+
return s_data if s_data else 0.0
3192+
3193+
async def read_stem_capacitance(
3194+
self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3195+
) -> float:
3196+
"""Read and return the current primary stem capacitance."""
3197+
realmount = OT3Mount.from_mount(mount)
3198+
s_data = await self._backend.read_capacitive_sensor(realmount, primary)
3199+
return s_data if s_data else 0.0

app-shell/build/release-notes.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ By installing and using Opentrons software, you agree to the Opentrons End-User
88

99
---
1010

11+
## Opentrons App Changes in 8.4.1
12+
13+
The 8.4.1 hotfix release fixes two issues:
14+
15+
- Placing a Magnetic Block in slot C2 no longer prevents Labware Position Check from running.
16+
- Existing labware offsets are no longer doubled during Labware Position Check.
17+
18+
---
19+
1120
## Opentrons App Changes in 8.4.0
1221

1322
Welcome to the v8.4.0 release of the Opentrons App! This release includes updates to labware offsets on the Flex, as well as other new features, improvements, and bug fixes.
@@ -45,6 +54,8 @@ There are no changes to the Opentrons App in v8.3.2, but it is required for upda
4554

4655
The 8.3.1 hotfix release includes a small fix to allow all robots to properly reboot after an upgrade to v8.3.0.
4756

57+
---
58+
4859
## Opentrons App Changes in 8.3.0
4960

5061
Welcome to the v8.3.0 release of the Opentrons App! This release adds support for Mandarin in the app or Flex touchscreen and includes other beta features for our commercial partners.

0 commit comments

Comments
 (0)