publishing repo to mbed

Dependencies:   BLE_API mbed nRF51822

Committer:
dgdosen
Date:
Fri Feb 20 21:20:22 2015 +0000
Revision:
0:a7eab842b9e5
stock ble nano starter project

Who changed what in which revision?

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