SBTRealTimeStatusVCtr.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. //
  2. // SBTRealTimeStatusVCtr.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/1/28.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import PKHUD
  10. struct ReatTimeName {
  11. var title:String?
  12. var itemName1:String?
  13. var itemName2:String?
  14. var itemName3:String?
  15. }
  16. struct RealTimeValue {
  17. var itemValue:String?
  18. var itemValue2:String?
  19. var itemValue3:String?
  20. var status:String?
  21. var switchValue:String?
  22. }
  23. class SBTRealTimeStatusVCtr: UIViewController {
  24. var preVC : SBTDeviceDetaiVCtr?
  25. var isWrite : Bool? = true// 是否读取自动
  26. var isOld :Bool?
  27. var deviceName:String? // 设备名称
  28. var bleKey:String?
  29. var isSwitchHiddenArr :[Bool]? = [true,true,false]
  30. var isDemo:Bool? = false
  31. var titleArr : [ReatTimeName]?
  32. var dataSource : [RealTimeValue]?
  33. var solarPower : CGFloat?
  34. var solarPowerValue :String? = "0"
  35. var uartCommandTimer : Timer? // 定时器
  36. var isManual:Bool? = false // 是否手动模式
  37. @IBOutlet weak var tableView: UITableView!
  38. override func viewDidLoad() {
  39. super.viewDidLoad()
  40. // Do any additional setup after loading the view.
  41. initData()
  42. createUI()
  43. }
  44. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  45. }
  46. override func viewWillAppear(_ animated: Bool) {
  47. super.viewWillAppear(animated)
  48. if self.isDemo == false {
  49. notificationRegister()
  50. Thread.sleep(forTimeInterval: 0.1)
  51. }
  52. }
  53. override func viewDidAppear(_ animated: Bool) {
  54. super.viewDidAppear(animated)
  55. }
  56. override func viewWillDisappear(_ animated: Bool) {
  57. super.viewWillDisappear(animated)
  58. if self.isDemo == false {
  59. notificationUnRegister()
  60. }
  61. }
  62. }
  63. extension SBTRealTimeStatusVCtr{
  64. func createUI() {
  65. self.tableView.delegate = self
  66. self.tableView.dataSource = self
  67. self.tableView.separatorStyle = .none
  68. self.tableView.register(UINib(nibName: "SBTRTStatusCell", bundle: nil), forCellReuseIdentifier: "SBTRTStatusCell")
  69. self.tableView.register(UINib(nibName: "SBTDashboardCell", bundle: nil), forCellReuseIdentifier: "SBTDashboardCell")
  70. }
  71. }
  72. extension SBTRealTimeStatusVCtr:UITableViewDelegate,UITableViewDataSource{
  73. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  74. return 4
  75. }
  76. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  77. if indexPath.row == 0 {
  78. return 205
  79. }else{
  80. return 119
  81. }
  82. }
  83. //缓存高度 这个 跟定时器一起使用
  84. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  85. if indexPath.row == 0 {
  86. return 205
  87. }else{
  88. return 119
  89. }
  90. }
  91. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  92. if indexPath.row == 0 {
  93. let cell = tableView.dequeueReusableCell(withIdentifier: "SBTDashboardCell") as! SBTDashboardCell
  94. cell.solarPower = self.solarPower
  95. cell.solarPowerValue = self.solarPowerValue
  96. cell.selectionStyle = .none
  97. return cell
  98. }else{
  99. let cell = tableView.dequeueReusableCell(withIdentifier: "SBTRTStatusCell") as! SBTRTStatusCell
  100. cell.selectionStyle = .none
  101. cell.isSwitchHidden = isSwitchHiddenArr![indexPath.row - 1]
  102. var isHandle = false
  103. if indexPath.row == 3{
  104. cell.isDemo = self.isDemo
  105. cell.switchCallback = {(isOn) in
  106. log.debug("开关状态 - \(isOn)")
  107. cell.isSwitchEnabled = self.isManual!
  108. //判断 发送 读取
  109. if self.isDemo == true{
  110. var realTime = RealTimeValue(itemValue: "14.1V", itemValue2: "8.06A", itemValue3: "114W", status: "Load_is_on".da_localizedStr(), switchValue:"0")
  111. if isOn == true{
  112. realTime = RealTimeValue(itemValue: "14.1V", itemValue2: "8.06A", itemValue3: "114W", status: "Load_is_on".da_localizedStr(), switchValue:"1")
  113. }else{
  114. realTime = RealTimeValue(itemValue: "0.0V", itemValue2: "0.00A", itemValue3: "0W", status: "Load_is_off".da_localizedStr(), switchValue:"0")
  115. }
  116. self.dataSource![indexPath.row - 1] = realTime
  117. self.tableView.reloadData()
  118. }else{
  119. if self.isManual == true{
  120. log.debug("手动修改开关 ---")
  121. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil)
  122. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil)
  123. delay(3, closure: {
  124. self.sendLoadSwitchCMD(isOn)
  125. })
  126. }
  127. }
  128. }
  129. }
  130. let titleModel = titleArr![indexPath.row - 1]
  131. cell.titleModel = titleModel
  132. let dataModel = dataSource![indexPath.row - 1]
  133. cell.valueModel = dataModel
  134. return cell
  135. }
  136. }
  137. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  138. // reloadData()
  139. }
  140. }
  141. //处理数据
  142. extension SBTRealTimeStatusVCtr{
  143. func sendLoadSwitchCMD(_ switchOn : Bool) {
  144. var arr : [String] = [String]()
  145. if switchOn == true {
  146. arr = ["FF06010A0080"] // 1000 0000
  147. }else{
  148. arr = ["FF06010A0000"]
  149. }
  150. log.debug("设置负载开关 -- arr ---| ---\(arr)")
  151. BabyBluetoothSwift.shareInstance()?.writeData(arr.first, completionHandler: { (result) in
  152. log.debug("发送完成 --\(result)")
  153. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStart), object: nil)
  154. })
  155. }
  156. //注册通知、 获取数据
  157. func notificationRegister() {
  158. NotificationCenter.default.addObserver(self, selector: #selector(SBTRealTimeStatusVCtr.uartDataReciveNotify(_:)), name: NSNotification.Name(rawValue: kBabyBluetoothNotificationUartDataRecieve), object: nil)
  159. //获取数据
  160. NotificationCenter.default.addObserver(self, selector: #selector(SBTRealTimeStatusVCtr.updateChuange), name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataRealDataRecieve), object: nil)
  161. }
  162. @objc func updateChuange(_ notif:Notification) {
  163. log.debug(notif.userInfo)
  164. let dataDict = notif.userInfo
  165. loadUIRefresh(dataDict as! [String : Any])
  166. }
  167. //注销通知
  168. func notificationUnRegister() {
  169. NotificationCenter.default.removeObserver(self)
  170. }
  171. //通知事件
  172. @objc func uartDataReciveNotify(_ notify:Notification) {
  173. }
  174. func loadUIRefresh(_ dataDict : [String: Any] ) {
  175. DispatchQueue.main.async {
  176. self.dataSource?.removeAll()
  177. self.isSwitchHiddenArr?.removeAll()
  178. let key = DeviceDictKey()
  179. let solarVoltage = Float(dataDict[key.solarVoltage] as! String)
  180. let solarCurrent = Float(dataDict[key.solarCurrent] as! String)
  181. let solarPower = String(format: "%.0f", solarVoltage! * solarCurrent!)
  182. self.solarPowerValue = (dataDict[key.solarPower] as! String)
  183. let solarStatusStr = dataDict[key.solarStatus] as? String
  184. let value1 = RealTimeValue(itemValue: "\(dataDict[key.solarVoltage]!)V", itemValue2: "\(dataDict[key.solarCurrent]!)A" , itemValue3: "\(solarPower)W", status: solarStatusStr == "" ? "正常" : solarStatusStr, switchValue: "-")
  185. let batteryTemp1 = dataDict[key.batteryTemp]!
  186. var batterTempStr = ""
  187. let userDef = UserDefaults.standard
  188. let isCentigrade = userDef.value(forKey: TEMPISCENTIGRADE) as? String
  189. if isCentigrade != nil{
  190. if isCentigrade == "1"{
  191. batterTempStr = "\(batteryTemp1)℃"
  192. }else if isCentigrade == "0"{
  193. let fahrenhit = (batteryTemp1 as! String).centigradeToFahrenheit()
  194. batterTempStr = "\(fahrenhit)℉"
  195. }
  196. }else{
  197. batterTempStr = "\(batteryTemp1)℃"
  198. }
  199. let value2 = RealTimeValue(itemValue: "\(dataDict[key.batteryVoltage]!)V" , itemValue2: "\(dataDict[key.batteryCurrent]!)A", itemValue3: batterTempStr, status: dataDict[key.batteryStatus]as? String, switchValue: "-")
  200. let loadStatusStr = dataDict[key.loadStatus]as? String
  201. var loadSwitchValue = "1"
  202. if loadStatusStr == "Load_is_on".da_localizedStr() {
  203. loadSwitchValue = "1"
  204. }else{
  205. loadSwitchValue = "0"
  206. }
  207. 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)
  208. self.dataSource?.append(value1)
  209. self.dataSource?.append(value2)
  210. self.dataSource?.append(value3)
  211. // let allDataDict = AppShare.dataDict
  212. let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String //提升充电电压 E008
  213. let batRateVolt = dataDict[key.BatRateVolt] as! String //系统电压 E003
  214. let IchageRage = dataDict[key.IchageRage] as! String // 额定充电电流 E001
  215. let a = Float(BatImprovChgVolt) //提升充电电压
  216. let b = Float(batRateVolt) // 系统电压
  217. let c = Float(IchageRage) // 额定充电电流
  218. let solarPowerMaxFloat = a! * (b! / 12) * c!
  219. log.debug("表盘最大值 \(solarPowerMaxFloat)")
  220. let solarPowerFloat = Float(solarPower)
  221. var curentSolarPower = Float(0.0)
  222. if solarPowerFloat != 0.0 {
  223. curentSolarPower = solarPowerFloat! / solarPowerMaxFloat
  224. }else{
  225. curentSolarPower = 0.0
  226. }
  227. log.debug("当前功率-- \(curentSolarPower)")
  228. self.solarPower = CGFloat(curentSolarPower)
  229. // let LoadMode = allDataDict[key.DcLoadMode] as! String
  230. // if LoadMode == "手动模式"{
  231. // self.isManual = true
  232. // }
  233. self.isSwitchHiddenArr = [true,true,false]
  234. //self.createUI()
  235. self.tableView.reloadData()
  236. }
  237. }
  238. // 刷新数据 刷新当前页
  239. func initData() {
  240. titleArr = [ReatTimeName]()
  241. dataSource = [RealTimeValue]()
  242. let model1 = ReatTimeName(title: "Solar_panel".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Power".da_localizedStr())
  243. let model2 = ReatTimeName(title: "Battery".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Temperature".da_localizedStr())
  244. let model3 = ReatTimeName(title: "Load".da_localizedStr(), itemName1: "Voltage".da_localizedStr(), itemName2: "Current".da_localizedStr(), itemName3: "Power".da_localizedStr())
  245. titleArr?.append(model1)
  246. titleArr?.append(model2)
  247. titleArr?.append(model3)
  248. if self.isDemo == true {
  249. let data = SBTData()
  250. getData(data.DemoData)
  251. }else{
  252. let plist = CLDeviceDataPlist()
  253. let dataDict = plist.findData(deviceDetailPlist, key: self.bleKey!)
  254. getData(dataDict as! [String : Any])
  255. }
  256. }
  257. //ff 10 00 49 00 10 20 31 32 333435 36373839 30 00 00 00 00 00 00 59 d5
  258. func getData(_ dataDict:[String:Any]) {
  259. isSwitchHiddenArr?.removeAll()
  260. dataSource?.removeAll()
  261. let key = DeviceDictKey()
  262. let solarVoltage = Float(dataDict[key.solarVoltage] as! String)
  263. let solarCurrent = Float(dataDict[key.solarCurrent] as! String)
  264. let solarPower = String(format: "%.0f", solarVoltage! * solarCurrent!)
  265. self.solarPowerValue = (dataDict[key.solarPower] as! String)
  266. let solarStatusStr = dataDict[key.solarStatus] as? String
  267. let value1 = RealTimeValue(itemValue: "\(dataDict[key.solarVoltage]!)V", itemValue2: "\(dataDict[key.solarCurrent]!)A" , itemValue3: "\(solarPower)W", status: solarStatusStr == "" ? "Normal".da_localizedStr() : solarStatusStr, switchValue: "-")
  268. let batteryTemp1 = dataDict[key.batteryTemp]!
  269. var batterTempStr = ""
  270. let userDef = UserDefaults.standard
  271. let isCentigrade = userDef.value(forKey: TEMPISCENTIGRADE) as? String
  272. if isCentigrade != nil{
  273. if isCentigrade == "1"{
  274. batterTempStr = "\(batteryTemp1)℃"
  275. }else if isCentigrade == "0"{
  276. let fahrenhit = (batteryTemp1 as! String).centigradeToFahrenheit()
  277. batterTempStr = "\(fahrenhit)℉"
  278. }
  279. }else{
  280. batterTempStr = "\(batteryTemp1)℃"
  281. }
  282. let value2 = RealTimeValue(itemValue: "\(dataDict[key.batteryVoltage]!)V" , itemValue2: "\(dataDict[key.batteryCurrent]!)A", itemValue3: batterTempStr, status: dataDict[key.batteryStatus]as? String, switchValue: "-")
  283. let loadStatusStr = dataDict[key.loadStatus]as? String
  284. var loadSwitchValue = "1"
  285. if loadStatusStr == "Load_is_on".da_localizedStr() {
  286. loadSwitchValue = "1"
  287. }else{
  288. loadSwitchValue = "0"
  289. }
  290. 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)
  291. if self.isDemo == true{
  292. 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")
  293. }
  294. dataSource?.append(value1)
  295. dataSource?.append(value2)
  296. dataSource?.append(value3)
  297. if self.isDemo == false {
  298. let allDataDict = AppShare.dataDict
  299. let BatImprovChgVolt = allDataDict[key.BatImprovChgVolt] as! String //提升充电电压
  300. let IchageRage = allDataDict[key.IchageRage] as! String // 额定充电电流
  301. let batRateVolt = allDataDict[key.BatRateVolt] as! String //系统电压
  302. let a = Float(BatImprovChgVolt)
  303. let b = Float(batRateVolt)
  304. let c = Float(IchageRage)
  305. let solarPowerMaxFloat = a! * (b! / 12) * c!
  306. log.debug("表盘最大值 \(solarPowerMaxFloat)")
  307. let solarPowerFloat = Float(solarPower)
  308. var curentSolarPower = Float(0.0)
  309. if solarPowerFloat != 0.0 {
  310. curentSolarPower = solarPowerFloat! / solarPowerMaxFloat
  311. }else{
  312. curentSolarPower = 0.0
  313. }
  314. log.debug("当前功率-- \(curentSolarPower)")
  315. self.solarPower = CGFloat(curentSolarPower)
  316. let LoadMode = allDataDict[key.DcLoadMode] as! String
  317. // if LoadMode == "手动模式"{
  318. self.isManual = true
  319. // }
  320. }else{
  321. let demoeData = SBTData().DemoData
  322. let BatImprovChgVolt = demoeData[key.BatImprovChgVolt] as! String //提升充电电压
  323. let IchageRage = demoeData[key.IchageRage] as! String // 额定充电电流
  324. let batRateVolt = demoeData[key.BatRateVolt] as! String //系统电压
  325. let a = Float(BatImprovChgVolt)
  326. let b = Float(batRateVolt)
  327. let c = Float(IchageRage)
  328. let solarPowerMaxFloat = a! * (b! / 12) * c!
  329. log.debug("表盘最大值 \(solarPowerMaxFloat)")
  330. let solarPowerFloat = Float(solarPower)
  331. var curentSolarPower = Float(0.0)
  332. if solarPowerFloat != 0.0 {
  333. curentSolarPower = solarPowerFloat! / solarPowerMaxFloat
  334. }else{
  335. curentSolarPower = 0.0
  336. }
  337. log.debug("当前功率-- \(curentSolarPower)")
  338. self.solarPower = CGFloat(curentSolarPower)
  339. let LoadMode = demoeData[key.DcLoadMode] as! String
  340. // if LoadMode == "手动模式"{
  341. self.isManual = true
  342. // }
  343. }
  344. isSwitchHiddenArr = [true,true,false]
  345. }
  346. }