Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Fork of BLE_Central_Light_Demo_23 by
main.cpp
- Committer:
- hmiot
- Date:
- 2017-01-25
- Revision:
- 8:285ebd0e83fb
- Parent:
- 7:66586d2d7cb5
- Child:
- 9:b967a01810e1
File content as of revision 8:285ebd0e83fb:
/************************************************************************
* *
* *
************************************************************************/
#include "hm_config.h"
DiscoveredCharacteristic lightCharacteristic;
s_serviceInfo lightChar = {NULL,NULL,NULL,NULL};
Serial pc(USBTX, USBRX);
void bleint();
bool serviceDiscover = true;
void readCharacteristics();
void spiRead();
void testaction(uint8_t options);
bool isint = true;
SPISlave spiSlave(P0_9, P0_11, P0_8, P0_10);
int spiRX[4];
// uint8_t spiTX[4];
uint8_t bufferSize;
void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
uint8_t con_status =0;
// uint8_t i;
//0x51 for Magic light
//0x5A
if ((params->peerAddr[0] == 0x51) || (params->peerAddr[0] == 0x5A)) { // 0x2F for red bear1.5 /* !ALERT! Alter this filter to suit your device. */
pc.printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
params->rssi, params->isScanResponse, params->type);
pc.printf("Data Length : %d\r\n",params->advertisingDataLen);
con_status = BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_PUBLIC, NULL, NULL);
pc.printf("Connection Status : %d\r\n",con_status);
connect_status = 1;
BLE::Instance().gap().stopScan();
}else{
printf("Not Matched your device\r\n");
return;
}
}
void serviceDiscoveryCallback(const DiscoveredService *service) {
pc.printf("Service Discovery Callback\r\n");
if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
pc.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
} else {
pc.printf("S UUID-");
const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
printf("%02x", longUUIDBytes[i]);
}
pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
}
}
void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
pc.printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
if (characteristicP->getUUID().getShortUUID() == 0xffe9 ) { /* !ALERT! Alter this filter to suit your device. */
lightCharacteristic = *characteristicP;
pc.printf("Matched char UUID\r\n");
printf("Conn Handle = %dand %d \r\n",characteristicP->getConnectionHandle(), lightCharacteristic.getConnectionHandle());
printf("Value Handle = %d and %d\r\n",characteristicP->getValueHandle(),lightCharacteristic.getValueHandle());
// lightCharacteristic.writeWoResponse(sizeof(write_data), write_data);
charDiscover = 1;
serviceDiscover = true;
AddCharNodes(lightCharacteristic);
//light_actions(1);
//BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,characteristicP->getConnectionHandle(),characteristicP->getValueHandle(),sizeof(write_data),write_data);
}else {
printf("Not Matched char UUID\r\n");
}
}
void AddCharNodes(DiscoveredCharacteristic light_Characteristic)
{
printf("Add Char Nodes\r\n");
lightCharacteristic_t *ptr_temp_char = NULL;
printf("\n\rAdding Node...");
ptr_temp_char = lightChar.services_Char[0];
if(NULL == ptr_temp_char)
{
ptr_temp_char = (lightCharacteristic_t *)malloc(sizeof(lightCharacteristic_t));
lightChar.services_Char[0] = ptr_temp_char;
}
else
{
while(NULL != ptr_temp_char->nextChar)
{
ptr_temp_char = ptr_temp_char->nextChar;
}
/* add a new node */
ptr_temp_char->nextChar = (lightCharacteristic_t *)malloc(sizeof(lightCharacteristic_t));
ptr_temp_char = ptr_temp_char->nextChar;
}
/* assign data to the node */
ptr_temp_char->u_characteristicID = 1;
printf("Conn Handle = %d\r\n",light_Characteristic.getConnectionHandle());
printf("Value Handle = %d\r\n",light_Characteristic.getValueHandle());
ptr_temp_char->connHandle = light_Characteristic.getConnectionHandle();
ptr_temp_char->valueHandle = light_Characteristic.getValueHandle();
printf("After Conn Handle = %d\r\n",ptr_temp_char->connHandle);
printf("After Value Handle = %d\r\n",ptr_temp_char->valueHandle);
ptr_temp_char->nextChar = NULL;
}
void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
pc.printf("terminated SD for handle %u\r\n", connectionHandle);
serviceDiscover = false;
}
void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
pc.printf("Connection Callback\n\r");
if (params->role == Gap::CENTRAL) {
pc.printf("Service and characterstics discovery callback\r\n");
BLE::Instance().gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
BLE::Instance().gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xffe5, 0xffe9);
}
}
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
pc.printf("disconnected\r\n");
BLE::Instance().gap().startScan(advertisementCallback);
}
/**
* Callback triggered when the ble initialization process has finished
*/
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
BLE& ble = params->ble;
pc.printf("Ble Init\n\r");
/* Ensure that it is the default instance of BLE
if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
return;
}*/
// ble.gap().onConnection(connectionCallback);
// ble.gap().onDisconnection(disconnectionCallback);
// ble.gap().setScanParams(1000, 800);
// ble.gap().startScan(advertisementCallback);
}
void light_actions(int service_char[]){
uint8_t *write_data=NULL;
//={0x56,0xff,0x00,0x00,0x00,0xf0,0xaa};
write_data = new uint8_t[7];
lightCharacteristic_t *ptr_tmp = NULL;
// uint8_t op;
ptr_tmp = lightChar.services_Char[service_char[0]-1];
printf("Conn Handle = %d\r\n",ptr_tmp->connHandle);
printf("Value Handle = %d\r\n",ptr_tmp->valueHandle);
if(connect_status)
{
//scanf("%d", &op);
printf("options : %d\n",service_char[1]);
switch(service_char[1])
{
case TURN_OFF: // off
write_data[0]=0x56;
write_data[1]=0x00;
write_data[2]=0x00;
write_data[3]=0x00;
write_data[4]=0x00;
write_data[5]=0xf0;
write_data[6]=0xaa;
error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,7,write_data);
break;
case TURN_ON: //on
write_data[0]=0x56;
write_data[1]=0xff;
write_data[2]=0x00;
write_data[3]=0xff;
write_data[4]=0x00;
write_data[5]=0xf0;
write_data[6]=0xaa;
error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,7,write_data);
break;
case COLOR: // Color
write_data[0]=0x56;
write_data[1]=0xff; //lightColor[service_char[2]][0];//0xff
write_data[2]=0x00;//lightColor[service_char[2]][1];//0x00;
write_data[3]=0x00;//lightColor[service_char[2]][2];//0x00;
write_data[4]=0x00;
write_data[5]=0xf0;
write_data[6]=0xaa;
//datancpy(pre_write_data, (char *)write_data,6);
error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,7,write_data);
break;
default:
printf("Invalid Options\r\n");
}
printf("Write Status : %d\r\n",error_status);
delete [] write_data;
}
}
void readCharacteristics(){
printf("Read Characteristics \r\n");
lightCharacteristic_t *ptr_tmp = NULL;
ptr_tmp = lightChar.services_Char[1];
uint16_t read_data;
error_status = BLE::Instance().gattClient().read(ptr_tmp->connHandle,ptr_tmp->valueHandle,read_data);
printf("Read Data : %d\r\n",read_data);
}
void datancpy(char *pre_write, char *writeData, int data_size){
int numCount;
printf("length %d\r\n",sizeof(writeData));
for(numCount=0; numCount <= data_size; numCount++){
pre_write[numCount] = writeData[numCount];
// printf("write Value = %02x\r\n",writeData[numCount]);
//printf("Copy Value = %2x %d \r\n",pre_write[numCount],pre_write[numCount]);
}
}
void bleint()
{
printf("Init\r\n");
if(isint){
BLE::Instance().init(bleInitComplete);
isint=false;
}
}
int main()
{
// Serial port configuration
pc.baud(9600);
wait(8.0);
spiSlave.reply(191);
pc.printf("Start\n\r");
BLE &ble = BLE::Instance();
//ble.init(bleInitComplete);
//bleint();
//ble.waitForEvent();
while(true) {
printf("loop\r\n");
printf("Status : %d\r\n",BLE::Instance().gattClient().isServiceDiscoveryActive());
// if(connect_status && charDiscover){
if(spiSlave.receive())
{
spiRX[bufferSize] = spiSlave.read();
spiSlave.reply(spiRX[bufferSize]);
bufferSize++;
if(bufferSize>=4){
bufferSize=0;
// light_actions(spiRX);
}
}
bleint();
// }
if (serviceDiscover || BLE::Instance().gattClient().isServiceDiscoveryActive()){
ble.waitForEvent();
//serviceDiscover = false;
}
}
}
/*
void testaction(uint8_t options)
{
int tx_buf[4];
switch(options)
{
case 1: //off
tx_buf[0] = 0x1;
tx_buf[1] = 0x0;
tx_buf[2] = 0x0;
tx_buf[3] = 0x0;
light_actions(tx_buf);
break;
case 2: //on
tx_buf[0] = 0x1;
tx_buf[1] = 0x1;
tx_buf[2] = 0x0;
tx_buf[3] = 0x0;
light_actions(tx_buf);
break;
case 3: //Red
tx_buf[0] = 0x1;
tx_buf[1] = 0x2;
tx_buf[2] = 0x0;
tx_buf[3] = 0x0;
light_actions(tx_buf);
break;
case 4: //Green
tx_buf[0] = 0x1;
tx_buf[1] = 0x2;
tx_buf[2] = 0x1;
tx_buf[3] = 0x0;
light_actions(tx_buf);
break;
case 5: //Blue
tx_buf[0] = 0x1;
tx_buf[1] = 0x2;
tx_buf[2] = 0x2;
tx_buf[3] = 0x0;
light_actions(tx_buf);
break; */
/* default:
printf("Invalid \r\n");
}
}*/
