konashi/SBBLEのテスト

Dependencies:   BLE_API mbed

Fork of BLE_LoopbackUART by Bluetooth Low Energy

Committer:
robo8080
Date:
Sun Aug 17 00:53:23 2014 +0000
Revision:
8:a62b8f7d5dcf
Parent:
7:60964e52810e
DeviceName??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:e910d9bb040f 1 /* mbed Microcontroller Library
yihui 0:e910d9bb040f 2 * Copyright (c) 2006-2013 ARM Limited
yihui 0:e910d9bb040f 3 *
yihui 0:e910d9bb040f 4 * Licensed under the Apache License, Version 2.0 (the "License");
yihui 0:e910d9bb040f 5 * you may not use this file except in compliance with the License.
yihui 0:e910d9bb040f 6 * You may obtain a copy of the License at
yihui 0:e910d9bb040f 7 *
yihui 0:e910d9bb040f 8 * http://www.apache.org/licenses/LICENSE-2.0
yihui 0:e910d9bb040f 9 *
yihui 0:e910d9bb040f 10 * Unless required by applicable law or agreed to in writing, software
yihui 0:e910d9bb040f 11 * distributed under the License is distributed on an "AS IS" BASIS,
yihui 0:e910d9bb040f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
yihui 0:e910d9bb040f 13 * See the License for the specific language governing permissions and
yihui 0:e910d9bb040f 14 * limitations under the License.
yihui 0:e910d9bb040f 15 */
yihui 0:e910d9bb040f 16
yihui 0:e910d9bb040f 17 #include "mbed.h"
Rohit Grover 2:e060367b9024 18 #include "BLEDevice.h"
yihui 0:e910d9bb040f 19
robo8080 8:a62b8f7d5dcf 20 const static char DEVICE_NAME[] = "mbed HRM1017";
robo8080 5:61109bce11fe 21
robo8080 5:61109bce11fe 22 static const uint16_t KONASHI_SERVICE_UUID = 0xFF00;
robo8080 5:61109bce11fe 23
robo8080 5:61109bce11fe 24 static const uint16_t KONASHI_PIO_SETTING_UUID = 0x3000;
robo8080 5:61109bce11fe 25 static const uint16_t KONASHI_PIO_PULLUP_UUID = 0x3001;
robo8080 5:61109bce11fe 26 static const uint16_t KONASHI_PIO_OUTPUT_UUID = 0x3002;
robo8080 5:61109bce11fe 27 static const uint16_t KONASHI_PIO_INPUT_NOTIFICATION_UUID = 0x3003;
robo8080 5:61109bce11fe 28
robo8080 5:61109bce11fe 29 static const uint16_t KONASHI_PWM_CONFIG_UUID = 0x3004;
robo8080 5:61109bce11fe 30 static const uint16_t KONASHI_PWM_PARAM_UUID = 0x3005;
robo8080 5:61109bce11fe 31 static const uint16_t KONASHI_PWM_DUTY_UUID = 0x3006;
robo8080 5:61109bce11fe 32
robo8080 5:61109bce11fe 33 static const uint16_t KONASHI_ANALOG_DRIVE_UUID = 0x3007;
robo8080 5:61109bce11fe 34 static const uint16_t KONASHI_ANALOG_READ0_UUID = 0x3008;
robo8080 5:61109bce11fe 35 static const uint16_t KONASHI_ANALOG_READ1_UUID = 0x3009;
robo8080 5:61109bce11fe 36 static const uint16_t KONASHI_ANALOG_READ2_UUID = 0x300A;
yihui 0:e910d9bb040f 37
robo8080 5:61109bce11fe 38 static const uint16_t KONASHI_I2C_CONFIG_UUID = 0x300B;
robo8080 5:61109bce11fe 39 static const uint16_t KONASHI_I2C_START_STOP_UUID = 0x300C;
robo8080 5:61109bce11fe 40 static const uint16_t KONASHI_I2C_WRITE_UUID = 0x300D;
robo8080 5:61109bce11fe 41 static const uint16_t KONASHI_I2C_READ_PARAM_UIUD = 0x300E;
robo8080 5:61109bce11fe 42 static const uint16_t KONASHI_I2C_READ_UUID = 0x300F;
robo8080 5:61109bce11fe 43
robo8080 5:61109bce11fe 44 static const uint16_t KONASHI_UART_CONFIG_UUID = 0x3010;
robo8080 5:61109bce11fe 45 static const uint16_t KONASHI_UART_BAUDRATE_UUID = 0x3011;
robo8080 5:61109bce11fe 46 static const uint16_t KONASHI_UART_TX_UUID = 0x3012;
robo8080 5:61109bce11fe 47 static const uint16_t KONASHI_UART_RX_NOTIFICATION_UUID = 0x3013;
robo8080 5:61109bce11fe 48
robo8080 5:61109bce11fe 49 static const uint16_t KONASHI_HARDWARE_RESET_UUID = 0x3014;
robo8080 5:61109bce11fe 50 static const uint16_t KONASHI_HARDWARE_LOW_BAT_NOTIFICATION_UUID = 0x3015;
robo8080 5:61109bce11fe 51
robo8080 5:61109bce11fe 52 uint16_t uuid16_list[] = { KONASHI_SERVICE_UUID };
robo8080 5:61109bce11fe 53
robo8080 6:9c9630cb454b 54 #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
Rohit Grover 2:e060367b9024 55 * it will have an impact on code-size and power consumption. */
yihui 0:e910d9bb040f 56
Rohit Grover 2:e060367b9024 57 #if NEED_CONSOLE_OUTPUT
Rohit Grover 2:e060367b9024 58 Serial pc(USBTX, USBRX);
Rohit Grover 2:e060367b9024 59 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
yihui 0:e910d9bb040f 60 #else
Rohit Grover 2:e060367b9024 61 #define DEBUG(...) /* nothing */
Rohit Grover 2:e060367b9024 62 #endif /* #if NEED_CONSOLE_OUTPUT */
yihui 0:e910d9bb040f 63
robo8080 5:61109bce11fe 64 //Serial pc(USBTX, USBRX);
Rohit Grover 2:e060367b9024 65 BLEDevice ble;
Rohit Grover 2:e060367b9024 66 DigitalOut led1(LED1);
robo8080 6:9c9630cb454b 67 DigitalOut led2(LED2);
robo8080 6:9c9630cb454b 68
robo8080 5:61109bce11fe 69 BusOut ioOut(P0_0,P0_1,P0_2,P0_3,P0_4,P0_5,P0_6,P0_7);
robo8080 5:61109bce11fe 70 uint8_t pioSetting[20] = {0,};
robo8080 5:61109bce11fe 71 uint8_t pioPullup[20] = {0,};
robo8080 5:61109bce11fe 72 uint8_t pioOutput[20] = {0,};
robo8080 5:61109bce11fe 73 uint8_t pioInput[20] = {0,};
robo8080 5:61109bce11fe 74
robo8080 5:61109bce11fe 75 uint8_t pwmConfig[20] = {0,};
robo8080 5:61109bce11fe 76 uint8_t pwmPeriod[20] = {0,};
robo8080 5:61109bce11fe 77 uint8_t pwmDuty[20] = {0,};
robo8080 6:9c9630cb454b 78 static uint32_t pwm_period[3] = {20000,20000,20000};
robo8080 6:9c9630cb454b 79 static uint32_t pwm_duty[3] = {0,0,0};
robo8080 6:9c9630cb454b 80 static uint8_t pwm_config = 0;
robo8080 6:9c9630cb454b 81 PwmOut pwm[3] = {P0_28, P0_29, P0_30};
robo8080 5:61109bce11fe 82
robo8080 5:61109bce11fe 83 uint8_t analogDrive[20] = {0,};
robo8080 5:61109bce11fe 84 uint8_t analogRead0[20] = {0,};
robo8080 5:61109bce11fe 85 uint8_t analogRead1[20] = {0,};
robo8080 5:61109bce11fe 86 uint8_t analogRead2[20] = {0,};
robo8080 5:61109bce11fe 87
robo8080 5:61109bce11fe 88 uint8_t i2cConfig[20] = {0,};
robo8080 5:61109bce11fe 89 uint8_t i2cStartStop[20] = {0,};
robo8080 5:61109bce11fe 90 uint8_t i2cWrite[20] = {0,};
robo8080 5:61109bce11fe 91 uint8_t i2cReadParam[20] = {0,};
robo8080 5:61109bce11fe 92 uint8_t i2cRead[20] = {0,};
robo8080 5:61109bce11fe 93
robo8080 5:61109bce11fe 94 uint8_t uartConfig[20] = {0,};
robo8080 5:61109bce11fe 95 uint8_t uartBaudrate[20] = {0,};
robo8080 5:61109bce11fe 96 uint8_t uartTx[20] = {0,};
robo8080 5:61109bce11fe 97 uint8_t uartRx[20] = {0,};
robo8080 5:61109bce11fe 98
robo8080 5:61109bce11fe 99 uint8_t hardwareRest[20] = {0,};
robo8080 5:61109bce11fe 100 uint8_t hardwareLowBat[20] = {0,};
robo8080 5:61109bce11fe 101
robo8080 5:61109bce11fe 102 GattCharacteristic pioSettingCharacteristic (KONASHI_PIO_SETTING_UUID, pioSetting, 1, 1,
robo8080 5:61109bce11fe 103 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 104 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 105 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 106 GattCharacteristic pioPullupCharacteristic (KONASHI_PIO_PULLUP_UUID, pioPullup, 1, 1,
robo8080 5:61109bce11fe 107 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 108 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 109 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 110 GattCharacteristic pioOutputCharacteristic (KONASHI_PIO_OUTPUT_UUID, pioOutput, 1, 1,
robo8080 5:61109bce11fe 111 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 112 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 113 GattCharacteristic pioInputCharacteristic (KONASHI_PIO_INPUT_NOTIFICATION_UUID, pioInput, 1, 1,
robo8080 5:61109bce11fe 114 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 115 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
robo8080 5:61109bce11fe 116
robo8080 5:61109bce11fe 117 GattCharacteristic pwmConfigCharacteristic (KONASHI_PWM_CONFIG_UUID, pwmConfig, 1, 1,
robo8080 5:61109bce11fe 118 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 119 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 120 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 121 GattCharacteristic pwmPeriodCharacteristic (KONASHI_PWM_PARAM_UUID, pwmPeriod, 5, 5,
robo8080 5:61109bce11fe 122 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 123 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 124 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 125 GattCharacteristic pwmDutyCharacteristic (KONASHI_PWM_DUTY_UUID, pwmDuty, 5, 5,
robo8080 5:61109bce11fe 126 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 127 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 128 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 129
robo8080 5:61109bce11fe 130 GattCharacteristic analogDriveCharacteristic (KONASHI_ANALOG_DRIVE_UUID, analogDrive, 1, 1,
robo8080 5:61109bce11fe 131 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 132 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 133 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 134 GattCharacteristic analogRead0Characteristic (KONASHI_ANALOG_READ0_UUID, analogRead0, 2, 2,
robo8080 5:61109bce11fe 135 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 136 GattCharacteristic analogRead1Characteristic (KONASHI_ANALOG_READ1_UUID, analogRead1, 2, 2,
robo8080 5:61109bce11fe 137 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 138 GattCharacteristic analogRead2Characteristic (KONASHI_ANALOG_READ2_UUID, analogRead2, 2, 2,
robo8080 5:61109bce11fe 139 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 140
robo8080 5:61109bce11fe 141 GattCharacteristic i2cConfigCharacteristic (KONASHI_I2C_CONFIG_UUID, i2cConfig, 1, 1,
robo8080 5:61109bce11fe 142 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 143 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 144 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 145 GattCharacteristic i2cStartStopCharacteristic (KONASHI_I2C_START_STOP_UUID, i2cStartStop, 1, 1,
robo8080 5:61109bce11fe 146 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 147 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 148 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 149 GattCharacteristic i2cWriteCharacteristic (KONASHI_I2C_WRITE_UUID, i2cWrite, 3, 20,
robo8080 5:61109bce11fe 150 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 151 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 152 GattCharacteristic i2cReadParamCharacteristic (KONASHI_I2C_READ_PARAM_UIUD, i2cReadParam, 2, 2,
robo8080 5:61109bce11fe 153 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 154 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 155 GattCharacteristic i2cReadCharacteristic (KONASHI_I2C_READ_UUID, i2cRead, 0, 20,
robo8080 5:61109bce11fe 156 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 157
robo8080 5:61109bce11fe 158 GattCharacteristic uartConfigCharacteristic (KONASHI_UART_CONFIG_UUID, uartConfig, 1, 1,
robo8080 5:61109bce11fe 159 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 160 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 161 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 162 GattCharacteristic uartBaudrateCharacteristic (KONASHI_UART_BAUDRATE_UUID, uartBaudrate, 1, 1,
robo8080 5:61109bce11fe 163 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 164 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 165 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 166 GattCharacteristic uartTxCharacteristic (KONASHI_UART_TX_UUID, uartTx, 1, 1,
robo8080 5:61109bce11fe 167 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 168 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 169 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 170 GattCharacteristic uartRxCharacteristic (KONASHI_UART_RX_NOTIFICATION_UUID, uartRx, 0, 20,
robo8080 5:61109bce11fe 171 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
Rohit Grover 2:e060367b9024 172 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
robo8080 5:61109bce11fe 173
robo8080 5:61109bce11fe 174 GattCharacteristic hardwareRestCharacteristic (KONASHI_HARDWARE_RESET_UUID, hardwareRest, 1, 1,
robo8080 5:61109bce11fe 175 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
robo8080 5:61109bce11fe 176 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
robo8080 5:61109bce11fe 177 GattCharacteristic hardwareLowBatCharacteristic (KONASHI_HARDWARE_LOW_BAT_NOTIFICATION_UUID, hardwareLowBat, 1, 1,
robo8080 5:61109bce11fe 178 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
robo8080 5:61109bce11fe 179 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
robo8080 5:61109bce11fe 180
robo8080 6:9c9630cb454b 181 GattCharacteristic *konashiChars[] = {// &pioSettingCharacteristic,
robo8080 6:9c9630cb454b 182 // &pioPullupCharacteristic,
robo8080 5:61109bce11fe 183 &pioOutputCharacteristic,
robo8080 6:9c9630cb454b 184 &pioInputCharacteristic,
robo8080 5:61109bce11fe 185 &pwmConfigCharacteristic,
robo8080 5:61109bce11fe 186 &pwmPeriodCharacteristic,
robo8080 5:61109bce11fe 187 &pwmDutyCharacteristic,
robo8080 6:9c9630cb454b 188 /* &analogDriveCharacteristic,
robo8080 5:61109bce11fe 189 &analogRead0Characteristic,
robo8080 5:61109bce11fe 190 &analogRead1Characteristic,
robo8080 5:61109bce11fe 191 &analogRead2Characteristic,
robo8080 5:61109bce11fe 192 &i2cConfigCharacteristic,
robo8080 5:61109bce11fe 193 &i2cStartStopCharacteristic,
robo8080 5:61109bce11fe 194 &i2cWriteCharacteristic,
robo8080 5:61109bce11fe 195 &i2cReadParamCharacteristic,
robo8080 5:61109bce11fe 196 &i2cReadCharacteristic,
robo8080 5:61109bce11fe 197 &uartConfigCharacteristic,
robo8080 6:9c9630cb454b 198 &uartBaudrateCharacteristic,
robo8080 5:61109bce11fe 199 &uartTxCharacteristic,
robo8080 5:61109bce11fe 200 &uartRxCharacteristic,
robo8080 6:9c9630cb454b 201 &hardwareRestCharacteristic,
robo8080 5:61109bce11fe 202 &hardwareLowBatCharacteristic,*/ };
robo8080 5:61109bce11fe 203 GattService konashiService(KONASHI_SERVICE_UUID, konashiChars, sizeof(konashiChars) / sizeof(GattCharacteristic *));
robo8080 5:61109bce11fe 204
robo8080 5:61109bce11fe 205 GattCharacteristic *konashiChars1[] = {&pioOutputCharacteristic, &uartTxCharacteristic, &uartRxCharacteristic};
robo8080 5:61109bce11fe 206 GattService konashiService1(KONASHI_SERVICE_UUID, konashiChars1, sizeof(konashiChars1) / sizeof(GattCharacteristic *));
robo8080 5:61109bce11fe 207
robo8080 5:61109bce11fe 208
robo8080 5:61109bce11fe 209 // SYSTEM
robo8080 5:61109bce11fe 210 static char systemId = 'A';
robo8080 5:61109bce11fe 211 GattCharacteristic systemID(GattCharacteristic::UUID_SYSTEM_ID_CHAR, (uint8_t *)systemId, sizeof(systemId), sizeof(systemId),
robo8080 5:61109bce11fe 212 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 213 // MODEL
robo8080 5:61109bce11fe 214 static char model[31] = "mbed HRM1017";
robo8080 5:61109bce11fe 215 GattCharacteristic modelID(GattCharacteristic::UUID_MODEL_NUMBER_STRING_CHAR, (uint8_t *)model, strlen(model), strlen(model),
robo8080 5:61109bce11fe 216 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 217 // Firmware
robo8080 5:61109bce11fe 218 static char fwversion[31] = "1.0";
robo8080 5:61109bce11fe 219 GattCharacteristic fwChars(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)fwversion, strlen(fwversion), strlen(fwversion),
robo8080 5:61109bce11fe 220 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 221 // Software
robo8080 5:61109bce11fe 222 static char swversion[31] = "1.0";
robo8080 5:61109bce11fe 223 GattCharacteristic swChars(GattCharacteristic::UUID_SOFTWARE_REVISION_STRING_CHAR, (uint8_t *)swversion, strlen(swversion), strlen(swversion),
robo8080 5:61109bce11fe 224 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 225 // Hardware
robo8080 5:61109bce11fe 226 static char hwversion[31] = "1.0";
robo8080 5:61109bce11fe 227 GattCharacteristic hwChars(GattCharacteristic::UUID_HARDWARE_REVISION_STRING_CHAR, (uint8_t *)hwversion, strlen(hwversion), strlen(hwversion),
robo8080 5:61109bce11fe 228 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 229 // Manufacturer
robo8080 5:61109bce11fe 230 static char vendor[31] = "Test Company Inc.";
robo8080 5:61109bce11fe 231 GattCharacteristic vendorChars(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, (uint8_t *)vendor, strlen(vendor), strlen(vendor),
robo8080 5:61109bce11fe 232 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 233 // Serial number
robo8080 5:61109bce11fe 234 static char serial[31] = "1234567890";
robo8080 5:61109bce11fe 235 GattCharacteristic serialChars(GattCharacteristic::UUID_SERIAL_NUMBER_STRING_CHAR, (uint8_t *)serial, strlen(serial), strlen(serial),
robo8080 5:61109bce11fe 236 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
robo8080 5:61109bce11fe 237
robo8080 5:61109bce11fe 238 //GattCharacteristic *informationChars[] = {&systemID, &modelID, &serialChars, &fwChars, &hwChars, &swChars, &vendorChars, };
robo8080 5:61109bce11fe 239 GattCharacteristic *informationChars[] = {&modelID, &fwChars, &hwChars, &swChars, &vendorChars, };
robo8080 5:61109bce11fe 240 GattService informationService(GattService::UUID_DEVICE_INFORMATION_SERVICE, informationChars, sizeof(informationChars) / sizeof(GattCharacteristic *));
robo8080 5:61109bce11fe 241
robo8080 5:61109bce11fe 242
robo8080 5:61109bce11fe 243 static uint8_t batteryLevel = 100;
robo8080 5:61109bce11fe 244 GattCharacteristic batteryPercentage(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, (uint8_t *)batteryLevel, sizeof(batteryLevel), sizeof(batteryLevel),
robo8080 5:61109bce11fe 245 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
robo8080 5:61109bce11fe 246 GattCharacteristic *batteryChars[] = {&batteryPercentage };
robo8080 5:61109bce11fe 247 GattService batteryService(GattService::UUID_BATTERY_SERVICE, batteryChars, sizeof(batteryChars) / sizeof(GattCharacteristic *));
robo8080 5:61109bce11fe 248
robo8080 5:61109bce11fe 249 void connectionCallback(uint16_t charHandle)
robo8080 5:61109bce11fe 250 //void connectionCallback(void)
robo8080 5:61109bce11fe 251 {
robo8080 5:61109bce11fe 252 DEBUG("Connected!\n\r");
robo8080 6:9c9630cb454b 253 led2 = 0;
robo8080 5:61109bce11fe 254 }
robo8080 5:61109bce11fe 255 void disconnectionCallback(uint16_t charHandle)
robo8080 5:61109bce11fe 256 //void disconnectionCallback(void)
yihui 0:e910d9bb040f 257 {
Rohit Grover 2:e060367b9024 258 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 259 DEBUG("Restarting the advertising process\n\r");
robo8080 6:9c9630cb454b 260 led2 = 1;
Rohit Grover 2:e060367b9024 261 ble.startAdvertising();
Rohit Grover 2:e060367b9024 262 }
robo8080 6:9c9630cb454b 263 static void set_pwm_duty(int ch)
robo8080 6:9c9630cb454b 264 {
robo8080 6:9c9630cb454b 265 // uint32_t period;
robo8080 6:9c9630cb454b 266 uint32_t duty;
robo8080 6:9c9630cb454b 267 unsigned bitmask = 1;
yihui 0:e910d9bb040f 268
robo8080 6:9c9630cb454b 269 if(ch>=3){
robo8080 6:9c9630cb454b 270 return;
robo8080 6:9c9630cb454b 271 }
robo8080 6:9c9630cb454b 272 duty=pwm_duty[ch];
robo8080 6:9c9630cb454b 273
robo8080 6:9c9630cb454b 274 if(pwm_config & (bitmask << ch))
robo8080 6:9c9630cb454b 275 {
robo8080 6:9c9630cb454b 276 pwm[ch].pulsewidth_us(duty);
robo8080 6:9c9630cb454b 277 }
robo8080 6:9c9630cb454b 278 else
robo8080 6:9c9630cb454b 279 {
robo8080 6:9c9630cb454b 280 pwm[ch].pulsewidth_us(0);
robo8080 6:9c9630cb454b 281 }
robo8080 6:9c9630cb454b 282 }
robo8080 6:9c9630cb454b 283 static void set_pwm_period(int ch)
robo8080 6:9c9630cb454b 284 {
robo8080 6:9c9630cb454b 285 uint32_t period,duty;
robo8080 6:9c9630cb454b 286
robo8080 6:9c9630cb454b 287 if(ch>=3){
robo8080 6:9c9630cb454b 288 return;
robo8080 6:9c9630cb454b 289 }
robo8080 6:9c9630cb454b 290 period=pwm_period[ch];
robo8080 6:9c9630cb454b 291 duty=pwm_duty[ch];
robo8080 6:9c9630cb454b 292 pwm[ch].period_us(period);
robo8080 6:9c9630cb454b 293 pwm[ch].pulsewidth_us(duty);
robo8080 6:9c9630cb454b 294 }
robo8080 6:9c9630cb454b 295 static void set_pwm_config(uint8_t config)
robo8080 6:9c9630cb454b 296 {
robo8080 6:9c9630cb454b 297 pwm_config = config;
robo8080 6:9c9630cb454b 298 for(int i = 0; i < 3 ; i++)
robo8080 6:9c9630cb454b 299 {
robo8080 6:9c9630cb454b 300 set_pwm_duty(i);
robo8080 6:9c9630cb454b 301 }
robo8080 6:9c9630cb454b 302
robo8080 6:9c9630cb454b 303 }
Rohit Grover 2:e060367b9024 304 void onDataWritten(uint16_t charHandle)
yihui 0:e910d9bb040f 305 {
robo8080 5:61109bce11fe 306 DEBUG("onDataWritten\n\r");
robo8080 5:61109bce11fe 307 if (charHandle == pioOutputCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 308 DEBUG("pioOutputCharacteristic!\n\r");
robo8080 5:61109bce11fe 309 uint8_t getPioOut[10];
robo8080 5:61109bce11fe 310 uint16_t bytesRead;
robo8080 5:61109bce11fe 311 ble.readCharacteristicValue(pioOutputCharacteristic.getHandle(), getPioOut, &bytesRead);
robo8080 5:61109bce11fe 312 DEBUG("DATA: %d %d\n\r",getPioOut[0],pioOutput[0]);
robo8080 5:61109bce11fe 313 if(getPioOut[0]!=pioOutput[0]) {
robo8080 5:61109bce11fe 314 pioOutput[0]=getPioOut[0];
robo8080 5:61109bce11fe 315 ioOut = getPioOut[0];
robo8080 5:61109bce11fe 316 }
robo8080 6:9c9630cb454b 317 /* } else if (charHandle == pioSettingCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 318 DEBUG("pioSettingCharacteristic!\n\r");
robo8080 5:61109bce11fe 319 } else if (charHandle == pioPullupCharacteristic.getHandle()) {
robo8080 6:9c9630cb454b 320 DEBUG("pioPullupCharacteristic!\n\r");*/
robo8080 5:61109bce11fe 321 } else if (charHandle == pwmConfigCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 322 DEBUG("pwmConfigCharacteristic!\n\r");
robo8080 6:9c9630cb454b 323 uint16_t bytesRead;
robo8080 6:9c9630cb454b 324 ble.readCharacteristicValue(pwmConfigCharacteristic.getHandle(), pwmConfig, &bytesRead);
robo8080 6:9c9630cb454b 325 set_pwm_config(pwmConfig[0]);
robo8080 5:61109bce11fe 326 } else if (charHandle == pwmPeriodCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 327 DEBUG("pwmPeriodCharacteristic!\n\r");
robo8080 6:9c9630cb454b 328 uint32_t l;
robo8080 6:9c9630cb454b 329 uint16_t bytesRead;
robo8080 6:9c9630cb454b 330 ble.readCharacteristicValue(pwmPeriodCharacteristic.getHandle(), pwmPeriod, &bytesRead);
robo8080 6:9c9630cb454b 331 int i=pwmPeriod[0];
robo8080 6:9c9630cb454b 332 l =((uint32_t)pwmPeriod[1])<<24;
robo8080 6:9c9630cb454b 333 l|=((uint32_t)pwmPeriod[2])<<16;
robo8080 6:9c9630cb454b 334 l|=((uint32_t)pwmPeriod[3])<< 8;
robo8080 6:9c9630cb454b 335 l|=((uint32_t)pwmPeriod[4])<< 0;
robo8080 6:9c9630cb454b 336 if(i<3){
robo8080 6:9c9630cb454b 337 pwmPeriod[i]=l;
robo8080 6:9c9630cb454b 338 set_pwm_period(i);
robo8080 6:9c9630cb454b 339 }
robo8080 5:61109bce11fe 340 } else if (charHandle == pwmDutyCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 341 DEBUG("pwmDutyCharacteristic!\n\r");
robo8080 6:9c9630cb454b 342 uint32_t l;
robo8080 6:9c9630cb454b 343 uint16_t bytesRead;
robo8080 6:9c9630cb454b 344 ble.readCharacteristicValue(pwmDutyCharacteristic.getHandle(), pwmDuty, &bytesRead);
robo8080 6:9c9630cb454b 345 int i=pwmDuty[0];
robo8080 6:9c9630cb454b 346 l =((uint32_t)pwmDuty[1])<<24;
robo8080 6:9c9630cb454b 347 l|=((uint32_t)pwmDuty[2])<<16;
robo8080 6:9c9630cb454b 348 l|=((uint32_t)pwmDuty[3])<< 8;
robo8080 6:9c9630cb454b 349 l|=((uint32_t)pwmDuty[4])<< 0;
robo8080 6:9c9630cb454b 350 if(i<3){
robo8080 6:9c9630cb454b 351 pwm_duty[i]=l;
robo8080 6:9c9630cb454b 352 set_pwm_duty(i);
robo8080 6:9c9630cb454b 353 }
robo8080 6:9c9630cb454b 354 /* } else if (charHandle == analogDriveCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 355 DEBUG("analogDriveCharacteristic!\n\r");
robo8080 5:61109bce11fe 356 } else if (charHandle == i2cConfigCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 357 DEBUG("i2cConfigCharacteristic!\n\r");
robo8080 5:61109bce11fe 358 } else if (charHandle == i2cStartStopCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 359 DEBUG("pioSettingCharacteristic!\n\r");
robo8080 5:61109bce11fe 360 } else if (charHandle == i2cWriteCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 361 DEBUG("i2cStartStopCharacteristic!\n\r");
robo8080 5:61109bce11fe 362 } else if (charHandle == i2cReadParamCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 363 DEBUG("i2cReadParamCharacteristic!\n\r");
robo8080 5:61109bce11fe 364 } else if (charHandle == uartConfigCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 365 DEBUG("uartConfigCharacteristic!\n\r");
robo8080 5:61109bce11fe 366 } else if (charHandle == uartBaudrateCharacteristic.getHandle()) {
robo8080 5:61109bce11fe 367 DEBUG("uartBaudrateCharacteristic!\n\r");
robo8080 6:9c9630cb454b 368 } else if (charHandle == uartTxCharacteristic.getHandle()) {
robo8080 6:9c9630cb454b 369 DEBUG("uartTxCharacteristic!\n\r");
robo8080 6:9c9630cb454b 370 uint16_t bytesRead;
robo8080 6:9c9630cb454b 371 ble.readCharacteristicValue(uartTxCharacteristic.getHandle(), uartTx, &bytesRead);
robo8080 6:9c9630cb454b 372 DEBUG("ECHO: %s\n\r", (char *)uartTx);
robo8080 6:9c9630cb454b 373 // pc.putc(uartTx[0]);
robo8080 6:9c9630cb454b 374 ble.updateCharacteristicValue(uartRxCharacteristic.getHandle(), uartTx, bytesRead);
robo8080 5:61109bce11fe 375 } else if (charHandle == hardwareRestCharacteristic.getHandle()) {
robo8080 6:9c9630cb454b 376 DEBUG("hardwareRestCharacteristic!\n\r");*/
robo8080 5:61109bce11fe 377 }
Rohit Grover 2:e060367b9024 378 }
yihui 0:e910d9bb040f 379
Rohit Grover 2:e060367b9024 380 void periodicCallback(void)
Rohit Grover 2:e060367b9024 381 {
Rohit Grover 2:e060367b9024 382 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
robo8080 5:61109bce11fe 383 if (ble.getGapState().connected) {
robo8080 5:61109bce11fe 384 /* Update the battery measurement */
robo8080 5:61109bce11fe 385 batteryLevel--;
robo8080 5:61109bce11fe 386 if (batteryLevel == 1) {
robo8080 5:61109bce11fe 387 batteryLevel = 100;
robo8080 5:61109bce11fe 388 }
robo8080 5:61109bce11fe 389 // ble.updateCharacteristicValue(batteryPercentage.getHandle(), &batteryLevel, sizeof(batteryLevel));
robo8080 5:61109bce11fe 390 // ble.updateCharacteristicValue(hardwareLowBatCharacteristic.getHandle(), &batteryLevel, sizeof(batteryLevel));
robo8080 5:61109bce11fe 391 /* if(pc.readable()) {
robo8080 5:61109bce11fe 392 char data;
robo8080 5:61109bce11fe 393 data = pc.getc();
robo8080 5:61109bce11fe 394 ble.updateCharacteristicValue(uartRxCharacteristic.getHandle(), (uint8_t*)&data, 1);
robo8080 5:61109bce11fe 395 }*/
robo8080 5:61109bce11fe 396 }
Rohit Grover 2:e060367b9024 397 }
yihui 0:e910d9bb040f 398
yihui 0:e910d9bb040f 399 int main(void)
yihui 0:e910d9bb040f 400 {
Rohit Grover 2:e060367b9024 401 led1 = 1;
robo8080 6:9c9630cb454b 402 led2 = 1;
Rohit Grover 2:e060367b9024 403 Ticker ticker;
Rohit Grover 2:e060367b9024 404 ticker.attach(periodicCallback, 1);
yihui 0:e910d9bb040f 405
Rohit Grover 2:e060367b9024 406 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 407 ble.init();
robo8080 5:61109bce11fe 408 ble.onConnection(connectionCallback);
Rohit Grover 2:e060367b9024 409 ble.onDisconnection(disconnectionCallback);
Rohit Grover 2:e060367b9024 410 ble.onDataWritten(onDataWritten);
yihui 0:e910d9bb040f 411
Rohit Grover 2:e060367b9024 412 /* setup advertising */
Rohit Grover 2:e060367b9024 413 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
robo8080 8:a62b8f7d5dcf 414 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Rohit Grover 2:e060367b9024 415 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
yihui 0:e910d9bb040f 416
Rohit Grover 2:e060367b9024 417 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
Rohit Grover 2:e060367b9024 418 ble.startAdvertising();
yihui 0:e910d9bb040f 419
robo8080 5:61109bce11fe 420 // ble.addService(batteryService);
robo8080 5:61109bce11fe 421 ble.addService(informationService);
robo8080 6:9c9630cb454b 422 // ble.addService(konashiService1);
robo8080 6:9c9630cb454b 423 ble.addService(konashiService);
yihui 0:e910d9bb040f 424
Rohit Grover 2:e060367b9024 425 while (true) {
Rohit Grover 2:e060367b9024 426 ble.waitForEvent();
yihui 0:e910d9bb040f 427 }
yihui 0:e910d9bb040f 428 }