Class library for a touchscreen-based keypad for the LCD display present on the DISCO_F429ZI board.

Dependents:   WIRE-BANDING_FT810 WIRE-BANDING_copy

Revision:
0:8cc22acc00d2
Child:
2:51f454b7c9ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KEYPAD_DISCO_F429ZI.cpp	Sun May 08 18:36:57 2016 +0000
@@ -0,0 +1,277 @@
+#include "KEYPAD_DISCO_F429ZI.h"
+#include "mbed.h"
+#include "TS_DISCO_F429ZI.h"
+#include "LCD_DISCO_F429ZI.h"
+
+
+KEYPAD_DISCO_F429ZI::KEYPAD_DISCO_F429ZI() {
+    LastKey=0;
+    ReadKeyState = 0;
+    MsgBColor = LCD_COLOR_YELLOW;
+    MsgFColor = LCD_COLOR_RED;
+    OutBColor = LCD_COLOR_WHITE;
+    OutFColor = LCD_COLOR_BLACK;
+    BackColor = LCD_COLOR_BLACK;
+    KeyBColor = LCD_COLOR_WHITE;
+    KeyFColor = LCD_COLOR_BLACK;
+    KeyPressColor = LCD_COLOR_GRAY;
+    KeysTopY=110;
+    
+    Keys[0][0] = '1';
+    Keys[0][1] = '2';
+    Keys[0][2] = '3';
+    Keys[0][3] = 'A';
+    Keys[1][0] = '4';
+    Keys[1][1] = '5';
+    Keys[1][2] = '6';
+    Keys[1][3] = 'B';
+    Keys[2][0] = '7';
+    Keys[2][1] = '8';
+    Keys[2][2] = '9';
+    Keys[2][3] = 'C';
+    Keys[3][0] = '*';
+    Keys[3][1] = '0';
+    Keys[3][2] = '#';
+    Keys[3][3] = 'D';
+}
+ 
+ 
+void KEYPAD_DISCO_F429ZI::Show(int MessageBoxEnable, int OutBoxEnable) {
+    uint16_t x, y;
+    uint8_t row, col;
+    
+    if(MessageBoxEnable > 0)
+        MessageBoxEnabledFlag = 1;
+    else
+        MessageBoxEnabledFlag = 0;
+    
+    if(OutBoxEnable > 0)
+        OutBoxEnabledFlag = 1;
+    else
+        OutBoxEnabledFlag = 0;
+          
+    lcd.Clear(BackColor);
+    
+    /* Display Message textbox */
+    if(MessageBoxEnabledFlag) {
+        lcd.SetFont(&Font16);
+        lcd.SetBackColor(MsgBColor);
+        lcd.SetTextColor(MsgFColor);
+        lcd.DisplayStringAt(4, LINE(0)+4,(uint8_t *) "                     ", LEFT_MODE);
+        lcd.DisplayStringAt(4, LINE(1)+4,(uint8_t *) "                     ", LEFT_MODE);
+        lcd.SetTextColor(MsgBColor);
+        lcd.FillRect(0,0,240,4);            //top filler
+        lcd.FillRect(0,LINE(0),4,36);       //left filler
+        lcd.FillRect(235,LINE(0),5,36);     //right filler
+    }
+    
+    /* Display Output textbox */
+    if(OutBoxEnabledFlag) {
+        lcd.SetFont(&Font24);
+        lcd.SetBackColor(OutBColor);
+        lcd.SetTextColor(OutFColor);
+        lcd.DisplayStringAt(1,LINE(2),(uint8_t *) "              ", LEFT_MODE);
+        lcd.SetTextColor(OutBColor);
+        lcd.FillRect(1,LINE(2)-4,238,5);    //top filler
+        lcd.DrawVLine(0,LINE(2)-4,28);      //left filler
+        lcd.DrawVLine(239,LINE(2)-4,28);    //right filler
+    }
+    
+    /* Draw buttons */
+    lcd.SetTextColor(KeyBColor);
+    for(y=KeysTopY; y<=KeysTopY+180; y=y+60)
+        for(x=30; x<=210; x=x+60)
+            lcd.FillCircle(x,y,25);
+    
+    /* Draw button text */
+    lcd.SetFont(&Font24);
+    lcd.SetTextColor(KeyFColor);
+    lcd.SetBackColor(KeyBColor);
+    row=0;
+    for(y=KeysTopY; y<=KeysTopY+180; y=y+60)
+    {
+        col=0;
+        for(x=30; x<=210; x=x+60)
+        {
+            lcd.DisplayChar(x-8, y-8, Keys[row][col]);
+            col++;
+        }
+        row++;
+    }
+    
+    ts.Init(240, 320);
+}
+
+char KEYPAD_DISCO_F429ZI::ReadKey() {
+    uint16_t x, y;        
+    TS_StateTypeDef TS_State;
+
+    ts.GetState(&TS_State);  
+    
+    switch(ReadKeyState) {
+        case 0: {    //wait for key press
+            if (TS_State.TouchDetected) {                                   //if the screen was touched
+                x = TS_State.X;                                             //read the x value
+                y = TS_State.Y;                                             //read the y value                                    
+                if((x > 3) && (x <= 60) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) {             //row0, col0
+                    row=0;col=0;
+                    LastkeyX = 30;
+                    LastkeyY = KeysTopY;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 60) && (x <= 120) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) {      //row0, col1
+                    row=0;col=1;
+                    LastkeyX = 90;
+                    LastkeyY = KeysTopY;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 120) && (x <= 180) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) {     //row0, col2
+                    row=0;col=2;
+                    LastkeyX = 150;
+                    LastkeyY = KeysTopY;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 180) && (x <= 237) && (y > KeysTopY - 30) && (y <= KeysTopY + 30)) {      //row0, col3
+                    row=0;col=3;
+                    LastkeyX = 210;
+                    LastkeyY = KeysTopY;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                    
+                if((x > 3) && (x <= 60) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) {                               //row1, col0
+                    row=1;col=0;
+                    LastkeyX = 30;
+                    LastkeyY = KeysTopY+60;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 60) && (x <= 120) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) {               //row1, col1
+                    row=1;col=1;
+                    LastkeyX = 90;
+                    LastkeyY = KeysTopY+60;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 120) && (x <= 180) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) {               //row1, col2
+                    row=1;col=2;
+                    LastkeyX = 150;
+                    LastkeyY = KeysTopY+60;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 180) && (x <= 237) && (y > KeysTopY + 30) && (y <= KeysTopY + 90)) {               //row1, col3
+                    row=1;col=3;
+                    LastkeyX = 210;
+                    LastkeyY = KeysTopY+60;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                    
+                if((x > 3) && (x <= 60) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) {                              //row2, col0
+                    row=2;col=0;
+                    LastkeyX = 30;
+                    LastkeyY = KeysTopY+120;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 60) && (x <= 120) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) {              //row2, col1
+                    row=2;col=1;
+                    LastkeyX = 90;
+                    LastkeyY = KeysTopY+120;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 120) && (x <= 180) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) {             //row2, col2
+                    row=2;col=2;
+                    LastkeyX = 150;
+                    LastkeyY = KeysTopY+120;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 180) && (x <= 237) && (y > KeysTopY + 90) && (y <= KeysTopY + 150)) {             //row2, col3
+                    row=2;col=3;
+                    LastkeyX = 210;
+                    LastkeyY = KeysTopY+120;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                    
+                if((x > 3) && (x <= 60) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) {                            //row3, col0
+                    row=3;col=0;
+                    LastkeyX = 30;
+                    LastkeyY = KeysTopY+180;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 60) && (x <= 120) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) {             //row3, col1
+                    row=3;col=1;
+                    LastkeyX = 90;
+                    LastkeyY = KeysTopY+180;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 120) && (x <= 180) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) {             //row3, col2
+                    row=3;col=2;
+                    LastkeyX = 150;
+                    LastkeyY = KeysTopY+180;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                else if((x > 180) && (x <= 237) && (y > KeysTopY + 150) && (y <= KeysTopY + 210)) {             //row3, col3
+                    row=3;col=3;
+                    LastkeyX = 210;
+                    LastkeyY = KeysTopY+180;
+                    LastKey = Keys[row][col];
+                    ReadKeyState = 10;
+                }
+                    
+                    
+                   // else
+                   // {
+                   //         //do nothing when not incorrect touch position
+                   // }
+            }  
+        } break;
+                
+        
+        case 10: {      //draw button darker
+            lcd.SetFont(&Font24);
+            lcd.SetTextColor(KeyPressColor);
+            lcd.FillCircle(LastkeyX,LastkeyY,25);
+            lcd.SetTextColor(KeyFColor);
+            lcd.SetBackColor(KeyPressColor);
+            lcd.DisplayChar(LastkeyX-8, LastkeyY-8, Keys[row][col]);
+            
+            ReadKeyState = 20;
+        } break;
+        
+        
+        case 20: {      //wait for key to be released                              
+            if(TS_State.TouchDetected == 0)
+                ReadKeyState = 30;
+        } break;
+             
+        
+        case 30:        //draw key normal again
+        {
+            lcd.SetFont(&Font24);
+            lcd.SetTextColor(KeyBColor);
+            lcd.FillCircle(LastkeyX,LastkeyY,25);
+            lcd.SetTextColor(KeyFColor);
+            lcd.SetBackColor(KeyBColor);
+            lcd.DisplayChar(LastkeyX-8, LastkeyY-8, Keys[row][col]);
+            
+            LastKey = 0;
+            ReadKeyState = 0;
+        } break;
+    }
+
+    wait(0.01);     //to allow for contact bounce
+    
+    return LastKey;
+}
+ 
\ No newline at end of file