Evaluation version

Dependencies:   mbed BLE_API nRF51822

Committer:
nakamura_bs
Date:
Wed Dec 26 01:19:29 2018 +0000
Revision:
1:cfd59c317e19
Parent:
0:025387782f3e
Evaluation version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nakamura_bs 1:cfd59c317e19 1 /*
nakamura_bs 1:cfd59c317e19 2 * Chirimen TY51822r3 BLE farmware
nakamura_bs 1:cfd59c317e19 3 * copylight KDDI Technorogy
nakamura_bs 1:cfd59c317e19 4 *
nakamura_bs 1:cfd59c317e19 5 * change log
nakamura_bs 1:cfd59c317e19 6 * 2018/11/28 初回リリース
nakamura_bs 1:cfd59c317e19 7 * 2018/12/03 GPIO端子の初期値不定を修正
nakamura_bs 1:cfd59c317e19 8 * 2018/12/19 GPIO ドライブ能力変更 (0.5mA -> 5mA)
nakamura_bs 1:cfd59c317e19 9 * 2018/12/20 nRF51ライブラリのバグ対策 -- RTS/CTSの割り当て禁止
nakamura_bs 1:cfd59c317e19 10 * 送信出力を +4dBmに規定
nakamura_bs 1:cfd59c317e19 11 */
nakamura_bs 1:cfd59c317e19 12
nakamura_bs 1:cfd59c317e19 13
JonnyA 0:025387782f3e 14 #include "mbed.h"
nakamura_bs 1:cfd59c317e19 15 #include "BLE.h"
nakamura_bs 1:cfd59c317e19 16
nakamura_bs 1:cfd59c317e19 17 #include "board.h"
nakamura_bs 1:cfd59c317e19 18
nakamura_bs 1:cfd59c317e19 19 #define VERSION_NUM 1 // 2018-11-28
nakamura_bs 1:cfd59c317e19 20 const static char DEVICE_NAME[] = "btGPIO2";
nakamura_bs 1:cfd59c317e19 21
nakamura_bs 1:cfd59c317e19 22 #define NEED_CONSOLE_OUTPUT 1
nakamura_bs 1:cfd59c317e19 23 /* Set this if you need debug messages on the console;
nakamura_bs 1:cfd59c317e19 24 * it will have an impact on code-size and power consumption. */
nakamura_bs 1:cfd59c317e19 25
nakamura_bs 1:cfd59c317e19 26 #if NEED_CONSOLE_OUTPUT
nakamura_bs 1:cfd59c317e19 27 Serial pc(DBG_TX, DBG_RX); // TX,RX default 9600bps
nakamura_bs 1:cfd59c317e19 28 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
nakamura_bs 1:cfd59c317e19 29 #else
nakamura_bs 1:cfd59c317e19 30 #define DEBUG(...) /* nothing */
nakamura_bs 1:cfd59c317e19 31 #endif /* #if NEED_CONSOLE_OUTPUT */
nakamura_bs 1:cfd59c317e19 32
nakamura_bs 1:cfd59c317e19 33 #ifdef MICROBIT
nakamura_bs 1:cfd59c317e19 34 // micro:bit matrix-led
JonnyA 0:025387782f3e 35 DigitalOut col0(P0_4, 0);
nakamura_bs 1:cfd59c317e19 36 #endif
nakamura_bs 1:cfd59c317e19 37 DigitalOut LED_CONNECT(GPIO_LED_CONNECT);
nakamura_bs 1:cfd59c317e19 38
nakamura_bs 1:cfd59c317e19 39 #define CMD_EXPORT 0x10
nakamura_bs 1:cfd59c317e19 40 #define CMD_GPIO_WRITE 0x11
nakamura_bs 1:cfd59c317e19 41 #define CMD_GPIO_READ 0x12
nakamura_bs 1:cfd59c317e19 42 #define CMD_UNEXPORT 0x13
nakamura_bs 1:cfd59c317e19 43 #define CMD_GPIO_EVENT 0x14
nakamura_bs 1:cfd59c317e19 44 #define CMD_I2C_INIT 0x20
nakamura_bs 1:cfd59c317e19 45 #define CMD_I2C_WRITE 0x21
nakamura_bs 1:cfd59c317e19 46 #define CMD_I2C_RDBYTE 0x22
nakamura_bs 1:cfd59c317e19 47 #define CMD_I2C_READ 0x23
nakamura_bs 1:cfd59c317e19 48 #define CMD_ADC_INPUT 0x30
nakamura_bs 1:cfd59c317e19 49 #define CMD_ADC_READ 0x31
nakamura_bs 1:cfd59c317e19 50
nakamura_bs 1:cfd59c317e19 51 // Bluetooth Low Energy
nakamura_bs 1:cfd59c317e19 52 BLE ble;
nakamura_bs 1:cfd59c317e19 53 static Gap::ConnectionParams_t connectionParams;
nakamura_bs 1:cfd59c317e19 54
nakamura_bs 1:cfd59c317e19 55 // I2C 2-waire
nakamura_bs 1:cfd59c317e19 56 I2C i2c(I2C_SDA,I2C_SCL);
nakamura_bs 1:cfd59c317e19 57 #define MAX_I2C_TRANSFAR_SIZE 10
nakamura_bs 1:cfd59c317e19 58
nakamura_bs 1:cfd59c317e19 59 // Timer
nakamura_bs 1:cfd59c317e19 60 Ticker timerTask;
JonnyA 0:025387782f3e 61
nakamura_bs 1:cfd59c317e19 62 /*
nakamura_bs 1:cfd59c317e19 63 * gpio bridge used UUID
nakamura_bs 1:cfd59c317e19 64 * ServiceUUID: 928a3d40-e8bf-4b2b-b443-66d2569aed50
nakamura_bs 1:cfd59c317e19 65 * NotifyDataUUID: 928a3d41-e8bf-4b2b-b443-66d2569aed50
nakamura_bs 1:cfd59c317e19 66 * WriteDataUUID: 928a3d42-e8bf-4b2b-b443-66d2569aed50
nakamura_bs 1:cfd59c317e19 67 */
nakamura_bs 1:cfd59c317e19 68 static const uint8_t UUID_GPIO_SERVICE[] = {0x92,0x8a,0x3d,0x40,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50};
nakamura_bs 1:cfd59c317e19 69 static const uint8_t UUID_ADV_SERVICE[] = {0x50,0xed,0x9a,0x56,0xd2,0x66,0x43,0xb4,0x2b,0x4b,0xbf,0xe8,0x40,0x3d,0x8a,0x92};
nakamura_bs 1:cfd59c317e19 70 static const uint8_t UUID_NOTIFY_DATA[] = {0x92,0x8a,0x3d,0x41,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50};
nakamura_bs 1:cfd59c317e19 71 static const uint8_t UUID_WRITE_DATA[] = {0x92,0x8a,0x3d,0x42,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50};
nakamura_bs 1:cfd59c317e19 72 static const uint8_t UUID_STAT_DATA[] = {0x92,0x8a,0x3d,0x43,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50};
nakamura_bs 1:cfd59c317e19 73
nakamura_bs 1:cfd59c317e19 74 uint8_t wrtData[20] = {0,};
nakamura_bs 1:cfd59c317e19 75 GattCharacteristic gWrtCharacteristic (UUID_WRITE_DATA, wrtData, sizeof(wrtData), sizeof(wrtData),
nakamura_bs 1:cfd59c317e19 76 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
nakamura_bs 1:cfd59c317e19 77
nakamura_bs 1:cfd59c317e19 78 uint8_t notifyData[20] = {0,};
nakamura_bs 1:cfd59c317e19 79 GattCharacteristic gNotifyCharacteristic (UUID_NOTIFY_DATA, notifyData, sizeof(notifyData), sizeof(notifyData),
nakamura_bs 1:cfd59c317e19 80 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
nakamura_bs 1:cfd59c317e19 81
nakamura_bs 1:cfd59c317e19 82 uint8_t statData[20] = {0,0};
nakamura_bs 1:cfd59c317e19 83 GattCharacteristic gStatCharacteristic (UUID_STAT_DATA, statData, sizeof(statData), sizeof(statData),
nakamura_bs 1:cfd59c317e19 84 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
nakamura_bs 1:cfd59c317e19 85
nakamura_bs 1:cfd59c317e19 86 GattCharacteristic *gGpioChars[] = {&gNotifyCharacteristic,&gWrtCharacteristic,&gStatCharacteristic};
nakamura_bs 1:cfd59c317e19 87 GattService gGpioService = GattService(UUID_GPIO_SERVICE, gGpioChars, sizeof(gGpioChars) / sizeof(GattCharacteristic *));
nakamura_bs 1:cfd59c317e19 88
nakamura_bs 1:cfd59c317e19 89 int gConnect = 0;
nakamura_bs 1:cfd59c317e19 90
nakamura_bs 1:cfd59c317e19 91 int gCmdLen = 0;
nakamura_bs 1:cfd59c317e19 92 uint8_t gCmdData[20] = {0,};
nakamura_bs 1:cfd59c317e19 93
nakamura_bs 1:cfd59c317e19 94 int gNotifyLen = 0;
nakamura_bs 1:cfd59c317e19 95 uint8_t gNotifyData[6] = {0x2,0x0,0x0,0x14,0,0};
nakamura_bs 1:cfd59c317e19 96 int gScanGPIO = 0;
JonnyA 0:025387782f3e 97
nakamura_bs 1:cfd59c317e19 98 /* ----GPIO Task----------------------------------------------------------------------- */
nakamura_bs 1:cfd59c317e19 99 void gpioTask() {
nakamura_bs 1:cfd59c317e19 100
nakamura_bs 1:cfd59c317e19 101 // LED_CONNECT = !LED_CONNECT;
nakamura_bs 1:cfd59c317e19 102
nakamura_bs 1:cfd59c317e19 103 if (gNotifyLen >0) { // busy
nakamura_bs 1:cfd59c317e19 104 return;
nakamura_bs 1:cfd59c317e19 105 }
nakamura_bs 1:cfd59c317e19 106
nakamura_bs 1:cfd59c317e19 107 for (int i=0; i<sizeof(validGpioPins); i++) {
nakamura_bs 1:cfd59c317e19 108 if (eventGpioPins[gScanGPIO] != 0) { // is event pins
nakamura_bs 1:cfd59c317e19 109 uint8_t rdGpio = gports[gScanGPIO];
nakamura_bs 1:cfd59c317e19 110 if ( currentGpioLevel[gScanGPIO] != rdGpio) {
nakamura_bs 1:cfd59c317e19 111 DEBUG("GPIO status chenged port%d:%d\r\n",validGpioPins[gScanGPIO],rdGpio);
nakamura_bs 1:cfd59c317e19 112 currentGpioLevel[gScanGPIO] = rdGpio;
nakamura_bs 1:cfd59c317e19 113 gNotifyData[4] = gScanGPIO;
nakamura_bs 1:cfd59c317e19 114 gNotifyData[5] = rdGpio;
nakamura_bs 1:cfd59c317e19 115 gNotifyLen = 6;
nakamura_bs 1:cfd59c317e19 116 continue;
nakamura_bs 1:cfd59c317e19 117 }
nakamura_bs 1:cfd59c317e19 118 }
nakamura_bs 1:cfd59c317e19 119 gScanGPIO++;
nakamura_bs 1:cfd59c317e19 120 if (gScanGPIO > sizeof(validGpioPins)) {
nakamura_bs 1:cfd59c317e19 121 gScanGPIO = 0;
nakamura_bs 1:cfd59c317e19 122 }
nakamura_bs 1:cfd59c317e19 123 }
nakamura_bs 1:cfd59c317e19 124 }
nakamura_bs 1:cfd59c317e19 125
nakamura_bs 1:cfd59c317e19 126 void reloadGpioCondition() {
nakamura_bs 1:cfd59c317e19 127 for (int i=0; i<sizeof(validGpioPins); i++) {
nakamura_bs 1:cfd59c317e19 128 if (eventGpioPins[i] != 0) { // is event pins
nakamura_bs 1:cfd59c317e19 129 uint8_t rdGpio = gports[i];
nakamura_bs 1:cfd59c317e19 130 currentGpioLevel[i] = rdGpio;
nakamura_bs 1:cfd59c317e19 131 }
nakamura_bs 1:cfd59c317e19 132 }
nakamura_bs 1:cfd59c317e19 133 }
nakamura_bs 1:cfd59c317e19 134
nakamura_bs 1:cfd59c317e19 135 void clearEventLists() {
nakamura_bs 1:cfd59c317e19 136 for (int i=0; i<sizeof(validGpioPins); i++) {
nakamura_bs 1:cfd59c317e19 137 eventGpioPins[i] = 0;
JonnyA 0:025387782f3e 138 }
JonnyA 0:025387782f3e 139 }
nakamura_bs 1:cfd59c317e19 140
nakamura_bs 1:cfd59c317e19 141 void initGpio() {
nakamura_bs 1:cfd59c317e19 142 for (int i=0; i<sizeof(validGpioPins); i++) {
nakamura_bs 1:cfd59c317e19 143 int gpioNum = validGpioPins[i];
nakamura_bs 1:cfd59c317e19 144 DEBUG("initGpio() 0x%x\r\n", gpioNum);
nakamura_bs 1:cfd59c317e19 145 gports[gpioNum].input(); // 端子を入力モード
nakamura_bs 1:cfd59c317e19 146 gports[gpioNum].mode(PullNone); // pullアップ/ダウンなし
nakamura_bs 1:cfd59c317e19 147 eventGpioPins[gpioNum] = 0; // イベント監視対象外
nakamura_bs 1:cfd59c317e19 148 reloadGpioCondition(); // 設定を更新
nakamura_bs 1:cfd59c317e19 149 }
nakamura_bs 1:cfd59c317e19 150
nakamura_bs 1:cfd59c317e19 151 // nRF51ライブラリのバグ対策 -- RTS/CTSの割り当て禁止
nakamura_bs 1:cfd59c317e19 152 NRF_UART0->PSELRTS = 0xFFFFFFFF;
nakamura_bs 1:cfd59c317e19 153 NRF_UART0->PSELCTS = 0xFFFFFFFF;
nakamura_bs 1:cfd59c317e19 154 }
nakamura_bs 1:cfd59c317e19 155
nakamura_bs 1:cfd59c317e19 156 // set high drive (Low/High 5mA)
nakamura_bs 1:cfd59c317e19 157 void hiDriveGpio(int gpioNum) {
nakamura_bs 1:cfd59c317e19 158 NRF_GPIO->PIN_CNF[gpioNum] =
nakamura_bs 1:cfd59c317e19 159 (NRF_GPIO->PIN_CNF[gpioNum] & ~GPIO_PIN_CNF_DRIVE_Msk) |
nakamura_bs 1:cfd59c317e19 160 (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos);
nakamura_bs 1:cfd59c317e19 161 }
nakamura_bs 1:cfd59c317e19 162 /* --- BLE callbacks ------------------------------------------------------------------- */
nakamura_bs 1:cfd59c317e19 163 void onDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) // Mod
nakamura_bs 1:cfd59c317e19 164 {
nakamura_bs 1:cfd59c317e19 165 DEBUG("Disconnected handle %u, reason %u\r\n", params->handle, params->reason);
nakamura_bs 1:cfd59c317e19 166 DEBUG("Restarting the advertising process\r\n");
nakamura_bs 1:cfd59c317e19 167 DEBUG("Disconnected!\n\r");
nakamura_bs 1:cfd59c317e19 168 timerTask.detach(); // stop timer
nakamura_bs 1:cfd59c317e19 169 gConnect = 0;
nakamura_bs 1:cfd59c317e19 170 clearEventLists();
nakamura_bs 1:cfd59c317e19 171
nakamura_bs 1:cfd59c317e19 172 LED_CONNECT = 0;
nakamura_bs 1:cfd59c317e19 173 ble.startAdvertising();
nakamura_bs 1:cfd59c317e19 174 }
nakamura_bs 1:cfd59c317e19 175
nakamura_bs 1:cfd59c317e19 176 #define BLE_INTERVAL_10MS 8
nakamura_bs 1:cfd59c317e19 177 #define BLE_INTERVAL_12MS 10
nakamura_bs 1:cfd59c317e19 178 #define BLE_INTERVAL_20MS 15
nakamura_bs 1:cfd59c317e19 179 #define BLE_INTERVAL_30MS 23
nakamura_bs 1:cfd59c317e19 180 #define BLE_INTERVAL_50MS 39
nakamura_bs 1:cfd59c317e19 181 #define BLE_INTERVAL_62MS 50
nakamura_bs 1:cfd59c317e19 182 #define BLE_INTERVAL_100MS 78
nakamura_bs 1:cfd59c317e19 183 #define BLE_INTERVAL_125MS 100
nakamura_bs 1:cfd59c317e19 184
nakamura_bs 1:cfd59c317e19 185 void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) //Mod
nakamura_bs 1:cfd59c317e19 186 {
nakamura_bs 1:cfd59c317e19 187 DEBUG("Connected!\n\r");
nakamura_bs 1:cfd59c317e19 188 LED_CONNECT = 1;
nakamura_bs 1:cfd59c317e19 189 ble.getPreferredConnectionParams(&connectionParams);
nakamura_bs 1:cfd59c317e19 190 // connectionParams.minConnectionInterval = BLE_INTERVAL_10MS;
nakamura_bs 1:cfd59c317e19 191 connectionParams.minConnectionInterval = BLE_INTERVAL_50MS;
nakamura_bs 1:cfd59c317e19 192 // connectionParams.minConnectionInterval = INTERVAL_100MS;
nakamura_bs 1:cfd59c317e19 193
nakamura_bs 1:cfd59c317e19 194 // connectionParams.maxConnectionInterval = BLE_INTERVAL_12MS;
nakamura_bs 1:cfd59c317e19 195 connectionParams.maxConnectionInterval = BLE_INTERVAL_62MS;
nakamura_bs 1:cfd59c317e19 196 // connectionParams.maxConnectionInterval = BLE_INTERVAL_125MS;
nakamura_bs 1:cfd59c317e19 197 if (ble.updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) {
nakamura_bs 1:cfd59c317e19 198 DEBUG("failed to update connection paramter\r\n");
nakamura_bs 1:cfd59c317e19 199 }
nakamura_bs 1:cfd59c317e19 200 gConnect = 1;
nakamura_bs 1:cfd59c317e19 201 timerTask.attach(&gpioTask, 0.1f); // start interval 100mS timer
nakamura_bs 1:cfd59c317e19 202
nakamura_bs 1:cfd59c317e19 203 // set ready flag
nakamura_bs 1:cfd59c317e19 204 statData[0] = 0;
nakamura_bs 1:cfd59c317e19 205 statData[1] = VERSION_NUM;
nakamura_bs 1:cfd59c317e19 206 ble.gattServer().write(gStatCharacteristic.getValueAttribute().getHandle(), statData, 4);
nakamura_bs 1:cfd59c317e19 207 }
nakamura_bs 1:cfd59c317e19 208
nakamura_bs 1:cfd59c317e19 209 void ConnectTimeoutCallback(Gap::TimeoutSource_t source)
nakamura_bs 1:cfd59c317e19 210 {
nakamura_bs 1:cfd59c317e19 211 ble.setAdvertisingTimeout(0); /* 0 is disable the advertising timeout. */
nakamura_bs 1:cfd59c317e19 212 ble.startAdvertising();
nakamura_bs 1:cfd59c317e19 213 }
nakamura_bs 1:cfd59c317e19 214
nakamura_bs 1:cfd59c317e19 215 void DataWrittenCallback(const GattWriteCallbackParams *params)
nakamura_bs 1:cfd59c317e19 216 {
nakamura_bs 1:cfd59c317e19 217 uint8_t *wrtData = (uint8_t *)params->data;
nakamura_bs 1:cfd59c317e19 218 uint16_t wrtLen = params->len;
nakamura_bs 1:cfd59c317e19 219
nakamura_bs 1:cfd59c317e19 220 memcpy(gCmdData,wrtData,wrtLen);
nakamura_bs 1:cfd59c317e19 221 gCmdLen = wrtLen;
nakamura_bs 1:cfd59c317e19 222 LED_CONNECT = 0; // busy condition
nakamura_bs 1:cfd59c317e19 223
nakamura_bs 1:cfd59c317e19 224 DEBUG("rcv\r\n");
nakamura_bs 1:cfd59c317e19 225 // DEBUG("DataWrittenCallback() len=%u data=", wrtLen);
nakamura_bs 1:cfd59c317e19 226 // for (int i=0; i< wrtLen; i++) {
nakamura_bs 1:cfd59c317e19 227 // DEBUG("0x%x,", *wrtData++);
nakamura_bs 1:cfd59c317e19 228 // }
nakamura_bs 1:cfd59c317e19 229 // DEBUG("\r\n");
nakamura_bs 1:cfd59c317e19 230
nakamura_bs 1:cfd59c317e19 231 }
nakamura_bs 1:cfd59c317e19 232
nakamura_bs 1:cfd59c317e19 233 void UpdatesEnabledCallBack(Gap::Handle_t handle)
nakamura_bs 1:cfd59c317e19 234 {
nakamura_bs 1:cfd59c317e19 235 DEBUG("UpdatesEnabled\n\r");
nakamura_bs 1:cfd59c317e19 236 // ユーザ処理コード
nakamura_bs 1:cfd59c317e19 237 }
nakamura_bs 1:cfd59c317e19 238
nakamura_bs 1:cfd59c317e19 239 void UpdatesDisabledCallBack(Gap::Handle_t handle)
nakamura_bs 1:cfd59c317e19 240 {
nakamura_bs 1:cfd59c317e19 241 DEBUG("UpdatesDisabled\n\r");
nakamura_bs 1:cfd59c317e19 242 // ユーザ処理コード
nakamura_bs 1:cfd59c317e19 243 }
nakamura_bs 1:cfd59c317e19 244
nakamura_bs 1:cfd59c317e19 245 void DataSentCallback(unsigned count)
nakamura_bs 1:cfd59c317e19 246 {
nakamura_bs 1:cfd59c317e19 247 // DEBUG("DataSentCallback\n\r");
nakamura_bs 1:cfd59c317e19 248 // ユーザ処理コード
nakamura_bs 1:cfd59c317e19 249 }
nakamura_bs 1:cfd59c317e19 250
nakamura_bs 1:cfd59c317e19 251 /* --- test code ----------------------------------------------------------------------- */
nakamura_bs 1:cfd59c317e19 252 int tako() {
nakamura_bs 1:cfd59c317e19 253 i2c.frequency(I2C_SPEED);
nakamura_bs 1:cfd59c317e19 254 char wReg[2] = {0x0,0x0};
nakamura_bs 1:cfd59c317e19 255 char rReg[2] = {0,0};
nakamura_bs 1:cfd59c317e19 256
nakamura_bs 1:cfd59c317e19 257 i2c.start();
nakamura_bs 1:cfd59c317e19 258 int val = i2c.write(0x48<<1);
nakamura_bs 1:cfd59c317e19 259 i2c.stop();
nakamura_bs 1:cfd59c317e19 260 DEBUG("write val %d\r\n",val);
nakamura_bs 1:cfd59c317e19 261
nakamura_bs 1:cfd59c317e19 262 #if 1
nakamura_bs 1:cfd59c317e19 263 if (i2c.write(0x48<<1, wReg, 0) == 0) {
nakamura_bs 1:cfd59c317e19 264 DEBUG("write ok\r\n");
nakamura_bs 1:cfd59c317e19 265 } else {
nakamura_bs 1:cfd59c317e19 266 DEBUG("write NG\r\n");
nakamura_bs 1:cfd59c317e19 267 }
nakamura_bs 1:cfd59c317e19 268 #endif
nakamura_bs 1:cfd59c317e19 269 // i2c.write(0x48, wReg, 1);
nakamura_bs 1:cfd59c317e19 270 #if 1
nakamura_bs 1:cfd59c317e19 271 if (i2c.read(0x48<<1, rReg, 2) == 0) {
nakamura_bs 1:cfd59c317e19 272 DEBUG("read ok\r\n");
nakamura_bs 1:cfd59c317e19 273 } else {
nakamura_bs 1:cfd59c317e19 274 DEBUG("read ng\r\n");
nakamura_bs 1:cfd59c317e19 275 }
nakamura_bs 1:cfd59c317e19 276
nakamura_bs 1:cfd59c317e19 277 DEBUG("read sensor data=");
nakamura_bs 1:cfd59c317e19 278 for (int i=0; i< 2; i++) {
nakamura_bs 1:cfd59c317e19 279 DEBUG("0x%x,", rReg[i]);
nakamura_bs 1:cfd59c317e19 280 }
nakamura_bs 1:cfd59c317e19 281 DEBUG("\r\n");
nakamura_bs 1:cfd59c317e19 282 #endif
nakamura_bs 1:cfd59c317e19 283 return 0;
nakamura_bs 1:cfd59c317e19 284 }
nakamura_bs 1:cfd59c317e19 285
nakamura_bs 1:cfd59c317e19 286 /* --- user task ----------------------------------------------------------------------- */
nakamura_bs 1:cfd59c317e19 287 int checkGPIO(int gpioNum) {
nakamura_bs 1:cfd59c317e19 288 for (int i=0; i<sizeof(validGpioPins); i++) {
nakamura_bs 1:cfd59c317e19 289 if (validGpioPins[i] == gpioNum) {
nakamura_bs 1:cfd59c317e19 290 return i;
nakamura_bs 1:cfd59c317e19 291 }
nakamura_bs 1:cfd59c317e19 292 }
nakamura_bs 1:cfd59c317e19 293 DEBUG("Invalid GPIO number %d\r\n",gpioNum);
nakamura_bs 1:cfd59c317e19 294 return -1;
nakamura_bs 1:cfd59c317e19 295 }
nakamura_bs 1:cfd59c317e19 296
nakamura_bs 1:cfd59c317e19 297 // ホストからのコマンドを処理
nakamura_bs 1:cfd59c317e19 298 void commandTask() {
nakamura_bs 1:cfd59c317e19 299 uint8_t response[20] = {1,2,3,4};
nakamura_bs 1:cfd59c317e19 300 int responseSize = 5;
nakamura_bs 1:cfd59c317e19 301 int gpioNum = -1;
nakamura_bs 1:cfd59c317e19 302 char i2cWrBuf[MAX_I2C_TRANSFAR_SIZE] = {0,};
nakamura_bs 1:cfd59c317e19 303 char i2cRdBuf[MAX_I2C_TRANSFAR_SIZE] = {0,};
nakamura_bs 1:cfd59c317e19 304
nakamura_bs 1:cfd59c317e19 305 memcpy(response,gCmdData,4); // コマンドヘッダ部分をレスポンスデータにコピー
nakamura_bs 1:cfd59c317e19 306
nakamura_bs 1:cfd59c317e19 307 switch (gCmdData[3]) {
nakamura_bs 1:cfd59c317e19 308 case CMD_EXPORT: // use GPIO port
nakamura_bs 1:cfd59c317e19 309 // input:
nakamura_bs 1:cfd59c317e19 310 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 311 // gCmdData[5] : 0=outpt 1=input
nakamura_bs 1:cfd59c317e19 312 // output:
nakamura_bs 1:cfd59c317e19 313 // response[4] : 1=accept 1=reject
nakamura_bs 1:cfd59c317e19 314 gpioNum = checkGPIO(gCmdData[4]);
nakamura_bs 1:cfd59c317e19 315 if (gpioNum < 0) {
nakamura_bs 1:cfd59c317e19 316 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 317 } else {
nakamura_bs 1:cfd59c317e19 318 if (gCmdData[5] == 0) {
nakamura_bs 1:cfd59c317e19 319 DEBUG("set GPIO output %d\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 320 gports[gpioNum] = 0; // inital state low
nakamura_bs 1:cfd59c317e19 321 gports[gpioNum].output();
nakamura_bs 1:cfd59c317e19 322 hiDriveGpio(gpioNum); // set high drive (Low/High 5mA)
nakamura_bs 1:cfd59c317e19 323
nakamura_bs 1:cfd59c317e19 324
nakamura_bs 1:cfd59c317e19 325 } else {
nakamura_bs 1:cfd59c317e19 326 DEBUG("set GPIO input %d\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 327 gports[gpioNum].input();
nakamura_bs 1:cfd59c317e19 328 gports[gpioNum].mode(PullUp); // 内蔵プルアップを使う
nakamura_bs 1:cfd59c317e19 329 // gports[gpioNum].mode( PullDown ); / 内蔵プルダウンを使う
nakamura_bs 1:cfd59c317e19 330 eventGpioPins[gpioNum] = 1; // イベント監視対象
nakamura_bs 1:cfd59c317e19 331 reloadGpioCondition();
nakamura_bs 1:cfd59c317e19 332 }
nakamura_bs 1:cfd59c317e19 333 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 334 }
nakamura_bs 1:cfd59c317e19 335 break;
nakamura_bs 1:cfd59c317e19 336
nakamura_bs 1:cfd59c317e19 337 case CMD_UNEXPORT: // GPIO port input
nakamura_bs 1:cfd59c317e19 338 // input:
nakamura_bs 1:cfd59c317e19 339 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 340 // output:
nakamura_bs 1:cfd59c317e19 341 // response[4] : 1=accept 1=reject
nakamura_bs 1:cfd59c317e19 342 gpioNum = checkGPIO(gCmdData[4]);
nakamura_bs 1:cfd59c317e19 343 if (gpioNum < 0) {
nakamura_bs 1:cfd59c317e19 344 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 345 } else {
nakamura_bs 1:cfd59c317e19 346 gports[gpioNum].input(); // 端子を入力として解放
nakamura_bs 1:cfd59c317e19 347 gports[gpioNum].mode(PullNone);
nakamura_bs 1:cfd59c317e19 348 eventGpioPins[gpioNum] = 0; // イベント監視対象外
nakamura_bs 1:cfd59c317e19 349 reloadGpioCondition();
nakamura_bs 1:cfd59c317e19 350 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 351 }
nakamura_bs 1:cfd59c317e19 352 break;
nakamura_bs 1:cfd59c317e19 353
nakamura_bs 1:cfd59c317e19 354 case CMD_GPIO_WRITE: // GPIO port write
nakamura_bs 1:cfd59c317e19 355 // input:
nakamura_bs 1:cfd59c317e19 356 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 357 // gCmdData[5] : 0=low 1=high
nakamura_bs 1:cfd59c317e19 358 // output:
nakamura_bs 1:cfd59c317e19 359 // response[4] : 1=accept 0=reject
nakamura_bs 1:cfd59c317e19 360 gpioNum = checkGPIO(gCmdData[4]);
nakamura_bs 1:cfd59c317e19 361 if (gpioNum < 0) {
nakamura_bs 1:cfd59c317e19 362 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 363 } else {
nakamura_bs 1:cfd59c317e19 364 gports[gpioNum] = gCmdData[5];
nakamura_bs 1:cfd59c317e19 365 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 366 }
nakamura_bs 1:cfd59c317e19 367 break;
nakamura_bs 1:cfd59c317e19 368
nakamura_bs 1:cfd59c317e19 369 case CMD_GPIO_READ: // GPIO port write
nakamura_bs 1:cfd59c317e19 370 // input:
nakamura_bs 1:cfd59c317e19 371 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 372 // output:
nakamura_bs 1:cfd59c317e19 373 // response[4] : 1=accept 0=reject
nakamura_bs 1:cfd59c317e19 374 // response[5] : port condition 0=low 1=high
nakamura_bs 1:cfd59c317e19 375 gpioNum = checkGPIO(gCmdData[4]);
nakamura_bs 1:cfd59c317e19 376 if (gpioNum < 0) {
nakamura_bs 1:cfd59c317e19 377 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 378 } else {
nakamura_bs 1:cfd59c317e19 379 gports[gpioNum] = gCmdData[5];
nakamura_bs 1:cfd59c317e19 380 if (gports[gpioNum] ==0) {
nakamura_bs 1:cfd59c317e19 381 response[5] = 0; // Low
nakamura_bs 1:cfd59c317e19 382 } else {
nakamura_bs 1:cfd59c317e19 383 response[5] = 1; // High
nakamura_bs 1:cfd59c317e19 384 }
nakamura_bs 1:cfd59c317e19 385 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 386 responseSize += 1;
nakamura_bs 1:cfd59c317e19 387 }
nakamura_bs 1:cfd59c317e19 388 break;
nakamura_bs 1:cfd59c317e19 389
nakamura_bs 1:cfd59c317e19 390 case CMD_I2C_INIT: // I2C test access
nakamura_bs 1:cfd59c317e19 391 // input:
nakamura_bs 1:cfd59c317e19 392 // gCmdData[4] : slave I2C address
nakamura_bs 1:cfd59c317e19 393 // output:
nakamura_bs 1:cfd59c317e19 394 // response[4] : 1=accept 1=reject
nakamura_bs 1:cfd59c317e19 395 i2cWrBuf[0] =0;
nakamura_bs 1:cfd59c317e19 396 if (i2c.write(gCmdData[4]<<1, i2cWrBuf, 0) == 0) {
nakamura_bs 1:cfd59c317e19 397 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 398 } else {
nakamura_bs 1:cfd59c317e19 399 DEBUG("I2C write error address=%x\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 400 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 401 }
nakamura_bs 1:cfd59c317e19 402 break;
nakamura_bs 1:cfd59c317e19 403
nakamura_bs 1:cfd59c317e19 404 case CMD_I2C_READ: // I2C read
nakamura_bs 1:cfd59c317e19 405 // input:
nakamura_bs 1:cfd59c317e19 406 // gCmdData[4] : slave I2C address
nakamura_bs 1:cfd59c317e19 407 // gCmdData[5] : sub-address
nakamura_bs 1:cfd59c317e19 408 // gCmdData[6] : length
nakamura_bs 1:cfd59c317e19 409 // output:
nakamura_bs 1:cfd59c317e19 410 // response[4] : read data length / 0=reject
nakamura_bs 1:cfd59c317e19 411 // response[5] : read data
nakamura_bs 1:cfd59c317e19 412 if ((gCmdData[6] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[6] < 1)) {
nakamura_bs 1:cfd59c317e19 413 DEBUG("I2C write error invalid length=%d\r\n",gCmdData[6]);
nakamura_bs 1:cfd59c317e19 414 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 415 break;
nakamura_bs 1:cfd59c317e19 416 }
nakamura_bs 1:cfd59c317e19 417 i2cWrBuf[0] = gCmdData[5];
nakamura_bs 1:cfd59c317e19 418 if (i2c.write(gCmdData[4]<<1, i2cWrBuf, 1, true) != 0) { // Repeat condision
nakamura_bs 1:cfd59c317e19 419 DEBUG("I2C write error address=%x\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 420 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 421 break;
nakamura_bs 1:cfd59c317e19 422 }
nakamura_bs 1:cfd59c317e19 423 if (i2c.read(gCmdData[4]<<1, i2cRdBuf, gCmdData[6]) != 0) {
nakamura_bs 1:cfd59c317e19 424 DEBUG("I2C read error address=%x\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 425 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 426 break;
nakamura_bs 1:cfd59c317e19 427 }
nakamura_bs 1:cfd59c317e19 428 // DEBUG("I2C read ok\r\n");
nakamura_bs 1:cfd59c317e19 429 memcpy(&response[5],i2cRdBuf,gCmdData[6]);
nakamura_bs 1:cfd59c317e19 430 response[4] = gCmdData[6]; // read size
nakamura_bs 1:cfd59c317e19 431 responseSize += gCmdData[6];
nakamura_bs 1:cfd59c317e19 432 break;
nakamura_bs 1:cfd59c317e19 433
nakamura_bs 1:cfd59c317e19 434 case CMD_I2C_RDBYTE:
nakamura_bs 1:cfd59c317e19 435 // input:
nakamura_bs 1:cfd59c317e19 436 // gCmdData[4] : slave I2C address
nakamura_bs 1:cfd59c317e19 437 // gCmdData[5] : length
nakamura_bs 1:cfd59c317e19 438 // output:
nakamura_bs 1:cfd59c317e19 439 // response[4] : read data length / 0=reject
nakamura_bs 1:cfd59c317e19 440 // response[5] : read data
nakamura_bs 1:cfd59c317e19 441 if ((gCmdData[5] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[5] < 1)) {
nakamura_bs 1:cfd59c317e19 442 DEBUG("I2C write error invalid length=%d\r\n",gCmdData[5]);
nakamura_bs 1:cfd59c317e19 443 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 444 break;
nakamura_bs 1:cfd59c317e19 445 }
nakamura_bs 1:cfd59c317e19 446 if (i2c.read(gCmdData[4]<<1, i2cRdBuf, gCmdData[5]) != 0) {
nakamura_bs 1:cfd59c317e19 447 DEBUG("I2C read error address=%x\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 448 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 449 break;
nakamura_bs 1:cfd59c317e19 450 }
nakamura_bs 1:cfd59c317e19 451 // DEBUG("read ok\r\n");
nakamura_bs 1:cfd59c317e19 452 memcpy(&response[5],i2cRdBuf,gCmdData[5]);
nakamura_bs 1:cfd59c317e19 453 response[4] = gCmdData[5]; // read size
nakamura_bs 1:cfd59c317e19 454 responseSize += gCmdData[5];
nakamura_bs 1:cfd59c317e19 455 break;
nakamura_bs 1:cfd59c317e19 456
nakamura_bs 1:cfd59c317e19 457 case CMD_I2C_WRITE: // I2C write
nakamura_bs 1:cfd59c317e19 458 // input:
nakamura_bs 1:cfd59c317e19 459 // gCmdData[4] : slave I2C address
nakamura_bs 1:cfd59c317e19 460 // gCmdData[5] : length
nakamura_bs 1:cfd59c317e19 461 // gCmdData[6] : write data
nakamura_bs 1:cfd59c317e19 462 // gCmdData[7] ...
nakamura_bs 1:cfd59c317e19 463 // output:
nakamura_bs 1:cfd59c317e19 464 // response[4] : 1=accept 1=reject
nakamura_bs 1:cfd59c317e19 465 if ((gCmdData[5] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[5] < 1)) {
nakamura_bs 1:cfd59c317e19 466 DEBUG("I2C write error invalid length=%d\r\n",gCmdData[5]);
nakamura_bs 1:cfd59c317e19 467 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 468 break;
nakamura_bs 1:cfd59c317e19 469 }
nakamura_bs 1:cfd59c317e19 470 memcpy(i2cWrBuf,&gCmdData[6],gCmdData[5]);
nakamura_bs 1:cfd59c317e19 471 if (i2c.write(gCmdData[4]<<1, i2cWrBuf, gCmdData[5]) != 0) { // Repeat condision
nakamura_bs 1:cfd59c317e19 472 DEBUG("I2C write error address=%x\r\n",gCmdData[4]);
nakamura_bs 1:cfd59c317e19 473 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 474 break;
nakamura_bs 1:cfd59c317e19 475 }
nakamura_bs 1:cfd59c317e19 476
nakamura_bs 1:cfd59c317e19 477 response[4] = gCmdData[5]; // return complite transfar size
nakamura_bs 1:cfd59c317e19 478 break;
nakamura_bs 1:cfd59c317e19 479
nakamura_bs 1:cfd59c317e19 480 #if 0
nakamura_bs 1:cfd59c317e19 481 case CMD_ADC_INPUT:
nakamura_bs 1:cfd59c317e19 482 // input:
nakamura_bs 1:cfd59c317e19 483 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 484 // output:
nakamura_bs 1:cfd59c317e19 485 // response[4] : 1=accept 1=reject
nakamura_bs 1:cfd59c317e19 486 gpioNum = checkGPIO(gCmdData[4]);
nakamura_bs 1:cfd59c317e19 487 if ((gpioNum < 1) || (gpioNum > 6)) {
nakamura_bs 1:cfd59c317e19 488 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 489 } else {
nakamura_bs 1:cfd59c317e19 490 gports[gpioNum].input(); // 端子を入力として解放
nakamura_bs 1:cfd59c317e19 491 gports[gpioNum].mode(PullNone);
nakamura_bs 1:cfd59c317e19 492 eventGpioPins[gpioNum] = 0; // イベント監視対象外
nakamura_bs 1:cfd59c317e19 493 reloadGpioCondition();
nakamura_bs 1:cfd59c317e19 494
nakamura_bs 1:cfd59c317e19 495 // ADC setting
nakamura_bs 1:cfd59c317e19 496 // 10bit Reference internal Bandcap(1.2V)
nakamura_bs 1:cfd59c317e19 497 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
nakamura_bs 1:cfd59c317e19 498 (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
nakamura_bs 1:cfd59c317e19 499 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
nakamura_bs 1:cfd59c317e19 500 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
nakamura_bs 1:cfd59c317e19 501 response[4] = 1; // OK
nakamura_bs 1:cfd59c317e19 502 }
nakamura_bs 1:cfd59c317e19 503 break;
nakamura_bs 1:cfd59c317e19 504
nakamura_bs 1:cfd59c317e19 505 case CMD_ADC_READ:
nakamura_bs 1:cfd59c317e19 506 // input:
nakamura_bs 1:cfd59c317e19 507 // gCmdData[4] : target port number
nakamura_bs 1:cfd59c317e19 508 // output:
nakamura_bs 1:cfd59c317e19 509 // response[4] : read data length(fixed 2) / 0=reject
nakamura_bs 1:cfd59c317e19 510 // response[5] : read data(MSB)
nakamura_bs 1:cfd59c317e19 511 // response[6] : read data(LSB)
nakamura_bs 1:cfd59c317e19 512 gpioNum = gCmdData[4];
nakamura_bs 1:cfd59c317e19 513 if ((gpioNum < 1) || (gpioNum > 6)) {
nakamura_bs 1:cfd59c317e19 514 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 515 } else {
nakamura_bs 1:cfd59c317e19 516 NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
nakamura_bs 1:cfd59c317e19 517 NRF_ADC->CONFIG |= (4 << gpioNum) << ADC_CONFIG_PSEL_Pos;
nakamura_bs 1:cfd59c317e19 518 NRF_ADC->TASKS_START = 1;
nakamura_bs 1:cfd59c317e19 519 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {
nakamura_bs 1:cfd59c317e19 520 }
nakamura_bs 1:cfd59c317e19 521 uint16_t advalue = (uint16_t)NRF_ADC->RESULT; // 10 bit
nakamura_bs 1:cfd59c317e19 522 DEBUG("read adc %d =%x\r\n",gpioNum, advalue);
nakamura_bs 1:cfd59c317e19 523 response[5] = advalue >> 8;
nakamura_bs 1:cfd59c317e19 524 response[6] = advalue && 0xff;
nakamura_bs 1:cfd59c317e19 525 responseSize += 2;
nakamura_bs 1:cfd59c317e19 526 }
nakamura_bs 1:cfd59c317e19 527 break;
nakamura_bs 1:cfd59c317e19 528 #endif
nakamura_bs 1:cfd59c317e19 529
nakamura_bs 1:cfd59c317e19 530 default:
nakamura_bs 1:cfd59c317e19 531 DEBUG("unknonwn command =%x\r\n",gCmdData[3]);
nakamura_bs 1:cfd59c317e19 532 response[4] = 0; // error
nakamura_bs 1:cfd59c317e19 533 break;
nakamura_bs 1:cfd59c317e19 534
nakamura_bs 1:cfd59c317e19 535 }
nakamura_bs 1:cfd59c317e19 536
nakamura_bs 1:cfd59c317e19 537 DEBUG("reply\r\n");
nakamura_bs 1:cfd59c317e19 538 // DEBUG("send Notify len=%u data=", responseSize);
nakamura_bs 1:cfd59c317e19 539 // for (int i=0; i< responseSize; i++) {
nakamura_bs 1:cfd59c317e19 540 // DEBUG("0x%x,", response[i]);
nakamura_bs 1:cfd59c317e19 541 // }
nakamura_bs 1:cfd59c317e19 542 // DEBUG("\r\n");
nakamura_bs 1:cfd59c317e19 543
nakamura_bs 1:cfd59c317e19 544 // send response (notify)
nakamura_bs 1:cfd59c317e19 545 ble.gattServer().write(gNotifyCharacteristic.getValueAttribute().getHandle(), response, responseSize);
nakamura_bs 1:cfd59c317e19 546 LED_CONNECT = 1; // ready
nakamura_bs 1:cfd59c317e19 547
nakamura_bs 1:cfd59c317e19 548 }
nakamura_bs 1:cfd59c317e19 549
nakamura_bs 1:cfd59c317e19 550 /* --- main code ----------------------------------------------------------------------- */
nakamura_bs 1:cfd59c317e19 551 int main() {
nakamura_bs 1:cfd59c317e19 552 LED_CONNECT = 1;
nakamura_bs 1:cfd59c317e19 553 gCmdLen = 0;
nakamura_bs 1:cfd59c317e19 554 gConnect = 0;
nakamura_bs 1:cfd59c317e19 555 gScanGPIO = 0;
nakamura_bs 1:cfd59c317e19 556
nakamura_bs 1:cfd59c317e19 557 initGpio();
nakamura_bs 1:cfd59c317e19 558 hiDriveGpio(GPIO_LED_CONNECT);
nakamura_bs 1:cfd59c317e19 559 DEBUG("PowerON version %d\n\r",VERSION_NUM);
nakamura_bs 1:cfd59c317e19 560
nakamura_bs 1:cfd59c317e19 561 /* Initialise the nRF51822 */
nakamura_bs 1:cfd59c317e19 562 ble.init();
nakamura_bs 1:cfd59c317e19 563
nakamura_bs 1:cfd59c317e19 564 /* Setup The event handlers */
nakamura_bs 1:cfd59c317e19 565 ble.onConnection(onConnectionCallback);
nakamura_bs 1:cfd59c317e19 566 ble.onDisconnection(onDisconnectionCallback);
nakamura_bs 1:cfd59c317e19 567 ble.onTimeout(ConnectTimeoutCallback);
nakamura_bs 1:cfd59c317e19 568
nakamura_bs 1:cfd59c317e19 569 ble.onDataWritten(DataWrittenCallback);
nakamura_bs 1:cfd59c317e19 570 ble.onDataSent(DataSentCallback);
nakamura_bs 1:cfd59c317e19 571 ble.onUpdatesEnabled(UpdatesEnabledCallBack);
nakamura_bs 1:cfd59c317e19 572 ble.onUpdatesDisabled(UpdatesDisabledCallBack);
nakamura_bs 1:cfd59c317e19 573
nakamura_bs 1:cfd59c317e19 574 // set TX power
nakamura_bs 1:cfd59c317e19 575 // Valid values are -40, -20, -16, -12, -8, -4, 0, 4)
nakamura_bs 1:cfd59c317e19 576 ble.setTxPower(4);
nakamura_bs 1:cfd59c317e19 577
nakamura_bs 1:cfd59c317e19 578 /* setup advertising */
nakamura_bs 1:cfd59c317e19 579 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
nakamura_bs 1:cfd59c317e19 580 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
nakamura_bs 1:cfd59c317e19 581
nakamura_bs 1:cfd59c317e19 582 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
nakamura_bs 1:cfd59c317e19 583 (const uint8_t *)UUID_ADV_SERVICE, sizeof(UUID_ADV_SERVICE));
nakamura_bs 1:cfd59c317e19 584 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
nakamura_bs 1:cfd59c317e19 585 (const uint8_t *)DEVICE_NAME,
nakamura_bs 1:cfd59c317e19 586 strlen(DEVICE_NAME));
nakamura_bs 1:cfd59c317e19 587 ble.gap().setAdvertisingInterval(80); /* 50ms; in multiples of 0.625ms. */
nakamura_bs 1:cfd59c317e19 588 ble.gap().startAdvertising();
nakamura_bs 1:cfd59c317e19 589 DEBUG("Start Advertising\r\n");
nakamura_bs 1:cfd59c317e19 590
nakamura_bs 1:cfd59c317e19 591 ble.addService(gGpioService);
nakamura_bs 1:cfd59c317e19 592
nakamura_bs 1:cfd59c317e19 593 LED_CONNECT = 0;
nakamura_bs 1:cfd59c317e19 594 for (;; ) {
nakamura_bs 1:cfd59c317e19 595 ble.waitForEvent();
nakamura_bs 1:cfd59c317e19 596 if (gCmdLen > 0) {
nakamura_bs 1:cfd59c317e19 597 commandTask();
nakamura_bs 1:cfd59c317e19 598 gCmdLen =0;
nakamura_bs 1:cfd59c317e19 599 } else if (gNotifyLen > 0) {
nakamura_bs 1:cfd59c317e19 600 ble.gattServer().write(gNotifyCharacteristic.getValueAttribute().getHandle(), gNotifyData, gNotifyLen);
nakamura_bs 1:cfd59c317e19 601 gNotifyLen = 0;
nakamura_bs 1:cfd59c317e19 602 }
nakamura_bs 1:cfd59c317e19 603 }
nakamura_bs 1:cfd59c317e19 604
nakamura_bs 1:cfd59c317e19 605 }