printing to stdout
richard lucassen
mailinglists at lucassen.org
Sun Aug 19 03:32:49 EDT 2018
On Fri, 17 Aug 2018 08:31:22 +1000
Cameron Simpson <cs at cskk.id.au> wrote:
> Just looking at your loop I would be inclined to just call flush once
> at the bottom, _before_ the sleep() call:
>
> sys.stdout.flush()
>
> Your call; the performance difference will be small, so it tends to
> come down to keeping your code readable and maintainable.
This is a working script I made. It initializes the I/O expanders, then
it waits for an INT from these I/O expanders on GPIO23, reads the
contents and sends which bit on which chip went up or down to a fifo
(and stdout for logging)
As I'm new to Python, just this question: are there any unPythony
things in this code?
##############################################################
#!/usr/bin/env python3
list_pcf = [0x38, 0x39, 0x3a, 0x3b]
list_pcf_value = []
import sys
from smbus import SMBus
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
bus = SMBus(1)
# initialisation of the input devices:
print ("[INFO] initialisation input devices")
for i in range(len(list_pcf)):
try:
bus.write_byte(list_pcf[i], 0xff) # set device to 0xff
output = bus.read_byte(list_pcf[i])
list_pcf_value.append(output) # append value to list
print ("found: %d, input value: 0x%x" % (list_pcf[i], output))
except IOError:
print ("[ALERT] I/O problem device 0x%x (init)" % pcf)
sys.stdout.flush()
# GPIO 23 set up as input. It is pulled up to stop false signals
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
loopcntr = 0 # detects if INT is kept low
while True:
if GPIO.input(23) == 1: # if still 0, another event has occurred
GPIO.wait_for_edge(23, GPIO.FALLING)
print ('-------')
while GPIO.input(23) == 0:
for i in range(len(list_pcf)):
try:
output = bus.read_byte(list_pcf[i])
if output != list_pcf_value[i]:
xor = list_pcf_value[i] ^ output
for l in range(8):
if xor & 0x1:
updown = (output >> l) & 0x1
print ("%d bit %d: to %d" % (list_pcf[i],l,updown))
print("%d %d %d" % (list_pcf[i],l,updown),
file=open('/mnt/ramdisk/var/lib/ha/events.fifo', 'w'))
xor = xor >> 1
list_pcf_value[i] = output
except IOError:
print ("[ALERT] I/O problem device 0x%x" % list_pcf[i])
if GPIO.input(23) == 1:
loopcntr = 0
break
else:
loopcntr += 1
if loopcntr >=20:
print ('[ALERT] possible INT loop, disable 10 seconds')
sleep (10)
sys.stdout.flush()
GPIO.cleanup()
--
richard lucassen
http://contact.xaq.nl/
More information about the Python-list
mailing list