C++ file for display control

Dependencies:   4DGL mbed ConfigFile

Fork of 4DGLtest by Stephane ROCHON

keyboard.cpp

Committer:
WillemBraat
Date:
2014-07-16
Revision:
11:a5b0d98794c0
Parent:
10:5706b75d40fa

File content as of revision 11:a5b0d98794c0:

/* Keyboard chip TCA8418 control */
#include "mbed.h"
#include "keyboard.h"

const int CDU_KB_ADRS  = 0x68;  //Base addrees TCA8418 keypad scanner
const int I2C_ACK  = 0x00;
//const int I2C_ NACK = 0x01;

extern int key_hit_ID;
//extern mbos CDU_OS;

//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

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()
{
    EXEC = 1;//flash EXEC leds when key pressed....
    wait( 0.1 );
    EXEC = 0;
    
    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)

    //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 );

    //CDU_OS.SetEvent(KEY_EVENT,SEND_KEYMESSAGE_TASK_ID ); //Set event key to wakeup task

} 

void CDU_KB_INT_START()
{
    CDU_KB_INT.mode( PullUp );          //Keyboard chip pulls this line to 0 on a keypress
    CDU_KB_INT.fall(&CDU_KB_GET_KEY);   //Bind function to interrupt handler
    }

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; 
            }
        }
    }
}