Communication between BLE nano to raspberry pi

Dependencies:   BLE_API mbed nRF51822

Committer:
nkosarek
Date:
Thu Apr 13 23:24:25 2017 +0000
Revision:
0:048c1ce80632
working writes to pi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nkosarek 0:048c1ce80632 1 /*
nkosarek 0:048c1ce80632 2
nkosarek 0:048c1ce80632 3 Copyright (c) 2012-2014 RedBearLab
nkosarek 0:048c1ce80632 4
nkosarek 0:048c1ce80632 5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
nkosarek 0:048c1ce80632 6 and associated documentation files (the "Software"), to deal in the Software without restriction,
nkosarek 0:048c1ce80632 7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
nkosarek 0:048c1ce80632 8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
nkosarek 0:048c1ce80632 9 subject to the following conditions:
nkosarek 0:048c1ce80632 10 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
nkosarek 0:048c1ce80632 11
nkosarek 0:048c1ce80632 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
nkosarek 0:048c1ce80632 13 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
nkosarek 0:048c1ce80632 14 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
nkosarek 0:048c1ce80632 15 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
nkosarek 0:048c1ce80632 16 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
nkosarek 0:048c1ce80632 17
nkosarek 0:048c1ce80632 18 */
nkosarek 0:048c1ce80632 19
nkosarek 0:048c1ce80632 20 #include "mbed.h"
nkosarek 0:048c1ce80632 21 #include "ble/BLE.h"
nkosarek 0:048c1ce80632 22
nkosarek 0:048c1ce80632 23 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
nkosarek 0:048c1ce80632 24 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
nkosarek 0:048c1ce80632 25 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
nkosarek 0:048c1ce80632 26 #define BLE_UUID_PI_ALERT_WRITE_NORESP 0x1802 /**< The UUID of the Write Without Response Alert level pi characteristic. */
nkosarek 0:048c1ce80632 27
nkosarek 0:048c1ce80632 28 #define TXRX_BUF_LEN 20
nkosarek 0:048c1ce80632 29
nkosarek 0:048c1ce80632 30 //#define DIGITAL_OUT_PIN P0_9 //TXD
nkosarek 0:048c1ce80632 31 #define DIGITAL_IN_PIN P0_10 //CTS
nkosarek 0:048c1ce80632 32 //#define PWM_PIN P0_11 //RXD
nkosarek 0:048c1ce80632 33 //#define SERVO_PIN P0_8 //RTS
nkosarek 0:048c1ce80632 34 #define ANALOG_IN_PIN P0_4 //P04
nkosarek 0:048c1ce80632 35
nkosarek 0:048c1ce80632 36 BLE ble;
nkosarek 0:048c1ce80632 37 uint8_t value = 0;
nkosarek 0:048c1ce80632 38
nkosarek 0:048c1ce80632 39 //DigitalOut LED_SET(DIGITAL_OUT_PIN);
nkosarek 0:048c1ce80632 40 DigitalIn BUTTON(DIGITAL_IN_PIN);
nkosarek 0:048c1ce80632 41 //PwmOut PWM(PWM_PIN);
nkosarek 0:048c1ce80632 42 AnalogIn ANALOG(ANALOG_IN_PIN);
nkosarek 0:048c1ce80632 43 //Servo MYSERVO(SERVO_PIN);
nkosarek 0:048c1ce80632 44
nkosarek 0:048c1ce80632 45 Serial pc(USBTX, USBRX);
nkosarek 0:048c1ce80632 46 bool connected = false;
nkosarek 0:048c1ce80632 47
nkosarek 0:048c1ce80632 48 static uint8_t analog_enabled = 0;
nkosarek 0:048c1ce80632 49 static uint8_t old_state = 0;
nkosarek 0:048c1ce80632 50
nkosarek 0:048c1ce80632 51 // The Nordic UART Service
nkosarek 0:048c1ce80632 52 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
nkosarek 0:048c1ce80632 53 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
nkosarek 0:048c1ce80632 54 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
nkosarek 0:048c1ce80632 55 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
nkosarek 0:048c1ce80632 56
nkosarek 0:048c1ce80632 57
nkosarek 0:048c1ce80632 58 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
nkosarek 0:048c1ce80632 59 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
nkosarek 0:048c1ce80632 60
nkosarek 0:048c1ce80632 61 //static uint8_t rx_buf[TXRX_BUF_LEN];
nkosarek 0:048c1ce80632 62 //static uint8_t rx_len=0;
nkosarek 0:048c1ce80632 63
nkosarek 0:048c1ce80632 64
nkosarek 0:048c1ce80632 65 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
nkosarek 0:048c1ce80632 66
nkosarek 0:048c1ce80632 67 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
nkosarek 0:048c1ce80632 68
nkosarek 0:048c1ce80632 69 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
nkosarek 0:048c1ce80632 70
nkosarek 0:048c1ce80632 71 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
nkosarek 0:048c1ce80632 72
nkosarek 0:048c1ce80632 73
nkosarek 0:048c1ce80632 74
nkosarek 0:048c1ce80632 75 /*
nkosarek 0:048c1ce80632 76 void WrittenHandler(const GattWriteCallbackParams *Handler)
nkosarek 0:048c1ce80632 77 {
nkosarek 0:048c1ce80632 78 uint8_t buf[TXRX_BUF_LEN];
nkosarek 0:048c1ce80632 79 uint16_t bytesRead;
nkosarek 0:048c1ce80632 80
nkosarek 0:048c1ce80632 81 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle())
nkosarek 0:048c1ce80632 82 {
nkosarek 0:048c1ce80632 83 ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
nkosarek 0:048c1ce80632 84 memset(txPayload, 0, TXRX_BUF_LEN);
nkosarek 0:048c1ce80632 85 memcpy(txPayload, buf, TXRX_BUF_LEN);
nkosarek 0:048c1ce80632 86
nkosarek 0:048c1ce80632 87 //for(index=0; index<bytesRead; index++)
nkosarek 0:048c1ce80632 88 //pc.putc(buf[index]);
nkosarek 0:048c1ce80632 89
nkosarek 0:048c1ce80632 90 if(buf[0] == 0x01)
nkosarek 0:048c1ce80632 91 {
nkosarek 0:048c1ce80632 92 if(buf[1] == 0x01)
nkosarek 0:048c1ce80632 93 LED_SET = 1;
nkosarek 0:048c1ce80632 94 else
nkosarek 0:048c1ce80632 95 LED_SET = 0;
nkosarek 0:048c1ce80632 96 }
nkosarek 0:048c1ce80632 97 else if(buf[0] == 0xA0)
nkosarek 0:048c1ce80632 98 {
nkosarek 0:048c1ce80632 99 if(buf[1] == 0x01)
nkosarek 0:048c1ce80632 100 analog_enabled = 1;
nkosarek 0:048c1ce80632 101 else
nkosarek 0:048c1ce80632 102 analog_enabled = 0;
nkosarek 0:048c1ce80632 103 }
nkosarek 0:048c1ce80632 104 else if(buf[0] == 0x02)
nkosarek 0:048c1ce80632 105 {
nkosarek 0:048c1ce80632 106 float value = (float)buf[1]/255;
nkosarek 0:048c1ce80632 107 PWM = value;
nkosarek 0:048c1ce80632 108 }
nkosarek 0:048c1ce80632 109 else if(buf[0] == 0x03)
nkosarek 0:048c1ce80632 110 {
nkosarek 0:048c1ce80632 111 MYSERVO.write(buf[1]);
nkosarek 0:048c1ce80632 112 }
nkosarek 0:048c1ce80632 113 else if(buf[0] == 0x04)
nkosarek 0:048c1ce80632 114 {
nkosarek 0:048c1ce80632 115 analog_enabled = 0;
nkosarek 0:048c1ce80632 116 PWM = 0;
nkosarek 0:048c1ce80632 117 MYSERVO.write(0);
nkosarek 0:048c1ce80632 118 LED_SET = 0;
nkosarek 0:048c1ce80632 119 old_state = 0;
nkosarek 0:048c1ce80632 120 }
nkosarek 0:048c1ce80632 121
nkosarek 0:048c1ce80632 122 }
nkosarek 0:048c1ce80632 123 }
nkosarek 0:048c1ce80632 124 */
nkosarek 0:048c1ce80632 125 /*
nkosarek 0:048c1ce80632 126 void uartCB(void)
nkosarek 0:048c1ce80632 127 {
nkosarek 0:048c1ce80632 128 while(pc.readable())
nkosarek 0:048c1ce80632 129 {
nkosarek 0:048c1ce80632 130 rx_buf[rx_len++] = pc.getc();
nkosarek 0:048c1ce80632 131 if(rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n')
nkosarek 0:048c1ce80632 132 {
nkosarek 0:048c1ce80632 133 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len);
nkosarek 0:048c1ce80632 134 pc.printf("RecHandler \r\n");
nkosarek 0:048c1ce80632 135 pc.printf("Length: ");
nkosarek 0:048c1ce80632 136 pc.putc(rx_len);
nkosarek 0:048c1ce80632 137 pc.printf("\r\n");
nkosarek 0:048c1ce80632 138 rx_len = 0;
nkosarek 0:048c1ce80632 139 break;
nkosarek 0:048c1ce80632 140 }
nkosarek 0:048c1ce80632 141 }
nkosarek 0:048c1ce80632 142 }
nkosarek 0:048c1ce80632 143 */
nkosarek 0:048c1ce80632 144 void m_status_check_handle(void)
nkosarek 0:048c1ce80632 145 {
nkosarek 0:048c1ce80632 146 uint8_t buf[3];
nkosarek 0:048c1ce80632 147 if (analog_enabled) // if analog reading enabled
nkosarek 0:048c1ce80632 148 {
nkosarek 0:048c1ce80632 149 // Read and send out
nkosarek 0:048c1ce80632 150 float s = ANALOG;
nkosarek 0:048c1ce80632 151 uint16_t value = s*1024;
nkosarek 0:048c1ce80632 152 buf[0] = (0x0B);
nkosarek 0:048c1ce80632 153 buf[1] = (value >> 8);
nkosarek 0:048c1ce80632 154 buf[2] = (value);
nkosarek 0:048c1ce80632 155 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
nkosarek 0:048c1ce80632 156 }
nkosarek 0:048c1ce80632 157
nkosarek 0:048c1ce80632 158 // If digital in changes, report the state
nkosarek 0:048c1ce80632 159 if (BUTTON != old_state)
nkosarek 0:048c1ce80632 160 {
nkosarek 0:048c1ce80632 161 old_state = BUTTON;
nkosarek 0:048c1ce80632 162
nkosarek 0:048c1ce80632 163 if (BUTTON == 1)
nkosarek 0:048c1ce80632 164 {
nkosarek 0:048c1ce80632 165 buf[0] = (0x0A);
nkosarek 0:048c1ce80632 166 buf[1] = (0x01);
nkosarek 0:048c1ce80632 167 buf[2] = (0x00);
nkosarek 0:048c1ce80632 168 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
nkosarek 0:048c1ce80632 169 }
nkosarek 0:048c1ce80632 170 else
nkosarek 0:048c1ce80632 171 {
nkosarek 0:048c1ce80632 172 buf[0] = (0x0A);
nkosarek 0:048c1ce80632 173 buf[1] = (0x00);
nkosarek 0:048c1ce80632 174 buf[2] = (0x00);
nkosarek 0:048c1ce80632 175 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
nkosarek 0:048c1ce80632 176 }
nkosarek 0:048c1ce80632 177 }
nkosarek 0:048c1ce80632 178 }
nkosarek 0:048c1ce80632 179
nkosarek 0:048c1ce80632 180 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
nkosarek 0:048c1ce80632 181 {
nkosarek 0:048c1ce80632 182 connected = false;
nkosarek 0:048c1ce80632 183 pc.printf("Disconnected \r\n");
nkosarek 0:048c1ce80632 184 pc.printf("Restart advertising \r\n");
nkosarek 0:048c1ce80632 185 ble.gap().startAdvertising();
nkosarek 0:048c1ce80632 186 }
nkosarek 0:048c1ce80632 187
nkosarek 0:048c1ce80632 188 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
nkosarek 0:048c1ce80632 189 {
nkosarek 0:048c1ce80632 190 connected = true;
nkosarek 0:048c1ce80632 191 pc.printf("Connected\r\n");
nkosarek 0:048c1ce80632 192 Gap::Handle_t connHandle = params->handle;
nkosarek 0:048c1ce80632 193 GattClient& client = ble.gattClient();
nkosarek 0:048c1ce80632 194 while( connected ) {
nkosarek 0:048c1ce80632 195 ble.waitForEvent();
nkosarek 0:048c1ce80632 196 value++;
nkosarek 0:048c1ce80632 197 if( value > 100 ) {
nkosarek 0:048c1ce80632 198 value = 0;
nkosarek 0:048c1ce80632 199 }
nkosarek 0:048c1ce80632 200 pc.printf("Writing %d to GATT Client\r\n", value);
nkosarek 0:048c1ce80632 201
nkosarek 0:048c1ce80632 202 ble_error_t err = client.write((GattClient::WriteOp_t)0x2,
nkosarek 0:048c1ce80632 203 connHandle,
nkosarek 0:048c1ce80632 204 0x15,
nkosarek 0:048c1ce80632 205 sizeof(uint8_t),
nkosarek 0:048c1ce80632 206 &value);
nkosarek 0:048c1ce80632 207 if( err == 0 ) {
nkosarek 0:048c1ce80632 208 pc.printf("SUCCESS\r\n");
nkosarek 0:048c1ce80632 209 } else {
nkosarek 0:048c1ce80632 210 pc.printf("FAILURE: %d\r\n", err);
nkosarek 0:048c1ce80632 211 }
nkosarek 0:048c1ce80632 212 }
nkosarek 0:048c1ce80632 213 }
nkosarek 0:048c1ce80632 214
nkosarek 0:048c1ce80632 215 int main(void)
nkosarek 0:048c1ce80632 216 {
nkosarek 0:048c1ce80632 217 Ticker ticker;
nkosarek 0:048c1ce80632 218 ticker.attach_us(m_status_check_handle, 200000);
nkosarek 0:048c1ce80632 219
nkosarek 0:048c1ce80632 220 ble.init();
nkosarek 0:048c1ce80632 221 ble.onDisconnection(disconnectionCallback);
nkosarek 0:048c1ce80632 222 //ble.onDataWritten(WrittenHandler);
nkosarek 0:048c1ce80632 223
nkosarek 0:048c1ce80632 224 pc.baud(9600);
nkosarek 0:048c1ce80632 225 pc.printf("BLE_Custom Init \r\n");
nkosarek 0:048c1ce80632 226
nkosarek 0:048c1ce80632 227 //pc.attach( uartCB , pc.RxIrq);
nkosarek 0:048c1ce80632 228
nkosarek 0:048c1ce80632 229 // setup advertising
nkosarek 0:048c1ce80632 230 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
nkosarek 0:048c1ce80632 231 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
nkosarek 0:048c1ce80632 232 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
nkosarek 0:048c1ce80632 233 (const uint8_t *)"LUMBERJACK_NANO", sizeof("LUMBERJACK_NANO") - 1);
nkosarek 0:048c1ce80632 234 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
nkosarek 0:048c1ce80632 235 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
nkosarek 0:048c1ce80632 236 // 100ms; in multiples of 0.625ms.
nkosarek 0:048c1ce80632 237 ble.setAdvertisingInterval(160);
nkosarek 0:048c1ce80632 238
nkosarek 0:048c1ce80632 239 ble.addService(uartService);
nkosarek 0:048c1ce80632 240
nkosarek 0:048c1ce80632 241 ble.onDisconnection(disconnectionCallback);
nkosarek 0:048c1ce80632 242 ble.onConnection(connectionCallback);
nkosarek 0:048c1ce80632 243
nkosarek 0:048c1ce80632 244 ble.startAdvertising();
nkosarek 0:048c1ce80632 245 //GattServer& server = ble.gattServer();
nkosarek 0:048c1ce80632 246 //pc.printf("Advertising Start \r\n");
nkosarek 0:048c1ce80632 247 while(1)
nkosarek 0:048c1ce80632 248 {
nkosarek 0:048c1ce80632 249 ble.waitForEvent();
nkosarek 0:048c1ce80632 250 }
nkosarek 0:048c1ce80632 251 }
nkosarek 0:048c1ce80632 252
nkosarek 0:048c1ce80632 253
nkosarek 0:048c1ce80632 254
nkosarek 0:048c1ce80632 255
nkosarek 0:048c1ce80632 256
nkosarek 0:048c1ce80632 257
nkosarek 0:048c1ce80632 258
nkosarek 0:048c1ce80632 259
nkosarek 0:048c1ce80632 260
nkosarek 0:048c1ce80632 261
nkosarek 0:048c1ce80632 262
nkosarek 0:048c1ce80632 263
nkosarek 0:048c1ce80632 264
nkosarek 0:048c1ce80632 265
nkosarek 0:048c1ce80632 266
nkosarek 0:048c1ce80632 267
nkosarek 0:048c1ce80632 268
nkosarek 0:048c1ce80632 269
nkosarek 0:048c1ce80632 270
nkosarek 0:048c1ce80632 271
nkosarek 0:048c1ce80632 272
nkosarek 0:048c1ce80632 273
nkosarek 0:048c1ce80632 274
nkosarek 0:048c1ce80632 275
nkosarek 0:048c1ce80632 276
nkosarek 0:048c1ce80632 277
nkosarek 0:048c1ce80632 278
nkosarek 0:048c1ce80632 279
nkosarek 0:048c1ce80632 280
nkosarek 0:048c1ce80632 281
nkosarek 0:048c1ce80632 282