Receiving Keypad Events Through on_kp Events

The kp. object supports two modes of receiving keypad events. The mode is defined by the kp.genkpevent property.

If kp.genkpevent = 1 — YES (default), the kp. object generates on_kp events. The on_kp event handler is fired every time a key transitions to a new key state. The key_event argument will tell you what that new state is, while key_code will tell you the key code of that key.


Let's suppose that you have a keypad from the Key Codes topic. Here is a small app that accumulates user input in a string. The string is cleared if the <CANCEL> key is pressed. The keypad is disabled once the <ENTER> key is pressed. To re-enable input, press the MD button.

Tibbo BASIC
sub on_sys_init()
   kp.scanlinesmapping="24,25,26,27"
   kp.returnlinesmapping="28,29,30,31"
   
   'this is only necessary on devices with explicit output buffer control 
   io.num=24
   io.enabled=YES
   io.num=25
   io.enabled=YES
   io.num=26
   io.enabled=YES
   io.num=27
   io.enabled=YES

   kp.autodisablecodes=str(PL_KP_EVENT_PRESSED)+",49"
   kp.enabled=YES

end sub

'----------------------------------------------------------------
sub on_kp(key_event as enum pl_kp_event_codes, key_code as byte)
   if key_event=PL_KP_EVENT_PRESSED then
      select case key_code
      case 1:
         inp_str=inp_str+"1"   
      
      case 17:
         inp_str=inp_str+"2"   
      
      case 33:
         inp_str=inp_str+"3"   
      
      case 49:
         sys.debugprint("<ENTER> pressed. Keypad disabled. Press MD to re-enable.\x0D>")
         exit sub

      case 2:
         inp_str=inp_str+"4"   
      
      case 18:
         inp_str=inp_str+"5"   
      
      case 34:
         inp_str=inp_str+"6"   
      
      case 50:
         inp_str="" 'this is the <CANCEL> key
         sys.debugprint("<CANCEL> pressed. The string is now empty.\x0D>")
         exit sub

      case 3:
         inp_str=inp_str+"7"   
      
      case 19:
         inp_str=inp_str+"8"   
      
      case 35:
         inp_str=inp_str+"9"   
      
      case 51:
         inp_str=inp_str+"0"   
      
      case else:
         exit sub
      
      end select
   
      sys.debugprint("INPUT_STRING> "+inp_str+chr(13))
   end if
end sub

'----------------------------------------------------------------
sub on_button_pressed()
   if kp.enabled=NO then
      kp.enabled=YES
      inp_str=""
      sys.debugprint("Keypad re-enabled.\x0D")
   end if
end sub