Created
July 16, 2018 06:36
-
-
Save jackyshan/8b36d5451ca13071cc9540c1c5acd3c5 to your computer and use it in GitHub Desktop.
寻找行李
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// DZLuggageGuardViewController.swift | |
// DianZiCheng | |
// | |
// Created by jackyshan on 2018/3/10. | |
// Copyright © 2018年 jackyshan. All rights reserved. | |
// | |
import UIKit | |
class DZLuggageGuardViewController: DZBaseViewController { | |
// MARK: - 1、属性 | |
@IBOutlet weak var sensitivitySwitchView: DZSwitchView! | |
@IBOutlet weak var alarmSwitchView: DZSwitchView! | |
@IBOutlet weak var searchSwitchView: DZBtnSwitchView! | |
@IBOutlet weak var btnAlarmSwitchView: DZBtnSwitchView! | |
@IBOutlet weak var distanceDescLb: UILabel! | |
@IBOutlet weak var distanceDescImgV: UIImageView! | |
var model: DZSettingModel? = DZSettingModel.query(DZSettingModel.self).last | |
private var timer: Timer? | |
private var sound: GciSound? | |
private var isSearch: Bool = false | |
// MARK: - 2、生命周期 | |
init() { | |
super.init(nibName: "DZLuggageGuardViewController", bundle: nil) | |
} | |
required init?(coder aDecoder: NSCoder) { | |
fatalError("init(coder:) has not been implemented") | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
initUI() | |
initLinstener() | |
initData() | |
} | |
override func viewWillAppear(_ animated: Bool) { | |
super.viewWillAppear(animated) | |
model = DZSettingModel.query(DZSettingModel.self).last | |
updateModel() | |
} | |
override func viewDidDisappear(_ animated: Bool) { | |
super.viewDidDisappear(animated) | |
timer?.invalidate() | |
timer = nil | |
} | |
// MARK: 初始化ui | |
func initUI() { | |
showWriteNavController() | |
showLeftButton() | |
self.view.backgroundColor = AppConfig.XXT_LightGray | |
self.localString = "Luggage Guard" | |
} | |
// MARK: 初始化linstener | |
func initLinstener() { | |
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true) | |
if sound == nil { | |
let path = Bundle.main.path(forResource: "tixing", ofType: "wav") | |
self.sound = GciSound(FilePath: path!) | |
} | |
sensitivitySwitchView.clickBlock = { [weak self] objStr in | |
let unit1 = DZAlertListModel.init(title: "LOW", idx: 0, isSelected: objStr == "LOW") | |
let unit2 = DZAlertListModel.init(title: "NORMAL", idx: 1, isSelected: objStr == "NORMAL") | |
let unit3 = DZAlertListModel.init(title: "HIGH", idx: 2, isSelected: objStr == "HIGH") | |
let alertListView = DZAlertListView.view() | |
alertListView.updateModels([unit1, unit2, unit3]) | |
alertListView.show() | |
alertListView.resultBlock = { [weak self] obj in | |
guard let wself = self else {return} | |
DZSettingModel.update { | |
wself.model?.antiLostSensitivity = obj.idx | |
wself.updateModel() | |
} | |
} | |
} | |
alarmSwitchView.clickBlock = { [weak self] objStr in | |
let unit1 = DZAlertListModel.init(title: "Vibrate Only", idx: 0, isSelected: objStr == "Vibrate Only") | |
let unit2 = DZAlertListModel.init(title: "Alarm Only", idx: 1, isSelected: objStr == "Alarm Only") | |
let unit3 = DZAlertListModel.init(title: "Vibrate and Alarm", idx: 2, isSelected: objStr == "Vibrate and Alarm") | |
let alertListView = DZAlertListView.view() | |
alertListView.updateModels([unit1, unit2, unit3]) | |
alertListView.show() | |
alertListView.resultBlock = { [weak self] obj in | |
guard let wself = self else {return} | |
DZSettingModel.update { | |
wself.model?.antiLostAlertType = obj.idx | |
wself.updateModel() | |
} | |
} | |
} | |
btnAlarmSwitchView.clickBlock = { [weak self] isOn in | |
guard let wself = self else {return} | |
if let obj = wself.model { | |
DZManageBLE.handleDeviceSend(obj) | |
} | |
DZSettingModel.update { | |
wself.model?.antiLostAlert = isOn | |
wself.updateModel() | |
} | |
} | |
searchSwitchView.clickBlock = { [weak self] isOn in | |
self?.isSearch = isOn | |
} | |
BLEScanner.sharedInstance.bleDidReadRSSI = { [weak self] rssi in | |
Log.i(rssi) | |
self?.rssiUpdate(rssi.int32Value) | |
} | |
} | |
// MARK: 初始化data | |
func initData() { | |
distanceDescLb.text = "..." | |
} | |
// MARK: 设置frame | |
override func didSystemAutoLayoutComplete() { | |
} | |
// MARK: - 3、代理 | |
// MARK: - 4、业务 | |
func updateModel() { | |
sensitivitySwitchView.updateTitle(model?.antiLostSensitivity == 0 ? "LOW" : model?.antiLostSensitivity == 1 ? "NORMAL" : "HIGH") | |
alarmSwitchView.updateTitle(model?.antiLostAlertType == 0 ? "Vibrate Only" : model?.antiLostAlertType == 1 ? "Alarm Only" : "Vibrate and Alarm") | |
btnAlarmSwitchView.updateOn(model?.antiLostAlert == true) | |
} | |
func timerAction() { | |
guard let peripheral = BLEScanner.sharedInstance.bleConnectedDevice?.peripheral else {return} | |
peripheral.readRSSI() | |
Log.i("读取rssi") | |
} | |
/** | |
计算公式: | |
d = 10^((abs(RSSI) - A) / (10 * n)) | |
其中: | |
d - 计算所得距离 | |
RSSI - 接收信号强度(负值) | |
A - 发射端和接收端相隔1米时的信号强度 | |
n - 环境衰减因子 | |
*/ | |
//当前读取了多少次rssi | |
private var readRssiCount: Int32 = 0 | |
//读取周期内的rssi总和 | |
private var rssiTotal: Int32 = 0 | |
//读取几次为一个周期 | |
private var readPeriod: Int32 = 15 | |
private var rssiA: Int32 = 0 | |
private var newRssi: Int32 = 0 | |
private var lastRssi: Int32 = 0 | |
func calcDistByRSSI(rssi: Int32) -> Double? { | |
//累加 | |
readRssiCount += 1 | |
rssiTotal += rssi | |
if readRssiCount % readPeriod != 0 { | |
//没有到一个周期不处理 | |
return nil | |
} | |
else { | |
//累计够了次数,则计算平均rssi,并清零rssiTotal | |
newRssi = rssiTotal / readPeriod | |
rssiTotal = 0 | |
//记录第一次统计的rssi,设置为A值,用于计算距离 | |
if readRssiCount < 19 { | |
rssiA = abs(newRssi) | |
Log.i("RSSI_A:" + String(rssiA)) | |
} | |
} | |
let iRssi: Int32 = abs(newRssi) | |
let power: Double = Double(iRssi-rssiA)/(10*1.7) | |
return pow(10, power) | |
} | |
func rssiUpdate(_ rssi: Int32) { | |
if isSearch == false && model?.antiLostAlert == false { | |
readRssiCount = 0 | |
rssiTotal = 0 | |
} | |
guard let distance = calcDistByRSSI(rssi: rssi) else {return} | |
Log.i("rssi: " + String(rssi) + "; distance: " + String(distance) + "m") | |
//如果开启了距离搜索 | |
if isSearch == true { | |
//两次变化比较的值大于5才会比较有意义 | |
if abs(abs(newRssi) - abs(lastRssi)) > 5 { | |
distanceDescImgV.image = abs(newRssi) > abs(lastRssi) ? #imageLiteral(resourceName: "icon_yl") : #imageLiteral(resourceName: "icon_kj") | |
//记录新值用于下次比较 | |
lastRssi = newRssi | |
} | |
} | |
//开启了防丢失 | |
if model?.antiLostAlert == true { | |
//判断距离,做出警告 | |
let lostAlertSensity = model?.antiLostSensitivity | |
let alertDistance: Double = lostAlertSensity == 0 ? 40 : lostAlertSensity == 1 ? 30 : 20 | |
if distance > alertDistance { | |
doLostRemind() | |
} | |
} | |
} | |
var lostAlertLock = false | |
func doLostRemind() { | |
//正在弹出, 不显示第二次 | |
guard lostAlertLock == false else {return} | |
guard let alertType = model?.antiLostAlertType else {return} | |
if alertType != 0 { | |
DZManageBLE.writeToDeviceAlertLong(true)//设备蜂鸣器触发 | |
} | |
switch alertType { | |
case 0: | |
self.sound?.playVibrateAndCompletionAction() | |
break | |
case 1: | |
self.sound?.playAlertAndCompletionAction() | |
break | |
case 2: | |
self.sound?.playAlterVibrateAndCompletionAction() | |
break | |
default: | |
break | |
} | |
let alertView = DZAntiLostAlertView.view() | |
alertView.dismissBlock = { | |
self.lostAlertLock = false | |
self.sound?.stopPlay() | |
} | |
alertView.show() | |
lostAlertLock = true | |
} | |
override func backBtnAction() { | |
if let vcs = self.navigationController?.viewControllers { | |
for vc in vcs { | |
if vc is DZWeighingViewController { | |
self.navigationController?.popToViewController(vc, animated: true) | |
break | |
} | |
} | |
} | |
} | |
// MARK: - 5、网络 | |
// MARK: - 6、其他 | |
deinit { | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment