chirimenBLE for TY51822

Dependencies:   mbed BLE_API nRF51822

Committer:
nakamura_bs
Date:
Mon Dec 24 23:59:17 2018 +0000
Revision:
1:4d21403a5251
Parent:
0:6b1b97df8a36
fixed bugs; GPIO8-10 signal output; high drive GPIO output;

Who changed what in which revision?

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