Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

source/main.cpp

Committer:
krissl
Date:
2019-04-20
Revision:
3:f594022fe519
Parent:
1:9fc54848a198
Child:
6:ee9c86f06eae

File content as of revision 3:f594022fe519:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2014 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/Gap.h"
#include "GattCallbackParamTypes.h"
#include "mbed.h"
#include "Adafruit_WS2801.h"

#define STRIP_LENGTH 20
static Adafruit_WS2801 mystrip(STRIP_LENGTH, p26,p27, WS2801_RGB);
#include "ColorService.h"

//Serial pc(USBTX, USBRX);

DigitalOut led1(LED1, 1);

const static char     DEVICE_NAME[] = "SSS-Wearable";
static const uint16_t uuid16_list[] = {0xF0C0FF};
    
int rainbow[] = {0xff00ff,0xff00cc,0xff0099,0xff0066,0xff0033,0xff0000,0xff3300,0xff6600,
                 0xff9900,0xffcc00,0xffff00,0xccff00,0x99ff00,0x66ff00,0x33ff00,0x00ff00,
                 0x00ff33,0x00ff66,0x00ff99,0x00ffcc};
            

static ColorService* colorServicePtr; 

static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
void discoveryCallback(const Gap::AdvertisementCallbackParams_t *params)
{
}
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    pc.printf("Found a device");
}
void connectionCallback(const Gap::ConnectionCallbackParams_t *params) 
{
    pc.printf("\r\n *******Got connection****** \r\n");
}
void updateSensorValue() {
//    pc.printf("Right now, i should update sensor value. This runs only during connection \r\n");
//    colorServicePtr->updateColor((int[]){16711680, 16711682, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680});
}

void blinkCallback(void)
{
    //TODO: Every 
    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
    BLE &ble = BLE::Instance();
    if (ble.gap().getState().connected) {
        eventQueue.call(updateSensorValue);
    } else {
        ble.gap().startAdvertising(); 
//        wait_ms(20); 
//        ble.gap().stopAdvertising();
        pc.printf("Stopped advertisement");
        
//        ble::ScanParameters scan_params;
//        scan_params.setOwnAddressType(ble::own_address_type_t::RANDOM);

//        ble_error_t error = ble.gap().setScanParameters(scan_params);
//        ble.gap().setScanParameters(scan_params);
 
//        if (error) {
//            pc.printf("Error caused by Gap::setScanParameters\r\n");
//            pc.printf("%d", error);
//            return;
//        }
//          ble_error_t error = ble.gap().startScan(ble::scan_duration_t(100));

//        if (error) {
//            pc.printf("Error caused by Gap::startScan\r\n");
//            return;
//        }

//        printf("Scanning started\r\n");
 
        
//        iBeaconStartScan(); 
//        wait(130); 
//        ble.gap().stopScan(); 
    }
}

/**
 * This function is called when the ble initialization process has failled
 */
void onBleInitError(BLE &ble, ble_error_t error)
{
    /* Initialization error handling should go here */
}

void printMacAddress()
{
    /* Print out device MAC address to the console*/
    Gap::AddressType_t addr_type;
    Gap::Address_t address;
    BLE::Instance().gap().getAddress(&addr_type, address);
    pc.printf("DEVICE MAC ADDRESS: ");
    for (int i = 5; i >= 1; i--){
        pc.printf("%02x:", address[i]);
    }
    pc.printf("%02x\r\n", address[0]);
}

/**
 * Callback triggered when the ble initialization process has finished
 */
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
    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;
    }

    ble.gap().onDisconnection(disconnectionCallback);
    ble.gap().onConnection(connectionCallback);
    /* Setup primary service */
    colorServicePtr = new ColorService(ble);

    /* Setup advertising */
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
//    ble.gattServer().onDataRead(blinkCallback);
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.gap().setAdvertisingInterval(150); /* 1000ms */
    pc.printf("Set up BLE \r\n");
    printMacAddress();
}


void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
    BLE &ble = BLE::Instance();
    //TODO: Event handling; wel benieuwd naar wat er allemaal gebeurt

    eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
}

uint32_t colorMaker(uint8_t r, uint8_t g, uint8_t b){
      uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;    
}

int main()
{
    pc.baud (115200);

    eventQueue.call_every(150, blinkCallback);

    BLE &ble = BLE::Instance();
    ble.onEventsToProcess(scheduleBleEventsProcessing);
    ble.init(bleInitComplete);
    mystrip.begin();
    mystrip.show();
    
    colorServicePtr->updateColor((int[]){16711680, 16711682, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680, 16711680});
    eventQueue.dispatch_forever();
    return 0;
}