0

I'm running this script on a raspberry for a game I created, where I have three different inputs in my while true:.

One of them is getting a socket message from a different raspberry. But the problem is that the rest of my while true doesnt execute no more. Only the first IF statement after I received the socket message.

How to get them all running?

Thanks in advance

#!/usr/bin/python
import RPi.GPIO as GPIO 
import time
import socket
import pygame
import serial

GPIO.setmode(GPIO.BCM)

UDP_IP = "192.168.0.21"
UDP_PORT = 20

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, 20))

# Klopspelout, pianospel, sleutelspel, totaalspel

pinList = [27, 22, 4, 17]
klopinput = 21
sleutelinput = 11

# loop through pins

for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 

GPIO.setup(klopinput, GPIO.IN)
GPIO.setup(sleutelinput, GPIO.IN, GPIO.PUD_UP)
# time to sleep between operations in the main loop
SleepTimeL = 2

#variables
totaal = 0
klop = 0  
sleutel = 0 
piano = 0
wacht = 0
GPIO.output(pinList[0], GPIO.LOW)
GPIO.output(pinList[1], GPIO.LOW)
GPIO.output(pinList[2], GPIO.LOW)
GPIO.output(pinList[3], GPIO.LOW)
data = 0

# main loop
#GPIO.cleanup()
while True:


  #if GPIO.input(klopinput) == True:
  #  GPIO.output(pinList[0], GPIO.HIGH)
  #  totaal += 1
  #  print ('klopspel is goed')
  #  time.sleep(SleepTimeL)
  #  GPIO.output(pinList[0], GPIO.LOW)


  data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
  print "received message:", data
  if data == "slotpiano2":
    print "slot open"
    totaal += 1
    time.sleep(1)

  if GPIO.input(klopinput) == True and wacht == 0 and klop == 0:
    GPIO.output(pinList[1], GPIO.HIGH)
    totaal += 1
    klop = 1
    print ('klop is goed')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[1], GPIO.LOW)
    time.sleep(SleepTimeL)

  if GPIO.input(sleutelinput) == False and sleutel == 0:
    GPIO.output(pinList[0], GPIO.HIGH)
    totaal += 1
    sleutel = 1
    wacht = 1
    print ('Sleutel is goed')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[0], GPIO.LOW)  
    time.sleep(SleepTimeL)
    wacht = 0 

  if totaal == 3:
    GPIO.output(pinList[3], GPIO.HIGH) 
    totaal = 0
    sleutel = 0
    klop = 0
    print ('reset')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[3], GPIO.LOW)
W de wee
  • 13
  • 4
  • On each loop, sock.recvfrom() will block until data arrives on the socket - is this what you intended? Or did you want to ignore the socket if there is no data and move on to checking the GPIO inputs? – AS Mackay Dec 14 '17 at 10:59
  • Or did you want to ignore the socket if there is no data and move on to checking the GPIO inputs? Yes, that last is correct. – W de wee Dec 15 '17 at 08:15

1 Answers1

2

OK as per your comment, if you want avoid blocking on the socket then you need to set it to nonblocking and use the select() function. I've posted a copy of your code below that shows the necessary edit, based on this answer, and there is lots of information about select() in the Python documentation.

#!/usr/bin/python
import RPi.GPIO as GPIO 
import time
import socket
import pygame
import serial
import select  # select() function  <---------

GPIO.setmode(GPIO.BCM)

UDP_IP = "192.168.0.21"
UDP_PORT = 20

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, 20))
sock.setblocking(0) # set to non-blocking    <-----------

# Klopspelout, pianospel, sleutelspel, totaalspel

pinList = [27, 22, 4, 17]
klopinput = 21
sleutelinput = 11

# loop through pins

for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 

GPIO.setup(klopinput, GPIO.IN)
GPIO.setup(sleutelinput, GPIO.IN, GPIO.PUD_UP)
# time to sleep between operations in the main loop
SleepTimeL = 2

#variables
totaal = 0
klop = 0  
sleutel = 0 
piano = 0
wacht = 0
GPIO.output(pinList[0], GPIO.LOW)
GPIO.output(pinList[1], GPIO.LOW)
GPIO.output(pinList[2], GPIO.LOW)
GPIO.output(pinList[3], GPIO.LOW)
data = 0

# main loop
#GPIO.cleanup()
while True:


  #if GPIO.input(klopinput) == True:
  #  GPIO.output(pinList[0], GPIO.HIGH)
  #  totaal += 1
  #  print ('klopspel is goed')
  #  time.sleep(SleepTimeL)
  #  GPIO.output(pinList[0], GPIO.LOW)

  fds = select.select([sock], [], [], 1.0)     <-----------
  if (fds[0]): # sock has some data
      data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
      print "received message:", data
      if data == "slotpiano2":
        print "slot open"
        totaal += 1
        time.sleep(1)

  if GPIO.input(klopinput) == True and wacht == 0 and klop == 0:
    GPIO.output(pinList[1], GPIO.HIGH)
    totaal += 1
    klop = 1
    print ('klop is goed')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[1], GPIO.LOW)
    time.sleep(SleepTimeL)

  if GPIO.input(sleutelinput) == False and sleutel == 0:
    GPIO.output(pinList[0], GPIO.HIGH)
    totaal += 1
    sleutel = 1
    wacht = 1
    print ('Sleutel is goed')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[0], GPIO.LOW)  
    time.sleep(SleepTimeL)
    wacht = 0 

  if totaal == 3:
    GPIO.output(pinList[3], GPIO.HIGH) 
    totaal = 0
    sleutel = 0
    klop = 0
    print ('reset')
    time.sleep(SleepTimeL)
    GPIO.output(pinList[3], GPIO.LOW)

(NB set the timeout to something relevant to your application if 1.0 seconds is not acceptable.)

AS Mackay
  • 2,831
  • 9
  • 19
  • 25