// // SBTPramSettingVCtr.swift // SolarBT // // Created by weclouds on 2019/3/13. // Copyright © 2019 weclouds. All rights reserved. // import UIKit import SwiftyJSON import PKHUD extension FileManager{ // 判断是否是文件夹的方法 static func directoryIsExists (path: String) -> Bool { var directoryExists = ObjCBool.init(false) let fileExists = FileManager.default.fileExists(atPath: path, isDirectory: &directoryExists) return fileExists && directoryExists.boolValue } } struct ParamData { //参数设置 var BatRateVolt :String? //系统电压设置 var BatTypeSet :String? // 蓄电池类型 var BatOverVolt :String? //超压电压 var BatChgLimitVolt :String? //充电限制电压 var BatConstChgVolt :String? // 均衡充电电压 var BatImprovChgVolt :String? // 提升充电电压/过充电压 var BatFloatChgVolt :String? //浮充充电电压 /过充返回电压 var BatImprovChgBackVolt :String? // 提升充电返回电压 var BatOverDischgBackVolt :String? //过放返回电压 var BatUnderVolt :String? // 欠压警告电压 var BatOverDischgVolt :String? // 过放电压 var BatDischgLimitVolt :String? //放电限制电压 var BatOverDischgDelayTime:String? //过放延时时间 var BatConstChgTime :String? // 均衡充电时间 var BatImprovChgTime :String? //提升充电时间 var BatConstChgGapTime :String? // 均衡充电间隔 var CoeffTemperCompen:String? // 温度补偿系数 var ChgMaxTemper :String? // 充电上限温度 var ChgMinTemper :String? // 充电下限温度 var DisChagMaxTemper :String? // 放电上限温度 var DisChaMinTemper:String? // 放电下限温度 var DcLoadMode :String? // 直流工作模式 var LightCtrlDelayTime :String? //光控延时时间 var LightCtrlVolt:String? // 光控电压 var tx :String? var rx :String? ; var BattEqualChgImmediate :String? // 手动均衡 var CmdPowerOnOff:String? // 开关控制 } class SBTPramSettingVCtr: UIViewController { var batRateVolt : String? var isAuto : Bool? = false var readBtn : UIButton? var callback:(()->Void)? var batterCell : SBTParamSet_BatteryCell? var peripheralName :String? var MaxVoltage: String? var IchageRage : String? var set_deviceName :String? var isOld :Bool? var charge_USER_Arr :[String]? = [String]() var charge_FLD_Arr :[String]? = [String]() var charge_SLD_Arr :[String]? = [String]() var charge_GEL_Arr :[String]? = [String]() var charge_LI_Arr :[String]? = [String]() var deviceName:String? // 设备名称 var paramDataDict : [String: Any] = [String: Any]() let key: DeviceDictKey = DeviceDictKey() var bleKey :String? //放大倍数 var Multiple : Float? = 1 // 默认为1倍 var maxVolt :String? // 系统最大电压 var isDemo: Bool? var fileURL : URL? lazy var device = DeviceData() var batteryArr:[String]? = [String]() var chargerArr:[String]? = [String]() var loadArr :[String]? = [String]() var txArr :[String]? = [String]() var rxArr :[String]? = [String]() var autoRecognition :Bool? var paramData:ParamData? @IBOutlet weak var tableView: UITableView! let batteryCellID = "battery" let chargerCellID = "charger" let loadCellID = "loadcell" let TxCellID = "txCell" let RxCellID = "RxCell" var isExpandArray = [String]() var foldLabelDict :NSMutableDictionary? override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.readBtn?.isEnabled = false //读取一遍数据 if self.isDemo == false { delay(1) { self.readName() } delay(1.5) { self.readAction() self.readBtn?.isEnabled = true } } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.callback != nil { self.callback!() } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) notificationRegister() } @objc func readName() { BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in self.readdata_0049(result!["FF0300490020"] as! String) }) } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) notificationUnRegister() if self.callback != nil { self.callback!() } } override func viewDidLoad() { super.viewDidLoad() // self.title = "参数设置" checkTheBlueToothWasActivity() // Do any additional setup after loading the view. initParam() createUI() if self.isDemo == true { let data = SBTData() initData(data.DemoData) }else{ let plist = CLDeviceDataPlist() let dataDict = plist.findData(deviceDetailPlist, key: self.bleKey!) // log.debug("-------------aekqwefknakofn== \(dataDict)") initData(dataDict as! [String : Any]) } } //注册通知、 获取数据 func notificationRegister() { NotificationCenter.default.addObserver(self, selector: #selector(notifitionToChangeBatteryType(_:)), name: NSNotification.Name(KNotifitionToChangeBatteryType), object: nil) } @objc func notifitionToChangeBatteryType(_ notifi:NSNotification) { chargerArr?.removeAll() //["自定义","密封铅酸SLD","开口铅酸FLD","胶体铅酸GEL","磷酸铁锂LI"] //{"batteryType": "0"} log.debug("f电池类型更改1 --- \(notifi.userInfo ?? Dictionary())") let dict = notifi.userInfo let batteryType = dict!["batteryType"] as! String log.debug("---电池类型 -- \(batteryType)") switch batteryType { case "0": chargerArr = charge_USER_Arr case "1": chargerArr = charge_FLD_Arr case "2": chargerArr = charge_SLD_Arr case "3": chargerArr = charge_GEL_Arr case "4": chargerArr = charge_LI_Arr default: break } self.tableView.reloadData() } //注销通知 func notificationUnRegister() { NotificationCenter.default.removeObserver(self) } } extension SBTPramSettingVCtr { func initData(_ dataDict: [String:Any]) { let def = UserDefaults.standard let iSTemp = def.object(forKey: TEMPISCENTIGRADE) as? String chargerArr?.removeAll() loadArr?.removeAll() txArr?.removeAll() rxArr?.removeAll() batteryArr?.removeAll() charge_USER_Arr?.removeAll() charge_FLD_Arr?.removeAll() charge_SLD_Arr?.removeAll() charge_GEL_Arr?.removeAll() charge_LI_Arr?.removeAll() paramData = nil let key = DeviceDictKey() //参数设置 let autoRecogn = dataDict[key.autoRecognition] as! String // 是否自动识别 if autoRecogn == "1"{ autoRecognition = true }else{ autoRecognition = false } let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置 //当前系统电压值 let batBateVoltInt = Float(BatRateVolt) let multiple = batBateVoltInt! / 12.0 self.Multiple = multiple let BatTypeSet = dataDict[key.BatTypeSet] as! String // 蓄电池类型 let maxVolt = dataDict[key.MaxVolt] as!String // 系统支持的最大电压 self.maxVolt = maxVolt switch BatTypeSet { case "自定义": AppShare.batteryType = .USER case "开口铅酸FLD": AppShare.batteryType = .FLD case "密封铅酸SLD": AppShare.batteryType = .SLD case "胶体铅酸GEL": AppShare.batteryType = .GEL case "锂LI": AppShare.batteryType = .LI default: break } if self.isOld == true { } var IchageRage = dataDict[key.MaxChargeCurrent] as! String //最大充电电流 if isOld == true { IchageRage = dataDict[key.IchageRage] as! String } chargerArr?.append(IchageRage) charge_USER_Arr?.append(IchageRage) let CmdPowerOnOff = dataDict[key.CmdPowerOnOff] as! String // 开关控制 if self.isOld == true { let CmdPowerOnOff1 = "On".da_localizedStr() self.chargerArr?.append(CmdPowerOnOff1) }else{ self.chargerArr?.append(CmdPowerOnOff) } var ChgMaxTemper = dataDict[key.ChgMaxTemper] as! String// 充电上限温度 if iSTemp == "0" { ChgMaxTemper = ChgMaxTemper.centigradeToFahrenheit_int() } if self.isOld == true { ChgMaxTemper = "--" } chargerArr?.append(ChgMaxTemper) var ChgMinTemper = dataDict[key.ChgMinTemper] as! String // 充电下限温度 if iSTemp == "0" { ChgMinTemper = ChgMinTemper.centigradeToFahrenheit_int() } if self.isOld == true { ChgMinTemper = "--" } chargerArr?.append(ChgMinTemper) /*---------------电压扩大n倍----------*/ let BatOverVolt = dataDict[key.BatOverVolt] as! String //超压电压 chargerArr?.append(voltEnlage(BatOverVolt)) /*---------------电压扩大n倍----------*/ let BatChgLimitVolt = dataDict[key.BatChgLimitVolt] as! String //充电限制电压 chargerArr?.append(voltEnlage(BatChgLimitVolt)) /*---------------电压扩大n倍----------*/ let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String // 提升充电电压/过充电压 chargerArr?.append(voltEnlage(BatImprovChgVolt)) /*---------------电压扩大n倍----------*/ let BatFloatChgVolt = dataDict[key.BatFloatChgVolt] as! String//浮充充电电压 /过充返回电压 chargerArr?.append(voltEnlage(BatFloatChgVolt)) /*---------------电压扩大n倍----------*/ let BatImprovChgBackVolt = dataDict[key.BatImprovChgBackVolt] as! String // 提升充电返回电压 chargerArr?.append(voltEnlage(BatImprovChgBackVolt)) let BatImprovChgTime = dataDict[key.BatImprovChgTime] as! String //提升充电时间 chargerArr?.append(BatImprovChgTime) let CoeffTemperCompen = dataDict[key.CoeffTemperCompen] as! String // 温度补偿系数 if CoeffTemperCompen == "0"{ let CoeffTemperCompenSt1 = "0" self.chargerArr?.append(CoeffTemperCompenSt1) }else{ let CoeffTemperCompenStr = "-\(CoeffTemperCompen)" self.chargerArr?.append(CoeffTemperCompenStr) } /*---------------电压扩大n倍----------*/ let BatConstChgVolt = dataDict[key.BatConstChgVolt] as! String // 均衡充电电压 chargerArr?.append(voltEnlage(BatConstChgVolt)) let BatConstChgTime = dataDict[key.BatConstChgTime] as! String // 均衡充电时间 chargerArr?.append(BatConstChgTime) let BatConstChgGapTime = dataDict[key.BatConstChgGapTime] as! String // 均衡充电间隔 chargerArr?.append(BatConstChgGapTime) let BattEqualChgImmediate = dataDict[key.BattEqualChgImmediate] as! String// 手动均衡 chargerArr?.append(BattEqualChgImmediate) /*---------------电压扩大n倍----------*/ let BatOverDischgBackVolt = dataDict[key.BatOverDischgBackVolt] as! String //过放返回电压 chargerArr?.append(voltEnlage(BatOverDischgBackVolt)) /*---------------电压扩大n倍----------*/ let BatUnderVolt = dataDict[key.BatUnderVolt] as! String // 欠压警告电压 chargerArr?.append(voltEnlage(BatUnderVolt)) /*---------------电压扩大n倍----------*/ let BatOverDischgVolt = dataDict[key.BatOverDischgVolt] as! String// 过放电压 chargerArr?.append(voltEnlage(BatOverDischgVolt)) /*---------------电压扩大n倍----------*/ let BatDischgLimitVolt = dataDict[key.BatDischgLimitVolt] as! String //放电限制电压 chargerArr?.append(voltEnlage(BatDischgLimitVolt)) let BatOverDischgDelayTime = dataDict[key.BatOverDischgDelayTime] as! String //过放延时时间 chargerArr?.append(BatOverDischgDelayTime) var DisChagMaxTemper = dataDict[key.DisChagMaxTemper] as! String // 放电上限温度 if iSTemp == "0" { DisChagMaxTemper = DisChagMaxTemper.centigradeToFahrenheit_int() } if self.isOld == true { DisChagMaxTemper = "--" } chargerArr?.append(DisChagMaxTemper) var DisChaMinTemper = dataDict[key.DisChaMinTemper] as! String // 放电下限温度 if iSTemp == "0" { DisChaMinTemper = DisChaMinTemper.centigradeToFahrenheit_int() } if self.isOld == true { DisChaMinTemper = "--" } chargerArr?.append(DisChaMinTemper) /*******默认数据****/ /// 自定义 charge_USER_Arr = [IchageRage,CmdPowerOnOff,"65","-30", voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("13.8"),voltEnlage("13.2"), "120","-3", voltEnlage("14.6"), "120","30",BattEqualChgImmediate, voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"), "5","",""] charge_SLD_Arr = [IchageRage,CmdPowerOnOff,"65","-30", voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("13.8"),voltEnlage("13.2"), "120","-3", voltEnlage("14.6"), "120","30",BattEqualChgImmediate, voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"), "5","",""] charge_FLD_Arr = [IchageRage,CmdPowerOnOff,"65","-30", voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.6"),voltEnlage("13.8"),voltEnlage("13.2"), "120","-3", voltEnlage("14.6"), "120","30",BattEqualChgImmediate, voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"), "5",DisChagMaxTemper,DisChaMinTemper] charge_GEL_Arr = [IchageRage,CmdPowerOnOff,"65","-30", voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.2"),voltEnlage("13.8"),voltEnlage("13.2"), "120","-3", voltEnlage("14.6"), "120","30",BattEqualChgImmediate, voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"), "5",DisChagMaxTemper,DisChaMinTemper] charge_LI_Arr = [IchageRage,CmdPowerOnOff,"65","-30", voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("14.4"),voltEnlage("13.2"), "-120-","0", voltEnlage("14.6"), "120","30",BattEqualChgImmediate, voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"), "5",DisChagMaxTemper,DisChaMinTemper] let DcLoadMode = dataDict[key.DcLoadMode] as! String // 直流工作模式 loadArr?.append(DcLoadMode) let LightCtrlDelayTime = dataDict[key.LightCtrlDelayTime] as! String //光控延时时间 loadArr?.append(LightCtrlDelayTime) let LightCtrlVolt = dataDict[key.LightCtrlVolt] as! String // 光控电压 loadArr?.append(LightCtrlVolt) // let tx = dataDict[key.tx] as! String var tx = "Normal_communication".da_localizedStr() if self.isOld == true{ tx = "" } txArr?.append(tx) // let rx = dataDict[key.rx] as! String var rx = "Normal_communication".da_localizedStr() if self.isOld == true { rx = "" } rxArr?.append(rx) paramData = ParamData(BatRateVolt: BatRateVolt, BatTypeSet: BatTypeSet, BatOverVolt: BatOverVolt, BatChgLimitVolt: BatChgLimitVolt, BatConstChgVolt: BatConstChgVolt, BatImprovChgVolt: BatImprovChgVolt, BatFloatChgVolt: BatFloatChgVolt, BatImprovChgBackVolt: BatImprovChgBackVolt, BatOverDischgBackVolt: BatOverDischgBackVolt, BatUnderVolt: BatUnderVolt, BatOverDischgVolt: BatOverDischgVolt, BatDischgLimitVolt: BatDischgLimitVolt, BatOverDischgDelayTime: BatOverDischgDelayTime, BatConstChgTime: BatConstChgTime, BatImprovChgTime: BatImprovChgTime, BatConstChgGapTime: BatConstChgGapTime, CoeffTemperCompen: CoeffTemperCompen, ChgMaxTemper: ChgMaxTemper, ChgMinTemper: ChgMinTemper, DisChagMaxTemper: DisChagMaxTemper, DisChaMinTemper: DisChaMinTemper, DcLoadMode: DcLoadMode, LightCtrlDelayTime: LightCtrlDelayTime, LightCtrlVolt: LightCtrlVolt, tx: tx, rx: rx, BattEqualChgImmediate: BattEqualChgImmediate, CmdPowerOnOff: CmdPowerOnOff) batteryArr?.append(BatRateVolt) batteryArr?.append(BatTypeSet) log.debug("负载 - \(loadArr!)") log.debug("充电器- \(chargerArr!)") self.tableView.reloadData() } //电压放大倍数 func voltEnlage(_ volt:String) -> String { let VoltFloat = Float(volt) let VoltEnlarge = VoltFloat! * self.Multiple! let VoltEnlargeStr = String(format: "%.1f", VoltEnlarge) return VoltEnlargeStr } func initParam() { for _ in 0..<5 { isExpandArray.append("0")//0 没展开 1 展开 } } func createUI() { setNavigationBar() self.tableView.delegate = self self.tableView.dataSource = self self.tableView.separatorStyle = .none self.tableView.backgroundColor = UIColor.white self.tableView.register(UINib(nibName: "SBTParamSet_BatteryCell", bundle: nil), forCellReuseIdentifier: batteryCellID) self.tableView.register(UINib(nibName: "SBTParamSet_ChargerCell", bundle: nil), forCellReuseIdentifier: chargerCellID) self.tableView.register(UINib(nibName: "SBTParamSet_LoadCell", bundle: nil), forCellReuseIdentifier: loadCellID) self.tableView.register(UINib(nibName: "SBTParamSet_TXCell", bundle: nil), forCellReuseIdentifier: TxCellID) self.tableView.register(UINib(nibName: "SBTParamSet_RXCell", bundle: nil), forCellReuseIdentifier: RxCellID) self.tableView.register(headerFooterViewClassWith: SBTHeaderView.self) } func setNavigationBar() { let titleView = UIView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH - 150, height: 44)) //titleView.backgroundColor = UIColor.red self.navigationItem.titleView = titleView let label = UILabel() label.text = "Parameter_settings".da_localizedStr() label.textColor = UIColor(hexString: "#222222") label.font = UIFont(name: PingFangSC_Semibold, size: 19) // label.backgroundColor = UIColor.green let labelW = label.getWidth(byHeight: 44, title: "Parameter_settings".da_localizedStr(), font: UIFont(name: PingFangSC_Semibold, size: 19)!) label.frame = CGRect(x: 0, y: 0, width: labelW + 20 , height: 44) titleView.addSubview(label) // 12 let readBtn = UIButton(type: .custom) //设置rect readBtn.frame = CGRect(x: labelW + 15 + 20 , y: 10, width: 51, height: 25) //设置渐变色 let bgLayer1 = CAGradientLayer() bgLayer1.colors = [UIColor(red: 1, green: 0.52, blue: 0.07, alpha: 1).cgColor, UIColor(red: 1, green: 0.67, blue: 0, alpha: 1).cgColor] bgLayer1.locations = [0, 1] bgLayer1.frame = readBtn.bounds bgLayer1.startPoint = CGPoint(x: 1, y: 1) bgLayer1.endPoint = CGPoint(x: 0, y: 0) readBtn.layer.addSublayer(bgLayer1) readBtn.layer.cornerRadius = 12.5 readBtn.layer.masksToBounds = true readBtn.setTitle("Read".da_localizedStr(), for: .normal) readBtn.setTitleColor(UIColor.white, for: .normal) readBtn.titleLabel?.font = UIFont(name: PingFangSC_Medium, size: 11) readBtn.addTarget(self, action: #selector(readAction), for: .touchUpInside) titleView.addSubview(readBtn) self.readBtn = readBtn let uploadBtn = UIBarButtonItem.createBarbuttonItem(image: "上传", highImage: "上传", target: self, action: #selector(uploadAction)) let downloadBtn = UIBarButtonItem.createBarbuttonItem(image: "导入", highImage: "导入", target: self, action: #selector(downloadAction)) //设置空白展位bar let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) spaceItem.width = 20 self.navigationItem.rightBarButtonItems = [downloadBtn,spaceItem,uploadBtn] } @objc func uploadAction() { readAction() let setFileName = SBTSetFileNameVCtr() setFileName.show() setFileName.saveCallBack = {(fileName) in log.debug("保存文件 --\(fileName)") // if fileName?.isEmpty == true || fileName?.count == 0 { // HUD.flash(.error, delay: 1) // return // } log.debug("-----\\输入的文件名称 --- \(fileName)") var filenameStr = "" let alert = SBTExportDataVCtr() if self.isDemo == true { // alert.alartTitle = "Simulation_experience".da_localizedStr() }else{ //let name = alert.alartTitle = self.set_deviceName! } alert.loadingImage = UIImage(named: "export") alert.message = "Paramter_export".da_localizedStr() alert.show() alert.dismiss(2) // if fileName == "" || fileName == nil { filenameStr = "paramter" }else{ filenameStr = fileName! } log.debug("最后显示的文件名称 === \(filenameStr)") self.perform(#selector(self.getUploadData), with: filenameStr, afterDelay: 1.5) } setFileName.completeHandle = {(filename) in // if filename?.isEmpty == true || filename?.count == 0 { // HUD.flash(.error, delay: 1) // return // } log.debug("-----\\输入的文件名称 --- \(filename)") var filenameStr = "" let alert = SBTExportDataVCtr() if self.isDemo == true { // alert.alartTitle = "Simulation_experience".da_localizedStr() }else{ //let name = alert.alartTitle = self.set_deviceName! } alert.loadingImage = UIImage(named: "export") alert.message = "Paramter_export".da_localizedStr() alert.show() alert.dismiss(2) // if filename == "" || filename == nil { filenameStr = "paramter" }else{ filenameStr = filename! } log.debug("最后显示的文件名称 === \(filenameStr)") self.perform(#selector(self.getUploadData), with: filenameStr, afterDelay: 1.5) self.perform(#selector(self.shareAction), with: nil, afterDelay: 2) } } //匹配数据 func StringToNumber(_ dict : [String:Any]) -> [String:Any] { let key = DeviceDictKey() var ParamDict = dict let tx = dict[key.tx] as! String let rx = dict[key.rx] as! String let BattEqualChgImmediate = dict[key.BattEqualChgImmediate] as! String let BatTypeSet = dict[key.BatTypeSet] as! String let DcLoadMode = dict[key.DcLoadMode] as! String let CmdPowerOnOff = dict[key.CmdPowerOnOff] as! String var tx_cmd = "" if tx == "正常通讯" || tx == "Normal communication" { tx_cmd = "000" } var rx_cmd = "" if rx == "正常通讯" || rx == "Normal communication" { rx_cmd = "000" } var canhandle = "" if BattEqualChgImmediate == "禁止" || BattEqualChgImmediate == "Prohibited" { canhandle = "0" }else if BattEqualChgImmediate == "使能" || BattEqualChgImmediate == "Enable"{ canhandle = "1" } var batterytype = "" switch BatTypeSet { case "自定义" : batterytype = "0" case "开口铅酸FLD": batterytype = "1" case "密封铅酸SLD": batterytype = "2" case "胶体铅酸GEL": batterytype = "3" case "锂LI": batterytype = "4" case "User-defined" : batterytype = "0" case "Vented lead acid battery FLD": batterytype = "1" case "Lead acid battery SLD": batterytype = "2" case "Gel lead acid GEL": batterytype = "3" case "Lithium LI": batterytype = "4" default: break } var loadwordmode = "" switch DcLoadMode { case "光控": loadwordmode = "0" case "光控,延时1小时": loadwordmode = "1" case "光控,延时2小时": loadwordmode = "2" case "光控,延时3小时": loadwordmode = "3" case "光控,延时4小时": loadwordmode = "4" case "光控,延时5小时": loadwordmode = "5" case "光控,延时6小时": loadwordmode = "6" case "光控,延时7小时": loadwordmode = "7" case "光控,延时8小时": loadwordmode = "8" case "光控,延时9小时": loadwordmode = "9" case "光控,延时10小时": loadwordmode = "10" case "光控,延时11小时": loadwordmode = "11" case "光控,延时12小时": loadwordmode = "12" case "光控,延时13小时": loadwordmode = "13" case "光控,延时14小时": loadwordmode = "14" case "手动模式": loadwordmode = "15" case "调试模式": loadwordmode = "16" case "常开模式": loadwordmode = "17" case "定时模式": loadwordmode = "18" case "Light control": loadwordmode = "0" case "Light control, delay 1 hour": loadwordmode = "1" case "Light control, delay 2 hours": loadwordmode = "2" case "Light control, delay 3 hours": loadwordmode = "3" case "Light control, delay 4 hours": loadwordmode = "4" case "Light control, delay 5 hours": loadwordmode = "5" case "Light control, delay 6 hours": loadwordmode = "6" case "Light control, delay 7 hours": loadwordmode = "7" case "Light control, delay 8 hours": loadwordmode = "8" case "Light control, delay 9 hours": loadwordmode = "9" case "Light control, delay 10 hours": loadwordmode = "10" case "Light control, delay 11 hours": loadwordmode = "11" case "Light control, delay 12 hours": loadwordmode = "12" case "Light control, delay 13 hours": loadwordmode = "13" case "Light control, delay 14 hours": loadwordmode = "14" case "Manual mode": loadwordmode = "15" case "Debug mode": loadwordmode = "16" case "Normal-on mode": loadwordmode = "17" case "Timed mode": loadwordmode = "18" default: break } var power_cmd = "" if CmdPowerOnOff == "关" || CmdPowerOnOff == "Off" { power_cmd = "0" }else if CmdPowerOnOff == "开" || CmdPowerOnOff == "On"{ power_cmd = "1" } ParamDict[key.tx] = tx_cmd ParamDict[key.rx] = rx_cmd ParamDict[key.BattEqualChgImmediate] = canhandle ParamDict[key.BatTypeSet] = batterytype ParamDict[key.DcLoadMode] = loadwordmode ParamDict[key.CmdPowerOnOff] = power_cmd return ParamDict } /// 处理分享数据数据 @objc func getUploadData(_ filename :String) { log.debug("上传数据 -- \(paramDataDict)") var dict = [String:Any]() if self.isDemo == true { let dict0 = SBTData().DemoData //设置 let key = DeviceDictKey() dict = ["BatImprovChgVolt": dict0[key.BatImprovChgVolt] as Any, "BatRateVolt": dict0[key.BatRateVolt] as Any, "CmdPowerOnOff": dict0[key.CmdPowerOnOff] as Any, "CoeffTemperCompen": dict0[key.CoeffTemperCompen]as Any, "BatOverVolt": dict0[key.BatOverVolt]as Any, "MaxChargeCurrent": dict0[key.MaxChargeCurrent]as Any, "BatOverDischgDelayTime": dict0[key.BatOverDischgDelayTime]as Any, "BattEqualChgImmediate": dict0[key.BattEqualChgImmediate]as Any, "BatImprovChgBackVolt": dict0[key.BatImprovChgBackVolt]as Any, "IchageRage": dict0[key.IchageRage]as Any, "MaxVolt": dict0[key.MaxVolt] as Any, "BatDischgLimitVolt": dict0[key.BatDischgLimitVolt] as Any, "BatOverDischgVolt": dict0[key.BatOverDischgVolt] as Any, "BatFloatChgVolt": dict0[key.BatFloatChgVolt]as Any, "BatImprovChgTime": dict0[key.BatImprovChgTime]as Any, "BatConstChgVolt": dict0[key.BatConstChgVolt]as Any, "BatChgLimitVolt": dict0[key.BatImprovChgVolt]as Any, "Tx": dict0[key.tx]as Any, "ChgMinTemper": dict0[key.ChgMinTemper]as Any, "DcLoadMode": dict0[key.DcLoadMode]as Any, "ChgMaxTemper": dict0[key.ChgMaxTemper]as Any, "autoRecognition": dict0[key.autoRecognition]as Any, "BatOverDischgBackVolt": dict0[key.BatOverDischgBackVolt]as Any, "LightCtrlDelayTime": dict0[key.LightCtrlDelayTime]as Any, "DisChagMinTemper": dict0[key.DisChaMinTemper]as Any, "DisChagMaxTemper": dict0[key.DisChagMaxTemper]as Any, "BatConstChgGapTime":dict0[key.BatConstChgGapTime]as Any, "Rx": dict0[key.rx]as Any, "LightCtrlVolt": dict0[key.LightCtrlVolt]as Any, "BatTypeSet": dict0[key.BatTypeSet]as Any, "BatUnderVolt": dict0[key.BatUnderVolt]as Any, "BatConstChgTime": dict0[key.BatConstChgTime]as Any] }else { dict = paramDataDict if self.isOld == true{ dict["ChgMinTemper"] = "--" dict["ChgMaxTemper"] = "--" dict["DisChagMinTemper"] = "--" dict["DisChagMaxTemper"] = "--" } } let newDict = StringToNumber(dict) let dictStr = dicValueString(newDict) log.debug("字符串 \(dictStr!)") //处理数据 // 1、 转成base64字符串 let base64Str = dictStr?.toBase64() // 2、 开头增加三个随机字符 let insetStr = String.randomStr(len: 3) + base64Str! // 3、 转成base64 字符串 let reBase64Str = insetStr.toBase64() log.debug("分享字符串 \(reBase64Str!)") //获取设备名称 // let devicename = paramDataDict["ProdctName"] as! String devicename + "Param.txt" let file = filename + ".txt"// this is the file. we will write to and read from it if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { let fileURL = dir.appendingPathComponent(file) print("========》保存地址 --- \(fileURL)") self.fileURL = fileURL //writing do { try reBase64Str!.write(to: fileURL, atomically: false, encoding: .utf8) } catch { /* error handling here */ } //reading do { let text2 = try String(contentsOf: fileURL, encoding: .utf8) print(text2) } catch { /* error handling here */ } let home1 = NSHomeDirectory() // 获取沙盒根路径 let documentsDirectory1 = home1 + "/Documents/" let documentsDirectory2 = home1 + "/Documents/SaveData/" let manager = FileManager.default let exist = manager.fileExists(atPath: home1 + "/Documents/SaveData/") if exist == false{ do{ let documentPath = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) let inboxPath = documentPath.appendingPathComponent("SaveData") //创建制定位置的上的文件夹 try manager.createDirectory(atPath: inboxPath.path, withIntermediateDirectories: true, attributes: nil) log.debug("创建文件夹成功") // g_showHUD("创建文件夹成功") } catch let error{ log.debug("创建文件夹失败 --- \(error.localizedDescription) ---\(error)") // g_showHUD("创建文件夹失败") } } let filePath1 = documentsDirectory1.appending(file) let filePath2 = documentsDirectory2.appending(file) SBTFileOperation.copyFile(sourceUrl: filePath1, targetUrl: filePath2) log.debug("地址----\(filePath1)") } } //MARK : 打开分享页面 @objc func shareAction() { let objectsToShare = [self.fileURL!] let controller = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) present(controller, animated: true, completion: nil) } // MARK: 字典转字符串 func dicValueString(_ dic:[String : Any]) -> String?{ let data = try? JSONSerialization.data(withJSONObject: dic, options: []) let str = String(data: data!, encoding: String.Encoding.utf8) return str } // MARK: 字符串转字典 func stringValueDic(_ str: String) -> [String : Any]?{ let data = str.data(using: String.Encoding.utf8) if let dict = try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String : Any] { return dict } return nil } ///MARK : 下载文件 @objc func downloadAction() { let vc = SBTReadSettingParamVCtr() vc.isOld = self.isOld vc.isDemo = self.isDemo vc.MaxVoltage = self.MaxVoltage vc.IchageRage = self.IchageRage self.navigationController?.pushViewController(vc) } @objc func readAction() { if self.isDemo == true { g_toast("Current_demo_data".da_localizedStr()) return } Thread.sleep(forTimeInterval: 0.1) log.debug("读取") let arr = ["FF03000A0001","FF03E0010001","FF03E003001E","FF03DF000001","FF03DF0D0001","FF03E0210001"] BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in self.realdata_000A(result!["FF03000A0001"] as! String) self.realdata_E001(result!["FF03E0010001"] as! String) self.realdata_E003(result!["FF03E003001E"] as! String) self.realdata_DF00(result!["FF03DF000001"] as! String) self.realdata_DF0D(result!["FF03DF0D0001"] as! String) self.realdata_E021(result!["FF03E0210001"] as! String) let loading = SBTReadLoadingVCtr() loading.deviceName = "Read_parameter".da_localizedStr() loading.message = "Reading_parameter".da_localizedStr() loading.show() loading.dismiss(2) self.tableView.reloadData() }) // self.ReadSettingParam() DispatchQueue.main.async { let loading = SBTReadLoadingVCtr() loading.deviceName = "Read_parameter".da_localizedStr() loading.message = "Reading_parameter".da_localizedStr() loading.show() loading.dismiss(2) self.tableView.reloadData() } } ///////////////// @objc func loadUIRefresh() { DispatchQueue.main.async { let dataDict = self.paramDataDict let def = UserDefaults.standard let iSTemp = def.object(forKey: TEMPISCENTIGRADE) as? String log.debug("asdfqoenwfoanwfok fa==wfkoaf- \(self.paramDataDict)") self.chargerArr?.removeAll() self.loadArr?.removeAll() self.txArr?.removeAll() self.rxArr?.removeAll() self.batteryArr?.removeAll() self.paramData = nil let key = DeviceDictKey() //参数设置 let autoRecogn = dataDict[key.autoRecognition] as! String // 是否自动识别 let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置 if autoRecogn == "1"{ self.autoRecognition = true let BatRateVolt = "Auto".da_localizedStr() //系统电压设置 }else{ self.autoRecognition = false let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置 } //当前系统电压值 if BatRateVolt == "自动识别" || BatRateVolt == "Auto"{ self.Multiple = 0 }else{ let batBateVoltInt = Float(BatRateVolt) let multiple = batBateVoltInt! / 12.0 self.Multiple = multiple } let BatTypeSet = dataDict[key.BatTypeSet] as! String // 蓄电池类型 let maxVolt = dataDict[key.MaxVolt] as!String // 系统支持的最大电压 self.maxVolt = maxVolt switch BatTypeSet { case "自定义": AppShare.batteryType = .USER case "开口铅酸FLD": AppShare.batteryType = .FLD case "密封铅酸SLD": AppShare.batteryType = .SLD case "胶体铅酸GEL": AppShare.batteryType = .GEL case "锂LI": AppShare.batteryType = .LI case "User-defined": AppShare.batteryType = .USER case "Vented lead acid battery FLD": AppShare.batteryType = .FLD case "Lead acid battery SLD": AppShare.batteryType = .SLD case "Gel lead acid GEL": AppShare.batteryType = .GEL case "Lithium LI": AppShare.batteryType = .LI default: break } var IchageRage = dataDict[key.MaxChargeCurrent] as! String //最大充电电流 if self.isOld == true { IchageRage = dataDict[key.IchageRage] as! String } self.chargerArr?.append(IchageRage) let CmdPowerOnOff = dataDict[key.CmdPowerOnOff] as! String // 开关控制 if self.isOld == true { let CmdPowerOnOff1 = "On".da_localizedStr() self.chargerArr?.append(CmdPowerOnOff1) }else{ self.chargerArr?.append(CmdPowerOnOff) } var ChgMaxTemper = dataDict[key.ChgMaxTemper] as! String// 充电上限温度 if iSTemp == "0" { ChgMaxTemper = ChgMaxTemper.centigradeToFahrenheit_int() } if self.isOld == true { ChgMaxTemper = "--" } self.chargerArr?.append(ChgMaxTemper) var ChgMinTemper = dataDict[key.ChgMinTemper] as! String // 充电下限温度 if iSTemp == "0" { ChgMinTemper = ChgMinTemper.centigradeToFahrenheit_int() } if self.isOld == true { ChgMinTemper = "--" } self.chargerArr?.append(ChgMinTemper) /*---------------电压扩大n倍----------*/ let BatOverVolt = dataDict[key.BatOverVolt] as! String //超压电压 self.chargerArr?.append(self.voltEnlage(BatOverVolt)) /*---------------电压扩大n倍----------*/ let BatChgLimitVolt = dataDict[key.BatChgLimitVolt] as! String //充电限制电压 self.chargerArr?.append(self.voltEnlage(BatChgLimitVolt)) /*---------------电压扩大n倍----------*/ let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String // 提升充电电压/过充电压 self.chargerArr?.append(self.voltEnlage(BatImprovChgVolt)) /*---------------电压扩大n倍----------*/ let BatFloatChgVolt = dataDict[key.BatFloatChgVolt] as! String//浮充充电电压 /过充返回电压 self.chargerArr?.append(self.voltEnlage(BatFloatChgVolt)) /*---------------电压扩大n倍----------*/ let BatImprovChgBackVolt = dataDict[key.BatImprovChgBackVolt] as! String // 提升充电返回电压 self.chargerArr?.append(self.voltEnlage(BatImprovChgBackVolt)) let BatImprovChgTime = dataDict[key.BatImprovChgTime] as! String //提升充电时间 self.chargerArr?.append(BatImprovChgTime) let CoeffTemperCompen = dataDict[key.CoeffTemperCompen] as! String // 温度补偿系数 if CoeffTemperCompen == "0"{ let CoeffTemperCompenSt1 = "0" self.chargerArr?.append(CoeffTemperCompenSt1) }else{ let CoeffTemperCompenStr = "-\(CoeffTemperCompen)" self.chargerArr?.append(CoeffTemperCompenStr) } /*---------------电压扩大n倍----------*/ let BatConstChgVolt = dataDict[key.BatConstChgVolt] as! String // 均衡充电电压 self.chargerArr?.append(self.voltEnlage(BatConstChgVolt)) let BatConstChgTime = dataDict[key.BatConstChgTime] as! String // 均衡充电时间 self.chargerArr?.append(BatConstChgTime) let BatConstChgGapTime = dataDict[key.BatConstChgGapTime] as! String // 均衡充电间隔 self.chargerArr?.append(BatConstChgGapTime) let BattEqualChgImmediate = dataDict[key.BattEqualChgImmediate] as! String// 手动均衡 self.chargerArr?.append(BattEqualChgImmediate) /*---------------电压扩大n倍----------*/ let BatOverDischgBackVolt = dataDict[key.BatOverDischgBackVolt] as! String //过放返回电压 self.chargerArr?.append(self.voltEnlage(BatOverDischgBackVolt)) /*---------------电压扩大n倍----------*/ let BatUnderVolt = dataDict[key.BatUnderVolt] as! String // 欠压警告电压 self.chargerArr?.append(self.voltEnlage(BatUnderVolt)) /*---------------电压扩大n倍----------*/ let BatOverDischgVolt = dataDict[key.BatOverDischgVolt] as! String// 过放电压 self.chargerArr?.append(self.voltEnlage(BatOverDischgVolt)) /*---------------电压扩大n倍----------*/ let BatDischgLimitVolt = dataDict[key.BatDischgLimitVolt] as! String //放电限制电压 self.chargerArr?.append(self.voltEnlage(BatDischgLimitVolt)) let BatOverDischgDelayTime = dataDict[key.BatOverDischgDelayTime] as! String //过放延时时间 self.chargerArr?.append(BatOverDischgDelayTime) var DisChagMaxTemper = dataDict[key.DisChagMaxTemper] as! String // 放电上限温度 if iSTemp == "0" { DisChagMaxTemper = DisChagMaxTemper.centigradeToFahrenheit_int() } if self.isOld == true { DisChagMaxTemper = "--" } self.chargerArr?.append(DisChagMaxTemper) var DisChaMinTemper = dataDict[key.DisChaMinTemper] as! String // 放电下限温度 if iSTemp == "0" { DisChaMinTemper = DisChaMinTemper.centigradeToFahrenheit_int() } if self.isOld == true { DisChaMinTemper = "--" } self.chargerArr?.append(DisChaMinTemper) let DcLoadMode = dataDict[key.DcLoadMode] as! String // 直流工作模式 self.loadArr?.append(DcLoadMode) let LightCtrlDelayTime = dataDict[key.LightCtrlDelayTime] as! String //光控延时时间 self.loadArr?.append(LightCtrlDelayTime) let LightCtrlVolt = dataDict[key.LightCtrlVolt] as! String // 光控电压 self.loadArr?.append(LightCtrlVolt) // let tx = dataDict[key.tx] as! String var tx = "Normal_communication".da_localizedStr() if self.isOld!{ tx = "" } self.txArr?.append(tx) // let rx = dataDict[key.rx] as! String var rx = "Normal_communication".da_localizedStr() if self.isOld!{ rx = "" } self.rxArr?.append(rx) self.paramData = ParamData(BatRateVolt: BatRateVolt, BatTypeSet: BatTypeSet, BatOverVolt: BatOverVolt, BatChgLimitVolt: BatChgLimitVolt, BatConstChgVolt: BatConstChgVolt, BatImprovChgVolt: BatImprovChgVolt, BatFloatChgVolt: BatFloatChgVolt, BatImprovChgBackVolt: BatImprovChgBackVolt, BatOverDischgBackVolt: BatOverDischgBackVolt, BatUnderVolt: BatUnderVolt, BatOverDischgVolt: BatOverDischgVolt, BatDischgLimitVolt: BatDischgLimitVolt, BatOverDischgDelayTime: BatOverDischgDelayTime, BatConstChgTime: BatConstChgTime, BatImprovChgTime: BatImprovChgTime, BatConstChgGapTime: BatConstChgGapTime, CoeffTemperCompen: CoeffTemperCompen, ChgMaxTemper: ChgMaxTemper, ChgMinTemper: ChgMinTemper, DisChagMaxTemper: DisChagMaxTemper, DisChaMinTemper: DisChaMinTemper, DcLoadMode: DcLoadMode, LightCtrlDelayTime: LightCtrlDelayTime, LightCtrlVolt: LightCtrlVolt, tx: tx, rx: rx, BattEqualChgImmediate: BattEqualChgImmediate, CmdPowerOnOff: CmdPowerOnOff) self.batteryArr?.append(BatRateVolt) self.batteryArr?.append(BatTypeSet) log.debug("负载 - \(self.loadArr!)") log.debug("充电器- \(self.chargerArr!)") self.tableView.reloadData() } } } extension SBTPramSettingVCtr: UITableViewDelegate,UITableViewDataSource{ func numberOfSections(in tableView: UITableView) -> Int { return 5 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let isExpand = isExpandArray[section] if isExpand == "1" { return 1 }else{ return 0 } } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let header = tableView.dequeueReusableHeaderFooterView(withClass: SBTHeaderView.self) header.backgroundView?.backgroundColor = UIColor.white if section == 0 || section == 1 { header.isPointShow = true }else{ header.isPointShow = false } let titles = ["Battery_settings".da_localizedStr(),"Charger_settings".da_localizedStr(),"Load_settings".da_localizedStr(),"TX_port_function".da_localizedStr(),"RX_port_function".da_localizedStr()] header.title = titles[section] if self.isExpandArray[section] == "0" {// 收起--> 展开 header.foldStr = "Expand".da_localizedStr() }else{ header.foldStr = "Retract".da_localizedStr() } header.foldCalk = {() in if self.isExpandArray[section] == "0" {// 收起--> 展开 self.isExpandArray.remove(at: section) self.isExpandArray.insert("1", at: section) }else{ self.isExpandArray.remove(at: section) self.isExpandArray.insert("0", at: section) } let indexP = IndexPath(item: 0, section: section) let range = NSMakeRange(indexP.section, 1) let indexSet : NSIndexSet = NSIndexSet(indexesIn: range) self.tableView.reloadSections(indexSet as IndexSet , with: .fade) } return header } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 50 } func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat { return 50 } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 0.01 } func tableView(_ tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat { return 0.01 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 1 { return 110 * 10 + 30 }else if indexPath.section == 2 { return 110 * 2 } return 110 } //缓存高度 这个 跟定时器一起使用 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 1 { return 110 * 10 + 30 }else if indexPath.section == 2 { return 110 * 2 } return 110 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.section == 0 { var cell = tableView.dequeueReusableCell(withIdentifier: batteryCellID) as? SBTParamSet_BatteryCell cell?.voltageStr = self.batteryArr?.first cell?.batteryTypeStr = self.batteryArr?.last cell?.autoRecognition = self.autoRecognition if cell == nil { cell = SBTParamSet_BatteryCell(style: .default, reuseIdentifier: batteryCellID) } cell?.itemdidSelectCallback = { (index) in let batteryVC = SBTSetBatteryVCtr() batteryVC.isDemo = self.isDemo batteryVC.selectedIndex = index batteryVC.voltageStr = self.batteryArr?.first batteryVC.batteryTypeStr = self.batteryArr?.last batteryVC.maxVolt = self.maxVolt batteryVC.isAuto = self.isAuto batteryVC.batRateVolt = self.batRateVolt batteryVC.completehandle = { (str) in if self.isDemo == true{ self.batteryArr![1] = str! log.debug("---- 回传电池类型 --- \(str)") self.tableView.reloadData() }else{ self.reloadCallback() } } for subview in batteryVC.view.subviews { log.debug(subview) let transitionView = NSClassFromString("UITransitionView")!.class() if subview.isMember(of: transitionView){ subview.backgroundColor = UIColor.clear log.debug("111") }else{ log.debug("没有") } } batteryVC.show() } cell?.selectionStyle = .none return cell! }else if indexPath.section == 1{ var cell = tableView.dequeueReusableCell(withIdentifier: chargerCellID) as? SBTParamSet_ChargerCell // cell?.getData(chargerArr) cell?.isOld = self.isOld; cell?.CellBatteryType = AppShare.batteryType cell?.dataSources = chargerArr if cell == nil { cell = SBTParamSet_ChargerCell(style: .default, reuseIdentifier: chargerCellID) } cell?.itemdidSelectedCallBack = { (selectedIndexPath) in let changerVC = SBTSetChargeVCtr() changerVC.MaxVoltage = self.MaxVoltage changerVC.isOld = self.isOld changerVC.isDemo = self.isDemo if self.isDemo == true{ changerVC.IchageRage = "20.00" }else{ changerVC.IchageRage = self.IchageRage } changerVC.selectedIndexPath = selectedIndexPath changerVC.CellBatteryType = AppShare.batteryType changerVC.Multiple = self.Multiple log.debug("当前页选择的seleceted \(selectedIndexPath)") changerVC.dataSources = self.chargerArr changerVC.completehandle = { self.reloadCallback() } for subview in changerVC.view.subviews { log.debug(subview) let transitionView = NSClassFromString("UITransitionView")!.class() if subview.isMember(of: transitionView){ subview.backgroundColor = UIColor.clear log.debug("111") }else{ log.debug("没有") } } changerVC.show() } cell?.selectionStyle = .none return cell! }else if indexPath.section == 2 { var cell = tableView.dequeueReusableCell(withIdentifier: loadCellID) as? SBTParamSet_LoadCell cell?.dataSource = loadArr if cell == nil { cell = SBTParamSet_LoadCell(style: .default, reuseIdentifier: loadCellID) } cell?.itemdidSelectedCallBack = { (index) in let loadVC = SBTSetLoadVCtr() loadVC.isDemo = self.isDemo loadVC.selectedIndex = index loadVC.dataSource = self.loadArr loadVC.completehandle = { self.reloadCallback() // self.readAction() } for subview in loadVC.view.subviews { log.debug(subview) let transitionView = NSClassFromString("UITransitionView")!.class() if subview.isMember(of: transitionView){ subview.backgroundColor = UIColor.clear log.debug("111") }else{ log.debug("没有") } } loadVC.show() } cell?.selectionStyle = .none return cell! }else if indexPath.section == 3 { var cell = tableView.dequeueReusableCell(withIdentifier: TxCellID) as? SBTParamSet_TXCell cell?.isOld = self.isOld cell?.tx = txArr!.first if cell == nil { cell = SBTParamSet_TXCell(style: .default, reuseIdentifier: TxCellID) } cell?.itemdidSelectCallback = { let txVC = SBTSetTxVCtr() txVC.isDemo = self.isDemo txVC.tx = self.txArr!.first txVC.completehandle = { // self.readAction() self.reloadCallback() } for subview in txVC.view.subviews { log.debug(subview) let transitionView = NSClassFromString("UITransitionView")!.class() if subview.isMember(of: transitionView){ subview.backgroundColor = UIColor.clear log.debug("111") }else{ log.debug("没有") } } txVC.show() } cell?.selectionStyle = .none return cell! }else { var cell = tableView.dequeueReusableCell(withIdentifier: RxCellID) as? SBTParamSet_RXCell cell?.isOld = self.isOld cell?.rx = rxArr?.first if cell == nil { cell = SBTParamSet_RXCell(style: .default, reuseIdentifier: RxCellID) } cell?.itemdidSelectCallback = { let rxVC = SBTSetRxVCtr() rxVC.rx = self.rxArr?.first rxVC.isDemo = self.isDemo rxVC.completehandle = { self.reloadCallback() } for subview in rxVC.view.subviews { log.debug(subview) let transitionView = NSClassFromString("UITransitionView")!.class() if subview.isMember(of: transitionView){ subview.backgroundColor = UIColor.clear log.debug("111") }else{ log.debug("没有") } } rxVC.show() } cell?.selectionStyle = .none return cell! } } func reloadCallback() { DispatchQueue.main.async { // let loading = SBTReadLoadingVCtr() // loading.deviceName = "Set_parameter".da_localizedStr() // loading.message = "Setting_parameter".da_localizedStr() // loading.show() // loading.dismiss(3) self.tableView.reloadData() } // self.readAction() self.perform(#selector(readAction), with: nil, afterDelay: 3) self.perform(#selector(reloadTable), with: nil, afterDelay: 4) self.perform(#selector(reloadSuccess), with: nil, afterDelay: 4.5) } @objc func reloadSuccess() { g_showHUD("Successful".da_localizedStr()) } @objc func reloadTable() { log.debug("修改之后回调数据 -- \(paramDataDict)") self.tableView.reloadData() } } extension SBTPramSettingVCtr{ //读取名称 func readdata_0049(_ reciveData : String){ let str0 = reciveData log.debug("处理真实数据 - \(str0)") 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) //过滤开头结尾空白 set_deviceName = num5 log.debug("设备名称 \(num5)") if num5 == nil || num5 == ""{ let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12)) log.debug("设备中文名称 \(ChineseString!)") set_deviceName = ChineseString! } } //实时数据 func realdata_000A(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //系统支持的最高电压 let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2)) log.debug("系统支持的最高电压: \(num00!)") paramDataDict[key.MaxVolt] = "\(num00!)" self.MaxVoltage = "\(num00!)" let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2)) log.debug("额定充电电流: \(num0!)") paramDataDict[key.IchageRage] = String(format: "%.2f", num0!.doubleValue) self.IchageRage = String(format: "%.2f", num0!.doubleValue) } //温度处理 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 )" } } func realdata_E001(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e001 // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4)) log.debug(" 最大充电电流- \(String(format: "%.2f", num0!.floatValue * 0.01))") paramDataDict[key.MaxChargeCurrent] = "\(String(format: "%.2f", num0!.floatValue * 0.01))" } func realdata_E003(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") //e003 if self.isOld == true { } // FF let FF = str0.subString(start: 7, length: 2) if FF == "FF" || FF == "ff"{ paramDataDict[key.autoRecognition] = "1" // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2)) log.debug("系统电压设置 - \(num0!)") if num0 == 0 { paramDataDict[key.BatRateVolt] = "Auto".da_localizedStr() paramDataDict[key.autoRecognition] = "1" self.batRateVolt = "Auto".da_localizedStr() }else{ paramDataDict[key.BatRateVolt] = "\(num0!)" self.batRateVolt = "\(num0!)" } self.isAuto = true }else{ paramDataDict[key.autoRecognition] = "0" self.isAuto = true // 判断是否自动识别 let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2)) log.debug("系统电压设置 - \(num0!)") if num0 == 0 { paramDataDict[key.BatRateVolt] = "Auto".da_localizedStr() paramDataDict[key.autoRecognition] = "1" self.batRateVolt = "Auto".da_localizedStr() }else{ paramDataDict[key.BatRateVolt] = "\(num0!)" self.batRateVolt = "\(num0!)" } } //18 0c //e004 let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4)) var batterytype = "" switch num1?.intValue { case 0: batterytype = "User-defined".da_localizedStr() case 1: batterytype = "Vented_lead_acid_battery_FLD".da_localizedStr() case 2: batterytype = "Lead_acid_battery_SLD".da_localizedStr() case 3: batterytype = "Gel_lead_acid_GEL".da_localizedStr() case 4: batterytype = "Lithium_iron_phosphate_battery_LI".da_localizedStr() case 5: batterytype = "三元锂电池".da_localizedStr() case 6: batterytype = "Lithium_iron_phosphate_battery_LI".da_localizedStr() case 7: batterytype = "超级电容".da_localizedStr() case 10: batterytype = "自定义(铅酸专用)".da_localizedStr() default: break } log.debug("电池类型: \(batterytype)") paramDataDict[key.BatTypeSet] = "\(batterytype)" //e005 let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2 , length: 4)) log.debug("超压电压: \(num2!.floatValue * 0.1)") paramDataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)" //e006 let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4)) //BatChgLimitVolt log.debug("充电限制电压:\(num3!.floatValue * 0.1)") paramDataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)" //e007 let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4)) log.debug("均衡充电电压\(num4!.floatValue * 0.1)") paramDataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1) //e008 let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4)) log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)") paramDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))" //e009 let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4)) log.debug("浮充充电电压/过充返回电压\(num6!.floatValue * 0.1)") paramDataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)" //e00a let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4)) log.debug("提升充电返回电压\(num7!.floatValue * 0.1)") paramDataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1) //e00b let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4)) log.debug("过放返回电压\(num8!.floatValue * 0.1)") paramDataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)" //e00c let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4)) log.debug("欠压警告电压\(num9!.floatValue * 0.1)") paramDataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)" //e00d let num10 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 10, length: 4)) log.debug("过放电压\(num10!.floatValue * 0.1)") paramDataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)" //e00e let num11 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 11, length: 4)) log.debug("放电限制电压\(num11!.floatValue * 0.1)") paramDataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)" //e010 let num13 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 13, length: 4)) log.debug("过放延时时间\(num13!)") paramDataDict[key.BatOverDischgDelayTime] = "\(num13!)" //e011 let num14 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 14, length: 4)) log.debug("均衡充电时间\(num14!)") paramDataDict[key.BatConstChgTime] = "\(num14!)" //e012 let num15 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 15, length: 4)) log.debug("提升充电时间 \(num15!)") paramDataDict[key.BatImprovChgTime] = "\(num15!)" //e013 let num16 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 16, length: 4)) log.debug("均衡充电间隔\(num16!)") paramDataDict[key.BatConstChgGapTime] = "\(num16!)" //e014 let num17 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 17, length: 4)) log.debug("温度补偿系数\(num17!)") paramDataDict[key.CoeffTemperCompen] = "\(num17!)" //e015 let num18 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 18, length: 4)) log.debug("充电上限温度\(temp(with: num18!))") paramDataDict[key.ChgMaxTemper] = "\(temp(with: num18!))" //e016 let num19 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 19, length: 4)) log.debug("充电下限温度\(temp(with: num19!))") paramDataDict[key.ChgMinTemper] = "\(temp(with: num19!))" //e017 let num20 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 20, length: 4)) log.debug("放电上限温度\(temp(with: num20!))") paramDataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))" //e018 let num21 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 21, length: 4)) log.debug("放电下限温度\(temp(with: num21!))") paramDataDict[key.DisChaMinTemper] = "\(temp(with: num21!))" //e01d let num26 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 26, length: 4)) var loadwordmode = "" switch num26?.intValue { case 0: loadwordmode = "Light_control".da_localizedStr() case 1: loadwordmode = "Light_control,_delay_1_hour".da_localizedStr() case 2: loadwordmode = "Light_control,_delay_2_hours".da_localizedStr() case 3: loadwordmode = "Light_control,_delay_3_hours".da_localizedStr() case 4: loadwordmode = "Light_control,_delay_4_hours".da_localizedStr() case 5: loadwordmode = "Light_control,_delay_5_hours".da_localizedStr() case 6: loadwordmode = "Light_control,_delay_6_hours".da_localizedStr() case 7: loadwordmode = "Light_control,_delay_7_hours".da_localizedStr() case 8: loadwordmode = "Light_control,_delay_8_hours".da_localizedStr() case 9: loadwordmode = "Light_control,_delay_9_hours".da_localizedStr() case 10: loadwordmode = "Light_control,_delay_10_hours".da_localizedStr() case 11: loadwordmode = "Light_control,_delay_11_hours".da_localizedStr() case 12: loadwordmode = "Light_control,_delay_12_hours".da_localizedStr() case 13: loadwordmode = "Light_control,_delay_13_hours".da_localizedStr() case 14: loadwordmode = "Light_control,_delay_14_hours".da_localizedStr() case 15: loadwordmode = "Manual_mode".da_localizedStr() case 16: loadwordmode = "Debug_mode".da_localizedStr() case 17: loadwordmode = "Normal-on_mode".da_localizedStr() case 18: loadwordmode = "Timed_mode".da_localizedStr() default: break } log.debug("直流负载工作模式\(loadwordmode)") paramDataDict[key.DcLoadMode] = "\(loadwordmode)" //e01e let num27 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 27, length: 4)) log.debug("光控延时时间\(num27!)") paramDataDict[key.LightCtrlDelayTime] = "\(num27!)" //d01f let num28 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 28, length: 4)) log.debug("光控电压\(num28!)") paramDataDict[key.LightCtrlVolt] = "\(num28!)" } func realdata_DF00(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") // ff0302 0c0c 9495 let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4)) log.debug("开关控制 —— \(num0)") var cmd = "" if num0?.intValue == 0 { cmd = "Off".da_localizedStr() }else if num0?.intValue == 1{ cmd = "On".da_localizedStr() } paramDataDict[key.CmdPowerOnOff] = cmd } func realdata_DF0D(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") // 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() } paramDataDict[key.BattEqualChgImmediate] = canhandle } func realdata_E021(_ reciveData : String) { let str0 = reciveData log.debug("处理真实数据 - \(str0)") let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4)) //("0000000100000000") //00 000 001 00000000 log.debug("E021 —— \(num0!)") //RX let rx = num0?.subString(start: 2, length: 3) var rx_function = "" if rx == "000"{ rx_function = "Normal_communication".da_localizedStr() } // else if rx == "001"{ // rx_function = "远程开关" // // }else if rx == "010"{ // rx_function = "负载输出设置" // // }else if rx == "011"{ // rx_function = "负载输出开/关 反相" // // }else if rx == "100"{ // rx_function = "负载输出开/关 正常" // } log.debug("Rx端口 \(rx_function)") paramDataDict[key.rx] = "\(rx_function)" let tx = num0?.subString(start: 5, length: 3) log.debug("") var tx_function = "" if tx == "000" { tx_function = "Normal_communication".da_localizedStr() } // else if tx == "001"{ // tx_function = "虚拟负载输出" // }else if tx == "010"{ // tx_function = "每0.01kwh脉冲" // }else if tx == "011"{ // tx_function = "灯光调暗(pwm正常)" // }else if tx == "100"{ // tx_function = "灯光调暗(pwm反相)" // } log.debug("tx端口 \(tx_function)") paramDataDict[key.tx] = "\(tx_function)" loadUIRefresh() } }