44import logging
55import re
66import xml .etree .ElementTree as ET
7+ from abc import ABCMeta
78from base64 import b64decode
89from dataclasses import dataclass
910from typing import Any , Dict , List , Optional , cast
1011from xml .dom import minidom
1112
1213from pylabrobot .io import Socket
14+ from pylabrobot .thermocycling .backend import ThermocyclerBackend
1315from pylabrobot .thermocycling .standard import LidStatus , Protocol , Stage , Step
1416
15- from .backend import ThermocyclerBackend
16-
1717
1818def _generate_run_info_files (
1919 protocol : Protocol ,
@@ -203,7 +203,7 @@ def stage_to_scpi(stage: Stage, stage_index: int, stage_name_prefix: str) -> dic
203203 return data
204204
205205
206- class ProflexBackend (ThermocyclerBackend ):
206+ class ThermoFisherThermocyclerBackend (ThermocyclerBackend , metaclass = ABCMeta ):
207207 """Backend for Proflex thermocycler."""
208208
209209 def __init__ (self , ip : str , port : int = 7000 , shared_secret : bytes = b"f4ct0rymt55" ):
@@ -401,8 +401,11 @@ async def _load_num_blocks_and_type(self):
401401 elif self .bid == "13" :
402402 self ._num_blocks = 3
403403 self .num_temp_zones = 2
404+ elif self .bid == "31" :
405+ self ._num_blocks = 1
406+ self .num_temp_zones = 1
404407 else :
405- raise NotImplementedError ("Only BID 12 and 13 are supported" )
408+ raise NotImplementedError ("Only BID 31, 12 and 13 are supported" )
406409
407410 async def is_block_running (self , block_id : int ) -> bool :
408411 run_name = await self .get_run_name (block_id = block_id )
@@ -778,7 +781,7 @@ async def get_run_info(self, protocol: Protocol, block_id: int) -> "RunProgress"
778781 run_name = await self .get_run_name (block_id = block_id )
779782 if not progress :
780783 self .logger .info ("Protocol completed" )
781- return ProflexBackend .RunProgress (
784+ return ThermoFisherThermocyclerBackend .RunProgress (
782785 running = False ,
783786 stage = "completed" ,
784787 elapsed_time = await self .get_elapsed_run_time_from_log (run_name = run_name ),
@@ -788,7 +791,7 @@ async def get_run_info(self, protocol: Protocol, block_id: int) -> "RunProgress"
788791 if progress ["RunTitle" ] == "-" :
789792 await self ._read_response (timeout = 5 )
790793 self .logger .info ("Protocol completed" )
791- return ProflexBackend .RunProgress (
794+ return ThermoFisherThermocyclerBackend .RunProgress (
792795 running = False ,
793796 stage = "completed" ,
794797 elapsed_time = await self .get_elapsed_run_time_from_log (run_name = run_name ),
@@ -797,7 +800,7 @@ async def get_run_info(self, protocol: Protocol, block_id: int) -> "RunProgress"
797800
798801 if progress ["Stage" ] == "POSTRun" :
799802 self .logger .info ("Protocol in POSTRun" )
800- return ProflexBackend .RunProgress (
803+ return ThermoFisherThermocyclerBackend .RunProgress (
801804 running = True ,
802805 stage = "POSTRun" ,
803806 elapsed_time = await self .get_elapsed_run_time_from_log (run_name = run_name ),
@@ -820,7 +823,7 @@ async def get_run_info(self, protocol: Protocol, block_id: int) -> "RunProgress"
820823 break
821824 await asyncio .sleep (5 )
822825 self .logger .info ("Infinite hold" )
823- return ProflexBackend .RunProgress (
826+ return ThermoFisherThermocyclerBackend .RunProgress (
824827 running = False ,
825828 stage = "infinite_hold" ,
826829 elapsed_time = time_elapsed ,
@@ -829,7 +832,7 @@ async def get_run_info(self, protocol: Protocol, block_id: int) -> "RunProgress"
829832
830833 self .logger .info (f"Elapsed time: { time_elapsed } " )
831834 self .logger .info (f"Remaining time: { remaining_time } " )
832- return ProflexBackend .RunProgress (
835+ return ThermoFisherThermocyclerBackend .RunProgress (
833836 running = True ,
834837 stage = progress ["Stage" ],
835838 elapsed_time = time_elapsed ,
@@ -852,12 +855,6 @@ async def setup(
852855 await self .set_block_idle_temp (temp = block_idle_temp , block_id = block_index )
853856 await self .set_cover_idle_temp (temp = cover_idle_temp , block_id = block_index )
854857
855- async def open_lid (self ):
856- raise NotImplementedError ("Open lid command is not implemented for Proflex thermocycler" )
857-
858- async def close_lid (self ):
859- raise NotImplementedError ("Close lid command is not implemented for Proflex thermocycler" )
860-
861858 async def deactivate_lid (self , block_id : Optional [int ] = None ):
862859 assert block_id is not None , "block_id must be specified"
863860 return await self .set_cover_idle_temp (temp = 105 , control_enabled = False , block_id = block_id )
0 commit comments