ble nano hid over gatt

Dependencies:   BLE_API mbed-dev nRF51822

Committer:
cho45
Date:
Sat Aug 27 08:43:53 2016 +0000
Revision:
42:2c3be8694896
Child:
44:916b70fd1c40
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cho45 42:2c3be8694896 1 #include "config.h"
cho45 42:2c3be8694896 2 #include "mcp23017.h"
cho45 42:2c3be8694896 3
cho45 42:2c3be8694896 4 class KeyboardMatrixController {
cho45 42:2c3be8694896 5 I2C& i2c;
cho45 42:2c3be8694896 6 MCP23017 gpio1;
cho45 42:2c3be8694896 7 MCP23017 gpio2;
cho45 42:2c3be8694896 8 bool gpio1_ready;
cho45 42:2c3be8694896 9 bool gpio2_ready;
cho45 42:2c3be8694896 10
cho45 42:2c3be8694896 11 static const uint8_t GPIO1_SLAVE_ADDRESS = 0b0100000;
cho45 42:2c3be8694896 12 static const uint8_t GPIO2_SLAVE_ADDRESS = 0b0100100;
cho45 42:2c3be8694896 13
cho45 42:2c3be8694896 14 /**
cho45 42:2c3be8694896 15 * COL=GPIOA (output normaly positive)
cho45 42:2c3be8694896 16 * ROW=GPIOB (input pulled-up)
cho45 42:2c3be8694896 17 */
cho45 42:2c3be8694896 18
cho45 42:2c3be8694896 19 bool setupGpio(MCP23017& gpio) {
cho45 42:2c3be8694896 20 int ok;
cho45 42:2c3be8694896 21 DEBUG_PRINTF("SET IOCON\r\n");
cho45 42:2c3be8694896 22 ok = gpio.write8(
cho45 42:2c3be8694896 23 MCP23017::IOCON,
cho45 42:2c3be8694896 24 0<<MCP23017::BANK |
cho45 42:2c3be8694896 25 1<<MCP23017::MIRROR |
cho45 42:2c3be8694896 26 1<<MCP23017::SEQOP |
cho45 42:2c3be8694896 27 0<<MCP23017::DISSLW |
cho45 42:2c3be8694896 28 1<<MCP23017::ODR // int pin is open drain
cho45 42:2c3be8694896 29 );
cho45 42:2c3be8694896 30 if (!ok) return false;
cho45 42:2c3be8694896 31
cho45 42:2c3be8694896 32 // IODIR
cho45 42:2c3be8694896 33 // 1: input
cho45 42:2c3be8694896 34 // 0: output
cho45 42:2c3be8694896 35 DEBUG_PRINTF("SET IODIRA\r\n");
cho45 42:2c3be8694896 36 ok = gpio.write16(
cho45 42:2c3be8694896 37 MCP23017::IODIRA,
cho45 42:2c3be8694896 38 0b0000000011111111
cho45 42:2c3be8694896 39 );
cho45 42:2c3be8694896 40 if (!ok) return false;
cho45 42:2c3be8694896 41
cho45 42:2c3be8694896 42 // INPUT POLARITY
cho45 42:2c3be8694896 43 // 1: inverse polarity
cho45 42:2c3be8694896 44 // 0: raw
cho45 42:2c3be8694896 45 DEBUG_PRINTF("SET IPOLB\r\n");
cho45 42:2c3be8694896 46 ok = gpio.write8(
cho45 42:2c3be8694896 47 MCP23017::IPOLB,
cho45 42:2c3be8694896 48 0b11111111
cho45 42:2c3be8694896 49 );
cho45 42:2c3be8694896 50 if (!ok) return false;
cho45 42:2c3be8694896 51
cho45 42:2c3be8694896 52 // INTERRUPT-ON-CHANGE Enable
cho45 42:2c3be8694896 53 DEBUG_PRINTF("SET GPINTENB\r\n");
cho45 42:2c3be8694896 54 ok = gpio.write8(
cho45 42:2c3be8694896 55 MCP23017::GPINTENB,
cho45 42:2c3be8694896 56 0b11111111
cho45 42:2c3be8694896 57 );
cho45 42:2c3be8694896 58 if (!ok) return false;
cho45 42:2c3be8694896 59
cho45 42:2c3be8694896 60 // INTERRUPT-ON-CHANGE Control
cho45 42:2c3be8694896 61 // 1: compared with DEFVAL
cho45 42:2c3be8694896 62 // 0: compared to previous value
cho45 42:2c3be8694896 63 DEBUG_PRINTF("SET INTCONB\r\n");
cho45 42:2c3be8694896 64 ok = gpio.write8(
cho45 42:2c3be8694896 65 MCP23017::INTCONB,
cho45 42:2c3be8694896 66 0b00000000
cho45 42:2c3be8694896 67 );
cho45 42:2c3be8694896 68 if (!ok) return false;
cho45 42:2c3be8694896 69
cho45 42:2c3be8694896 70 // PULL-UP (for input pin)
cho45 42:2c3be8694896 71 // 1: pull-up enabled
cho45 42:2c3be8694896 72 // 0: pull-up disabled
cho45 42:2c3be8694896 73 DEBUG_PRINTF("SET GPPUB\r\n");
cho45 42:2c3be8694896 74 ok = gpio.write8(
cho45 42:2c3be8694896 75 MCP23017::GPPUB,
cho45 42:2c3be8694896 76 0b11111111
cho45 42:2c3be8694896 77 );
cho45 42:2c3be8694896 78 if (!ok) return false;
cho45 42:2c3be8694896 79
cho45 42:2c3be8694896 80 DEBUG_PRINTF("SET GPIOA\r\n");
cho45 42:2c3be8694896 81 ok = gpio1.write8(
cho45 42:2c3be8694896 82 MCP23017::GPIOA,
cho45 42:2c3be8694896 83 0b00000000
cho45 42:2c3be8694896 84 );
cho45 42:2c3be8694896 85 if (!ok) return false;
cho45 42:2c3be8694896 86
cho45 42:2c3be8694896 87 return true;
cho45 42:2c3be8694896 88 }
cho45 42:2c3be8694896 89
cho45 42:2c3be8694896 90 public:
cho45 42:2c3be8694896 91 KeyboardMatrixController(I2C& _i2c) :
cho45 42:2c3be8694896 92 i2c(_i2c),
cho45 42:2c3be8694896 93 gpio1(i2c, GPIO1_SLAVE_ADDRESS),
cho45 42:2c3be8694896 94 gpio2(i2c, GPIO2_SLAVE_ADDRESS)
cho45 42:2c3be8694896 95 {
cho45 42:2c3be8694896 96 }
cho45 42:2c3be8694896 97
cho45 42:2c3be8694896 98 void init() {
cho45 42:2c3be8694896 99 DEBUG_PRINTF("init gpio1\r\n");
cho45 42:2c3be8694896 100 gpio1_ready = setupGpio(gpio1);
cho45 42:2c3be8694896 101 DEBUG_PRINTF("gpio1 initialized: %s\r\n", gpio1_ready ? "success" : "failed");
cho45 42:2c3be8694896 102
cho45 42:2c3be8694896 103 DEBUG_PRINTF("init gpio2\r\n");
cho45 42:2c3be8694896 104 gpio2_ready = setupGpio(gpio2);
cho45 42:2c3be8694896 105 DEBUG_PRINTF("gpio2 initialized: %s\r\n", gpio2_ready ? "success" : "failed");
cho45 42:2c3be8694896 106
cho45 42:2c3be8694896 107 }
cho45 42:2c3be8694896 108
cho45 42:2c3be8694896 109 // __attribute__((used, long_call, section(".data")))
cho45 42:2c3be8694896 110 void scanKeyboard(uint8_t* keys) {
cho45 42:2c3be8694896 111 int ok;
cho45 42:2c3be8694896 112
cho45 42:2c3be8694896 113 disableInterrupt();
cho45 42:2c3be8694896 114
cho45 42:2c3be8694896 115 if (gpio1_ready) {
cho45 42:2c3be8694896 116 for (int i = 0; i < 8; i++) {
cho45 42:2c3be8694896 117 ok = gpio1.write8(
cho45 42:2c3be8694896 118 MCP23017::GPIOA,
cho45 42:2c3be8694896 119 ~(1<<i)
cho45 42:2c3be8694896 120 );
cho45 42:2c3be8694896 121 wait_us(1);
cho45 42:2c3be8694896 122 keys[i] = gpio1.read8(MCP23017::GPIOB, ok);
cho45 42:2c3be8694896 123 }
cho45 42:2c3be8694896 124
cho45 42:2c3be8694896 125 // set all output to negative for interrupt
cho45 42:2c3be8694896 126 ok = gpio1.write8(
cho45 42:2c3be8694896 127 MCP23017::GPIOA,
cho45 42:2c3be8694896 128 0b00000000
cho45 42:2c3be8694896 129 );
cho45 42:2c3be8694896 130 }
cho45 42:2c3be8694896 131
cho45 42:2c3be8694896 132
cho45 42:2c3be8694896 133 if (gpio2_ready) {
cho45 42:2c3be8694896 134 for (int i = 0; i < 8; i++) {
cho45 42:2c3be8694896 135 ok = gpio2.write8(
cho45 42:2c3be8694896 136 MCP23017::GPIOA,
cho45 42:2c3be8694896 137 ~(1<<i)
cho45 42:2c3be8694896 138 );
cho45 42:2c3be8694896 139 wait_us(1);
cho45 42:2c3be8694896 140 keys[i+8] = gpio2.read8(MCP23017::GPIOB, ok);
cho45 42:2c3be8694896 141 }
cho45 42:2c3be8694896 142
cho45 42:2c3be8694896 143 // set all output to negative for interrupt
cho45 42:2c3be8694896 144 ok = gpio2.write8(
cho45 42:2c3be8694896 145 MCP23017::GPIOA,
cho45 42:2c3be8694896 146 0b00000000
cho45 42:2c3be8694896 147 );
cho45 42:2c3be8694896 148 }
cho45 42:2c3be8694896 149
cho45 42:2c3be8694896 150 enableInterrupt();
cho45 42:2c3be8694896 151 }
cho45 42:2c3be8694896 152
cho45 42:2c3be8694896 153 int disableInterrupt() {
cho45 42:2c3be8694896 154 int ok;
cho45 42:2c3be8694896 155 if (gpio1_ready) {
cho45 42:2c3be8694896 156 // Disable interrupt
cho45 42:2c3be8694896 157 ok = gpio1.write8(
cho45 42:2c3be8694896 158 MCP23017::GPINTENB,
cho45 42:2c3be8694896 159 0b00000000
cho45 42:2c3be8694896 160 );
cho45 42:2c3be8694896 161 }
cho45 42:2c3be8694896 162
cho45 42:2c3be8694896 163 if (gpio2_ready) {
cho45 42:2c3be8694896 164 // Disable interrupt
cho45 42:2c3be8694896 165 ok = gpio2.write8(
cho45 42:2c3be8694896 166 MCP23017::GPINTENB,
cho45 42:2c3be8694896 167 0b00000000
cho45 42:2c3be8694896 168 );
cho45 42:2c3be8694896 169 }
cho45 42:2c3be8694896 170 return ok;
cho45 42:2c3be8694896 171 }
cho45 42:2c3be8694896 172
cho45 42:2c3be8694896 173 int enableInterrupt() {
cho45 42:2c3be8694896 174 int ok;
cho45 42:2c3be8694896 175 if (gpio1_ready) {
cho45 42:2c3be8694896 176 // Enable interrupt
cho45 42:2c3be8694896 177 ok = gpio1.write8(
cho45 42:2c3be8694896 178 MCP23017::GPINTENB,
cho45 42:2c3be8694896 179 0b11111111
cho45 42:2c3be8694896 180 );
cho45 42:2c3be8694896 181 }
cho45 42:2c3be8694896 182
cho45 42:2c3be8694896 183 if (gpio2_ready) {
cho45 42:2c3be8694896 184 // Enable interrupt
cho45 42:2c3be8694896 185 ok = gpio2.write8(
cho45 42:2c3be8694896 186 MCP23017::GPINTENB,
cho45 42:2c3be8694896 187 0b11111111
cho45 42:2c3be8694896 188 );
cho45 42:2c3be8694896 189 }
cho45 42:2c3be8694896 190
cho45 42:2c3be8694896 191 // Clear interrupt
cho45 42:2c3be8694896 192 // gpio1.read8(MCP23017::GPIOB, ok);
cho45 42:2c3be8694896 193 return ok;
cho45 42:2c3be8694896 194 }
cho45 42:2c3be8694896 195 };