Application running on nRF51822 PCA10001
Dependencies: BLE_API MMA8652 nRF51822 mbed-src
main.cpp
- Committer:
- rosterloh84
- Date:
- 2014-10-14
- Revision:
- 6:2fb6cf3c9047
- Parent:
- 4:630f1560a0f3
File content as of revision 6:2fb6cf3c9047:
/*******************************************************************************
* Title : System Initialisation
* Filename : main.cpp
* Author : Richard Osterloh
* Origin Date : 22/07/2014
* Version : 1.0.0
* Compiler : mbed compiler
* Target : Nordic nRF51822
* Notes : None
*******************************************************************************/
/*************** MODULE REVISION LOG ******************************************
*
* Date Software Version Initials Description
* 22/07/2014 1.0.0 RO Module Created.
*
*******************************************************************************/
/** \file main.cpp
* \brief This module contains the main function and setup
*/
/******************************************************************************
* Includes
*******************************************************************************/
#include "mbed.h"
#include "Logger.h"
#include "Configuration.h"
#include "BLEDevice.h"
//#include "nRF51822n.h"
//#include "MMA8652.h"
#include "BuddiService.h"
#include "BatteryService.h"
#include "DeviceInformationService.h"
/******************************************************************************
* Module Preprocessor Constants
*******************************************************************************/
/******************************************************************************
* Module Preprocessor Macros
*******************************************************************************/
/******************************************************************************
* Module Typedefs
*******************************************************************************/
/******************************************************************************
* Module Variable Definitions
*******************************************************************************/
//nRF51822n nrf;
BLEDevice ble;
DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */
DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
//AnalogIn adc1(p0_0);
//MMA8652 acc1(I2C_SDA0, I2C_SCL0);
static const uint8_t *uuidlist = Nudge::getServiceUUIDp();
static uint8_t uuidlistrev[16];
static const char *DEVICE_NAME = "Nudge";
void bluetoothInit();
static volatile bool triggerSensorPolling = false; /* set to high periodically to indicate to the main thread that
* polling is necessary. */
static Gap::ConnectionParams_t connectionParams;
uint8_t batteryLevel = 100;
BatteryService *batteryServicePtr = NULL;
/******************************************************************************
* Function Prototypes
*******************************************************************************/
/******************************************************************************
* Function Definitions
*******************************************************************************/
void timeoutCallback(void)
{
DEBUG("Timeout!\r\n");
}
void connectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)
{
DEBUG("Connected. Got handle %u\r\n", handle);
DEBUG("Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n",
params->minConnectionInterval, params->maxConnectionInterval, params->slaveLatency, params->connectionSupervisionTimeout);
connectionParams.minConnectionInterval = Config::minConnectionInterval;
connectionParams.maxConnectionInterval = Config::maxConnectionInterval;
connectionParams.slaveLatency = Config::slaveLatency;
connectionParams.connectionSupervisionTimeout = Config::supervisionTimeout;
if (ble.updateConnectionParams(handle, &connectionParams) != BLE_ERROR_NONE) {
DEBUG("failed to update connection paramter\r\n");
}
advertisingStateLed = 0;
}
void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
DEBUG("Disconnected handle %u!\n\r", handle);
switch(reason) {
case Gap::REMOTE_USER_TERMINATED_CONNECTION:
DEBUG("REASON: REMOTE_USER_TERMINATED_CONNECTION\r\n");
break;
case Gap::CONN_INTERVAL_UNACCEPTABLE:
DEBUG("REASON: CONN_INTERVAL_UNACCEPTABLE\r\n");
break;
case Gap::LOCAL_HOST_TERMINATED_CONNECTION:
DEBUG("REASON: LOCAL_HOST_TERMINATED_CONNECTION\r\n");
break;
default:
DEBUG("REASON: UNKNOWN\r\n");
break;
}
DEBUG("Restarting the advertising process\n\r");
ble.startAdvertising();
advertisingStateLed = 1;
}
void onUpdatesEnabled(Gap::Handle_t handle)
{
DEBUG("Notifications enabled for %d\r\n", handle);
}
void onDataWritten(const GattCharacteristicWriteCBParams *params)
{
// bubble up to services, they will emit callbacks if handle matches
//Nudge::handleDataWritten(params);
}
/**
* Triggered periodically by the 'ticker' interrupt
*/
void periodicCallback(void)
{
oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */
triggerSensorPolling = true; /* Note that the periodicCallback() executes in
* interrupt context, so it is safer to do
* heavy-weight sensor polling from the main
* thread.*/
}
void bluetoothInit()
{
DEBUG("Bluetooth initialising...\r\n");
ble.init(); /* Initialise the nRF51822 */
ble.setDeviceName(Config::deviceName);
//ble.onTimeout(timeoutCallback);
ble.onConnection(connectionCallback);
ble.onDisconnection(disconnectionCallback);
//ble.onDataSent(onDataSent);
ble.onDataWritten(onDataWritten);
ble.onUpdatesEnabled(onUpdatesEnabled);
//ble.onUpdatesDisabled(onUpdatesDisabled);
//ble.onConfirmationReceived(onConfirmationReceived);
// Make sure we use our preferred conn. parameters
connectionParams.minConnectionInterval = Config::minConnectionInterval;
connectionParams.maxConnectionInterval = Config::maxConnectionInterval;
connectionParams.slaveLatency = Config::slaveLatency;
connectionParams.connectionSupervisionTimeout = Config::supervisionTimeout;
ble.setPreferredConnectionParams(&connectionParams);
ble.getPreferredConnectionParams(&connectionParams);
DEBUG("Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n",
connectionParams.minConnectionInterval,
connectionParams.maxConnectionInterval,
connectionParams.slaveLatency,
connectionParams.connectionSupervisionTimeout);
// Initialise services
BatteryService batteryService(ble);
batteryServicePtr = &batteryService;
DeviceInformationService deviceInfo(ble, "Buddi Ltd.", "BlueBand", "1234567890", "Hardware: 0", "Firmware: 0001", "Build: 0001");
Nudge::init(ble);
/* setup advertising */
ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, uuidlistrev, 16);
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
ble.setAdvertisingInterval(Config::advertisingInterval);
ble.startAdvertising();
advertisingStateLed = 1;
DEBUG("Ready. Advertising.\r\n");
}
int main(void)
{
DEBUG("Initialising Buddi Nudge | Built %s %s\n\r", __DATE__, __TIME__);
for (int i = 0; i < 16; i++) {
uuidlistrev[15 - i] = uuidlist[i];
}
// TODO: Add battery and dev info to advertising list
bluetoothInit();
oneSecondLed = 1;
Ticker ticker;
ticker.attach(periodicCallback, 1);
//float acc_data[3];
//int16_t acc_raw[3];
/*
DEBUG("MMA8652 Acc = %X\r\n", acc1.getWhoAmI());
acc1.ReadXYZ(acc_data);
acc1.ReadXYZraw(acc_raw);
DEBUG("MMA8652 Acc: X:%1.3f Y:%1.3f Z:%1.3f (Raw X:%3d Y:%3d Z:%3d)\r\n", acc_data[0], acc_data[1], acc_data[2], acc_raw[0], acc_raw[1], acc_raw[2]);
*/
while (true) {
if (triggerSensorPolling) {
triggerSensorPolling = false;
/* Do blocking calls or whatever is necessary for sensor polling. */
if (ble.getGapState().connected) {
/* Update the battery measurement */
//batteryLevel = adc1.read_u16()&0x0FFF) * 3.3/4096;
batteryLevel--;
if (batteryLevel == 1) {
batteryLevel = 100;
}
batteryServicePtr->updateBatteryLevel(batteryLevel);
}
} else {
ble.waitForEvent();
}
}
}
Richard Osterloh