Uart serie example, loopback

Dependencies:   mbed BLE_API nRF51822

main.cpp

Committer:
CamiloRuiz
Date:
2020-06-09
Revision:
0:5b60e4b36aea

File content as of revision 0:5b60e4b36aea:


#include "mbed.h"
#include "nrf51.h"
#include "nrf51_bitfields.h"

#include "BLE.h"
#include "UARTService.h"


#define LOG(...)    { pc.printf(__VA_ARGS__); }

#define LED_GREEN   p21
#define LED_RED     p22
#define LED_BLUE    p23
#define BUTTON_PIN  p17
#define BATTERY_PIN p1

#define MPU6050_SDA p12
#define MPU6050_SCL p13

#define UART_TX     p9
#define UART_RX     p11
#define UART_CTS    p8
#define UART_RTS    p10



DigitalOut blue(LED_BLUE);
DigitalOut green(LED_GREEN);
DigitalOut red(LED_RED);

InterruptIn button(BUTTON_PIN);
AnalogIn    battery(BATTERY_PIN);
Serial pc(UART_TX, UART_RX);

InterruptIn motion_probe(p14);

int read_none_count = 0;

BLEDevice  ble;
UARTService *uartServicePtr;

volatile bool bleIsConnected = false;
volatile uint8_t tick_event = 0;



void check_i2c_bus(void);
unsigned short inv_orientation_matrix_to_scalar( const signed char *mtx);


void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
{
    LOG("Connected!\n");
    bleIsConnected = true;
}

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams)
{
    LOG("Disconnected!\n");
    LOG("Restarting the advertising process\n");
    ble.startAdvertising();
    bleIsConnected = false;
}

void tick(void)
{
    static uint32_t count = 0;
    
    LOG("%d\r\n", count++);
    green = !green;
}
void detect(void)
{
    static uint32_t count = 0;
    
    LOG("%d\r\n", count++);
    blue = !blue;
}
void flush_uart_ble(){
    //envia un \n para forzar el envio del buffer y vaciarlo, en hex 0x0a 
    char end='\n';
    uartServicePtr->write(&end,1);
    }
    
void onDataWrittenCallback(const GattWriteCallbackParams *params) {//ocurre cuando llega un dato por bluetooth
    if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
        
        for (int16_t x=0;x<params->len;x++)
            pc.printf("%02X ", params->data[x]);
        uartServicePtr->write(params->data,params->len);
        flush_uart_ble();
        //uartServicePtr->flush();

    }
}


int main(void)
{
    blue  = 1;
    green = 1;
    red   = 1;

    pc.baud(115200);
    
    wait(1);
    
    LOG("---- Seeed Tiny BLE ----\n");
    
        
    Ticker ticker;
    ticker.attach(tick, 3);

    button.fall(detect);

    LOG("Initialising the nRF51822\n");
    ble.init();
    ble.gap().onDisconnection(disconnectionCallback);
    ble.gap().onConnection(connectionCallback);
    ble.onDataWritten(onDataWrittenCallback);


    /* setup advertising */
    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
                                     (const uint8_t *)"smurfs", sizeof("smurfs"));
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
                                     (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
                              
    UARTService uartService(ble);
    uartServicePtr = &uartService;
    //uartService.retargetStdout();

    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
    ble.gap().startAdvertising();
    
    while (true) {
       //hacer algo
       ble.waitForEvent();
    }
}