summaryrefslogtreecommitdiff
path: root/esds/plugins/operating_states.py
blob: 400aa1b4d5dd78274b82fb1cee84b49c88687954 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python

from plugins.node_plugin import *

######################
#     _    ____ ___  #
#    / \  |  _ \_ _| #
#   / _ \ | |_) | |  #
#  / ___ \|  __/| |  #
# /_/   \_\_|  |___| #
#                    #
######################

# import plugins.operating_states as op
# # Load the directional transition graph from graph.txt starting at the "vertex1" state
# opstate=op.OperatingStates(api,"graph.txt","vertex1")
# Format of the graph.txt file consists in one edge per line
# that consists on the source vertex and destination vertex sperated by a space
# As an example: 
# vertex1 vertex2
# vertex1 vertex3
# vertex3 vertex2
# vertex2 vertex1
# 
# opstate.register_callback(boom) 
# # On each state transition boom will be called as boom(src_state,dst_state)
# # This way the boom callback can contains power_state transitions for examples 
# opstate.goto("vertex2") # works
# opstate.goto("vertex3") # wont work
# opstate.goto("vertex1") # work since we are on vertex2

class OperatingStates(NodePlugin):
    """
    OperatingStates plugin
    """
    def __init__(self,api, state_file, initial_state):
        self.transitions=list()
        self.callbacks=list()
        self.state=initial_state
        with open(state_file) as fp:
            for i, line in enumerate(fp):
                self.transitions.append(line)
        super().__init__("OperatingStates",api)

    def goto(self,state):
        if (self.state+" "+state) in self.transitions:
            old_state=self.state
            self.state=state
            for c in self.callbacks:
                c(old_state,state)
        else:
            self.log("Invalid transition "+self.state+" => "+state)

    def get_state(self):
        return(self.state)
    
    def register_callback(self,callback):
        """
            The callback will be called on each state transition
            Callback takes two arguments which are:
             - The source state
             - The destination state
        """
        self.callbacks.append(callback)