XYOracleNetwork/sdk-xyo-swift

View on GitHub
Source/BleInterface/devices/XyoDifferentiableDevice.swift

Summary

Maintainability
B
6 hrs
Test Coverage
//
//  XyoDifferentiableDevice.swift
//  sdk-xyobleinterface-swift
//
//  Created by Carter Harrison on 4/9/19.
//

import Foundation
import sdk_core_swift
import XyBleSdk
import CoreBluetooth

public class XyoDiffereniableDevice : XyoBluetoothDevice {
    override public func attachPeripheral(_ peripheral: XYPeripheral) -> Bool {
        guard let major = self.iBeacon?.major else {
            return false
        }
        
        guard let minor = self.iBeacon?.minor else {
            return false
        }
        
        guard
            let services = peripheral.advertisementData?[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID]
            else { return false }
        
        
        for service in services {
            if (checkUuidWithMajorMinor(major: major, minor: minor, UUID: service)) {
                self.peripheral = peripheral.peripheral
                self.peripheral?.delegate = self
                return true
            }
        }
        
        return false
    }
    
    private func checkUuidWithMajorMinor (major: UInt16, minor: UInt16, UUID: CBUUID) -> Bool {
        let encodedMajor = XyoBuffer().put(bits: major).toByteArray()
        let encodedMinor = XyoBuffer().put(bits: minor).toByteArray()
        let uuidBytes: [UInt8] = UUID.data.map { $0 }
        
        if (uuidBytes.count < 4) {
            return false
        }
        
        let encodedMinorOfUuid = XyoBuffer(data: [uuidBytes[0], uuidBytes[1]]).toByteArray()
        let encodedMajorOfUuid = XyoBuffer(data: [uuidBytes[2], uuidBytes[3]]).toByteArray()
        
        return (encodedMajor == encodedMajorOfUuid) && (encodedMinor[0] == encodedMinorOfUuid[0])
    }

}