48        fsm = properties.TextVector(name=
'fsm')
 
   49        fsm.add_element(DefText(name=
'state', _value=StateCodes.INITIALIZED.name))
 
   50        self.add_property(fsm)
 
   53        sv = properties.SwitchVector(
 
   55            rule=constants.SwitchRule.ONE_OF_MANY,
 
   56            perm=constants.PropertyPerm.READ_WRITE,
 
   58        sv.add_element(DefSwitch(name=
"idle", _value=constants.SwitchState.ON))
 
   59        sv.add_element(DefSwitch(name=
"SRLoop", _value=constants.SwitchState.OFF)) 
 
   60        sv.add_element(DefSwitch(name=
"oneshot", _value=constants.SwitchState.OFF)) 
 
   64        nv = properties.NumberVector(name=
'n_avg')
 
   65        nv.add_element(DefNumber(
 
   66            name=
'current', label=
'Number of frames', format=
'%i',
 
   67            min=1, max=150, step=1, _value=1
 
   69        nv.add_element(DefNumber(
 
   70            name=
'target', label=
'Number of frames', format=
'%i',
 
   71            min=1, max=150, step=1, _value=1
 
   76        nv = properties.NumberVector(name=
'n_jitter')
 
   77        nv.add_element(DefNumber(
 
   78            name=
'current', label=
'Number of frames', format=
'%i',
 
   79            min=1, max=150, step=1, _value=1
 
   81        nv.add_element(DefNumber(
 
   82            name=
'target', label=
'Number of frames', format=
'%i',
 
   83            min=1, max=150, step=1, _value=1
 
   88        nv = properties.NumberVector(name=
'SR_est')
 
   89        nv.add_element(DefNumber(
 
   90            name=
'current', label=
'SR_est', format=
'%i',
 
   91            min=0, max=1, step=0.01, _value=1
 
   96        nv = properties.NumberVector(name=
'SR_EE')
 
   97        nv.add_element(DefNumber(
 
   98            name=
'current', label=
'SR_EE', format=
'%i',
 
   99            min=0, max=1, step=0.01, _value=1
 
  101        self.add_property(nv)
 
  104        nv = properties.NumberVector(name=
'jitter_RMS')
 
  105        nv.add_element(DefNumber(
 
  106            name=
'current', label=
'jitter_RMS', format=
'%i',
 
  107            min=0, max=100, step=0.1, _value=0.0
 
  109        self.add_property(nv)
 
  112        nv = properties.NumberVector(name=
'jitter_x')
 
  113        nv.add_element(DefNumber(
 
  114            name=
'current', label=
'jitter_x', format=
'%i',
 
  115            min=-20, max=20, step=0.1, _value=0.0
 
  117        self.add_property(nv)
 
  120        nv = properties.NumberVector(name=
'jitter_y')
 
  121        nv.add_element(DefNumber(
 
  122            name=
'current', label=
'jitter_y', format=
'%i',
 
  123            min=-20, max=20, step=0.1, _value=0.0
 
  125        self.add_property(nv)
 
  132        self.client.get_properties([
'modwfs'])
 
  134        self.
modRadius = self.client[
'modwfs.modRadius.current']
 
  135        self.log.info(f
"Mod radius is {self.modRadius}")
 
  138        self.log.info(
"Found camera: {:s}".format(self.
config.camera.shmim))
 
  143            indi_client=self.client,
 
  168            self.
labf = 
'lab_2000_3ld_ND2.fits' 
  170            self.
labf = 
'lab_3000_2ld_ND2.fits' 
  172            self.log.exception(
" Not a calibrated mod radius, applying a bogus lab file!")
 
  173            self.
labf = 
'lab_2000_3ld_ND2.fits' 
  177        self.properties[
'fsm'][
'state'] = StateCodes.READY.name
 
  178        self.update_property(self.properties[
'fsm'])
 
 
  181        target_list = [
'idle', 
'SRLoop', 
'oneshot']
 
  182        for key 
in target_list: 
 
  183            if existing_property[key] == constants.SwitchState.ON: 
 
  186        if current_state 
not in new_message: 
 
  188            for key 
in target_list:
 
  189                existing_property[key] = constants.SwitchState.OFF 
 
  190                if key 
in new_message: 
 
  191                    existing_property[key] = new_message[key] 
 
  195                        self.properties[
'fsm'][
'state'] = StateCodes.READY.name
 
  197                        self.log.debug(
'State changed to idle')                    
 
  198                    elif key == 
'SRLoop':
 
  199                        self.
_state = States.CLOSED_LOOP
 
  201                        self.properties[
'fsm'][
'state'] = StateCodes.OPERATING.name
 
  202                        self.log.debug(
'State changed to continuous')
 
  203                    elif key == 
'oneshot':
 
  204                        self.
_state = States.ONESHOT
 
  206                        self.properties[
'fsm'][
'state'] = StateCodes.OPERATING.name
 
  207                        self.log.debug(
'State changed to oneshot')
 
  209            self.update_property(existing_property)
 
  210            self.update_property(self.properties[
'fsm'])