using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Assets.Scripts.Ble.Characteristic; using Assets.Scripts.Ble.Commands; using Assets.Scripts.Commands; using Assets.Scripts.Devices.Ble; using Assets.Scripts.Devices.Ble.Extension; using Assets.Scripts.Devices.Ble.Interfaces; using UnityEngine; namespace Assets.Scripts.Ble.Service { public abstract class BleService { private BleWinHwInterface hwInterface; private BleServiceInfo serviceInfo; private List characteristics; private readonly Dictionary>> registeredCharacteristicReadEvents = new Dictionary>>(); public IReadOnlyList Characteristics { get { return this.characteristics; } } private CommandType supportedCommands; // Token: 0x0400110D RID: 4365 private CommandType tempCommands; public CommandType SupportedCommands { get { return this.supportedCommands; } private set { if (this.supportedCommands.HasFlag(value)) { return; } this.supportedCommands |= value; } } public BleService(BleServiceInfo serviceInfo, BleWinHwInterface bleHwInterface) { this.hwInterface = bleHwInterface; this.serviceInfo = serviceInfo; this.hwInterface.CharacteristicReadEvent += CharacteristicReadMainCallback; } private void CharacteristicReadMainCallback(IBleWinHwInterface hwInterface, BleCharacteristicInfo characteristic, BleResponse response) { //Debug.Log("read main callback"); if (this.registeredCharacteristicReadEvents.ContainsKey(characteristic.Id) && characteristic.Service.Equals(this.serviceInfo)) { //Debug.Log("read main callback 1111111111111"); this.registeredCharacteristicReadEvents[characteristic.Id](hwInterface, characteristic, response); } } public void DiscoverCharacteristics(BleResponse> scanCharacteristicsResponse = null) { if (scanCharacteristicsResponse == null) { Debug.Log("ccc ======================================== "+this.serviceInfo.Peripheral.Name); this.hwInterface.DiscoverCharacteristic(this.serviceInfo, this.CheckCharacteristicDiscoveredResponse); return; } this.CheckCharacteristicDiscoveredResponse(this.hwInterface, this.serviceInfo, scanCharacteristicsResponse); } private void CheckCharacteristicDiscoveredResponse(IBleWinHwInterface hwInterface, BleServiceInfo service, BleResponse> response) { if (!service.Equals(this.serviceInfo)) { return; } if (!response.IsSuccess) { return; } //if(response.Data) this.characteristics = response.Data; this.CharacteristicsDiscovered(response); } protected abstract void CharacteristicsDiscovered(BleResponse> response); protected void SubscribeCharacteristic(BleCharacteristicInfo characteristic, Action notificationCallback, Action> readCallback) { this.hwInterface.SubscribeCharacteristic(characteristic, (hw, info, response) => { if (readCallback != null) { this.registeredCharacteristicReadEvents[characteristic.Id] = readCallback; Debug.Log("添加callback"); } if (notificationCallback == null) { return; } notificationCallback.Invoke(hw, info, response); }); } protected Commands.CommandResponseCode CheckCharacteristicResponse(BleCharacteristicInfo characteristic, BleResponse response, Func, TResponseValue> valueCreator, out TResponseValue value) where TResponseValue : BaseCharacteristicValue { value = default(TResponseValue); if (!response.IsSuccess) { return response.Error.ToDeviceCommandResponseType(); } try { value = valueCreator(characteristic, response); } catch (Exception ex) { throw; } CommandResponseCode commandResponseCode = value.ToDeviceCommandResponseCode(); return commandResponseCode; } protected void AddSupportedCommand(CommandType newCommands) { this.SupportedCommands |= newCommands; if (newCommands.HasFlag(CommandType.SetSimParameters)) { } } protected void ReadCharacteristic(BleCharacteristicInfo characteristic, CharacteristicReadCallback callback) { this.hwInterface.ReadCharacteristic(characteristic, callback); } protected BleCharacteristicInfo CheckServiceCanSendCommand(Command command) { CommandType type = command.Type; //if (!this.SupportedCommands(type)) //{ //} BleCharacteristicInfo characteristicForCommandType = this.GetCharacteristicForCommandType(type); return characteristicForCommandType; } protected abstract BleCharacteristicInfo GetCharacteristicForCommandType(CommandType type); public bool SupportsCommands(CommandType flags) { return this.SupportedCommands.HasFlag(flags); } public virtual bool SendCommand(Command command) { return false; } } }