New work version with additional functions

Dependencies:   4DGL-UC ConfigFile MODSERIAL mbed mbos

Fork of CDU_Mbed_35 by Engravity-CDU

Committer:
WillemBraat
Date:
Wed Oct 08 14:14:52 2014 +0000
Revision:
20:2d6ac4577e68
Parent:
17:b3545e9d38f7
New release with additional new functions.
; * File handling for config files
; * CDU setup & test screens
; * External power monitoring

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LvdK 7:6576a287e563 1 /* File: keyboard2.cpp W. Braat */
LvdK 7:6576a287e563 2 /* Keyboard chip TCA8418 control */
LvdK 7:6576a287e563 3
LvdK 7:6576a287e563 4 #include "mbed.h"
LvdK 7:6576a287e563 5 #include "MODSERIAL.h"
LvdK 7:6576a287e563 6 #include "keyboard.h"
LvdK 7:6576a287e563 7 #include "mbos.h"
LvdK 8:422544d24df3 8 #include "mbos_def2.h"
WillemBraat 17:b3545e9d38f7 9 #include "pins.h"
LvdK 7:6576a287e563 10
LvdK 7:6576a287e563 11 const int CDU_KB_ADRS = 0x68; //Base address TCA8418 keypad scanner
WillemBraat 20:2d6ac4577e68 12 const int I2C_ACK = 0x00;
LvdK 7:6576a287e563 13 //const int NACK = 0x01;
LvdK 7:6576a287e563 14
LvdK 7:6576a287e563 15 extern int key_hit_ID;
LvdK 7:6576a287e563 16 extern mbos CDU_OS;
LvdK 7:6576a287e563 17 extern MODSERIAL SERIAL_DEBUG;
LvdK 7:6576a287e563 18
LvdK 7:6576a287e563 19 //CDU Keyboard communications KEYBOARD_INT
WillemBraat 17:b3545e9d38f7 20 InterruptIn CDU_KB_INT( KBD_INT ); //Set CDU keyboard interrupt line
WillemBraat 20:2d6ac4577e68 21 I2C CDU_I2C(I2C_SDA, I2C_SCL); //I2C bus for keyboard/temp chip.
LvdK 7:6576a287e563 22
LvdK 7:6576a287e563 23 //CDU Keyboard LEDS
WillemBraat 17:b3545e9d38f7 24 DigitalOut EXEC( LED_EXEC );
WillemBraat 17:b3545e9d38f7 25 DigitalOut FAIL( LED_FAIL );
WillemBraat 17:b3545e9d38f7 26 DigitalOut DSPY( LED_DSPY );
WillemBraat 17:b3545e9d38f7 27 DigitalOut MSG( LED_MSG );
WillemBraat 17:b3545e9d38f7 28 DigitalOut OFST( LED_OFST );
LvdK 7:6576a287e563 29
LvdK 7:6576a287e563 30 //CDU background lighting
WillemBraat 17:b3545e9d38f7 31 AnalogIn BGL_POT( BACKLIGHT_SET ); //background light control potmeter
WillemBraat 17:b3545e9d38f7 32 PwmOut BGL_LED( BACKLIGHT_DRIVE ); //PWM output background lighting
LvdK 7:6576a287e563 33
LvdK 7:6576a287e563 34 // ---- added by LvdK : -----------------------------------------------------------
WillemBraat 17:b3545e9d38f7 35 DigitalOut Key_led( KEY_PRESSED ); // : LED 2 on Mbed board toggles when CDU key is pressed
LvdK 7:6576a287e563 36 // --------------------------------------------------------------------------------
LvdK 7:6576a287e563 37
LvdK 7:6576a287e563 38 void CDU_KB_COMM_INIT()
LvdK 7:6576a287e563 39 { //initialize communication with TCA84818
WillemBraat 20:2d6ac4577e68 40 //Switch off Annunciatorleds and backlighting
WillemBraat 20:2d6ac4577e68 41 EXEC=0;
WillemBraat 20:2d6ac4577e68 42 FAIL=0;
WillemBraat 20:2d6ac4577e68 43 DSPY=0;
WillemBraat 20:2d6ac4577e68 44 MSG=0;
WillemBraat 20:2d6ac4577e68 45 OFST=0;
WillemBraat 20:2d6ac4577e68 46 BGL_LED=0;
WillemBraat 20:2d6ac4577e68 47
LvdK 7:6576a287e563 48 char cmd[2];
WillemBraat 13:d60c746c097c 49 Key_led = 0;
LvdK 7:6576a287e563 50 cmd[0] = REG_CFG; //pointer byte to CFG register
WillemBraat 20:2d6ac4577e68 51 cmd[1] = 0x01; //data for CFG register KE_IEN set to 1
LvdK 7:6576a287e563 52 if ( CDU_I2C.write(CDU_KB_ADRS,cmd, 2) == I2C_ACK ) //initiate write cycle and check for ACK
LvdK 7:6576a287e563 53 {
LvdK 7:6576a287e563 54 //intialize all registers from TCA8418 here
LvdK 7:6576a287e563 55 cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 56 cmd[1] = 0x01; //Reset KE-INT flag
LvdK 7:6576a287e563 57 CDU_I2C.write(CDU_KB_ADRS,cmd, 2 ); //Write to Interrupt Status Register from TCA4818
LvdK 7:6576a287e563 58
LvdK 7:6576a287e563 59 //Set TCA8418 to Keypad mode
LvdK 7:6576a287e563 60 cmd[0]=REG_KP_GPIO1; //KP_GIO1
LvdK 7:6576a287e563 61 cmd[1]=0xFF; //Set to Keypad mode
LvdK 7:6576a287e563 62 CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
LvdK 7:6576a287e563 63
LvdK 7:6576a287e563 64 cmd[0]=REG_KP_GPIO2; //KP_GIO2
LvdK 7:6576a287e563 65 cmd[1]=0xFF; //Set to Keypad mode
LvdK 7:6576a287e563 66 CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
LvdK 7:6576a287e563 67
LvdK 7:6576a287e563 68 cmd[0]=REG_KP_GPIO3; //KP_GIO3
LvdK 7:6576a287e563 69 cmd[1]=0xFF; //Set to Keypad mode
LvdK 7:6576a287e563 70 CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
LvdK 7:6576a287e563 71
LvdK 7:6576a287e563 72 }
LvdK 7:6576a287e563 73 else
LvdK 7:6576a287e563 74 {
LvdK 7:6576a287e563 75 //No response from TCA8418 keyboard chip
LvdK 7:6576a287e563 76 FAIL = 1; //Switch on FAIL indicator
LvdK 7:6576a287e563 77 }
LvdK 7:6576a287e563 78 }
LvdK 7:6576a287e563 79
LvdK 7:6576a287e563 80 void CDU_KB_GET_KEY()
WillemBraat 20:2d6ac4577e68 81 {
LvdK 7:6576a287e563 82 Key_led = !Key_led; // : toggle LED 2
LvdK 7:6576a287e563 83
LvdK 7:6576a287e563 84 char cmd[2];
LvdK 7:6576a287e563 85 //Read interrupt status flag
LvdK 7:6576a287e563 86 cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 87 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 88 CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value
LvdK 7:6576a287e563 89
LvdK 7:6576a287e563 90 //Read Key Lock and Event Counter
LvdK 7:6576a287e563 91 cmd[0] = REG_KEY_LCK_EC; //pointer byte KEY_LCK_EC
LvdK 7:6576a287e563 92 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 93 CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value
LvdK 7:6576a287e563 94
LvdK 7:6576a287e563 95 //Keypress --> read data from keybuffer
LvdK 7:6576a287e563 96 cmd[0] = REG_KEY_EVENT_A; //pointer to Key Event Register KEY_EVENT_A
LvdK 7:6576a287e563 97 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 98 CDU_I2C.read(CDU_KB_ADRS, cmd, 2); //read key value (=2 words)
LvdK 7:6576a287e563 99
WillemBraat 20:2d6ac4577e68 100 key_hit_ID = int(cmd[0]); //write pressed key_ID to global variable
LvdK 8:422544d24df3 101
LvdK 8:422544d24df3 102 //SERIAL_DEBUG.printf("keynumber : %d,%d\r\n",key_hit_ID,cmd[1] ); // : TEST only !
LvdK 7:6576a287e563 103
LvdK 7:6576a287e563 104 //Reset interrupt flag
LvdK 7:6576a287e563 105 cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 106 cmd[1] = 0x01; //Reset KE-INT flag
LvdK 7:6576a287e563 107 CDU_I2C.write(CDU_KB_ADRS,cmd, 2);
LvdK 7:6576a287e563 108
WillemBraat 20:2d6ac4577e68 109 //Read interrupt status flag
LvdK 7:6576a287e563 110 cmd[0] = 0x02; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 111 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 112 CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read interrupt value
LvdK 7:6576a287e563 113
LvdK 7:6576a287e563 114 if ( cmd[0] == 1 )
LvdK 7:6576a287e563 115 { //reset INT flag failed!
LvdK 7:6576a287e563 116 while (1)
LvdK 7:6576a287e563 117 {
LvdK 7:6576a287e563 118 cmd[0] = 0x04; //pointer to Key Event Register KEY_EVENT_A
LvdK 7:6576a287e563 119 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 120 CDU_I2C.read(CDU_KB_ADRS, cmd, 2); //read key value (=2 words)
LvdK 7:6576a287e563 121
LvdK 7:6576a287e563 122 //Reset interrupt flag
LvdK 7:6576a287e563 123 cmd[0] = 0x02; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 124 cmd[1] = 0x01; //Reset KE-INT flag
LvdK 7:6576a287e563 125 CDU_I2C.write(CDU_KB_ADRS,cmd, 2 );
LvdK 7:6576a287e563 126
LvdK 7:6576a287e563 127 //Read interrupt status flag
LvdK 7:6576a287e563 128 cmd[0] = 0x02; //pointer byte to Interrupt Status Register
LvdK 7:6576a287e563 129 CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle
LvdK 7:6576a287e563 130 CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read interrupt value
LvdK 7:6576a287e563 131
WillemBraat 20:2d6ac4577e68 132 if ( cmd[0] == 0 )
WillemBraat 20:2d6ac4577e68 133 {
WillemBraat 20:2d6ac4577e68 134 Key_led = 0;
WillemBraat 20:2d6ac4577e68 135 break;
WillemBraat 20:2d6ac4577e68 136 }
LvdK 7:6576a287e563 137 }
LvdK 7:6576a287e563 138 }
WillemBraat 20:2d6ac4577e68 139
LvdK 7:6576a287e563 140 }
LvdK 7:6576a287e563 141
LvdK 7:6576a287e563 142 void SET_KEY_EVENT()
LvdK 7:6576a287e563 143 {
LvdK 7:6576a287e563 144 // set KEY_EVENT to wakeup SEND_KEYMESSAGE_TASK :
LvdK 7:6576a287e563 145 CDU_OS.SetEvent(KEY_EVENT,SEND_KEYMESSAGE_TASK_ID );
LvdK 7:6576a287e563 146 }
LvdK 7:6576a287e563 147
LvdK 7:6576a287e563 148 void CDU_KB_INT_START()
LvdK 7:6576a287e563 149 {
LvdK 7:6576a287e563 150 CDU_KB_INT.mode( PullUp ); //Keyboard chip pulls this line to 0 on a keypress
LvdK 7:6576a287e563 151 CDU_KB_INT.fall(&SET_KEY_EVENT); //Bind function to handle interrupt
LvdK 7:6576a287e563 152 }
LvdK 7:6576a287e563 153
WillemBraat 20:2d6ac4577e68 154
LvdK 7:6576a287e563 155 void CDU_SET_BGL_INTENSITY( int nVal=255 )
LvdK 7:6576a287e563 156 {
LvdK 7:6576a287e563 157 //This routine must be called 5-10x per second. Manual test to see what is pleasant to see
LvdK 7:6576a287e563 158 //AnalogIn BGL_POT( p15 ); //background light control potmeter. Returns a value between 0.0 and 1.0
LvdK 7:6576a287e563 159 //PwmOut BGL_LED( p21 ); //PWM output
LvdK 7:6576a287e563 160 //calculate required brightness in percentage from 0%-100%
LvdK 7:6576a287e563 161 //nVal 255 --> calculate brightness from potmeter value (default value if no parameter is passed)
LvdK 7:6576a287e563 162 //nVal = 0 --> switch off backlight
LvdK 7:6576a287e563 163 //nVal = 100 --> switch on backlight max
WillemBraat 10:9a5f1b389973 164
WillemBraat 12:7e350a27f936 165 static int LightOn = 1;
WillemBraat 12:7e350a27f936 166 static int FullBright = 0;
WillemBraat 10:9a5f1b389973 167
LvdK 7:6576a287e563 168 switch (nVal)
LvdK 7:6576a287e563 169 {
LvdK 7:6576a287e563 170 case 0:
LvdK 7:6576a287e563 171 {
LvdK 7:6576a287e563 172 //switch off backlighting
WillemBraat 10:9a5f1b389973 173 BGL_LED = 0.0 ;
WillemBraat 10:9a5f1b389973 174 LightOn = 0;
WillemBraat 13:d60c746c097c 175 FullBright = 0;
LvdK 7:6576a287e563 176 break;
LvdK 7:6576a287e563 177 }
LvdK 7:6576a287e563 178 case 100:
LvdK 7:6576a287e563 179 {
WillemBraat 13:d60c746c097c 180 //switch on backlighting to normal
WillemBraat 20:2d6ac4577e68 181 BGL_LED = BGL_POT*float(BGL_SCALE/100.0);
WillemBraat 10:9a5f1b389973 182 LightOn = 1;
WillemBraat 13:d60c746c097c 183 FullBright = 0;
LvdK 7:6576a287e563 184 break;
LvdK 7:6576a287e563 185 }
WillemBraat 13:d60c746c097c 186
WillemBraat 13:d60c746c097c 187 case 128:
WillemBraat 13:d60c746c097c 188 {
WillemBraat 13:d60c746c097c 189 //switch backlighting to MAX
WillemBraat 20:2d6ac4577e68 190 BGL_LED= 1*float(BGL_SCALE/100.0);
WillemBraat 13:d60c746c097c 191 FullBright = 1;
WillemBraat 13:d60c746c097c 192 }
WillemBraat 13:d60c746c097c 193
LvdK 7:6576a287e563 194 case 255:
LvdK 7:6576a287e563 195 {
LvdK 7:6576a287e563 196 //calculate percentage from potmeter value
WillemBraat 13:d60c746c097c 197 if ( ( LightOn == 1) && (FullBright== 0) )
LvdK 7:6576a287e563 198 {
WillemBraat 10:9a5f1b389973 199 if ( BGL_POT < 0.01 )
WillemBraat 10:9a5f1b389973 200 {
WillemBraat 10:9a5f1b389973 201 BGL_LED = 0.0; //prevents flickering when low intensity
WillemBraat 10:9a5f1b389973 202 }
WillemBraat 10:9a5f1b389973 203 else
WillemBraat 10:9a5f1b389973 204 {
WillemBraat 20:2d6ac4577e68 205 BGL_LED = BGL_POT*float(BGL_SCALE/100.0);
WillemBraat 10:9a5f1b389973 206 }
LvdK 7:6576a287e563 207 }
WillemBraat 13:d60c746c097c 208 else if ( ( LightOn == 1) && (FullBright== 1) )
WillemBraat 13:d60c746c097c 209 {
WillemBraat 20:2d6ac4577e68 210 BGL_LED = 1*float(BGL_SCALE/100.0);
WillemBraat 13:d60c746c097c 211
WillemBraat 13:d60c746c097c 212 }
LvdK 7:6576a287e563 213 }
LvdK 7:6576a287e563 214 }
WillemBraat 10:9a5f1b389973 215 }