| @@ -49,10 +49,18 @@ | |||
| E622E2FF243F1D4A003C319D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D8243F1D4A003C319D /* ViewController.m */; }; | |||
| E622E300243F1D4A003C319D /* ThermometerScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2DA243F1D4A003C319D /* ThermometerScanViewController.m */; }; | |||
| E622E301243F1D4A003C319D /* ThermometerConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2DD243F1D4A003C319D /* ThermometerConnectViewController.m */; }; | |||
| E680BF1C2510572A005AD827 /* AILinkBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E680BF1B25105729005AD827 /* AILinkBleSDK.framework */; }; | |||
| E680BF252510576D005AD827 /* BroadcastScaleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E680BF1E2510576D005AD827 /* BroadcastScaleViewController.m */; }; | |||
| E680BF262510576D005AD827 /* EightScaleScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E680BF212510576D005AD827 /* EightScaleScanViewController.m */; }; | |||
| E680BF272510576D005AD827 /* EightScaleConnectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E680BF222510576D005AD827 /* EightScaleConnectionViewController.m */; }; | |||
| E6FEA2102522E3BA001343A0 /* AILinkBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6FEA20F2522E3BA001343A0 /* AILinkBleSDK.framework */; }; | |||
| E6FEA2222522E3D0001343A0 /* ELInputAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2132522E3D0001343A0 /* ELInputAlertView.m */; }; | |||
| E6FEA2232522E3D0001343A0 /* ToothbrushScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2142522E3D0001343A0 /* ToothbrushScanViewController.m */; }; | |||
| E6FEA2242522E3D0001343A0 /* UILabel+WZAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2152522E3D0001343A0 /* UILabel+WZAdd.m */; }; | |||
| E6FEA2252522E3D0001343A0 /* UIView+Category.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2172522E3D0001343A0 /* UIView+Category.m */; }; | |||
| E6FEA2262522E3D0001343A0 /* UIButton+WZAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA21A2522E3D0001343A0 /* UIButton+WZAdd.m */; }; | |||
| E6FEA2272522E3D0001343A0 /* ToothbrushConnectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA21F2522E3D0001343A0 /* ToothbrushConnectionViewController.m */; }; | |||
| E6FEA2282522E3D0001343A0 /* CABasicAnimation+ELAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2202522E3D0001343A0 /* CABasicAnimation+ELAnimation.m */; }; | |||
| E6FEA2292522E3D0001343A0 /* ELSelectView.m in Sources */ = {isa = PBXBuildFile; fileRef = E6FEA2212522E3D0001343A0 /* ELSelectView.m */; }; | |||
| /* End PBXBuildFile section */ | |||
| /* Begin PBXContainerItemProxy section */ | |||
| @@ -152,13 +160,29 @@ | |||
| E622E2DB243F1D4A003C319D /* ThermometerConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThermometerConnectViewController.h; sourceTree = "<group>"; }; | |||
| E622E2DC243F1D4A003C319D /* ThermometerScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThermometerScanViewController.h; sourceTree = "<group>"; }; | |||
| E622E2DD243F1D4A003C319D /* ThermometerConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThermometerConnectViewController.m; sourceTree = "<group>"; }; | |||
| E680BF1B25105729005AD827 /* AILinkBleSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AILinkBleSDK.framework; sourceTree = "<group>"; }; | |||
| E680BF1E2510576D005AD827 /* BroadcastScaleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BroadcastScaleViewController.m; sourceTree = "<group>"; }; | |||
| E680BF1F2510576D005AD827 /* BroadcastScaleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BroadcastScaleViewController.h; sourceTree = "<group>"; }; | |||
| E680BF212510576D005AD827 /* EightScaleScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EightScaleScanViewController.m; sourceTree = "<group>"; }; | |||
| E680BF222510576D005AD827 /* EightScaleConnectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EightScaleConnectionViewController.m; sourceTree = "<group>"; }; | |||
| E680BF232510576D005AD827 /* EightScaleScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EightScaleScanViewController.h; sourceTree = "<group>"; }; | |||
| E680BF242510576D005AD827 /* EightScaleConnectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EightScaleConnectionViewController.h; sourceTree = "<group>"; }; | |||
| E6FEA20F2522E3BA001343A0 /* AILinkBleSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AILinkBleSDK.framework; sourceTree = "<group>"; }; | |||
| E6FEA2122522E3D0001343A0 /* UIButton+WZAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+WZAdd.h"; sourceTree = "<group>"; }; | |||
| E6FEA2132522E3D0001343A0 /* ELInputAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELInputAlertView.m; sourceTree = "<group>"; }; | |||
| E6FEA2142522E3D0001343A0 /* ToothbrushScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ToothbrushScanViewController.m; sourceTree = "<group>"; }; | |||
| E6FEA2152522E3D0001343A0 /* UILabel+WZAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+WZAdd.m"; sourceTree = "<group>"; }; | |||
| E6FEA2162522E3D0001343A0 /* ToothbrushConnectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToothbrushConnectionViewController.h; sourceTree = "<group>"; }; | |||
| E6FEA2172522E3D0001343A0 /* UIView+Category.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Category.m"; sourceTree = "<group>"; }; | |||
| E6FEA2182522E3D0001343A0 /* ELSelectView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELSelectView.h; sourceTree = "<group>"; }; | |||
| E6FEA2192522E3D0001343A0 /* CABasicAnimation+ELAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CABasicAnimation+ELAnimation.h"; sourceTree = "<group>"; }; | |||
| E6FEA21A2522E3D0001343A0 /* UIButton+WZAdd.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+WZAdd.m"; sourceTree = "<group>"; }; | |||
| E6FEA21B2522E3D0001343A0 /* UILabel+WZAdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+WZAdd.h"; sourceTree = "<group>"; }; | |||
| E6FEA21C2522E3D0001343A0 /* ToothbrushScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToothbrushScanViewController.h; sourceTree = "<group>"; }; | |||
| E6FEA21D2522E3D0001343A0 /* ELInputAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELInputAlertView.h; sourceTree = "<group>"; }; | |||
| E6FEA21E2522E3D0001343A0 /* UIView+Category.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Category.h"; sourceTree = "<group>"; }; | |||
| E6FEA21F2522E3D0001343A0 /* ToothbrushConnectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ToothbrushConnectionViewController.m; sourceTree = "<group>"; }; | |||
| E6FEA2202522E3D0001343A0 /* CABasicAnimation+ELAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CABasicAnimation+ELAnimation.m"; sourceTree = "<group>"; }; | |||
| E6FEA2212522E3D0001343A0 /* ELSelectView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELSelectView.m; sourceTree = "<group>"; }; | |||
| /* End PBXFileReference section */ | |||
| /* Begin PBXFrameworksBuildPhase section */ | |||
| @@ -166,7 +190,7 @@ | |||
| isa = PBXFrameworksBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| E680BF1C2510572A005AD827 /* AILinkBleSDK.framework in Frameworks */, | |||
| E6FEA2102522E3BA001343A0 /* AILinkBleSDK.framework in Frameworks */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| @@ -201,7 +225,8 @@ | |||
| E622E25D243F1CA5003C319D /* AILinkBleSDKDemo */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| E680BF1B25105729005AD827 /* AILinkBleSDK.framework */, | |||
| E6FEA2112522E3D0001343A0 /* 蓝牙WiFi牙刷 */, | |||
| E6FEA20F2522E3BA001343A0 /* AILinkBleSDK.framework */, | |||
| E622E2B7243F1D4A003C319D /* AiLinkSuper */, | |||
| E622E2CC243F1D4A003C319D /* BabyScale */, | |||
| E622E2B1243F1D4A003C319D /* BloodPressure */, | |||
| @@ -415,6 +440,29 @@ | |||
| path = "八电极体脂秤"; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| E6FEA2112522E3D0001343A0 /* 蓝牙WiFi牙刷 */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| E6FEA2122522E3D0001343A0 /* UIButton+WZAdd.h */, | |||
| E6FEA2132522E3D0001343A0 /* ELInputAlertView.m */, | |||
| E6FEA2142522E3D0001343A0 /* ToothbrushScanViewController.m */, | |||
| E6FEA2152522E3D0001343A0 /* UILabel+WZAdd.m */, | |||
| E6FEA2162522E3D0001343A0 /* ToothbrushConnectionViewController.h */, | |||
| E6FEA2172522E3D0001343A0 /* UIView+Category.m */, | |||
| E6FEA2182522E3D0001343A0 /* ELSelectView.h */, | |||
| E6FEA2192522E3D0001343A0 /* CABasicAnimation+ELAnimation.h */, | |||
| E6FEA21A2522E3D0001343A0 /* UIButton+WZAdd.m */, | |||
| E6FEA21B2522E3D0001343A0 /* UILabel+WZAdd.h */, | |||
| E6FEA21C2522E3D0001343A0 /* ToothbrushScanViewController.h */, | |||
| E6FEA21D2522E3D0001343A0 /* ELInputAlertView.h */, | |||
| E6FEA21E2522E3D0001343A0 /* UIView+Category.h */, | |||
| E6FEA21F2522E3D0001343A0 /* ToothbrushConnectionViewController.m */, | |||
| E6FEA2202522E3D0001343A0 /* CABasicAnimation+ELAnimation.m */, | |||
| E6FEA2212522E3D0001343A0 /* ELSelectView.m */, | |||
| ); | |||
| path = "蓝牙WiFi牙刷"; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| /* End PBXGroup section */ | |||
| /* Begin PBXNativeTarget section */ | |||
| @@ -519,6 +567,7 @@ | |||
| files = ( | |||
| E680BF262510576D005AD827 /* EightScaleScanViewController.m in Sources */, | |||
| E622E2FF243F1D4A003C319D /* ViewController.m in Sources */, | |||
| E6FEA2292522E3D0001343A0 /* ELSelectView.m in Sources */, | |||
| E622E2EF243F1D4A003C319D /* BloodConnectViewController.m in Sources */, | |||
| E622E2F6243F1D4A003C319D /* WheelMonitorConnectViewController.m in Sources */, | |||
| E622E2EB243F1D4A003C319D /* MASConstraint.m in Sources */, | |||
| @@ -526,24 +575,31 @@ | |||
| E622E2FA243F1D4A003C319D /* BabyScaleViewController.m in Sources */, | |||
| E622E301243F1D4A003C319D /* ThermometerConnectViewController.m in Sources */, | |||
| E622E2F8243F1D4A003C319D /* RemoteControlConnectViewController.m in Sources */, | |||
| E6FEA2222522E3D0001343A0 /* ELInputAlertView.m in Sources */, | |||
| E622E2FE243F1D4A003C319D /* BodyFatScaleConnectViewController.m in Sources */, | |||
| E622E2DF243F1D4A003C319D /* HeightGuageConnectViewController.m in Sources */, | |||
| E622E2DE243F1D4A003C319D /* HeightGuageScanViewController.m in Sources */, | |||
| E622E2FC243F1D4A003C319D /* BodyFatScaleScanViewController.m in Sources */, | |||
| E680BF272510576D005AD827 /* EightScaleConnectionViewController.m in Sources */, | |||
| E6FEA2282522E3D0001343A0 /* CABasicAnimation+ELAnimation.m in Sources */, | |||
| E622E2E4243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, | |||
| E6FEA2252522E3D0001343A0 /* UIView+Category.m in Sources */, | |||
| E622E2ED243F1D4A003C319D /* MASViewAttribute.m in Sources */, | |||
| E622E2E1243F1D4A003C319D /* InheritConnectViewController.m in Sources */, | |||
| E622E2F4243F1D4A003C319D /* ForeheadConnectViewController.m in Sources */, | |||
| E6FEA2272522E3D0001343A0 /* ToothbrushConnectionViewController.m in Sources */, | |||
| E622E2EC243F1D4A003C319D /* MASViewConstraint.m in Sources */, | |||
| E6FEA2232522E3D0001343A0 /* ToothbrushScanViewController.m in Sources */, | |||
| E622E2E0243F1D4A003C319D /* SubBleManager.m in Sources */, | |||
| E680BF252510576D005AD827 /* BroadcastScaleViewController.m in Sources */, | |||
| E622E2E7243F1D4A003C319D /* MASConstraintMaker.m in Sources */, | |||
| E622E2E8243F1D4A003C319D /* MASLayoutConstraint.m in Sources */, | |||
| E6FEA2262522E3D0001343A0 /* UIButton+WZAdd.m in Sources */, | |||
| E622E300243F1D4A003C319D /* ThermometerScanViewController.m in Sources */, | |||
| E622E2F9243F1D4A003C319D /* RemoteControlScanViewController.m in Sources */, | |||
| E622E2F3243F1D4A003C319D /* AiLinkSuperViewController.m in Sources */, | |||
| E622E2FD243F1D4A003C319D /* WiFiSetupViewController.m in Sources */, | |||
| E6FEA2242522E3D0001343A0 /* UILabel+WZAdd.m in Sources */, | |||
| E622E2FB243F1D4A003C319D /* BabyScaleConnectViewController.m in Sources */, | |||
| E622E2EA243F1D4A003C319D /* View+MASAdditions.m in Sources */, | |||
| E622E2F2243F1D4A003C319D /* AilinkSuperConnectViewController.m in Sources */, | |||
| @@ -704,6 +760,7 @@ | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CODE_SIGN_STYLE = Automatic; | |||
| CURRENT_PROJECT_VERSION = 202009291140; | |||
| DEVELOPMENT_TEAM = YEU77XR292; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| @@ -714,6 +771,7 @@ | |||
| "$(inherited)", | |||
| "@executable_path/Frameworks", | |||
| ); | |||
| MARKETING_VERSION = 1.1; | |||
| PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| @@ -725,6 +783,7 @@ | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CODE_SIGN_STYLE = Automatic; | |||
| CURRENT_PROJECT_VERSION = 202009291140; | |||
| DEVELOPMENT_TEAM = YEU77XR292; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| @@ -735,6 +794,7 @@ | |||
| "$(inherited)", | |||
| "@executable_path/Frameworks", | |||
| ); | |||
| MARKETING_VERSION = 1.1; | |||
| PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| @@ -75,6 +75,9 @@ typedef NS_ENUM(NSInteger , ELBodyFatScaleBleDataType) { | |||
| /** MCU发送体脂数据给App,发送完毕(一次完整测量结束) */ | |||
| ELBodyFatScaleBleDataType_MCUBackSendUnitResult = 0x82 , | |||
| /** 数据传输结束指令 */ | |||
| ELBodyFatScaleBleDataType_ReceivedDataResult = 0xFE , | |||
| /** 设备上发错误码 */ | |||
| ELBodyFatScaleBleDataType_MCUBackErrorCode = 0xFF , | |||
| }; | |||
| @@ -123,6 +123,7 @@ MCU requests user information( MCU 请求用户信息) | |||
| - (void)sendCurrentUserToBle:(ELBodyFatScaleBleUserModel *)usr; | |||
| -(void)sendReceivedDataResult:(BOOL)result; | |||
| #pragma mark ============ 下发A6指令 ============== | |||
| @@ -0,0 +1,145 @@ | |||
| // | |||
| // ELToothbrushBleManager.h | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2020/5/11. | |||
| // Copyright © 2020 iot_iMac. All rights reserved. | |||
| // | |||
| #import "ELBluetoothManager.h" | |||
| #import "ELToothburshHeader.h" | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @protocol ToothbrushDelegate <NSObject> | |||
| @optional | |||
| //Bluetooth status callback(回调蓝牙状态) | |||
| -(void)toothbrushReceiveState:(ELBluetoothState)state; | |||
| //Callback toothbrush device list(回调牙刷设备列表) | |||
| -(void)toothbrushReceiveDevices:(NSArray<ELPeripheralModel *> *)devices; | |||
| /// Callback gear information(回调档位信息) | |||
| /// @param oneGear First gear(一档档位) | |||
| /// @param twoGear Second gear(二档档位) | |||
| -(void)toothbrushReceiveOneGear:(NSArray<NSNumber *> *)oneGear twoGear:(NSArray<NSNumber *> *)twoGear; | |||
| /// Set work gear result(设置工作档位结果) | |||
| /// @param result 结果 | |||
| -(void)toothbrushReceiveSetWorkGearResult:(ELSetBluetoothResponseType)result; | |||
| //Call back current working gear information(回调当前工作档位信息) | |||
| -(void)toothbrushReceiveWorkGear:(ToothbrushWorkGear)workGear; | |||
| /// Call back trial results(回调试用结果) | |||
| /// @param result 结果 | |||
| -(void)toothbrushReceiveTryResult:(ToothbrushSetResult)result; | |||
| /// Report work phase(上报工作阶段) | |||
| /// @param workPhase Work stage information(工作阶段信息) | |||
| -(void)toothbrushReceiveWorkPhase:(ToothBrushWorkPhase)workPhase; | |||
| /// Recall the data of manually set gear(回调手动设置档位的数据) | |||
| /// @param custom data(数据) | |||
| -(void)toothbrushReceiveCustomData:(ToothbrushCustomData)custom; | |||
| /// Callback switch toothbrush result(回调开关牙刷结果) | |||
| /// @param result 结果 | |||
| -(void)toothbrushReceiveSwitchResult:(ToothbrushSetResult)result; | |||
| /// Callback three-axis direction(回调三轴方向) | |||
| /// @param direction 方向 | |||
| -(void)toothbrushReceiveTriaxialDirection:(ToothbrushTriaxialDirection)direction; | |||
| /// Recall three-axis data(回调三轴数据) | |||
| /// @param success 是否成功 | |||
| /// @param x x轴数据 | |||
| /// @param y y轴数据 | |||
| /// @param z z轴数据 | |||
| -(void)toothbrushReceiveTriaxialData:(BOOL)success triaxialX:(int)x triaxialY:(int)y triaxialZ:(int)z; | |||
| /// Default value of second gear(二档档位默认值) | |||
| /// @param gear Second gear(二档档位) | |||
| -(void)toothbrushReceiveTwoGearDefault:(ToothbrushGearType)gear; | |||
| /// Set the second gear default gear result(设置二档默认档位结果) | |||
| /// @param result 结果 | |||
| -(void)toothbrushReceiveSettingTwoGearDefaultResult:(ELSetBluetoothResponseType)result; | |||
| /// Call back brushing data(回调刷牙数据) | |||
| /// @param data 刷牙数据 | |||
| -(void)toothbrushtReceiveToothbrushData:(ToothbrushData)data; | |||
| @end | |||
| @interface ELToothbrushBleManager : ELBluetoothManager | |||
| //Current working mode(当前工作模式) | |||
| @property (nonatomic, assign) ToothbrushGearType currentMode; | |||
| //Current default working hours(当前默认工作时长) | |||
| @property (nonatomic, assign) NSInteger currentWorkTime; | |||
| //Current gear(当前档位) | |||
| @property (nonatomic, assign) ToothSupportGearType currentGear; | |||
| @property (nonatomic, weak) id<ToothbrushDelegate> toothbrushDelegate; | |||
| +(instancetype)shareManager; | |||
| //Get supported gear(获取支持的档位) | |||
| -(void)getGear; | |||
| /// Set brushing mode(设置刷牙模式) | |||
| /// @param gearType Brushing mode(刷牙模式) | |||
| /// @param interval Brushing time (0: do not modify the working time, before keeping)(刷牙时间(0:不修改工作时长,保留之前)) | |||
| /// @param supportType Which gear is it(是哪个档位) | |||
| -(void)setWorkGear:(ToothbrushGearType)gearType interval:(int)interval supportGearType:(ToothSupportGearType)supportType; | |||
| /// Get the current working gear(获取当前工作的档位) | |||
| -(void)getWorkGear; | |||
| /// try out(试用) | |||
| /// @param gear Gear (ToothbrushGearTypeStop means stop trial)(档位(ToothbrushGearTypeStop 表示停止试用)) | |||
| /// @param supportType Which gear(第几档) | |||
| /// @param frequency 频率 | |||
| /// @param duty 占空比 | |||
| -(void)tryGear:(ToothbrushGearType)gear supportType:(ToothSupportGearType)supportType frequency:(int)frequency duty:(int)duty; | |||
| /// Get the current work stage(获取当前工作阶段) | |||
| -(void)getWorkPhase; | |||
| /// Set manual setting gear(设置手动设置档位) | |||
| /// @param frequency 频率 | |||
| /// @param duty 占空比 | |||
| /// @param interval 时间 | |||
| -(void)setCustomGearData:(int)frequency duty:(int)duty interval:(int)interval; | |||
| /// Get manual profile data(获取手动设置档数据) | |||
| -(void)getCustomGear; | |||
| /// Switch toothbrush(开关牙刷) | |||
| -(void)switchToothbrush; | |||
| //Get three axis direction(获取三轴方向) | |||
| -(void)getTriaxialDirection; | |||
| //Get three-axis data(获取三轴数据) | |||
| -(void)getTriaxialData; | |||
| //Set the second gear default gear(设置二档默认档位) | |||
| -(void)setTwoGearDefaultGear:(ToothbrushGearType)gear; | |||
| //Get the second gear default gear(获取二档默认档位) | |||
| -(void)getTwoGearDefualt; | |||
| //Report the results of receiving brushing data(上报刷牙数据接收结果) | |||
| -(void)reportReceiveResultOfToothbrushData:(BOOL)result; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,113 @@ | |||
| // | |||
| // ELToothburshHeader.h | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2020/5/11. | |||
| // Copyright © 2020 iot_iMac. All rights reserved. | |||
| // | |||
| #ifndef ELToothburshHeader_h | |||
| #define ELToothburshHeader_h | |||
| #import "ELSDKHeader.h" | |||
| typedef NS_ENUM(NSUInteger, ToothSupportGearType) { | |||
| ToothSupportGearTypeUnknown = 0x00, //Unsupported gear(不支持的档位) | |||
| ToothSupportGearTypeOneGear = 0x01, //First gear(一档) | |||
| ToothSupportGearTypeTwoGear = 0x02, //Second gear(二档) | |||
| }; | |||
| //Working gear(工作档位) | |||
| typedef NS_ENUM(NSUInteger, ToothbrushGearType) { | |||
| ToothbrushGearTypeStop = 0x00, //Stop the motor(停止电机) | |||
| ToothbrushGearTypeClean = 0x01, //clean(清洁) | |||
| ToothbrushGearTypeWhite = 0x02, //Whitening(美白) | |||
| ToothbrushGearTypeMassage = 0x03, //massage(按摩) | |||
| ToothbrushGearTypeSenstitive = 0x04, //sensitive(敏感) | |||
| ToothbrushGearTypePolish = 0x05, //polishing(抛光) | |||
| ToothbrushGearTypeGumCare = 0x06, //Gum care(牙龈护理) | |||
| ToothbrushGearTypeRefresh = 0x07, //gargle(漱口) | |||
| ToothbrushGearTypeMascare = 0x08, //health care(保健) | |||
| ToothbrushGearTypeNewbie = 0x09, //Novice(新手) | |||
| ToothbrushGearTypeSoft = 0x0A, //Shurou(舒柔) | |||
| ToothbrushGearTypeGentle = 0x0B, //gentle(轻柔) | |||
| ToothbrushGearTypePamper = 0x0C, //Care(呵护) | |||
| ToothbrushGearTypeCustom = 0xFF, //manual setting(手动设置) | |||
| }; | |||
| typedef NS_ENUM(NSUInteger, ToothbrushDataType) { | |||
| ToothbrushDataTypeSetGear = 0x02,//Set gear(设置档位) | |||
| ToothbrushDataTypeGetGear = 0x03,//Get the current working gear(获取当前工作的档位) | |||
| ToothbrushDataTypeTry = 0x06,//try out(试用) | |||
| ToothbrushDataTypeWorkPhase = 0x07,//Work Phase(工作阶段) | |||
| ToothbrushDataTypeSetCustomData = 0x09,//Set manual setting mode(设置手动设置模式) | |||
| ToothbrushDataTypeGetCustomGear = 0x0A,//Get manually set data(获取手动设置的数据) | |||
| ToothbrushDataTypeSwitchWork = 0x0B,//Switch toothbrush(开关牙刷) | |||
| ToothbrushDataTypeSetTwoGearDefault = 0x0C,//Set second gear default(设置二档默认) | |||
| ToothbrushDataTypeGetTwoGearDefault = 0x0D,//Get second gear default(获取二档默认) | |||
| ToothbrushDataTypeToothbrushData = 0xFD,//Brushing data(刷牙数据) | |||
| ToothbrushDataTypeReportResult = 0xFE,//Report received data result(上报接收数据结果) | |||
| }; | |||
| typedef NS_ENUM(NSUInteger, ToothbrushA6DataType) { | |||
| ToothbrushA6DataTypeTriaxialDirection = 0x02, //Get the three-axis direction of the toothbrush(获取牙刷三轴方向) | |||
| ToothbrushA6DataTypeTriaxialData = 0x05, //Get toothbrush three-axis data(获取牙刷三轴数据) | |||
| }; | |||
| typedef NS_ENUM(NSUInteger, ToothbrushSetResult) { | |||
| ToothbrushSetResultSuccess,//Set successfully(设置成功) | |||
| ToothbrushSetResultFail,//Setting failed for unknown reason(设置失败,原因未知) | |||
| ToothbrushSetResultUnsupport,//Does not support settings(不支持设置) | |||
| ToothbrushSetResultLowPower,//Setting failed, battery voltage is low(设置失败,电池电压不足) | |||
| ToothbrushSetResultCharging,//Setting failed, charging(设置失败,正在充电) | |||
| ToothbrushSetResultWorking,//Setting failed, working(设置失败,正在工作) | |||
| }; | |||
| //Work Phase(工作阶段) | |||
| typedef NS_ENUM(NSUInteger, ToothbrushWorkPhaseType) { | |||
| ToothbrushWorkPhaseTypeLeftTop, | |||
| ToothbrushWorkPhaseTypeLeftBottom, | |||
| ToothbrushWorkPhaseTypeRightTop, | |||
| ToothbrushWorkPhaseTypeRightBottom | |||
| }; | |||
| //Y axis direction(Y轴方向) | |||
| typedef NS_ENUM(NSUInteger, ToothbrushTriaxialDirection) { | |||
| ToothbrushTriaxialDirectionYTop = 1,//Y axis up(Y轴朝上) | |||
| ToothbrushTriaxialDirectionYBottom = 2,//Y axis down(Y轴朝下) | |||
| ToothbrushTriaxialDirectionYLeft = 3,//Y axis left(Y轴朝左) | |||
| ToothbrushTriaxialDirectionYRight = 4,//Y axis right(Y轴朝右) | |||
| }; | |||
| typedef struct{ | |||
| int interval;//operating hours(工作时间) | |||
| ToothbrushGearType gearType;//Gear(档位) | |||
| ToothSupportGearType supportType;//What Gear(什么档) | |||
| }ToothbrushWorkGear,ToothbrushWorkGear; | |||
| typedef struct{ | |||
| ToothbrushGearType gear; | |||
| ToothSupportGearType supportType;//一档、二档 | |||
| ToothbrushWorkPhaseType workPhase; | |||
| }ToothBrushWorkPhase,ToothBrushWorkPhase; | |||
| // | |||
| typedef struct{ | |||
| int frequency; | |||
| int duty; | |||
| int interval; | |||
| }ToothbrushCustomData,ToothbrushCustomData; | |||
| //Brushing data(刷牙数据) | |||
| typedef struct{ | |||
| ToothbrushGearType gear;//Working gear(工作档位) | |||
| int workTime;//work time(工作时长) | |||
| int leftTime;//Time left(左边时长) | |||
| int rightTime;//Right time(右边时长) | |||
| int battery;//battery(电量) | |||
| }ToothbrushData,ToothbrushData; | |||
| #endif /* ELToothburshHeader_h */ | |||
| @@ -50,11 +50,11 @@ | |||
| </data> | |||
| <key>Headers/ELBodyFatScaleBleHeader.h</key> | |||
| <data> | |||
| 0b9mGDuee7WiIQE4CW0ADfbEL1s= | |||
| d9CouBwRoqMKUrT+iiS0UztzPo4= | |||
| </data> | |||
| <key>Headers/ELBodyFatScaleBleManager.h</key> | |||
| <data> | |||
| k+OxOANxEznDe5jW76CiJ9hdU7k= | |||
| aOe/Psooxp0TUxRdLYUmY7I7VrA= | |||
| </data> | |||
| <key>Headers/ELBodyFatScaleBleUserModel.h</key> | |||
| <data> | |||
| @@ -160,6 +160,14 @@ | |||
| <data> | |||
| Oa8GTYS1hEhJk+BQL1IiR2T3eSw= | |||
| </data> | |||
| <key>Headers/ELToothbrushBleManager.h</key> | |||
| <data> | |||
| TgXiM9WWYyDwMboD7z+CRuTnCbI= | |||
| </data> | |||
| <key>Headers/ELToothburshHeader.h</key> | |||
| <data> | |||
| QHN/+6s7uaNjGtbsXs91q11T2aM= | |||
| </data> | |||
| <key>Headers/ELUnitConvertTool.h</key> | |||
| <data> | |||
| KUvTJzAj6UgO0TVIag6jroPEZ9g= | |||
| @@ -312,22 +320,22 @@ | |||
| <dict> | |||
| <key>hash</key> | |||
| <data> | |||
| 0b9mGDuee7WiIQE4CW0ADfbEL1s= | |||
| d9CouBwRoqMKUrT+iiS0UztzPo4= | |||
| </data> | |||
| <key>hash2</key> | |||
| <data> | |||
| 2py6JfIiYKS46qwDo7/27T0rqmu7YbHa+fqUBdvhth0= | |||
| pKjb8UqI7IWcu3tjnBMSvE5QrbjyydIEe/CiN7dzs+g= | |||
| </data> | |||
| </dict> | |||
| <key>Headers/ELBodyFatScaleBleManager.h</key> | |||
| <dict> | |||
| <key>hash</key> | |||
| <data> | |||
| k+OxOANxEznDe5jW76CiJ9hdU7k= | |||
| aOe/Psooxp0TUxRdLYUmY7I7VrA= | |||
| </data> | |||
| <key>hash2</key> | |||
| <data> | |||
| v1HPAh30uLZy9KqJxyWSvifOrjCBTDPNRYKsM/kDPw4= | |||
| yP0Y2J8Opesx6PnzjJRowY6jVqShxqay2AO3JlakpkY= | |||
| </data> | |||
| </dict> | |||
| <key>Headers/ELBodyFatScaleBleUserModel.h</key> | |||
| @@ -616,6 +624,28 @@ | |||
| gSjca3FLXifg5U5v47xNQpOf4dgQ0ib6CwitQPp1Hbs= | |||
| </data> | |||
| </dict> | |||
| <key>Headers/ELToothbrushBleManager.h</key> | |||
| <dict> | |||
| <key>hash</key> | |||
| <data> | |||
| TgXiM9WWYyDwMboD7z+CRuTnCbI= | |||
| </data> | |||
| <key>hash2</key> | |||
| <data> | |||
| vrkXk3mi2klykCre31uYLq5HA1JeBiyWR5dguDpSOpg= | |||
| </data> | |||
| </dict> | |||
| <key>Headers/ELToothburshHeader.h</key> | |||
| <dict> | |||
| <key>hash</key> | |||
| <data> | |||
| QHN/+6s7uaNjGtbsXs91q11T2aM= | |||
| </data> | |||
| <key>hash2</key> | |||
| <data> | |||
| 0ASrA6x/0Oawl6R0Sa+RejPtC7W1JoYM7YxK6cvZdDI= | |||
| </data> | |||
| </dict> | |||
| <key>Headers/ELUnitConvertTool.h</key> | |||
| <dict> | |||
| <key>hash</key> | |||
| @@ -15,11 +15,13 @@ | |||
| <key>CFBundlePackageType</key> | |||
| <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>1.0</string> | |||
| <string>$(MARKETING_VERSION)</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>1</string> | |||
| <string>$(CURRENT_PROJECT_VERSION)</string> | |||
| <key>LSRequiresIPhoneOS</key> | |||
| <true/> | |||
| <key>NSBluetoothAlwaysUsageDescription</key> | |||
| <string></string> | |||
| <key>UIApplicationSceneManifest</key> | |||
| <dict> | |||
| <key>UIApplicationSupportsMultipleScenes</key> | |||
| @@ -60,7 +62,5 @@ | |||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||
| </array> | |||
| <key>NSBluetoothAlwaysUsageDescription</key> | |||
| <string></string> | |||
| </dict> | |||
| </plist> | |||
| @@ -20,6 +20,7 @@ | |||
| #import "BodyFatScaleScanViewController.h" | |||
| #import "BroadcastScaleViewController.h" | |||
| #import "EightScaleScanViewController.h" | |||
| #import "ToothbrushScanViewController.h" | |||
| @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> | |||
| @@ -33,7 +34,7 @@ | |||
| - (void)viewDidLoad { | |||
| [super viewDidLoad]; | |||
| self.datas = @[@"自己写协议走透传",@"有AILink协议自己解析数据",@"集成婴儿秤",@"集成血压计",@"集成身高仪",@"集成遥控器",@"集成额温枪",@"集成温度计",@"集成胎压监测",@"集成体脂秤",@"集成广播秤",@"八电极体脂秤"]; | |||
| self.datas = @[@"自己写协议走透传",@"有AILink协议自己解析数据",@"集成婴儿秤",@"集成血压计",@"集成身高仪",@"集成遥控器",@"集成额温枪",@"集成温度计",@"集成胎压监测",@"集成体脂秤",@"集成广播秤",@"八电极体脂秤",@"蓝牙WiFi牙刷"]; | |||
| [self.view addSubview:self.tableView]; | |||
| [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.top.left.right.bottom.mas_equalTo(0); | |||
| @@ -104,6 +105,10 @@ | |||
| EightScaleScanViewController *vc = [[EightScaleScanViewController alloc] init]; | |||
| vc.title = self.datas[indexPath.row]; | |||
| [self.navigationController pushViewController:vc animated:YES]; | |||
| }else if (indexPath.row == 12){ | |||
| ToothbrushScanViewController *vc = [[ToothbrushScanViewController alloc] init]; | |||
| vc.title = self.datas[indexPath.row]; | |||
| [self.navigationController pushViewController:vc animated:YES]; | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| // | |||
| // CABasicAnimation+ELAnimation.h | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2019/1/23. | |||
| // Copyright © 2019年 iot_iMac. All rights reserved. | |||
| // | |||
| #import <QuartzCore/QuartzCore.h> | |||
| #define ELAnimationDuration 0.2 | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface CABasicAnimation (ELAnimation) | |||
| //缩放动画show | |||
| +(CABasicAnimation *)scaleShowAnimationWithDuration:(CGFloat)duration; | |||
| //缩放动画hide | |||
| +(CABasicAnimation *)scaleHideAnimationWithDuration:(CGFloat)duration; | |||
| //平移动画 | |||
| +(CABasicAnimation *)positionAnimationWithBeginPoint:(CGPoint)beginPoint withEndPoint:(CGPoint)endPoint; | |||
| //旋转旋转动画 | |||
| +(CABasicAnimation *)rotationAnimationWithBeginValue:(CGFloat)beginValue endValue:(CGFloat)endValue; | |||
| +(CABasicAnimation *)alphaAnimation; | |||
| +(CABasicAnimation *)heightAnimation; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,75 @@ | |||
| // | |||
| // CABasicAnimation+ELAnimation.m | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2019/1/23. | |||
| // Copyright © 2019年 iot_iMac. All rights reserved. | |||
| // | |||
| #import "CABasicAnimation+ELAnimation.h" | |||
| #import <UIKit/UIKit.h> | |||
| @implementation CABasicAnimation (ELAnimation) | |||
| // | |||
| +(CABasicAnimation *)scaleShowAnimationWithDuration:(CGFloat)duration{ | |||
| CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; | |||
| animation.fromValue = [NSNumber numberWithInteger:0.0]; | |||
| animation.toValue = [NSNumber numberWithInteger:1.0]; | |||
| animation.duration = duration; | |||
| animation.removedOnCompletion = NO; | |||
| animation.fillMode = kCAFillModeForwards; | |||
| return animation; | |||
| } | |||
| +(CABasicAnimation *)scaleHideAnimationWithDuration:(CGFloat)duration{ | |||
| CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; | |||
| animation.fromValue = [NSNumber numberWithInteger:1.0]; | |||
| animation.toValue = [NSNumber numberWithInteger:0.0]; | |||
| animation.duration = duration; | |||
| animation.removedOnCompletion = NO; | |||
| animation.fillMode = kCAFillModeForwards; | |||
| return animation; | |||
| } | |||
| +(CABasicAnimation *)positionAnimationWithBeginPoint:(CGPoint)beginPoint withEndPoint:(CGPoint)endPoint{ | |||
| CABasicAnimation * position =[CABasicAnimation animationWithKeyPath:@"position"]; | |||
| position.fromValue = [NSValue valueWithCGPoint:beginPoint]; | |||
| position.toValue = [NSValue valueWithCGPoint:endPoint]; | |||
| position.duration = ELAnimationDuration; | |||
| position.removedOnCompletion = NO; | |||
| position.fillMode = kCAFillModeForwards; | |||
| position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; | |||
| return position; | |||
| } | |||
| +(CABasicAnimation *)rotationAnimationWithBeginValue:(CGFloat)beginValue endValue:(CGFloat)endValue{ | |||
| CABasicAnimation *aniamtion = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; | |||
| aniamtion.fromValue = [NSNumber numberWithFloat:beginValue]; | |||
| aniamtion.toValue = [NSNumber numberWithFloat:endValue]; | |||
| aniamtion.duration = ELAnimationDuration; | |||
| aniamtion.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; | |||
| aniamtion.repeatCount = 1; | |||
| aniamtion.fillMode = kCAFillModeForwards; | |||
| aniamtion.removedOnCompletion = NO; | |||
| return aniamtion; | |||
| } | |||
| +(CABasicAnimation *)alphaAnimation{ | |||
| CABasicAnimation *aniamtion = [CABasicAnimation animationWithKeyPath:@"opacity"]; | |||
| aniamtion.fromValue = @1; | |||
| aniamtion.toValue = @0.3; | |||
| aniamtion.duration = ELAnimationDuration; | |||
| aniamtion.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; | |||
| aniamtion.fillMode = kCAFillModeForwards; | |||
| aniamtion.repeatCount = INFINITY; | |||
| aniamtion.removedOnCompletion = YES; | |||
| return aniamtion; | |||
| } | |||
| +(CABasicAnimation *)heightAnimation{ | |||
| CABasicAnimation *aniamtion = [CABasicAnimation animationWithKeyPath:@"scale.y"]; | |||
| aniamtion.fromValue = @0; | |||
| aniamtion.toValue = @1; | |||
| aniamtion.duration = ELAnimationDuration; | |||
| aniamtion.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; | |||
| aniamtion.fillMode = kCAFillModeForwards; | |||
| aniamtion.removedOnCompletion = NO; | |||
| return aniamtion; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,36 @@ | |||
| // | |||
| // ELInputAlertView.h | |||
| // 自定义tabbar | |||
| // | |||
| // Created by iot_user on 2019/1/19. | |||
| // Copyright © 2019年 IOT. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface ELInputAlertView : UIView | |||
| @property (nonatomic, strong) UIColor *topBtnBackColor; | |||
| //自动隐藏 | |||
| @property (nonatomic, assign) BOOL leftAutoHide;//default:YES | |||
| @property (nonatomic, assign) BOOL rightAutoHide;//default:NO | |||
| @property (nonatomic, assign) BOOL first;// | |||
| // | |||
| @property (nonatomic, copy) void(^leftBlock)(NSString * text); | |||
| @property (nonatomic, copy) void(^rightBlock)(NSString * text); | |||
| @property (nonatomic, copy) BOOL(^leftHideBlock)(NSString * text, UIView *view); | |||
| @property (nonatomic, copy) BOOL(^rightHideBlock)(NSString * text, UIView *view); | |||
| -(instancetype)initWithTittle:(NSString *)title withText:(NSString *)text withMessage:(NSString *)placeholder withLeftButton:(NSString *)leftTitle withRightButton:(NSString *)rightTitle; | |||
| -(void)show; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,215 @@ | |||
| // | |||
| // ELInputAlertView.m | |||
| // 自定义tabbar | |||
| // | |||
| // Created by iot_user on 2019/1/19. | |||
| // Copyright © 2019年 IOT. All rights reserved. | |||
| // | |||
| #import "ELInputAlertView.h" | |||
| #import "CABasicAnimation+ELAnimation.h" | |||
| #import "UIView+Category.h" | |||
| #import "Masonry.h" | |||
| //字符串是否为空 | |||
| //#define IsEmptyStr(str) [NSString isEmptyString:str] | |||
| //375x667的屏幕 | |||
| #define ScreenHeight [UIScreen mainScreen].bounds.size.height | |||
| #define ScreenWeight [UIScreen mainScreen].bounds.size.width | |||
| // | |||
| //#define SW(w) ScreenWeight*(w/375.0) | |||
| //#define SH(h) ScreenHeight*(h/667.0) | |||
| #define AlertWidth 285 | |||
| #define AlertHeight 285 | |||
| #define ButtonHeight 45 | |||
| #define ButtonEdge 25 | |||
| @interface ELInputAlertView() | |||
| @property (nonatomic, strong) UIView * alertView; | |||
| @property (nonatomic, strong) UITextField * inputTF; | |||
| @property (nonatomic, strong) UIButton *topBtn; | |||
| @property (nonatomic, strong) UIButton *bottomBtn; | |||
| @end | |||
| @implementation ELInputAlertView | |||
| -(UITextField *)inputTF{ | |||
| if (_inputTF == nil) { | |||
| _inputTF = [[UITextField alloc]init]; | |||
| _inputTF.textColor = [UIColor blackColor]; | |||
| _inputTF.font = [UIFont systemFontOfSize:18]; | |||
| _inputTF.clearButtonMode = UITextFieldViewModeWhileEditing; | |||
| // _inputTF.layer.borderColor = EL242GrayColor.CGColor; | |||
| // _inputTF.layer.borderWidth = 1.0f; | |||
| // | |||
| UIView *leftView = [[UIView alloc]init]; | |||
| leftView.frame = CGRectMake(0, 0, 5, 5); | |||
| _inputTF.leftView = leftView; | |||
| _inputTF.leftViewMode = UITextFieldViewModeAlways; | |||
| } | |||
| return _inputTF; | |||
| } | |||
| -(instancetype)initWithTittle:(NSString *)title withText:(NSString *)text withMessage:(NSString *)placeholder withLeftButton:(NSString *)leftTitle withRightButton:(NSString *)rightTitle{ | |||
| if (self = [super init]) { | |||
| self.frame = [UIScreen mainScreen].bounds; | |||
| self.leftAutoHide = YES; | |||
| self.rightAutoHide = NO; | |||
| // | |||
| UIView * backgrand = [[UIView alloc]init]; | |||
| backgrand.backgroundColor = [UIColor blackColor]; | |||
| backgrand.alpha = 0.5; | |||
| backgrand.frame = self.frame; | |||
| [self addSubview:backgrand]; | |||
| // | |||
| UIView * alertView = [[UIView alloc]init]; | |||
| self.alertView = alertView; | |||
| alertView.frame = CGRectMake((ScreenWeight-AlertWidth)/2, (ScreenHeight - AlertHeight)/2, AlertWidth, AlertHeight); | |||
| alertView.backgroundColor = [UIColor whiteColor]; | |||
| [self addSubview:alertView]; | |||
| UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:alertView.bounds byRoundingCorners:(UIRectCornerAllCorners) cornerRadii:CGSizeMake(5, 5)]; | |||
| CAShapeLayer * layer = [CAShapeLayer layer]; | |||
| layer.frame = alertView.bounds; | |||
| layer.path = path.CGPath; | |||
| alertView.layer.mask = layer; | |||
| //标题 | |||
| UILabel * titleLbl = [[UILabel alloc]init]; | |||
| titleLbl.text = title; | |||
| titleLbl.textColor = [UIColor blackColor]; | |||
| titleLbl.font = [UIFont systemFontOfSize:16]; | |||
| titleLbl.textAlignment = NSTextAlignmentCenter; | |||
| titleLbl.frame = CGRectMake(10, 10, alertView.frame.size.width-20, 25); | |||
| [alertView addSubview:titleLbl]; | |||
| //输入框 | |||
| // if (IsEmptyStr(placeholder)) { | |||
| // placeholder = @""; | |||
| // } | |||
| self.inputTF.attributedPlaceholder = [[NSAttributedString alloc]initWithString:placeholder attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18],NSForegroundColorAttributeName:[UIColor lightGrayColor]}]; | |||
| self.inputTF.text = text; | |||
| [self.inputTF becomeFirstResponder]; | |||
| self.inputTF.frame = CGRectMake(10, CGRectGetMaxY(titleLbl.frame)+55, alertView.frame.size.width-20, 40); | |||
| [alertView addSubview:self.inputTF]; | |||
| // | |||
| UIView *lineView = [[UIView alloc] init]; | |||
| lineView.backgroundColor = [UIColor blackColor]; | |||
| [alertView addSubview:lineView]; | |||
| [lineView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.mas_equalTo(15); | |||
| make.right.mas_equalTo(-15); | |||
| make.top.equalTo(self.inputTF.mas_bottom).mas_offset(5); | |||
| make.height.mas_equalTo(1); | |||
| }]; | |||
| //下边按钮 | |||
| UIButton * leftButton = [UIButton buttonWithType:(UIButtonTypeCustom)]; | |||
| self.bottomBtn = leftButton; | |||
| [leftButton setTitle:leftTitle forState:(UIControlStateNormal)]; | |||
| [leftButton setTitleColor:[UIColor redColor] forState:(UIControlStateNormal)]; | |||
| [leftButton setTitleColor:[UIColor grayColor] forState:(UIControlStateHighlighted)]; | |||
| leftButton.titleLabel.font = [UIFont systemFontOfSize:18]; | |||
| leftButton.frame = CGRectMake(ButtonEdge, alertView.frame.size.height-ButtonHeight-5, alertView.frame.size.width-ButtonEdge*2, ButtonHeight); | |||
| [alertView addSubview:leftButton]; | |||
| [leftButton addTarget:self action:@selector(leftAction:) forControlEvents:(UIControlEventTouchUpInside)]; | |||
| //上边按钮 | |||
| UIButton * rightButton = [UIButton buttonWithType:(UIButtonTypeCustom)]; | |||
| self.topBtn = rightButton; | |||
| [rightButton setTitle:rightTitle forState:(UIControlStateNormal)]; | |||
| [rightButton setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)]; | |||
| [rightButton setTitleColor:[UIColor grayColor] forState:(UIControlStateHighlighted)]; | |||
| rightButton.titleLabel.font = [UIFont systemFontOfSize:18]; | |||
| rightButton.frame = CGRectMake(ButtonEdge, alertView.frame.size.height-ButtonHeight*2-10, alertView.frame.size.width-ButtonEdge*2, ButtonHeight); | |||
| [alertView addSubview:rightButton]; | |||
| rightButton.backgroundColor = [UIColor blueColor]; | |||
| [rightButton addTarget:self action:@selector(rightAction:) forControlEvents:(UIControlEventTouchUpInside)]; | |||
| [rightButton setCornerRadii:CGSizeMake(ButtonHeight/2, ButtonHeight/2) withCorner:(UIRectCornerAllCorners)]; | |||
| // //竖线 | |||
| // UIView *sxLine = [[UIView alloc]init]; | |||
| // sxLine.frame = CGRectMake(alertView.frame.size.width/2, alertView.frame.size.height-ButtonHeight, 1, ButtonHeight); | |||
| // sxLine.backgroundColor = EL242GrayColor; | |||
| // [alertView addSubview:sxLine]; | |||
| // //横线 | |||
| // UIView * hxLine = [[UIView alloc]init]; | |||
| // hxLine.backgroundColor = EL242GrayColor; | |||
| // hxLine.frame = CGRectMake(0, alertView.frame.size.height-ButtonHeight, alertView.frame.size.width, 1); | |||
| // [alertView addSubview:hxLine]; | |||
| // | |||
| [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; | |||
| [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; | |||
| } | |||
| return self; | |||
| } | |||
| -(void)setTopBtnBackColor:(UIColor *)topBtnBackColor{ | |||
| _topBtnBackColor = topBtnBackColor; | |||
| self.topBtn.backgroundColor = topBtnBackColor; | |||
| } | |||
| -(void)keyboardWillShow:(NSNotification *)noti{ | |||
| CGRect frame = [[[noti userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; | |||
| CGRect alertFrame = self.alertView.frame; | |||
| alertFrame.origin.y = ScreenHeight - frame.size.height - AlertHeight - 10>0?ScreenHeight - frame.size.height - AlertHeight - 10:0; | |||
| self.alertView.frame = alertFrame; | |||
| } | |||
| -(void)keyboardWillHide:(NSNotification *)noti{ | |||
| CGRect alertFrame = self.alertView.frame; | |||
| alertFrame.origin.y = (ScreenHeight - AlertHeight)/2; | |||
| self.alertView.frame = alertFrame; | |||
| } | |||
| -(void)leftAction:(UIButton *)sender{ | |||
| if (self.leftBlock) { | |||
| self.leftBlock(self.inputTF.text); | |||
| [self hide]; | |||
| [self.inputTF resignFirstResponder]; | |||
| } | |||
| if (self.leftHideBlock) { | |||
| BOOL hide = self.leftHideBlock(self.inputTF.text, self); | |||
| if (hide == YES) { | |||
| [self hide]; | |||
| [self.inputTF resignFirstResponder]; | |||
| } | |||
| } | |||
| if (self.leftAutoHide) { | |||
| [self hide]; | |||
| [self.inputTF resignFirstResponder]; | |||
| } | |||
| } | |||
| -(void)rightAction:(UIButton *)sender{ | |||
| if (self.rightBlock) { | |||
| self.rightBlock(self.inputTF.text); | |||
| [self hide]; | |||
| [self.inputTF resignFirstResponder]; | |||
| } | |||
| if (self.rightHideBlock) { | |||
| BOOL hide = self.rightHideBlock(self.inputTF.text, self); | |||
| if (hide == YES) { | |||
| [self.inputTF resignFirstResponder]; | |||
| [self hide]; | |||
| } | |||
| } | |||
| if (self.rightAutoHide) { | |||
| [self.inputTF resignFirstResponder]; | |||
| [self hide]; | |||
| } | |||
| } | |||
| -(void)show{ | |||
| UIWindow * window = [UIApplication sharedApplication].windows.firstObject; | |||
| [window addSubview:self]; | |||
| [self.alertView.layer addAnimation:[CABasicAnimation scaleShowAnimationWithDuration:ELAnimationDuration] forKey:@"ELInputAlertViewShowAnimation"]; | |||
| } | |||
| -(void)hide{ | |||
| [self.alertView.layer addAnimation:[CABasicAnimation scaleHideAnimationWithDuration:ELAnimationDuration] forKey:@"ELInputAlertViewHideAnimation"]; | |||
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ELAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |||
| [self removeFromSuperview]; | |||
| }); | |||
| } | |||
| @end | |||
| @@ -0,0 +1,29 @@ | |||
| // | |||
| // ELSelectView.h | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2019/1/23. | |||
| // Copyright © 2019年 iot_iMac. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface ELSelectViewCell : UITableViewCell | |||
| @property (nonatomic, strong) UILabel *titleLbl; | |||
| @end | |||
| @interface ELSelectView : UIView | |||
| @property (nonatomic, copy) void (^selectRowBlock)(NSInteger row); | |||
| -(instancetype)initWithTitle:(NSString *)title withSelectArray:(NSArray<NSString *> *)array; | |||
| -(void)show; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,180 @@ | |||
| // | |||
| // ELSelectView.m | |||
| // Elink | |||
| // | |||
| // Created by iot_user on 2019/1/23. | |||
| // Copyright © 2019年 iot_iMac. All rights reserved. | |||
| // | |||
| #import "ELSelectView.h" | |||
| #import "CABasicAnimation+ELAnimation.h" | |||
| #import "UILabel+WZAdd.h" | |||
| #import "Masonry.h" | |||
| #import "UIButton+WZAdd.h" | |||
| #import "AppDelegate.h" | |||
| //375x667的屏幕 | |||
| #define ScreenH [UIScreen mainScreen].bounds.size.height | |||
| #define ScreenW [UIScreen mainScreen].bounds.size.width | |||
| #define MaxHeight ScreenH/2 | |||
| #define MaxWeight 250 | |||
| #define CellHeight 45 | |||
| @implementation ELSelectViewCell | |||
| -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ | |||
| if (self = [super initWithStyle:style | |||
| reuseIdentifier:reuseIdentifier]) { | |||
| self.titleLbl = [UILabel createWithFrame:CGRectZero bgColor:[UIColor whiteColor] text:nil textColor:[UIColor grayColor] font:[UIFont systemFontOfSize:18] align:NSTextAlignmentCenter]; | |||
| self.titleLbl.numberOfLines=0; | |||
| self.titleLbl.adjustsFontSizeToFitWidth = YES; | |||
| [self.contentView addSubview:self.titleLbl]; | |||
| [self.titleLbl mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.top.left.right.bottom.mas_equalTo(0); | |||
| }]; | |||
| self.selectionStyle = UITableViewCellSelectionStyleNone; | |||
| } | |||
| return self; | |||
| } | |||
| @end | |||
| static NSString * ELSelectViewCellid = @"ELSelectViewCellid"; | |||
| @interface ELSelectView()<UITableViewDelegate, UITableViewDataSource> | |||
| @property (nonatomic, strong) UITableView * tableView; | |||
| @property (nonatomic, strong) UIView *alertView; | |||
| @property (nonatomic, copy) NSArray * datas; | |||
| @end | |||
| @implementation ELSelectView | |||
| -(UITableView *)tableView{ | |||
| if (_tableView == nil) { | |||
| _tableView = [[UITableView alloc]init]; | |||
| _tableView.delegate = self; | |||
| _tableView.dataSource = self; | |||
| _tableView.tableFooterView = [UIView new]; | |||
| _tableView.separatorColor = [UIColor clearColor]; | |||
| } | |||
| return _tableView; | |||
| } | |||
| -(instancetype)initWithTitle:(NSString *)title withSelectArray:(NSArray<NSString *> *)array{ | |||
| if (self = [super init]) { | |||
| self.frame = [UIScreen mainScreen].bounds; | |||
| self.datas = [array copy]; | |||
| // | |||
| UIView * backgrand = [[UIView alloc]init]; | |||
| backgrand.backgroundColor = [UIColor blackColor]; | |||
| backgrand.alpha = 0.5; | |||
| backgrand.frame = self.frame; | |||
| [self addSubview:backgrand]; | |||
| // | |||
| CGFloat height = (array.count+1)*CellHeight; | |||
| height = (height > MaxHeight?MaxHeight:height)+33; | |||
| //TopMargin | |||
| UIView * alertView = [[UIView alloc]init]; | |||
| self.alertView = alertView; | |||
| alertView.frame = CGRectMake((ScreenW-MaxWeight)/2,(ScreenH-height)/2, MaxWeight, height); | |||
| alertView.backgroundColor = [UIColor whiteColor]; | |||
| // alertView.layer.cornerRadius = 5; | |||
| [self addSubview:alertView]; | |||
| // | |||
| UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:alertView.bounds byRoundingCorners:(UIRectCornerAllCorners) cornerRadii:CGSizeMake(5, 5)]; | |||
| CAShapeLayer * layer = [CAShapeLayer layer]; | |||
| layer.frame = alertView.bounds; | |||
| layer.path = path.CGPath; | |||
| alertView.layer.mask = layer; | |||
| // | |||
| UILabel * titleLbl = [UILabel createWithFrame:CGRectZero bgColor:[UIColor whiteColor] text:title textColor:[UIColor lightGrayColor] font:[UIFont systemFontOfSize:15] align:NSTextAlignmentCenter]; | |||
| [alertView addSubview:titleLbl]; | |||
| [titleLbl mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.top.left.right.mas_equalTo(0); | |||
| make.height.mas_equalTo(33); | |||
| }]; | |||
| // | |||
| UIButton * cancelBtn = [UIButton createWithFrame:CGRectZero bgColor:[UIColor whiteColor] font:[UIFont systemFontOfSize:16] norTitle:@"取消" norTitleColor:[UIColor lightGrayColor] norImage:nil borderColor:nil needRoundCorner:NO target:self action:@selector(cancelAction:)]; | |||
| [cancelBtn setTitleColor:[UIColor redColor] forState:(UIControlStateHighlighted)]; | |||
| [alertView addSubview:cancelBtn]; | |||
| [cancelBtn mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.bottom.left.right.mas_equalTo(0); | |||
| make.height.mas_equalTo(CellHeight); | |||
| }]; | |||
| // | |||
| [alertView addSubview:self.tableView]; | |||
| [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.right.mas_equalTo(0); | |||
| make.top.equalTo(titleLbl.mas_bottom).mas_offset(0); | |||
| make.bottom.equalTo(cancelBtn.mas_top).mas_equalTo(0); | |||
| }]; | |||
| } | |||
| return self; | |||
| } | |||
| -(void)cancelAction:(UIButton *)sender{ | |||
| [self hide]; | |||
| } | |||
| -(void)show{ | |||
| UIWindow * window = [UIApplication sharedApplication].windows.firstObject;; | |||
| [window addSubview:self]; | |||
| [self.alertView.layer addAnimation:[CABasicAnimation scaleShowAnimationWithDuration:ELAnimationDuration] forKey:@"ELSelectViewShowAnimation"]; | |||
| } | |||
| -(void)hide{ | |||
| [self.alertView.layer addAnimation:[CABasicAnimation scaleHideAnimationWithDuration:ELAnimationDuration] forKey:@"ELSelectViewHideAnimation"]; | |||
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ELAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |||
| [self removeFromSuperview]; | |||
| }); | |||
| } | |||
| #pragma mark ============ UITableView数据源方法 ============== | |||
| - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { | |||
| return 1; | |||
| } | |||
| - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |||
| return self.datas.count; | |||
| } | |||
| - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |||
| ELSelectViewCell * cell = [tableView dequeueReusableCellWithIdentifier:ELSelectViewCellid]; | |||
| if (cell == nil) { | |||
| cell = [[ELSelectViewCell alloc]initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:ELSelectViewCellid]; | |||
| } | |||
| cell.titleLbl.text = self.datas[indexPath.row]; | |||
| return cell; | |||
| } | |||
| #pragma mark ============ UITableView代理 ============== | |||
| - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { | |||
| ELSelectViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; | |||
| cell.titleLbl.textColor = [UIColor blueColor]; | |||
| cell.titleLbl.font = [UIFont systemFontOfSize:20]; | |||
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ELAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |||
| if (self.selectRowBlock) { | |||
| self.selectRowBlock(indexPath.row); | |||
| } | |||
| [self hide]; | |||
| }); | |||
| } | |||
| -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |||
| return CellHeight; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,17 @@ | |||
| // | |||
| // ToothbrushConnectionViewController.h | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by iot_user on 2020/9/29. | |||
| // Copyright © 2020 IOT. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| @class ELPeripheralModel; | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface ToothbrushConnectionViewController : UIViewController | |||
| @property (nonatomic, strong) ELPeripheralModel *p; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,550 @@ | |||
| // | |||
| // ToothbrushConnectionViewController.m | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by iot_user on 2020/9/29. | |||
| // Copyright © 2020 IOT. All rights reserved. | |||
| // | |||
| #import "ToothbrushConnectionViewController.h" | |||
| #import <AILinkBleSDK/ELToothbrushBleManager.h> | |||
| #import "Masonry.h" | |||
| #import "ELInputAlertView.h" | |||
| #import "ELSelectView.h" | |||
| static NSString * const authorizeIntervalKey = @"authorizeIntervalKey"; | |||
| @interface ToothbrushConnectionViewController ()<ToothbrushDelegate,ELBluetoothManagerDelegate,ElBleWifiDelegate> | |||
| @property (nonatomic, strong) UITextView *textView; | |||
| //附近wifi | |||
| @property (nonatomic, strong) NSMutableArray<ELBleWifiDetailModel *> *wifiArr; | |||
| @property (nonatomic, copy) NSString *wifiPwd; | |||
| @end | |||
| @implementation ToothbrushConnectionViewController | |||
| -(NSMutableArray<ELBleWifiDetailModel *> *)wifiArr{ | |||
| if (_wifiArr==nil) { | |||
| _wifiArr = [[NSMutableArray alloc] init]; | |||
| } | |||
| return _wifiArr; | |||
| } | |||
| - (void)viewDidLoad { | |||
| [super viewDidLoad]; | |||
| [self setupUI]; | |||
| [[ELToothbrushBleManager shareManager] startScan]; | |||
| [ELToothbrushBleManager shareManager].toothbrushDelegate = self; | |||
| [ELToothbrushBleManager shareManager].delegate = self; | |||
| [ELToothbrushBleManager shareManager].bleWifiDelegate = self; | |||
| } | |||
| -(void)addLog:(NSString *)log{ | |||
| self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text]; | |||
| } | |||
| -(void)buttonAction:(UIButton *)sender{ | |||
| NSInteger tag = sender.tag; | |||
| if (tag == 1) { | |||
| //MARK:配网 | |||
| if ([ELToothbrushBleManager shareManager].state == ELBluetoothStateDidValidationPass) { | |||
| [self.wifiArr removeAllObjects]; | |||
| [self addLog:@"正在搜索附近的WiFi..."]; | |||
| //搜索附近网络 | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | |||
| }else{ | |||
| [self addLog:@"未连接设备"]; | |||
| [self.navigationController popViewControllerAnimated:YES]; | |||
| } | |||
| }else if (tag == 2){ | |||
| //MARK:配对 | |||
| long long interval = [[NSUserDefaults standardUserDefaults] integerForKey:authorizeIntervalKey]; | |||
| if (interval == 0) { | |||
| interval = [[NSDate date] timeIntervalSince1970]; | |||
| [[NSUserDefaults standardUserDefaults] setInteger:interval forKey:authorizeIntervalKey]; | |||
| [[NSUserDefaults standardUserDefaults] synchronize]; | |||
| } | |||
| [self addLog:@"发起配对"]; | |||
| [[ELToothbrushBleManager shareManager] requestDeviceAuthorization:interval]; | |||
| } | |||
| else if (tag == 3){ | |||
| //MARK:获取设备ID | |||
| [self addLog:@"请求设备ID"]; | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||
| } | |||
| else if (tag == 4){ | |||
| //MARK:获取档位 | |||
| [self addLog:@"请求支持的档位"]; | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeGetBasicInfoData]; | |||
| }else if (tag == 5){ | |||
| //MARK:获取三轴方向 | |||
| [self addLog:@"获取三轴方向"]; | |||
| [[ELToothbrushBleManager shareManager] getTriaxialDirection]; | |||
| }else if (tag == 6){ | |||
| //MARK:获取三轴数据 | |||
| [self addLog:@"获取三轴数据"]; | |||
| [[ELToothbrushBleManager shareManager] getTriaxialData]; | |||
| }else if (tag == 7){ | |||
| //MARK:查询默认刷牙时长和工作档位 | |||
| [self addLog:@"查询默认刷牙时长和工作档位"]; | |||
| [[ELToothbrushBleManager shareManager] getWorkGear]; | |||
| } | |||
| else if (tag == 8){ | |||
| //MARK:查询手动设置信息 | |||
| [self addLog:@"查询手动设置信息"]; | |||
| [[ELToothbrushBleManager shareManager] getCustomGear]; | |||
| } | |||
| else if (tag == 9){ | |||
| //MARK:查询二级档位默认值 | |||
| [self addLog:@"查询二级档位默认值"]; | |||
| [[ELToothbrushBleManager shareManager] getTwoGearDefualt]; | |||
| }else if (tag == 10){ | |||
| //MARK:上报工作阶段 | |||
| [self addLog:@"上报工作阶段"]; | |||
| [[ELToothbrushBleManager shareManager] getWorkPhase]; | |||
| } | |||
| else if (tag == 11){ | |||
| //MARK:设置刷牙模式 | |||
| [self addLog:@"设置刷牙模式:舒柔"]; | |||
| [[ELToothbrushBleManager shareManager] setWorkGear:(ToothbrushGearTypeSoft) interval:120 supportGearType:(ToothSupportGearTypeOneGear)]; | |||
| }else if (tag == 12){ | |||
| //MARK:开关 | |||
| [self addLog:@"开关"]; | |||
| [[ELToothbrushBleManager shareManager] switchToothbrush]; | |||
| }else if (tag == 13){ | |||
| //MARK:设置二档默认 | |||
| [self addLog:@"设置二档默认(清洁)"]; | |||
| [[ELToothbrushBleManager shareManager] setTwoGearDefaultGear:(ToothbrushGearTypeClean)]; | |||
| }else if (tag == 14){ | |||
| //MARK:试用 | |||
| [self addLog:@"试用,手动设置,二档,frequency:67 duty:50"]; | |||
| [[ELToothbrushBleManager shareManager] tryGear:(ToothbrushGearTypeCustom) supportType:(ToothSupportGearTypeTwoGear) frequency:67 duty:50]; | |||
| }else if (tag == 15){ | |||
| //MARK:设置手动档 | |||
| [self addLog:@"设置手动档:frequency:67 duty:50 interval:120"]; | |||
| [[ELToothbrushBleManager shareManager] setCustomGearData:67 duty:50 interval:120]; | |||
| }else if (tag == 16){ | |||
| //MARK:上报接收数据结果 | |||
| [self addLog:@"上报接收数据结果"]; | |||
| [[ELToothbrushBleManager shareManager] reportReceiveResultOfToothbrushData:YES]; | |||
| } | |||
| else{ | |||
| } | |||
| } | |||
| -(void)setupUI{ | |||
| self.view.backgroundColor = [UIColor whiteColor]; | |||
| UIButton *button1 = [self getButtonWithTitle:@"配网" withTag:1]; | |||
| [self.view addSubview:button1]; | |||
| [button1 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.mas_equalTo(10); | |||
| make.top.mas_equalTo(70); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button2 = [self getButtonWithTitle:@"配对" withTag:2]; | |||
| [self.view addSubview:button2]; | |||
| [button2 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button1.mas_right).mas_offset(5); | |||
| make.top.equalTo(button1); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button3 = [self getButtonWithTitle:@"获取设备ID" withTag:3]; | |||
| [self.view addSubview:button3]; | |||
| [button3 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button2.mas_right).mas_offset(5); | |||
| make.top.equalTo(button2); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button4 = [self getButtonWithTitle:@"获取档位" withTag:4]; | |||
| [self.view addSubview:button4]; | |||
| [button4 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button3.mas_right).mas_offset(5); | |||
| make.top.equalTo(button3); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button5 = [self getButtonWithTitle:@"获取三轴方向" withTag:5]; | |||
| [self.view addSubview:button5]; | |||
| [button5 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.mas_equalTo(10); | |||
| make.top.equalTo(button4.mas_bottom).mas_offset(10); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button6 = [self getButtonWithTitle:@"获取三轴数据" withTag:6]; | |||
| [self.view addSubview:button6]; | |||
| [button6 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button5.mas_right).mas_offset(5); | |||
| make.top.equalTo(button5); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button7 = [self getButtonWithTitle:@"查询默认模式和时长" withTag:7]; | |||
| [self.view addSubview:button7]; | |||
| [button7 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button6.mas_right).mas_offset(5); | |||
| make.top.equalTo(button6); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button8 = [self getButtonWithTitle:@"查询手动设置" withTag:8]; | |||
| [self.view addSubview:button8]; | |||
| [button8 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button7.mas_right).mas_offset(5); | |||
| make.top.equalTo(button7); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button9 = [self getButtonWithTitle:@"查询二级档位默认" withTag:9]; | |||
| [self.view addSubview:button9]; | |||
| [button9 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button5); | |||
| make.top.equalTo(button5.mas_bottom).mas_offset(10); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button10 = [self getButtonWithTitle:@"上报工作阶段" withTag:10]; | |||
| [self.view addSubview:button10]; | |||
| [button10 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button9.mas_right).mas_offset(5); | |||
| make.top.equalTo(button9); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button11 = [self getButtonWithTitle:@"设置刷牙模式(0A)" withTag:11]; | |||
| [self.view addSubview:button11]; | |||
| [button11 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button10.mas_right).mas_offset(5); | |||
| make.top.equalTo(button9); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button12 = [self getButtonWithTitle:@"开关" withTag:12]; | |||
| [self.view addSubview:button12]; | |||
| [button12 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button11.mas_right).mas_offset(5); | |||
| make.top.equalTo(button9); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button13 = [self getButtonWithTitle:@"设置二档默认" withTag:13]; | |||
| [self.view addSubview:button13]; | |||
| [button13 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button9); | |||
| make.top.equalTo(button9.mas_bottom).mas_offset(10); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button14 = [self getButtonWithTitle:@"试用" withTag:14]; | |||
| [self.view addSubview:button14]; | |||
| [button14 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button13.mas_right).mas_offset(5); | |||
| make.top.equalTo(button13); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button15 = [self getButtonWithTitle:@"设置手动档" withTag:15]; | |||
| [self.view addSubview:button15]; | |||
| [button15 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button14.mas_right).mas_offset(5); | |||
| make.top.equalTo(button13); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| UIButton *button16 = [self getButtonWithTitle:@"上报接收数据结果" withTag:16]; | |||
| [self.view addSubview:button16]; | |||
| [button16 mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.equalTo(button15.mas_right).mas_offset(5); | |||
| make.top.equalTo(button13); | |||
| make.width.mas_equalTo(70); | |||
| make.height.mas_equalTo(30); | |||
| }]; | |||
| // | |||
| self.textView = [[UITextView alloc] init]; | |||
| self.textView.backgroundColor = [UIColor blackColor]; | |||
| self.textView.text = @"Log"; | |||
| self.textView.textColor = [UIColor redColor]; | |||
| self.textView.font = [UIFont systemFontOfSize:16]; | |||
| self.textView.editable = NO; | |||
| [self.view addSubview:self.textView]; | |||
| [self.textView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.mas_equalTo(10); | |||
| make.right.bottom.mas_equalTo(-10); | |||
| make.height.mas_equalTo(200); | |||
| }]; | |||
| } | |||
| -(UIButton *)getButtonWithTitle:(NSString *)title withTag:(NSInteger)tag{ | |||
| UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)]; | |||
| [button1 setTitle:title forState:(UIControlStateNormal)]; | |||
| button1.tag = tag; | |||
| button1.titleLabel.adjustsFontSizeToFitWidth = YES; | |||
| button1.titleLabel.numberOfLines = 2; | |||
| button1.titleLabel.font = [UIFont systemFontOfSize:15]; | |||
| [button1 setTitleColor:[UIColor redColor] forState:(UIControlStateNormal)]; | |||
| button1.backgroundColor = [UIColor blackColor]; | |||
| button1.titleLabel.textAlignment = NSTextAlignmentCenter; | |||
| button1.titleLabel.adjustsFontSizeToFitWidth = YES; | |||
| [button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)]; | |||
| return button1; | |||
| } | |||
| -(void)connectWiFiWithPwd:(NSString *)pwd wifi:(ELBleWifiDetailModel *)wifi{ | |||
| [self addLog:@"正在配置WiFi名称"]; | |||
| self.wifiPwd = pwd; | |||
| [[ELToothbrushBleManager shareManager] bleWifiSetConnectWifiMac:wifi.macData]; | |||
| } | |||
| -(void)connectWiFi:(ELBleWifiDetailModel *)wifi{ | |||
| if (wifi.secureType ==ELBleWifiSecureTypeOpen) { | |||
| [self connectWiFiWithPwd:@"" wifi:wifi]; | |||
| }else{ | |||
| ELInputAlertView *input = [[ELInputAlertView alloc] initWithTittle:@"配置WiFi" withText:@"" withMessage:@"请输入WiFi密码" withLeftButton:@"取消" withRightButton:@"确定"]; | |||
| [input show]; | |||
| __weak typeof(self) weakSelf = self; | |||
| input.rightHideBlock = ^BOOL(NSString * _Nonnull text, UIView * _Nonnull view) { | |||
| if ([ELBlePublicTool legalBleWifiPassword:text]) { | |||
| [weakSelf connectWiFiWithPwd:text wifi:wifi]; | |||
| return YES; | |||
| }else{ | |||
| [self addLog:@"请输入8~56位的密码"]; | |||
| return NO; | |||
| } | |||
| }; | |||
| } | |||
| } | |||
| #pragma mark ============ ElBleWifiDelegate ============== | |||
| //获取设备ID | |||
| -(void)bleWifiReceiveWifiSNCode:(int)code{ | |||
| if (code == 0) { | |||
| [self addLog:@"设备ID不存在,请先配网再获取"]; | |||
| }else{ | |||
| [self addLog:[NSString stringWithFormat:@"设备ID = %d",code]]; | |||
| } | |||
| } | |||
| //设置wifi过程结果 | |||
| -(void)bleWifiReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{ | |||
| if (result == ELSetBluetoothResponseTypeSuccess) { | |||
| //设置WiFi结果 | |||
| if (type == ELInetSetCmdTypeBleWifiSetWifiMac) { | |||
| [self addLog:@"正在配置WiFi密码"]; | |||
| [[ELToothbrushBleManager shareManager] bleWifiSetWifiPwd:self.wifiPwd]; | |||
| }else if (type == ELInetSetCmdTypeBleWifiSetWifiPwd){ | |||
| [self addLog:@"设置WiFi连接"]; | |||
| [[ELToothbrushBleManager shareManager] bleWifiSetupWifiConnect:YES]; | |||
| }else if (type == ELInetSetCmdTypeBleWifiSetConnectWifi){ | |||
| //获取连接状态 | |||
| } | |||
| } | |||
| else{ | |||
| [self addLog:@"WiFi配置失败"]; | |||
| } | |||
| } | |||
| //附近wifi | |||
| -(void)bleWifiReceiveWifiDetailModel:(ELBleWifiDetailModel *)model{ | |||
| [self addLog:[NSString stringWithFormat:@"搜索到wifi类型---%lu 名称---%@",(unsigned long)model.wifiState,model.wifiName]]; | |||
| if (model.wifiState == ELBleWifiUseStateConnected) { | |||
| } | |||
| [self.wifiArr addObject:model]; | |||
| } | |||
| //附近wifi搜索结果 | |||
| -(void)bleWifiReceiveScanedWifiCount:(int)count { | |||
| [self addLog:@"搜索完成"]; | |||
| //扫描结束 | |||
| NSMutableArray *array = [[NSMutableArray alloc] init]; | |||
| for (int i=0; i<self.wifiArr.count; i++) { | |||
| ELBleWifiDetailModel *model = self.wifiArr[i]; | |||
| NSString *wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%lu 名称:%@",(unsigned long)model.secureType,model.wifiName]; | |||
| if (model.secureType == ELBleWifiSecureTypeOpen) { | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"Open",model.wifiName]; | |||
| }else if (model.secureType == ELBleWifiSecureTypeWEP){ | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"WEP",model.wifiName]; | |||
| }else if (model.secureType == ELBleWifiSecureTypeWPA_PSK){ | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"WPA_PSK",model.wifiName]; | |||
| }else if (model.secureType == ELBleWifiSecureTypeWPA2_PSK){ | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"WPA2_PSK",model.wifiName]; | |||
| }else if (model.secureType == ELBleWifiSecureTypeWPA_WPA_2_PSK){ | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"WPA_WPA_2_PSK",model.wifiName]; | |||
| }else if (model.secureType == ELBleWifiSecureTypeWPA2_ENTERPRISE){ | |||
| wifiTypeStr = [NSString stringWithFormat:@"wifi类型:%@ 名称:%@",@"WPA2_ENTERPRISE",model.wifiName]; | |||
| } | |||
| [array addObject:wifiTypeStr]; | |||
| } | |||
| ELSelectView *selectView = [[ELSelectView alloc] initWithTitle:@"附近WiFi" withSelectArray:array]; | |||
| [selectView show]; | |||
| __weak typeof(self) weakSelf = self; | |||
| selectView.selectRowBlock = ^(NSInteger row) { | |||
| [weakSelf connectWiFi:weakSelf.wifiArr[row]]; | |||
| }; | |||
| } | |||
| //连接状态 | |||
| -(void)toothbrushReceiveState:(ELBluetoothState)state{ | |||
| if (state == ELBluetoothStateUnavailable) { | |||
| self.title = @"请打开蓝牙"; | |||
| }else if (state == ELBluetoothStateScaning || state == ELBluetoothStateWillConnect || state == ELBluetoothStateDidConnect){ | |||
| self.title = @"正在连接..."; | |||
| }else if (state == ELBluetoothStateConnectFail || state == ELBluetoothStateDidDisconnect || state == ELBluetoothStateFailedValidation){ | |||
| self.title = @"连接断开"; | |||
| }else if (state == ELBluetoothStateDidValidationPass){ | |||
| self.title = @"连接成功"; | |||
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |||
| self.title = self.p.macAddress; | |||
| }); | |||
| //获取版本号 | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)]; | |||
| //获取电量 | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBatteryState)]; | |||
| //获取蓝牙和wifi连接状态 | |||
| [[ELToothbrushBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetConnectState)]; | |||
| } | |||
| } | |||
| #pragma mark ============ ELBluetoothManagerDelegate ============== | |||
| // | |||
| -(void)bluetoothManagerReceiveDeviceAuthorizeResult:(ELBluetoothDeviceAuthorizeResult)result{ | |||
| if (result == ELBluetoothDeviceAuthorizeResultNoAuth) { | |||
| [self addLog:@"没有授权,请授权"]; | |||
| }else if (result == ELBluetoothDeviceAuthorizeResultAuthorized){ | |||
| [self addLog:@"已经授权"]; | |||
| }else if (result == ELBluetoothDeviceAuthorizeResultNoNeed){ | |||
| [self addLog:@"不需要授权"]; | |||
| }else if (result == ELBluetoothDeviceAuthorizeResultSuccess){ | |||
| [self addLog:@"授权成功"]; | |||
| } | |||
| } | |||
| //蓝牙和wifi连接状态 | |||
| -(void)bluetoothManagerReceiveMCUConnectedState:(struct ELMCUStateStruct)stateStrct{ | |||
| [self addLog:[NSString stringWithFormat:@"wifi连接状态:%lu \n0:没有连接\n1:尝试连接热点,但是失败\n2:连接热点,热点无网络\n3:连接热点,热点有网络\n4:有热点信息,未连接",(unsigned long)stateStrct.wifiState]]; | |||
| } | |||
| //电量 | |||
| -(void)bluetoothManagerReceiveBattery:(struct ELBatteryStruct)battery{ | |||
| [self addLog:[NSString stringWithFormat:@"设备电量为:%d",battery.power]]; | |||
| } | |||
| //版本号 | |||
| -(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{ | |||
| [self addLog:[NSString stringWithFormat:@"BM版本号为:%@",bmVersion]]; | |||
| } | |||
| #pragma mark ============ ToothbrushDelegate ============== | |||
| //试用 | |||
| -(void)toothbrushReceiveTryResult:(ToothbrushSetResult)result{ | |||
| [self addLog:[NSString stringWithFormat:@"试用结果:%lu",result]]; | |||
| } | |||
| //设置二档默认 | |||
| -(void)toothbrushReceiveSettingTwoGearDefaultResult:(ELSetBluetoothResponseType)result{ | |||
| [self addLog:[NSString stringWithFormat:@"设置二档默认结果:%lu",result]]; | |||
| } | |||
| //开关 | |||
| -(void)toothbrushReceiveSwitchResult:(ToothbrushSetResult)result{ | |||
| [self addLog:[NSString stringWithFormat:@"开关结果:%lu",result]]; | |||
| } | |||
| //设置刷牙模式结果 | |||
| -(void)toothbrushReceiveSetWorkGearResult:(ELSetBluetoothResponseType)result{ | |||
| [self addLog:[NSString stringWithFormat:@"设置刷牙模式结果:%lu",(unsigned long)result]]; | |||
| } | |||
| //刷牙数据 | |||
| -(void)toothbrushtReceiveToothbrushData:(ToothbrushData)data{ | |||
| [self addLog:[NSString stringWithFormat:@"刷牙数据:档位=%lu,工作时长=%d,左时长=%d,右时长=%d,电量=%d",(unsigned long)data.gear,data.workTime,data.leftTime,data.rightTime,data.battery]]; | |||
| } | |||
| //上报工作阶段 | |||
| -(void)toothbrushReceiveWorkPhase:(ToothBrushWorkPhase)workPhase{ | |||
| [self addLog:[NSString stringWithFormat:@"当前工作阶段:%lu,档位:%lu, 第%lu档",workPhase.workPhase,workPhase.gear,workPhase.supportType]]; | |||
| } | |||
| //获取二档档位信息 | |||
| -(void)toothbrushReceiveTwoGearDefault:(ToothbrushGearType)gear{ | |||
| [self addLog:[NSString stringWithFormat:@"二档默认档:%lu",gear]]; | |||
| } | |||
| //手动设置信息 | |||
| -(void)toothbrushReceiveCustomData:(ToothbrushCustomData)custom{ | |||
| [self addLog:[NSString stringWithFormat:@"频率:%d 占空比:%d 时长:%d",custom.frequency,custom.duty,custom.interval]]; | |||
| } | |||
| //默认档位和时长 | |||
| -(void)toothbrushReceiveWorkGear:(ToothbrushWorkGear)workGear{ | |||
| [self addLog:[NSString stringWithFormat:@"档位:%lu 时长:%d",workGear.gearType,workGear.interval]]; | |||
| } | |||
| //三轴数据 | |||
| -(void)toothbrushReceiveTriaxialData:(BOOL)success triaxialX:(int)x triaxialY:(int)y triaxialZ:(int)z{ | |||
| if (success) { | |||
| [self addLog:[NSString stringWithFormat:@"三轴数据:x = %d , y = %d , = %d",x,y,z]]; | |||
| }else{ | |||
| [self addLog:@"三轴数据获取失败"]; | |||
| } | |||
| } | |||
| //三轴方向 | |||
| -(void)toothbrushReceiveTriaxialDirection:(ToothbrushTriaxialDirection)direction{ | |||
| if (direction == ToothbrushTriaxialDirectionYTop) { | |||
| [self addLog:@"Y轴朝上"]; | |||
| }else if (direction == ToothbrushTriaxialDirectionYBottom){ | |||
| [self addLog:@"Y轴朝下"]; | |||
| }else if (direction == ToothbrushTriaxialDirectionYLeft){ | |||
| [self addLog:@"Y轴朝左"]; | |||
| }else if (direction == ToothbrushTriaxialDirectionYRight){ | |||
| [self addLog:@"Y轴朝右"]; | |||
| } | |||
| } | |||
| -(void)toothbrushReceiveOneGear:(NSArray<NSNumber *> *)oneGear twoGear:(NSArray<NSNumber *> *)twoGear{ | |||
| NSString *onegearStr = @"一档:"; | |||
| for (NSNumber *one in oneGear) { | |||
| onegearStr = [NSString stringWithFormat:@"%@,%@",onegearStr,one]; | |||
| } | |||
| NSString *twogearStr = @"二档:"; | |||
| for (NSNumber *two in twoGear) { | |||
| twogearStr = [NSString stringWithFormat:@"%@,%@",twogearStr,two]; | |||
| } | |||
| [self addLog:[NSString stringWithFormat:@"%@\n%@",onegearStr,twogearStr]]; | |||
| } | |||
| -(void)toothbrushReceiveDevices:(NSArray<ELPeripheralModel *> *)devices{ | |||
| ELPeripheralModel * connectModel; | |||
| for (ELPeripheralModel *deviceModel in devices) { | |||
| if ([deviceModel.macAddress isEqualToString:self.p.macAddress]) { | |||
| connectModel = deviceModel; | |||
| break; | |||
| } | |||
| } | |||
| if (connectModel) { | |||
| [[ELToothbrushBleManager shareManager] connectPeripheral:connectModel]; | |||
| } | |||
| } | |||
| -(void)dealloc{ | |||
| [[ELToothbrushBleManager shareManager] disconnectPeripheral]; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,17 @@ | |||
| // | |||
| // ToothbrushScanViewController.h | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by iot_user on 2020/9/29. | |||
| // Copyright © 2020 IOT. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface ToothbrushScanViewController : UIViewController | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,89 @@ | |||
| // | |||
| // ToothbrushScanViewController.m | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by iot_user on 2020/9/29. | |||
| // Copyright © 2020 IOT. All rights reserved. | |||
| // | |||
| #import "ToothbrushScanViewController.h" | |||
| #import "Masonry.h" | |||
| #import "ToothbrushConnectionViewController.h" | |||
| #import <AILinkBleSDK/ELToothbrushBleManager.h> | |||
| #import "ToothbrushScanViewController.h" | |||
| @interface ToothbrushScanViewController ()<UITableViewDelegate,UITableViewDataSource,ToothbrushDelegate> | |||
| @property (nonatomic, strong) UITableView *tableView; | |||
| @property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices; | |||
| @end | |||
| @implementation ToothbrushScanViewController | |||
| - (void)viewDidLoad { | |||
| [super viewDidLoad]; | |||
| // self.title = @"Devices"; | |||
| [self.view addSubview:self.tableView]; | |||
| [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.top.left.right.bottom.mas_equalTo(0); | |||
| }]; | |||
| } | |||
| -(void)viewWillAppear:(BOOL)animated{ | |||
| [super viewWillAppear:animated]; | |||
| [[ELToothbrushBleManager shareManager] startScan]; | |||
| [ELToothbrushBleManager shareManager].toothbrushDelegate = self; | |||
| } | |||
| -(void)viewDidDisappear:(BOOL)animated{ | |||
| [super viewDidDisappear:animated]; | |||
| [[ELToothbrushBleManager shareManager] stopScan]; | |||
| } | |||
| #pragma mark ============ ELBluetoothManagerDelegate ============== | |||
| -(void)toothbrushReceiveState:(ELBluetoothState)state{ | |||
| NSLog(@"bluetoothManagerUpdateBleState = %ld",state); | |||
| } | |||
| -(void)toothbrushReceiveDevices:(NSArray<ELPeripheralModel *> *)devices{ | |||
| self.devices = devices; | |||
| [self.tableView reloadData]; | |||
| } | |||
| -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ | |||
| return self.devices.count; | |||
| } | |||
| -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |||
| return 60; | |||
| } | |||
| -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ | |||
| static NSString *cellId = @"cellid"; | |||
| UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; | |||
| if (!cell) { | |||
| cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId]; | |||
| } | |||
| ELPeripheralModel *p = self.devices[indexPath.row]; | |||
| cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID]; | |||
| cell.textLabel.numberOfLines = 2; | |||
| cell.textLabel.textColor = [UIColor blackColor]; | |||
| return cell; | |||
| } | |||
| -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | |||
| ELPeripheralModel *p = self.devices[indexPath.row]; | |||
| ToothbrushConnectionViewController *vc = [[ToothbrushConnectionViewController alloc] init]; | |||
| vc.p = p; | |||
| [self.navigationController pushViewController:vc animated:YES]; | |||
| } | |||
| -(UITableView *)tableView{ | |||
| if (_tableView == nil) { | |||
| _tableView = [[UITableView alloc] init]; | |||
| _tableView.delegate = self; | |||
| _tableView.dataSource = self; | |||
| } | |||
| return _tableView; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,19 @@ | |||
| // | |||
| // UIButton+WZAdd.h | |||
| // 常用UI控件封装 | |||
| // | |||
| // Created by iot_iMac on 2018/6/21. | |||
| // Copyright © 2018年 iot_iMac. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| @interface UIButton (WZAdd) | |||
| /* | |||
| * 注意:如果needRoundCorner=YES,则必须设置frame的height值,否则无法实现圆角 | |||
| */ | |||
| + (UIButton *)createWithFrame:(CGRect)frame bgColor:(UIColor *)bgColor font:(UIFont *)font norTitle:(NSString *)norTitle norTitleColor:(UIColor *)norTitleColor norImage:(UIImage *)norImage borderColor:(UIColor *)borderColor needRoundCorner:(BOOL)needRoundCorner target:(id)target action:(SEL)action; | |||
| @end | |||
| @@ -0,0 +1,65 @@ | |||
| // | |||
| // UIButton+WZAdd.m | |||
| // 常用UI控件封装 | |||
| // | |||
| // Created by iot_iMac on 2018/6/21. | |||
| // Copyright © 2018年 iot_iMac. All rights reserved. | |||
| // | |||
| #import "UIButton+WZAdd.h" | |||
| @implementation UIButton (WZAdd) | |||
| /* | |||
| * 注意:如果needRoundCorner=YES,则必须设置frame的height值,否则无法实现圆角 | |||
| */ | |||
| + (UIButton *)createWithFrame:(CGRect)frame bgColor:(UIColor *)bgColor font:(UIFont *)font norTitle:(NSString *)norTitle norTitleColor:(UIColor *)norTitleColor norImage:(UIImage *)norImage borderColor:(UIColor *)borderColor needRoundCorner:(BOOL)needRoundCorner target:(id)target action:(SEL)action { | |||
| //这3项必须有值 | |||
| UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; | |||
| btn.frame = frame; | |||
| btn.titleLabel.textAlignment = NSTextAlignmentCenter; | |||
| btn.titleLabel.numberOfLines = 0; | |||
| btn.titleLabel.adjustsFontSizeToFitWidth = YES; | |||
| //以下各项均可为nil | |||
| if (font) { | |||
| btn.titleLabel.font = font; | |||
| } | |||
| if (bgColor) { | |||
| [btn setBackgroundColor:bgColor]; | |||
| } | |||
| if (norTitle) { | |||
| [btn setTitle:norTitle forState:UIControlStateNormal]; | |||
| } | |||
| if (norTitleColor) { | |||
| [btn setTitleColor:norTitleColor forState:(UIControlStateNormal)]; | |||
| } | |||
| if (norImage) { | |||
| [btn setImage:norImage forState:UIControlStateNormal]; | |||
| } | |||
| if (borderColor) { | |||
| btn.layer.borderColor = borderColor.CGColor; | |||
| btn.layer.borderWidth = 1; | |||
| } | |||
| if (needRoundCorner) { | |||
| btn.layer.cornerRadius = btn.bounds.size.height/2; | |||
| btn.layer.masksToBounds = YES; //防止设置了图片,不能显示圆角问题 | |||
| } | |||
| if (action) { //target可为nil,action不可为nil | |||
| [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; | |||
| } | |||
| return btn; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,15 @@ | |||
| // | |||
| // UILabel+WZAdd.h | |||
| // 常用UI控件封装 | |||
| // | |||
| // Created by iot_iMac on 2018/6/21. | |||
| // Copyright © 2018年 iot_iMac. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| @interface UILabel (WZAdd) | |||
| + (UILabel *)createWithFrame:(CGRect)frame bgColor:(UIColor *)bgColor text:(NSString *)text textColor:(UIColor *)textColor font:(UIFont *)font align:(NSTextAlignment)align; | |||
| @end | |||
| @@ -0,0 +1,37 @@ | |||
| // | |||
| // UILabel+WZAdd.m | |||
| // 常用UI控件封装 | |||
| // | |||
| // Created by iot_iMac on 2018/6/21. | |||
| // Copyright © 2018年 iot_iMac. All rights reserved. | |||
| // | |||
| #import "UILabel+WZAdd.h" | |||
| @implementation UILabel (WZAdd) | |||
| + (UILabel *)createWithFrame:(CGRect)frame bgColor:(UIColor *)bgColor text:(NSString *)text textColor:(UIColor *)textColor font:(UIFont *)font align:(NSTextAlignment)align { | |||
| UILabel *lbl = [[UILabel alloc] initWithFrame:frame]; | |||
| lbl.textAlignment = align; | |||
| if (text) { | |||
| lbl.text = text; | |||
| } | |||
| if (textColor) { | |||
| lbl.textColor = textColor; | |||
| } | |||
| if (bgColor) { | |||
| lbl.backgroundColor = bgColor; | |||
| } | |||
| if (font) { | |||
| lbl.font = font; | |||
| } | |||
| return lbl; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,32 @@ | |||
| // | |||
| // UIView+Category.h | |||
| // GoodNutrition | |||
| // | |||
| // Created by iot_user on 2018/10/23. | |||
| // Copyright © 2018年 Percyyang. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface UIView (Category) | |||
| @property (nonatomic, assign) CGFloat x; | |||
| @property (nonatomic, assign) CGFloat y; | |||
| @property (nonatomic, assign) CGFloat width; | |||
| @property (nonatomic, assign) CGFloat height; | |||
| @property (nonatomic, assign) CGSize size; | |||
| /** | |||
| 给View 添加圆角 | |||
| @param cornerRadii cornerRadii | |||
| @param corner cornerRadii | |||
| */ | |||
| -(void)setCornerRadii:(CGSize)cornerRadii withCorner:(UIRectCorner)corner; | |||
| // | |||
| - (void)setViewLayerCornerRadius:(CGFloat)cornerRadius shadowOffset:(CGSize)shadowOffset shadowOpacity:(CGFloat)shadowOpacity shadowRadius:(CGFloat)shadowRadius shadowColor:(UIColor *)shadowColor; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,71 @@ | |||
| // | |||
| // UIView+Category.m | |||
| // GoodNutrition | |||
| // | |||
| // Created by iot_user on 2018/10/23. | |||
| // Copyright © 2018年 Percyyang. All rights reserved. | |||
| // | |||
| #import "UIView+Category.h" | |||
| @implementation UIView (Category) | |||
| -(void)setX:(CGFloat)x{ | |||
| CGRect frame = self.frame; | |||
| frame.origin.x = x; | |||
| self.frame=frame; | |||
| } | |||
| -(CGFloat)x{ | |||
| return self.frame.origin.x; | |||
| } | |||
| -(void)setY:(CGFloat)y{ | |||
| CGRect frame = self.frame; | |||
| frame.origin.y = y; | |||
| self.frame = frame; | |||
| } | |||
| -(CGFloat)y{ | |||
| return self.frame.origin.y; | |||
| } | |||
| -(void)setWidth:(CGFloat)width{ | |||
| CGRect frame = self.frame; | |||
| frame.size.width = width; | |||
| self.frame = frame; | |||
| } | |||
| -(CGFloat)width{ | |||
| return self.frame.size.width; | |||
| } | |||
| -(void)setHeight:(CGFloat)height{ | |||
| CGRect frame = self.frame; | |||
| frame.size.height = height; | |||
| self.frame = frame; | |||
| } | |||
| -(CGFloat)height{ | |||
| return self.frame.size.height; | |||
| } | |||
| -(void)setSize:(CGSize)size{ | |||
| CGRect frame = self.frame; | |||
| frame.size = size; | |||
| self.frame = frame; | |||
| } | |||
| -(CGSize)size{ | |||
| return self.frame.size; | |||
| } | |||
| - (void)setViewLayerCornerRadius:(CGFloat)cornerRadius shadowOffset:(CGSize)shadowOffset shadowOpacity:(CGFloat)shadowOpacity shadowRadius:(CGFloat)shadowRadius shadowColor:(UIColor *)shadowColor{ | |||
| self.layer.cornerRadius = cornerRadius; | |||
| self.layer.masksToBounds = NO; | |||
| self.layer.shadowColor = shadowColor.CGColor; | |||
| self.layer.shadowOffset = shadowOffset; | |||
| self.layer.shadowOpacity = shadowOpacity; | |||
| self.layer.shadowRadius = shadowRadius; | |||
| } | |||
| -(void)setCornerRadii:(CGSize)cornerRadii withCorner:(UIRectCorner)corner{ | |||
| UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corner cornerRadii:cornerRadii]; | |||
| CAShapeLayer *layer = [CAShapeLayer layer]; | |||
| layer.frame = self.bounds; | |||
| layer.path = path.CGPath; | |||
| self.layer.mask = layer; | |||
| } | |||
| @end | |||