1"""wanting.py goal action module
2
3
4"""
5#print("module {0}".format(__name__))
6
7import time
8import struct
9from collections import deque
10import inspect
11
12
13from ..aid.sixing import *
14from .globaling import STOP, START, RUN, ABORT, READY, ControlNames
15from .globaling import INACTIVE, ACTIVE, AUX, SLAVE, MOOT, ScheduleNames, ScheduleValues
16
17from ..aid import odict, oset
18from ..aid import aiding
19from . import excepting
20from . import registering
21from . import storing
22from . import acting
23from . import tasking
24from . import framing
25
26from ..aid.consoling import getConsole
27console = getConsole()
28
29
30class Want(acting.Actor):
31    """
32    Class for requesting control via skedder using .desire attribute
33       of explicit peer tasker generators
34
35    """
36    Registry = odict()
37
38    def _resolve(self, taskers, period, source, sourceField, **kwa):
39        """Resolves value taskers list of links that is passed in as parm
40           resolved links are passed back to act to store in parms
41           since tasker may not be current framer at build time
42        """
43        parms = super(Want, self)._resolve( **kwa)
44        links = oset()
45        for tasker in taskers:
46            if tasker == 'all':
47                for tasker in self.store.house.taskables:
48                    links.add(tasker)
49            elif tasker == 'me':
50                tasker = self._act.frame.framer
51                links.add(tasker)
52
53            else:
54                tasker = tasking.resolveTasker(tasker,
55                                               who=self.name,
56                                               desc='tasker',
57                                               contexts=[ACTIVE, INACTIVE],
58                                               human=self._act.human,
59                                               count=self._act.count)
60                links.add(tasker)
61
62
63        if  period is None and source is not None:
64            parms['source'] = source = self._resolvePath(ipath=source, warn=True) # now a share
65            if not sourceField: #default rules for field
66                sourceField = 'value'
67
68            if sourceField not in source:
69                console.profuse("     Warning: Non-existent field '{0}' in source"
70                                " {1} ... creating anyway".format(sourceField, source.name))
71                source[sourceField] = 0.0  # create
72
73            parms['sourceField'] = sourceField
74        else:
75            parms['source'] = None
76            parms['sourceField'] = None
77
78        parms['taskers'] = links #replace with valid oset/list ordered
79        parms['period'] = period
80
81        return parms
82
83class WantStop(Want):
84    """WantStop Want
85       bid stop tasker [tasker ...]
86       bid stop all
87       bid stop [me]
88    """
89    def action(self, taskers, **kw):
90        """stop taskers """
91
92        for tasker in taskers:
93            tasker.desire = STOP
94            console.profuse( "Bid stop {0}\n".format(tasker.name))
95
96        return None
97
98class WantStart(Want):
99    """WantStart Want
100       bid start tasker [taskers ...]
101       bid start all
102       bid start [me] #won't cahnge anything since must be already started
103    """
104    def action(self, taskers, period, source, sourceField, **kw):
105        """start taskers  """
106        if source is not None:
107            period = source[sourceField]
108        for tasker in taskers:
109            if period is not None:
110                tasker.period = max(0.0, period)
111            tasker.desire = START
112            console.profuse( "Bid start {0} at {1}\n".format(tasker.name, tasker.period))
113
114        return None
115
116class WantRun(Want):
117    """WantRun Want
118       bid run tasker [taskers ...]
119       bid run all
120       bid run [me] #won't cahnge anything since must be already running
121    """
122    def action(self, taskers, period, source, sourceField, **kw):
123        """run taskers """
124        if source is not None:
125            period = source[sourceField]
126        for tasker in taskers:
127            if period is not None:
128                tasker.period = max(0.0, period)
129            tasker.desire = RUN
130            console.profuse( "Bid run {0} at (1)\n".format(tasker.name, tasker.period))
131
132        return None
133
134class WantAbort(Want):
135    """WantAbort Want
136       bid abort tasker [taskers ...]
137       bid abort all
138       bid abort [me]
139    """
140    def action(self, taskers, **kw):
141        """abort taskers """
142        for tasker in taskers:
143            tasker.desire = ABORT
144            console.profuse( "Bid abort {0}\n".format(tasker.name))
145
146        return None
147
148class WantReady(Want):
149    """WantReady Want
150       bid ready tasker [taskers ...]
151       bid ready all
152       bid ready [me]  # won't change anything since must be already ready
153    """
154    def action(self, taskers, period, source, sourceField, **kw):
155        """readty taskers """
156        if source is not None:
157            period = source[sourceField]
158        for tasker in taskers:
159            if period is not None:
160                tasker.period = max(0.0, period)
161            tasker.desire = READY
162            console.profuse( "Bid ready {0} at {1}\n".format(tasker.name, tasker.period))
163
164        return None
165