Diseño de Firmaware Diseañado en base a los requerimientos definidos durante la etapa de analisis.

Dependencies:   BLE_API mbed

Fork of nRF51822_SimpleControls by Gustavo Belduma

Committer:
dixysleo
Date:
Mon Feb 22 15:26:37 2016 +0000
Revision:
0:58e350255405
Child:
1:eda9c65b6db9
nRF51822_SimpleControls

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dixysleo 0:58e350255405 1 /*
dixysleo 0:58e350255405 2
dixysleo 0:58e350255405 3 Copyright (c) 2012-2014 RedBearLab
dixysleo 0:58e350255405 4
dixysleo 0:58e350255405 5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
dixysleo 0:58e350255405 6 and associated documentation files (the "Software"), to deal in the Software without restriction,
dixysleo 0:58e350255405 7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
dixysleo 0:58e350255405 8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
dixysleo 0:58e350255405 9 subject to the following conditions:
dixysleo 0:58e350255405 10 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
dixysleo 0:58e350255405 11
dixysleo 0:58e350255405 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
dixysleo 0:58e350255405 13 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
dixysleo 0:58e350255405 14 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
dixysleo 0:58e350255405 15 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
dixysleo 0:58e350255405 16 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dixysleo 0:58e350255405 17
dixysleo 0:58e350255405 18 */
dixysleo 0:58e350255405 19
dixysleo 0:58e350255405 20 #include "mbed.h"
dixysleo 0:58e350255405 21 #include "ble/BLE.h"
dixysleo 0:58e350255405 22 #include "Servo.h"
dixysleo 0:58e350255405 23 #include "GattCallbackParamTypes.h"
dixysleo 0:58e350255405 24
dixysleo 0:58e350255405 25 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
dixysleo 0:58e350255405 26 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
dixysleo 0:58e350255405 27 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
dixysleo 0:58e350255405 28
dixysleo 0:58e350255405 29 #define TXRX_BUF_LEN 20
dixysleo 0:58e350255405 30
dixysleo 0:58e350255405 31 #define DIGITAL_OUT_PIN P0_17 //D7
dixysleo 0:58e350255405 32 #define DIGITAL_IN_PIN P0_5 //A4
dixysleo 0:58e350255405 33 #define PWM_PIN P0_16 //D6
dixysleo 0:58e350255405 34 #define SERVO_PIN P0_14 //D10
dixysleo 0:58e350255405 35 #define ANALOG_IN_PIN P0_6 //A5
dixysleo 0:58e350255405 36
dixysleo 0:58e350255405 37 BLE ble;
dixysleo 0:58e350255405 38
dixysleo 0:58e350255405 39 DigitalOut LED_SET(DIGITAL_OUT_PIN);
dixysleo 0:58e350255405 40 DigitalIn BUTTON(DIGITAL_IN_PIN);
dixysleo 0:58e350255405 41 PwmOut PWM(PWM_PIN);
dixysleo 0:58e350255405 42 AnalogIn ANALOG(ANALOG_IN_PIN);
dixysleo 0:58e350255405 43 Servo MYSERVO(SERVO_PIN);
dixysleo 0:58e350255405 44
dixysleo 0:58e350255405 45 Serial pc(USBTX, USBRX);
dixysleo 0:58e350255405 46
dixysleo 0:58e350255405 47 static uint8_t analog_enabled = 0;
dixysleo 0:58e350255405 48 static uint8_t old_state = 0;
dixysleo 0:58e350255405 49
dixysleo 0:58e350255405 50 // The Nordic UART Service
dixysleo 0:58e350255405 51 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 52 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 53 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 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};
dixysleo 0:58e350255405 55
dixysleo 0:58e350255405 56
dixysleo 0:58e350255405 57 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
dixysleo 0:58e350255405 58 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
dixysleo 0:58e350255405 59
dixysleo 0:58e350255405 60 //static uint8_t rx_buf[TXRX_BUF_LEN];
dixysleo 0:58e350255405 61 //static uint8_t rx_len=0;
dixysleo 0:58e350255405 62
dixysleo 0:58e350255405 63
dixysleo 0:58e350255405 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);
dixysleo 0:58e350255405 65
dixysleo 0:58e350255405 66 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
dixysleo 0:58e350255405 67
dixysleo 0:58e350255405 68 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
dixysleo 0:58e350255405 69
dixysleo 0:58e350255405 70 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
dixysleo 0:58e350255405 71
dixysleo 0:58e350255405 72
dixysleo 0:58e350255405 73 /*
dixysleo 0:58e350255405 74 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
dixysleo 0:58e350255405 75 {
dixysleo 0:58e350255405 76 pc.printf("Disconnected \r\n");
dixysleo 0:58e350255405 77 pc.printf("Restart advertising \r\n");
dixysleo 0:58e350255405 78 ble.startAdvertising();
dixysleo 0:58e350255405 79 }
dixysleo 0:58e350255405 80 */
dixysleo 0:58e350255405 81
dixysleo 0:58e350255405 82 // La de arriba era la original, pero se cambio para que funcione, solucion sacada de la web
dixysleo 0:58e350255405 83 // https://developer.mbed.org/forum/repo-61676-BLE_GAP_Example-community/topic/17193/
dixysleo 0:58e350255405 84 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
dixysleo 0:58e350255405 85 {
dixysleo 0:58e350255405 86 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
dixysleo 0:58e350255405 87 pc.printf("Disconnected \r\n");
dixysleo 0:58e350255405 88 pc.printf("Restart advertising \r\n");
dixysleo 0:58e350255405 89 ble.startAdvertising();
dixysleo 0:58e350255405 90
dixysleo 0:58e350255405 91 }
dixysleo 0:58e350255405 92
dixysleo 0:58e350255405 93
dixysleo 0:58e350255405 94 void WrittenHandler(const GattWriteCallbackParams *Handler)
dixysleo 0:58e350255405 95 {
dixysleo 0:58e350255405 96 uint8_t buf[TXRX_BUF_LEN];
dixysleo 0:58e350255405 97 uint16_t bytesRead, index;
dixysleo 0:58e350255405 98
dixysleo 0:58e350255405 99 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle())
dixysleo 0:58e350255405 100 {
dixysleo 0:58e350255405 101 ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
dixysleo 0:58e350255405 102 memset(txPayload, 0, TXRX_BUF_LEN);
dixysleo 0:58e350255405 103 memcpy(txPayload, buf, TXRX_BUF_LEN);
dixysleo 0:58e350255405 104
dixysleo 0:58e350255405 105 //por dixys
dixysleo 0:58e350255405 106 pc.printf("Buffer recibido desde Android: \r\n");
dixysleo 0:58e350255405 107
dixysleo 0:58e350255405 108 for(index=0; index<bytesRead; index++)
dixysleo 0:58e350255405 109 pc.putc(buf[index]);
dixysleo 0:58e350255405 110
dixysleo 0:58e350255405 111 if(buf[0] == 0x01)
dixysleo 0:58e350255405 112 {
dixysleo 0:58e350255405 113 if(buf[1] == 0x01){
dixysleo 0:58e350255405 114 LED_SET = 1;
dixysleo 0:58e350255405 115 //por dixys
dixysleo 0:58e350255405 116 pc.printf("LED SET 1 \r\n");
dixysleo 0:58e350255405 117 }else{
dixysleo 0:58e350255405 118 LED_SET = 0;
dixysleo 0:58e350255405 119 //por dixys
dixysleo 0:58e350255405 120 pc.printf("LED SET 0 \r\n");
dixysleo 0:58e350255405 121 }
dixysleo 0:58e350255405 122 }
dixysleo 0:58e350255405 123 else if(buf[0] == 0xA0)
dixysleo 0:58e350255405 124 {
dixysleo 0:58e350255405 125 if(buf[1] == 0x01){
dixysleo 0:58e350255405 126 analog_enabled = 1;
dixysleo 0:58e350255405 127 //por dixys
dixysleo 0:58e350255405 128 pc.printf("ANALOG ENABLE \r\n");
dixysleo 0:58e350255405 129 }
dixysleo 0:58e350255405 130 else {
dixysleo 0:58e350255405 131 //analog_enabled = 0;
dixysleo 0:58e350255405 132 // lo vamos a poner fio enable para hacer pruebas luego lo quitamos
dixysleo 0:58e350255405 133 //por dixys
dixysleo 0:58e350255405 134 pc.printf("ANALOG DISAABLE \r\n");
dixysleo 0:58e350255405 135 }
dixysleo 0:58e350255405 136 }
dixysleo 0:58e350255405 137 else if(buf[0] == 0x02)
dixysleo 0:58e350255405 138 {
dixysleo 0:58e350255405 139 float value = (float)buf[1]/255;
dixysleo 0:58e350255405 140 PWM = value;
dixysleo 0:58e350255405 141 //por dixys
dixysleo 0:58e350255405 142 pc.printf("PWM = %f \r\n", value);
dixysleo 0:58e350255405 143 }
dixysleo 0:58e350255405 144 else if(buf[0] == 0x03)
dixysleo 0:58e350255405 145 {
dixysleo 0:58e350255405 146 MYSERVO.write(buf[1]);
dixysleo 0:58e350255405 147 //por dixys
dixysleo 0:58e350255405 148 pc.printf("SERVO buffer \r\n");
dixysleo 0:58e350255405 149 }
dixysleo 0:58e350255405 150 else if(buf[0] == 0x04)
dixysleo 0:58e350255405 151 {
dixysleo 0:58e350255405 152 analog_enabled = 0;
dixysleo 0:58e350255405 153 PWM = 0;
dixysleo 0:58e350255405 154 MYSERVO.write(0);
dixysleo 0:58e350255405 155 LED_SET = 0;
dixysleo 0:58e350255405 156 old_state = 0;
dixysleo 0:58e350255405 157 //por dixys
dixysleo 0:58e350255405 158 pc.printf("opcion 4 \r\n");
dixysleo 0:58e350255405 159 }
dixysleo 0:58e350255405 160
dixysleo 0:58e350255405 161 }
dixysleo 0:58e350255405 162 }
dixysleo 0:58e350255405 163 /*
dixysleo 0:58e350255405 164 void uartCB(void)
dixysleo 0:58e350255405 165 {
dixysleo 0:58e350255405 166 while(pc.readable())
dixysleo 0:58e350255405 167 {
dixysleo 0:58e350255405 168 rx_buf[rx_len++] = pc.getc();
dixysleo 0:58e350255405 169 if(rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n')
dixysleo 0:58e350255405 170 {
dixysleo 0:58e350255405 171 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len);
dixysleo 0:58e350255405 172 pc.printf("RecHandler \r\n");
dixysleo 0:58e350255405 173 pc.printf("Length: ");
dixysleo 0:58e350255405 174 pc.putc(rx_len);
dixysleo 0:58e350255405 175 pc.printf("\r\n");
dixysleo 0:58e350255405 176 rx_len = 0;
dixysleo 0:58e350255405 177 break;
dixysleo 0:58e350255405 178 }
dixysleo 0:58e350255405 179 }
dixysleo 0:58e350255405 180 }
dixysleo 0:58e350255405 181 */
dixysleo 0:58e350255405 182 void m_status_check_handle(void)
dixysleo 0:58e350255405 183 {
dixysleo 0:58e350255405 184 uint8_t buf[3];
dixysleo 0:58e350255405 185 if (analog_enabled) // if analog reading enabled
dixysleo 0:58e350255405 186 {
dixysleo 0:58e350255405 187 // Read and send out
dixysleo 0:58e350255405 188 float s = ANALOG;
dixysleo 0:58e350255405 189 uint16_t value = s*1024;
dixysleo 0:58e350255405 190 buf[0] = (0x0B);
dixysleo 0:58e350255405 191 buf[1] = (value >> 8);
dixysleo 0:58e350255405 192 buf[2] = (value);
dixysleo 0:58e350255405 193 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
dixysleo 0:58e350255405 194 }
dixysleo 0:58e350255405 195
dixysleo 0:58e350255405 196 // If digital in changes, report the state
dixysleo 0:58e350255405 197 if (BUTTON != old_state)
dixysleo 0:58e350255405 198 {
dixysleo 0:58e350255405 199 old_state = BUTTON;
dixysleo 0:58e350255405 200
dixysleo 0:58e350255405 201 if (BUTTON == 1)
dixysleo 0:58e350255405 202 {
dixysleo 0:58e350255405 203 buf[0] = (0x0A);
dixysleo 0:58e350255405 204 buf[1] = (0x01);
dixysleo 0:58e350255405 205 buf[2] = (0x00);
dixysleo 0:58e350255405 206 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
dixysleo 0:58e350255405 207 }
dixysleo 0:58e350255405 208 else
dixysleo 0:58e350255405 209 {
dixysleo 0:58e350255405 210 buf[0] = (0x0A);
dixysleo 0:58e350255405 211 buf[1] = (0x00);
dixysleo 0:58e350255405 212 buf[2] = (0x00);
dixysleo 0:58e350255405 213 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
dixysleo 0:58e350255405 214 }
dixysleo 0:58e350255405 215 }
dixysleo 0:58e350255405 216 }
dixysleo 0:58e350255405 217
dixysleo 0:58e350255405 218
dixysleo 0:58e350255405 219 int main(void)
dixysleo 0:58e350255405 220 {
dixysleo 0:58e350255405 221 Ticker ticker;
dixysleo 0:58e350255405 222 ticker.attach_us(m_status_check_handle, 200000);
dixysleo 0:58e350255405 223
dixysleo 0:58e350255405 224 ble.init();
dixysleo 0:58e350255405 225 ble.onDisconnection(disconnectionCallback);
dixysleo 0:58e350255405 226
dixysleo 0:58e350255405 227 ble.onDataWritten(WrittenHandler);
dixysleo 0:58e350255405 228
dixysleo 0:58e350255405 229 pc.baud(9600);
dixysleo 0:58e350255405 230 pc.printf("SimpleChat Init \r\n");
dixysleo 0:58e350255405 231
dixysleo 0:58e350255405 232 //pc.attach( uartCB , pc.RxIrq);
dixysleo 0:58e350255405 233
dixysleo 0:58e350255405 234 // setup advertising
dixysleo 0:58e350255405 235 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
dixysleo 0:58e350255405 236 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dixysleo 0:58e350255405 237 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
dixysleo 0:58e350255405 238 //(const uint8_t *)"RedBearLab_1", sizeof("RedBearLab_1") - 1); // Original: Biscuit
dixysleo 0:58e350255405 239 (const uint8_t *)"Biscuit", sizeof("Biscuit") - 1); // Original: Biscuit
dixysleo 0:58e350255405 240 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
dixysleo 0:58e350255405 241 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
dixysleo 0:58e350255405 242 // 100ms; in multiples of 0.625ms.
dixysleo 0:58e350255405 243 ble.setAdvertisingInterval(160);
dixysleo 0:58e350255405 244
dixysleo 0:58e350255405 245 ble.addService(uartService);
dixysleo 0:58e350255405 246
dixysleo 0:58e350255405 247 ble.startAdvertising();
dixysleo 0:58e350255405 248
dixysleo 0:58e350255405 249 pc.printf("Advertising Start \r\n");
dixysleo 0:58e350255405 250
dixysleo 0:58e350255405 251 //por dixys
dixysleo 0:58e350255405 252 // para probar, luego quitar. Esto hace que cada ticker se envie un dato analogico via BLE
dixysleo 0:58e350255405 253 analog_enabled = 1;
dixysleo 0:58e350255405 254
dixysleo 0:58e350255405 255
dixysleo 0:58e350255405 256 while(1)
dixysleo 0:58e350255405 257 {
dixysleo 0:58e350255405 258 ble.waitForEvent();
dixysleo 0:58e350255405 259 }
dixysleo 0:58e350255405 260 }
dixysleo 0:58e350255405 261
dixysleo 0:58e350255405 262
dixysleo 0:58e350255405 263
dixysleo 0:58e350255405 264
dixysleo 0:58e350255405 265
dixysleo 0:58e350255405 266
dixysleo 0:58e350255405 267
dixysleo 0:58e350255405 268
dixysleo 0:58e350255405 269
dixysleo 0:58e350255405 270
dixysleo 0:58e350255405 271
dixysleo 0:58e350255405 272
dixysleo 0:58e350255405 273
dixysleo 0:58e350255405 274
dixysleo 0:58e350255405 275
dixysleo 0:58e350255405 276
dixysleo 0:58e350255405 277
dixysleo 0:58e350255405 278
dixysleo 0:58e350255405 279
dixysleo 0:58e350255405 280
dixysleo 0:58e350255405 281
dixysleo 0:58e350255405 282
dixysleo 0:58e350255405 283
dixysleo 0:58e350255405 284
dixysleo 0:58e350255405 285
dixysleo 0:58e350255405 286
dixysleo 0:58e350255405 287
dixysleo 0:58e350255405 288
dixysleo 0:58e350255405 289
dixysleo 0:58e350255405 290
dixysleo 0:58e350255405 291
dixysleo 0:58e350255405 292