wiki:widget_keypad

Keypad Widget / Keypad Driver

The keypad widget and keypad driver allows use of common buttons like up, down, left, right, ok/confirm and cancel. Added to CVS/SVN in Feb. 2006, the keypad code is still undergoing some development, and is only available on a couple of displays: Crystalfontz 635, LCD2USB and LW_ABP. LCD4Linux-0.10.1-RC1 also supports CwLinux.

It's currently the only widget which doesn't make use of the update parameter. Instead of using preset time intervals, updates are performed when the button is actually pressed or released. At that time the expression is re-evaluated. This allows you to execute some program (perhaps reboot?) or simply change the value of a variable which is used by another widget.

The mapping between keypad widgets and output lines is done in the Layout section: Just as you would place other widgets with Row*.Col* lines, you can map a keypad widget using a 'Keypad#' line. Note that the '#' used is of little consequence, just make it unique from the other keys used in that same layout.

Here's the definition of a keypad widget:

Widget <name> {
    class      'Keypad'
    position   <confirm|cancel|up|down|left|right>
    state      <pressed|released>
    expression <string>
}

Parameters:

positionwhat button is toggled, defaults to confirm
statewhether holding the button down or letting it go, defaults to pressed
expressionexpression to evaluate on button toggle

Example:

simple keypad example to increment a displayed variable:

Widget mytext {
    class 'Text'
    expression foo
    update 100
}

Widget keyok {
    class 'Keypad'
    position 'confirm'
    expression foo = foo + 1
}

Variable {
    foo 1
}

Layout demokeypad {
    Row1.Col1 'mytext'
    Keypad1 'keyok'
}

more sophisticated example to scroll thru dmesg output:

Widget dmesg1 {
    class 'Text'
    expression file::readline('/var/log/dmesg',currline)
    width 20
    update tick
}

Widget dmesg2 {
    class 'Text'
    expression file::readline('/var/log/dmesg',currline+1)
    width 20
    update tick
}

Widget dmesg3 {
    class 'Text'
    expression file::readline('/var/log/dmesg',currline+2)
    width 20
    update tick
}

Widget dmesg4 {
    class 'Text'
    expression file::readline('/var/log/dmesg',currline+3)
    width 20
    update tick
}

Widget keyup {
    class 'Keypad'
    position 'up'
    state 'pressed'
    expression currline = currline-1
}

Widget keydown {
    class 'Keypad'
    position 'down'
    state 'pressed'
    expression currline = currline+1
}

Layout showdmesg {
    Row1 {
        Col1 'dmesg1'
    }
    Row2 {
        Col1 'dmesg2'
    }
    Row3 {
        Col1 'dmesg3'
    }
    Row4 {
        Col1 'dmesg4'
    }
    Keypad1 'keyup'
    Keypad2 'keydown'
}

Variables {
    tick 100
    currline 1
}

an example to use with reboot confirm: (right arrow selects reboot, left arrow cancels, confirm reboots using exec)

widget keyRight{
        class 'Keypad'
        position 'right'
        state 'pressed'
        expression msg = 'Reboot? OK to confirm' ; rebootmenu = 1
}

widget keyConfirm{
        class 'Keypad'
        position 'confirm'
        state 'pressed'
        expression  msg = rebootmenu == 1 ? exec('/sbin/shutdown -r now',1000000) : 'Right arrow to reboot'
        exec('/sbin/shutdown -r now', 1000000);
}

widget keyLeft{
        class 'Keypad'
        position 'left'
        state 'pressed'
        expression msg = 'Right arrow to reboot' ; rebootmenu = 0
}

widget msgtxt {
        class 'Text'
        expression msg
        width 20
        update 100
}


Layout Default {
        Row1.Col1 'msgtxt'
	Row2.Col1 rebootmenu
        Keypad1 'keyRight'
        Keypad2 'keyConfirm'
        Keypad3 'keyLeft'
}


Variables {
   tick 500
   msg 'Right arrow to reboot'
   rebootmenu 0
}


Last modified 9 years ago Last modified on 10/30/09 13:55:27