How it works...

First, we import uinput and define the wiring of the keypad buttons. For each of the buttons in BTN, we enable them as inputs, with internal pull-ups enabled.

Next, we set up uinput, defining the keys we want to emulate and adding them to the uinput.Device() function. We wait a few seconds to allow uinput to initialize, set the initial button and key states, and start our main loop.

The main loop is split into two sections: the first section checks through the buttons and records the states in btn_state, and the second section compares the btn_state with the current key_state array. This way, we can detect a change in btn_state and call device.emit() to toggle the state of the key.

To allow us to run this script in the background, we can run it with &, as shown in the
following command:

sudo python3 gpiokeys.py &  
The & character allows the command to run in the background, so we can continue with the command line to run other programs. You can use fg to bring it back to the foreground, or %1, %2, and so on if you have several commands running. Use jobs to get a list.

 

You can even put a process/program on hold to get to Command Prompt by pressing Ctrl + Z and then resume it with bg (which will let it run in the background).