OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h" | 5 #include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 delete delayed; | 172 delete delayed; |
173 } | 173 } |
174 return; | 174 return; |
175 } | 175 } |
176 | 176 |
177 base::Closure completed_callback; | 177 base::Closure completed_callback; |
178 if (!IsHeartRateVisible()) { | 178 if (!IsHeartRateVisible()) { |
179 completed_callback = | 179 completed_callback = |
180 base::Bind(error_callback, kUnknownCharacteristicError, ""); | 180 base::Bind(error_callback, kUnknownCharacteristicError, ""); |
181 } else { | 181 } else { |
182 std::vector<uint8> value = {0x06}; // Location is "foot". | 182 std::vector<uint8_t> value = {0x06}; // Location is "foot". |
183 completed_callback = base::Bind( | 183 completed_callback = base::Bind( |
184 &FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback, | 184 &FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback, |
185 weak_ptr_factory_.GetWeakPtr(), object_path, callback, value); | 185 weak_ptr_factory_.GetWeakPtr(), object_path, callback, value); |
186 } | 186 } |
187 | 187 |
188 if (extra_requests_ > 0) { | 188 if (extra_requests_ > 0) { |
189 action_extra_requests_["ReadValue"] = | 189 action_extra_requests_["ReadValue"] = |
190 new DelayedCallback(completed_callback, extra_requests_); | 190 new DelayedCallback(completed_callback, extra_requests_); |
191 return; | 191 return; |
192 } | 192 } |
193 | 193 |
194 completed_callback.Run(); | 194 completed_callback.Run(); |
195 } | 195 } |
196 | 196 |
197 void FakeBluetoothGattCharacteristicClient::WriteValue( | 197 void FakeBluetoothGattCharacteristicClient::WriteValue( |
198 const dbus::ObjectPath& object_path, | 198 const dbus::ObjectPath& object_path, |
199 const std::vector<uint8>& value, | 199 const std::vector<uint8_t>& value, |
200 const base::Closure& callback, | 200 const base::Closure& callback, |
201 const ErrorCallback& error_callback) { | 201 const ErrorCallback& error_callback) { |
202 if (!authenticated_) { | 202 if (!authenticated_) { |
203 error_callback.Run("org.bluez.Error.NotPaired", "Please login"); | 203 error_callback.Run("org.bluez.Error.NotPaired", "Please login"); |
204 return; | 204 return; |
205 } | 205 } |
206 | 206 |
207 if (!authorized_) { | 207 if (!authorized_) { |
208 error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first"); | 208 error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first"); |
209 return; | 209 return; |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 void FakeBluetoothGattCharacteristicClient:: | 478 void FakeBluetoothGattCharacteristicClient:: |
479 ScheduleHeartRateMeasurementValueChange() { | 479 ScheduleHeartRateMeasurementValueChange() { |
480 if (!IsHeartRateVisible()) | 480 if (!IsHeartRateVisible()) |
481 return; | 481 return; |
482 | 482 |
483 // Don't send updates if the characteristic is not notifying. | 483 // Don't send updates if the characteristic is not notifying. |
484 if (!heart_rate_measurement_properties_->notifying.value()) | 484 if (!heart_rate_measurement_properties_->notifying.value()) |
485 return; | 485 return; |
486 | 486 |
487 VLOG(2) << "Updating heart rate value."; | 487 VLOG(2) << "Updating heart rate value."; |
488 std::vector<uint8> measurement = GetHeartRateMeasurementValue(); | 488 std::vector<uint8_t> measurement = GetHeartRateMeasurementValue(); |
489 heart_rate_measurement_properties_->value.ReplaceValue(measurement); | 489 heart_rate_measurement_properties_->value.ReplaceValue(measurement); |
490 | 490 |
491 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 491 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
492 FROM_HERE, base::Bind(&FakeBluetoothGattCharacteristicClient:: | 492 FROM_HERE, base::Bind(&FakeBluetoothGattCharacteristicClient:: |
493 ScheduleHeartRateMeasurementValueChange, | 493 ScheduleHeartRateMeasurementValueChange, |
494 weak_ptr_factory_.GetWeakPtr()), | 494 weak_ptr_factory_.GetWeakPtr()), |
495 base::TimeDelta::FromMilliseconds( | 495 base::TimeDelta::FromMilliseconds( |
496 kHeartRateMeasurementNotificationIntervalMs)); | 496 kHeartRateMeasurementNotificationIntervalMs)); |
497 } | 497 } |
498 | 498 |
499 void FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback( | 499 void FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback( |
500 const dbus::ObjectPath& object_path, | 500 const dbus::ObjectPath& object_path, |
501 const ValueCallback& callback, | 501 const ValueCallback& callback, |
502 const std::vector<uint8_t>& value) { | 502 const std::vector<uint8_t>& value) { |
503 Properties* properties = GetProperties(object_path); | 503 Properties* properties = GetProperties(object_path); |
504 DCHECK(properties); | 504 DCHECK(properties); |
505 | 505 |
506 properties->value.ReplaceValue(value); | 506 properties->value.ReplaceValue(value); |
507 callback.Run(value); | 507 callback.Run(value); |
508 } | 508 } |
509 | 509 |
510 std::vector<uint8> | 510 std::vector<uint8_t> |
511 FakeBluetoothGattCharacteristicClient::GetHeartRateMeasurementValue() { | 511 FakeBluetoothGattCharacteristicClient::GetHeartRateMeasurementValue() { |
512 // TODO(armansito): We should make sure to properly pack this struct to ensure | 512 // TODO(armansito): We should make sure to properly pack this struct to ensure |
513 // correct byte alignment and endianness. It doesn't matter too much right now | 513 // correct byte alignment and endianness. It doesn't matter too much right now |
514 // as this is a fake and GCC on Linux seems to do the right thing. | 514 // as this is a fake and GCC on Linux seems to do the right thing. |
515 struct { | 515 struct { |
516 uint8 flags; | 516 uint8_t flags; |
517 uint8 bpm; | 517 uint8_t bpm; |
518 uint16 energy_expanded; | 518 uint16_t energy_expanded; |
519 uint16 rr_interval; | 519 uint16_t rr_interval; |
520 } value; | 520 } value; |
521 | 521 |
522 // Flags in LSB: 0 11 1 1 000 | 522 // Flags in LSB: 0 11 1 1 000 |
523 // | | | | | | 523 // | | | | | |
524 // 8-bit bpm format -- | | | | | 524 // 8-bit bpm format -- | | | | |
525 // Sensor contact supported -- | | | | 525 // Sensor contact supported -- | | | |
526 // Energy expanded field present -- | | | 526 // Energy expanded field present -- | | |
527 // RR-Interval values present ------- | | 527 // RR-Interval values present ------- | |
528 // Reserved for future use ------------ | 528 // Reserved for future use ------------ |
529 value.flags = 0x0; | 529 value.flags = 0x0; |
530 value.flags |= (0x03 << 1); | 530 value.flags |= (0x03 << 1); |
531 value.flags |= (0x01 << 3); | 531 value.flags |= (0x01 << 3); |
532 value.flags |= (0x01 << 4); | 532 value.flags |= (0x01 << 4); |
533 | 533 |
534 // Pick a value between 117 bpm and 153 bpm for heart rate. | 534 // Pick a value between 117 bpm and 153 bpm for heart rate. |
535 value.bpm = static_cast<uint8>(base::RandInt(117, 153)); | 535 value.bpm = static_cast<uint8_t>(base::RandInt(117, 153)); |
536 | 536 |
537 // Total calories burned in kJoules since the last reset. Increment this by 1 | 537 // Total calories burned in kJoules since the last reset. Increment this by 1 |
538 // every time. It's fine if it overflows: it becomes 0 when the user resets | 538 // every time. It's fine if it overflows: it becomes 0 when the user resets |
539 // the heart rate monitor (or pretend that he had a lot of cheeseburgers). | 539 // the heart rate monitor (or pretend that he had a lot of cheeseburgers). |
540 value.energy_expanded = calories_burned_++; | 540 value.energy_expanded = calories_burned_++; |
541 | 541 |
542 // Include one RR-Interval value, in seconds. | 542 // Include one RR-Interval value, in seconds. |
543 value.rr_interval = 60 / value.bpm; | 543 value.rr_interval = 60 / value.bpm; |
544 | 544 |
545 // Return the bytes in an array. | 545 // Return the bytes in an array. |
546 uint8* bytes = reinterpret_cast<uint8*>(&value); | 546 uint8_t* bytes = reinterpret_cast<uint8_t*>(&value); |
547 std::vector<uint8> return_value; | 547 std::vector<uint8_t> return_value; |
548 return_value.assign(bytes, bytes + sizeof(value)); | 548 return_value.assign(bytes, bytes + sizeof(value)); |
549 return return_value; | 549 return return_value; |
550 } | 550 } |
551 | 551 |
552 bool FakeBluetoothGattCharacteristicClient::IsHeartRateVisible() const { | 552 bool FakeBluetoothGattCharacteristicClient::IsHeartRateVisible() const { |
553 DCHECK(heart_rate_visible_ != heart_rate_measurement_path_.empty()); | 553 DCHECK(heart_rate_visible_ != heart_rate_measurement_path_.empty()); |
554 DCHECK(heart_rate_visible_ != body_sensor_location_path_.empty()); | 554 DCHECK(heart_rate_visible_ != body_sensor_location_path_.empty()); |
555 DCHECK(heart_rate_visible_ != heart_rate_control_point_path_.empty()); | 555 DCHECK(heart_rate_visible_ != heart_rate_control_point_path_.empty()); |
556 DCHECK(heart_rate_visible_ == !!heart_rate_measurement_properties_.get()); | 556 DCHECK(heart_rate_visible_ == !!heart_rate_measurement_properties_.get()); |
557 DCHECK(heart_rate_visible_ == !!body_sensor_location_properties_.get()); | 557 DCHECK(heart_rate_visible_ == !!body_sensor_location_properties_.get()); |
558 DCHECK(heart_rate_visible_ == !!heart_rate_control_point_properties_.get()); | 558 DCHECK(heart_rate_visible_ == !!heart_rate_control_point_properties_.get()); |
559 return heart_rate_visible_; | 559 return heart_rate_visible_; |
560 } | 560 } |
561 | 561 |
562 } // namespace bluez | 562 } // namespace bluez |
OLD | NEW |