def openat(self, sunset=False): """Function to ready the APF for observing. Calls either openatsunset or openatnight. This function will attempt to open successfully twice. If both attempts fail, then it will return false, allowing the master to register the error and behave accodingly. Otherwise it will return True. """ # If this is a test run, just return True if self.test: return True if not self.ok2open: # This should really never happen. In case of a temporary condition, we give # a short waitfor rather than immediatly exiting. chk_open = "$checkapf.OPEN_OK == true" result = APFLib.waitFor(self.task, False, chk_open, timeout=30) if not result: apflog("Tried calling openat with OPEN_OK = False. Can't open.", echo=True) apflog(self.checkapf["OPREASON"].read(), echo=True) return False if float(self.sunel) > -3.2: apflog("Sun is still up. Current sunel = %4.2f. Can't open." % self.sunel, echo=True) return False if self.mv_perm.binary == False: apflog("Waiting for permission to move...", echo=True) chk_move = "$checkapf.MOVE_PERM == true" result = APFTask.waitFor(self.task, False, chk_move, timeout=600) if not result: apflog("Can't open. No move permission.",echo=True) return False # Everything seems acceptable, so lets try opening if sunset: cmd = '/usr/local/lick/bin/robot/openatsunset' else: cmd = '/usr/local/lick/bin/robot/openatnight' # Make two tries at opening. If they both fail return False so the caller can act # accordingly. result, code = cmdexec(cmd) if not result: apflog("First openup attempt has failed. Exit code = %d. After a pause, will make one more attempt." % code,echo=True) APFLib.waitFor(self.task, True, timeout=10) result, code = cmdexec(cmd) if result: return True else: apflog("Second openup attempt also failed. Exit code %d. Giving up." % code,echo=True) return False else: return True