Guest User

Untitled

a guest
Jul 16th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.06 KB | None | 0 0
  1. //
  2. // DZLuggageGuardViewController.swift
  3. // DianZiCheng
  4. //
  5. // Created by jackyshan on 2018/3/10.
  6. // Copyright © 2018年 jackyshan. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10.  
  11. class DZLuggageGuardViewController: DZBaseViewController {
  12.  
  13. // MARK: - 1、属性
  14.  
  15. @IBOutlet weak var sensitivitySwitchView: DZSwitchView!
  16. @IBOutlet weak var alarmSwitchView: DZSwitchView!
  17. @IBOutlet weak var searchSwitchView: DZBtnSwitchView!
  18. @IBOutlet weak var btnAlarmSwitchView: DZBtnSwitchView!
  19. @IBOutlet weak var distanceDescLb: UILabel!
  20. @IBOutlet weak var distanceDescImgV: UIImageView!
  21.  
  22. var model: DZSettingModel? = DZSettingModel.query(DZSettingModel.self).last
  23.  
  24. private var timer: Timer?
  25.  
  26. private var sound: GciSound?
  27.  
  28. private var isSearch: Bool = false
  29.  
  30. // MARK: - 2、生命周期
  31. init() {
  32. super.init(nibName: "DZLuggageGuardViewController", bundle: nil)
  33. }
  34.  
  35. required init?(coder aDecoder: NSCoder) {
  36. fatalError("init(coder:) has not been implemented")
  37. }
  38.  
  39. override func viewDidLoad() {
  40. super.viewDidLoad()
  41.  
  42. initUI()
  43. initLinstener()
  44. initData()
  45. }
  46.  
  47. override func viewWillAppear(_ animated: Bool) {
  48. super.viewWillAppear(animated)
  49.  
  50. model = DZSettingModel.query(DZSettingModel.self).last
  51. updateModel()
  52.  
  53. }
  54.  
  55. override func viewDidDisappear(_ animated: Bool) {
  56. super.viewDidDisappear(animated)
  57.  
  58. timer?.invalidate()
  59. timer = nil
  60. }
  61.  
  62. // MARK: 初始化ui
  63. func initUI() {
  64. showWriteNavController()
  65. showLeftButton()
  66. self.view.backgroundColor = AppConfig.XXT_LightGray
  67. self.localString = "Luggage Guard"
  68. }
  69.  
  70. // MARK: 初始化linstener
  71. func initLinstener() {
  72. timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
  73.  
  74. if sound == nil {
  75. let path = Bundle.main.path(forResource: "tixing", ofType: "wav")
  76. self.sound = GciSound(FilePath: path!)
  77. }
  78.  
  79. sensitivitySwitchView.clickBlock = { [weak self] objStr in
  80. let unit1 = DZAlertListModel.init(title: "LOW", idx: 0, isSelected: objStr == "LOW")
  81. let unit2 = DZAlertListModel.init(title: "NORMAL", idx: 1, isSelected: objStr == "NORMAL")
  82. let unit3 = DZAlertListModel.init(title: "HIGH", idx: 2, isSelected: objStr == "HIGH")
  83. let alertListView = DZAlertListView.view()
  84. alertListView.updateModels([unit1, unit2, unit3])
  85. alertListView.show()
  86. alertListView.resultBlock = { [weak self] obj in
  87. guard let wself = self else {return}
  88. DZSettingModel.update {
  89. wself.model?.antiLostSensitivity = obj.idx
  90. wself.updateModel()
  91. }
  92. }
  93. }
  94.  
  95. alarmSwitchView.clickBlock = { [weak self] objStr in
  96. let unit1 = DZAlertListModel.init(title: "Vibrate Only", idx: 0, isSelected: objStr == "Vibrate Only")
  97. let unit2 = DZAlertListModel.init(title: "Alarm Only", idx: 1, isSelected: objStr == "Alarm Only")
  98. let unit3 = DZAlertListModel.init(title: "Vibrate and Alarm", idx: 2, isSelected: objStr == "Vibrate and Alarm")
  99. let alertListView = DZAlertListView.view()
  100. alertListView.updateModels([unit1, unit2, unit3])
  101. alertListView.show()
  102. alertListView.resultBlock = { [weak self] obj in
  103. guard let wself = self else {return}
  104. DZSettingModel.update {
  105. wself.model?.antiLostAlertType = obj.idx
  106. wself.updateModel()
  107. }
  108. }
  109. }
  110.  
  111. btnAlarmSwitchView.clickBlock = { [weak self] isOn in
  112. guard let wself = self else {return}
  113.  
  114. if let obj = wself.model {
  115. DZManageBLE.handleDeviceSend(obj)
  116. }
  117.  
  118. DZSettingModel.update {
  119. wself.model?.antiLostAlert = isOn
  120. wself.updateModel()
  121. }
  122. }
  123.  
  124. searchSwitchView.clickBlock = { [weak self] isOn in
  125. self?.isSearch = isOn
  126. }
  127.  
  128. BLEScanner.sharedInstance.bleDidReadRSSI = { [weak self] rssi in
  129. Log.i(rssi)
  130.  
  131. self?.rssiUpdate(rssi.int32Value)
  132. }
  133. }
  134.  
  135. // MARK: 初始化data
  136. func initData() {
  137. distanceDescLb.text = "..."
  138. }
  139.  
  140. // MARK: 设置frame
  141. override func didSystemAutoLayoutComplete() {
  142. }
  143.  
  144. // MARK: - 3、代理
  145.  
  146. // MARK: - 4、业务
  147. func updateModel() {
  148. sensitivitySwitchView.updateTitle(model?.antiLostSensitivity == 0 ? "LOW" : model?.antiLostSensitivity == 1 ? "NORMAL" : "HIGH")
  149. alarmSwitchView.updateTitle(model?.antiLostAlertType == 0 ? "Vibrate Only" : model?.antiLostAlertType == 1 ? "Alarm Only" : "Vibrate and Alarm")
  150. btnAlarmSwitchView.updateOn(model?.antiLostAlert == true)
  151. }
  152.  
  153. func timerAction() {
  154. guard let peripheral = BLEScanner.sharedInstance.bleConnectedDevice?.peripheral else {return}
  155.  
  156. peripheral.readRSSI()
  157.  
  158. Log.i("读取rssi")
  159. }
  160.  
  161. /**
  162. 计算公式:
  163. d = 10^((abs(RSSI) - A) / (10 * n))
  164. 其中:
  165. d - 计算所得距离
  166. RSSI - 接收信号强度(负值)
  167. A - 发射端和接收端相隔1米时的信号强度
  168. n - 环境衰减因子
  169. */
  170. //当前读取了多少次rssi
  171. private var readRssiCount: Int32 = 0
  172. //读取周期内的rssi总和
  173. private var rssiTotal: Int32 = 0
  174. //读取几次为一个周期
  175. private var readPeriod: Int32 = 15
  176. private var rssiA: Int32 = 0
  177. private var newRssi: Int32 = 0
  178. private var lastRssi: Int32 = 0
  179. func calcDistByRSSI(rssi: Int32) -> Double? {
  180. //累加
  181. readRssiCount += 1
  182. rssiTotal += rssi
  183. if readRssiCount % readPeriod != 0 {
  184. //没有到一个周期不处理
  185. return nil
  186. }
  187. else {
  188. //累计够了次数,则计算平均rssi,并清零rssiTotal
  189. newRssi = rssiTotal / readPeriod
  190. rssiTotal = 0
  191. //记录第一次统计的rssi,设置为A值,用于计算距离
  192. if readRssiCount < 19 {
  193. rssiA = abs(newRssi)
  194. Log.i("RSSI_A:" + String(rssiA))
  195. }
  196. }
  197. let iRssi: Int32 = abs(newRssi)
  198. let power: Double = Double(iRssi-rssiA)/(10*1.7)
  199. return pow(10, power)
  200. }
  201.  
  202. func rssiUpdate(_ rssi: Int32) {
  203. if isSearch == false && model?.antiLostAlert == false {
  204. readRssiCount = 0
  205. rssiTotal = 0
  206. }
  207.  
  208. guard let distance = calcDistByRSSI(rssi: rssi) else {return}
  209.  
  210. Log.i("rssi: " + String(rssi) + "; distance: " + String(distance) + "m")
  211.  
  212. //如果开启了距离搜索
  213. if isSearch == true {
  214. //两次变化比较的值大于5才会比较有意义
  215. if abs(abs(newRssi) - abs(lastRssi)) > 5 {
  216. distanceDescImgV.image = abs(newRssi) > abs(lastRssi) ? #imageLiteral(resourceName: "icon_yl") : #imageLiteral(resourceName: "icon_kj")
  217. //记录新值用于下次比较
  218. lastRssi = newRssi
  219. }
  220. }
  221.  
  222. //开启了防丢失
  223. if model?.antiLostAlert == true {
  224. //判断距离,做出警告
  225. let lostAlertSensity = model?.antiLostSensitivity
  226. let alertDistance: Double = lostAlertSensity == 0 ? 40 : lostAlertSensity == 1 ? 30 : 20
  227. if distance > alertDistance {
  228. doLostRemind()
  229. }
  230. }
  231. }
  232.  
  233. var lostAlertLock = false
  234. func doLostRemind() {
  235. //正在弹出, 不显示第二次
  236. guard lostAlertLock == false else {return}
  237.  
  238. guard let alertType = model?.antiLostAlertType else {return}
  239.  
  240. if alertType != 0 {
  241. DZManageBLE.writeToDeviceAlertLong(true)//设备蜂鸣器触发
  242. }
  243.  
  244. switch alertType {
  245. case 0:
  246. self.sound?.playVibrateAndCompletionAction()
  247. break
  248. case 1:
  249. self.sound?.playAlertAndCompletionAction()
  250. break
  251. case 2:
  252. self.sound?.playAlterVibrateAndCompletionAction()
  253. break
  254. default:
  255. break
  256. }
  257.  
  258. let alertView = DZAntiLostAlertView.view()
  259. alertView.dismissBlock = {
  260. self.lostAlertLock = false
  261. self.sound?.stopPlay()
  262. }
  263. alertView.show()
  264. lostAlertLock = true
  265. }
  266.  
  267. override func backBtnAction() {
  268. if let vcs = self.navigationController?.viewControllers {
  269. for vc in vcs {
  270. if vc is DZWeighingViewController {
  271. self.navigationController?.popToViewController(vc, animated: true)
  272. break
  273. }
  274. }
  275. }
  276. }
  277.  
  278. // MARK: - 5、网络
  279.  
  280. // MARK: - 6、其他
  281. deinit {
  282.  
  283. }
  284.  
  285. }
Add Comment
Please, Sign In to add comment