Предистория: есть pi на котором крутится скрипт на питоне и ждет данных по serial, когда получает команду чтото делает, к примеру 2 нужных функции- включить и выключить определенный трек в omxplayer. Все бы ничего, но нужно сделать плавный переход между треками, а это уже отсутствует в функционале плеера. Нашел костыльное решение в виде wrapper для этого плеера, в нем создается объект такого вида player=OMXPlayer(filename) по которому дается команда player.play и др.
Сам скрипт построен как куча elif (команда)
И проблема в том, что если запустить плеер в одном из таких if то его не видно из другого, параметр global ничего не меняет, говорит мол нет такого объекта
весь скрипт крутится в while(true) одного def. Подозреваю что проблема связана с тем, что global объекты обновляются только после выхода из def, но не факт. Что можно сделать в данной ситуации?
p.s. сам в питоне провел только пару часов, поэтому много в нем не знаю
код
#!/usr/bin/python
import serial, time, os, sys
from omxplayer import OMXPlayer
ser = serial.Serial ()
try:
ser = serial.Serial(
port='/dev/ttyACM0',
baudrate = 115200,
timeout=1
)
print 'ttyACM0'
except:
try:
ser = serial.Serial(
port='/dev/ttyACM1',
baudrate = 115200,
timeout=1
)
print 'ttyACM1'
except:
try:
ser = serial.Serial(
baudrate = 115200,
port='/dev/ttyACM2',
timeout=1
)
print 'ttyACM2'
except:
try:
ser = serial.Serial(
baudrate = 115200,
port='/dev/ttyUSB0',
timeout=1
)
print 'ttyUSB0'
except:
pass
#if you only want to send data to arduino (i.e. a signal to move a servo)
def send( theinput ):
ser.write( theinput )
while True:
try:
time.sleep(0.01)
break
except:
pass
time.sleep(0.1)
#if you would like to tell the arduino that you would like to receive data from the arduino
def send_and_receive( theinput ):
ser.write( theinput )
while True:
try:
time.sleep(0.01)
state = ser.readline()
print state
return state
except:
pass
time.sleep(0.1)
def readlineCR(port):
rv = ""
while True:
ch = port.read()
if ch=='\r' or ch=='':
return rv
else:
rv += ch
#if you would like to tell the arduino that you would like to receive data from the arduino
def receive( ):
while True:
try:
print "try to read..."
time.sleep(0.01)
state = readlineCR(ser)
if len(state)>1:
print "State: " + state
if "playsound" in state:
os.system("clear > tty1")
plstr="cat t|omxplayer -o both --vol \"-200\" "
name=state.split(" ",1)[1]
name= "/home/pi/"+name
name=name.replace("\n", "")
name=name.replace("\r", "")
ender=" >> /dev/null &"
command= plstr
command=command+ name
command=command+ ender
print command
os.system(command)
elif "pl1play" in state:
name=state.split(" ",1)[1]
name=name.replace("\n", "")
name=name.replace("\r", "")
name= "/home/pi/"+name
global player1
player1= OMXPlayer(name)
player1.play()
print command
elif "pl2play" in state:
name=state.split(" ",1)[1]
name=name.replace("\n", "")
name=name.replace("\r", "")
name= "/home/pi/"+name
global player2
player2 = OMXPlayer(name)
player2.play()
print command
elif "pl3play" in state:
name=state.split(" ",1)[1]
name=name.replace("\n", "")
name=name.replace("\r", "")
name= "/home/pi/"+name
global player3
player3 = OMXPlayer(name)
player3.play()
print command
elif "stoppl1" in state:
vol =0
while(vol<6000):
vol=vol+150
player1.set_volume(0,-vol)
time.sleep(0.1)
player1.pause()
player1.quit()
print command
elif "stoppl2" in state:
vol =0
while(vol<6000):
vol=vol+150
player2.set_volume(0,-vol)
time.sleep(0.1)
player2.pause()
player2.quit()
print command
elif "stoppl3" in state:
vol =0
while(vol<6000):
vol=vol+150
player3.set_volume(0,-vol)
time.sleep(0.1)
player3.pause()
player3.quit()
print command
elif "stopsound" in state:
os.system("kill -9 `ps au | grep omxplayer | awk '{print $2}'`")
print command
return state
else:
print "failed no data..."
return "nodata"
except Exception, e:
time.sleep(0.1)
print ""
print "Unexpected error:", str(e)
#f = open('dataFile.txt','a')
ser.flushInput()
while 1 :
receive()