Skip to content

Commit 6ac348f

Browse files
committed
implement period = 0, notify on changes
1 parent 65eb118 commit 6ac348f

File tree

3 files changed

+61
-27
lines changed

3 files changed

+61
-27
lines changed

libraries/Bluefruit52Lib/src/services/BLEAdafruitButton.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ BLEAdafruitButton::BLEAdafruitButton(void)
5959
{
6060
}
6161

62-
err_t BLEAdafruitButton::begin (void)
62+
err_t BLEAdafruitButton::begin(void)
6363
{
6464
// Setup Measurement Characteristic
6565
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);

libraries/Bluefruit52Lib/src/services/BLEAdafruitSensor.cpp

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
//--------------------------------------------------------------------+
3131

3232
BLEAdafruitSensor::BLEAdafruitSensor(BLEUuid service_uuid, BLEUuid data_uuid)
33-
: BLEService(service_uuid), _measurement(data_uuid), Period(UUID128_CHR_ADAFRUIT_MEASUREMENT_PERIOD)
33+
: BLEService(service_uuid), _measurement(data_uuid), _period(UUID128_CHR_ADAFRUIT_MEASUREMENT_PERIOD)
3434
{
3535
_measure_cb = NULL;
3636
}
@@ -49,20 +49,27 @@ err_t BLEAdafruitSensor::begin(int32_t ms)
4949

5050
VERIFY_STATUS( _measurement.begin() );
5151

52-
Period.setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE);
53-
Period.setPermission(SECMODE_OPEN, SECMODE_OPEN);
54-
Period.setFixedLen(4);
55-
VERIFY_STATUS( Period.begin() );
56-
Period.write32(ms);
52+
_period.setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE);
53+
_period.setPermission(SECMODE_OPEN, SECMODE_OPEN);
54+
_period.setFixedLen(4);
55+
VERIFY_STATUS( _period.begin() );
56+
_period.write32(ms);
5757

58-
Period.setWriteCallback(sensor_period_write_cb, true);
58+
_period.setWriteCallback(sensor_period_write_cb, true);
5959

6060
// setup timer
6161
_timer.begin(ms, sensor_timer_cb, this, true);
6262

6363
return ERROR_NONE;
6464
}
6565

66+
void BLEAdafruitSensor::setPeriod(int32_t period_ms)
67+
{
68+
_period.write32(period_ms);
69+
_update_timer(period_ms);
70+
}
71+
72+
6673
void BLEAdafruitSensor::startMeasuring(void)
6774
{
6875
_timer.start();
@@ -73,25 +80,54 @@ void BLEAdafruitSensor::stopMeasuring(void)
7380
_timer.stop();
7481
}
7582

76-
//--------------------------------------------------------------------+
77-
// Static Callbacks
78-
//--------------------------------------------------------------------+
7983

80-
void BLEAdafruitSensor::sensor_timer_cb(TimerHandle_t xTimer)
84+
void BLEAdafruitSensor::_update_timer(int32_t ms)
8185
{
82-
BLEAdafruitSensor* svc = (BLEAdafruitSensor*) pvTimerGetTimerID(xTimer);
86+
// TODO handle period = 0 which notify on changes ASAP
87+
if ( ms < 0 )
88+
{
89+
_timer.stop();
90+
}else if ( ms > 0)
91+
{
92+
_timer.setPeriod(ms);
93+
}else
94+
{
95+
// Period = 0: keeping the current interval, but report on changes only
96+
}
97+
}
8398

84-
if (svc->_measure_cb)
99+
void BLEAdafruitSensor::_timer_callback(void)
100+
{
101+
if (_measure_cb)
85102
{
86-
uint8_t buf[svc->_measurement.getMaxLen()];
87-
uint16_t len = svc->_measure_cb(buf, sizeof(buf));
103+
uint8_t buf[_measurement.getMaxLen()];
104+
uint16_t len = _measure_cb(buf, sizeof(buf));
88105
len = min(len, sizeof(buf));
89106

90-
// notify
91-
svc->_measurement.notify(buf, len);
107+
// Period = 0, compare with old data, only update on changes
108+
if ( 0 == _period.read32() )
109+
{
110+
uint8_t prev_buf[_measurement.getMaxLen()];
111+
_measurement.read(prev_buf, sizeof(prev_buf));
112+
113+
// skip notify if there is no changes
114+
if ( 0 == memcmp(prev_buf, buf, len) ) return;
115+
}
116+
117+
_measurement.notify(buf, len);
92118
}
93119
}
94120

121+
//--------------------------------------------------------------------+
122+
// Static Callbacks
123+
//--------------------------------------------------------------------+
124+
125+
void BLEAdafruitSensor::sensor_timer_cb(TimerHandle_t xTimer)
126+
{
127+
BLEAdafruitSensor* svc = (BLEAdafruitSensor*) pvTimerGetTimerID(xTimer);
128+
svc->_timer_callback();
129+
}
130+
95131
// Client update period, adjust timer accordingly
96132
void BLEAdafruitSensor::sensor_period_write_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len)
97133
{
@@ -100,14 +136,7 @@ void BLEAdafruitSensor::sensor_period_write_cb(uint16_t conn_hdl, BLECharacteris
100136
int32_t ms = 0;
101137
memcpy(&ms, data, len);
102138

103-
// TODO handle period = 0 which notify on changes ASAP
104-
if ( ms < 0 )
105-
{
106-
svc._timer.stop();
107-
}else
108-
{
109-
svc._timer.setPeriod(ms);
110-
}
139+
svc._update_timer(ms);
111140
}
112141

113142
void BLEAdafruitSensor::sensor_data_cccd_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint16_t value)

libraries/Bluefruit52Lib/src/services/BLEAdafruitSensor.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,21 @@ class BLEAdafruitSensor : public BLEService
3939
virtual err_t begin(int32_t ms);
4040

4141
void setMeasureCallback(measure_callback_t fp);
42+
void setPeriod(int32_t period_ms);
43+
4244
void startMeasuring(void);
4345
void stopMeasuring(void);
4446

4547
protected:
46-
BLECharacteristic Period;
48+
BLECharacteristic _period;
4749
BLECharacteristic _measurement;
4850

4951
measure_callback_t _measure_cb;
5052
SoftwareTimer _timer;
5153

54+
void _update_timer(int32_t ms);
55+
void _timer_callback(void);
56+
5257
static void sensor_timer_cb(TimerHandle_t xTimer);
5358
static void sensor_period_write_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len);
5459
static void sensor_data_cccd_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint16_t value);

0 commit comments

Comments
 (0)