Selaa lähdekoodia

增加: 身高体脂秤,优化 Demo UI。 Add 25_HeightBodyFatScale

tags/v1.5.11
larryzhang 2 vuotta sitten
vanhempi
commit
758d022206
100 muutettua tiedostoa jossa 2359 lisäystä ja 153 poistoa
  1. 79
    12
      AILinkBleSDKDemo.xcodeproj/project.pbxproj
  2. 2
    2
      AILinkBleSDKDemo/11_BodyFatScale/BodyFatScaleConnectViewController.m
  3. 2
    2
      AILinkBleSDKDemo/12_BroadcastScale/BroadcastScaleViewController.m
  4. 22
    0
      AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.h
  5. 527
    0
      AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.m
  6. 539
    0
      AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.xib
  7. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/AILinkBleSDK
  8. 9
    3
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/AILinkBleSDK-umbrella.h
  9. 9
    4
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager+AirDetector.h
  10. 72
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager+NoiseMeter.h
  11. 189
    59
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager.h
  12. 3
    3
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAirDetectorBleParser.h
  13. 0
    4
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBleWifiDetailModel.h
  14. 1
    1
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBluetoothManager.h
  15. 10
    5
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightBodyFatScaleBleManager.h
  16. 57
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleFunctionModel.h
  17. 41
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleHeader.h
  18. 32
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleParser.h
  19. 50
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleSettingModel.h
  20. 50
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleStatusModel.h
  21. 4
    2
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELSDKHeader.h
  22. 6
    6
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/OEMAlgorithmSDK.h
  23. 6
    6
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/OEMBfsCalculateSDK.h
  24. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/Info.plist
  25. 40
    39
      AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
  26. BIN
      AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/logomaker.png
  27. 3
    3
      AILinkBleSDKDemo/Assets.xcassets/Contents.json
  28. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/8_electrode_measurement_type@2x.png
  29. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/8_electrode_measurement_type@3x.png
  30. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/Contents.json
  31. 6
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/Contents.json
  32. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/Contents.json
  33. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/ailink_air_detection_type_ic@2x.png
  34. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/ailink_air_detection_type_ic@3x.png
  35. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/Contents.json
  36. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/ailink_connected_ic@2x.png
  37. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/ailink_connected_ic@3x.png
  38. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/Contents.json
  39. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/ailink_nutrition_scale_scale_connect@2x.png
  40. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/ailink_nutrition_scale_scale_connect@3x.png
  41. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/Contents.json
  42. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/ailink_smart_skip_rope_device_ic@2x.png
  43. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/ailink_smart_skip_rope_device_ic@3x.png
  44. 21
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/air_detection_type_ic.imageset/Contents.json
  45. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/air_detection_type_ic.imageset/ailink_air_detection_type_ic@3x.png
  46. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/Contents.json
  47. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/foodtem_icon_100@2x.png
  48. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/foodtem_icon_100@3x.png
  49. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/Contents.json
  50. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/height_body_fat_scale_bind_ic@2x.png
  51. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/height_body_fat_scale_bind_ic@3x.png
  52. 21
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/meat_probe_type_ic.imageset/Contents.json
  53. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/meat_probe_type_ic.imageset/ailink_meat_probe_type_ic@3x.png
  54. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/Contents.json
  55. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/oximeter_search_icon1@2x.png
  56. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/oximeter_search_icon1@3x.png
  57. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/Contents.json
  58. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/type_baby_scale_ic@2x.png
  59. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/type_baby_scale_ic@3x.png
  60. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/Contents.json
  61. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/type_blood_sugar@2x.png
  62. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/type_blood_sugar@3x.png
  63. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/Contents.json
  64. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/type_body_fat_ic@2x.png
  65. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/type_body_fat_ic@3x.png
  66. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/Contents.json
  67. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/type_brush@2x.png
  68. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/type_brush@3x.png
  69. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/Contents.json
  70. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/coffee_icon_100@2x.png
  71. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/coffee_icon_100@3x.png
  72. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/Contents.json
  73. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/type_control_vision_ic@2x.png
  74. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/type_control_vision_ic@3x.png
  75. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/Contents.json
  76. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/type_height_measuring_instrument@2x.png
  77. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/type_height_measuring_instrument@3x.png
  78. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/Contents.json
  79. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/type_smart_mask@2x.png
  80. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/type_smart_mask@3x.png
  81. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/Contents.json
  82. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/type_smart_tpms_ic@2x.png
  83. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/type_smart_tpms_ic@3x.png
  84. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/Contents.json
  85. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/type_sphygmomanometer_ic@2x.png
  86. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/type_sphygmomanometer_ic@3x.png
  87. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/Contents.json
  88. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/type_temperature_gun_ic@2x.png
  89. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/type_temperature_gun_ic@3x.png
  90. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/Contents.json
  91. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/type_thermometer_ic@2x.png
  92. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/type_thermometer_ic@3x.png
  93. 22
    0
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/Contents.json
  94. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/type_tpms_ic@2x.png
  95. BIN
      AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/type_tpms_ic@3x.png
  96. 2
    2
      AILinkBleSDKDemo/Info.plist
  97. 36
    0
      AILinkBleSDKDemo/Others/ELDemoDeviceModel.h
  98. 35
    0
      AILinkBleSDKDemo/Others/ELDemoDeviceModel.m
  99. 23
    0
      AILinkBleSDKDemo/Others/ELDemoScanVC.h
  100. 0
    0
      AILinkBleSDKDemo/Others/ELDemoScanVC.m

+ 79
- 12
AILinkBleSDKDemo.xcodeproj/project.pbxproj Näytä tiedosto

@@ -8,6 +8,17 @@

/* Begin PBXBuildFile section */
78DC38C729278F790080E0D9 /* libBhBodyComposition120.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78DC38C529278F790080E0D9 /* libBhBodyComposition120.a */; };
78DC4DE32990FB2E006C6911 /* ELDemoScanVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78DC4DDE2990FB2E006C6911 /* ELDemoScanVC.xib */; };
78DC4DE42990FB2E006C6911 /* ELDemoDeviceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DDF2990FB2E006C6911 /* ELDemoDeviceModel.m */; };
78DC4DE52990FB2E006C6911 /* ELDemoScanVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DE02990FB2E006C6911 /* ELDemoScanVC.m */; };
78DC4DF12990FB40006C6911 /* ELDemoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DE82990FB40006C6911 /* ELDemoView.m */; };
78DC4DF22990FB40006C6911 /* ELDeviceTypeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DE92990FB40006C6911 /* ELDeviceTypeCell.m */; };
78DC4DF32990FB40006C6911 /* ELDemoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DEA2990FB40006C6911 /* ELDemoButton.m */; };
78DC4DF42990FB40006C6911 /* ELDeviceTypeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78DC4DEC2990FB40006C6911 /* ELDeviceTypeCell.xib */; };
78DC4DF52990FB40006C6911 /* ELDeviceScanCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DED2990FB40006C6911 /* ELDeviceScanCell.m */; };
78DC4DF62990FB40006C6911 /* ELDeviceScanCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78DC4DF02990FB40006C6911 /* ELDeviceScanCell.xib */; };
78DC4DFB2990FC10006C6911 /* HeightBodyFatScaleVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DC4DF82990FC10006C6911 /* HeightBodyFatScaleVC.m */; };
78DC4DFC2990FC10006C6911 /* HeightBodyFatScaleVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78DC4DF92990FC10006C6911 /* HeightBodyFatScaleVC.xib */; };
952D19A1276DE80000ED3A0C /* AILinkBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 952D19A0276DE80000ED3A0C /* AILinkBleSDK.framework */; };
95565B792786EA3B000265EA /* SkipConnectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 95565B752786EA3B000265EA /* SkipConnectionViewController.m */; };
95565B7A2786EA3B000265EA /* SkipScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 95565B782786EA3B000265EA /* SkipScanViewController.m */; };
@@ -61,7 +72,6 @@
958B4EA9263C08E800476BAE /* ELSelectView.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E73263C08E700476BAE /* ELSelectView.m */; };
958B4EAA263C08E800476BAE /* AilinkSuperConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E77263C08E700476BAE /* AilinkSuperConnectViewController.m */; };
958B4EAB263C08E800476BAE /* AiLinkSuperViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E7A263C08E800476BAE /* AiLinkSuperViewController.m */; };
958B4EAC263C08E800476BAE /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 958B4E7C263C08E800476BAE /* LICENSE */; };
958B4EAD263C08E800476BAE /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E7F263C08E800476BAE /* NSLayoutConstraint+MASDebugAdditions.m */; };
958B4EAE263C08E800476BAE /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E88263C08E800476BAE /* ViewController+MASAdditions.m */; };
958B4EAF263C08E800476BAE /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E8C263C08E800476BAE /* MASCompositeConstraint.m */; };
@@ -72,7 +82,6 @@
958B4EB4263C08E800476BAE /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E93263C08E800476BAE /* MASConstraint.m */; };
958B4EB5263C08E800476BAE /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E95263C08E800476BAE /* MASViewConstraint.m */; };
958B4EB6263C08E800476BAE /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E96263C08E800476BAE /* MASViewAttribute.m */; };
958B4EB7263C08E800476BAE /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 958B4E97263C08E800476BAE /* README.md */; };
958B4EB8263C08E800476BAE /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E98263C08E800476BAE /* ViewController.m */; };
958B4EBA263C08E800476BAE /* SubBleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E9B263C08E800476BAE /* SubBleManager.m */; };
958B4EBB263C08E800476BAE /* InheritConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 958B4E9D263C08E800476BAE /* InheritConnectViewController.m */; };
@@ -99,6 +108,24 @@
78DC38C429278F790080E0D9 /* BhBodyCompositionAllBody50KHz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BhBodyCompositionAllBody50KHz.h; sourceTree = "<group>"; };
78DC38C529278F790080E0D9 /* libBhBodyComposition120.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libBhBodyComposition120.a; sourceTree = "<group>"; };
78DC38C629278F790080E0D9 /* BhBodyCompositionEnum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BhBodyCompositionEnum.h; sourceTree = "<group>"; };
78DC4DDE2990FB2E006C6911 /* ELDemoScanVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ELDemoScanVC.xib; sourceTree = "<group>"; };
78DC4DDF2990FB2E006C6911 /* ELDemoDeviceModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDemoDeviceModel.m; sourceTree = "<group>"; };
78DC4DE02990FB2E006C6911 /* ELDemoScanVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDemoScanVC.m; sourceTree = "<group>"; };
78DC4DE12990FB2E006C6911 /* ELDemoScanVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDemoScanVC.h; sourceTree = "<group>"; };
78DC4DE22990FB2E006C6911 /* ELDemoDeviceModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDemoDeviceModel.h; sourceTree = "<group>"; };
78DC4DE72990FB40006C6911 /* ELDeviceScanCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDeviceScanCell.h; sourceTree = "<group>"; };
78DC4DE82990FB40006C6911 /* ELDemoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDemoView.m; sourceTree = "<group>"; };
78DC4DE92990FB40006C6911 /* ELDeviceTypeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDeviceTypeCell.m; sourceTree = "<group>"; };
78DC4DEA2990FB40006C6911 /* ELDemoButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDemoButton.m; sourceTree = "<group>"; };
78DC4DEB2990FB40006C6911 /* ELDemoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDemoView.h; sourceTree = "<group>"; };
78DC4DEC2990FB40006C6911 /* ELDeviceTypeCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ELDeviceTypeCell.xib; sourceTree = "<group>"; };
78DC4DED2990FB40006C6911 /* ELDeviceScanCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ELDeviceScanCell.m; sourceTree = "<group>"; };
78DC4DEE2990FB40006C6911 /* ELDeviceTypeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDeviceTypeCell.h; sourceTree = "<group>"; };
78DC4DEF2990FB40006C6911 /* ELDemoButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELDemoButton.h; sourceTree = "<group>"; };
78DC4DF02990FB40006C6911 /* ELDeviceScanCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ELDeviceScanCell.xib; sourceTree = "<group>"; };
78DC4DF82990FC10006C6911 /* HeightBodyFatScaleVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeightBodyFatScaleVC.m; sourceTree = "<group>"; };
78DC4DF92990FC10006C6911 /* HeightBodyFatScaleVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HeightBodyFatScaleVC.xib; sourceTree = "<group>"; };
78DC4DFA2990FC10006C6911 /* HeightBodyFatScaleVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeightBodyFatScaleVC.h; sourceTree = "<group>"; };
952D19A0276DE80000ED3A0C /* AILinkBleSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AILinkBleSDK.framework; sourceTree = "<group>"; };
95565B752786EA3B000265EA /* SkipConnectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SkipConnectionViewController.m; sourceTree = "<group>"; };
95565B762786EA3B000265EA /* SkipScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkipScanViewController.h; sourceTree = "<group>"; };
@@ -205,7 +232,6 @@
958B4E78263C08E700476BAE /* AiLinkSuperViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiLinkSuperViewController.h; sourceTree = "<group>"; };
958B4E79263C08E800476BAE /* AilinkSuperConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AilinkSuperConnectViewController.h; sourceTree = "<group>"; };
958B4E7A263C08E800476BAE /* AiLinkSuperViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AiLinkSuperViewController.m; sourceTree = "<group>"; };
958B4E7C263C08E800476BAE /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
958B4E7E263C08E800476BAE /* MASCompositeConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASCompositeConstraint.h; sourceTree = "<group>"; };
958B4E7F263C08E800476BAE /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = "<group>"; };
958B4E80263C08E800476BAE /* MASConstraint+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MASConstraint+Private.h"; sourceTree = "<group>"; };
@@ -231,7 +257,6 @@
958B4E94263C08E800476BAE /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ViewController+MASAdditions.h"; sourceTree = "<group>"; };
958B4E95263C08E800476BAE /* MASViewConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewConstraint.m; sourceTree = "<group>"; };
958B4E96263C08E800476BAE /* MASViewAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewAttribute.m; sourceTree = "<group>"; };
958B4E97263C08E800476BAE /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
958B4E98263C08E800476BAE /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
958B4E9B263C08E800476BAE /* SubBleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubBleManager.m; sourceTree = "<group>"; };
958B4E9C263C08E800476BAE /* InheritScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InheritScanViewController.h; sourceTree = "<group>"; };
@@ -298,6 +323,34 @@
path = BhBodyComposition120;
sourceTree = "<group>";
};
78DC4DE62990FB40006C6911 /* View */ = {
isa = PBXGroup;
children = (
78DC4DE72990FB40006C6911 /* ELDeviceScanCell.h */,
78DC4DED2990FB40006C6911 /* ELDeviceScanCell.m */,
78DC4DF02990FB40006C6911 /* ELDeviceScanCell.xib */,
78DC4DEE2990FB40006C6911 /* ELDeviceTypeCell.h */,
78DC4DE92990FB40006C6911 /* ELDeviceTypeCell.m */,
78DC4DEC2990FB40006C6911 /* ELDeviceTypeCell.xib */,
78DC4DEF2990FB40006C6911 /* ELDemoButton.h */,
78DC4DEA2990FB40006C6911 /* ELDemoButton.m */,
78DC4DEB2990FB40006C6911 /* ELDemoView.h */,
78DC4DE82990FB40006C6911 /* ELDemoView.m */,
);
path = View;
sourceTree = "<group>";
};
78DC4DF72990FC10006C6911 /* 25_HeightBodyFatScale */ = {
isa = PBXGroup;
children = (
78DC4DFA2990FC10006C6911 /* HeightBodyFatScaleVC.h */,
78DC4DF82990FC10006C6911 /* HeightBodyFatScaleVC.m */,
78DC4DF92990FC10006C6911 /* HeightBodyFatScaleVC.xib */,
);
name = 25_HeightBodyFatScale;
path = AILinkBleSDKDemo/25_HeightBodyFatScale;
sourceTree = SOURCE_ROOT;
};
95565B742786EA3B000265EA /* 24_Skip */ = {
isa = PBXGroup;
children = (
@@ -564,6 +617,7 @@
958B4E74263C08E700476BAE /* Others */ = {
isa = PBXGroup;
children = (
78DC4DE62990FB40006C6911 /* View */,
958B4E76263C08E700476BAE /* AiLinkSuper */,
958B4E75263C08E700476BAE /* AppDelegate.h */,
958B4EA1263C08E800476BAE /* AppDelegate.m */,
@@ -571,6 +625,11 @@
958B4E7B263C08E800476BAE /* Masonry */,
958B4EA2263C08E800476BAE /* ViewController.h */,
958B4E98263C08E800476BAE /* ViewController.m */,
78DC4DE22990FB2E006C6911 /* ELDemoDeviceModel.h */,
78DC4DDF2990FB2E006C6911 /* ELDemoDeviceModel.m */,
78DC4DE12990FB2E006C6911 /* ELDemoScanVC.h */,
78DC4DE02990FB2E006C6911 /* ELDemoScanVC.m */,
78DC4DDE2990FB2E006C6911 /* ELDemoScanVC.xib */,
);
path = Others;
sourceTree = "<group>";
@@ -589,9 +648,7 @@
958B4E7B263C08E800476BAE /* Masonry */ = {
isa = PBXGroup;
children = (
958B4E7C263C08E800476BAE /* LICENSE */,
958B4E7D263C08E800476BAE /* Masonry */,
958B4E97263C08E800476BAE /* README.md */,
);
path = Masonry;
sourceTree = "<group>";
@@ -685,6 +742,7 @@
955725BF276C38CC003BFBAC /* 22_AiFreshNutritionScale */,
955725F4276C38CD003BFBAC /* 23_FaceMask */,
95565B742786EA3B000265EA /* 24_Skip */,
78DC4DF72990FC10006C6911 /* 25_HeightBodyFatScale */,
958B4E74263C08E700476BAE /* Others */,
958B4E67263C08E700476BAE /* Tools */,
E622E26A243F1CA6003C319D /* Assets.xcassets */,
@@ -785,11 +843,13 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
78DC4DF42990FB40006C6911 /* ELDeviceTypeCell.xib in Resources */,
E622E287243F1D41003C319D /* Main.storyboard in Resources */,
78DC4DE32990FB2E006C6911 /* ELDemoScanVC.xib in Resources */,
E622E26E243F1CA6003C319D /* LaunchScreen.storyboard in Resources */,
958B4EB7263C08E800476BAE /* README.md in Resources */,
958B4EAC263C08E800476BAE /* LICENSE in Resources */,
E622E26B243F1CA6003C319D /* Assets.xcassets in Resources */,
78DC4DF62990FB40006C6911 /* ELDeviceScanCell.xib in Resources */,
78DC4DFC2990FC10006C6911 /* HeightBodyFatScaleVC.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -809,10 +869,12 @@
files = (
9557264A276C38CD003BFBAC /* ToothbrushConnectionViewController.m in Sources */,
95565B7A2786EA3B000265EA /* SkipScanViewController.m in Sources */,
78DC4DFB2990FC10006C6911 /* HeightBodyFatScaleVC.m in Sources */,
9557263B276C38CD003BFBAC /* FaceMaskScanViewController.m in Sources */,
9557263F276C38CD003BFBAC /* EightScaleConnectionViewController.m in Sources */,
9557262B276C38CD003BFBAC /* WheelMonitorScanViewController.m in Sources */,
95572629276C38CD003BFBAC /* BloodSugarConnectionViewController.m in Sources */,
78DC4DE52990FB2E006C6911 /* ELDemoScanVC.m in Sources */,
9557262A276C38CD003BFBAC /* WheelMonitorConnectViewController.m in Sources */,
95572642276C38CD003BFBAC /* ELEightScaleAlgorithmTool.m in Sources */,
95572630276C38CD003BFBAC /* CoffeeScaleScanViewController.m in Sources */,
@@ -822,6 +884,9 @@
9557263E276C38CD003BFBAC /* EightScaleScanViewController.m in Sources */,
958B4EB8263C08E800476BAE /* ViewController.m in Sources */,
958B4EAF263C08E800476BAE /* MASCompositeConstraint.m in Sources */,
78DC4DF22990FB40006C6911 /* ELDeviceTypeCell.m in Sources */,
78DC4DF52990FB40006C6911 /* ELDeviceScanCell.m in Sources */,
78DC4DF12990FB40006C6911 /* ELDemoView.m in Sources */,
95572626276C38CD003BFBAC /* AiFreshNutritionScaleConnectionViewController.m in Sources */,
9557262F276C38CD003BFBAC /* ELBfsWifiConnectTableViewCell.m in Sources */,
95572623276C38CD003BFBAC /* BloodConnectViewController.m in Sources */,
@@ -855,6 +920,7 @@
958B4EB4263C08E800476BAE /* MASConstraint.m in Sources */,
958B4EAA263C08E800476BAE /* AilinkSuperConnectViewController.m in Sources */,
958B4EB0263C08E800476BAE /* MASConstraintMaker.m in Sources */,
78DC4DF32990FB40006C6911 /* ELDemoButton.m in Sources */,
958B4EA5263C08E800476BAE /* UILabel+WZAdd.m in Sources */,
95572633276C38CD003BFBAC /* BabyScaleConnectViewController.m in Sources */,
95572644276C38CD003BFBAC /* BodyFatScaleConnectViewController.m in Sources */,
@@ -872,6 +938,7 @@
9557262E276C38CD003BFBAC /* ELBfsWifiConnectVC.m in Sources */,
95572637276C38CD003BFBAC /* OximeterConnectionViewController.m in Sources */,
95572648276C38CD003BFBAC /* ForeheadScanViewController.m in Sources */,
78DC4DE42990FB2E006C6911 /* ELDemoDeviceModel.m in Sources */,
958B4EBA263C08E800476BAE /* SubBleManager.m in Sources */,
95572631276C38CD003BFBAC /* CoffeeScaleConnectionViewController.m in Sources */,
);
@@ -1024,7 +1091,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 20221221;
CURRENT_PROJECT_VERSION = 20230206;
DEVELOPMENT_TEAM = YEU77XR292;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -1044,7 +1111,7 @@
"$(PROJECT_DIR)/AILinkBleSDKDemo/13_EightScale/HTBodyfat_SDK",
"$(PROJECT_DIR)/AILinkBleSDKDemo/13_EightScale/BhBodyComposition120",
);
MARKETING_VERSION = 1.5.6;
MARKETING_VERSION = 1.5.9;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1057,7 +1124,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 20221221;
CURRENT_PROJECT_VERSION = 20230206;
DEVELOPMENT_TEAM = YEU77XR292;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -1077,7 +1144,7 @@
"$(PROJECT_DIR)/AILinkBleSDKDemo/13_EightScale/HTBodyfat_SDK",
"$(PROJECT_DIR)/AILinkBleSDKDemo/13_EightScale/BhBodyComposition120",
);
MARKETING_VERSION = 1.5.6;
MARKETING_VERSION = 1.5.9;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo;
PRODUCT_NAME = "$(TARGET_NAME)";

+ 2
- 2
AILinkBleSDKDemo/11_BodyFatScale/BodyFatScaleConnectViewController.m Näytä tiedosto

@@ -13,7 +13,7 @@
#import <AILinkBleSDK/ELBodyFatScaleBleWeightModel.h>
#import <AILinkBleSDK/ELBluetoothManager+Settings.h>

#import <AILinkBleSDK/AlgorithmSDK.h>
#import <AILinkBleSDK/OEMAlgorithmSDK.h>
#import <AILinkBleSDK/ELUnitConvertTool.h>

@interface BodyFatScaleConnectViewController () <ELBluetoothManagerDelegate, ELBodyFatScaleBleDelegate>
@@ -296,7 +296,7 @@

NSString *weightKg = [ELUnitConvertTool getWeightShowStrWithTargetUnit:ELDeviceWeightUnit_KG bleWeightInt:weightModel.weight bleWeightUnit:weightModel.weightUnit bleWeightPoint:weightModel.weightPoint];

AlgorithmModel *algorithmModel = [AlgorithmSDK getBodyfatWithWeight:weightKg.floatValue adc:(int) weightModel.adc sex:user.sex age:(int) user.age height:(int) user.height];
OEMAlgorithmModel *algorithmModel = [OEMAlgorithmSDK getBodyfatWithWeight:weightKg.floatValue adc:(int) weightModel.adc sex:user.sex age:(int) user.age height:(int) user.height];
NSLog(@"algorithmModel:%@", algorithmModel);
}


+ 2
- 2
AILinkBleSDKDemo/12_BroadcastScale/BroadcastScaleViewController.m Näytä tiedosto

@@ -8,7 +8,7 @@

#import "BroadcastScaleViewController.h"
#import <AILinkBleSDK/ELBroadcastScaleBleManager.h>
#import <AILinkBleSDK/AlgorithmSDK.h>
#import <AILinkBleSDK/OEMAlgorithmSDK.h>
#import <AILinkBleSDK/ELBodyFatScaleBleUserModel.h>
#import <AILinkBleSDK/ELWeightAlgorithmusModel.h>
#import "Masonry.h"
@@ -55,7 +55,7 @@
self.statusLbl.text = @"Test end";
ELBodyFatScaleBleUserModel *user = self.getOneUser;
NSString *weightKg = [ELWeightAlgorithmusModel getKgWithWeightShowStr:model.weight weightUnit:model.weightUnit weightPoint:model.weightPoint];
AlgorithmModel *agModel = [AlgorithmSDK getBodyfatWithWeight:weightKg.floatValue adc:(int) model.adc sex:user.sex age:(int) user.age height:(int) user.height];
OEMAlgorithmModel *agModel = [OEMAlgorithmSDK getBodyfatWithWeight:weightKg.floatValue adc:(int) model.adc sex:user.sex age:(int) user.age height:(int) user.height];
NSLog(@"agModel:%@", agModel);

break;

+ 22
- 0
AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.h Näytä tiedosto

@@ -0,0 +1,22 @@
//
// HeightBodyFatScaleVC.h
// AILinkBleSDK_Example
//
// Created by LarryZhang on 2023/2/4.
// Copyright © 2023 zhengzida. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@class ELAILinkPeripheral;

@interface HeightBodyFatScaleVC : UIViewController

@property (nonatomic, strong) ELAILinkPeripheral *per;


@end

NS_ASSUME_NONNULL_END

+ 527
- 0
AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.m Näytä tiedosto

@@ -0,0 +1,527 @@
//
// HeightBodyFatScaleVC.m
// AILinkBleSDK_Example
//
// Created by LarryZhang on 2023/2/4.
// Copyright © 2023 zhengzida. All rights reserved.
//

#import "HeightBodyFatScaleVC.h"
#import <AILinkBleSDK/ELHeightBodyFatScaleBleManager.h>
#import <AILinkBleSDK/ELAILinkBleManager.h>
#import "ELDemoButton.h"

@interface HeightBodyFatScaleVC () <ELHeightBodyFatScaleBleDelegate>

@property (weak, nonatomic) IBOutlet UILabel *bleStatusLabel;

//work mode
@property (weak, nonatomic) IBOutlet ELDemoButton *weightModeButton;
@property (weak, nonatomic) IBOutlet ELDemoButton *weightHeightModeButton;
@property (weak, nonatomic) IBOutlet ELDemoButton *weightHeightFatModeButton;
@property (weak, nonatomic) IBOutlet ELDemoButton *withBabyModeButton;

//Weight
@property (weak, nonatomic) IBOutlet UILabel *weightValueLabel;

//Height
@property (weak, nonatomic) IBOutlet UILabel *heightValueLabel;

//Setting
@property (weak, nonatomic) IBOutlet ELDemoButton *voiceSettingButton;
@property (weak, nonatomic) IBOutlet ELDemoButton *uintSettingButton;


//workMode
@property (nonatomic, assign) HeightBodyFatScale_WorkModeType workMode;

//voice on/of
@property (nonatomic, assign) BOOL voiceOn;

//unit
@property (nonatomic, assign) ELDeviceWeightUnit weightUnit;
@property (nonatomic, assign) ELDeviceHeightUnit heightUnit;

//report
@property (weak, nonatomic) IBOutlet UILabel *reportValueLabel;

//baby mode value
@property (weak, nonatomic) IBOutlet UILabel *babyWeightValueLabel;
@property (weak, nonatomic) IBOutlet UILabel *adultWeightValueLabel;
@property (weak, nonatomic) IBOutlet UILabel *babyAdultWeightValueLabel;

/** 抱婴模式下的测量状态下标 */
@property (nonatomic, assign) NSInteger babyModeIndex;

@end

@implementation HeightBodyFatScaleVC

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.weightUnit = ELDeviceWeightUnit_KG;
self.heightUnit = ELDeviceHeightUnit_CM;
[self uiSetUnit];
self.babyModeIndex = 0;
[self bleScan];
}

- (void)dealloc {
[ELHeightBodyFatScaleBleManager shareManager].heightBodyFatScaleDelegate = nil;
[[ELHeightBodyFatScaleBleManager shareManager] disconnectPeripheral];
}

- (void)bleScan {
//创建蓝牙
[ELHeightBodyFatScaleBleManager shareManager].heightBodyFatScaleDelegate = self;
[[ELHeightBodyFatScaleBleManager shareManager] startScan];
}

//发送用户信息
- (void)sendUserData {
//// 0 female、1 male & 178(cm)
[[ELHeightBodyFatScaleBleManager shareManager] sendUserDataWithGender:1 age:20 heightInCm:178];
}

#pragma mark -UI

- (void)uiSetWorkMode:(HeightBodyFatScale_WorkModeType)mode {
self.weightModeButton.lighted = NO;
self.weightHeightModeButton.lighted = NO;
self.weightHeightFatModeButton.lighted = NO;
self.withBabyModeButton.lighted = NO;
if (mode == HeightBodyFatScale_WorkModeType_WeightMode) {
self.weightModeButton.lighted = YES;
} else if (mode == HeightBodyFatScale_WorkModeType_WeightHeightMode) {
self.weightHeightModeButton.lighted = YES;
} else if (mode == HeightBodyFatScale_WorkModeType_HeightBodyFatMode) {
self.weightHeightFatModeButton.lighted = YES;
} else if (mode == HeightBodyFatScale_WorkModeType_BabyMode) {
self.withBabyModeButton.lighted = YES;
}
}

- (void)uiSetVoiceOn:(BOOL)voiceOn {
self.voiceSettingButton.lighted = voiceOn;
if (voiceOn) {
[self.voiceSettingButton setTitle:@"Voice: On" forState:UIControlStateNormal];
} else {
[self.voiceSettingButton setTitle:@"Voice: Off" forState:UIControlStateNormal];
}
}

- (void)uiSetUnit {
if (self.weightUnit == ELDeviceWeightUnit_KG) {
[self.uintSettingButton setTitle:[NSString stringWithFormat:@"Unit: kg & cm"] forState:UIControlStateNormal];
} else {
[self.uintSettingButton setTitle:[NSString stringWithFormat:@"Unit: lb & ft"] forState:UIControlStateNormal];
}
}

#pragma mark -Setter Getter

- (void)setWorkMode:(HeightBodyFatScale_WorkModeType)workMode {
_workMode = workMode;
[self uiSetWorkMode:workMode];
}

- (void)setVoiceOn:(BOOL)voiceOn {
_voiceOn = voiceOn;
[self uiSetVoiceOn:voiceOn];
}

#pragma mark -Actions

- (IBAction)weightButtonAction:(id)sender {
[[ELHeightBodyFatScaleBleManager shareManager] sendDeviceWorkMode:HeightBodyFatScale_WorkModeType_WeightMode];
self.workMode = HeightBodyFatScale_WorkModeType_WeightMode;
}

- (IBAction)weightHeightButtonAction:(id)sender {
[[ELHeightBodyFatScaleBleManager shareManager] sendDeviceWorkMode:HeightBodyFatScale_WorkModeType_WeightHeightMode];
self.workMode = HeightBodyFatScale_WorkModeType_WeightHeightMode;
}

- (IBAction)weightHeightFatButtonAction:(id)sender {
[[ELHeightBodyFatScaleBleManager shareManager] sendDeviceWorkMode:HeightBodyFatScale_WorkModeType_HeightBodyFatMode];
self.workMode = HeightBodyFatScale_WorkModeType_HeightBodyFatMode;
}

- (IBAction)withBabyButtonAction:(id)sender {
[[ELHeightBodyFatScaleBleManager shareManager] sendDeviceWorkMode:HeightBodyFatScale_WorkModeType_BabyMode];
self.workMode = HeightBodyFatScale_WorkModeType_BabyMode;
}

- (IBAction)voiceSettingButtonAction:(id)sender {
BOOL voiceOn = !self.voiceOn;
[[ELHeightBodyFatScaleBleManager shareManager] sendVoiceSetting:voiceOn];
self.voiceOn = voiceOn;
}

- (IBAction)unitSettingButtonAction:(id)sender {
if (self.weightUnit == ELDeviceWeightUnit_KG) {
self.weightUnit = ELDeviceWeightUnit_LB;
self.heightUnit = ELDeviceHeightUnit_FT_IN;
[[ELHeightBodyFatScaleBleManager shareManager] sendUnitWithHeightUnit:ELDeviceHeightUnit_FT_IN weightUnit:ELDeviceWeightUnit_LB];
} else {
self.weightUnit = ELDeviceWeightUnit_KG;
self.heightUnit = ELDeviceHeightUnit_CM;
[[ELHeightBodyFatScaleBleManager shareManager] sendUnitWithHeightUnit:ELDeviceHeightUnit_CM weightUnit:ELDeviceWeightUnit_KG];
}
[self uiSetUnit];
}


#pragma mark - util

+ (NSString *)getWeightStringWithWeight:(NSInteger)weight unit:(ELDeviceWeightUnit)unit point:(NSInteger)point {
NSString *formatStr = [NSString stringWithFormat:@"%%.%luf",(unsigned long)point];
switch (unit) {
case ELDeviceWeightUnit_KG: {
double kgNumber = (double)weight/pow(10, point);
NSString *weightString = [NSString stringWithFormat:formatStr,kgNumber];
return weightString;
}
case ELDeviceWeightUnit_JIN: {
double jinNumber = (double)weight/pow(10, point);
NSString *jinString = [NSString stringWithFormat:formatStr,jinNumber];
return jinString;
}
case ELDeviceWeightUnit_LB_OZ: {
//返回小单位oz
double ozNumber = (double)weight/pow(10, point);
NSInteger lbNumber = ozNumber / 16;
NSString *ozString = [NSString stringWithFormat:formatStr,(ozNumber-lbNumber*16)];
return [NSString stringWithFormat:@"%zd:%@",lbNumber,ozString];
}
case ELDeviceWeightUnit_OZ: {
double ozNumber = (double)weight/pow(10, point);
NSString *ozString = [NSString stringWithFormat:formatStr,ozNumber];
return ozString;
}
case ELDeviceWeightUnit_ST_LB: {
//返回小单位lb
double lbNumber = (double)weight/pow(10, point);
NSInteger stNumber = lbNumber/14;
NSString *lbString = [NSString stringWithFormat:formatStr,(lbNumber-stNumber*14)];
return [NSString stringWithFormat:@"%zd:%@",stNumber,lbString];
}
case ELDeviceWeightUnit_G: {
double gNunber = (double)weight/pow(10, point);
NSString *gString = [NSString stringWithFormat:formatStr,gNunber];
return gString;
}
case ELDeviceWeightUnit_LB: {
double lbNumber = (double)weight/pow(10, point);
NSString *lbString = [NSString stringWithFormat:formatStr,lbNumber];
return lbString;
}
default: {
//不支持的单位
return @"";
}
}
return @"";
}

+ (NSString *)getHeightStringWithHeight:(NSInteger)height unit:(ELDeviceHeightUnit)unit point:(NSInteger)point {
NSString *formatStr = [NSString stringWithFormat:@"%%.%luf", (unsigned long)point];
switch (unit) {
case ELDeviceHeightUnit_CM: {
double cmNumber = (double)height/pow(10, point);
NSString *cmString = [NSString stringWithFormat:formatStr,cmNumber];
return cmString;
}
case ELDeviceHeightUnit_Inch: {
double inchNumber = (double)height/pow(10, point);
NSString *inchString = [NSString stringWithFormat:formatStr,inchNumber];
return inchString;
}
case ELDeviceHeightUnit_FT_IN: {
//返回小单位inch
double inchNumber = (double)height/pow(10, point);
NSInteger ftNumber = inchNumber/12;
NSString *inchString = [NSString stringWithFormat:formatStr, (inchNumber-ftNumber*12)];
return [NSString stringWithFormat:@"%zd′%@″", ftNumber, inchString];
}
case ELDeviceHeightUnit_M: {
double mNumber = (double)height/pow(10, point);
NSString *mString = [NSString stringWithFormat:formatStr, mNumber];
return mString;
}
default: {
//不支持的单位
return @"";
}
}
return @"";
}

@end

@implementation HeightBodyFatScaleVC (ble)

#pragma mark - ble Delegate

///返回设备连接状态
- (void)heightBodyFatScaleManagerUpdateState:(ELBluetoothState)state {
NSLog(@"heightBodyFatScaleManagerUpdateState() state:%@", @(state));
if (state == ELBluetoothStateDidValidationPass) {
//获取设备状态
[[ELHeightBodyFatScaleBleManager shareManager] getWorkState];
//设置用户信息
[self sendUserData];
}
if (state == ELBluetoothStateScaning) {
self.bleStatusLabel.text = @"BLE connecting";
} else if (state == ELBluetoothStateConnectFail) {
self.bleStatusLabel.text = @"BLE failed";
} else if (state == ELBluetoothStateDidValidationPass) {
self.bleStatusLabel.text = @"BLE connected";
} else if (state == ELBluetoothStateDidDisconnect) {
self.bleStatusLabel.text = @"BLE did disconnect";
}
}

///回调扫描到的身高体脂秤
- (void)heightBodyFatScaleManagerScanDevices:(NSArray<ELPeripheralModel *> *)scanDevices {
for (ELPeripheralModel *model in scanDevices) {
if ([model.macAddress isEqualToString:self.per.macAddressString]) {
[[ELHeightBodyFatScaleBleManager shareManager] stopScan];
[[ELHeightBodyFatScaleBleManager shareManager] connectPeripheral:model];
}
}
}

///回调用户信息设置结果
- (void)heightBodyFatScaleManagerSetUserDataResult:(HeightBodyFatScale_SetupResult)result {
if (result == HeightBodyFatScale_SetupResult_Failure) {
//重新设置
[self sendUserData];
}
}

///MCU主动请求用户信息
- (void)heightBodyFatScaleManagerRequestUserData {
//设置用户信息
[self sendUserData];
}

///MCU设置单位
- (void)heightBodyFatScaleManagerMCUSetHeightUnit:(ELDeviceHeightUnit)heightUnit weightUnit:(ELDeviceWeightUnit)weightUnit {
NSLog(@"weightUnit: %@", @(weightUnit));
NSLog(@"heightUnit: %@", @(heightUnit));
self.weightUnit = weightUnit;
self.heightUnit = heightUnit;
[self uiSetUnit];
}

///MCU回复单位设置结果
- (void)heightBodyFatScaleManagerReportUnitResult:(HeightBodyFatScale_SetupResult)result {
}

///MCU回复工作模式设置结果
- (void)heightBodyFatScaleManagerWorkModeResult:(HeightBodyFatScale_SetupResult)result {
}

#pragma mark MCU回复设备状态
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit voiceState:(BOOL)voice {
self.workMode = mode;
self.voiceOn = voice;
self.weightUnit = weightUnit;
self.heightUnit = heightUnit;
[self uiSetUnit];
//防止连接设备后设备已经在测量而导致测量失败的问题,新协议设置模式之后会让设备重新进行测量数据
[[ELHeightBodyFatScaleBleManager shareManager] sendDeviceWorkMode:mode];
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() workMode: %@", @(mode));
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() power: %@", @(power));
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() charging: %@", @(charging));
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() weightUnit: %@", @(weightUnit));
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() heightUnit: %@", @(heightUnit));
NSLog(@"heightBodyFatScaleManagerReportDevStateWithWorkMode() voiceState: %@", @(voice));
}

#pragma mark 身高体脂模式
///MCU上报称重状态
- (void)heightBodyFatScaleManagerReportWeighingState:(HeightBodyFatScale_WeightStableType)stable weightNumber:(NSInteger)weight weightPoint:(NSInteger)point unit:(ELDeviceWeightUnit)unit {
NSString *unitString = AiLinkBleWeightUnitDic[@(unit)];
NSString *dataString = [self.class getWeightStringWithWeight:weight unit:unit point:point];
self.weightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
NSLog(@"heightBodyFatScaleManagerReportWeighingState() stable: %@", @(stable));
NSLog(@"heightBodyFatScaleManagerReportWeighingState() weight: %@", @(weight));
NSLog(@"heightBodyFatScaleManagerReportWeighingState() point: %@", @(point));
NSLog(@"heightBodyFatScaleManagerReportWeighingState() point: %@", @(unit));
}

///MCU上报阻抗数据
- (void)heightBodyFatScaleManagerReportAdcDataWithImpedanceState:(HeightBodyFatScale_AdcStateType)state aisle:(HeightBodyFatScale_AdcAisleType)aisle adc:(NSInteger)adc algorithmId:(NSInteger)algorithmId {
if (state == HeightBodyFatScale_AdcStateType_Over) {
NSLog(@"adc: %@", @(adc));
NSLog(@"algorithmId: %@", @(algorithmId));
}
}

///MCU上报心率数据
- (void)heightBodyFatScaleManagerReportHeartRateDataWithState:(HeightBodyFatScale_HeartRateStateType)state bpm:(NSInteger)bpm {
if (state == HeightBodyFatScale_HeartRateStateType_Success) {
NSLog(@"HeartRate bpm: %@", @(bpm));
}
}

///MCU上报温度数据
- (void)heightBodyFatScaleManagerReportTemDataWithNegative:(BOOL)negative tem:(NSInteger)tem point:(NSInteger)point unit:(ELDeviceTemperatureUnit)unit {
NSLog(@"negative: %@", @(negative));
NSLog(@"tem: %@", @(tem));
NSLog(@"point: %@", @(point));
NSLog(@"unit: %@", @(unit));
}

///MCU上报身高数据
- (void)heightBodyFatScaleManagerReportHeightDataWithHeight:(NSInteger)height unit:(ELDeviceHeightUnit)unit point:(NSInteger)point {
NSString *unitString = AiLinkBleHeightUnitDic[@(unit)];
NSString *dataString = [self.class getHeightStringWithHeight:height unit:unit point:point];
self.heightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
NSLog(@"height: %@", @(height));
NSLog(@"unit: %@", @(unit));
NSLog(@"point: %@", @(point));
}

/// MCU上报体脂数据
- (void)heightBodyFatScaleManagerReportBodyFatDataWithDataModel:(ELHeightBodyFatScaleBleWeightBodyModel *)model {
NSLog(@"model: %@", model);
self.reportValueLabel.text = [NSString stringWithFormat:@"%@", model];
}

#pragma mark 抱婴模式

- (void)heightBodyFatScaleManagerReportBabyModetWithWeighingState:(HeightBodyFatScale_WeightStableType)stable adultWeight:(NSInteger)adultWeight allWeight:(NSInteger)allWeight babyWeight:(NSInteger)babyWeight point:(NSInteger)point unit:(ELDeviceWeightUnit)unit {
NSLog(@"workMode: HeightBodyFatScale_WorkModeType_BabyMode");
// self.workMode = HeightBodyFatScale_WorkModeType_BabyMode;
// [self uiSetWorkMode:self.workMode];
NSLog(@"stable: %@", @(stable));
NSLog(@"unit: %@", @(unit));
NSLog(@"point: %@", @(point));
NSString *unitString = AiLinkBleWeightUnitDic[@(unit)];
if (babyWeight > 0) {
NSLog(@"babyWeight: %@", @(babyWeight));
NSString *dataString = [self.class getWeightStringWithWeight:babyWeight unit:unit point:point];
self.babyWeightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
} else if (allWeight > 0) {
NSLog(@"allWeight: %@", @(allWeight));
NSString *dataString = [self.class getWeightStringWithWeight:allWeight unit:unit point:point];
self.babyAdultWeightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
} else {
NSLog(@"adultWeight: %@", @(adultWeight));
NSString *dataString = [self.class getWeightStringWithWeight:adultWeight unit:unit point:point];
self.adultWeightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
}
if (self.babyModeIndex == 0) {
NSLog(@"course_adult, 正在测量成人体重…");
} else if (self.babyModeIndex == 1) {
NSLog(@"course_withbaby, 请抱着宝宝重新上秤…");
}
if (stable == HeightBodyFatScale_WeightStableType_Stable) {
if (self.babyModeIndex == 0) {
self.babyModeIndex = 1;
NSLog(@"course_withbaby, 请抱着宝宝重新上秤…");
}
}
if (stable == HeightBodyFatScale_WeightStableType_Stable && babyWeight > 0) {
// TODO: save data (babyWeight unit:unit point:point)
}
}

#pragma mark 体重模式
- (void)heightBodyFatScaleManagerReportWeightModeWithWeighingState:(HeightBodyFatScale_WeightStableType)stable weightNumber:(NSInteger)weight point:(NSInteger)point unit:(ELDeviceWeightUnit)unit {
NSString *unitString = AiLinkBleWeightUnitDic[@(unit)];
NSString *dataString = [self.class getWeightStringWithWeight:weight unit:unit point:point];
self.weightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
NSLog(@"workMode: HeightBodyFatScale_WorkModeType_WeightMode");
// self.workMode = HeightBodyFatScale_WorkModeType_WeightMode;
// [self uiSetWorkMode:self.workMode];
NSLog(@"stable: %@", @(stable));
NSLog(@"weight: %@", @(weight));
NSLog(@"unit: %@", @(unit));
NSLog(@"point: %@", @(point));
if (stable == HeightBodyFatScale_WeightStableType_Stable) {
// TODO: save data (weight unit:unit point:point)
}
}

#pragma mark 体重身高模式
//MCU上报体重数据
- (void)heightBodyFatScaleManagerReportWeightHeightModeWithWeighingState:(HeightBodyFatScale_WeightStableType)stable weightNumber:(NSInteger)weight point:(NSInteger)point unit:(ELDeviceWeightUnit)unit {
NSString *unitString = AiLinkBleWeightUnitDic[@(unit)];
NSString *dataString = [self.class getWeightStringWithWeight:weight unit:unit point:point];
self.weightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
NSLog(@"workMode: HeightBodyFatScale_WorkModeType_WeightHeightMode");
// self.workMode = HeightBodyFatScale_WorkModeType_WeightHeightMode;
// [self uiSetWorkMode:self.workMode];
NSLog(@"stable: %@", @(stable));
NSLog(@"weight: %@", @(weight));
NSLog(@"unit: %@", @(unit));
NSLog(@"point: %@", @(point));
if (stable == HeightBodyFatScale_WeightStableType_Stable) {
// TODO: save data (weight unit:unit point:point)
}
}

//MCU上报身高数据
- (void)heightBodyFatScaleManagerReportWeightHeightMOdeWithHeightNumber:(NSInteger)height point:(NSInteger)point unit:(ELDeviceHeightUnit)unit {
NSString *unitString = AiLinkBleHeightUnitDic[@(unit)];
NSString *dataString = [self.class getHeightStringWithHeight:height unit:unit point:point];
self.heightValueLabel.text = [NSString stringWithFormat:@"%@ %@", dataString, unitString];
NSLog(@"workMode: HeightBodyFatScale_WorkModeType_WeightHeightMode");
// self.workMode = HeightBodyFatScale_WorkModeType_WeightHeightMode;
// [self uiSetWorkMode:self.workMode];
NSLog(@"height: %@", @(height));
NSLog(@"unit: %@", @(unit));
NSLog(@"point: %@", @(point));
}

#pragma mark 测量完成
- (void)heightBodyFatScaleManagerSendCompletedWithWorkMode:(HeightBodyFatScale_WorkModeType)type {
NSLog(@"heightBodyFatScaleManagerSendCompletedWithWorkMode() WorkMode type: %@", @(type));
}

@end


+ 539
- 0
AILinkBleSDKDemo/25_HeightBodyFatScale/HeightBodyFatScaleVC.xib Näytä tiedosto

@@ -0,0 +1,539 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HeightBodyFatScaleVC">
<connections>
<outlet property="adultWeightValueLabel" destination="u3v-vO-dqd" id="ig3-Fh-TAG"/>
<outlet property="babyAdultWeightValueLabel" destination="2FI-2z-OEW" id="tIy-gU-Smh"/>
<outlet property="babyWeightValueLabel" destination="Zpe-Jl-39q" id="MRW-C4-rtq"/>
<outlet property="bleStatusLabel" destination="VwK-CG-OF6" id="EY5-XX-CAi"/>
<outlet property="heightValueLabel" destination="Auj-GH-y0k" id="lPG-eF-P8L"/>
<outlet property="reportValueLabel" destination="5li-di-lta" id="sQC-Xc-DrU"/>
<outlet property="uintSettingButton" destination="q79-PN-YaZ" id="DuB-RK-F7B"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
<outlet property="voiceSettingButton" destination="vfp-vj-4pr" id="LiH-jU-6Bj"/>
<outlet property="weightHeightFatModeButton" destination="umD-P1-8r2" id="EJJ-sE-ccm"/>
<outlet property="weightHeightModeButton" destination="gba-oY-NSY" id="rob-lq-znf"/>
<outlet property="weightModeButton" destination="DmJ-ys-rUq" id="UkO-K0-QxF"/>
<outlet property="weightValueLabel" destination="jav-d9-3Eh" id="kVc-R7-A2P"/>
<outlet property="withBabyModeButton" destination="axP-ca-LyH" id="5bm-ge-ys6"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="bleStatus" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VwK-CG-OF6">
<rect key="frame" x="171" y="52" width="72" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LMh-nY-EEc" userLabel="Work Mode View" customClass="ELDemoView">
<rect key="frame" x="20" y="80.5" width="374" height="80"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Work Mode:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OQf-uF-nLJ">
<rect key="frame" x="20" y="4" width="92" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="h0z-rU-3gF">
<rect key="frame" x="4" y="32.5" width="366" height="43.5"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DmJ-ys-rUq" customClass="ELDemoButton">
<rect key="frame" x="0.0" y="0.0" width="88.5" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Weight"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="weightButtonAction:" destination="-1" eventType="touchUpInside" id="dFK-Db-qlx"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gba-oY-NSY" customClass="ELDemoButton">
<rect key="frame" x="92.5" y="0.0" width="88.5" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="W&amp;Height"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="weightHeightButtonAction:" destination="-1" eventType="touchUpInside" id="7gS-2X-vjI"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="umD-P1-8r2" customClass="ELDemoButton">
<rect key="frame" x="185" y="0.0" width="88.5" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="W&amp;H&amp;Fat"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="weightHeightFatButtonAction:" destination="-1" eventType="touchUpInside" id="loa-ir-1dZ"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="axP-ca-LyH" customClass="ELDemoButton">
<rect key="frame" x="277.5" y="0.0" width="88.5" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="with Baby"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="withBabyButtonAction:" destination="-1" eventType="touchUpInside" id="7lN-bs-u6M"/>
</connections>
</button>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="h0z-rU-3gF" firstAttribute="top" secondItem="OQf-uF-nLJ" secondAttribute="bottom" constant="8" symbolic="YES" id="dDN-p8-t78"/>
<constraint firstAttribute="bottom" secondItem="h0z-rU-3gF" secondAttribute="bottom" constant="4" id="f1t-J0-EMI"/>
<constraint firstItem="OQf-uF-nLJ" firstAttribute="top" secondItem="LMh-nY-EEc" secondAttribute="top" constant="4" id="fqu-aQ-0ve"/>
<constraint firstItem="h0z-rU-3gF" firstAttribute="leading" secondItem="LMh-nY-EEc" secondAttribute="leading" constant="4" id="hbU-Dx-r83"/>
<constraint firstAttribute="trailing" secondItem="h0z-rU-3gF" secondAttribute="trailing" constant="4" id="ihd-BD-rq0"/>
<constraint firstAttribute="height" constant="80" id="pF9-re-K2A"/>
<constraint firstItem="OQf-uF-nLJ" firstAttribute="leading" secondItem="LMh-nY-EEc" secondAttribute="leading" constant="20" symbolic="YES" id="s7c-P6-Vz5"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="M8G-k4-tkc">
<rect key="frame" x="20" y="168.5" width="374" height="52"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jJX-xT-Zlf" userLabel="Weight View" customClass="ELDemoView">
<rect key="frame" x="0.0" y="0.0" width="184.5" height="52"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Weight:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uDK-Jb-t10">
<rect key="frame" x="20" y="4" width="58.5" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Weight Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jav-d9-3Eh">
<rect key="frame" x="42.5" y="27.5" width="100" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="jav-d9-3Eh" secondAttribute="bottom" constant="4" id="M03-8v-Bkb"/>
<constraint firstItem="jav-d9-3Eh" firstAttribute="centerX" secondItem="jJX-xT-Zlf" secondAttribute="centerX" id="Nq6-nc-I8E"/>
<constraint firstItem="uDK-Jb-t10" firstAttribute="leading" secondItem="jJX-xT-Zlf" secondAttribute="leading" constant="20" symbolic="YES" id="ghx-v9-7DN"/>
<constraint firstItem="uDK-Jb-t10" firstAttribute="top" secondItem="jJX-xT-Zlf" secondAttribute="top" constant="4" id="xBa-h2-wyy"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="grH-Sv-Gjr" userLabel="Height View" customClass="ELDemoView">
<rect key="frame" x="189.5" y="0.0" width="184.5" height="52"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Height:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="B2x-Br-bpS">
<rect key="frame" x="20" y="4" width="55.5" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Height Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Auj-GH-y0k">
<rect key="frame" x="44" y="27.5" width="97" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="B2x-Br-bpS" firstAttribute="top" secondItem="grH-Sv-Gjr" secondAttribute="top" constant="4" id="DIe-ZX-DJe"/>
<constraint firstItem="Auj-GH-y0k" firstAttribute="centerX" secondItem="grH-Sv-Gjr" secondAttribute="centerX" id="F8Q-Gg-7Zy"/>
<constraint firstAttribute="bottom" secondItem="Auj-GH-y0k" secondAttribute="bottom" constant="4" id="buO-Ef-jVP"/>
<constraint firstItem="B2x-Br-bpS" firstAttribute="leading" secondItem="grH-Sv-Gjr" secondAttribute="leading" constant="20" symbolic="YES" id="ea8-5v-nvs"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="52" id="MeQ-bs-1w3"/>
</constraints>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NtG-dN-oCt" userLabel="Setting: View" customClass="ELDemoView">
<rect key="frame" x="20" y="228.5" width="374" height="80"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Setting:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CF7-fb-MzT">
<rect key="frame" x="20" y="4" width="59" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="9We-yb-bQP">
<rect key="frame" x="4" y="32.5" width="366" height="43.5"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vfp-vj-4pr" customClass="ELDemoButton">
<rect key="frame" x="0.0" y="0.0" width="181" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="tintColor" systemColor="systemCyanColor"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Voice: Off"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="voiceSettingButtonAction:" destination="-1" eventType="touchUpInside" id="kan-fo-enK"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="q79-PN-YaZ" customClass="ELDemoButton">
<rect key="frame" x="185" y="0.0" width="181" height="43.5"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="tintColor" systemColor="systemCyanColor"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Unit: kg &amp; cm"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="mainColor">
<color key="value" systemColor="systemCyanColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="unitSettingButtonAction:" destination="-1" eventType="touchUpInside" id="aBr-IU-tbs"/>
</connections>
</button>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="CF7-fb-MzT" firstAttribute="top" secondItem="NtG-dN-oCt" secondAttribute="top" constant="4" id="62z-Wq-xeK"/>
<constraint firstItem="CF7-fb-MzT" firstAttribute="leading" secondItem="NtG-dN-oCt" secondAttribute="leading" constant="20" symbolic="YES" id="BC6-Qy-w2C"/>
<constraint firstAttribute="trailing" secondItem="9We-yb-bQP" secondAttribute="trailing" constant="4" id="JB5-sj-SIh"/>
<constraint firstItem="9We-yb-bQP" firstAttribute="top" secondItem="CF7-fb-MzT" secondAttribute="bottom" constant="8" symbolic="YES" id="e8j-U2-gzu"/>
<constraint firstAttribute="height" constant="80" id="hsJ-nd-hSs"/>
<constraint firstItem="9We-yb-bQP" firstAttribute="leading" secondItem="NtG-dN-oCt" secondAttribute="leading" constant="4" id="qhL-Cj-qul"/>
<constraint firstAttribute="bottom" secondItem="9We-yb-bQP" secondAttribute="bottom" constant="4" id="tMJ-NL-MG2"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5lj-Lv-y5P" userLabel="Report View" customClass="ELDemoView">
<rect key="frame" x="20" y="316.5" width="374" height="88"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Report:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PD0-wf-hRS">
<rect key="frame" x="20" y="4" width="56" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Report Value" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5li-di-lta">
<rect key="frame" x="20" y="32.5" width="334" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="PD0-wf-hRS" firstAttribute="top" secondItem="5lj-Lv-y5P" secondAttribute="top" constant="4" id="6gm-py-NhL"/>
<constraint firstAttribute="height" constant="88" id="DMY-bP-uBl"/>
<constraint firstItem="5li-di-lta" firstAttribute="top" secondItem="PD0-wf-hRS" secondAttribute="bottom" constant="8" symbolic="YES" id="LTk-Kn-Yad"/>
<constraint firstItem="5li-di-lta" firstAttribute="leading" secondItem="5lj-Lv-y5P" secondAttribute="leading" constant="20" symbolic="YES" id="Zm0-hm-fHn"/>
<constraint firstAttribute="trailing" secondItem="5li-di-lta" secondAttribute="trailing" constant="20" symbolic="YES" id="izL-dM-RyF"/>
<constraint firstItem="PD0-wf-hRS" firstAttribute="leading" secondItem="5lj-Lv-y5P" secondAttribute="leading" constant="20" symbolic="YES" id="oOX-6o-06C"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="hRo-Zb-30S">
<rect key="frame" x="20" y="412.5" width="374" height="52"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BpG-kb-3yx" userLabel="Weight View" customClass="ELDemoView">
<rect key="frame" x="0.0" y="0.0" width="122" height="52"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Baby Weight:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gnk-GY-QZs">
<rect key="frame" x="10.5" y="4" width="101" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zpe-Jl-39q">
<rect key="frame" x="40" y="27.5" width="42" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="Gnk-GY-QZs" firstAttribute="centerX" secondItem="BpG-kb-3yx" secondAttribute="centerX" id="Ehr-59-bMX"/>
<constraint firstItem="Gnk-GY-QZs" firstAttribute="top" secondItem="BpG-kb-3yx" secondAttribute="top" constant="4" id="dBR-Sz-KO4"/>
<constraint firstAttribute="bottom" secondItem="Zpe-Jl-39q" secondAttribute="bottom" constant="4" id="dvS-tt-pAu"/>
<constraint firstItem="Zpe-Jl-39q" firstAttribute="centerX" secondItem="BpG-kb-3yx" secondAttribute="centerX" id="mbA-Yr-Xfs"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EDD-ng-Z3Q" userLabel="Weight View" customClass="ELDemoView">
<rect key="frame" x="126" y="0.0" width="122" height="52"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Adult Weight:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lfM-0G-tDv">
<rect key="frame" x="10" y="4" width="102.5" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="u3v-vO-dqd">
<rect key="frame" x="40" y="27.5" width="42" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="u3v-vO-dqd" firstAttribute="centerX" secondItem="EDD-ng-Z3Q" secondAttribute="centerX" id="QqR-cm-o1g"/>
<constraint firstAttribute="bottom" secondItem="u3v-vO-dqd" secondAttribute="bottom" constant="4" id="asH-WR-aiT"/>
<constraint firstItem="lfM-0G-tDv" firstAttribute="centerX" secondItem="EDD-ng-Z3Q" secondAttribute="centerX" id="gpf-xv-vkd"/>
<constraint firstItem="lfM-0G-tDv" firstAttribute="top" secondItem="EDD-ng-Z3Q" secondAttribute="top" constant="4" id="pHe-tc-Zpc"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0fi-ZR-USg" userLabel="Weight View" customClass="ELDemoView">
<rect key="frame" x="252" y="0.0" width="122" height="52"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="B&amp;A Weight:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NOE-NJ-hRd">
<rect key="frame" x="13" y="4" width="96" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2FI-2z-OEW">
<rect key="frame" x="40" y="27.5" width="42" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="2FI-2z-OEW" firstAttribute="centerX" secondItem="0fi-ZR-USg" secondAttribute="centerX" id="IrI-UD-6kP"/>
<constraint firstItem="NOE-NJ-hRd" firstAttribute="centerX" secondItem="0fi-ZR-USg" secondAttribute="centerX" id="cjx-bH-nYd"/>
<constraint firstItem="NOE-NJ-hRd" firstAttribute="top" secondItem="0fi-ZR-USg" secondAttribute="top" constant="4" id="geL-PR-Yna"/>
<constraint firstAttribute="bottom" secondItem="2FI-2z-OEW" secondAttribute="bottom" constant="4" id="pBk-wb-oLb"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" systemColor="opaqueSeparatorColor"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="52" id="nyY-Lq-92G"/>
</constraints>
</stackView>
</subviews>
<viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="M8G-k4-tkc" firstAttribute="leading" secondItem="Q5M-cg-NOt" secondAttribute="leading" constant="20" id="1Ec-DK-5pb"/>
<constraint firstItem="NtG-dN-oCt" firstAttribute="leading" secondItem="Q5M-cg-NOt" secondAttribute="leading" constant="20" id="41W-Q4-r7n"/>
<constraint firstItem="hRo-Zb-30S" firstAttribute="top" secondItem="5lj-Lv-y5P" secondAttribute="bottom" constant="8" symbolic="YES" id="7pi-4J-5ln"/>
<constraint firstItem="VwK-CG-OF6" firstAttribute="top" secondItem="Q5M-cg-NOt" secondAttribute="top" constant="8" id="E4P-7k-NF0"/>
<constraint firstItem="Q5M-cg-NOt" firstAttribute="trailing" secondItem="LMh-nY-EEc" secondAttribute="trailing" constant="20" id="Jnh-uM-jfJ"/>
<constraint firstItem="M8G-k4-tkc" firstAttribute="top" secondItem="LMh-nY-EEc" secondAttribute="bottom" constant="8" symbolic="YES" id="OEv-ag-BQI"/>
<constraint firstItem="NtG-dN-oCt" firstAttribute="top" secondItem="M8G-k4-tkc" secondAttribute="bottom" constant="8" symbolic="YES" id="OPF-VT-FRU"/>
<constraint firstItem="VwK-CG-OF6" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="VR9-ll-PVV"/>
<constraint firstItem="Q5M-cg-NOt" firstAttribute="trailing" secondItem="hRo-Zb-30S" secondAttribute="trailing" constant="20" id="VhM-X7-t71"/>
<constraint firstItem="Q5M-cg-NOt" firstAttribute="trailing" secondItem="5lj-Lv-y5P" secondAttribute="trailing" constant="20" id="bcl-Yy-ThR"/>
<constraint firstItem="LMh-nY-EEc" firstAttribute="leading" secondItem="Q5M-cg-NOt" secondAttribute="leading" constant="20" id="icc-Pk-lJg"/>
<constraint firstItem="5lj-Lv-y5P" firstAttribute="leading" secondItem="Q5M-cg-NOt" secondAttribute="leading" constant="20" id="iyn-ru-cdB"/>
<constraint firstItem="Q5M-cg-NOt" firstAttribute="trailing" secondItem="M8G-k4-tkc" secondAttribute="trailing" constant="20" id="kp8-CQ-Zz3"/>
<constraint firstItem="5lj-Lv-y5P" firstAttribute="top" secondItem="NtG-dN-oCt" secondAttribute="bottom" constant="8" symbolic="YES" id="odd-oI-bdF"/>
<constraint firstItem="LMh-nY-EEc" firstAttribute="top" secondItem="VwK-CG-OF6" secondAttribute="bottom" constant="8" symbolic="YES" id="ohZ-Pd-rfa"/>
<constraint firstItem="Q5M-cg-NOt" firstAttribute="trailing" secondItem="NtG-dN-oCt" secondAttribute="trailing" constant="20" id="yDP-Dv-MBc"/>
<constraint firstItem="hRo-Zb-30S" firstAttribute="leading" secondItem="Q5M-cg-NOt" secondAttribute="leading" constant="20" id="yi6-d9-kFQ"/>
</constraints>
<point key="canvasLocation" x="97.101449275362327" y="20.758928571428569"/>
</view>
</objects>
<designables>
<designable name="DmJ-ys-rUq">
<size key="intrinsicContentSize" width="40" height="27"/>
</designable>
<designable name="axP-ca-LyH">
<size key="intrinsicContentSize" width="56" height="27"/>
</designable>
<designable name="gba-oY-NSY">
<size key="intrinsicContentSize" width="58" height="27"/>
</designable>
<designable name="q79-PN-YaZ">
<size key="intrinsicContentSize" width="77" height="27"/>
</designable>
<designable name="umD-P1-8r2">
<size key="intrinsicContentSize" width="55" height="27"/>
</designable>
<designable name="vfp-vj-4pr">
<size key="intrinsicContentSize" width="57" height="27"/>
</designable>
</designables>
<resources>
<systemColor name="opaqueSeparatorColor">
<color red="0.77647058823529413" green="0.77647058823529413" blue="0.78431372549019607" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemCyanColor">
<color red="0.19607843137254902" green="0.67843137254901964" blue="0.90196078431372551" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>

BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/AILinkBleSDK Näytä tiedosto


+ 9
- 3
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/AILinkBleSDK-umbrella.h Näytä tiedosto

@@ -24,6 +24,12 @@
#import "ELAILinkBleManager+MeatProbe.h"
#import "ELMeatProbeBleModel.h"
#import "ELMeatProbeBleTool.h"
#import "ELAILinkBleManager+NoiseMeter.h"
#import "ELNoiseMeterBleFunctionModel.h"
#import "ELNoiseMeterBleHeader.h"
#import "ELNoiseMeterBleParser.h"
#import "ELNoiseMeterBleSettingModel.h"
#import "ELNoiseMeterBleStatusModel.h"
#import "ELVictorLuxMeterBleModel.h"
#import "ELVictorLuxMeterBleTool.h"
#import "ELAiFreshNutritionScaleBleHeader.h"
@@ -48,8 +54,8 @@
#import "ELBloodBleSDKHeader.h"
#import "ELBloodSugarBleHeader.h"
#import "ELBloodSugarBleManager.h"
#import "AlgorithmSDK.h"
#import "BfsCalculateSDK.h"
#import "OEMAlgorithmSDK.h"
#import "OEMBfsCalculateSDK.h"
#import "ELBodyFatScaleBleHeader.h"
#import "ELBodyFatScaleBleManager.h"
#import "ELBodyFatScaleBleUserModel.h"
@@ -75,7 +81,6 @@
#import "ELCoffeeScaleBleHeader.h"
#import "ELCoffeeScaleBleManager.h"
#import "ELBlePublicTool.h"
#import "ELBleWifiDetailModel.h"
#import "ELBluetoothManager+BleWifi.h"
#import "ELBluetoothManager+BleWifi_Callback.h"
#import "ELBluetoothManager+Settings.h"
@@ -135,6 +140,7 @@
#import "ELWheelMonitorBleManager.h"
#import "ELWheelMonitorBleModel.h"
#import "ELBleDisposeDataTool.h"
#import "ELBleWifiDetailModel.h"
#import "ELSDKHeader.h"

FOUNDATION_EXPORT double AILinkBleSDKVersionNumber;

+ 9
- 4
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager+AirDetector.h Näytä tiedosto

@@ -6,34 +6,39 @@
//

#import "ELAILinkBleManager.h"
#import "ELAirDetectorBleHeader.h"
#import "ELTLVModel.h"
#import "ELAirDetectorBleHeader.h"
#import "ELAirDetectorBleParser.h"

//typedef NS_ENUM(NSUInteger, ELAirDetectorTLVType);
//typedef NS_ENUM(NSUInteger, ELAirDetectorBleCMD);

NS_ASSUME_NONNULL_BEGIN

@interface ELAILinkBleManager (AirDetector)

- (NSData *)xxx;

//APP获取设备功能列表 //0x01 CMD:获取设备支持的功能列表
- (void)airDetectorRequestDeviceFunctions;
- (NSData *)airDetectorRequestDeviceFunctionsPacketWithMac:(NSData *)mac withCid:(UInt16)cid;

//APP获取设备状态 //0x03 CMD:获取设备状态
- (void)airDetectorRequestDeviceStatus;
- (NSData *)airDetectorRequestDeviceStatusPacketWithMac:(NSData *)mac withCid:(UInt16)cid;

//APP设置/获取参数 //0x05 CMD:设置/获取参数功能
- (void)airDetectorRequestDeviceSettings;
- (NSData *)airDetectorRequestDeviceSettingsPacketWithMac:(NSData *)mac withCid:(UInt16)cid;
- (void)airDetectorSendDeviceSettings:(NSArray<ELTLVModel *> *)tlvs;
- (NSData *)airDetectorSendDeviceSettingsData:(NSArray<ELTLVModel *> *)tlvs;

//APP与模块心跳 //0x07 CMD:定时心跳包
- (void)airDetectorSendHeartbeat;
- (NSData *)airDetectorSendHeartbeatPacketWithMac:(NSData *)mac withCid:(UInt16)cid;


@end

@interface ELAILinkBleManager (tlv)
@interface ELAILinkBleManager (AirDetectorTLV)

//0x01:甲醛
+ (ELTLVModel *)tlvHCHOAlarmOn:(BOOL)on value:(NSInteger)value;

+ 72
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager+NoiseMeter.h Näytä tiedosto

@@ -0,0 +1,72 @@
//
// ELAILinkBleManager+NoiseMeter.h
// AILinkBleSDK
//
// Created by LarryZhang on 2022/12/21.
//

#import "ELAILinkBleManager.h"
#import "ELTLVModel.h"
#import "ELNoiseMeterBleHeader.h"
#import "ELNoiseMeterBleParser.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELAILinkBleManager (NoiseMeter)

//APP获取设备功能列表 //0x01 CMD:APP获取设备功能列表
- (void)noiseMeterRequestDeviceFunctions;

//APP获取设备状态 //0x03 CMD:APP获取设备状态
- (void)noiseMeterRequestDeviceStatus;

//APP设置/获取参数 //0x05 CMD:APP设置/获取参数
- (void)noiseMeterRequestDeviceSettings;
- (void)noiseMeterSendDeviceSettings:(NSArray<ELTLVModel *> *)tlvs;

@end

@interface ELAILinkBleManager (NoiseMeterTLV)

//0x01:频率计权A/C
+ (ELTLVModel *)tlvFrequencyWeightingA;
+ (ELTLVModel *)tlvFrequencyWeightingC;

//0x03:测量等级及范围
+ (ELTLVModel *)tlvMeasurementLevelSwitchUp;
+ (ELTLVModel *)tlvMeasurementLevelSwitchDown;

//0x04:Max/Min模式
+ (ELTLVModel *)tlvMaxMinModelNormal;
+ (ELTLVModel *)tlvMaxMinModelMin;
+ (ELTLVModel *)tlvMaxMinModelMax;

//0x05:时间加权(Fast/Slow)
+ (ELTLVModel *)tlvTimeWeightedFast;
+ (ELTLVModel *)tlvTimeWeightedSlow;

//0x06:数值保持(hold)
+ (ELTLVModel *)tlvValueHoldNormal;
+ (ELTLVModel *)tlvValueHoldWithValue:(UInt16)value;

//0x07:报警
+ (ELTLVModel *)tlvAlarmOff;
+ (ELTLVModel *)tlvAlarmStop; //关闭当前报警(关闭当前报警,指当前触发了报警,之后可手动关闭当次报警,但是并不会关闭报警功能.)
+ (ELTLVModel *)tlvAlarmOn:(NSInteger)alarmValue;

//0x08:背光
+ (ELTLVModel *)tlvBacklightOn;
+ (ELTLVModel *)tlvBacklightOff;

//0x0A:历史
+ (ELTLVModel *)tlvRequestHistoryWithTimestamp:(UInt32)timestamp;
+ (ELTLVModel *)tlvReleaseHistory;

//0x0C:设备绑定
+ (ELTLVModel *)tlvDeviceBindingRequest;
+ (ELTLVModel *)tlvDeviceBindingCancel;


@end

NS_ASSUME_NONNULL_END

+ 189
- 59
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAILinkBleManager.h Näytä tiedosto

@@ -15,70 +15,29 @@
NS_ASSUME_NONNULL_BEGIN

@class ELAILinkPeripheral;
@class ELBleWifiDetailModel;

@protocol ELAILinkBleManagerDelegate <NSObject>

@optional

//扫描
- (void)managerDidUpdateState:(CBCentralManager *)central;

- (void)managerScanState:(BOOL)scanning;

- (void)managerDidDiscoverPeripheral:(ELAILinkPeripheral *)peripheral;

- (void)managerDidDiscoverMorePeripheral:(NSDictionary<NSUUID *, ELAILinkPeripheral *> *)peripherals;

//连接
- (void)managerDidConnectPeripheral:(CBPeripheral *)peripheral;

- (void)managerDidFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

- (void)managerDidDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

- (void)managerDidUpdateConnect:(NELBleManagerConnectState)state;

//服务 & 特征
- (void)peripheralDidDiscoverServices:(NSArray<CBService *> *)services;

- (void)peripheralDidDiscoverCharacteristicsForService:(NSArray<CBCharacteristic *> *)characteristics;

- (void)peripheralDidUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic;

- (void)peripheralDidUpdateValueForCharacteristic:(CBCharacteristic *)characteristic;

- (void)didWriteValueForCharacteristic:(CBCharacteristic *)characteristic;

- (void)peripheralDidReadRSSI:(nonnull NSNumber *)RSSI;


@optional

//A7数据 payload
- (void)aiLinkBleReceiveA7Data:(NSData *)payload;

//A6数据 packet
- (void)aiLinkBleReceiveA6Data:(NSData *)packet;


@end
@protocol ELAILinkBleWifiDelegate;
@protocol ELAILinkBleManagerDelegate;

@interface ELAILinkBleManager : NSObject

//不是必须使用单例
+ (instancetype)sharedManager;

@property(nonatomic, assign, readonly, getter=isScanning) BOOL scanning;

@property(nonatomic, assign, readonly) CBCentralManager *central;

@property (nonatomic, weak) id<ELAILinkBleManagerDelegate> delegate DEPRECATED_MSG_ATTRIBUTE("use 'ailinkDelegate' only");

//不是必须使用单例
+ (instancetype)sharedManager;


@property (nonatomic, strong) CBPeripheral *peripheral;

@property (nonatomic, weak) id<ELAILinkBleManagerDelegate> ailinkDelegate;

//Bluetooth wifi proxy(蓝牙wifi代理)
@property (nonatomic, weak) id<ELAILinkBleWifiDelegate> bleWifiDelegate;

//模块版本号
@property (nonatomic, copy) NSString *bmVersion;
@property (nonatomic, copy) NSString *bmVersionPro;
@@ -95,6 +54,7 @@ NS_ASSUME_NONNULL_BEGIN

@end

#pragma mark - scan
@interface ELAILinkBleManager (scan)

- (void)scanAll;
@@ -108,35 +68,33 @@ NS_ASSUME_NONNULL_BEGIN
//NELBleManager
- (void)stopScan;


@end

#pragma mark - connect
@interface ELAILinkBleManager (connect)

- (void)connectPeripheral:(CBPeripheral *)peripheral;

- (void)disconnectPeripheral;


- (void)connectAILinkPeripheral:(ELAILinkPeripheral * _Nonnull)ailinkPeripheral;

- (ELAILinkPeripheral * _Nullable)currentAILinkPeripheral;

@end



#pragma mark - send
@interface ELAILinkBleManager (send)

- (void)sendA7Payload:(NSData *)payload;
- (void)sendA6Payload:(NSData *)payload;

//base method of 'sendA7Payload' & 'sendA6Payload'
/// base method of 'sendA7Payload' & 'sendA6Payload'
- (void)sendCmd:(NSData *)cmdData;

////最大发送payload长度
//最大发送payload长度
//- (NSUInteger)maximumWritePayloadLength;
////OTA最大发送payload长度
//OTA最大发送payload长度
//- (NSUInteger)maximumWriteOTAPayloadLength;

//发送队列发送周期
@@ -144,8 +102,26 @@ NS_ASSUME_NONNULL_BEGIN

@end

#pragma mark - Special
@interface ELAILinkBleManager (Special)

- (void)processA7Data:(NSMutableData *)rawData withMac:(NSData *)mac withCid:(UInt16)cid;
- (void)processA6Data:(NSMutableData *)rawData;

- (NSData * _Nullable)makePacketA7Payload:(NSData *)payload withMac:(NSData *)mac withCid:(UInt16)cid;
- (NSData * _Nullable)makePacketA6Payload:(NSData *)payload;

@end

#pragma mark - A6Method
@interface ELAILinkBleManager (A6Method)

/**
Get Bluetooth information(获取蓝牙信息)
@param type ELInetGetCmdType (ELInetGetCmdTypeGetHandshake除外)
*/
- (void)getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdType)type;

/**
Sync the current time of phone to BLE(设置手机本地时间给蓝牙模块,只在蓝牙体脂秤等需要蓝牙模块保存历史记录时才调用)
@param enable
@@ -160,10 +136,166 @@ NS_ASSUME_NONNULL_BEGIN
///同步手机本地时间给mcu,每次连接成功后会自动调用
- (void)syncMCUNowDate;

///查询mqtt链接状态 CMD=0xC5
- (void)checkMqttState;

@end

#pragma mark - BleWifi
@interface ELAILinkBleManager (BleWifi)
//============ Bluetooth WIFI calling method(蓝牙WIFI 设置命令) ==============

/**
WIFI initiate connection and disconnect(WIFI 发起连接、断开连接)
@param connect YES: initiate connection NO: disconnect(YES:发起连接 NO:断开连接)
*/
-(void)bleWifiSetupWifiConnect:(BOOL)connect;

/**
Set WIFI access URL(设置WIFI访问URL)
@param url url(Not more than 56chars(不超过56chars))
*/
-(void)bleWifiSetWifiURL:(NSString *)url;

/**
Set Wifi access port number(设置Wifi访问端口号)
@param port 端口号
*/
-(void)bleWifiSetPort:(int)port;

/**
Set DTIM interval(设置DTIM间隔)
@param interval 间隔
*/
-(void)bleWifiSetDTIMInterval:(int)interval;

/**
Set WIFI password(设置WIFI密码)
@param pwd WIFI password (8 ~ 56 chars)(WIFI密码(8~56 个chars))
*/
-(void)bleWifiSetWifiPwd:(NSString *)pwd;

/**
Set up connected WIFI(设置连接的WIFI)
@param macData wifi MAC (little endian)(wifi的MAC(小端序))
*/
-(void)bleWifiSetConnectWifiMac:(NSData *)macData;

@end

#pragma mark - ELAILinkBleManagerDelegate
@protocol ELAILinkBleManagerDelegate <NSObject>

@optional
//扫描
- (void)managerDidUpdateState:(CBCentralManager *)central;

- (void)managerScanState:(BOOL)scanning;

- (void)managerDidDiscoverPeripheral:(ELAILinkPeripheral *)peripheral;

- (void)managerDidDiscoverMorePeripheral:(NSDictionary<NSUUID *, ELAILinkPeripheral *> *)peripherals;

//连接
- (void)managerDidConnectPeripheral:(CBPeripheral *)peripheral;

- (void)managerDidFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

- (void)managerDidDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

- (void)managerDidUpdateConnect:(NELBleManagerConnectState)state;

//服务 & 特征
- (void)peripheralDidDiscoverServices:(NSArray<CBService *> *)services;

- (void)peripheralDidDiscoverCharacteristicsForService:(NSArray<CBCharacteristic *> *)characteristics;

- (void)peripheralDidUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic;

- (void)peripheralDidUpdateValueForCharacteristic:(CBCharacteristic *)characteristic;

- (void)didWriteValueForCharacteristic:(CBCharacteristic *)characteristic;

- (void)peripheralDidReadRSSI:(nonnull NSNumber *)RSSI;


@optional

//A7数据 payload
- (void)aiLinkBleReceiveA7Data:(NSData *)payload;
- (void)aiLinkBleReceiveA7Data:(NSData *)payload withMac:(NSData *)mac;

//A6数据 packet
- (void)aiLinkBleReceiveA6Data:(NSData *)packet;
- (void)aiLinkBleReceiveA6Data:(NSData *)packet withMac:(NSData *)mac;

@end

#pragma mark - Bluetooth Wifi protocol(蓝牙Wifi协议)
@protocol ELAILinkBleWifiDelegate <NSObject>

@optional

/**
Callback Wifi details(回调Wifi详情)
@param model 模型
*/
-(void)bleWifiReceiveWifiDetailModel:(ELBleWifiDetailModel *_Nonnull)model;

/**
Scan nearby wifi results(扫描附近wifi结果)
@param count Number of nearby wifi(附近wifi数量)
*/
-(void)bleWifiReceiveScanedWifiCount:(int)count;

/**
Callback Wifi MAC address(回调Wifi MAC地址)
@param macData mac
*/
-(void)bleWifiReceiveWifiMacData:(NSData *_Nullable)macData;

/**
Callback WIFI password(回调WIFI密码)
@param pwd password(密码)
*/
-(void)bleWifiReceiveWifiPwd:(NSString *_Nonnull)pwd;

/**
Get DTIM interval (unit: ms)(获取DTIM间隔(单位:ms))
@param interval Interval (unit: ms)(间隔(单位:ms))
*/
-(void)bleWifiReceiveWifiDTIMInterval:(NSInteger)interval;

/**
Returns the visited URL(返回访问的url)
@param url url
*/
-(void)bleWifiReceiveWifiAccessURL:(NSString *_Nonnull)url;

/**
Call back wifi port number(回调wifi的端口号)
@param port 端口号
*/
-(void)bleWifiReceiveWifiPort:(int)port;

/**
Set or query the callback of the instruction execution result(设置指令蓝牙WIFI响应回调方法)
只支持蓝牙Wifi部分枚举
@param type Type of setting (设置的类型)
@param result Set result(设置的结果)
*/
-(void)bleWifiReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result;

/**
获取会话码(deviceId)
@param code (deviceId) deviceId(0 means no:为0时表示不存在)
*/
-(void)bleWifiReceiveWifiSNCode:(int)code;

/** 返回wifi名称 */
- (void)bleWifiName:(NSString *)wifiName;

@end

#pragma mark - ELAILinkPeripheral

@@ -186,10 +318,8 @@ NS_ASSUME_NONNULL_BEGIN

@property (nonatomic, assign) UInt16 pid;


@property (nonatomic, strong) NSUUID *identifier;

@end


NS_ASSUME_NONNULL_END

+ 3
- 3
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELAirDetectorBleParser.h Näytä tiedosto

@@ -14,10 +14,10 @@

NS_ASSUME_NONNULL_BEGIN

typedef void(^didUpdateDataBlock)(ELAirDetectorBleCMD cmd, ELAirDetectorTLVType type);

@interface ELAirDetectorBleParser : NSObject

typedef void(^airDetectorDidUpdateDataBlock)(ELAirDetectorBleCMD cmd, ELAirDetectorTLVType type);

@property (nonatomic, strong) ELAirDetectorBleFunctionModel *functionModel;

@property (nonatomic, strong) ELAirDetectorBleStatusModel *statusModel;
@@ -25,7 +25,7 @@ typedef void(^didUpdateDataBlock)(ELAirDetectorBleCMD cmd, ELAirDetectorTLVType
@property (nonatomic, strong) ELAirDetectorBleSettingModel *settingModel;


- (void)parseData:(NSData *)payload callback:(didUpdateDataBlock)calllback;
- (void)parseData:(NSData *)payload callback:(airDetectorDidUpdateDataBlock)calllback;

@end


+ 0
- 4
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBleWifiDetailModel.h Näytä tiedosto

@@ -23,8 +23,6 @@ typedef NS_ENUM(NSUInteger, ELBleWifiUseState) {
ELBleWifiUseStateConnected = 2, //Currently connected wifi(目前连接着的wifi)
};



NS_ASSUME_NONNULL_BEGIN

@interface ELBleWifiDetailModel : NSObject<NSCopying>
@@ -41,8 +39,6 @@ NS_ASSUME_NONNULL_BEGIN
//wifi status(wifi状态)
@property (nonatomic, assign) ELBleWifiUseState wifiState;



@end

NS_ASSUME_NONNULL_END

+ 1
- 1
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBluetoothManager.h Näytä tiedosto

@@ -15,7 +15,7 @@


//版本号 SDK Version
#define AiLinkBleSDKVersion @"1.5.6" //20221221 四电极体脂秤身体指标算法 AlgorithmSDK BfsCalculateSDK
#define AiLinkBleSDKVersion @"1.5.9" //20230206 增加身高体脂秤 (Add Height Body Fat Scale)


NS_ASSUME_NONNULL_BEGIN

+ 10
- 5
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightBodyFatScaleBleManager.h Näytä tiedosto

@@ -51,7 +51,8 @@ NS_ASSUME_NONNULL_BEGIN
* @param heightUnit : 身高单位
* @param video : 语音开关
*/
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit videoState:(BOOL)video;
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit videoState:(BOOL)video DEPRECATED_MSG_ATTRIBUTE("use 'voiceState' instead");
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit voiceState:(BOOL)voice;

#pragma mark - 身高体脂秤模式

@@ -125,7 +126,8 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark 发送指令

///设置用户信息
- (void)sendUserDataWithSex:(NSInteger)sex age:(NSInteger)age height:(NSInteger)cm;
- (void)sendUserDataWithSex:(NSInteger)sex age:(NSInteger)age height:(NSInteger)cm DEPRECATED_MSG_ATTRIBUTE("use 'sendUserDataWithGender:age:heightInCm:' instead");
- (void)sendUserDataWithGender:(NSInteger)gender age:(NSInteger)age heightInCm:(NSInteger)heightInCm;

///App设置单位
- (void)sendUnitWithHeightUnit:(ELDeviceHeightUnit)heightUnit weightUnit:(ELDeviceWeightUnit)weightUnit;
@@ -134,13 +136,16 @@ NS_ASSUME_NONNULL_BEGIN
- (void)reportUnitSetupResult:(HeightBodyFatScale_SetupResult)result;

//App下发工作模式
- (void)sendDevceWorkMode:(HeightBodyFatScale_WorkModeType)model;
- (void)sendDevceWorkMode:(HeightBodyFatScale_WorkModeType)model DEPRECATED_MSG_ATTRIBUTE("use 'sendDeviceWorkMode' instead");
- (void)sendDeviceWorkMode:(HeightBodyFatScale_WorkModeType)mode;

//App读取声音设置
- (void)getVideoSetup;
- (void)getVideoSetup DEPRECATED_MSG_ATTRIBUTE("use 'getVoiceSetup' instead");
- (void)getVoiceSetup;

//App声音设置
- (void)sendVideoSetupState:(BOOL)state;
- (void)sendVideoSetupState:(BOOL)state DEPRECATED_MSG_ATTRIBUTE("use 'sendVoiceSetting' instead");
- (void)sendVoiceSetting:(BOOL)on;

//App获取工作状态
- (void)getWorkState;

+ 57
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleFunctionModel.h Näytä tiedosto

@@ -0,0 +1,57 @@
//
// ELNoiseMeterBleFunctionModel.h
// AILinkBleSDK
//
// Created by LarryZhang on 2022/12/21.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ELNoiseMeterBleFunctionModel : NSObject

//0x80:协议版本 1
@property (nonatomic, assign) NSInteger version;

//0x01:频率计权A/C 1
@property (nonatomic, assign) BOOL supportFrequencyWeightingA;
@property (nonatomic, assign) BOOL supportFrequencyWeightingC;

//0x02:测量总范围 5
@property (nonatomic, assign) NSInteger measuringRangeScale;
@property (nonatomic, assign) NSInteger measuringRangeMin;
@property (nonatomic, assign) NSInteger measuringRangeMax;

//0x03:测量等级切换 1
@property (nonatomic, assign) BOOL supportMeasurementLevelSwitch;

//0x04:Max/Min模式 1
@property (nonatomic, assign) BOOL supportMaxMinModel;

//0x05:时间加权(Fast/Slow) 1
@property (nonatomic, assign) BOOL supportTimeWeightedFastSlow;

//0x06:数值保持(hold) 1
@property (nonatomic, assign) BOOL supportValueHold;

//0x07:报警功能 5
@property (nonatomic, assign) BOOL supportAlarm;
@property (nonatomic, assign) NSInteger alarmMin;
@property (nonatomic, assign) NSInteger alarmMax;

//0x08:背光 1
@property (nonatomic, assign) BOOL supportBacklight;

//0x09:噪音值 1
@property (nonatomic, assign) NSInteger noiseValueScale;

//0x0A:历史 1
@property (nonatomic, assign) BOOL supportHistory;

//0x0B:供电 1
@property (nonatomic, assign) NSInteger powerSupplyType;

@end

NS_ASSUME_NONNULL_END

+ 41
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleHeader.h Näytä tiedosto

@@ -0,0 +1,41 @@
//
// ELNoiseMeterBleHeader.h
// Pods
//
// Created by LarryZhang on 2022/12/21.
//

#ifndef ELNoiseMeterBleHeader_h
#define ELNoiseMeterBleHeader_h


typedef NS_ENUM(NSUInteger, ELNoiseMeterBleCMD) {
ELNoiseMeterBleCMD01 = 0x01, //CMD:APP获取设备功能列表
ELNoiseMeterBleCMD02 = 0x02, //CMD:MCU主控回应设备功能列表
ELNoiseMeterBleCMD03 = 0x03, //CMD:APP获取设备状态
ELNoiseMeterBleCMD04 = 0x04, //CMD:MCU主控回应设备状态
ELNoiseMeterBleCMD05 = 0x05, //CMD:APP设置/获取参数
ELNoiseMeterBleCMD06 = 0x06, //CMD:MCU返回设置参数
ELNoiseMeterBleCMDF1 = 0xF1, //CMD:上发保存数据
};

typedef NS_ENUM(NSUInteger, ELNoiseMeterTLVType) {
ELNoiseMeterTLVTypeFrequencyWeightingAC = 0x01, //0x01:频率计权A/C
ELNoiseMeterTLVTypeTotalMeasuringRange = 0x02, //0x02:测量总范围
ELNoiseMeterTLVTypeMeasurementLevelSwitch = 0x03, //0x03:测量等级切换
ELNoiseMeterTLVTypeMaxMinModel = 0x04, //0x04:Max/Min模式
ELNoiseMeterTLVTypeTimeWeightedFastSlow = 0x05, //0x05:时间加权(Fast/Slow)
ELNoiseMeterTLVTypeValueHold = 0x06, //0x06:数值保持(hold)
ELNoiseMeterTLVTypeAlarm = 0x07, //0x07:报警
ELNoiseMeterTLVTypeBacklight = 0x08, //0x08:背光
ELNoiseMeterTLVTypeNoiseValue = 0x09, //0x09:噪音值
ELNoiseMeterTLVTypeHistory = 0x0A, //0x0A:历史
ELNoiseMeterTLVTypePowerSupply = 0x0B, //0x0B:供电
ELNoiseMeterTLVTypeDeviceBinding = 0x0C, //0x0C:设备绑定
ELNoiseMeterTLVTypeVersion = 0x80, //0x80:协议版本
};


#endif /* ELNoiseMeterBleHeader_h */

+ 32
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleParser.h Näytä tiedosto

@@ -0,0 +1,32 @@
//
// ELNoiseMeterBleParser.h
// AILinkBleSDK
//
// Created by LarryZhang on 2022/12/21.
//

#import <Foundation/Foundation.h>
#import "ELSDKHeader.h"
#import "ELNoiseMeterBleHeader.h"
#import "ELNoiseMeterBleFunctionModel.h"
#import "ELNoiseMeterBleStatusModel.h"
#import "ELNoiseMeterBleSettingModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELNoiseMeterBleParser : NSObject

typedef void(^noiseMeterDidUpdateDataBlock)(ELNoiseMeterBleCMD cmd, ELNoiseMeterTLVType type);

@property (nonatomic, strong) ELNoiseMeterBleFunctionModel *functionModel;

@property (nonatomic, strong) ELNoiseMeterBleStatusModel *statusModel;

@property (nonatomic, strong) ELNoiseMeterBleSettingModel *settingModel;


- (void)parseData:(NSData *)payload callback:(noiseMeterDidUpdateDataBlock)calllback;

@end

NS_ASSUME_NONNULL_END

+ 50
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleSettingModel.h Näytä tiedosto

@@ -0,0 +1,50 @@
//
// ELNoiseMeterBleSettingModel.h
// AILinkBleSDK
//
// Created by LarryZhang on 2022/12/21.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ELNoiseMeterBleSettingModel : NSObject

//0x01:频率计权A/C 1
@property (nonatomic, assign) NSInteger frequencyWeightingACValue;

//0x03:测量等级及范围 6
@property (nonatomic, assign) NSInteger measurementLevelStatus;
@property (nonatomic, assign) NSInteger measurementLevelValue;
@property (nonatomic, assign) NSInteger measurementLevelMin;
@property (nonatomic, assign) NSInteger measurementLevelMax;

//0x04:Max/Min模式 1
@property (nonatomic, assign) NSInteger maxMinModel;

//0x05:时间加权(Fast/Slow) 1
@property (nonatomic, assign) NSInteger timeWeightedFastSlowModel;

//0x06:数值保持(hold) 3
@property (nonatomic, assign) NSInteger valueHoldModel;
@property (nonatomic, assign) NSInteger valueHoldValue;

//0x07:报警 3
@property (nonatomic, assign) BOOL alarmOn;
@property (nonatomic, assign) BOOL alarmStop;
@property (nonatomic, assign) NSInteger alarmValue;

//0x08:背光 1
@property (nonatomic, assign) BOOL backlightOn;

//0x0A:历史
@property (nonatomic, assign) NSInteger historyStatus;
@property (nonatomic, strong) NSData *historyData;

//0x0C:设备绑定 1
@property (nonatomic, assign) NSInteger deviceBindingStatus;

@end

NS_ASSUME_NONNULL_END

+ 50
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELNoiseMeterBleStatusModel.h Näytä tiedosto

@@ -0,0 +1,50 @@
//
// ELNoiseMeterBleStatusModel.h
// AILinkBleSDK
//
// Created by LarryZhang on 2022/12/21.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ELNoiseMeterBleStatusModel : NSObject

//0x01:频率计权A/C 1
@property (nonatomic, assign) NSInteger frequencyWeightingACValue;

//0x03:测量等级及范围 5
@property (nonatomic, assign) NSInteger measurementLevelValue;
@property (nonatomic, assign) NSInteger measurementLevelMin;
@property (nonatomic, assign) NSInteger measurementLevelMax;

//0x04:Max/Min模式 1
@property (nonatomic, assign) NSInteger maxMinModel;

//0x05:时间加权(Fast/Slow) 1
@property (nonatomic, assign) NSInteger timeWeightedFastSlowModel;

//0x06:数值保持(hold) 3
@property (nonatomic, assign) NSInteger valueHoldModel;
@property (nonatomic, assign) NSInteger valueHoldValue;

//0x07:报警 2
@property (nonatomic, assign) BOOL alarmOn;
@property (nonatomic, assign) BOOL alarmValue;

//0x08:背光 1
@property (nonatomic, assign) BOOL backlightOn;

//0x09:噪音值 3
@property (nonatomic, assign) NSInteger noiseValueStatus;
@property (nonatomic, assign) NSInteger noiseValue;

//0x0B:供电 2
@property (nonatomic, assign) BOOL powerSupplyCharging;
@property (nonatomic, assign) BOOL powerSupplyLow;
@property (nonatomic, assign) NSInteger powerPercent;

@end

NS_ASSUME_NONNULL_END

+ 4
- 2
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELSDKHeader.h Näytä tiedosto

@@ -64,6 +64,8 @@ typedef NS_ENUM(NSUInteger, ELInetGetCmdType) {
#pragma mark ============End 蓝牙Wifi ==============
ELInetGetCmdTypeRequestAuthorize = 0x7F, //Request device authorization (请求设备授权)
ELInetGetCmdTypeToothbrushA6Data = 0xC0, //A6 data for toothbrush(牙刷专用A6数据,详情请见协议的2级指令)(See the second order for details)
#pragma mark ============ mqtt ==============
ELInetGetCmdTypeCheckMqttState = 0xC5, //查询mqtt链接状态 CMD=0xC5
ELInetGetDevOfflineHistory = 0xF1, //获取离线历史记录
};
@@ -170,7 +172,7 @@ typedef NS_ENUM(NSUInteger, ELSupportDeviceType) {
ELSupportDeviceTypeAirDetector = 0x0048, //环境气体检测仪
ELSupportDeviceTypeTPMS = 0x0049, //智能胎压
ELSupportDeviceTypeTPMS智能胎压 = 0x0049, //智能胎压
ELSupportDeviceType电动自行车 = 0x004A, //电动自行车
@@ -184,7 +186,7 @@ typedef NS_ENUM(NSUInteger, ELSupportDeviceType) {
ELSupportDeviceType双频八电极体脂秤 = 0x0052, //双频八电极体脂秤
// ELSupportDeviceType53 = 0x0053,
ELSupportDeviceTypeAirDetectorLite = 0x0053, //环境气体检测仪 不支持MQTT
// ELSupportDeviceType54 = 0x0054,
// ELSupportDeviceType55 = 0x0055,
// ELSupportDeviceType56 = 0x0056,

AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/AlgorithmSDK.h → AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/OEMAlgorithmSDK.h Näytä tiedosto

@@ -7,13 +7,13 @@

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, AlgUserSex) {
AlgUserSex_Female = 0,//2,
AlgUserSex_Male = 1,
typedef NS_ENUM(NSInteger, OEMAlgUserSex) {
OEMAlgUserSex_Female = 0,//2,
OEMAlgUserSex_Male = 1,
};


@interface AlgorithmModel : NSObject
@interface OEMAlgorithmModel : NSObject

///bmi
@property (nonatomic, copy) NSString *bmi;
@@ -52,7 +52,7 @@ typedef NS_ENUM(NSInteger, AlgUserSex) {
@end


@interface AlgorithmSDK : NSObject
@interface OEMAlgorithmSDK : NSObject

/**
* Inet AlgorithmSDK ElinkThings算法
@@ -60,7 +60,7 @@ typedef NS_ENUM(NSInteger, AlgUserSex) {
* eg:
* kgWeight: 50.6 age: 25 height: 175
*/
+ (AlgorithmModel *)getBodyfatWithWeight:(double)kgWeight adc:(int)adc sex:(AlgUserSex)sex age:(int)age height:(int)height;
+ (OEMAlgorithmModel *)getBodyfatWithWeight:(double)kgWeight adc:(int)adc sex:(OEMAlgUserSex)sex age:(int)age height:(int)height;


@end

AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/BfsCalculateSDK.h → AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/OEMBfsCalculateSDK.h Näytä tiedosto

@@ -8,13 +8,13 @@

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, BfsUserSex) {
BfsUserSex_Female = 0,//2,
BfsUserSex_Male = 1,
typedef NS_ENUM(NSInteger, OEMBfsUserSex) {
OEMBfsUserSex_Female = 0,//2,
OEMBfsUserSex_Male = 1,
};


@interface BfsCalculateItem : NSObject
@interface OEMBfsCalculateItem : NSObject

/**
* 标准体重 standardWeight
@@ -64,7 +64,7 @@ typedef NS_ENUM(NSInteger, BfsUserSex) {



@interface BfsCalculateSDK : NSObject
@interface OEMBfsCalculateSDK : NSObject


/**
@@ -83,7 +83,7 @@ typedef NS_ENUM(NSInteger, BfsUserSex) {
* 蛋白率 25.9
* @return BfsCalculateItem
*/
+ (BfsCalculateItem *)getBodyfatItemWithSex:(BfsUserSex)sex height:(NSInteger)height weight:(double)weight bfr:(NSString *)bfr rom:(NSString *)rom pp:(NSString *)pp;
+ (OEMBfsCalculateItem *)getBodyfatItemWithSex:(OEMBfsUserSex)sex height:(NSInteger)height weight:(double)weight bfr:(NSString *)bfr rom:(NSString *)rom pp:(NSString *)pp;

/**
* 获取标准体重(单位:kg)

BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/Info.plist Näytä tiedosto


+ 40
- 39
AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/Contents.json Näytä tiedosto

@@ -2,97 +2,98 @@
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "logomaker.png",
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
"scale" : "1x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
"scale" : "2x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/logomaker.png Näytä tiedosto


+ 3
- 3
AILinkBleSDKDemo/Assets.xcassets/Contents.json Näytä tiedosto

@@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/8_electrode_measurement_type@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/8_electrode_measurement_type@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/8_electrode_measurement_type.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "8_electrode_measurement_type@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "8_electrode_measurement_type@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

+ 6
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/Contents.json Näytä tiedosto

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ailink_air_detection_type_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_air_detection_type_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/ailink_air_detection_type_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_air_detection_type_ic.imageset/ailink_air_detection_type_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ailink_connected_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_connected_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/ailink_connected_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_connected_ic.imageset/ailink_connected_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ailink_nutrition_scale_scale_connect@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_nutrition_scale_scale_connect@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/ailink_nutrition_scale_scale_connect@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_nutrition_scale_scale_connect.imageset/ailink_nutrition_scale_scale_connect@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "ailink_smart_skip_rope_device_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_smart_skip_rope_device_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/ailink_smart_skip_rope_device_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/ailink_smart_skip_rope_device_ic.imageset/ailink_smart_skip_rope_device_ic@3x.png Näytä tiedosto


+ 21
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/air_detection_type_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_air_detection_type_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/air_detection_type_ic.imageset/ailink_air_detection_type_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "foodtem_icon_100@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "foodtem_icon_100@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/foodtem_icon_100@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/foodtem_icon_100.imageset/foodtem_icon_100@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "height_body_fat_scale_bind_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "height_body_fat_scale_bind_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/height_body_fat_scale_bind_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/height_body_fat_scale_type_ic.imageset/height_body_fat_scale_bind_ic@3x.png Näytä tiedosto


+ 21
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/meat_probe_type_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "ailink_meat_probe_type_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/meat_probe_type_ic.imageset/ailink_meat_probe_type_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "oximeter_search_icon1@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "oximeter_search_icon1@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/oximeter_search_icon1@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/oximeter_search_icon1.imageset/oximeter_search_icon1@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_baby_scale_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_baby_scale_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/type_baby_scale_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_baby_scale_ic.imageset/type_baby_scale_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_blood_sugar@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_blood_sugar@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/type_blood_sugar@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_blood_sugar.imageset/type_blood_sugar@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_body_fat_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_body_fat_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/type_body_fat_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_body_fat_ic.imageset/type_body_fat_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_brush@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_brush@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/type_brush@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_brush.imageset/type_brush@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "coffee_icon_100@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "coffee_icon_100@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/coffee_icon_100@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_coffee_scale_ic.imageset/coffee_icon_100@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_control_vision_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_control_vision_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/type_control_vision_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_control_vision_ic.imageset/type_control_vision_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_height_measuring_instrument@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_height_measuring_instrument@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/type_height_measuring_instrument@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_height_measuring_instrument.imageset/type_height_measuring_instrument@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_smart_mask@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_smart_mask@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/type_smart_mask@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_mask.imageset/type_smart_mask@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_smart_tpms_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_smart_tpms_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/type_smart_tpms_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_smart_tpms_ic.imageset/type_smart_tpms_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_sphygmomanometer_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_sphygmomanometer_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/type_sphygmomanometer_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_sphygmomanometer_ic.imageset/type_sphygmomanometer_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_temperature_gun_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_temperature_gun_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/type_temperature_gun_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_temperature_gun_ic.imageset/type_temperature_gun_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_thermometer_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_thermometer_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/type_thermometer_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_thermometer_ic.imageset/type_thermometer_ic@3x.png Näytä tiedosto


+ 22
- 0
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/Contents.json Näytä tiedosto

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "type_tpms_ic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "type_tpms_ic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/type_tpms_ic@2x.png Näytä tiedosto


BIN
AILinkBleSDKDemo/Assets.xcassets/DeviceIcon/type_tpms_ic.imageset/type_tpms_ic@3x.png Näytä tiedosto


+ 2
- 2
AILinkBleSDKDemo/Info.plist Näytä tiedosto

@@ -4,6 +4,8 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>AILinkSDKDemo</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -33,8 +35,6 @@
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>

+ 36
- 0
AILinkBleSDKDemo/Others/ELDemoDeviceModel.h Näytä tiedosto

@@ -0,0 +1,36 @@
//
// ELDemoDeviceModel.h
// AILinkBleSDK_Example
//
// Created by LarryZhang on 2023/2/4.
// Copyright © 2023 zhengzida. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ELDemoDeviceModel : NSObject

@property (nonatomic, copy) NSString *index;

@property (nonatomic, copy) NSString *imageName;

@property (nonatomic, copy) NSString *titleText;

@property (nonatomic, copy) NSString *subtitleText;

@property (nonatomic, copy) NSString *entryVCName;

@property (nonatomic, strong) NSArray<NSNumber *> *cids;

@property (nonatomic, assign) BOOL newType;


+ (instancetype)modelWithIndex:(NSString *)index imageName:(NSString *)imageName title:(NSString *)title subtitle:(NSString *)subtitle entryVCName:(NSString *)entryVCName;

+ (instancetype)modelWithIndex:(NSString *)index imageName:(NSString *)imageName title:(NSString *)title subtitle:(NSString *)subtitle entryVCName:(NSString *)entryVCName cids:(NSArray<NSNumber *> *)cids;

@end

NS_ASSUME_NONNULL_END

+ 35
- 0
AILinkBleSDKDemo/Others/ELDemoDeviceModel.m Näytä tiedosto

@@ -0,0 +1,35 @@
//
// ELDemoDeviceModel.m
// AILinkBleSDK_Example
//
// Created by LarryZhang on 2023/2/4.
// Copyright © 2023 zhengzida. All rights reserved.
//

#import "ELDemoDeviceModel.h"

@implementation ELDemoDeviceModel

+ (instancetype)modelWithIndex:(NSString *)index imageName:(NSString *)imageName title:(NSString *)title subtitle:(NSString *)subtitle entryVCName:(NSString *)entryVCName {
return [self modelWithIndex:index imageName:imageName title:title subtitle:subtitle entryVCName:entryVCName cids:@[] newType:NO];
}

+ (instancetype)modelWithIndex:(NSString *)index imageName:(NSString *)imageName title:(NSString *)title subtitle:(NSString *)subtitle entryVCName:(NSString *)entryVCName cids:(NSArray<NSNumber *> *)cids {
return [self modelWithIndex:index imageName:imageName title:title subtitle:subtitle entryVCName:entryVCName cids:@[] newType:YES];
}

+ (instancetype)modelWithIndex:(NSString *)index imageName:(NSString *)imageName title:(NSString *)title subtitle:(NSString *)subtitle entryVCName:(NSString *)entryVCName cids:(NSArray<NSNumber *> *)cids newType:(BOOL)newType {
ELDemoDeviceModel *model = [[ELDemoDeviceModel alloc] init];
model.index = index;
model.imageName = imageName;
model.titleText = title;
model.subtitleText = subtitle;
model.entryVCName = entryVCName;
model.cids = cids;
model.newType = newType;
return model;
}


@end

+ 23
- 0
AILinkBleSDKDemo/Others/ELDemoScanVC.h Näytä tiedosto

@@ -0,0 +1,23 @@
//
// ELDemoScanVC.h
// AILinkBleSDK_Example
//
// Created by LarryZhang on 2022/12/12.
// Copyright © 2022 zhengzida. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@class ELAILinkPeripheral;

@interface ELDemoScanVC : UIViewController

@property (nonatomic, copy) NSArray<NSNumber *> *cids;

@property (nonatomic, copy) void (^selectedBlock)(ELAILinkPeripheral *per);

@end

NS_ASSUME_NONNULL_END

+ 0
- 0
AILinkBleSDKDemo/Others/ELDemoScanVC.m Näytä tiedosto


Some files were not shown because too many files changed in this diff

Loading…
Peruuta
Tallenna