PIR + LoRa

Dependencies:   BLE_API LMiC SX1276Lib mbed nRF51822 nrf51_rtc

Fork of BLE_PhysicalWeb by Bluetooth Low Energy

main.cpp

Committer:
janjongboom
Date:
2015-07-31
Revision:
10:e7ab33223964
Parent:
8:b816829fb712
Child:
11:bbe4157401e2

File content as of revision 10:e7ab33223964:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2013 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 "mbed.h"
#include "BLEDevice.h"
#include "URIBeaconConfigService.h"
#include "DFUService.h"
#include "DeviceInformationService.h"
#include "nrf51_rtc/nrf51_rtc.h"

InterruptIn motion(p21);
DigitalOut led(LED1); 
Serial pc(USBTX, USBRX); // tx, rx

BLEDevice ble;
URIBeaconConfigService *uriBeaconConfig;

void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
    ble.startAdvertising();
}

bool rise_state = false;
time_t last_rise = 0;

void riseHandler(void)
{
    led = 0;
    pc.printf("rise\r\n");
    last_rise = rtc.time();
    rise_state = true;
}

void fallHandler(void)
{
    led = 1;
    pc.printf("fall\r\n");
    last_rise = rtc.time();
    rise_state = false;
}

void lastRiseCallback(void)
{
    pc.printf("Current state %d, last_rise %d\r\n", rise_state, rtc.time() - last_rise);
}

int main(void)
{    
    Ticker ticker;
    ticker.attach(&lastRiseCallback, 10);

    motion.rise(&riseHandler);
    motion.fall(&fallHandler);

    ble.init();
    ble.onDisconnection(disconnectionCallback);

    uriBeaconConfig = new URIBeaconConfigService(ble, "http://goo.gl/K1PDnX");
    if (!uriBeaconConfig->configuredSuccessfully()) {
        error("failed to accommodate URI");
    }
    /* optional use of the API offered by URIBeaconConfigService */
    const int8_t powerLevels[] = {-20, -4, 0, 10};
    uriBeaconConfig->setTxPowerLevels(powerLevels);
    uriBeaconConfig->setTxPowerMode(URIBeaconConfigService::TX_POWER_MODE_LOW);

    static const uint8_t BEACON_UUID[] = {0xD8, 0xFE};
    static const uint8_t urldata[] = {
        BEACON_UUID[0],
        BEACON_UUID[1],
        0x00, // flags
        0x20, // power
        0x00, // http://www. // https://goo.gl/K1PDnX
        'g',
        'o',
        'o',
        '.',
        'g',
        'l',
        '/',
        'K',
        '1',
        'P',
        'D',
        'n',
        'X',
    };

    ble.clearAdvertisingPayload();
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, BEACON_UUID, sizeof(BEACON_UUID));
    ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, urldata, sizeof(urldata));

    ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
    ble.setAdvertisingInterval(1600); /* 1s; in multiples of 0.625ms. */
    ble.startAdvertising();

    while (true) {
        ble.waitForEvent();
    }
}