Alexander Lea / Mbed 2 deprecated BLE_GATT_test1

Dependencies:   BLE_API mbed nRF51822

main.cpp

Committer:
alexanderlea
Date:
2015-03-26
Revision:
11:35b63ab4c76c
Parent:
10:2c5c202c69a5
Child:
12:f5b12e8b6043

File content as of revision 11:35b63ab4c76c:

#include "mbed.h"
#include "BLEDevice.h"
#include "BroadcasterService.h"
#include "ErrorService.h"
#include "PinDetect.h"
#include <string>

using namespace std;

BLEDevice ble;
DigitalOut led1(LED1);

PinDetect pIn(p5);

Serial pc(USBTX, USBRX);

/*Variable Declarations*/
const static char     DEVICE_NAME[]        = "BLE_Broadcaster";

static volatile bool indicatorOn = false;
static volatile bool indicatorSent = false;
//TODO: I want to be able to send something like:
    
//with first 4 bits being type code, and last 4 being command, or something
uint8_t cmdOn[8] = { 0x4d,0x32,0x81,0xc0,0x4d,0x4d,0x4d,0x4d };
uint8_t cmdOff[8] = { 0x4d,0x32,0x81,0xc0,0x00,0x00,0x00,0x00 };
    
void blink(void)
{
    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */    
}

/** Callback routine is interrupt activated by a debounced pb hit*/
void keyPressed(void) {
    indicatorOn = true;   
    indicatorSent = false;
    pc.printf("Switch changed. Is now %d \r\n", indicatorOn);
}

void keyReleased(void) {
    indicatorOn = false;   
    indicatorSent = false;
    pc.printf("Switch changed. Is now %d \r\n", indicatorOn);
}

void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
    pc.printf("Disconnected! - start advertising. Handle:%d, Reason:0x%02x\r\n", handle, reason);
    ble.startAdvertising();
}

void connectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *parms)
{
    pc.printf("Connected! - stop advertising. Handle:%d, eType:%d, Add:%u.\r\n", handle, peerAddrType, peerAddr);
    ble.stopAdvertising();
}

int main(void)
{
    /*Setup switch input*/
    pIn.mode(PullUp);
    // Delay for initial pullup to take effect
    wait(.01);    
        
    //set asserted = 0 volts and deasserted = 5 (or 3.3, actually)  
    pIn.setAssertValue(0);
    // Setup Interrupt callback function for a pb hit
    pIn.attach_asserted( &keyPressed );
    pIn.attach_deasserted( &keyReleased );
    
    // Start sampling pb input using interrupts
    pIn.setSampleFrequency(); 
    
    /*Setup Blinky*/
    //led1 = 1;
    //Ticker t;
    //t.attach(blink, 1f);

    /*Setup BLE*/
    ble.init();
    ble.onDisconnection(disconnectionCallback);
    ble.onConnection(connectionCallback);

    //create services  
    BroadcasterService broadcasterService(ble);
    ErrorService errorService(ble);

    /*
    **BREDR_NOT_SUPPORTED = BLE only
    **LE_GENERAL_DISCOVERABLE = Device is discoverable at any moment (no time out)
    **ADV_CONNECTABLE_UNDIRECTED = Any central device can connect
    */
    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
//    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    
    ble.setAdvertisingInterval(160); /* 1s; in multiples of 0.625ms. */ //was 1600
    ble.startAdvertising();

    pc.printf("Advertising node %s\n\r", DEVICE_NAME);

    //loop forever
    while(true) {

        ble.waitForEvent(); // this will return upon any system event (such as an interrupt or a ticker wakeup)        
        
        if(indicatorOn) { //if button is pressed
            if(!indicatorSent) { //should only fire the first time!
                pc.printf("Command on = %u\r\n", cmdOn);
                broadcasterService.sendCommand(cmdOn);
                led1 = true;
                //errorService.registerError(ErrorService::ERROR_GENERIC);
                indicatorSent = true; //set true to stop multiple firing
            }
        } else {
            if(!indicatorSent) {
                pc.printf("Command off = %u\r\n", cmdOff);
                broadcasterService.sendCommand(cmdOff);
                led1 = false;
                //errorService.registerError(ErrorService::ERROR_DISCONNECTION);
                indicatorSent = true; //set true to stop multiple firing
            }
        }
    }
}