Skip to content

Commit 65eb118

Browse files
committed
update BLEAdafruitSensor service
1 parent d898f17 commit 65eb118

10 files changed

+76
-47
lines changed

libraries/Bluefruit52Lib/src/BLECharacteristic.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ void BLECharacteristic::setMaxLen(uint16_t max_len)
122122
_max_len = max_len;
123123
}
124124

125+
uint16_t BLECharacteristic::getMaxLen(void)
126+
{
127+
return _max_len;
128+
}
129+
125130
void BLECharacteristic::setFixedLen(uint16_t fixed_len)
126131
{
127132
if ( fixed_len )
@@ -138,7 +143,7 @@ void BLECharacteristic::setFixedLen(uint16_t fixed_len)
138143
void BLECharacteristic::setBuffer(void* buf, uint16_t bufsize)
139144
{
140145
_max_len = bufsize;
141-
_userbuf = buf;
146+
_userbuf = (uint8_t*) buf;
142147
_attr_meta.vloc = buf ? BLE_GATTS_VLOC_USER : BLE_GATTS_VLOC_STACK;
143148
}
144149

libraries/Bluefruit52Lib/src/BLECharacteristic.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ class BLECharacteristic
100100
void setFixedLen(uint16_t fixed_len);
101101
void setBuffer(void* buf, uint16_t bufsize);
102102

103+
uint16_t getMaxLen(void);
104+
103105
/*------------- Descriptors -------------*/
104106
void setUserDescriptor(const char* descriptor); // aka user descriptor
105107
void setReportRefDescriptor(uint8_t id, uint8_t type); // TODO refactor to use addDescriptor()
@@ -187,7 +189,7 @@ class BLECharacteristic
187189
uint16_t _max_len;
188190
BLEService* _service; // pointer to parent's service
189191

190-
void* _userbuf;
192+
uint8_t* _userbuf;
191193

192194
/*------------- Descriptors -------------*/
193195
const char* _usr_descriptor;

libraries/Bluefruit52Lib/src/services/BLEAdafruitAccel.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,20 @@ const uint8_t BLEAdafruitAccel::UUID128_CHR_DATA[16] =
5555

5656
// Constructor
5757
BLEAdafruitAccel::BLEAdafruitAccel(void)
58-
: BLEAdafruitSensor(UUID128_SERVICE), Accel(UUID128_CHR_DATA)
58+
: BLEAdafruitSensor(UUID128_SERVICE, UUID128_CHR_DATA)
5959
{
6060

6161
}
6262

6363
err_t BLEAdafruitAccel::begin (void)
6464
{
65-
// Invoke base class begin(), this will add service and Period chr
66-
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
65+
// Setup Measurement Characteristic
66+
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
67+
_measurement.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
68+
_measurement.setFixedLen(4*3);
6769

68-
// Add Characteristic
69-
Accel.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
70-
Accel.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
71-
Accel.setFixedLen(4*3);
72-
VERIFY_STATUS( Accel.begin() );
70+
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
71+
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
7372

7473
return ERROR_NONE;
7574
}

libraries/Bluefruit52Lib/src/services/BLEAdafruitButton.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,19 @@ const uint8_t BLEAdafruitButton::UUID128_CHR_DATA[16] =
5555

5656
// Constructor
5757
BLEAdafruitButton::BLEAdafruitButton(void)
58-
: BLEAdafruitSensor(UUID128_SERVICE), Button(UUID128_CHR_DATA)
58+
: BLEAdafruitSensor(UUID128_SERVICE, UUID128_CHR_DATA)
5959
{
60-
6160
}
6261

6362
err_t BLEAdafruitButton::begin (void)
6463
{
65-
// Invoke base class begin(), this will add service and Period chr
66-
VERIFY_STATUS( BLEAdafruitSensor::begin(100) );
64+
// Setup Measurement Characteristic
65+
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
66+
_measurement.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
67+
_measurement.setFixedLen(4);
6768

68-
// Add Characteristic
69-
Button.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
70-
Button.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
71-
Button.setFixedLen(4);
72-
VERIFY_STATUS( Button.begin() );
69+
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
70+
VERIFY_STATUS( BLEAdafruitSensor::begin(100) );
7371

7472
return ERROR_NONE;
7573
}

libraries/Bluefruit52Lib/src/services/BLEAdafruitButton.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class BLEAdafruitButton : public BLEAdafruitSensor
3737
static const uint8_t UUID128_SERVICE[16];
3838
static const uint8_t UUID128_CHR_DATA[16];
3939

40-
BLECharacteristic Button;
41-
4240
BLEAdafruitButton(void);
4341
virtual err_t begin(void);
4442
};

libraries/Bluefruit52Lib/src/services/BLEAdafruitLightSensor.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,20 @@ const uint8_t BLEAdafruitLightSensor::UUID128_CHR_DATA[16] =
5555

5656
// Constructor
5757
BLEAdafruitLightSensor::BLEAdafruitLightSensor(void)
58-
: BLEAdafruitSensor(UUID128_SERVICE), Lux(UUID128_CHR_DATA)
58+
: BLEAdafruitSensor(UUID128_SERVICE, UUID128_CHR_DATA)
5959
{
6060

6161
}
6262

6363
err_t BLEAdafruitLightSensor::begin (void)
6464
{
65-
// Invoke base class begin(), this will add service and Period chr
66-
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
65+
// Setup Measurement Characteristic
66+
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
67+
_measurement.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
68+
_measurement.setFixedLen(4);
6769

68-
// Add Characteristic
69-
Lux.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
70-
Lux.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
71-
Lux.setFixedLen(4);
72-
VERIFY_STATUS( Lux.begin() );
70+
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
71+
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
7372

7473
return ERROR_NONE;
7574
}

libraries/Bluefruit52Lib/src/services/BLEAdafruitSensor.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
3030
//--------------------------------------------------------------------+
3131

32-
BLEAdafruitSensor::BLEAdafruitSensor(BLEUuid bleuuid)
33-
: BLEService(bleuuid), Period(UUID128_CHR_ADAFRUIT_MEASUREMENT_PERIOD)
32+
BLEAdafruitSensor::BLEAdafruitSensor(BLEUuid service_uuid, BLEUuid data_uuid)
33+
: BLEService(service_uuid), _measurement(data_uuid), Period(UUID128_CHR_ADAFRUIT_MEASUREMENT_PERIOD)
3434
{
3535
_measure_cb = NULL;
3636
}
@@ -45,6 +45,10 @@ err_t BLEAdafruitSensor::begin(int32_t ms)
4545
// Invoke base class begin()
4646
VERIFY_STATUS( BLEService::begin() );
4747

48+
_measurement.setCccdWriteCallback(sensor_data_cccd_cb, true);
49+
50+
VERIFY_STATUS( _measurement.begin() );
51+
4852
Period.setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE);
4953
Period.setPermission(SECMODE_OPEN, SECMODE_OPEN);
5054
Period.setFixedLen(4);
@@ -69,12 +73,23 @@ void BLEAdafruitSensor::stopMeasuring(void)
6973
_timer.stop();
7074
}
7175

76+
//--------------------------------------------------------------------+
77+
// Static Callbacks
78+
//--------------------------------------------------------------------+
79+
7280
void BLEAdafruitSensor::sensor_timer_cb(TimerHandle_t xTimer)
7381
{
7482
BLEAdafruitSensor* svc = (BLEAdafruitSensor*) pvTimerGetTimerID(xTimer);
7583

76-
// invoke measure callback
77-
if (svc->_measure_cb) svc->_measure_cb();
84+
if (svc->_measure_cb)
85+
{
86+
uint8_t buf[svc->_measurement.getMaxLen()];
87+
uint16_t len = svc->_measure_cb(buf, sizeof(buf));
88+
len = min(len, sizeof(buf));
89+
90+
// notify
91+
svc->_measurement.notify(buf, len);
92+
}
7893
}
7994

8095
// Client update period, adjust timer accordingly
@@ -95,3 +110,17 @@ void BLEAdafruitSensor::sensor_period_write_cb(uint16_t conn_hdl, BLECharacteris
95110
}
96111
}
97112

113+
void BLEAdafruitSensor::sensor_data_cccd_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint16_t value)
114+
{
115+
BLEAdafruitSensor& svc = (BLEAdafruitSensor&) chr->parentService();
116+
117+
// notify enabled
118+
if (value & BLE_GATT_HVX_NOTIFICATION)
119+
{
120+
svc._timer.start();
121+
}else
122+
{
123+
svc._timer.stop();
124+
}
125+
}
126+

libraries/Bluefruit52Lib/src/services/BLEAdafruitSensor.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
class BLEAdafruitSensor : public BLEService
3434
{
3535
public:
36-
typedef void (*measure_callback_t )(void);
36+
typedef uint16_t (*measure_callback_t )(uint8_t* buf, uint16_t bufsize);
3737

38-
BLEAdafruitSensor(BLEUuid bleuuid);
38+
BLEAdafruitSensor(BLEUuid service_uuid, BLEUuid data_uuid);
3939
virtual err_t begin(int32_t ms);
4040

4141
void setMeasureCallback(measure_callback_t fp);
@@ -44,12 +44,14 @@ class BLEAdafruitSensor : public BLEService
4444

4545
protected:
4646
BLECharacteristic Period;
47+
BLECharacteristic _measurement;
4748

4849
measure_callback_t _measure_cb;
4950
SoftwareTimer _timer;
5051

5152
static void sensor_timer_cb(TimerHandle_t xTimer);
5253
static void sensor_period_write_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len);
54+
static void sensor_data_cccd_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint16_t value);
5355
};
5456

5557
#endif /* BLE_ADAFRUIT_SENSOR_H_ */

libraries/Bluefruit52Lib/src/services/BLEAdafruitTemperature.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,28 @@ const uint8_t BLEAdafruitTemperature::UUID128_SERVICE[16] =
4646
0xA8, 0x42, 0x32, 0xC3, 0x00, 0x01, 0xAF, 0xAD
4747
};
4848

49-
const uint8_t BLEAdafruitTemperature::UUID128_CHR_TEMPERATURE[16] =
49+
const uint8_t BLEAdafruitTemperature::UUID128_CHR_DATA[16] =
5050
{
5151
0xB8, 0x6c, 0x75, 0x05, 0xE9, 0x25, 0xBD, 0x93,
5252
0xA8, 0x42, 0x32, 0xC3, 0x01, 0x01, 0xAF, 0xAD
5353
};
5454

5555
// Constructor
5656
BLEAdafruitTemperature::BLEAdafruitTemperature(void)
57-
: BLEAdafruitSensor(UUID128_SERVICE), Temperature(UUID128_CHR_TEMPERATURE)
57+
: BLEAdafruitSensor(UUID128_SERVICE, UUID128_CHR_DATA)
5858
{
5959

6060
}
6161

6262
err_t BLEAdafruitTemperature::begin (void)
6363
{
64-
// Invoke base class begin(), this will add service and Period chr
65-
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
64+
// Setup Measurement Characteristic
65+
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
66+
_measurement.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
67+
_measurement.setFixedLen(4);
6668

67-
// Add Temperature Characteristic
68-
Temperature.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
69-
Temperature.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
70-
Temperature.setFixedLen(4);
71-
VERIFY_STATUS( Temperature.begin() );
69+
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
70+
VERIFY_STATUS( BLEAdafruitSensor::begin(1000) );
7271

7372
return ERROR_NONE;
7473
}

libraries/Bluefruit52Lib/src/services/BLEAdafruitTemperature.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ class BLEAdafruitTemperature : public BLEAdafruitSensor
3636
{
3737
public:
3838
static const uint8_t UUID128_SERVICE[16];
39-
static const uint8_t UUID128_CHR_TEMPERATURE[16];
40-
41-
BLECharacteristic Temperature;
39+
static const uint8_t UUID128_CHR_DATA[16];
4240

4341
BLEAdafruitTemperature();
4442
virtual err_t begin(void);

0 commit comments

Comments
 (0)