BioImager  3.9.1
A .NET microscopy imaging library. Supports various microscopes by using imported libraries & GUI automation. Supported libraries include PriorĀ® & ZeissĀ® & all devices supported by Micromanager 2.0 and python-microscope.
Loading...
Searching...
No Matches
microscope.testsuite.mock_devices.OmicronDeepstarLaserMock Class Reference
Inheritance diagram for microscope.testsuite.mock_devices.OmicronDeepstarLaserMock:
microscope.testsuite.mock_devices.SerialMock

Classes

class  Mode
 
class  State
 

Public Member Functions

def __init__ (self, *args, **kwargs)
 
def light (self)
 
def write (self, data)
 
def handle (self, command)
 
- Public Member Functions inherited from microscope.testsuite.mock_devices.SerialMock
def __init__ (self, *args, **kwargs)
 
def open (self)
 
def close (self)
 
def handle (self, command)
 
def write (self, data)
 
def read (self, size=1)
 
def readline (self, size=-1)
 
def reset_input_buffer (self)
 
def reset_output_buffer (self)
 

Public Attributes

 power
 
 state
 
 mode
 
 internal_peak_power
 
 analog2digital
 
 bias_modulation
 
 digital_modulation
 
- Public Attributes inherited from microscope.testsuite.mock_devices.SerialMock
 in_buffer
 
 out_buffer
 
 out_pending_bytes
 
 out_parsed_bytes
 
 in_read_bytes
 

Static Public Attributes

string eol = b"\r\n"
 
int baudrate = 9600
 
 parity = serial.PARITY_NONE
 
 bytesize = serial.EIGHTBITS
 
 stopbits = serial.STOPBITS_ONE
 
bool rtscts = False
 
bool dsrdtr = False
 
float default_power = 50.0
 
float min_power = 0.0
 
float max_power = 200.0
 
 command2mode
 
dictionary mode2answer
 

Detailed Description

Modelled after a TA Deepstar 488nm.

Definition at line 474 of file mock_devices.py.

Constructor & Destructor Documentation

◆ __init__()

def microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.__init__ (   self,
args,
**  kwargs 
)

Reimplemented from microscope.testsuite.mock_devices.SerialMock.

Definition at line 516 of file mock_devices.py.

516 def __init__(self, *args, **kwargs):
517 super().__init__(*args, **kwargs)
518
519 self.power = self.default_power
520
521 self.state = self.State.S1 # default dependent on 'ASx' command
522 self.mode = self.Mode.blackout
523
524 self.internal_peak_power = False
525 self.analog2digital = False
526 self.bias_modulation = False
527 self.digital_modulation = False
528

Member Function Documentation

◆ handle()

def microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.handle (   self,
  command 
)

Reimplemented from microscope.testsuite.mock_devices.SerialMock.

Definition at line 548 of file mock_devices.py.

548 def handle(self, command):
549 if len(command) != 16 and (
550 len(command) != 7 and self.state != self.State.S2
551 ):
552 # Such a thing will make the laser go into S0 state which
553 # will also turns it off.. We don't model this because
554 # we don't know well how the reset (RST command) works.
555 raise RuntimeError("invalid Omicron Deepstar command")
556 elif command[-2:] != b"\r\n":
557 # Even if a command is correct, the last two characters
558 # need to be \r\n.
559 raise RuntimeError("command does not end in '\\r\\n'")
560
561 command = command[:-2].rstrip(b" ")
562 answer = None
563
564 if command == b"S?":
565 answer = self.state.name.encode()
566 elif command == b"STAT0":
567 # Model-code of the connected lasersystem:
568 answer = (
569 b"MC"
570 + b" 488" # wavelength
571 + b" " # empty for single diode system (D for double)
572 + b" %3d" % (self.max_power) # in mw
573 + b" TA "
574 ) # controller version / operating mode
575 elif command == b"STAT1":
576 answer = (
577 b"SL"
578 + b" 6AB" # actual bias (hexadecimal)
579 + b" 600" # modulated bias-level (hexadecimal)
580 + b" 868" # mod-level internal set for drive max. current
581 + b" T249" # diode temperature (in celcius * 10)
582 + b" V117"
583 ) # control voltage (in volts * 10)
584 elif command == b"STAT2":
585 answer = (
586 b"R111" # firmware release
587 + b" N02" # No used laserpen
588 + b" SNP131056" # S/No of laserhead
589 + b" SNC131056" # S/No of controller
590 + b" WH 04667" # working hours
591 + b" SLS B9C 500"
592 ) # start values for the diode parameters
593 elif command == b"STAT3":
594 # Stored option code flags.
595 answer = (
596 b"OC "
597 + b"AS1" # autostart option
598 + b"TH0" # TTL-logic-high
599 + b"AP0" # auto power correction
600 + b"FK0" # fiber coupling single mode
601 + b"AC0" # analog modulation for CW-lasers
602 + b"AM0" # analog modulation for modulated lasers
603 + b"SU0" # subtractive analog modulation for modulated lasers
604 + b"CO0" # collimator optic
605 + b"FO0" # focusing optic
606 + b"MO0" # highspeed monitoring
607 + b"US0" # USB interface
608 + b"LA1" # RS232 interface
609 + b"FA0"
610 ) # fiber coupling single mode
611
612 # Changing mode
613 elif command in self.command2mode.keys():
614 if self.state == self.State.S2:
615 self.mode = self.command2mode[command]
616 answer = b">"
617 else:
618 answer = b"UK"
619
620 # Current mode (undocumented)
621 elif command == b"L?":
622 if self.state == self.State.S2:
623 answer = self.mode2answer[self.mode]
624 else:
625 answer = b"UK"
626
627 # Laser on
628 elif command == b"LON":
629 if self.state == self.State.S1:
630 self.state = self.State.S2
631 answer = b"LONOK"
632 elif self.mode == self.Mode.S2:
633 answer = b"UK"
634 else: # in S0 state
635 # This is undocumented and it's probably a bug on
636 # their firmware. Should probably be returning UK.
637 answer = b"INT"
638
639 # Laser off
640 elif command == b"LF":
641 if self.state == self.State.S2:
642 self.state = self.State.S1
643 answer = b"LOFFOK"
644 else:
645 answer = b"UK"
646
647 # Peak Power
648 elif command.startswith(b"PP"):
649 # peak power values are a 3 byte char hexadecimal number,
650 # scale to the range of possible power:
651 # 000[hex] = 0[dec] = 0% = 0 mW
652 # FFF[hex] = 4095[dec] = 100% = 200 mW
653 if command == b"PP?":
654 level = self.power / self.max_power
655 answer = b"PP%03X" % round(float(0xFFF) * level)
656 elif len(command) == 5:
657 level = int(command[2:], 16) / float(0xFFF)
658 self.power = level * self.max_power
659 answer = command
660 else:
661 raise RuntimeError("invalid command '%'" % command)
662
663 # Power level
664 elif command == b"P?":
665 # TODO: get a laser that supports this command to test.
666 # This is only based on the documentation.
667 #
668 # Actual laser power is a 4 byte char heaxadecimal
669 # number. Range for actual laser power is:
670 # 0x0000 = 0 [dec] = 0% = 0 mW
671 # 0x0CCC = 3276 [dec] = 100% = 200 mW
672 # 0x0FFF = 4095 [dec] = 120% = 240 mW
673 level = self.power / self.max_power
674 answer = b"P%04X" % round(float(0xCCC) * level)
675
676 # Internal peak power
677 elif command == b"IPO":
678 self.internal_peak_power = True
679 answer = command
680 elif command == b"IPF":
681 self.internal_peak_power = False
682 answer = command
683 elif command == b"IP?":
684 answer = b"IPO" if self.internal_peak_power else b"IPF"
685
686 # Analogue modulation path or signal linked to the digital
687 # modulation path.
688 elif command == b"A2DO":
689 self.analog2digital = True
690 answer = b"A2D ON"
691 elif command == b"A2DF":
692 self.analog2digital = False
693 answer = b"A2D OFF"
694 elif command == b"A2D?":
695 answer = b"A2D ON" if self.analog2digital else b"A2D OFF"
696
697 # Bias and Digital modulation
698 elif command == b"MF":
699 self.bias_modulation = False
700 self.digital_modulation = False
701 answer = command
702 elif command == b"MO1":
703 self.bias_modulation = True
704 self.digital_modulation = False
705 answer = command
706 elif command == b"MO2":
707 self.bias_modulation = False
708 self.digital_modulation = True
709 answer = command
710 elif command == b"MO3":
711 self.bias_modulation = True
712 self.digital_modulation = True
713 answer = command
714
715 else:
716 raise NotImplementedError(
717 "no handling for command '%s'" % command.decode("utf-8")
718 )
719
720 self.in_buffer.write(answer + self.eol)

Referenced by microscope.cameras._SDK3Cam.SDK3Camera.__init__(), microscope.cameras.pvcam.PVCamera.abort(), microscope.cameras.andorsdk3.AndorSDK3.get_id(), microscope.cameras.andorsdk3.AndorSDK3.initialize(), microscope.cameras.pvcam.PVCamera.initialize(), microscope.cameras.andorsdk3.AndorSDK3.invalidate_buffers(), microscope.cameras.pvcam.PVCamera.set_trigger(), and microscope.cameras.pvcam.PVCamera.soft_trigger().

◆ light()

def microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.light (   self)

Definition at line 530 of file mock_devices.py.

530 def light(self):
531 if (
532 self.state != self.State.S2
533 or self.mode == self.mode.blackout
534 or not self.internal_peak_power
535 or (self.analog2digital and not self.digital_modulation)
536 ):
537 return False
538 return True
539

◆ write()

def microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.write (   self,
  data 
)

Reimplemented from microscope.testsuite.mock_devices.SerialMock.

Definition at line 540 of file mock_devices.py.

540 def write(self, data):
541 # This connection does not wait for an eol to parse the
542 # command. It only looks at 16 or 7 bit (depending on
543 # state). Sending a message one character at a time will not
544 # work so just send the whole data to be handled.
545 self.handle(data)
546 return len(data)
547

Member Data Documentation

◆ analog2digital

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.analog2digital

Definition at line 525 of file mock_devices.py.

◆ baudrate

int microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.baudrate = 9600
static

Definition at line 479 of file mock_devices.py.

◆ bias_modulation

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.bias_modulation

Definition at line 526 of file mock_devices.py.

◆ bytesize

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.bytesize = serial.EIGHTBITS
static

Definition at line 481 of file mock_devices.py.

◆ command2mode

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.command2mode
static

Definition at line 502 of file mock_devices.py.

◆ default_power

float microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.default_power = 50.0
static

Definition at line 487 of file mock_devices.py.

◆ digital_modulation

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.digital_modulation

Definition at line 527 of file mock_devices.py.

◆ dsrdtr

bool microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.dsrdtr = False
static

Definition at line 484 of file mock_devices.py.

◆ eol

string microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.eol = b"\r\n"
static

◆ internal_peak_power

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.internal_peak_power

Definition at line 524 of file mock_devices.py.

◆ max_power

float microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.max_power = 200.0
static

Definition at line 489 of file mock_devices.py.

◆ min_power

float microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.min_power = 0.0
static

Definition at line 488 of file mock_devices.py.

◆ mode

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.mode

Definition at line 522 of file mock_devices.py.

◆ mode2answer

dictionary microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.mode2answer
static
Initial value:
= {
Mode.blackout: b"L0", # always L0, even if BLK was used
Mode.bias: b"LB",
Mode.modulated: b"L1",
Mode.deepstar: b"L2",
}

Definition at line 509 of file mock_devices.py.

◆ parity

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.parity = serial.PARITY_NONE
static

Definition at line 480 of file mock_devices.py.

◆ power

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.power

Definition at line 519 of file mock_devices.py.

◆ rtscts

bool microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.rtscts = False
static

Definition at line 483 of file mock_devices.py.

◆ state

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.state

Definition at line 521 of file mock_devices.py.

◆ stopbits

microscope.testsuite.mock_devices.OmicronDeepstarLaserMock.stopbits = serial.STOPBITS_ONE
static

Definition at line 482 of file mock_devices.py.


The documentation for this class was generated from the following file: