Check this one ! mbos setup changed, WTX hor pos changed, no font style check, no checksum check

Dependencies:   4DGL MODSERIAL mbed mbos

Fork of CDU_Mbed_21 by Engravity-CDU

Revision:
7:6576a287e563
Child:
8:422544d24df3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/keyboard2.cpp	Thu Jul 17 10:09:14 2014 +0000
@@ -0,0 +1,177 @@
+/* File: keyboard2.cpp   W. Braat */
+/* Keyboard chip TCA8418 control */
+
+#include "mbed.h"
+#include "MODSERIAL.h"
+#include "keyboard.h"
+#include "mbos.h"
+#include "mbos_def.h"
+ 
+const int CDU_KB_ADRS  = 0x68;  //Base address TCA8418 keypad scanner
+const int I2C_ACK  = 0x00;
+//const int NACK = 0x01;
+ 
+extern int key_hit_ID;
+extern mbos CDU_OS;
+extern MODSERIAL SERIAL_DEBUG;
+ 
+//CDU Keyboard communications KEYBOARD_INT
+InterruptIn CDU_KB_INT( p5 );  //Set CDU keyboard interrupt line
+I2C CDU_I2C(p28, p27);         //I2C bus for keyboard/temp chip.
+ 
+//CDU Keyboard LEDS
+DigitalOut EXEC( p12 );
+DigitalOut FAIL( p17 );
+DigitalOut DSPY( p18 ); 
+DigitalOut  MSG( p19 );
+DigitalOut OFST( p20 );
+ 
+//CDU background lighting
+AnalogIn BGL_POT( p16 ); //background light control potmeter
+PwmOut BGL_LED( p21 );   //PWM output background lighting
+
+// ---- added by LvdK : -----------------------------------------------------------
+DigitalOut Key_led(LED2); // : LED 2 on Mbed board toggles when CDU key is pressed
+// --------------------------------------------------------------------------------
+ 
+void CDU_KB_COMM_INIT()
+{   //initialize communication with TCA84818
+    char cmd[2];
+    
+    cmd[0] = REG_CFG; //pointer byte to CFG register
+    cmd[1] = 0x01; //data for CFG register KE_IEN set to 1
+    if ( CDU_I2C.write(CDU_KB_ADRS,cmd, 2) == I2C_ACK ) //initiate write cycle and check for ACK
+    {
+        //intialize all registers from TCA8418 here
+        cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
+        cmd[1] = 0x01; //Reset KE-INT flag      
+        CDU_I2C.write(CDU_KB_ADRS,cmd, 2 );  //Write to Interrupt Status Register from TCA4818 
+        
+        //Set TCA8418 to Keypad mode
+        cmd[0]=REG_KP_GPIO1; //KP_GIO1
+        cmd[1]=0xFF; //Set to Keypad mode
+        CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
+       
+        cmd[0]=REG_KP_GPIO2; //KP_GIO2
+        cmd[1]=0xFF; //Set to Keypad mode
+        CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
+      
+        cmd[0]=REG_KP_GPIO3; //KP_GIO3
+        cmd[1]=0xFF; //Set to Keypad mode
+        CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
+       
+    }
+    else
+    {
+        //No response from TCA8418 keyboard chip
+        FAIL = 1; //Switch on FAIL indicator
+    }  
+}
+ 
+void CDU_KB_GET_KEY()
+{
+        
+    Key_led = !Key_led;  // : toggle LED 2
+          
+    char cmd[2];
+    //Read interrupt status flag
+    cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
+    CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+    CDU_I2C.read(CDU_KB_ADRS, cmd, 1);  //read key value
+    
+    //Read Key Lock and Event Counter
+    cmd[0] = REG_KEY_LCK_EC; //pointer byte KEY_LCK_EC
+    CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+    CDU_I2C.read(CDU_KB_ADRS, cmd, 1);  //read key value
+          
+    //Keypress --> read data from keybuffer
+    cmd[0] = REG_KEY_EVENT_A; //pointer to Key Event Register KEY_EVENT_A
+    CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+    CDU_I2C.read(CDU_KB_ADRS, cmd, 2);  //read key value (=2 words)
+    
+    key_hit_ID =  int(cmd[0]);
+        SERIAL_DEBUG.printf("keynumber : %d,%d\r\n",key_hit_ID,cmd[1] ); // : TEST only !
+ 
+    //Reset interrupt flag
+    cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
+    cmd[1] = 0x01; //Reset KE-INT flag
+    CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
+    
+     //Read interrupt status flag   
+    cmd[0] = 0x02; //pointer byte to Interrupt Status Register
+    CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+    CDU_I2C.read(CDU_KB_ADRS, cmd, 1);  //read interrupt value
+   
+    if ( cmd[0] == 1 )
+    { //reset INT flag failed!
+        while (1)
+        {
+            cmd[0] = 0x04; //pointer to Key Event Register KEY_EVENT_A
+            CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+            CDU_I2C.read(CDU_KB_ADRS, cmd, 2);  //read key value (=2 words)
+       
+            //Reset interrupt flag
+            cmd[0] = 0x02; //pointer byte to Interrupt Status Register
+            cmd[1] = 0x01; //Reset KE-INT flag
+            CDU_I2C.write(CDU_KB_ADRS,cmd, 2 );
+   
+            //Read interrupt status flag   
+            cmd[0] = 0x02; //pointer byte to Interrupt Status Register
+            CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
+            CDU_I2C.read(CDU_KB_ADRS, cmd, 1);  //read interrupt value
+           
+            if ( cmd[0] == 0 ) break;
+        }   
+    }
+} 
+ 
+void SET_KEY_EVENT()
+{
+    // set KEY_EVENT to wakeup SEND_KEYMESSAGE_TASK :
+    CDU_OS.SetEvent(KEY_EVENT,SEND_KEYMESSAGE_TASK_ID );
+}
+
+void CDU_KB_INT_START()
+{
+    CDU_KB_INT.mode( PullUp );          //Keyboard chip pulls this line to 0 on a keypress
+    CDU_KB_INT.fall(&SET_KEY_EVENT);   //Bind function to handle interrupt
+}
+
+void CDU_SET_BGL_INTENSITY( int nVal=255 )
+{
+    //This routine must be called 5-10x per second. Manual test to see what is pleasant to see
+    //AnalogIn BGL_POT( p15 ); //background light control potmeter. Returns a value between 0.0 and 1.0
+    //PwmOut BGL_LED( p21 );   //PWM output
+    //calculate required brightness in percentage from 0%-100%
+    //nVal 255     --> calculate brightness from potmeter value (default value if no parameter is passed)
+    //nVal = 0     --> switch off backlight
+    //nVal = 100   --> switch on backlight max
+ 
+    switch (nVal) 
+    {
+        case 0:
+        {
+            //switch off backlighting
+            BGL_LED.pulsewidth( 0.0 );
+            break;
+        }
+        case 100:
+        {
+            //switch on backlighting
+            BGL_LED.pulsewidth( 100.0 );
+            break;
+        }
+        case 255:
+        {
+            //calculate percentage from potmeter value
+        if ( BGL_POT < 0.01 )
+            {
+                BGL_LED = 0.0; //prevents flickering when low intensity
+            }
+        else
+            {
+                BGL_LED = BGL_POT; 
+            }
+        }
+    }
+}