Просмотр исходного кода

Process multiple commands per loop

Zachary Kotlarek 13 лет назад
Родитель
Сommit
335dd3ae23
1 измененных файлов с 31 добавлено и 26 удалено
  1. 31 26
      dmx/dmx.py

+ 31 - 26
dmx/dmx.py

@@ -45,35 +45,39 @@ def SendDMXFrame():
   wrapper.AddEvent(interval, SendDMXFrame)
   
   # Check for new commands
-  ready = select.select([sock], [], [], interval / 2000)[0]
-  for fh in ready:
-    cmd = fh.recvfrom(max_mesg_len)[0]
-    channel, duration, intensity, delay = string.split(cmd, ':')
+  cmd = ""
+  while (cmd is not None):
     try:
-      channel = int(channel)
-      duration = int(duration)
-      intensity = int(intensity)
-    except ValueError:
-      print 'Invalid command:', cmd
-      channel = -1
-    try:
-      delay = int(delay)
-    except ValueError:
-      delay = 0
+      cmd = sock.recvfrom(max_mesg_len)[0]
+    except socket.error:
+      cmd = None
+    if (cmd is not None):
+      channel, duration, intensity, delay = string.split(cmd, ':')
+      try:
+        channel = int(channel)
+        duration = int(duration)
+        intensity = int(intensity)
+      except ValueError:
+        print 'Invalid command:', cmd
+        channel = -1
+      try:
+        delay = int(delay)
+      except ValueError:
+        delay = 0
     
-    # Save valid commands
-    if (channel >= 0 and channel <= 512 and intensity >= 0 and intensity <= 255 and duration >= 0 and duration <= 300000 and delay >= 0 and delay < 300000):
-      if (channel > 0):
-        cmds['value'][channel - 1] = intensity
-        cmds['ticks'][channel - 1] = duration / interval
-        cmds['delay'][channel - 1] = delay / interval
+      # Save valid commands
+      if (channel >= 0 and channel <= 512 and intensity >= 0 and intensity <= 255 and duration >= 0 and duration <= 300000 and delay >= 0 and delay < 300000):
+        if (channel > 0):
+          cmds['value'][channel - 1] = intensity
+          cmds['ticks'][channel - 1] = duration / interval
+          cmds['delay'][channel - 1] = delay / interval
+        else:
+          for i in range(len(state)):
+            cmds['value'][i] = intensity
+            cmds['ticks'][i] = duration / interval
+            cmds['delay'][i] = delay / interval
       else:
-        for i in range(len(state)):
-          cmds['value'][i] = intensity
-          cmds['ticks'][i] = duration / interval
-          cmds['delay'][i] = delay / interval
-    else:
-      print 'Invalid command parameters:', channel, duration, intensity, delay
+        print 'Invalid command parameters:', channel, duration, intensity, delay
   
   # Update values for each channel
   for i in range(len(cmds['value'])):
@@ -133,6 +137,7 @@ if (os.path.exists(cmd_file)):
   os.unlink(cmd_file)
 sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
 sock.bind(cmd_file)
+sock.setblocking(0)
 
 # Start the DMX loop
 wrapper = ClientWrapper()