1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027 |
- //
- // DetailBLEWorkUtil.swift
- // SolarBT
- //
- // Created by weclouds on 2019/11/4.
- // Copyright © 2019 weclouds. All rights reserved.
- //
- import UIKit
- struct Pool {
-
- var count : Int
- var container : [String:String]
-
- init() {
- self.container = [String:String]()
- self.count = 0
- }
- //判断是否为空
- func isEmpty() -> Bool {
- return container.keys.count == 0
- }
-
- //判断池子是否已经满了 达到一定的数量就满了
- func size() -> Int {
- return container.keys.count
- }
-
- //清空池子
- mutating func clear() {
- container.removeAll()
- }
- //往池子里添加元素
- mutating func add(_ key :String,_ value : String) {
- container[key] = value
- count += 1
- }
-
- }
- class PoolWork : NSObject {
- /*
- 输入 :读取回来一次数据 Pool1
- 输出 :输出pool2的数据
- */
- var pool1 : Pool!
- var pool2 : Pool!
- var maxSize : Int //最大长度
-
- override init() {
- pool1 = Pool()
- pool2 = Pool()
- maxSize = 0
- }
-
- func run() {
- pool2.clear()
- //记录pool1 的数量
- maxSize = pool1.count
- pool2 = pool1
- }
-
- func getData() -> Pool {
- //断言
- assert(pool2.count < maxSize, "数据不足 ,无法提供数据")
- return pool2
- }
-
- /*1 Start
- 2 Pause
-
-
- */
-
-
- }
- class DetailBLEWorkUtil: NSObject {
- var pool1 : Pool!
- var pool2 : Pool!
- var isOld : Bool? = false
- var cumulativeDict : [String: Any] = [String: Any]()
- var deviceDetailData: [String: Any] = [String: Any]()
- var dataDict : [String: Any] = [String: Any]()
- var paramDataDict : [String: Any] = [String: Any]()
- var realDataDict : [String:Any] = [String:Any]()
- var cumulativeDataDict : [String :Any] = [String: Any]() /// 累计数据
- let key: DeviceDictKey = DeviceDictKey()
- var historyDataArr: [[String: String]] = [[String: String]]()
-
- static var share : DetailBLEWorkUtil = {
- let tool = DetailBLEWorkUtil()
- return tool
- }()
-
- override init() {
- pool1 = Pool()
- pool2 = Pool()
- }
-
- func sendRealStatusCMD() {//0.850956+0800 0.513711+0800
-
-
- if self.isOld == true {
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF030100000A","FF0301200003"]
-
- BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr, type: "RealStatus", completionHandler: { (result) in
-
-
- log.debug("返回数据 --- \(ReceiveData)")
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- self.realdata_0100(result!["FF030100000A"] as! String)
- self.realdata_0120(result!["FF0301200003"] as! String)
- })
- }else{
- let arr = ["FF03000A0001","FF03E0030001","FF03E0080001","FF0300FD000D"]
- BabyBluetoothSwift.shareInstance()?.loopWriteDataWite(arr,type: "RealStatus", completionHandler: { (result) in
- log.debug("返回数据 --- \(result)")
- self.realdata_000A(result!["FF03000A0001"] as! String)
- self.realdata_00FD(result!["FF0300FD000D"] as! String)
- self.realdata_E003(result!["FF03E0030001"] as! String)
- self.realdata_E008(result!["FF03E0080001"] as!String)
- })
- }
- }
-
- }
- extension DetailBLEWorkUtil{
-
- //实时数据
- func realdata_000A(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- //系统支持的最高电压
- let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
- log.debug("额定充电电流: \(num00!)")
- realDataDict[key.MaxVolt] = "\(num00!)"
- pool1.add(key.MaxVolt, "\(num00!)")
- deviceDetailData[key.MaxVolt] = "\(num00!)"
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
- log.debug("额定充电电流: \(num0!)")
- // dataDict[key.IchageRage] = "\(num0!)"
- realDataDict[key.IchageRage] = "\(num0!)"
- pool1.add(key.IchageRage, "\(num0!)")
- deviceDetailData[key.IchageRage] = "\(num0!)"
-
- }
-
-
- func realdata_E003(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //e003
-
- // FF
- let FF = str0.subString(start: 7 , length: 2)
- if FF == "FF"{
- // dataDict[key.autoRecognition] = "1"
- realDataDict[key.autoRecognition] = "1"
- pool1.add(key.autoRecognition, "1")
- deviceDetailData[key.autoRecognition] = "1"
- }else{
- // dataDict[key.autoRecognition] = "0"
- realDataDict[key.autoRecognition] = "0"
- pool1.add(key.autoRecognition, "0")
- deviceDetailData[key.autoRecognition] = "0"
- }
- // 判断是否自动识别
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2))
- log.debug("系统电压设置 - \(num0!)")
- deviceDetailData[key.BatRateVolt] = "\(num0!)"
- realDataDict[key.BatRateVolt] = "\(num0!)"
- pool1.add(key.BatRateVolt, "\(num0!)")
- }
-
-
- func realdata_E008(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //e003
- //e008
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
- log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)")
- deviceDetailData[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
- realDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
- }
-
-
-
- //读取名称
- func readdata_0049(_ reciveData : String){
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- var productNameDict : [String:String] = [String:String]()
-
- if self.isOld == true {
- productNameDict[key.productName] = ""
- deviceDetailData[key.productName] = ""
- }else{
- var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
- log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))")
- num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("设备名称 \(num5)")
- //f16d33 575578 e565b 065fd8 0906ed179
- if num5 == nil || num5 == "" {
- let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
- productNameDict[key.productName] = ChineseString
- deviceDetailData[key.productName] = ChineseString
- log.debug("设备中文名称 \(ChineseString!)")
- }else{
- productNameDict[key.productName] = num5
- deviceDetailData[key.productName] = num5
- }
- }
-
- }
-
- func real_000B000F(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- //1400
- //额定放电电流
- let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
- log.debug("额定放电电流:\(num00!)")
- deviceDetailData[key.idischagRate] = "\(num00!)"
- //产品类型
- let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("产品类型:\(num0)")
- var device_type = ""
- switch num0?.intValue {
- case 0:
- device_type = "Controller_household".da_localizedStr()
- case 1:
- device_type = "Controller_street_light".da_localizedStr()
- case 3:
- device_type = "Inverter".da_localizedStr()
- case 4:
- device_type = "All-in-one_inverter".da_localizedStr()
-
- default:
- break
- }
-
- deviceDetailData[key.device_type] = device_type
- var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
- num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("产品型号\(num1)")
- deviceDetailData[key.product_type] = num1!
- //软件版本
- // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
- let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
- let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
- let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
- let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
- log.debug("软件版本 : V \(b!).\(c!).\(d!)")
- deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
- //硬件版本
- let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
- let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
- let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
- let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
- log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
- // 序列号
- deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
- // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
- let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
- let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
- let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
-
- log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
- deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
-
- }
-
-
- func realdata_000B(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //1400
- //额定放电电流
- let num00 = UUUtils.numberHexString(str0.subString(start: 7, length: 2))
- log.debug("额定放电电流:\(num00!)")
- deviceDetailData[key.idischagRate] = "\(num00!)"
- //产品类型
- let num0 = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("产品类型:\(num0)")
- var device_type = ""
- switch num0?.intValue {
- case 0:
- device_type = "Controller_household".da_localizedStr()
- case 1:
- device_type = "Controller_street_light".da_localizedStr()
- case 3:
- device_type = "Inverter".da_localizedStr()
- case 4:
- device_type = "All-in-one_inverter".da_localizedStr()
-
- default:
- break
- }
-
- deviceDetailData[key.device_type] = device_type
- var num1 = UUUtils.string(fromHexString: str0.subString(start: 11, length: 32))
- num1 = num1?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("产品型号\(num1)")
- deviceDetailData[key.product_type] = num1!
- //软件版本
- // let num2 = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 8))
- let a = UUUtils.numberHexString(str0.subString(start: 11 + 32, length: 2))
- let b = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2, length: 2))
- let c = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2, length: 2))
- let d = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 2 + 2 + 2, length: 2))
- log.debug("软件版本 : V \(b!).\(c!).\(d!)")
- deviceDetailData[key.softWareCersion] = "V\(b!).\(c!).\(d!)"
- //硬件版本
- let m1 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8, length: 2))
- let m2 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2, length: 2))
- let m3 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2, length: 2))
- let m4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 2 + 2 + 2, length: 2))
- log.debug("硬件版本 : V\(m2!).\(m3!).\(m4!)")
- // 序列号
- deviceDetailData[key.hardWareCersion] = "V \(m2!).\(m3!).\(m4!)"
- // let num4 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 8))
- let num41 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 , length: 2))
- let num42 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 2 , length: 2))
- let num43 = UUUtils.numberHexString(str0.subString(start: 11 + 32 + 8 + 8 + 4 , length: 4)) //补足5位
-
- log.debug("\( String(format: "%05d", num43!.intValue))") // 年月(低十六位)
-
- deviceDetailData[key.productSN] = "\(num41!)\(num42!)\( String(format: "%05d", num43!.intValue))"
- // var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 32)) // 最大32字节 12568哦哦哦泈色系儿子儿媳妇
-
- var num5 = UUUtils.string(fromHexString: str0.subString(start: 255 , length: 64))
- log.debug("要解析的十六进制 \( str0.subString(start: 255 , length: 64))")
- num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
- log.debug("设备名称 \(num5)")
- //f16d33 575578 e565b 065fd8 0906ed179
- if num5 == nil || num5 == "" {
- let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 255 , length: 64))
- // ff ff
- deviceDetailData[key.productName] = ChineseString
- log.debug("设备中文名称 \(ChineseString!)")
- }else{
- deviceDetailData[key.productName] = num5
- }
-
- let year = UUUtils.numberHexString(str0.subString(start: 75, length: 2))
- let mouth = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
- let day = UUUtils.numberHexString(str0.subString(start: 75 + 2, length: 2))
- log.debug("生产日期 : \(year!)-\(mouth!)-\(day!)")
- }
- //温度处理
- func temp(with num:NSNumber)-> String{
- let numInt = num.intValue
- // let q1 = UUUtils.numberHexString(q)?.intValue
-
- let q2 = numInt & 128
- print("判断正负\(q2)")
- if q2 != 128 {
- log.debug("温度\(num.floatValue )")
- return "\(num.intValue )"
-
- }else{
-
- log.debug("温度: -\(numInt & 127 )")
- return "-\(numInt & 127 )"
- }
- }
- //1s刷新一次
-
- //实时数据
- func realdata_00FD(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
- let num0A_1 = num0A?.subString(start: 0, length: 16)
- let num0A_2 = num0A?.subString(start: 16, length: 16)
- let num0A_II = num0A_2! + num0A_1!
- num0A = num0A_II
- log.debug("太阳能板状态\(num0A!)")
- var solarStatusStr = ""
- let B30 = num0A?.subString(start: 1, length: 1)
- let B29 = num0A?.subString(start: 2, length: 1)
- let B28 = num0A?.subString(start: 3, length: 1)
- let B27 = num0A?.subString(start: 4, length: 1)
- let B26 = num0A?.subString(start: 5, length: 1)
- let B25 = num0A?.subString(start: 6, length: 1)
- let B24 = num0A?.subString(start: 7, length: 1)
- let B23 = num0A?.subString(start: 8, length: 1)
-
- //负载
- let B20 = num0A?.subString(start: 11, length: 1)
- let B19 = num0A?.subString(start: 12, length: 1)
- let B15 = num0A?.subString(start: 16, length: 1)
- //系统
- let B21 = num0A?.subString(start: 10, length: 1)
- let B14 = num0A?.subString(start: 17, length: 1)
- let B13 = num0A?.subString(start: 18, length: 1)
-
- //蓄电池状态
- let B22 = num0A?.subString(start: 9, length: 1)
- let B18 = num0A?.subString(start: 13, length: 1)
- let B17 = num0A?.subString(start: 14, length: 1)
- let B16 = num0A?.subString(start: 15, length: 1)
- let B12 = num0A?.subString(start: 19, length: 1)
- let B11 = num0A?.subString(start: 20, length: 1)
- let B10 = num0A?.subString(start: 21, length: 1)
-
- var batteryStatusStr = ""
- if B10 == "1" {
- batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
- }
- if B11 == "1" {
- batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
- }
- if B12 == "1" {
- batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
- }
- if B16 == "1" {
- batteryStatusStr = "Battery_over_discharge".da_localizedStr()
- }
- if B17 == "1" {
- batteryStatusStr = "Battery_overvoltage".da_localizedStr()
- }
- if B18 == "1" {
- batteryStatusStr = "Undervoltage_warning".da_localizedStr()
- }
- if B22 == "1" {
- batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
- }
-
- if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
- batteryStatusStr = "Normal".da_localizedStr()
- }
- deviceDetailData[key.batteryStatus] = batteryStatusStr
- realDataDict[key.batteryStatus] = batteryStatusStr
- //太阳能状态
- if B23 == "1" {
- solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
- }
- if B24 == "1" {
- solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
- }
- if B25 == "1" {
- solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
- }
- if B26 == "1" {
- solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
- }
- if B27 == "1" {
- solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
- }
- if B28 == "1" {
- solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
- }
- deviceDetailData[key.solarStatus] = solarStatusStr
- realDataDict[key.solarStatus] = solarStatusStr
- let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
- log.debug("00FD \(num0!)")
- let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("low_8_bit - \(low_8_bit)")
- //1000000000000000
-
- var changeStatus = ""
- if low_8_bit == 0 {
- changeStatus = "Charging_is_not_turned_on".da_localizedStr()
- }else if low_8_bit == 1 {
- changeStatus = "Start_charging_mode".da_localizedStr()
- }else if low_8_bit == 2 {
- changeStatus = "MPPT_charge_mode".da_localizedStr()
- }else if low_8_bit == 3 {
- changeStatus = "Equalizing_charge_mode".da_localizedStr()
- }else if low_8_bit == 4 {
- changeStatus = "Floating_charge_mode".da_localizedStr()
- }else if low_8_bit == 5 {
- changeStatus = "Boost_charge_mode".da_localizedStr()
- }else if low_8_bit == 6 {
- changeStatus = "Current_limiting_(super_power)".da_localizedStr()
- }else if low_8_bit == 7 {
- changeStatus = "Fully_charged".da_localizedStr()
- }
- if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- dataDict[key.solarStatus] = changeStatus
- realDataDict[key.solarStatus] = changeStatus
- }
- //0000 0000 0000 0000 从后往前数
- let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
- var loadStatusStr = ""
- if B15 == "1" {
- loadStatusStr = "Open_load".da_localizedStr()
- }
- if B19 == "1" {
- loadStatusStr = "Load_short_circuit".da_localizedStr()
- }
- if B20 == "1" {
- loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
- }
-
- if B15 == "0" && B19 == "0" && B20 == "0" {
- if loadStatus == "0" {
- loadStatusStr = "Load_is_off".da_localizedStr()
- }else if loadStatus == "1" {
- loadStatusStr = "Load_is_on".da_localizedStr()
- }
- }
-
- log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
- deviceDetailData[key.loadStatus] = loadStatusStr
- realDataDict[key.loadStatus] = loadStatusStr
-
- //太阳能电压 0107
- let num1 = UUUtils.numberHexString(str0.subString(start: 47, length: 4))
- print("太阳能电压 \(num1!.floatValue * 0.1)" )
- let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
- deviceDetailData[key.solarVoltage] = "\(solarV)"
- realDataDict[key.solarVoltage] = "\(solarV)"
- // 太阳能电流 0108
- let num2 = UUUtils.numberHexString(str0.subString(start: 47 + 4, length: 4))
- print("太阳能电流 \(num2!.floatValue * 0.01)")
- deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- // 太阳能功率 0109
- let num2_1 = UUUtils.numberHexString(str0.subString(start: 47 + 4 + 4, length: 4))
- print("太阳能功率 \(num2_1!)")
- deviceDetailData[key.solarPower] = "\(num2_1!)"
- realDataDict[key.solarPower] = "\(num2_1!)"
- //蓄电池 电压
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- print("蓄电池电压 \(num3!.floatValue * 0.1)")
- deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
- print("蓄电池电流\(num4!.floatValue * 0.01)")
- deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6 + 2 , length: 2))
- print("温度 \(temp(with: num5!))")
- deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
- realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
- //负载
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
- print("负载电压\(num6!.floatValue * 0.1)")
- deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- print("负载电流\(num7!.floatValue * 0.01)")
- deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- print("功率 \(num8! )")
- realDataDict[key.loadPower] = "\(num8!)"
-
- deviceDetailData[key.loadPower] = "\(num8!)"
-
- }
- //FF030115000B
- //ff031400000000000000000000000000 0000 0000 0000 0064 0b《》
- //13 * 4
- //处理历史数据
- func hisData(_ reciveData:String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- if str0.count != 13 * 4 {
- return
- }
- var F000Dict = [String: String]()
- //蓄电池当天最低电压
- let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
- log.debug("蓄电池当天最低电压: \( String(format: "%.1f", num0!.floatValue * 0.1))")
- F000Dict[key.his_batteryVoltageMin] = String(format: "%.1f", num0!.floatValue * 0.1)
- //蓄电池当天最高电压
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4, length: 4))
- log.debug("蓄电池当天最高电压\(String(format: "%.1f", num1!.floatValue * 0.1))")
- F000Dict[key.his_batteryVoltageMax] = String(format: "%.1f", num1!.floatValue * 0.1)
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
- log.debug("当天充电最大电流\(String(format: "%.2f", num2!.floatValue * 0.01))")
- F000Dict[key.his_chargingCurrentMax] = String(format: "%.2f", num2!.floatValue * 0.01)
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
- log.debug("当天放电最大电流\(String(format: "%.2f", num3!.floatValue * 0.01))")
- F000Dict[key.his_dischargeCurrentmax] = String(format: "%.2f", num3!.floatValue * 0.01)
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- log.debug("当天充电最大功率\(num4!)" )
- F000Dict[key.his_chargingPowerMax] = "\(num4!)"
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5 , length: 4))
- log.debug("当天放电最大功率\(num5!)")
- F000Dict[key.his_dischargePowerMax] = "\(num5!)"
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
- log.debug("充电安时数 \(num6!)")
- F000Dict[key.his_chargingAmpereHour] = "\(num6!)"
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7 , length: 4))
- log.debug("放电安时数 \(num7!)")
- F000Dict[key.his_dischargeAmpereHour] = "\(num7!)"
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- log.debug("当天发电量 \(num8!)")
- F000Dict[key.his_generationCapacity] = "\(num8!)"
- let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- log.debug("充电量 \(num9!)")
- F000Dict[key.his_dischargeCapacity] = "\(num9!)"
- historyDataArr.append(F000Dict)
- }
-
- func realdata_F000(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F001(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F002(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F003(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F004(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F005(_ reciveData : String) {
- hisData(reciveData)
- }
-
- func realdata_F006(_ reciveData : String) {
- hisData(reciveData)
-
- }
- func realdata_F007(_ reciveData : String) {
- hisData(reciveData)
- deviceDetailData[key.historydatas] = historyDataArr
- cumulativeDict[key.historydatas] = historyDataArr
- }
-
- func realdata_0115(_ reciveData :String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- //
- let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
- log.debug("总运行天数 - \(num0!)")
- cumulativeDict[key.runTime] = ("\(num0!)")
- deviceDetailData[key.runTime] = ("\(num0!)")
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
- log.debug("蓄电池总过放次数 - \(num1!)")
- cumulativeDict[key.overTimes] = "\(num1!)"
- deviceDetailData[key.overTimes] = "\(num1!)"
-
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 8 , length: 4))
- log.debug("蓄电池总充满次数 - \(num2!)")
- cumulativeDict[key.fullTimes] = "\(num2!)"
- deviceDetailData[key.fullTimes] = "\(num2!)"
-
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 12 , length: 8))
- log.debug("蓄电池总充电安时数 - \(num3!)")
- cumulativeDict[key.chargingAmpereHour] = "\(num3!)"
- deviceDetailData[key.chargingAmpereHour] = "\(num3!)"
-
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 , length: 8))
- log.debug("蓄电池总放电安时数 - \(num4!)")
- cumulativeDict[key.dischargeAmpereHour] = "\(num4!)"
- deviceDetailData[key.dischargeAmpereHour] = "\(num4!)"
-
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 2 , length: 8))
- // let num5 = UUUtils.numberHexString("ffffffff")
- log.debug("累计发电量 - \(num5!)")
- cumulativeDict[key.generatEnergyTotal] = "\(num5!)"
-
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 12 + 8 * 3, length: 8))
- log.debug("累计用电量 - \(num6!)")
- cumulativeDict[key.usedEnergyTotal] = "\(num6!)"
- deviceDetailData[key.usedEnergyTotal] = "\(num6!)"
-
-
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil, userInfo: cumulativeDict)
- }
-
- func realdata_DF0D(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
- // <ff030200 009190>
- let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
- log.debug("手动均衡 —— \(num0)")
- var canhandle = ""
- if num0?.intValue == 0 {
- canhandle = "Prohibited".da_localizedStr()
- }else if num0?.intValue == 1{
- canhandle = "Enable".da_localizedStr()
- }
- deviceDetailData[key.BattEqualChgImmediate] = canhandle
- paramDataDict[key.BattEqualChgImmediate] = canhandle
- log.debug(" kNotifisionDeviceDatailDataBaseInfoRecieve \(deviceDetailData)")
- }
-
- func realdata_0100(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
- //太阳能电压 0107
- let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
- print("太阳能电压 \(num1!.floatValue * 0.1)" )
- let solarV = String(format: "%.1f", num1!.floatValue * 0.1)
- deviceDetailData[key.solarVoltage] = "\(solarV)"
- realDataDict[key.solarVoltage] = "\(solarV)"
- // 太阳能电流 0108
- let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
- print("太阳能电流 \(num2!.floatValue * 0.01)")
- deviceDetailData[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- realDataDict[key.solarCurrent] = String(format: "%.2f", num2!.floatValue * 0.01)
- // 太阳能功率 0109
- let num2_1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
- print("太阳能功率 \(num2_1!)")
- deviceDetailData[key.solarPower] = "\(num2_1!)"
- realDataDict[key.solarPower] = "\(num2_1!)"
- //蓄电池 电压 101
- let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 1, length: 4))
- print("蓄电池电压 \(num3!.floatValue * 0.1)")
- deviceDetailData[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- realDataDict[key.batteryVoltage] = String(format: "%.1f", num3!.floatValue * 0.1)
- //蓄电池电流 102
- let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2, length: 4))
- print("蓄电池电流\(num4!.floatValue * 0.01)")
- deviceDetailData[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
- realDataDict[key.batteryCurrent] = String(format: "%.2f", num4!.floatValue * 0.01)
-
- //蓄电池温度 0103
- let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3 , length: 2))
- print("温度 \(temp(with: num5!))")
- deviceDetailData[key.batteryTemp] = "\(temp(with: num5!))"
- realDataDict[key.batteryTemp] = "\(temp(with: num5!))"
- //负载电压 0104
- let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
- print("负载电压\(num6!.floatValue * 0.1)")
- deviceDetailData[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- realDataDict[key.loadVoltage] = String(format: "%.1f", num6!.floatValue * 0.1)
- //负载电流 0105
- let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
- print("负载电流\(num7!.floatValue * 0.01)")
- deviceDetailData[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
- realDataDict[key.loadCurrent] = String(format: "%.2f", num7!.floatValue * 0.01)
-
- //负载功率 0106
- let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
- print("功率 \(num8! )")
- realDataDict[key.loadPower] = "\(num8!)"
-
- deviceDetailData[key.loadPower] = "\(num8!)"
- }
-
- func realdata_0120(_ reciveData : String) {
- let str0 = reciveData
- log.debug("处理真实数据 - \(str0)")
-
-
- var num0A = UUUtils.getBinaryByHex(str0.subString(start: 11 , length: 8))
- let num0A_1 = num0A?.subString(start: 0, length: 16)
- let num0A_2 = num0A?.subString(start: 16, length: 16)
- let num0A_II = num0A_2! + num0A_1!
- num0A = num0A_II
- log.debug("太阳能板状态\(num0A!)")
-
- var solarStatusStr = ""
- let B30 = num0A?.subString(start: 1, length: 1)
- let B29 = num0A?.subString(start: 2, length: 1)
- let B28 = num0A?.subString(start: 3, length: 1)
- let B27 = num0A?.subString(start: 4, length: 1)
- let B26 = num0A?.subString(start: 5, length: 1)
- let B25 = num0A?.subString(start: 6, length: 1)
- let B24 = num0A?.subString(start: 7, length: 1)
- let B23 = num0A?.subString(start: 8, length: 1)
-
- //负载
- let B20 = num0A?.subString(start: 11, length: 1)
- let B19 = num0A?.subString(start: 12, length: 1)
- let B15 = num0A?.subString(start: 16, length: 1)
- //系统
- let B21 = num0A?.subString(start: 10, length: 1)
- let B14 = num0A?.subString(start: 17, length: 1)
- let B13 = num0A?.subString(start: 18, length: 1)
-
- //蓄电池状态
- let B22 = num0A?.subString(start: 9, length: 1)
- let B18 = num0A?.subString(start: 13, length: 1)
- let B17 = num0A?.subString(start: 14, length: 1)
- let B16 = num0A?.subString(start: 15, length: 1)
- let B12 = num0A?.subString(start: 19, length: 1)
- let B11 = num0A?.subString(start: 20, length: 1)
- let B10 = num0A?.subString(start: 21, length: 1)
-
- var batteryStatusStr = ""
- if B10 == "1" {
- batteryStatusStr = "BMS_overcharge_protection".da_localizedStr()
- }
- if B11 == "1" {
- batteryStatusStr = "Battery_low_temperature_protection,_stop_charging".da_localizedStr()
- }
- if B12 == "1" {
- batteryStatusStr = "Battery_reverse_polarity".da_localizedStr()
- }
- if B16 == "1" {
- batteryStatusStr = "Battery_over_discharge".da_localizedStr()
- }
- if B17 == "1" {
- batteryStatusStr = "Battery_overvoltage".da_localizedStr()
- }
- if B18 == "1" {
- batteryStatusStr = "Undervoltage_warning".da_localizedStr()
- }
- if B22 == "1" {
- batteryStatusStr = "External_ambient_temperature_is_too_high".da_localizedStr()
- }
-
- if B10 == "0" && B11 == "0" && B12 == "0" && B16 == "0" && B17 == "0" && B18 == "0" && B22 == "0"{
- batteryStatusStr = "Normal".da_localizedStr()
- }
- deviceDetailData[key.batteryStatus] = batteryStatusStr
- realDataDict[key.batteryStatus] = batteryStatusStr
- //太阳能状态
- if B23 == "1" {
- solarStatusStr = "PV_input_power_is_too_large".da_localizedStr()
- }
- if B24 == "1" {
- solarStatusStr = "Short_circuit_of_photovoltaic_input".da_localizedStr()
- }
- if B25 == "1" {
- solarStatusStr = "Overvoltage_at_the_photovoltaic_input".da_localizedStr()
- }
- if B26 == "1" {
- solarStatusStr = "Solar_panel_countercurrent".da_localizedStr()
- }
- if B27 == "1" {
- solarStatusStr = "Solar_panel_working_point_overpressure".da_localizedStr()
- }
- if B28 == "1" {
- solarStatusStr = "Solar_panel_reverse_connection".da_localizedStr()
- }
- deviceDetailData[key.solarStatus] = solarStatusStr
- realDataDict[key.solarStatus] = solarStatusStr
- //0120
- let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
- log.debug("00FD \(num0!)")
- let low_8_bit = UUUtils.numberHexString(str0.subString(start: 9, length: 2))
-
- log.debug("low_8_bit - \(low_8_bit)")
- //1000000000000000
-
- var changeStatus = ""
- if low_8_bit == 0 {
- changeStatus = "Charging_is_not_turned_on".da_localizedStr()
- }else if low_8_bit == 1 {
- changeStatus = "Start_charging_mode".da_localizedStr()
- }else if low_8_bit == 2 {
- changeStatus = "MPPT_charge_mode".da_localizedStr()
- }else if low_8_bit == 3 {
- changeStatus = "Equalizing_charge_mode".da_localizedStr()
- }else if low_8_bit == 4 {
- changeStatus = "Floating_charge_mode".da_localizedStr()
- }else if low_8_bit == 5 {
- changeStatus = "Boost_charge_mode".da_localizedStr()
- }else if low_8_bit == 6 {
- changeStatus = "Current_limiting_(super_power)".da_localizedStr()
- }else if low_8_bit == 7 {
- changeStatus = "Fully_charged".da_localizedStr()
- }
-
- // realDataDict[key.solarStatus] = solarStatusStr
- if B23 == "0" && B24 == "0" && B25 == "0" && B26 == "0" && B27 == "0" && B28 == "0" {
- dataDict[key.solarStatus] = changeStatus
- realDataDict[key.solarStatus] = changeStatus
- }
- //0000 0000 0000 0000 从后往前数
- let loadStatus = "\(num0?.subString(start: 0, length: 1) ?? "")"
- var loadStatusStr = ""
- if B15 == "1" {
- loadStatusStr = "Open_load".da_localizedStr()
- }
- if B19 == "1" {
- loadStatusStr = "Load_short_circuit".da_localizedStr()
- }
- if B20 == "1" {
- loadStatusStr = "Excessive_load_power_or_overload".da_localizedStr()
- }
-
- if B15 == "0" && B19 == "0" && B20 == "0" {
- if loadStatus == "0" {
- loadStatusStr = "Load_is_off".da_localizedStr()
- }else if loadStatus == "1" {
- loadStatusStr = "Load_is_on".da_localizedStr()
- }
- }
-
- log.debug("负载状态 :\(num0?.subString(start: 7, length: 1))") // 低八位
- deviceDetailData[key.loadStatus] = loadStatusStr
- realDataDict[key.loadStatus] = loadStatusStr
-
-
- }
- }
- /*
-
- 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]
- }
- }
- */
|