Exemplo n.º 1
0
    def __init__(self, serial=None, **kwargs):
        super().__init__(**kwargs)

        if serial is not None:

            # Attach the serial devices
            self._rx = clink.ClinkSerialRx()
            pr.streamConnect(serial, self._rx)

            self._tx = clink.ClinkSerialTx()
            pr.streamConnect(self._tx, serial)

            @self.command(value='',
                          name='SendString',
                          description='Send a command string')
            def sendString(arg):
                if self._tx is not None:
                    self._tx.sendString(arg)
Exemplo n.º 2
0
    def __init__(   self,
            name        = 'UartOpal1000',
            description = 'Uart Opal1000 channel access',
            serial      = None,
            **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Attach the serial devices
        self._rx = UartOpal1000Rx()
        pr.streamConnect(serial,self._rx)

        self._tx = clink.ClinkSerialTx()
        pr.streamConnect(self._tx,serial)

        @self.command(value='', name='SendString', description='Send a command string')
        def sendString(arg):
            if self._tx is not None:
                self._tx.sendString(arg)

        ##############################
        # Variables
        ##############################

        self.add(pr.LocalVariable(
            name         = 'ID',
            description  = 'Retrieves the camera model and serial number',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@ID?')
        ))

        self.add(pr.LocalVariable(
            name         = 'BS',
            description  = 'Build string',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@BS?')
        ))

        self.add(pr.LocalVariable(
            name         = 'CCE[0]',
            description  = 'Selects the exposure control source and event selection',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@CCE{self.CCE[0].get()};{self.CCE[1].get()}') if (self.CCE[0].get()!='' and self.CCE[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'CCE[1]',
            description  = 'Selects the exposure control source and event selection',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@CCE{self.CCE[0].get()};{self.CCE[1].get()}') if (self.CCE[0].get()!='' and self.CCE[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'CCFS[0]',
            description  = 'Selects the frame start control source and event selection',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@CCFS{self.CCFS[0].get()};{self.CCFS[1].get()}') if (self.CCFS[0].get()!='' and self.CCFS[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'CCFS[1]',
            description  = 'Selects the frame start control source and event selection',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@CCFS{self.CCFS[0].get()};{self.CCFS[1].get()}') if (self.CCFS[0].get()!='' and self.CCFS[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'DPE',
            description  = 'Enables or disables the defect pixel correction.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@DPE{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'FP',
            description  = 'Sets the frame period.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@FP{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'FSM',
            description  = 'Selects the FSTROBE output and polarity',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@FSM{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'FST[0]',
            description  = 'Configures the FSTROBE, step, delay and active',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@FST{self.FST[0].get()};{self.FST[1].get()}') if (self.FST[0].get()!='' and self.FST[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'FST[1]',
            description  = 'Configures the FSTROBE, step, delay and active',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@FST{self.FST[0].get()};{self.FST[1].get()}') if (self.FST[0].get()!='' and self.FST[1].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'GA',
            description  = 'Sets the digital gain of the camera.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@GA{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'IT',
            description  = 'Sets the integration time.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@IT{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'MI',
            description  = 'Enables or disables the mirror function.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@MI{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'MO',
            description  = 'Sets the operating mode of the camera.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@MO{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'OFS',
            description  = 'Sets the output offset in GL at 12 bit internal resolution',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@OFS{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'OR',
            description  = 'Sets the output resolution of the camera.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@OR{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'TP',
            description  = 'Selects display of the test pattern',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@TP{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'VBIN',
            description  = 'Sets the image output binning',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@VBIN{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'WB[0]',
            description  = 'Sets the gain for the Red, Green and Blue channel',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@WB{self.WB[0].get()};{self.WB[1].get()};{self.WB[2].get()}') if (self.WB[0].get()!='' and self.WB[1].get()!='' and self.WB[2].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'WB[1]',
            description  = 'Sets the gain for the Red, Green and Blue channel',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@WB{self.WB[0].get()};{self.WB[1].get()};{self.WB[2].get()}') if (self.WB[0].get()!='' and self.WB[1].get()!='' and self.WB[2].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'WB[2]',
            description  = 'Sets the gain for the Red, Green and Blue channel',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@WB{self.WB[0].get()};{self.WB[1].get()};{self.WB[2].get()}') if (self.WB[0].get()!='' and self.WB[1].get()!='' and self.WB[2].get()!='') else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'BL',
            description  = 'Sets the black level.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@BL{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'VR',
            description  = 'Enabling and disabling the vertical remap is done by means of the vertical remap command.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@VR{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'OVL',
            description  = 'Overlay frame counter and integration time in first 8 pixels.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@OVL{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'FSP',
            description = '''
                The active state of the strobe output can be inverted to adapt to the application requirements.
                0 for the reverse polarity: in this polarity configuration the phototransistor at the camera output is non-conductive during the active state of the strobe.
                1 for the normal polarity: in this polarity configuration the phototransistor at the camera output is conductive during the active state of the strobe.
                ''',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'@FSP{value}') if value!='' else ''
        ))
Exemplo n.º 3
0
    def __init__(self, serial=None, **kwargs):
        super().__init__(**kwargs)

        # Attach the serial devices
        self._rx = clink.UartUp900cl12bRx(self.path)
        pr.streamConnect(serial,self._rx)

        self._tx = clink.ClinkSerialTx(self.path)
        pr.streamConnect(self._tx,serial)

        @self.command(value='', name='SendString', description='Send a command string')
        def sendString(arg):
            if self._tx is not None:
                self._tx.sendString(arg)

        ##############################
        # Variables
        ##############################

        self.add(pr.LocalVariable(
            name         = 'RU',
            description  = 'Recall user page: Must have a number after “ru” such as 1, 2, 3 or 4',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'ru{value}') if value!='' else ''
        ))

        self.add(pr.BaseCommand(
            name         = 'RP',
            description  = 'Report current camera setting',
            function     = lambda cmd: self._tx.sendString('rp')
        ))

        self.add(pr.BaseCommand(
            name         = 'RF',
            description  = 'Recall factory setting page',
            function     = lambda cmd: self._tx.sendString('rf')
        ))

        self.add(pr.LocalVariable(
            name         = 'SM',
            description  = 'Shutter mode: Must have a number after sm (1 ~ f), refer to section 3.3 for details.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sm{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'SP',
            description  = 'Save user page: There are 4 user page available',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sp{value}') if value!='' else ''
        ))

        self.add(pr.BaseCommand(
            name         = 'NS',
            description  = 'Normal speed: Refer to camera specifications',
            function     = lambda cmd: self._tx.sendString('ns')
        ))

        self.add(pr.BaseCommand(
            name         = 'DS',
            description  = 'Double speed: Refer to camera specifications',
            function     = lambda cmd: self._tx.sendString('ds')
        ))

        self.add(pr.BaseCommand(
            name         = 'NM',
            description  = 'Normal mode: Normal free running',
            function     = lambda cmd: self._tx.sendString('nm')
        ))

        self.add(pr.BaseCommand(
            name         = 'AM',
            description  = 'Asynchronous mode: Asynchronous reset',
            function     = lambda cmd: self._tx.sendString('am')
        ))

        self.add(pr.LocalVariable(
            name         = 'GI',
            description  = 'Gain increase: ### = Hexadecimals (000 ~ 3ff). If no number entered, gain will be increased by factor of 1. If a number is entered, then number will be added to stored gain.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'gi{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'GD',
            description  = 'Gain decrease: ### = Hexadecimals (000 ~ 3ff). Same as gi, except it will be decreased.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'gd{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'GN',
            description  = 'Gain number: ### = Hexadecimals (000 ~ 3ff). Refer to the gain curves below for details',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'gn{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'BI',
            description  = 'Reference increase: ### = Hexadecimals (000 ~ 3ff). If no number entered, reference will be increased by factor of 1. If a number is entered, then number will be added to stored reference. Note: It’s very uncommon to change reference level, contact UNIQ for further details.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'bi{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'BD',
            description  = 'Reference decrease: ### = Hexadecimals (000 ~ 3ff). If no number entered, reference will be increased by factor of 1. If a number is entered, then number will be added to stored reference. Note: It’s very uncommon to change reference level, contact UNIQ for further details.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'bd{value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(
            name         = 'BN',
            description  = 'Reference number: ### = Hexadecimals (000 ~ 3ff). If no number entered, reference will be increased by factor of 1. If a number is entered, then number will be added to stored reference. Note: It’s very uncommon to change reference level, contact UNIQ for further details.',
            mode         = 'RW',
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'bn{value}') if value!='' else ''
        ))
Exemplo n.º 4
0
    def __init__(   self,       
            name        = 'UartPiranha4',
            description = 'Uart Piranha4 channel access',
            serial      = None,
            **kwargs):
        super().__init__(name=name, description=description, **kwargs) 

        # Attach the serial devices
        self._rx = clink.ClinkSerialRx()
        pr.streamConnect(serial,self._rx)

        self._tx = clink.ClinkSerialTx()
        pr.streamConnect(self._tx,serial)
        
        @self.command(value='', name='SendString', description='Send a command string')
        def sendString(arg):
            if self._tx is not None:
                self._tx.sendString(arg)

        ##############################
        # Variables
        ##############################        
        
        self.add(pr.LocalVariable(    
            name         = 'CCF',
            description  = 'Calibrate user FPN dark flat field coefficients',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'ccf {value}') if value!='' else ''
        ))
        
        self.add(pr.LocalVariable(    
            name         = 'CLS',
            description  = 'Camera Link clock frequency',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'cls {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'CLM',
            description  = 'Camera Link Mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'clm {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'CPA[0]',
            description  = 'Calibrate user PRNU flat field coefficients: Algorithm Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'cpa {self.CPA[0].get()} {self.CPA[1].get()} {self.CPA[2].get()}') if (self.CPA[0].get()!='' and self.CPA[1].get()!='' and self.CPA[2].get()!='') else ''
        ))          
        
        self.add(pr.LocalVariable(    
            name         = 'CPA[1]',
            description  = 'Calibrate user PRNU flat field coefficients: \# of lines to average Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'cpa {self.CPA[0].get()} {self.CPA[1].get()} {self.CPA[2].get()}') if (self.CPA[0].get()!='' and self.CPA[1].get()!='' and self.CPA[2].get()!='') else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'CPA[2]',
            description  = 'Calibrate user PRNU flat field coefficients: Target Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'cpa {self.CPA[0].get()} {self.CPA[1].get()} {self.CPA[2].get()}') if (self.CPA[0].get()!='' and self.CPA[1].get()!='' and self.CPA[2].get()!='') else ''
        ))             

        self.add(pr.LocalVariable(    
            name         = 'DST',
            description  = 'Use this command to switch between Area and Single Line modes.',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'dst {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'FFM',
            description  = 'Set flat field mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'ffm {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'FRS',
            description  = 'Set scan direction controlled reverse set',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'frs {value}') if value!='' else ''
        ))

        self.add(pr.BaseCommand(    
            name         = 'GCP',
            description  = 'Display current value of camera configuration parameters',
            function     = lambda cmd: self._tx.sendString('gcp')
        ))            

        self.add(pr.LocalVariable(    
            name         = 'GET',
            description  = 'The /"get/" command displays the current value(s) of the feature specified in the string parameter. Note that the parameter is preceded by a single quote \"\". Using this command will be easier for control software than parsing the output from the \"gcp\" command.',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'get {value}') if value!='' else ''
        ))            
        
        self.add(pr.BaseCommand(    
            name         = 'H',
            description  = 'Display list of three letter commands',
            function     = lambda cmd: self._tx.sendString('h')
        ))             
        
        self.add(pr.LocalVariable(    
            name         = 'LPC',
            description  = 'Load user set',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'lpc {value}') if value!='' else ''
        ))            
        
        self.add(pr.BaseCommand(    
            name         = 'RC',
            description  = 'Resets the camera to the saved user default settings. These settings are saved using the usd command.',
            function     = lambda cmd: self._tx.sendString('rc')
        ))            
        
        self.add(pr.LocalVariable(    
            name         = 'ROI[0]',
            description  = 'Flat field region of interest: First pixel Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'roi {self.ROI[0].get()} {self.ROI[1].get()}') if (self.ROI[0].get()!='' and self.ROI[1].get()!='') else ''
        ))          
        
        self.add(pr.LocalVariable(    
            name         = 'ROI[1]',
            description  = 'Flat field region of interest: Last pixel Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'roi {self.ROI[0].get()} {self.ROI[1].get()}') if (self.ROI[0].get()!='' and self.ROI[1].get()!='') else ''
        )) 
        
        self.add(pr.BaseCommand(    
            name         = 'RPC',
            description  = 'Reset all user FPN values to zero and all user PRNU coefficients to one',
            function     = lambda cmd: self._tx.sendString('rpc')
        ))               
        
        self.add(pr.LocalVariable(    
            name         = 'SAC',
            description  = 'Set AOI Counter',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sac {value}') if value!='' else ''
        ))             
        
        self.add(pr.LocalVariable(    
            name         = 'SAD[0]',
            description  = 'Define an AOI: Selector Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sad {self.SAD[0].get()} {self.SAD[1].get()} {self.SAD[2].get()}') if (self.SAD[0].get()!='' and self.SAD[1].get()!='' and self.SAD[2].get()!='') else ''
        ))          
        
        self.add(pr.LocalVariable(    
            name         = 'SAD[1]',
            description  = 'Define an AOI: Offset Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sad {self.SAD[0].get()} {self.SAD[1].get()} {self.SAD[2].get()}') if (self.SAD[0].get()!='' and self.SAD[1].get()!='' and self.SAD[2].get()!='') else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'SAD[2]',
            description  = 'Define an AOI: Width Argument',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sad {self.SAD[0].get()} {self.SAD[1].get()} {self.SAD[2].get()}') if (self.SAD[0].get()!='' and self.SAD[1].get()!='' and self.SAD[2].get()!='') else ''
        ))              
        
        self.add(pr.LocalVariable(    
            name         = 'SAM',
            description  = 'Set AOI mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sam {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'SBH',
            description  = 'Set horizontal binning',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sbh {value}') if value!='' else ''
        ))  

        self.add(pr.LocalVariable(    
            name         = 'SBR',
            description  = 'Set baud rate',
            mode         = 'RW', 
            value        = '',
            units        = 'bps',
            localSet     = lambda value: self._tx.sendString(f'sbr {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'SBV',
            description  = 'Set vertical binning',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sbv {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'SCD',
            description  = 'Set sensor scan direction',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'scd {value}') if value!='' else ''
        ))  

        self.add(pr.LocalVariable(    
            name         = 'SEM',
            description  = 'Set exposure time mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'sem {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'SET',
            description  = 'Set internal exposure time in nanoseconds (25 ns resolution)',
            mode         = 'RW', 
            value        = '',
            units        = '25ns',
            localSet     = lambda value: self._tx.sendString(f'set {value}') if value!='' else ''
        ))            

        self.add(pr.LocalVariable(    
            name         = 'SMM',
            description  = 'Set mirroring mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'smm {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'SPF',
            description  = 'Set pixel format',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'spf {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'SSB',
            description  = 'Set contrast offset - single value added to all pixels after PRNU/flat field coefficients (before gain).',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'ssb {value}') if value!='' else ''
        ))

        self.add(pr.LocalVariable(    
            name         = 'SSF',
            description  = 'Set internal line rate in Hz',
            mode         = 'RW', 
            value        = '',
            units        = 'Hz',
            localSet     = lambda value: self._tx.sendString(f'ssf {value}') if value!='' else ''
        ))            
        
        self.add(pr.LocalVariable(    
            name         = 'SSG',
            description  = 'Set gain as a single value multiplied by all pixels.',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'ssg {value}') if value!='' else ''
        ))   

        self.add(pr.LocalVariable(    
            name         = 'STG',
            description  = 'Set TDI Stages',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'stg {value}') if value!='' else ''
        ))  

        self.add(pr.LocalVariable(    
            name         = 'STM',
            description  = 'Set trigger mode',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'stm {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'SVM',
            description  = 'Select test pattern',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'svm {value}') if value!='' else ''
        ))  

        self.add(pr.LocalVariable(    
            name         = 'USD',
            description  = 'Select user set to load when camera is reset',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'usd {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'USL',
            description  = 'Load user set',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'usl {value}') if value!='' else ''
        )) 

        self.add(pr.LocalVariable(    
            name         = 'USS',
            description  = 'Save user set',
            mode         = 'RW', 
            value        = '',
            localSet     = lambda value: self._tx.sendString(f'uss {value}') if value!='' else ''
        ))  

        self.add(pr.BaseCommand(    
            name         = 'VT',
            description  = 'Display internal temperature in degrees Celsius',
            function     = lambda cmd: self._tx.sendString('vt'),
        ))

        self.add(pr.BaseCommand(    
            name         = 'VV',
            description  = 'Display supply voltage',
            function     = lambda cmd: self._tx.sendString('vv'),
        ))  

        self.add(pr.BaseCommand(    
            name         = 'SendEscape',
            description  = 'Send the Escape Char',
            function     = lambda cmd: self._tx.sendEscape()
        ))