예제 #1
0
    def get_user_filename(self):
        """
        Returns a filename given the current run number and title.

        If device is simulated do not attempt to get run number or title from channel access
        """

        if self.simulated:
            filename = "LSICORR_IOC_test_user_save.dat"
        else:
            run_number = ChannelAccess.caget(RUNNUMBER_PV.format(pv_prefix=self.pv_prefix))
            print_and_log("run number = {}".format(run_number))
            timestamp = datetime.now().strftime("%Y-%m-%dT%H_%M_%S")

            experiment_name = self.get_converted_pv_value(Records.EXPERIMENTNAME.name)

            if experiment_name == "":
                # No name supplied, use run title
                experiment_name = ChannelAccess.caget(TITLE_PV.format(pv_prefix=self.pv_prefix))

            filename = "{run_number}_{experiment_name}_{timestamp}.dat".format(
                run_number=run_number, experiment_name=remove_non_ascii(experiment_name), timestamp=timestamp
                )

        # Update last used filename PV
        full_filename = os.path.join(self.user_filepath, filename)
        self.update_pv_and_write_to_device(Records.OUTPUTFILE.name, full_filename)

        return full_filename
    def get_archive_filename(self):
        """
        Returns a filename which the archive data file will be saved with
        """
        timestamp = datetime.now().strftime("%Y-%m-%dT%H_%M_%S")
        run_number = ChannelAccess.caget(
            RUNNUMBER_PV.format(pv_prefix=self.pv_prefix))
        instrument = ChannelAccess.caget(
            INSTNAME_PV.format(pv_prefix=self.pv_prefix))

        filename = "{instrument}{run_number}_DLS_{timestamp}.txt".format(
            instrument=instrument, run_number=run_number, timestamp=timestamp)

        full_filename = os.path.join(DATA_DIR, filename)
        print_and_log("filename1: {}".format(full_filename))
        return full_filename
    def get_iocs(self):
        """ Get a list of IOCs from DatabaseServer.

        Returns:
            list : A list of IOC names
        """
        try:
            rawjson = dehex_and_decompress(ChannelAccess.caget(self._blockserver_prefix + "IOCS"))
            return json.loads(rawjson).keys()
        except:
            return list()
    def _reload(self):
        print_and_log("Reloading gateway")
        try:
            # Have to wait after put as the gateway does not do completion callbacks (it is not an IOC)
            ChannelAccess.caput(self._prefix + "newAsFlag", 1, False)

            while ChannelAccess.caget(self._prefix + "newAsFlag") == 1:
                time.sleep(1)
            print_and_log("Gateway reloaded")
        except Exception as err:
            print_and_log("Problem with reloading the gateway %s" % err)
    def exists(self):
        """Checks the gateway exists by querying on of the PVs.

        Returns:
            bool : Whether the gateway is running and is accessible
        """
        val = ChannelAccess.caget(self._prefix + "pvtotal")
        if val is None:
            return False
        else:
            return True
예제 #6
0
    def get_archive_filename(self):
        """
        Returns a filename which the archive data file will be saved with.

        If device is simulated do not attempt to get instrument name or run number from channel access.
        If simulated save file in user directory instead of usual data directory.
        """
        if self.simulated:
            full_filename = os.path.join(self.user_filepath, "LSICORR_IOC_test_archive_save.dat")
        else:
            timestamp = datetime.now().strftime("%Y-%m-%dT%H_%M_%S")
            run_number = ChannelAccess.caget(RUNNUMBER_PV.format(pv_prefix=self.pv_prefix))
            instrument = ChannelAccess.caget(INSTNAME_PV.format(pv_prefix=self.pv_prefix))

            filename = "{instrument}{run_number}_DLS_{timestamp}.txt".format(instrument=instrument,
                                                                             run_number=run_number,
                                                                             timestamp=timestamp)

            full_filename = os.path.join(DATA_DIR, filename)

        return full_filename
    def get_ioc_status(self, prefix, ioc):
        """Gets the status of the specified IOC.

        Args:
            prefix (string): The prefix for the instrument
            ioc (string): The name of the IOC

        Returns:
            string : The status
        """
        ans = ChannelAccess.caget(self.generate_prefix(prefix, ioc) + ":STATUS", as_string=True)
        if ans is None:
            raise Exception("Could not find IOC (%s)" % self.generate_prefix(prefix, ioc))
        return ans.upper()
    def get_ioc_status(self, prefix, ioc):
        """Gets the status of the specified IOC

        Args:
            prefix (string): The prefix of the instrument the IOC is being run on
            ioc (string): The name of the IOC

        Returns:
            string : The status of the requested IOC
        """
        pv = self.generate_prefix(prefix, ioc) + ":STATUS"
        ans = ChannelAccess.caget(pv, as_string=True)
        if ans is None:
            raise Exception("Could not find IOC (%s)" % pv)
        return ans.upper()
    def get_autorestart(self, prefix, ioc):
        """Gets the current auto-restart setting of the specified IOC.

        Args:
            prefix (string): The prefix for the instrument
            ioc (string): The name of the IOC

        Returns:
            bool : Whether auto-restart is enabled
        """
        ans = ChannelAccess.caget(self.generate_prefix(prefix, ioc) + ":AUTORESTART", as_string=True)
        if ans is None:
            raise Exception("Could not find IOC (%s)" % self.generate_prefix(prefix, ioc))
        elif ans == "On":
            return True
        elif ans == "Off":
            return False
        else:
            raise Exception("Could not get auto-restart property for IOC (%s)" % self.generate_prefix(prefix, ioc))
    def _check_PV_compressed_hex(self, pv_name, description, help_text="", allowed_values=None):
        full_pv = "{prefix}{pv_name}".format(prefix=self._prefix, pv_name=pv_name)
        value = ca.caget(full_pv)
        if value is None:
            LOG.error("{description}: Fail PV can not be read".format(description=description))
            LOG.error("    {help}".format(help=help_text))
            return False

        try:
            uncompressed_val = zlib.decompress(value.decode("hex"))
        except Exception as ex:
            #TODO: untried
            LOG.error("{full_pv}={value}".format(full_pv=full_pv, value=value))
            LOG.error("{description}: Fail to decompress PV with error - {ex}".format(ex=ex))
            return False

        if allowed_values is not None and uncompressed_val not in allowed_values:
            LOG.error("{full_pv}={value}".format(full_pv=full_pv, value=uncompressed_val))
            LOG.error("{description}: Fail PV has invalid value must be one of {allowed_values}".format(
                description=description, allowed_values=allowed_values))
            LOG.error("    {help}".format(help=help_text))
            return False

        return True
    # The PV address list
    pv_address = "CS:INSTLIST"

    # instrument list values to set (uses utility to return the dictionary but you can use a dictionary directly)
    instruments_list = [
        inst_dictionary("LARMOR"),
        inst_dictionary("ALF"),
        inst_dictionary("DEMO"),
        inst_dictionary("IMAT"),
        inst_dictionary("MUONFE", hostname_prefix="NDE"),
        inst_dictionary("ZOOM"),
        inst_dictionary("IRIS")
    ]

    new_value = json.dumps(instruments_list)
    new_value_compressed = compress_and_hex(new_value)

    ca.caput(pv_address, str(new_value_compressed), True)

    result_compr = ca.caget(pv_address, True)
    result = dehex_and_decompress(result_compr)

    print result

    if result != new_value:
        print "Warning! Entered value does not match new value."
        print "Entered value: " + new_value
        print "Actual value: " + result
    else:
        print "Success! The PV now reads: {0}".format(result)