Browse Source

almost working now

Simon Van Mierlo 8 years ago
parent
commit
57d1fc747b

+ 1 - 1
interface/PDEVS/console.py

@@ -4,7 +4,7 @@ import random, re, json, subprocess
 from interface import Controller
 
 print("Init")
-init()
+init("msdl.uantwerpen.be:8001")
 print("Login")
 login("admin", "admin")
 

+ 8 - 2
interface/PDEVS/helpers.py

@@ -1,12 +1,18 @@
+def canRiotAPC(self, queue):
+    return queue.count('Wheel') >= 4 and queue.count('Body') >= 1 and queue.count('WaterCannon') >= 1
+
 def isRiotAPC(self, queue):
-    if queue.count('Wheel') >= 4 and queue.count('Body') >= 1 and queue.count('WaterCannon') >= 1:
+    if canRiotAPC(queue):
         toremove = ['Wheel','Wheel','Wheel','Wheel','Body','WaterCannon']
         while toremove:
             queue.remove(toremove.pop())            
         return True
+
+def canWarAPC(self, queue):
+    return queue.count('Tracks') >= 2 and queue.count('Body') >= 1 and queue.count('MachineGun') >= 1
         
 def isWarAPC(self, queue):
-    if queue.count('Tracks') >= 2 and queue.count('Body') >= 1 and queue.count('MachineGun') >= 1:
+    if canWarAPC(queue):
         toremove = ['Tracks','Tracks','Body','MachineGun']
         while toremove:
             queue.remove(toremove.pop())

File diff suppressed because it is too large
+ 174 - 72
interface/PDEVS/pypdevs/examples/ps_model.py


+ 233 - 0
interface/PDEVS/temp_transitions.txt

@@ -0,0 +1,233 @@
+		
+        == ASSEMBLER ==
+        
+        outputFnc:
+        
+        if self.state['name'] == 'producing':
+			return {self.my_ports['ass_out']: [self.state['finishedProduct']], self.my_ports['ass_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
+        elif self.state['name'] == 'looking_for_op':
+            return {self.my_ports['ass_op_out']: [{'type': 'query', 'req_name': id(self)}]}
+        elif self.state['name'] == 'sending_req_to_op':
+            return {self.my_ports['ass_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
+		else:
+			return AtomicDEVS.outputFnc(self)        
+        
+        extTransition:
+        
+        if self.state['name'] == 'producing':
+            self.wait_time -= self.elapsed()
+        
+        import helpers, random
+        if self.my_ports['ass_in'] in my_inputs:
+            self.queue.append(my_inputs[self.my_ports['ass_in']][0]['type'])
+            if (self.state['name'] == 'waiting' and (helpers.canWarAPC() or helpers.canRiotAPC())):
+                self.state['name'] = 'looking_for_op'
+        if self.state['name'] == 'looking_for_op' and self.my_ports['ass_op_in'] in my_inputs:
+            msgs = self.my_ports['ass_op_in']
+            free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
+            notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
+            if free:
+                self.state['op_to_send'] = free[0]
+            else:
+                self.state['op_to_send'] = notfree[0]
+            self.state['name'] = 'sending_req_to_op'
+        elif self.state['name'] == 'waiting_for_op' and self.my_ports['ass_op_in'] in my_inputs:
+            forme = [msg for msg in self.my_ports['ass_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
+            if forme:
+                self.state['op_name'] = my_inputs[self.my_ports['ass_op_in']][0]['op_name']
+                if helpers.isWarAPC(self.state['queue']):
+                    self.state['finishedProduct'] = {'type': 'WarAPC', 'broken': (random.random() < 0.05)}
+                elif helpers.isRiotAPC(self.state['queue']):
+                    self.state['finishedProduct'] = {'type': 'RiotAPC', 'broken': (random.random() < 0.05)}
+                self.state['name'] = 'producing'
+                self.wait_time = 2
+        return self.state
+        
+        intTransition:
+        
+        if self.state['name'] == 'producing':
+			self.state['name'] = 'waiting'
+        elif self.state['name'] == 'sending_req_to_op':
+            self.state['name'] = 'waiting_for_op'
+		return self.state
+        
+        timeAdvance:
+        
+        if self.state['name'] == 'waiting':
+			return INFINITY
+        elif self.state['name'] == 'looking_for_op':
+            return 0
+        elif self.state['name'] == 'sending_req_to_op':
+            return 0
+        elif self.state['name'] == 'waiting_for_op':
+            return INFINITY
+		elif self.state['name'] == 'producing':
+			return self.wait_time
+            
+        == REPAIR ==
+        
+        outputFnc:
+        
+        if self.state['name'] == 'repairing':
+			return {self.my_ports['rep_out']: [self.state['item']], self.my_ports['rep_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
+        elif self.state['name'] == 'looking_for_op':
+            return {self.my_ports['rep_op_out']: [{'type': 'query', 'req_name': id(self)}]}
+        elif self.state['name'] == 'sending_req_to_op':
+            return {self.my_ports['rep_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
+		else:
+			return AtomicDEVS.outputFnc(self)        
+        
+        extTransition:
+        
+        if self.state['name'] == 'repairing':
+            self.wait_time -= self.elapsed()
+        
+        if self.state['name'] == 'waiting' and self.my_ports['rep_in'] in my_inputs:
+            self.state['item'] = my_inputs[self.my_ports['rep_in']][0]
+        elif self.state['name'] == 'looking_for_op' and self.my_ports['rep_op_in'] in my_inputs:
+            msgs = self.my_ports['rep_op_in']
+            free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
+            notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
+            if free:
+                self.state['op_to_send'] = free[0]
+            else:
+                self.state['op_to_send'] = notfree[0]
+            self.state['name'] = 'sending_req_to_op'
+        elif self.state['name'] == 'waiting_for_op' and self.my_ports['rep_op_in'] in my_inputs:
+            forme = [msg for msg in self.my_ports['rep_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
+            if forme:
+                self.state['op_name'] = my_inputs[self.my_ports['rep_op_in']][0]['op_name']                
+                self.state['item']['broken'] = False
+                self.state['name'] = 'repairing'
+                self.wait_time = 2
+        return self.state
+        
+        intTransition:
+        
+        if self.state['name'] == 'repairing':
+			self.state['name'] = 'waiting'
+        elif self.state['name'] == 'sending_req_to_op':
+            self.state['name'] = 'waiting_for_op'
+		return self.state
+        
+        timeAdvance:
+        
+        if self.state['name'] == 'waiting':
+			return INFINITY
+        elif self.state['name'] == 'looking_for_op':
+            return 0
+        elif self.state['name'] == 'sending_req_to_op':
+            return 0
+        elif self.state['name'] == 'waiting_for_op':
+            return INFINITY
+		elif self.state['name'] == 'repairing':
+			return self.wait_time
+            
+        == QUALITYCONTROL ==
+        
+        outputFnc:
+        
+        if self.state['name'] == 'checking':
+            if self.state['item']['broken']:
+                return {self.my_ports['qc_out_broken']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
+            else:
+                return {self.my_ports['qc_out_working']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
+        elif self.state['name'] == 'looking_for_op':
+            return {self.my_ports['qc_op_out']: [{'type': 'query', 'req_name': id(self)}]}
+        elif self.state['name'] == 'sending_req_to_op':
+            return {self.my_ports['qc_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
+		else:
+			return AtomicDEVS.outputFnc(self)        
+        
+        extTransition:
+        
+        if self.state['name'] == 'repairing':
+            self.wait_time -= self.elapsed()
+        
+        if self.state['name'] == 'waiting' and self.my_ports['rep_in'] in my_inputs:
+            self.state['item'] = my_inputs[self.my_ports['rep_in']][0]
+        elif self.state['name'] == 'looking_for_op' and self.my_ports['qc_op_in'] in my_inputs:
+            msgs = self.my_ports['qc_op_in']
+            free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
+            notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
+            if free:
+                self.state['op_to_send'] = free[0]
+            else:
+                self.state['op_to_send'] = notfree[0]
+            self.state['name'] = 'sending_req_to_op'
+        elif self.state['name'] == 'waiting_for_op' and self.my_ports['qc_op_in'] in my_inputs:
+            forme = [msg for msg in self.my_ports['qc_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
+            if forme:
+                self.state['name'] = 'checking'
+        return self.state
+        
+        intTransition:
+        
+        if self.state['name'] == 'checking':
+			self.state['name'] = 'waiting'
+        elif self.state['name'] == 'sending_req_to_op':
+            self.state['name'] = 'waiting_for_op'
+		return self.state
+        
+        timeAdvance:
+        
+        if self.state['name'] == 'waiting':
+			return INFINITY
+        elif self.state['name'] == 'looking_for_op':
+            return 0
+        elif self.state['name'] == 'sending_req_to_op':
+            return 0
+        elif self.state['name'] == 'waiting_for_op':
+            return INFINITY
+		elif self.state['name'] == 'checking':
+			return self.wait_time
+        
+        == OPERATOR ==
+        
+        outputFnc:
+        
+        output = {self.my_ports['op_out']: []}
+        if self.state['query_queue']:
+            for it in self.state['query_queue']:
+                self.my_ports['op_out'].append({'type': 'response', 'req_name': it, 'op_name': id(self), 'free': self.state['name'] == 'waiting'})
+        if self.state['name'] == 'allocating':
+            self.my_ports['op_out'].append({'type': 'allocate', 'req_name': self.state['requester'], 'op_name': id(self)})
+        
+        extTransition:
+        
+        msgs = self.my_ports[self.my_ports['op_in']]
+        release_msgs = msgs.filter(lambda it: it['type'] == 'release' and it['op_name'] == id(self))
+        req_msgs = msgs.filter(lambda it: it['type'] == 'request' and it['op_name'] == id(self))
+        query_msgs = msgs.filter(lambda it: it['type'] == 'query')
+        
+        if release_msgs:
+            self.state['name'] = 'requested' if self.state['req_queue'] else 'waiting'
+        for r_m in req_msgs:
+            self.state['req_queue'].append(r_m['req_name'])
+            self.state['name'] = 'requested'
+        for q_m in query_msgs:
+            self.state['query_queue'].append(q_m['req_name'])
+        
+        intTransition:
+        
+        if self.state['name'] == 'requested':
+            self.state['name'] = 'allocating'
+            self.state['requester'] = self.state['req_queue'].pop()
+        if self.state['name'] == 'allocating':
+			self.state['name'] = 'allocated'
+        if self.state['query_queue']:
+            self.state['query_queue'] = []
+		return self.state
+        
+        timeAdvance:
+        
+        if self.state['query_queue']:
+            return 0
+        elif self.state['waiting']:
+			return INFINITY
+        elif self.state['name'] == 'requested':
+            return 0
+        elif self.state['name'] == 'allocating':
+            return 0
+        elif self.state['name'] == 'allocated':
+            return INFINITY

File diff suppressed because it is too large
+ 288 - 61
models/ps_to_devs.mvc