ble nano hid over gatt

Dependencies:   BLE_API mbed-dev nRF51822

Committer:
cho45
Date:
Thu Sep 15 09:31:05 2016 +0900
Revision:
86:e0fab77e669d
Parent:
52:fa7179ac1279
support consumer keys

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