Modifications in 4DGL library. Added CDU_hw_sw.h for version info. Added pins.h for hardware pin remapping
Dependencies: 4DGL-UC MODSERIAL mbed mbos
Fork of CDU_Mbed_30 by
keyboard2.cpp@21:f348e6f0f7d4, 2014-10-10 (annotated)
- Committer:
- WillemBraat
- Date:
- Fri Oct 10 18:23:36 2014 +0000
- Revision:
- 21:f348e6f0f7d4
- Parent:
- 20:150afde94910
Additional files: CDU_Maintenance.cpp / mbps_def3.h
; Rewrite of main() function for power checks
Who changed what in which revision?
User | Revision | Line number | New 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 |
LvdK | 7:6576a287e563 | 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:150afde94910 | 21 | I2C CDU_I2C(I2C_SDA, I2C_SCL); //I2C bus for keyboard and 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 |
LvdK | 7:6576a287e563 | 40 | char cmd[2]; |
WillemBraat | 13:d60c746c097c | 41 | Key_led = 0; |
LvdK | 7:6576a287e563 | 42 | cmd[0] = REG_CFG; //pointer byte to CFG register |
LvdK | 7:6576a287e563 | 43 | cmd[1] = 0x01; //data for CFG register KE_IEN set to 1 |
LvdK | 7:6576a287e563 | 44 | if ( CDU_I2C.write(CDU_KB_ADRS,cmd, 2) == I2C_ACK ) //initiate write cycle and check for ACK |
LvdK | 7:6576a287e563 | 45 | { |
LvdK | 7:6576a287e563 | 46 | //intialize all registers from TCA8418 here |
LvdK | 7:6576a287e563 | 47 | cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 48 | cmd[1] = 0x01; //Reset KE-INT flag |
LvdK | 7:6576a287e563 | 49 | CDU_I2C.write(CDU_KB_ADRS,cmd, 2 ); //Write to Interrupt Status Register from TCA4818 |
LvdK | 7:6576a287e563 | 50 | |
LvdK | 7:6576a287e563 | 51 | //Set TCA8418 to Keypad mode |
LvdK | 7:6576a287e563 | 52 | cmd[0]=REG_KP_GPIO1; //KP_GIO1 |
LvdK | 7:6576a287e563 | 53 | cmd[1]=0xFF; //Set to Keypad mode |
LvdK | 7:6576a287e563 | 54 | CDU_I2C.write(CDU_KB_ADRS,cmd, 2); |
LvdK | 7:6576a287e563 | 55 | |
LvdK | 7:6576a287e563 | 56 | cmd[0]=REG_KP_GPIO2; //KP_GIO2 |
LvdK | 7:6576a287e563 | 57 | cmd[1]=0xFF; //Set to Keypad mode |
LvdK | 7:6576a287e563 | 58 | CDU_I2C.write(CDU_KB_ADRS,cmd, 2); |
LvdK | 7:6576a287e563 | 59 | |
LvdK | 7:6576a287e563 | 60 | cmd[0]=REG_KP_GPIO3; //KP_GIO3 |
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 | } |
LvdK | 7:6576a287e563 | 65 | else |
LvdK | 7:6576a287e563 | 66 | { |
LvdK | 7:6576a287e563 | 67 | //No response from TCA8418 keyboard chip |
LvdK | 7:6576a287e563 | 68 | FAIL = 1; //Switch on FAIL indicator |
LvdK | 7:6576a287e563 | 69 | } |
LvdK | 7:6576a287e563 | 70 | } |
LvdK | 7:6576a287e563 | 71 | |
LvdK | 7:6576a287e563 | 72 | void CDU_KB_GET_KEY() |
LvdK | 7:6576a287e563 | 73 | { |
LvdK | 7:6576a287e563 | 74 | |
LvdK | 7:6576a287e563 | 75 | Key_led = !Key_led; // : toggle LED 2 |
LvdK | 7:6576a287e563 | 76 | |
LvdK | 7:6576a287e563 | 77 | char cmd[2]; |
LvdK | 7:6576a287e563 | 78 | //Read interrupt status flag |
LvdK | 7:6576a287e563 | 79 | cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 80 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 81 | CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value |
LvdK | 7:6576a287e563 | 82 | |
LvdK | 7:6576a287e563 | 83 | //Read Key Lock and Event Counter |
LvdK | 7:6576a287e563 | 84 | cmd[0] = REG_KEY_LCK_EC; //pointer byte KEY_LCK_EC |
LvdK | 7:6576a287e563 | 85 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 86 | CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read key value |
LvdK | 7:6576a287e563 | 87 | |
LvdK | 7:6576a287e563 | 88 | //Keypress --> read data from keybuffer |
LvdK | 7:6576a287e563 | 89 | cmd[0] = REG_KEY_EVENT_A; //pointer to Key Event Register KEY_EVENT_A |
LvdK | 7:6576a287e563 | 90 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 91 | CDU_I2C.read(CDU_KB_ADRS, cmd, 2); //read key value (=2 words) |
LvdK | 7:6576a287e563 | 92 | |
LvdK | 7:6576a287e563 | 93 | key_hit_ID = int(cmd[0]); |
LvdK | 8:422544d24df3 | 94 | |
LvdK | 8:422544d24df3 | 95 | //SERIAL_DEBUG.printf("keynumber : %d,%d\r\n",key_hit_ID,cmd[1] ); // : TEST only ! |
LvdK | 7:6576a287e563 | 96 | |
LvdK | 7:6576a287e563 | 97 | //Reset interrupt flag |
LvdK | 7:6576a287e563 | 98 | cmd[0] = REG_INT_STAT; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 99 | cmd[1] = 0x01; //Reset KE-INT flag |
LvdK | 7:6576a287e563 | 100 | CDU_I2C.write(CDU_KB_ADRS,cmd, 2); |
LvdK | 7:6576a287e563 | 101 | |
LvdK | 7:6576a287e563 | 102 | //Read interrupt status flag |
LvdK | 7:6576a287e563 | 103 | cmd[0] = 0x02; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 104 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 105 | CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read interrupt value |
LvdK | 7:6576a287e563 | 106 | |
LvdK | 7:6576a287e563 | 107 | if ( cmd[0] == 1 ) |
LvdK | 7:6576a287e563 | 108 | { //reset INT flag failed! |
LvdK | 7:6576a287e563 | 109 | while (1) |
LvdK | 7:6576a287e563 | 110 | { |
LvdK | 7:6576a287e563 | 111 | cmd[0] = 0x04; //pointer to Key Event Register KEY_EVENT_A |
LvdK | 7:6576a287e563 | 112 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 113 | CDU_I2C.read(CDU_KB_ADRS, cmd, 2); //read key value (=2 words) |
LvdK | 7:6576a287e563 | 114 | |
LvdK | 7:6576a287e563 | 115 | //Reset interrupt flag |
LvdK | 7:6576a287e563 | 116 | cmd[0] = 0x02; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 117 | cmd[1] = 0x01; //Reset KE-INT flag |
LvdK | 7:6576a287e563 | 118 | CDU_I2C.write(CDU_KB_ADRS,cmd, 2 ); |
LvdK | 7:6576a287e563 | 119 | |
LvdK | 7:6576a287e563 | 120 | //Read interrupt status flag |
LvdK | 7:6576a287e563 | 121 | cmd[0] = 0x02; //pointer byte to Interrupt Status Register |
LvdK | 7:6576a287e563 | 122 | CDU_I2C.write(CDU_KB_ADRS, cmd, 1); //initiate read cycle |
LvdK | 7:6576a287e563 | 123 | CDU_I2C.read(CDU_KB_ADRS, cmd, 1); //read interrupt value |
LvdK | 7:6576a287e563 | 124 | |
LvdK | 7:6576a287e563 | 125 | if ( cmd[0] == 0 ) break; |
LvdK | 7:6576a287e563 | 126 | } |
LvdK | 7:6576a287e563 | 127 | } |
LvdK | 7:6576a287e563 | 128 | } |
LvdK | 7:6576a287e563 | 129 | |
LvdK | 7:6576a287e563 | 130 | void SET_KEY_EVENT() |
LvdK | 7:6576a287e563 | 131 | { |
LvdK | 7:6576a287e563 | 132 | // set KEY_EVENT to wakeup SEND_KEYMESSAGE_TASK : |
LvdK | 7:6576a287e563 | 133 | CDU_OS.SetEvent(KEY_EVENT,SEND_KEYMESSAGE_TASK_ID ); |
LvdK | 7:6576a287e563 | 134 | } |
LvdK | 7:6576a287e563 | 135 | |
LvdK | 7:6576a287e563 | 136 | void CDU_KB_INT_START() |
LvdK | 7:6576a287e563 | 137 | { |
LvdK | 7:6576a287e563 | 138 | CDU_KB_INT.mode( PullUp ); //Keyboard chip pulls this line to 0 on a keypress |
LvdK | 7:6576a287e563 | 139 | CDU_KB_INT.fall(&SET_KEY_EVENT); //Bind function to handle interrupt |
LvdK | 7:6576a287e563 | 140 | } |
LvdK | 7:6576a287e563 | 141 | |
LvdK | 7:6576a287e563 | 142 | void CDU_SET_BGL_INTENSITY( int nVal=255 ) |
LvdK | 7:6576a287e563 | 143 | { |
LvdK | 7:6576a287e563 | 144 | //This routine must be called 5-10x per second. Manual test to see what is pleasant to see |
LvdK | 7:6576a287e563 | 145 | //AnalogIn BGL_POT( p15 ); //background light control potmeter. Returns a value between 0.0 and 1.0 |
WillemBraat | 20:150afde94910 | 146 | //Will be multiplied by a factor (BGL_SCALE/100) to define max light intensity |
WillemBraat | 20:150afde94910 | 147 | // |
LvdK | 7:6576a287e563 | 148 | //PwmOut BGL_LED( p21 ); //PWM output |
LvdK | 7:6576a287e563 | 149 | //calculate required brightness in percentage from 0%-100% |
LvdK | 7:6576a287e563 | 150 | //nVal 255 --> calculate brightness from potmeter value (default value if no parameter is passed) |
LvdK | 7:6576a287e563 | 151 | //nVal = 0 --> switch off backlight |
LvdK | 7:6576a287e563 | 152 | //nVal = 100 --> switch on backlight max |
WillemBraat | 10:9a5f1b389973 | 153 | |
WillemBraat | 12:7e350a27f936 | 154 | static int LightOn = 1; |
WillemBraat | 12:7e350a27f936 | 155 | static int FullBright = 0; |
WillemBraat | 20:150afde94910 | 156 | |
LvdK | 7:6576a287e563 | 157 | switch (nVal) |
LvdK | 7:6576a287e563 | 158 | { |
LvdK | 7:6576a287e563 | 159 | case 0: |
LvdK | 7:6576a287e563 | 160 | { |
LvdK | 7:6576a287e563 | 161 | //switch off backlighting |
WillemBraat | 20:150afde94910 | 162 | BGL_LED = 0.0f ; |
WillemBraat | 10:9a5f1b389973 | 163 | LightOn = 0; |
WillemBraat | 13:d60c746c097c | 164 | FullBright = 0; |
LvdK | 7:6576a287e563 | 165 | break; |
LvdK | 7:6576a287e563 | 166 | } |
LvdK | 7:6576a287e563 | 167 | case 100: |
LvdK | 7:6576a287e563 | 168 | { |
WillemBraat | 13:d60c746c097c | 169 | //switch on backlighting to normal |
WillemBraat | 20:150afde94910 | 170 | BGL_LED = BGL_POT*(float(BGL_SCALE)/100.0f); |
WillemBraat | 10:9a5f1b389973 | 171 | LightOn = 1; |
WillemBraat | 13:d60c746c097c | 172 | FullBright = 0; |
LvdK | 7:6576a287e563 | 173 | break; |
LvdK | 7:6576a287e563 | 174 | } |
WillemBraat | 13:d60c746c097c | 175 | |
WillemBraat | 13:d60c746c097c | 176 | case 128: |
WillemBraat | 13:d60c746c097c | 177 | { |
WillemBraat | 13:d60c746c097c | 178 | //switch backlighting to MAX |
WillemBraat | 20:150afde94910 | 179 | BGL_LED= 1*(float(BGL_SCALE)/100.0f); |
WillemBraat | 13:d60c746c097c | 180 | FullBright = 1; |
WillemBraat | 13:d60c746c097c | 181 | } |
WillemBraat | 13:d60c746c097c | 182 | |
LvdK | 7:6576a287e563 | 183 | case 255: |
LvdK | 7:6576a287e563 | 184 | { |
LvdK | 7:6576a287e563 | 185 | //calculate percentage from potmeter value |
WillemBraat | 13:d60c746c097c | 186 | if ( ( LightOn == 1) && (FullBright== 0) ) |
LvdK | 7:6576a287e563 | 187 | { |
WillemBraat | 10:9a5f1b389973 | 188 | if ( BGL_POT < 0.01 ) |
WillemBraat | 10:9a5f1b389973 | 189 | { |
WillemBraat | 10:9a5f1b389973 | 190 | BGL_LED = 0.0; //prevents flickering when low intensity |
WillemBraat | 10:9a5f1b389973 | 191 | } |
WillemBraat | 10:9a5f1b389973 | 192 | else |
WillemBraat | 10:9a5f1b389973 | 193 | { |
WillemBraat | 20:150afde94910 | 194 | BGL_LED = BGL_POT*(float(BGL_SCALE)/100.0f); |
WillemBraat | 10:9a5f1b389973 | 195 | } |
LvdK | 7:6576a287e563 | 196 | } |
WillemBraat | 13:d60c746c097c | 197 | else if ( ( LightOn == 1) && (FullBright== 1) ) |
WillemBraat | 13:d60c746c097c | 198 | { |
WillemBraat | 20:150afde94910 | 199 | BGL_LED = 1*(float(BGL_SCALE)/100.0f); |
WillemBraat | 13:d60c746c097c | 200 | |
WillemBraat | 13:d60c746c097c | 201 | } |
LvdK | 7:6576a287e563 | 202 | } |
LvdK | 7:6576a287e563 | 203 | } |
WillemBraat | 10:9a5f1b389973 | 204 | } |