This is a demonstration of keypadEvents. It's used to switch between keymaps while using only one keypad.

Dependencies:   Hotboards_keypad mbed

Fork of DynamicKeypad by Roman Valencia

Revision:
0:d8190262fb61
Child:
1:0c22e424ea51
diff -r 000000000000 -r d8190262fb61 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 08 20:46:33 2016 +0000
@@ -0,0 +1,162 @@
+
+#include "mbed.h"
+#include "Hotboards_keypad.h"
+#include <ctype.h>
+
+// Define the keymaps.  The blank spot (lower left) is the space character.
+char alphaKeys[ 4 ][ 4 ] =
+{
+    { 'a' , 'd' , 'g' },
+    { 'j' , 'm' , 'p' },
+    { 's' , 'v' , 'y' },
+    { ' ' , '.' , '#' }
+};
+
+char numberKeys[ 4 ][ 4 ] =
+{
+    { '1' , '2' , '3' },
+    { '4' , '5' , '6' },
+    { '7' , '8' , '9' },
+    { ' ' , '0' , '#' }
+};
+
+bool alpha = false;   // Start with the numeric keypad.
+
+// Defines the pins connected to the rows
+DigitalInOut rowPins[ 4 ] = { PA_6 , PA_7 , PB_6 , PC_7 };
+// Defines the pins connected to the cols
+DigitalInOut colPins[ 4 ] = { PA_8 , PB_10 , PB_4 , PB_5 };
+
+// Create two new keypads, one is a number pad and the other is a letter pad.
+Keypad numpad( makeKeymap( numberKeys ) , rowPins , colPins , 4 , 4 );
+Keypad ltrpad( makeKeymap( alphaKeys ) , rowPins , colPins , 4 , 4 ); 
+
+int startTime;
+// For this example we will use the Nucleo LED1 on pin PA_5
+DigitalOut led1( LED1 );
+
+// Configures the serial port
+Serial pc( USBTX , USBRX );
+
+// Configures a timer
+Timer t;
+
+char key;
+static char virtKey = NO_KEY;   // Stores the last virtual key press. (Alpha keys only)
+static char physKey = NO_KEY;   // Stores the last physical key press. (Alpha keys only)
+static char buildStr[ 12 ];
+static uint8_t buildCount;
+static uint8_t pressCount;
+static uint8_t kpadState;
+
+// Take care of some special events.
+
+void swOnState( char key )
+{
+    switch( kpadState )
+    {
+        case PRESSED:
+            if( isalpha( key ) )        // This is a letter key so we're using the letter keymap.
+            {
+                if( physKey != key )    // New key so start with the first of 3 characters.
+                {
+                    pressCount = 0;
+                    virtKey = key;
+                    physKey = key;
+                }
+                else                    // Pressed the same key again...
+                {
+                    virtKey ++;         // so select the next character on that key.
+                    pressCount ++;      // Tracks how many times we press the same key.
+                }
+                if( pressCount > 2 )    // Last character reached so cycle back to start.
+                {
+                    pressCount = 0;
+                    virtKey = key;
+                }
+                pc.printf( "%c" , virtKey );    // Used for testing.
+                if( isdigit( key ) || key == ' ' || key == '.' )
+                {
+                    pc.printf( "%c" , key );
+                }
+                if( key == '#' )
+                {
+                    pc.printf( "\n\r" );
+                }
+                break;
+            }
+        case HOLD:
+            if( key == '#' )            // Toggle between keymaps.
+            {
+                if( alpha == true )     // We are currently using a keymap with letters
+                {
+                    alpha = false;      // Now we want a keymap with numbers.
+                    led1 = 0;
+                }
+                else                    // We are currently using a keymap with numbers
+                {
+                    alpha = true;       // Now we want a keymap with letters.
+                }
+            }
+            else                        // Some key other than '#' was pressed.
+            {
+                buildStr[ buildCount ++ ] = ( isalpha( key ) ) ? virtKey : key;
+                buildStr[ buildCount ] = '\0';
+                pc.printf( "\n\r" );
+                pc.printf( buildStr );
+            }
+            break;
+        case RELEASED:
+            if( buildCount >= sizeof( buildStr ) )  // Our string is full. Start fresh.
+            {
+                buildCount = 0;
+            }
+            break;
+    }
+}
+
+void keypadEvent_ltr( KeypadEvent key )
+{
+    // in here when in alpha mode.
+    kpadState = ltrpad.getState( );
+    swOnState( key );
+}
+
+void keypadEvent_num( KeypadEvent key )
+{
+    // in here when using number keypad
+    kpadState = numpad.getState( );
+    swOnState( key );
+}
+
+int main()
+{
+    // Starts the timer
+    t.start( );
+    led1 = 0;   // Turns the LED off.
+    ltrpad.begin( makeKeymap( alphaKeys ) );
+    numpad.begin( makeKeymap( numberKeys ) );
+    ltrpad.addEventListener( keypadEvent_ltr ); // Add an event listener.
+    ltrpad.setHoldTime( 500 );                  // Default is 1000mS
+    numpad.addEventListener( keypadEvent_num ); // Add an event listener.
+    numpad.setHoldTime( 500 );                  // Default is 1000mS
+    
+    while(1)
+    {
+        if( alpha )
+        {
+            key = ltrpad.getKey( );
+        }
+        else
+        {
+            key = numpad.getKey( );
+        }
+        if( alpha && t.read_ms( ) - startTime > 100 )
+        {
+            // Flash the LED if we are using the letter keymap.
+            led1 = !led1;
+            startTime = t.read_ms( );
+        }
+    }
+}
+