Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

Reicast Stuck On Time & Date !



  • hi

    i am stuck on reicast time & date. cannot move controller up or down to change time.

    i think controller is not set up.

    if not how do i set up the controller on the reicast.

    fix plz

    the controller am using is a mayflash f300 fightstick.


  • Global Moderator





  • @Slugz You can run the following:

    /dev/input/jstest js0 (replace with js1, js2, etc if you are configuring a joystick on those ports).



  • @mrbwa1 said in Reicast Stuck On Time & Date !:

    @Slugz You can run the following:

    /dev/input/jstest js0 (replace with js1, js2, etc if you are configuring a joystick on those ports).

    jstest not coming up for command /dev/input/jstest js0


  • Global Moderator

    @Slugz

    Try using jstest /dev/input/js0



  • Most of my testing is based on this video:

    Your input device may not be js0. Try doing a cd /dev/input then an ls -h to get a devices listing. Look for and jsX listings.

    It also could be possible that jstest is not available. If that is the case: sudo apt-get install joystick should bring in the package.

    EDIT. It looks like I crossed up my commands as well. It should be jstest /dev/input/js0
    Time for another cup of coffee!



  • @mediamogul said in Reicast Stuck On Time & Date !:

    @Slugz

    https://github.com/retropie/retropie-setup/wiki/Dreamcast#for-mapping-non-standard-controller-via-folly

    i ran the controller this is what i got -

    [emulator]
    mapping_name = MAYFLASH Arcade Fightstick F300
    btn_escape = 296

    [dreamcast]
    btn_a = 290
    btn_b = 289
    btn_c =
    btn_d =
    btn_x = 291
    btn_y = 288
    btn_z =
    btn_start = 297
    btn_dpad1_left =
    btn_dpad1_right =
    btn_dpad1_up =
    btn_dpad1_down =
    btn_dpad2_left =
    btn_dpad2_right =
    btn_dpad2_up =
    btn_dpad2_down =
    axis_x =
    axis_y =
    axis_trigger_left =
    axis_trigger_right =

    [compat]
    btn_trigger_left = 292
    btn_trigger_right = 293
    axis_dpad1_x =
    axis_dpad1_y =
    axis_dpad2_x =
    axis_dpad2_y =
    axis_x_inverted =
    axis_y_inverted =
    axis_trigger_left_inverted =
    axis_trigger_right_inverted =

    these are the numbers i got from a jtest -

    up - 5: -32767
    down - 5: 32767
    left - 4: -32767
    right - 4: 32767

    x - 1:
    o - 2:
    square - 0:
    triangle - 3:

    etc .....

    where i place these number & which


  • Global Moderator

    @Slugz

    It's been a while since I've done it myself, but from memory, you would add the number codes you got from running /opt/retropie/emulators/reicast/bin/reicast-joyconfig and input them into the Reicast mapping file. According to the wiki entry, you'll need to create it yourself. I'll have to defer any more specific questions to someone else, as I have had Reicast uninstalled for some time due to poor performance on the Pi3.



  • @mediamogul said in Reicast Stuck On Time & Date !:

    @Slugz

    It's been a while since I've done it myself, but from memory, you would add the number codes you got from running /opt/retropie/emulators/reicast/bin/reicast-joyconfig and input them into the Reicast mapping file. According to the wiki entry, you'll need to create it yourself. I'll have to defer any more specific questions to someone else, as I have had Reicast uninstalled for some time due to poor performance on the Pi3.

    this is what i got in the /opt/retropie/emulators/reicast/bin/reicast-joyconfig

    # -*- coding: utf-8 -*-
    
    from __future__ import print_function
    
    import sys
    import re
    import os
    if sys.version_info < (3, 0):
        import ConfigParser as configparser
        INPUT_FUNC = raw_input
    else:
        import configparser
        INPUT_FUNC = input
    
    try:
        import evdev
    except ImportError:
        print("Can't import evdev module. Please install it.")
        print("You can do this via:")
        print("  pip install evdev")
        sys.exit(1)
    
    DEV_ID_PATTERN = re.compile('(\d+)')
    DREAMCAST_BUTTONS = ['A', 'B', 'C', 'D', 'X', 'Y', 'Z', 'START']
    DREAMCAST_DPAD = [('X', 'LEFT', 'RIGHT'), ('Y', 'UP', 'DOWN')]
    DREAMCAST_TRIGGERS = ['TRIGGER_LEFT', 'TRIGGER_RIGHT']
    DREAMCAST_STICK_AXES = [('X', 'left'), ('Y', 'up')]
    SECTIONS = ["emulator", "dreamcast", "compat"]
    
    
    def list_devices():
        devices = [(int(DEV_ID_PATTERN.findall(fn)[0]), evdev.InputDevice(fn))
                   for fn in evdev.list_devices()]
    
        dev_id_len = len(str(max([dev_id for dev_id, dev in devices])))
    
        for dev_id, dev in sorted(devices, key=lambda x: x[0]):
            print("%s: %s (%s, %s)" %
                  (str(dev_id).rjust(dev_id_len), dev.name, dev.fn, dev.phys))
    
    
    def clear_events(dev):
        try:
            event = dev.read_one()
            while(event is not None):
                event = dev.read_one()
        except (OSError, IOError):
            # BlockingIOErrors should only occur if someone uses the evdev
            # module < v0.4.4. BlockingIOError inherits from OSError, so we
            # catch that for Python 2 compatibility. We also catch IOError,
            # just in case.
            pass
    
    
    def read_button(dev):
        for event in dev.read_loop():
            if event.type == evdev.ecodes.EV_KEY and event.value == 0:
                break
        return event
    
    
    def read_axis(dev, absinfos):
        axis_inverted = False
        for event in dev.read_loop():
            if event.type == evdev.ecodes.EV_ABS and \
               event.value in (absinfos[event.code].min, absinfos[event.code].max):
                if event.value == absinfos[event.code].max:
                    axis_inverted = True
                break
        return (event, axis_inverted)
    
    
    def read_axis_or_key(dev, absinfos):
        axis_inverted = False
        for event in dev.read_loop():
            if event.type == evdev.ecodes.EV_KEY and event.value == 0:
                break
            elif (event.type == evdev.ecodes.EV_ABS and event.value in
                  (absinfos[event.code].min, absinfos[event.code].max)):
                if event.value == absinfos[event.code].max:
                    axis_inverted = True
                break
        return (event, axis_inverted)
    
    
    def print_mapped_button(name, event):
        try:
            code_id = evdev.ecodes.BTN[event.code]
        except (IndexError, KeyError):
            try:
                code_id = evdev.ecodes.KEY[event.code]
            except (IndexError, KeyError):
                code_id = None
        if type(code_id) is list:
            code_id = code_id[0]
        code_id = (' (%s)' % code_id) if code_id else ''
        print("%s mapped to %d%s." % (name, event.code, code_id))
    
    
    def print_mapped_axis(name, event, axis_inverted=False):
        try:
            code_id = evdev.ecodes.ABS[event.code]
        except (IndexError, KeyError):
            code_id = None
        if type(code_id) is list:
            code_id = code_id[0]
        code_id = (' (%s)' % code_id) if code_id else ''
        inv = (' (inverted)' if axis_inverted else '')
        print("%s mapped to %d%s%s." % (name, event.code, code_id, inv))
    
    
    def setup_device(dev_id):
        print("Using device %d..." % dev_id)
        fn = "/dev/input/event%d" % dev_id
        dev = evdev.InputDevice(fn)
        print("Name: %s" % dev.name)
        print("File: %s" % dev.fn)
        print("Phys: %s" % dev.phys)
    
        cap = dev.capabilities(verbose=False, absinfo=True)
        try:
            absinfos = dict(cap[evdev.ecodes.EV_ABS])
        except KeyError:
            absinfos = dict()
    
        mapping = configparser.RawConfigParser()
        for section in SECTIONS:
            mapping.add_section(section)
        mapping.set("emulator", "mapping_name", dev.name)
    
        # Emulator escape button
        if ask_yes_no("Do you want to map a button to exit the emulator"):
            clear_events(dev)
            print("Press the that button now...")
            event = read_button(dev)
            mapping.set("emulator", "btn_escape", event.code)
            print_mapped_button("emulator escape button", event)
    
        # Regular dreamcast buttons
        for button in DREAMCAST_BUTTONS:
            if ask_yes_no("Do you want to map the %s button?" % button):
                clear_events(dev)
                print("Press the %s button now..." % button)
                event = read_button(dev)
                mapping.set("dreamcast", "btn_%s" % button.lower(), event.code)
                print_mapped_button("%s button" % button, event)
    
        # DPads
        for i in range(1, 3):
            if ask_yes_no("Do you want to map DPad %d?" % i):
                for axis, button1, button2 in DREAMCAST_DPAD:
                    clear_events(dev)
                    print("Press the %s button of DPad %d now..." % (button1, i))
                    event, axis_inverted = read_axis_or_key(dev, absinfos)
                    if event.type == evdev.ecodes.EV_ABS:
                        axisname = "axis_dpad%d_%s" % (i, axis.lower())
                        mapping.set("compat", axisname, event.code)
                        mapping.set("compat", "%s_inverted" % axisname, "yes" if axis_inverted else "no")
                        print_mapped_axis("%s axis of DPad %d" % (axis, i), event, axis_inverted)
                    else:
                        buttonconf = "btn_dpad%d_%%s" % i
                        mapping.set("dreamcast", buttonconf % button1.lower(), event.code)
                        print_mapped_button("%s button of DPad %d" % (button1, i), event)
                        clear_events(dev)
                        print("Press the %s button of DPad %d now..." % (button2, i))
                        event = read_button(dev)
                        mapping.set("dreamcast", buttonconf % button2.lower(), event.code)
                        print_mapped_button("%s button of DPad %d" % (button2, i), event)
    
        # Triggers
        for trigger in DREAMCAST_TRIGGERS:
            if ask_yes_no("Do you want to map %s?" % trigger):
                clear_events(dev)
                print("Press the %s now..." % trigger)
                event, axis_inverted = read_axis_or_key(dev, absinfos)
                axis_inverted = not axis_inverted
                if event.type == evdev.ecodes.EV_ABS:
                    axisname = "axis_%s" % trigger.lower()
                    mapping.set("dreamcast", axisname, event.code)
                    mapping.set("compat", "%s_inverted" % axisname, "yes" if axis_inverted else "no")
                    print_mapped_axis("analog %s" % trigger, event, axis_inverted)
                else:
                    mapping.set("compat", "btn_%s" % trigger.lower(), event.code)
                    print_mapped_button("digital %s" % trigger, event)
    
        # Stick
        if ask_yes_no("Do you want to map the analog stick?"):
            for axis, axis_dir in DREAMCAST_STICK_AXES:
                clear_events(dev)
                print("Please move the analog stick as far %s as possible now..." % axis_dir)
                event, axis_inverted = read_axis(dev, absinfos)
                axisname = "axis_%s" % axis.lower()
                mapping.set("dreamcast", axisname, event.code)
                mapping.set("compat", "%s_inverted" % axisname, "yes" if axis_inverted else "no")
                print_mapped_axis(axis, event, axis_inverted)
    
        for section in SECTIONS:
            if not mapping.options(section):
                mapping.remove_section(section)
    
        return mapping
    
    
    def ask_yes_no(question, default=True):
        valid = {"yes": True, "y": True, "ye": True,
                 "no": False, "n": False}
        prompt = "Y/n" if default else "y/N"
    
        while True:
            print("%s [%s] " % (question, prompt), end='')
            choice = INPUT_FUNC().lower()
            if choice == '':
                return default
            if choice in valid:
                return valid[choice]
            else:
                print("Please respond with 'yes' or 'no'")
    
    
    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser(
          description='Reicast evdev controller mapping editor')
        parser.add_argument('-d', '--device-id', action='store', type=int,
                            default=-1, help='device-id to map.')
        parser.add_argument('-f', '--file', action='store', default=None,
                            help='write mapping to this file')
        args = parser.parse_args()
    
        if args.device_id < 0:
            list_devices()
            dev_id = int(input("Please enter the device id: "))
        else:
            dev_id = args.device_id
    
        mapping = setup_device(dev_id)
    
        if args.file:
            with open(args.file, "w") as f:
                mapping.write(f)
            print("\nMapping file saved to: %s\n" % os.path.abspath(args.file))
        else:
            print("\nHere's your mapping file:\n")
            mapping.write(sys.stdout)
    
        sys.exit(0)```

  • administrators

    @Slugz if you are going to post configs and code to the forum - please format it properly http://commonmark.org/help/ (Please go back and edit your post and put in code blocks)



  • @BuZz said in Reicast Stuck On Time & Date !:

    @Slugz if you are going to post configs and code to the forum - please format it properly http://commonmark.org/help/ (Please go back and edit your post and put in code blocks)

    don't know how.



  • @Slugz
    I believe you put those controller mapping info into a files named something like this /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg

    Than edit /opt/retropie/configs/dreamcast/emu.cfg to tell the emulator to use your custom controller mapping:

    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    

  • administrators

    @Slugz read the link - surround the code with three backticks ```



  • @backstander said in Reicast Stuck On Time & Date !:

    @Slugz
    I believe you put those controller mapping info into a files named something like this /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg

    Than edit /opt/retropie/configs/dreamcast/emu.cfg to tell the emulator to use your custom controller mapping:

    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    

    don't get it.

    can you tell me which files i move & change & where.



  • this is what is in my /opt/retropie/configs/dreamcast/emu.cfg

    there is no controller on it.

    disable = 0
    
    [config]
    Debug.SerialConsoleEnabled = 0
    Dreamcast.Broadcast = 4
    Dreamcast.Cable = 3
    Dreamcast.RTC = 2109681505
    Dreamcast.Region = 3
    Dynarec.Enabled = 1
    Dynarec.idleskip = 1
    Dynarec.unstable-opt = 0
    aica.LimitFPS = 1
    aica.NoBatch = 0
    aica.NoSound = 0
    bios.UseReios = 0
    pvr.MaxThreads = 3
    pvr.Subdivide = 0
    pvr.SynchronousRendering = 0
    pvr.rend = 0
    rend.UseMipmaps = 1
    rend.WideScreen = 0
    ta.skip = 0
    
    [dispmanx]
    height = 480
    maintain_aspect = yes
    width = 640
    
    [omx]
    audio_hdmi = yes
    audio_latency = 100
    
    [reios]
    ElfFile = 
    
    [validate]
    OpenGlChecks = 0```


  • The Input section should be between the [dispmanx] and [omx] sections. Hre is that part of my emu.config:

    [dispmanx]
    height = 480
    maintain_aspect = yes
    width = 640

    [input]
    evdev_device_id_1 = 0
    evdev_device_id_2 = 1
    evdev_device_id_3 = -1
    evdev_device_id_4 = -1
    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/controller_TwinUSBJoystick.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/controller_TwinUSBJoystick.cfg
    joystick_device_id = -1

    [omx]
    audio_hdmi = yes
    audio_latency = 100

    I have never done a manual edit of this config file, so I'm not sure what you need in the evdev_mapping_X lines or the joystick_device_id_X line. You can try pasting in what I have and changing TwinUSBJoystick.cfg lines to

    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg

    Note, check /opt/retropie/configs/dreamcast/mappings for the exact filename. It might be something like controller_MAYFLASHArcadeFightstickF300.cfg. All of y listed configs start with "controller_" except keyboard.cfg (I am running Retropie 4.1)



  • @mrbwa1 said in Reicast Stuck On Time & Date !:

    The Input section should be between the [dispmanx] and [omx] sections. Hre is that part of my emu.config:

    [dispmanx]
    height = 480
    maintain_aspect = yes
    width = 640

    [input]
    evdev_device_id_1 = 0
    evdev_device_id_2 = 1
    evdev_device_id_3 = -1
    evdev_device_id_4 = -1
    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/controller_TwinUSBJoystick.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/controller_TwinUSBJoystick.cfg
    joystick_device_id = -1

    [omx]
    audio_hdmi = yes
    audio_latency = 100

    I have never done a manual edit of this config file, so I'm not sure what you need in the evdev_mapping_X lines or the joystick_device_id_X line. You can try pasting in what I have and changing TwinUSBJoystick.cfg lines to

    evdev_mapping_1 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg
    evdev_mapping_2 = /opt/retropie/configs/dreamcast/mappings/MAYFLASHArcadeFightstickF300.cfg

    Note, check /opt/retropie/configs/dreamcast/mappings for the exact filename. It might be something like controller_MAYFLASHArcadeFightstickF300.cfg. All of y listed configs start with "controller_" except keyboard.cfg (I am running Retropie 4.1)

    here is my devices -

    0: Mini Keyboard (/dev/input/event0, usb-3f980000.usb-1.2/input0)
    1: Mini Keyboard (/dev/input/event1, usb-3f980000.usb-1.2/input1)
    2: MAYFLASH Arcade Fightstick F300 (/dev/input/event2, usb-3f980000.usb-1.5/input0)
    3: 8Bitdo SNES30 GamePad (/dev/input/event3, b8:27:eb:e5:9c:6a)

    i like to setup the MAYFLASH & THE 8Bitdo -

    controller_8BitdoSNES30GamePad.cfg
    & the -
    controller_MAYFLASHArcadeFightstickF300.cfg



  • & do i need to install any driver updates.



  • here is my devices -

    0: Mini Keyboard (/dev/input/event0, usb-3f980000.usb-1.2/input0)
    1: Mini Keyboard (/dev/input/event1, usb-3f980000.usb-1.2/input1)
    2: MAYFLASH Arcade Fightstick F300 (/dev/input/event2, usb-3f980000.usb-1.5/input0)
    3: 8Bitdo SNES30 GamePad (/dev/input/event3, b8:27:eb:e5:9c:6a)

    i like to setup the MAYFLASH & THE 8Bitdo -

    controller_8BitdoSNES30GamePad.cfg
    & the -
    controller_MAYFLASHArcadeFightstickF300.cfg



Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.

Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.