aboutsummaryrefslogtreecommitdiffstats
path: root/arduino/libraries/BLEHomekit/src/BLEHomekit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arduino/libraries/BLEHomekit/src/BLEHomekit.cpp')
-rwxr-xr-xarduino/libraries/BLEHomekit/src/BLEHomekit.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/arduino/libraries/BLEHomekit/src/BLEHomekit.cpp b/arduino/libraries/BLEHomekit/src/BLEHomekit.cpp
new file mode 100755
index 0000000..ffd96b9
--- /dev/null
+++ b/arduino/libraries/BLEHomekit/src/BLEHomekit.cpp
@@ -0,0 +1,126 @@
+/**************************************************************************/
+/*!
+ @file BLEHomekit.cpp
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2018, Adafruit Industries (adafruit.com)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**************************************************************************/
+
+#include <bluefruit.h>
+#include "BLEHomekit.h"
+
+uint16_t BLEHomekit::_gInstanceID = 1;
+
+BLEHomekit::BLEHomekit()
+ : AccessoryInfo(), _protocol(), _pairing(),
+ _lightbulb()
+{
+
+}
+
+err_t BLEHomekit::begin(void)
+{
+ /*------------- Accessory Info Service -------------*/
+ VERIFY_STATUS ( AccessoryInfo.begin() );
+
+ /*------------- Protocol Info Service -------------*/
+ VERIFY_STATUS( _protocol.begin() );
+
+ /*------------- Pairing Service -------------*/
+ VERIFY_STATUS ( _pairing.begin() );
+
+ /*------------- LightBulb Service -------------*/
+ VERIFY_STATUS( _lightbulb.begin() ) ;
+
+ return ERROR_NONE;
+}
+
+bool BLEHomekit::setAdv(BLEAdvertisingData& adv_ref)
+{
+ VERIFY(&Bluefruit.Advertising == &adv_ref);
+ BLEAdvertising& adv = (BLEAdvertising&) adv_ref;
+
+ // Calculate AIL field
+ uint16_t interval_ms = MS625TO1000( adv.getInterval() );
+ uint8_t ail;
+
+ if ( interval_ms > 2500 ) ail = 0xE0;
+ else if ( interval_ms > 1250 ) ail = 0xC0;
+
+ else if ( interval_ms > 500 ) ail = 0xA0;
+ else if ( interval_ms > 300 ) ail = 0x80;
+ else if ( interval_ms > 100 ) ail = 0x60;
+ else if ( interval_ms > 25 ) ail = 0x40;
+ else ail = 0x20;
+
+ ail |= 0x0D;
+
+ struct ATTR_PACKED
+ {
+ uint16_t company_id;
+ uint8_t type;
+ uint8_t adv_int_len;
+ uint8_t status_flag;
+ uint8_t dev_id[6];
+ uint16_t category;
+ uint16_t gsn;
+ uint8_t config_num;
+ uint8_t compatible_version;
+ }data =
+ {
+ .company_id = UUID16_COMPANY_ID_APPLE,
+ .type = 0x06,
+ .adv_int_len = ail,
+ .status_flag = 1, // bit0 = HAP Pairing Status Flag (1 not paired)
+ .dev_id = { 0x00},
+ .category = HAP_CAT_LIGHTBULB,
+ .gsn = 1,
+ .config_num = 1,
+ .compatible_version = 2 // protocol version
+ };
+
+ Bluefruit.Gap.getAddr(data.dev_id);
+
+ VERIFY_STATIC( sizeof(data) == 17);
+
+ adv.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
+ adv.addManufacturerData(&data, sizeof(data));
+
+ // Full name is not added, added full name to scan response
+ if ( !adv.addName() )
+ {
+ Bluefruit.ScanResponse.clearData();
+ Bluefruit.ScanResponse.addName();
+ }
+
+ return true;
+}
+