#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyTango import AttrDataFormat, AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt,DeviceProxy,EventType
from PyTango.server import Device, DeviceMeta, attribute, command, run

import sys
import time
import numpy

class EventChainPerformance(Device):
    __metaclass__ = DeviceMeta

    loopnumber = attribute(label="Loop Number", dtype=float,
                        display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        doc="the number of loop already generated")

    eventnumber = attribute(label="Event Number", dtype=float,
                        display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        doc="the number of event received")

    delayfirst = attribute(label="Delay with First", dtype=float,
                        display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        doc="delay with first emitter")

    delayprevious = attribute(label="Delay with Previous", dtype=float,
                        display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        doc="delay")

    value = attribute(label="Value", dtype=float
                      , dformat = AttrDataFormat.SPECTRUM
                      ,max_dim_x = 100000
#                       ,max_dim_y = 1024
                      ,display_level=DispLevel.OPERATOR,
                        access=AttrWriteType.READ,
                        doc="an image")
    
    def init_device(self):
        Device.init_device(self)
        self.loop_number = 0
        self.event_number = 0

        self.set_change_event("value", True, False)
        
        self.sDevName =  self.get_name()
        self.iDevNumber = int(self.sDevName[-1])
        
        self.vector = numpy.arange(10000)
        
        self.set_state(DevState.ON)

    def ReceiveEvent(self,event):
        self.event_number += 1   
        try:
            self.vector = event.attr_value.value.copy()
            self.vector[self.iDevNumber] = time.time()
            self.push_change_event("value", self.vector, time.time(),AttrQuality.ATTR_VALID)
        except:
            pass
        
    def read_loopnumber(self):
        return self.loop_number

    def read_eventnumber(self):
        return self.event_number

    def read_delayfirst(self):
        return self.vector[self.iDevNumber] - self.vector[0]

    def read_delayprevious(self):
        return self.vector[self.iDevNumber] - self.vector[self.iDevNumber - 1]
    
    def read_value(self):
        pass
    
    @command
    def Trig(self):
        self.loop_number += 1
        self.vector[0] = time.time()        
        self.push_change_event("value", self.vector, time.time(),AttrQuality.ATTR_VALID)
        

    @command
    def ResetLoopNumber(self):
        self.loop_number = 0

    @command
    def Subscribe2Previous(self):
        if self.iDevNumber > 0 :
            sPrevDeviceName = self.sDevName[:-1] + str(self.iDevNumber - 1)
            
            self.pyds = DeviceProxy(sPrevDeviceName)
            idEvent = self.pyds.subscribe_event("value", EventType.CHANGE_EVENT, self.ReceiveEvent, stateless = False)

    @command
    def Subscribe2Fisrt(self):
        if self.iDevNumber > 0 :
            sPrevDeviceName = self.sDevName[:-1] + str(0)
            
            self.pyds = DeviceProxy(sPrevDeviceName)
            idEvent = self.pyds.subscribe_event("value", EventType.CHANGE_EVENT, self.ReceiveEvent, stateless = False)
        

if __name__ == "__main__":
    sys.argv.append("EventChainPerformance")

    run([EventChainPerformance])
