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