chirimenBLE for TY51822

Dependencies:   mbed BLE_API nRF51822

Committer:
nakamura_bs
Date:
Thu Dec 13 02:05:08 2018 +0000
Revision:
0:6b1b97df8a36
Child:
1:4d21403a5251
develop phase 1

Who changed what in which revision?

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