Opened 9 years ago

Closed 9 years ago

#3233 closed defect (fixed)

Typing Turtle does not recognize different keyboards

Reported by: godiard Owned by: manuq
Priority: Unspecified by Maintainer Milestone: Unspecified
Component: TypingTurtle Version: Unspecified
Severity: Unspecified Keywords:
Cc: Distribution/OS: Unspecified
Bug Status: Unconfirmed

Description

Typing Turtle draw the membrane keyboard, not the mechanical.

To solve this bug is needed:

1) Identify what keyboard is in the XO, mechanical or membrane
(in new images /proc/device-tree/mfg-data/KM)

2) Prepare the definition of the mechanical keyboard. There are information about layouts in http://wiki.laptop.org/go/Keyboard_layouts
There are a utility keybuilder.py, apparently useful to scan key codes. In keyboard.py is the definition of size and position of the keys.

This bug was reported in http://dev.laptop.org/ticket/11456

Attachments (1)

0001-Adding-new-layout-for-olpc-non-membrane-keyboard.patch (31.3 KB) - added by manuq 9 years ago.

Download all attachments as: .zip

Change History (10)

comment:1 Changed 9 years ago by godiard

More information about keyboard configurations: http://wiki.laptop.org/go/Manufacturing_data#Keyboards

comment:2 Changed 9 years ago by manuq

This is my solution for part 1:

KEYBOARD_MODEL_PATHS = [
    '/ofw/mfg-data/KM', # XO-1, XO-1.5
    '/proc/device-tree/mfg-data/KM', # XO-1.75
]

def is_membrane():
    """Check via the filesystem if the keyboard is non-membrane.

    Keyboard code is 'olpcm' for non-membrane, mechanical keyboard,
    and 'olpc' for membrane keyboard.

    """

    result = True

    def get_keyboard_model_code(f):
        """Return the code in the file, remove the last character."""
        return open(f).read()[:-1]

    for test_path in KEYBOARD_MODEL_PATHS:
        if os.path.exists(test_path):
            code = get_keyboard_model_code(test_path)
            if code == 'olpcm':
                result = False
                break

    return result

comment:3 Changed 9 years ago by manuq

While doing part 2, I come into account that I will also need to make new hand graphics, to place the fingertips in the keys.

comment:4 follow-up: Changed 9 years ago by martin.langhoff

Hi Manuel - thanks for looking into this. I don't think reading KM is the right path, if you look inside olpc-configure, you'll see the rules around keyboard models are complicated. You should instead query setxbkmap, or read from /etc/sysconfig/keyboard

comment:5 in reply to: ↑ 4 Changed 9 years ago by godiard

Replying to martin.langhoff:

Hi Manuel - thanks for looking into this. I don't think reading KM is the right path, if you look inside olpc-configure, you'll see the rules around keyboard models are complicated. You should instead query setxbkmap, or read from /etc/sysconfig/keyboard

But this code is only to identify, if is a mechanical or a membrane keyboard, the layout is already defined in another place.

comment:6 Changed 9 years ago by manuq

Thanks Martin, then I should call a command like this via Python:

setxkbmap -query | grep model

and check "model: olpc" or "model: olpcm" in the output.

comment:7 Changed 9 years ago by manuq

Gonzalo, I think this way is better because it doesn't depend on the location of KM file, is in different places in XO-1.5 and XO-1.75 .

comment:8 Changed 9 years ago by manuq

Part I, reloaded:

def _is_olpcm_model():
    """Check via setxkbmap if the keyboard model is olpcm.

    Keyboard model code is 'olpcm' for non-membrane, mechanical
    keyboard, and 'olpc' for membrane keyboard.

    """
    code = None
    p = subprocess.Popen(["setxkbmap", "-query"], stdout=subprocess.PIPE)
    out, err = p.communicate()
    for line in out.splitlines():
        if line.startswith('model:'):
            code = line.split()[1]
    return code == 'olpcm'

Part II on the way.

comment:9 Changed 9 years ago by godiard

  • Resolution set to fixed
  • Status changed from new to closed

Thanks Manuq. Included in Typing Turtle 29

Note: See TracTickets for help on using tickets.