Application running on nRF51822 PCA10001
Dependencies: BLE_API MMA8652 nRF51822 mbed-src
BuddiService.cpp
- Committer:
- rosterloh84
- Date:
- 2014-10-14
- Revision:
- 6:2fb6cf3c9047
- Parent:
- 4:630f1560a0f3
File content as of revision 6:2fb6cf3c9047:
#include "mbed.h"
#include "BuddiService.h"
#include "Logger.h"
#include "Configuration.h"
namespace Nudge {
// Buddi base UUID: 92D7DC20-xxxx-4DF8-84B1-AD8AF6E1EA4A
#define buddi_UUID(x) {0x92, 0xD7, 0xDC, 0x20, (((x) & 0xFF00) >> 8), ((x) & 0xFF), 0x4D, 0xF8, 0x82, 0xB1, 0xAD, 0x8A, 0xF6, 0xE1, 0xEA, 0x4A}
// UUID byte arrays
static const uint8_t buddiServiceUUID[] = buddi_UUID(0xBA55);
static const uint8_t commandUUID[16] = buddi_UUID(0xBB01);
static const uint8_t notificationUUID[] = buddi_UUID(0xBB02);
// Storage for the value of the characteristics
typedef struct {
uint8_t module;
uint8_t opcode;
uint8_t data[15];
} Command_t;
static Command_t commandPayload;
//uint8_t commandPayload[17] = {0,};
// Other things needed for operation
static BLEDevice* ble;
static GattCharacteristic commandCharacteristic(commandUUID,
(uint8_t *)&commandPayload,
sizeof(Command_t), //1,
sizeof(Command_t), //8,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
uint8_t notificationPayload[8] = {0,};
static GattCharacteristic notificationCharacteristic(notificationUUID,
notificationPayload,
1,
8,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
static GattCharacteristic *allChars[] = {&commandCharacteristic, ¬ificationCharacteristic};
static GattService buddiService(buddiServiceUUID, allChars, sizeof(allChars) / sizeof(GattCharacteristic *));
PwmOut ledr(p22); /* Red LED on PCA10000 */
PwmOut ledg(p23); /* Green LED on PCA10000 */
PwmOut ledb(p21); /* Blue LED on PCA10000 */
void init(BLEDevice &bleDevice)
{
ledr = 1.0f;
ledg = 1.0f;
ledb = 1.0f;
ble = &bleDevice;
ble->addService(buddiService);
DEBUG("Added buddi service\r\n");
}
const uint8_t *getServiceUUIDp()
{
return buddiServiceUUID;
}
void setLEDValue(uint8_t led, uint8_t value)
{
float val = ((float)value)/255;
DEBUG("Setting LED %u to %1.3f\r\n", led, val);
switch(led)
{
case 0:
ledg = val;
break;
case 1:
ledr = val;
break;
case 2:
ledb = val;
break;
default:
DEBUG("Unknown LED %u selected\r\n", led);
break;
}
}
void handleDataWritten(uint16_t handle, const GattCharacteristicWriteCBParams *params)
{
if (!ble) {
return;
}
if (handle == commandCharacteristic.getValueAttribute().getHandle()) {
//uint16_t len = sizeof(commandPayload);
//ble->readCharacteristicValue(handle, (uint8_t *) &commandPayload, &len);
if (params->len != sizeof(Command_t)) {
DEBUG("invalid write into fileInfo characteristic\r\n");
return;
}
memcpy(&commandPayload, params->data, params->len);
DEBUG("RX: MOD: 0x%X OP: 0x%X D0: 0x%X D1: 0x%X", commandPayload.module, commandPayload.opcode, commandPayload.data[0], commandPayload.data[1]);
//ble->updateCharacteristicValue(notificationCharacteristic.getValueAttribute().getHandle(), commandPayload, bytesRead);
switch(commandPayload.module) {
case MODULE_NEO_PIXEL:
setLEDValue(0, commandPayload.data[2]);
setLEDValue(1, commandPayload.data[3]);
setLEDValue(2, commandPayload.data[4]);
break;
default:
DEBUG("Module %u not implemented yet", commandPayload.module);
break;
}
} else {
DEBUG("Got data on unexpected characteristic handle %u!\r\n", handle);
}
}
} // namespace nudge
Richard Osterloh