Skip to content
Snippets Groups Projects
ini_device.py 6.66 KiB
Newer Older
# -*- coding: utf-8 -*-
#
# This file wraps around a tango device class and provides a number of abstractions useful for hardware devices. It works together
#
# Distributed under the terms of the APACHE license.
# See LICENSE.txt for more info.

"""

"""

# PyTango imports
from tango.server import run
from tango.server import device_property
from tango import AttrWriteType
from tango import DevState
# Additional import
from util.attribute_wrapper import attribute_wrapper
from util.hardware_device import hardware_device

import configparser
import numpy

from clients.ini_client import *


__all__ = ["ini_device"]


def write_ini_file(filename):
    with open(filename, 'w') as configfile:

        config = configparser.ConfigParser()
        config['scalar'] = {}
        config['scalar']['double_scalar_R'] = '1.2'
        config['scalar']['bool_scalar_R'] = 'True'
        config['scalar']['int_scalar_R'] = '5'
        config['scalar']['str_scalar_R'] = 'this is a test'

        config['spectrum'] = {}
        config['spectrum']['double_spectrum_R'] = '1.2, 2.3, 3.4, 4.5'
        config['spectrum']['bool_spectrum_R'] = 'True, True, False, False'
        config['spectrum']['int_spectrum_R'] = '1, 2, 3, 4'
        config['spectrum']['str_spectrum_R'] = '"a", "b", "c", "d"'

        config['image'] = {}
        config['image']['double_image_R'] = '1.2, 2.3, 3.4, 4.5, 5.6, 6.7'
        config['image']['bool_image_R'] = 'True, True, False, False, True, False'
        config['image']['int_image_R'] = '1, 2, 3, 4, 5, 6'
        config['image']['str_image_R'] = '"a", "b", "c", "d", "e", "f"'

        config.write(configfile)



class ini_device(hardware_device):
    """
    This class is the minimal (read empty) implementation of a class using 'hardware_device'
    """

    # ----------
    # Attributes
    # ----------
    """
    attribute wrapper objects can be declared here. All attribute wrapper objects will get automatically put in a list (attr_list) for easy access

    example = attribute_wrapper(comms_annotation="this is an example", datatype=numpy.double, dims=(8, 2), access=AttrWriteType.READ_WRITE)
    ...

    """
    double_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "double_scalar_RW"}, datatype=numpy.double, access=AttrWriteType.READ_WRITE)
    double_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "double_scalar_R"}, datatype=numpy.double)
    bool_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_RW"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
    bool_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_R"}, datatype=numpy.bool_)
    int_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "int_scalar_RW"}, datatype=numpy.int64, access=AttrWriteType.READ_WRITE)
    int_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "int_scalar_R"}, datatype=numpy.int64)
    str_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_RW"}, datatype=numpy.str_, access=AttrWriteType.READ_WRITE)
    str_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_R"}, datatype=numpy.str_)

    double_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "double_spectrum_RW"}, datatype=numpy.double, dims=(4,), access=AttrWriteType.READ_WRITE)
    double_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "double_spectrum_R"}, datatype=numpy.double, dims=(4,))
    bool_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_RW"}, datatype=numpy.bool_, dims=(4,), access=AttrWriteType.READ_WRITE)
    bool_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_R"}, datatype=numpy.bool_, dims=(4,))
    int_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "int_spectrum_RW"}, datatype=numpy.int64, dims=(4,), access=AttrWriteType.READ_WRITE)
    int_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "int_spectrum_R"}, datatype=numpy.int64, dims=(4,))
    str_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_RW"}, datatype=numpy.str_, dims=(4,), access=AttrWriteType.READ_WRITE)
    str_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_R"}, datatype=numpy.str_, dims=(4,))

    double_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "double_image_RW"}, datatype=numpy.double, dims=(3, 2), access=AttrWriteType.READ_WRITE)
    double_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "double_image_R"}, datatype=numpy.double, dims=(3, 2))
    bool_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_RW"}, datatype=numpy.bool_, dims=(3, 2), access=AttrWriteType.READ_WRITE)
    bool_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_R"}, datatype=numpy.bool_, dims=(3, 2))
    int_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "int_image_RW"}, datatype=numpy.int64, dims=(3, 2), access=AttrWriteType.READ_WRITE)
    int_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "int_image_R"}, datatype=numpy.int64, dims=(3, 2))
    str_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_RW"}, datatype=numpy.str_, dims=(3, 2), access=AttrWriteType.READ_WRITE)
    str_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_R"}, datatype=numpy.str_, dims=(3, 2))

    # --------
    # overloaded functions
    # --------
    def configure_for_initialise(self):
        """ user code here. is called when the sate is set to INIT """
        """Initialises the attributes and properties of the PCC."""

        # set up the OPC ua client
        self.ini_client = ini_client("example.ini", self.Fault, self)

        # map an access helper class
        for i in self.attr_list():
                # use the pass function instead of setting read/write fails

                self.warn_stream("error while setting the ini attribute {} read/write function. {}".format(i, e))

        self.ini_client.start()


# ----------
# Run server
# ----------
def main(args=None, **kwargs):
    write_ini_file("example.ini")


    """Main function of the hardware device module."""
    return run((ini_device,), args=args, **kwargs)


if __name__ == '__main__':
    main()