Gestione invio dati tramite seriale bluetooth

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 mbed

Fork of BLE_HeartRate_IDB0XA1 by ST

main.cpp

Committer:
fdalforno
Date:
2017-02-19
Revision:
23:8315afc7bc95
Parent:
22:3f0b2c0bf9f3

File content as of revision 23:8315afc7bc95:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2015 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <string.h>
#include "mbed.h"
#include "ble/BLE.h"
#include "UARTService.h"

#define BUFFER_LEN 256

DigitalOut led1(LED1);
UARTService* uart;
Serial pc(USBTX, USBRX);

const static char     DEVICE_NAME[] = "Rob1";

char buffer[BUFFER_LEN];

/*Callback quando il dispositivo client si disconnette */
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
    BLE::Instance().gap().startAdvertising();
    
    pc.printf("Periferica disconnessa \r\n");
}

void connectionCallback(const Gap::ConnectionCallbackParams_t *params){
    if(params->role == Gap::CENTRAL){
        pc.printf("Connesso dispositivo %u \r\n");
    }
}

void periodicCallback(void){
    led1 = !led1;
    
    /*Per spedire qualcosa al client*/
    //char* str = "Ciao \r\n";
    //if (uart) uart->writeString(str);
}

/**
 * Chiamata in caso di errore, ottengo il codice sulla console
 */
void onBleInitError(BLE &ble, ble_error_t error){
     pc.printf("Errore interno %u \r\n",error);
}


void onDataWritten(const GattWriteCallbackParams *params){
    if ((uart != NULL) && (params->handle == uart->getTXCharacteristicHandle())) {
        uint16_t bytesRead = params->len;
        
        pc.printf("ricevuti %u bytes\n\r ", bytesRead);
        
        if(bytesRead >= 255){
            pc.printf("Overflow comando %u n\r ", bytesRead);
            bytesRead = 255;
        }
        
        unsigned index = 0;
        for (; index < bytesRead; index++) {
            buffer[index] = params->data[index];
        }
        
        buffer[index++] = 0;
        
        pc.printf("Data : %s ",buffer);
        pc.printf("\r\n");
    }
}



/**
 * Chiamata quando il bluetooth è inizializzato
 */
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){
    
    BLE&        ble   = params->ble;
    ble_error_t error = params->error;
 
    if (error != BLE_ERROR_NONE) {
        onBleInitError(ble, error);
        return;
    }
 
    /* Controllo di avere solo una istanza bluetooth attiva */
    if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
        return;
    }
 
    ble.gap().onDisconnection(disconnectionCallback);
    ble.gap().onConnection(connectionCallback);
    
    /*Quando mi arriva qualcosa dal client viene invocata questa funzione*/
    ble.onDataWritten(onDataWritten);
 
    /* Imposto il servizio uart (Ne posso avere più di uno attivo) */
    uart = new UARTService(ble);
 
    /* Imposto i pacchetti di avviso attenzione posso avere connesso solo un client per volta al server */
    
    /* Imposto il disposiztivo come solo BLE e SCOPRIBILE*/
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    
    /* Imposto il nome della periferica*/
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
    /* Imposto i servizi scopribili*/
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
   
   //Da approfondire
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    
    /*Ogni quanto inviare un pacchetto di avviso*/
    ble.gap().setAdvertisingInterval(100); /* 1000ms. */
    
    /*Inizio a spedire i pacchetti*/
    ble.gap().startAdvertising();
 
}


int main(void){
    BLE &ble = BLE::Instance();
    ble.init(bleInitComplete);
    
    /* Aspetto fino a che la periferica bluetooth non è inizializzata */
    while (ble.hasInitialized()  == false) { /* spin loop */ }
    
    Ticker ticker;
    ticker.attach(periodicCallback, 1);
    
    while (true) {
        ble.waitForEvent();
    }
}