Uart serie example, loopback

Dependencies:   mbed BLE_API nRF51822

Committer:
CamiloRuiz
Date:
Tue Jun 09 13:10:59 2020 +0000
Revision:
0:5b60e4b36aea
Uart ble serial example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CamiloRuiz 0:5b60e4b36aea 1
CamiloRuiz 0:5b60e4b36aea 2 #include "mbed.h"
CamiloRuiz 0:5b60e4b36aea 3 #include "nrf51.h"
CamiloRuiz 0:5b60e4b36aea 4 #include "nrf51_bitfields.h"
CamiloRuiz 0:5b60e4b36aea 5
CamiloRuiz 0:5b60e4b36aea 6 #include "BLE.h"
CamiloRuiz 0:5b60e4b36aea 7 #include "UARTService.h"
CamiloRuiz 0:5b60e4b36aea 8
CamiloRuiz 0:5b60e4b36aea 9
CamiloRuiz 0:5b60e4b36aea 10 #define LOG(...) { pc.printf(__VA_ARGS__); }
CamiloRuiz 0:5b60e4b36aea 11
CamiloRuiz 0:5b60e4b36aea 12 #define LED_GREEN p21
CamiloRuiz 0:5b60e4b36aea 13 #define LED_RED p22
CamiloRuiz 0:5b60e4b36aea 14 #define LED_BLUE p23
CamiloRuiz 0:5b60e4b36aea 15 #define BUTTON_PIN p17
CamiloRuiz 0:5b60e4b36aea 16 #define BATTERY_PIN p1
CamiloRuiz 0:5b60e4b36aea 17
CamiloRuiz 0:5b60e4b36aea 18 #define MPU6050_SDA p12
CamiloRuiz 0:5b60e4b36aea 19 #define MPU6050_SCL p13
CamiloRuiz 0:5b60e4b36aea 20
CamiloRuiz 0:5b60e4b36aea 21 #define UART_TX p9
CamiloRuiz 0:5b60e4b36aea 22 #define UART_RX p11
CamiloRuiz 0:5b60e4b36aea 23 #define UART_CTS p8
CamiloRuiz 0:5b60e4b36aea 24 #define UART_RTS p10
CamiloRuiz 0:5b60e4b36aea 25
CamiloRuiz 0:5b60e4b36aea 26
CamiloRuiz 0:5b60e4b36aea 27
CamiloRuiz 0:5b60e4b36aea 28 DigitalOut blue(LED_BLUE);
CamiloRuiz 0:5b60e4b36aea 29 DigitalOut green(LED_GREEN);
CamiloRuiz 0:5b60e4b36aea 30 DigitalOut red(LED_RED);
CamiloRuiz 0:5b60e4b36aea 31
CamiloRuiz 0:5b60e4b36aea 32 InterruptIn button(BUTTON_PIN);
CamiloRuiz 0:5b60e4b36aea 33 AnalogIn battery(BATTERY_PIN);
CamiloRuiz 0:5b60e4b36aea 34 Serial pc(UART_TX, UART_RX);
CamiloRuiz 0:5b60e4b36aea 35
CamiloRuiz 0:5b60e4b36aea 36 InterruptIn motion_probe(p14);
CamiloRuiz 0:5b60e4b36aea 37
CamiloRuiz 0:5b60e4b36aea 38 int read_none_count = 0;
CamiloRuiz 0:5b60e4b36aea 39
CamiloRuiz 0:5b60e4b36aea 40 BLEDevice ble;
CamiloRuiz 0:5b60e4b36aea 41 UARTService *uartServicePtr;
CamiloRuiz 0:5b60e4b36aea 42
CamiloRuiz 0:5b60e4b36aea 43 volatile bool bleIsConnected = false;
CamiloRuiz 0:5b60e4b36aea 44 volatile uint8_t tick_event = 0;
CamiloRuiz 0:5b60e4b36aea 45
CamiloRuiz 0:5b60e4b36aea 46
CamiloRuiz 0:5b60e4b36aea 47
CamiloRuiz 0:5b60e4b36aea 48 void check_i2c_bus(void);
CamiloRuiz 0:5b60e4b36aea 49 unsigned short inv_orientation_matrix_to_scalar( const signed char *mtx);
CamiloRuiz 0:5b60e4b36aea 50
CamiloRuiz 0:5b60e4b36aea 51
CamiloRuiz 0:5b60e4b36aea 52 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
CamiloRuiz 0:5b60e4b36aea 53 {
CamiloRuiz 0:5b60e4b36aea 54 LOG("Connected!\n");
CamiloRuiz 0:5b60e4b36aea 55 bleIsConnected = true;
CamiloRuiz 0:5b60e4b36aea 56 }
CamiloRuiz 0:5b60e4b36aea 57
CamiloRuiz 0:5b60e4b36aea 58 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams)
CamiloRuiz 0:5b60e4b36aea 59 {
CamiloRuiz 0:5b60e4b36aea 60 LOG("Disconnected!\n");
CamiloRuiz 0:5b60e4b36aea 61 LOG("Restarting the advertising process\n");
CamiloRuiz 0:5b60e4b36aea 62 ble.startAdvertising();
CamiloRuiz 0:5b60e4b36aea 63 bleIsConnected = false;
CamiloRuiz 0:5b60e4b36aea 64 }
CamiloRuiz 0:5b60e4b36aea 65
CamiloRuiz 0:5b60e4b36aea 66 void tick(void)
CamiloRuiz 0:5b60e4b36aea 67 {
CamiloRuiz 0:5b60e4b36aea 68 static uint32_t count = 0;
CamiloRuiz 0:5b60e4b36aea 69
CamiloRuiz 0:5b60e4b36aea 70 LOG("%d\r\n", count++);
CamiloRuiz 0:5b60e4b36aea 71 green = !green;
CamiloRuiz 0:5b60e4b36aea 72 }
CamiloRuiz 0:5b60e4b36aea 73 void detect(void)
CamiloRuiz 0:5b60e4b36aea 74 {
CamiloRuiz 0:5b60e4b36aea 75 static uint32_t count = 0;
CamiloRuiz 0:5b60e4b36aea 76
CamiloRuiz 0:5b60e4b36aea 77 LOG("%d\r\n", count++);
CamiloRuiz 0:5b60e4b36aea 78 blue = !blue;
CamiloRuiz 0:5b60e4b36aea 79 }
CamiloRuiz 0:5b60e4b36aea 80 void flush_uart_ble(){
CamiloRuiz 0:5b60e4b36aea 81 //envia un \n para forzar el envio del buffer y vaciarlo, en hex 0x0a
CamiloRuiz 0:5b60e4b36aea 82 char end='\n';
CamiloRuiz 0:5b60e4b36aea 83 uartServicePtr->write(&end,1);
CamiloRuiz 0:5b60e4b36aea 84 }
CamiloRuiz 0:5b60e4b36aea 85
CamiloRuiz 0:5b60e4b36aea 86 void onDataWrittenCallback(const GattWriteCallbackParams *params) {//ocurre cuando llega un dato por bluetooth
CamiloRuiz 0:5b60e4b36aea 87 if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
CamiloRuiz 0:5b60e4b36aea 88
CamiloRuiz 0:5b60e4b36aea 89 for (int16_t x=0;x<params->len;x++)
CamiloRuiz 0:5b60e4b36aea 90 pc.printf("%02X ", params->data[x]);
CamiloRuiz 0:5b60e4b36aea 91 uartServicePtr->write(params->data,params->len);
CamiloRuiz 0:5b60e4b36aea 92 flush_uart_ble();
CamiloRuiz 0:5b60e4b36aea 93 //uartServicePtr->flush();
CamiloRuiz 0:5b60e4b36aea 94
CamiloRuiz 0:5b60e4b36aea 95 }
CamiloRuiz 0:5b60e4b36aea 96 }
CamiloRuiz 0:5b60e4b36aea 97
CamiloRuiz 0:5b60e4b36aea 98
CamiloRuiz 0:5b60e4b36aea 99 int main(void)
CamiloRuiz 0:5b60e4b36aea 100 {
CamiloRuiz 0:5b60e4b36aea 101 blue = 1;
CamiloRuiz 0:5b60e4b36aea 102 green = 1;
CamiloRuiz 0:5b60e4b36aea 103 red = 1;
CamiloRuiz 0:5b60e4b36aea 104
CamiloRuiz 0:5b60e4b36aea 105 pc.baud(115200);
CamiloRuiz 0:5b60e4b36aea 106
CamiloRuiz 0:5b60e4b36aea 107 wait(1);
CamiloRuiz 0:5b60e4b36aea 108
CamiloRuiz 0:5b60e4b36aea 109 LOG("---- Seeed Tiny BLE ----\n");
CamiloRuiz 0:5b60e4b36aea 110
CamiloRuiz 0:5b60e4b36aea 111
CamiloRuiz 0:5b60e4b36aea 112 Ticker ticker;
CamiloRuiz 0:5b60e4b36aea 113 ticker.attach(tick, 3);
CamiloRuiz 0:5b60e4b36aea 114
CamiloRuiz 0:5b60e4b36aea 115 button.fall(detect);
CamiloRuiz 0:5b60e4b36aea 116
CamiloRuiz 0:5b60e4b36aea 117 LOG("Initialising the nRF51822\n");
CamiloRuiz 0:5b60e4b36aea 118 ble.init();
CamiloRuiz 0:5b60e4b36aea 119 ble.gap().onDisconnection(disconnectionCallback);
CamiloRuiz 0:5b60e4b36aea 120 ble.gap().onConnection(connectionCallback);
CamiloRuiz 0:5b60e4b36aea 121 ble.onDataWritten(onDataWrittenCallback);
CamiloRuiz 0:5b60e4b36aea 122
CamiloRuiz 0:5b60e4b36aea 123
CamiloRuiz 0:5b60e4b36aea 124 /* setup advertising */
CamiloRuiz 0:5b60e4b36aea 125 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
CamiloRuiz 0:5b60e4b36aea 126 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
CamiloRuiz 0:5b60e4b36aea 127 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
CamiloRuiz 0:5b60e4b36aea 128 (const uint8_t *)"smurfs", sizeof("smurfs"));
CamiloRuiz 0:5b60e4b36aea 129 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
CamiloRuiz 0:5b60e4b36aea 130 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
CamiloRuiz 0:5b60e4b36aea 131
CamiloRuiz 0:5b60e4b36aea 132 UARTService uartService(ble);
CamiloRuiz 0:5b60e4b36aea 133 uartServicePtr = &uartService;
CamiloRuiz 0:5b60e4b36aea 134 //uartService.retargetStdout();
CamiloRuiz 0:5b60e4b36aea 135
CamiloRuiz 0:5b60e4b36aea 136 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
CamiloRuiz 0:5b60e4b36aea 137 ble.gap().startAdvertising();
CamiloRuiz 0:5b60e4b36aea 138
CamiloRuiz 0:5b60e4b36aea 139 while (true) {
CamiloRuiz 0:5b60e4b36aea 140 //hacer algo
CamiloRuiz 0:5b60e4b36aea 141 ble.waitForEvent();
CamiloRuiz 0:5b60e4b36aea 142 }
CamiloRuiz 0:5b60e4b36aea 143 }
CamiloRuiz 0:5b60e4b36aea 144
CamiloRuiz 0:5b60e4b36aea 145
CamiloRuiz 0:5b60e4b36aea 146
CamiloRuiz 0:5b60e4b36aea 147
CamiloRuiz 0:5b60e4b36aea 148