// // SBTRealTimeStatusVCtr.swift // SolarBT // // Created by weclouds on 2019/1/28. // Copyright © 2019 weclouds. All rights reserved. // import UIKit import PKHUD struct ReatTimeName { var title:String? var itemName1:String? var itemName2:String? var itemName3:String? } struct RealTimeValue { var itemValue:String? var itemValue2:String? var itemValue3:String? var status:String? var switchValue:String? } class SBTRealTimeStatusVCtr: UIViewController { var preVC : SBTDeviceDetaiVCtr? var isWrite : Bool? = true// 是否读取自动 var isOld :Bool? var deviceName:String? // 设备名称 var bleKey:String? var isSwitchHiddenArr :[Bool]? = [true,true,false] var isDemo:Bool? = false var titleArr : [ReatTimeName]? var dataSource : [RealTimeValue]? var solarPower : CGFloat? var solarPowerValue :String? = "0" var uartCommandTimer : Timer? // 定时器 var isManual:Bool? = false // 是否手动模式 @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. initData() createUI() } override func touchesBegan(_ touches: Set, with event: UIEvent?) { } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if self.isDemo == false { notificationRegister() Thread.sleep(forTimeInterval: 0.1) } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isDemo == false { notificationUnRegister() } } } extension SBTRealTimeStatusVCtr{ func createUI() { self.tableView.delegate = self self.tableView.dataSource = self self.tableView.separatorStyle = .none self.tableView.register(UINib(nibName: "SBTRTStatusCell", bundle: nil), forCellReuseIdentifier: "SBTRTStatusCell") self.tableView.register(UINib(nibName: "SBTDashboardCell", bundle: nil), forCellReuseIdentifier: "SBTDashboardCell") } } extension SBTRealTimeStatusVCtr:UITableViewDelegate,UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 4 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.row == 0 { return 205 }else{ return 119 } } //缓存高度 这个 跟定时器一起使用 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.row == 0 { return 205 }else{ return 119 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "SBTDashboardCell") as! SBTDashboardCell cell.solarPower = self.solarPower cell.solarPowerValue = self.solarPowerValue cell.selectionStyle = .none return cell }else{ let cell = tableView.dequeueReusableCell(withIdentifier: "SBTRTStatusCell") as! SBTRTStatusCell cell.selectionStyle = .none cell.isSwitchHidden = isSwitchHiddenArr![indexPath.row - 1] var isHandle = false if indexPath.row == 3{ cell.isDemo = self.isDemo cell.switchCallback = {(isOn) in log.debug("开关状态 - \(isOn)") cell.isSwitchEnabled = self.isManual! //判断 发送 读取 if self.isDemo == true{ var realTime = RealTimeValue(itemValue: "14.1V", itemValue2: "8.06A", itemValue3: "114W", status: "Load_is_on".da_localizedStr(), switchValue:"0") if isOn == true{ realTime = RealTimeValue(itemValue: "14.1V", itemValue2: "8.06A", itemValue3: "114W", status: "Load_is_on".da_localizedStr(), switchValue:"1") }else{ realTime = RealTimeValue(itemValue: "0.0V", itemValue2: "0.00A", itemValue3: "0W", status: "Load_is_off".da_localizedStr(), switchValue:"0") } self.dataSource![indexPath.row - 1] = realTime self.tableView.reloadData() }else{ if self.isManual == true{ log.debug("手动修改开关 ---") NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil) NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil) delay(3, closure: { self.sendLoadSwitchCMD(isOn) }) } } } } let titleModel = titleArr![indexPath.row - 1] cell.titleModel = titleModel let dataModel = dataSource![indexPath.row - 1] cell.valueModel = dataModel return cell } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // reloadData() } } //处理数据 extension SBTRealTimeStatusVCtr{ func sendLoadSwitchCMD(_ switchOn : Bool) { var arr : [String] = [String]() if switchOn == true { arr = ["FF06010A0080"] // 1000 0000 }else{ arr = ["FF06010A0000"] } log.debug("设置负载开关 -- arr ---| ---\(arr)") BabyBluetoothSwift.shareInstance()?.writeData(arr.first, completionHandler: { (result) in log.debug("发送完成 --\(result)") NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStart), object: nil) }) } //注册通知、 获取数据 func notificationRegister() { NotificationCenter.default.addObserver(self, selector: #selector(SBTRealTimeStatusVCtr.uartDataReciveNotify(_:)), name: NSNotification.Name(rawValue: kBabyBluetoothNotificationUartDataRecieve), object: nil) //获取数据 NotificationCenter.default.addObserver(self, selector: #selector(SBTRealTimeStatusVCtr.updateChuange), name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil) } @objc func updateChuange(_ notif:Notification) { log.debug(notif.userInfo) let dataDict = notif.userInfo loadUIRefresh(dataDict as! [String : Any]) } //注销通知 func notificationUnRegister() { NotificationCenter.default.removeObserver(self) } //通知事件 @objc func uartDataReciveNotify(_ notify:Notification) { } func loadUIRefresh(_ dataDict : [String: Any] ) { DispatchQueue.main.async { self.dataSource?.removeAll() self.isSwitchHiddenArr?.removeAll() let key = DeviceDictKey() let solarVoltage = Float(dataDict[key.solarVoltage] as! String) let solarCurrent = Float(dataDict[key.solarCurrent] as! String) let solarPower = String(format: "%.0f", solarVoltage! * solarCurrent!) self.solarPowerValue = (dataDict[key.solarPower] as! String) let solarStatusStr = dataDict[key.solarStatus] as? String let value1 = RealTimeValue(itemValue: "\(dataDict[key.solarVoltage]!)V", itemValue2: "\(dataDict[key.solarCurrent]!)A" , itemValue3: "\(solarPower)W", status: solarStatusStr == "" ? "正常" : solarStatusStr, switchValue: "-") let batteryTemp1 = dataDict[key.batteryTemp]! var batterTempStr = "" let userDef = UserDefaults.standard let isCentigrade = userDef.value(forKey: TEMPISCENTIGRADE) as? String if isCentigrade != nil{ if isCentigrade == "1"{ batterTempStr = "\(batteryTemp1)℃" }else if isCentigrade == "0"{ let fahrenhit = (batteryTemp1 as! String).centigradeToFahrenheit() batterTempStr = "\(fahrenhit)℉" } }else{ batterTempStr = "\(batteryTemp1)℃" } let value2 = RealTimeValue(itemValue: "\(dataDict[key.batteryVoltage]!)V" , itemValue2: "\(dataDict[key.batteryCurrent]!)A", itemValue3: batterTempStr, status: dataDict[key.batteryStatus]as? String, switchValue: "-") let loadStatusStr = dataDict[key.loadStatus]as? String var loadSwitchValue = "1" if loadStatusStr == "Load_is_on".da_localizedStr() { loadSwitchValue = "1" }else{ loadSwitchValue = "0" } let value3 = RealTimeValue(itemValue: "\(dataDict[key.loadVoltage]!)V", itemValue2: "\(dataDict[key.loadCurrent]!)A", itemValue3: "\(dataDict[key.loadPower]!)W", status: dataDict[key.loadStatus]as? String, switchValue: loadSwitchValue) self.dataSource?.append(value1) self.dataSource?.append(value2) self.dataSource?.append(value3) // let allDataDict = AppShare.dataDict let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String //提升充电电压 E008 let batRateVolt = dataDict[key.BatRateVolt] as! String //系统电压 E003 let IchageRage = dataDict[key.IchageRage] as! String // 额定充电电流 E001 let a = Float(BatImprovChgVolt) //提升充电电压 let b = Float(batRateVolt) // 系统电压 let c = Float(IchageRage) // 额定充电电流 let solarPowerMaxFloat = a! * (b! / 12) * c! log.debug("表盘最大值 \(solarPowerMaxFloat)") let solarPowerFloat = Float(solarPower) var curentSolarPower = Float(0.0) if solarPowerFloat != 0.0 { curentSolarPower = solarPowerFloat! / solarPowerMaxFloat }else{ curentSolarPower = 0.0 } log.debug("当前功率-- \(curentSolarPower)") self.solarPower = CGFloat(curentSolarPower) // let LoadMode = allDataDict[key.DcLoadMode] as! String // if LoadMode == "手动模式"{ // self.isManual = true // } self.isSwitchHiddenArr = [true,true,false] //self.createUI() self.tableView.reloadData() } } // 刷新数据 刷新当前页 func initData() { titleArr = [ReatTimeName]() dataSource = [RealTimeValue]() let model1 = ReatTimeName(title: "Solar_panel".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Power".da_localizedStr()) let model2 = ReatTimeName(title: "Battery".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Temperature".da_localizedStr()) let model3 = ReatTimeName(title: "Load".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Power".da_localizedStr()) titleArr?.append(model1) titleArr?.append(model2) titleArr?.append(model3) if self.isDemo == true { let data = SBTData() getData(data.DemoData) }else{ let plist = CLDeviceDataPlist() let dataDict = plist.findData(deviceDetailPlist, key: self.bleKey!) getData(dataDict as! [String : Any]) } } //ff 10 00 49 00 10 20 31 32 333435 36373839 30 00 00 00 00 00 00 59 d5 func getData(_ dataDict:[String:Any]) { isSwitchHiddenArr?.removeAll() dataSource?.removeAll() let key = DeviceDictKey() let solarVoltage = Float(dataDict[key.solarVoltage] as! String) let solarCurrent = Float(dataDict[key.solarCurrent] as! String) let solarPower = String(format: "%.0f", solarVoltage! * solarCurrent!) self.solarPowerValue = (dataDict[key.solarPower] as! String) let solarStatusStr = dataDict[key.solarStatus] as? String let value1 = RealTimeValue(itemValue: "\(dataDict[key.solarVoltage]!)V", itemValue2: "\(dataDict[key.solarCurrent]!)A" , itemValue3: "\(solarPower)W", status: solarStatusStr == "" ? "Normal".da_localizedStr() : solarStatusStr, switchValue: "-") let batteryTemp1 = dataDict[key.batteryTemp]! var batterTempStr = "" let userDef = UserDefaults.standard let isCentigrade = userDef.value(forKey: TEMPISCENTIGRADE) as? String if isCentigrade != nil{ if isCentigrade == "1"{ batterTempStr = "\(batteryTemp1)℃" }else if isCentigrade == "0"{ let fahrenhit = (batteryTemp1 as! String).centigradeToFahrenheit() batterTempStr = "\(fahrenhit)℉" } }else{ batterTempStr = "\(batteryTemp1)℃" } let value2 = RealTimeValue(itemValue: "\(dataDict[key.batteryVoltage]!)V" , itemValue2: "\(dataDict[key.batteryCurrent]!)A", itemValue3: batterTempStr, status: dataDict[key.batteryStatus]as? String, switchValue: "-") let loadStatusStr = dataDict[key.loadStatus]as? String var loadSwitchValue = "1" if loadStatusStr == "Load_is_on".da_localizedStr() { loadSwitchValue = "1" }else{ loadSwitchValue = "0" } var value3 = RealTimeValue(itemValue: "\(dataDict[key.loadVoltage]!)V", itemValue2: "\(dataDict[key.loadCurrent]!)A", itemValue3: "\(dataDict[key.loadPower]!)W", status: dataDict[key.loadStatus]as? String, switchValue: loadSwitchValue) if self.isDemo == true{ value3 = RealTimeValue(itemValue: "\(dataDict[key.loadVoltage]!)V", itemValue2: "\(dataDict[key.loadCurrent]!)A", itemValue3: "\(dataDict[key.loadPower]!)W", status: dataDict[key.loadStatus]as? String, switchValue: "1") } dataSource?.append(value1) dataSource?.append(value2) dataSource?.append(value3) if self.isDemo == false { let allDataDict = AppShare.dataDict let BatImprovChgVolt = allDataDict[key.BatImprovChgVolt] as! String //提升充电电压 let IchageRage = allDataDict[key.IchageRage] as! String // 额定充电电流 let batRateVolt = allDataDict[key.BatRateVolt] as! String //系统电压 let a = Float(BatImprovChgVolt) let b = Float(batRateVolt) let c = Float(IchageRage) let solarPowerMaxFloat = a! * (b! / 12) * c! log.debug("表盘最大值 \(solarPowerMaxFloat)") let solarPowerFloat = Float(solarPower) var curentSolarPower = Float(0.0) if solarPowerFloat != 0.0 { curentSolarPower = solarPowerFloat! / solarPowerMaxFloat }else{ curentSolarPower = 0.0 } log.debug("当前功率-- \(curentSolarPower)") self.solarPower = CGFloat(curentSolarPower) let LoadMode = allDataDict[key.DcLoadMode] as! String // if LoadMode == "手动模式"{ self.isManual = true // } }else{ let demoeData = SBTData().DemoData let BatImprovChgVolt = demoeData[key.BatImprovChgVolt] as! String //提升充电电压 let IchageRage = demoeData[key.IchageRage] as! String // 额定充电电流 let batRateVolt = demoeData[key.BatRateVolt] as! String //系统电压 let a = Float(BatImprovChgVolt) let b = Float(batRateVolt) let c = Float(IchageRage) let solarPowerMaxFloat = a! * (b! / 12) * c! log.debug("表盘最大值 \(solarPowerMaxFloat)") let solarPowerFloat = Float(solarPower) var curentSolarPower = Float(0.0) if solarPowerFloat != 0.0 { curentSolarPower = solarPowerFloat! / solarPowerMaxFloat }else{ curentSolarPower = 0.0 } log.debug("当前功率-- \(curentSolarPower)") self.solarPower = CGFloat(curentSolarPower) let LoadMode = demoeData[key.DcLoadMode] as! String // if LoadMode == "手动模式"{ self.isManual = true // } } isSwitchHiddenArr = [true,true,false] } }