C++ file for display control
Dependencies: 4DGL mbed ConfigFile
Fork of 4DGLtest by
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; } } } }