This software setup a central node of a star topology network

Dependencies:   MQTT target_st_bluenrg

Fork of ble-star-mbed by Lorenzo Invidia

source/main.cpp

Committer:
lorevee
Date:
2018-03-13
Revision:
3:3f35e80ed848
Parent:
1:110b5e896bc9
Child:
4:4af40af2530e

File content as of revision 3:3f35e80ed848:

/* 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 <events/mbed_events.h>
#include <mbed.h>
#include "ble/BLE.h"
#include "ble/DiscoveredCharacteristic.h"
#include "ble/DiscoveredService.h"
#include <UUID.h>
#include <BleMasterService.h>
#include <BleSlaveService.h>

const char NAME_BLESTAR1[] =    "BleStar1";

/*----------------------------------------------------------------------------*/




/* scheduleBleEventsProcessing */
void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
    BLE &ble = BLE::Instance();
    eventQ.call(Callback<void()>(&ble, &BLE::processEvents));
}
/*----------------------------------------------------------------------------*/
/* Complete the initialization of ble module */
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){
  
  
    initProcess();
    ble_error_t a0, a1, a2, a3;
        
    BLE&        ble   = params->ble;
    ble_error_t error = params->error;

    if (error != BLE_ERROR_NONE) {
        /* In case of error, forward the error handling to onBleInitError */
        onBleInitError(ble, error);
        return;
    }



    /* Ensure that it is the default instance of BLE */
    if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
        return;
    }
    
    printf("\r\nBLE Init Completed\n");
    
    
    /* notification */
    //ble.gattServer().onUpdatesEnabled(onUpdatesEnabledCallback);
    //ble.gattServer().onUpdatesDisabled(onUpdatesDisabledCallback);
    
    /* notification + attr writing */
    ble.gattServer().onDataWritten(AttributeModified_CB);
    /* data read */
    ble.gattClient().onDataRead(readCharacteristicCallback);
    /* when a peripheral node characteristics change */
    ble.gattClient().onHVX(onNotificationCallback);    
    /* when a peripheral descriptor is written */
    ble.gattClient().onDataWritten(perDescriptorWrittenCallback);
    
    
    /* disconnection */
    ble.gap().onDisconnection(disconnectionCallback);    
    /* connection */
    ble.gap().onConnection(connectionCallback);
    ble.gap().setScanParams(400, 200);    //(scanInterval,scanWindow)ms
    ble.gap().setScanTimeout(0x0004);     //stop scanning after N sec
    ble.gap().onTimeout(onStopScan);      //callback when scan stops
    
    
    
    
    /* Setup adv */
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    a0 = ble.gap().accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, manuf_data, sizeof(manuf_data));
    a1 = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::UNKNOWN);
    a2 = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)NAME_BLESTAR1, sizeof(NAME_BLESTAR1));
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); //Advertising_Event_Type
    ble.gap().setAdvertisingInterval(1000); //Adv_Interval
    a3 = ble.gap().setAdvertisingPolicyMode(Gap::ADV_POLICY_IGNORE_WHITELIST); //Adv_Filter_Policy      
    if ((a0 != BLE_ERROR_NONE) || (a1 != BLE_ERROR_NONE) || (a2 != BLE_ERROR_NONE) || (a3 != BLE_ERROR_NONE)){
        printf("\r\nError setup ADV\n");
    }
    
    
    addAllServices();
    printMacAddress();
    
    
    /* Start connection, service/chars discovery and enable notification */
    connectionProcess();
    
    /* Start advertising from this point */
    //setSlaveDiscoverable();//DEBUG_ONLY

}
/*----------------------------------------------------------------------------*/



void onBleInitError(BLE &ble, ble_error_t error) {}
/*----------------------------------------------------------------------------*/



int main()
{
    printf("\r\n\n/*******************************************************\n");
    printf("\r*                                                      *\n");
    printf("\r*      FP-NET-BLESTAR1 (MBED) Expansion Software       *\n");
    printf("\r*                                                      *\n");
    printf("\r*******************************************************/\n\n\n");
  
    /* Create the ble instance */
    BLE &ble = BLE::Instance();
    
    ble.onEventsToProcess(scheduleBleEventsProcessing);
    
    /* Uncommenting to debug the status*/
    //eventQ.call_every(20000, checkStatus);
    
    ble.init(bleInitComplete);   
    
    
    //dispatch events
    eventQ.dispatch_forever();

    return 0;   
}
/*----------------------------------------------------------------------------*/