OpenRoberta / robertalab-ev3dev

roberta lab connector for ev3dev
Apache License 2.0
17 stars 14 forks source link

Only first say block ist working #66

Open peacepro opened 6 years ago

peacepro commented 6 years ago

If I use more than one say block, only the first say block is working. The second block is not working.

Package: openrobertalab
Version: 1.7.4+1.0.0
Architecture: all
Maintainer: Stefan Sauer <ensonic@google.com>
Installed-Size: 222
Depends: init-system-helpers (>= 1.18~), python3, python3:any (>= 3.3.2-2~), systemd, python3-bluez, python3-dbus, python3-ev3dev, python3-gi
Enhances: brickman
Homepage: http://lab.open-roberta.org/
Priority: optional
Section: python
Filename: pool/main/o/openrobertalab/openrobertalab_1.7.4+1.0.0_all.deb
#!/usr/bin/python

from __future__ import absolute_import
from roberta.ev3 import Hal
from roberta.BlocklyMethods import BlocklyMethods
from ev3dev import ev3 as ev3dev
import math

class BreakOutOfALoop(Exception): pass
class ContinueLoop(Exception): pass

_brickConfiguration = {
    'wheel-diameter': 5.6,
    'track-width': 18.0,
    'actors': {
    },
    'sensors': {
    },
}
hal = Hal(_brickConfiguration)
hal.setLanguage("de")

def run():
    hal.sayText("Hallo ich bin EV3")
    hal.sayText("Wie war die Schule heute")

def main():
    try:
        run()
    except Exception as e:
        hal.drawText('Fehler im EV3', 0, 0)
        hal.drawText(e.__class__.__name__, 0, 1)
        hal.drawText(str(e), 0, 2)
        hal.drawText('Press any key', 0, 4)
        while not hal.isKeyPressed('any'): hal.waitFor(500)
        raise

if __name__ == "__main__":
    main()
#!/usr/bin/python

from __future__ import absolute_import
from roberta.ev3 import Hal
from roberta.BlocklyMethods import BlocklyMethods
from ev3dev import ev3 as ev3dev
import math

class BreakOutOfALoop(Exception): pass
class ContinueLoop(Exception): pass

_brickConfiguration = {
    'wheel-diameter': 5.6,
    'track-width': 18.0,
    'actors': {
    },
    'sensors': {
    },
}
hal = Hal(_brickConfiguration)
hal.setLanguage("de")

def run():
    hal.sayText("Hallo ich bin EV3")
    hal.drawText("Hallo", 0, 0)
    hal.sayText("Wie war die Schule heute")

def main():
    try:
        run()
    except Exception as e:
        hal.drawText('Fehler im EV3', 0, 0)
        hal.drawText(e.__class__.__name__, 0, 1)
        hal.drawText(str(e), 0, 2)
        hal.drawText('Press any key', 0, 4)
        while not hal.isKeyPressed('any'): hal.waitFor(500)
        raise

if __name__ == "__main__":
    main()
ensonic commented 6 years ago

I can't test right now (traveling). sayText is a quite simple wrapper around ev3dev.Sound.speak() https://github.com/OpenRoberta/robertalab-ev3dev/blob/develop/roberta/ev3.py#L367

jessie: https://github.com/ev3dev/ev3dev-lang-python/blob/ev3dev-jessie/ev3dev/core.py#L3445 stretch: https://github.com/ev3dev/ev3dev-lang-python/blob/f3fe81e8a0cd6dc60e651dd53a4c7ef16913e455/ev3dev2/sound.py#L288

ensonic commented 5 years ago

I have a repro:

_brickConfiguration = {
...     'wheel-diameter': 5.6,
...     'track-width': 18.0,
...     'actors': {},
...     'sensors': {},
... }
hal = Hal(_brickConfiguration)
hal.setVolume(100)
hal.sayText("Hello"); hal.sayText("and"); hal.sayText("good evening");
aplay: main:722: audio open error: Device or resource busy
# more lowlevel, still broken
hal.sound.speak("Hello").wait(); hal.sound.speak("World").wait();
aplay: main:722: audio open error: Device or resource busy
# but this works:
hal.sayText("Hello"); hal.waitFor(200);hal.sayText("and"); hal.waitFor(200); hal.sayText("good evening");
# this is what we essentiall do from python via Popen, but in a shell it works
espeak --stdout "Hello" | aplay -q; espeak --stdout "World" | aplay -q

Somehow closing the device takes longer than the subcommand runs ??

ensonic commented 5 years ago

Ahhh, https://github.com/ev3dev/ev3dev-lang-python/issues/461 - too bad that there is no new release :/