// // SBTReadSettingParamVCtr.swift // SolarBT // // Created by weclouds on 2019/5/24. // Copyright © 2019 weclouds. All rights reserved. // import UIKit import RxCocoa import RxSwift struct FileInfo { var fileName : String? var isDelete : Bool? var isInBox : Bool? } class SBTReadSettingParamVCtr: UIViewController { var isDemo: Bool? var isOld : Bool? var peripheralName :String? var MaxVoltage : String? var IchageRage: String? var contentURL :[URL]? = [URL]() var dataSource2 :[FileInfo]? = [FileInfo]() var showDataArr :[FileInfo]? = [FileInfo]() //不同电池类型的指令数组 var userArr :[String] = [String]() //自定义 var liArr :[String] = [String]()//锂电池数组 var commentArr:[String] = [String]() // 其他公共指令数组 var isDelete : Bool? = false var importCMDArr = [String]()// 导入的数组 var paramContent: String?{ didSet{ if let paramContent = self.paramContent { //先解密一次 解密base64 字符串 //截取字符串 去掉最前面三个字符 //在解密一次 base64 解密 let encode = paramContent let encode1 = encode.fromBase64() let encode2 = encode1?.subString(start: 3) // print(encode2) let code = encode2?.fromBase64() // self.contentLabel.text = code }else{ } } } //@IBOutlet weak var contentLabel: UILabel! @IBOutlet weak var contentView: UIView! @IBOutlet weak var searchBox: UIView! @IBOutlet weak var searchField: UITextField! @IBOutlet weak var importBtn: UIButton! var collectionView : UICollectionView? override func viewDidLoad() { super.viewDidLoad() self.title = "Paramter_Import".da_localizedStr() // self.contentLabel.text = "从其他应用分享到本app 并完成读取" getFileData() createUI() let deleteBtn = UIBarButtonItem(image: UIImage(named: "shanchu"), style: .plain, target: self, action: #selector(deleteAction)) // self.navigationItem.rightBarButtonItem = deleteBtn } @objc func deleteAction(_ sender : UIBarButtonItem) { self.isDelete = !self.isDelete! self.collectionView?.reloadData() } @IBAction func importAction(_ sender: Any) { if self.importCMDArr.count != 0 { let arr = self.importCMDArr BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in self.g_toast("Paramter_import_successfully".da_localizedStr()) }) let alert = SBTExportDataVCtr() if isDemo == true{ let dict = SBTData().DemoData alert.alartTitle = (dict["ProdctName"] as! String) }else{ if self.isOld == true{ alert.alartTitle = "Paramterimported".da_localizedStr() }else{ alert.alartTitle = (AppShare.dataDict["ProdctName"] as! String) } } alert.loadingImage = UIImage(named: "import") alert.message = "Paramter_importing".da_localizedStr() alert.show() alert.dismiss(2) } } @objc func showMessage() { g_toast("Paramter_import_successfully".da_localizedStr()) } } extension SBTReadSettingParamVCtr{ func getFileData() { self.dataSource2?.removeAll() let manager = FileManager.default let home = NSHomeDirectory() // 获取沙盒根路径 let url = home + "/Documents/Inbox/" let iSExit = manager.fileExists(atPath: url) if iSExit == true { do { let cintents1 = try manager.contentsOfDirectory(atPath: url) print("cintents:\(cintents1)\n") for content in cintents1{ let file = FileInfo(fileName: content, isDelete: false, isInBox: true) self.dataSource2?.append(file) } //获取路径名称 let contentsOfURL = try? manager.contentsOfDirectory(at: URL(string: url)!, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) print("contentsOfURL: \(contentsOfURL)") for aURL in contentsOfURL! { contentURL?.append(aURL) } } catch let error { log.debug("Error occurs ---\(error)") } } do { let documentPath = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) let SaveDataPath = documentPath.appendingPathComponent("SaveData") let cintents2 = try manager.contentsOfDirectory(atPath: SaveDataPath.path) print("cintents:\(cintents2)\n") for content2 in cintents2{ let file = FileInfo(fileName: content2, isDelete: false, isInBox: false) self.dataSource2?.append(file) // self.deleteArr?.append(false) // self.isInboxArr?.append(false) // self.dataSource?.append(content2) } let contentsOfURL2 = try? manager.contentsOfDirectory(at: SaveDataPath, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) for bURL in contentsOfURL2! { contentURL?.append(bURL) } for _ in 0.. Bool { // let _newFiles = self.dataSource2 // var filesNS : [FileInfo] // if let text = textField.text, // let textRange = Range(range, in: text) { // let updatedText = text.replacingCharacters(in: textRange, // with: string) // log.debug("更新的输入 ---\(updatedText)") // filesNS = (_newFiles?.filter({ (file) -> Bool in // return file.fileName?.contains(updatedText) == true // }))! // }else{ // filesNS = _newFiles! // } // // self.dataSource2 = filesNS // // // self.collectionView?.reloadData() return true } func textFieldDidEndEditing(_ textField: UITextField) { let _newFiles = self.dataSource2 var filesNS : [FileInfo] if textField.text == "" || textField.text == nil { filesNS = showDataArr! }else{ log.debug("更新的输入 ---\(textField.text!)") filesNS = (_newFiles?.filter({ (file) -> Bool in return file.fileName?.contains(textField.text!) == true }))! } self.dataSource2?.removeAll() self.dataSource2 = filesNS log.debug("新数组 -- \(self.dataSource2)") self.collectionView?.reloadData() } } extension SBTReadSettingParamVCtr: UICollectionViewDelegate,UICollectionViewDataSource{ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.dataSource2?.count ?? 0 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "fileCell", for: indexPath) as! SBTFileCell let file = self.dataSource2![indexPath.row] cell.fileInfo = file return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let file = self.dataSource2![indexPath.row] if self.isDelete == true { //删除沙盒内容 let isInbox = file.isInBox let manager = FileManager.default if isInbox == true { let home = NSHomeDirectory() // 获取沙盒根路径 let url = home + "/Documents/Inbox/" + file.fileName! let filePath = URL(fileURLWithPath: url) do{ try manager.removeItem(at: filePath) g_showHUD("deleteSussess".da_localizedStr()) }catch{ g_showHUD("deleteFail".da_localizedStr()) } }else{ let documentPath = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) let SaveDataPath = documentPath.appendingPathComponent("SaveData") let filePath = SaveDataPath.appendingPathComponent(file.fileName!) do{ try manager.removeItem(at: filePath) g_showHUD("删除成功") }catch{ g_showHUD("删除失败") } } // isInboxArr?.remove(at: indexPath.row) // dataSource?.remove(at: indexPath.row) // deleteArr?.remove(at: indexPath.row) dataSource2?.remove(at: indexPath.row) self.collectionView?.reloadData() }else{ // log.debug("点击了 \(contentURL![indexPath.row])") let fileURL = contentURL![indexPath.row] //reading do { let text2 = try String(contentsOf: fileURL, encoding: .utf8) // log.debug(text2) decodeFileData(text2) } catch { /* error handling here */ } } } //处理数据 func decodeFileData(_ text:String ) { //先解密一次 解密base64 字符串 //截取字符串 去掉最前面三个字符 //在解密一次 base64 解密 let encode = text let encode1 = encode.fromBase64() let encode2 = encode1?.subString(start: 3) // print(encode2) let code = encode2?.fromBase64() log.debug("\(code!)") //分享来的 let shareParamDict : [String:String] = stringValueDic(code!)! as! [String : String] userArr.removeAll() liArr.removeAll() commentArr.removeAll() let key = DeviceDictKey() //先设置 电池类型 let BatTypeSet = shareParamDict[key.BatTypeSet] // 蓄电池类型 let batTypeSetHexStr = String(format: "%04X", Int(BatTypeSet!)!) let batTypeSet_cmd = "FF06E004" + batTypeSetHexStr userArr.append(batTypeSet_cmd) commentArr.append(batTypeSet_cmd) liArr.append(batTypeSet_cmd) // let oldVolt = AppShare.paramDataDict[key.BatRateVolt] as! String //参数设置 let autoRecogn = shareParamDict[key.autoRecognition] // 是否自动识别 let BatRateVolt = shareParamDict[key.BatRateVolt] //系统电压设置 var voltage = "" //如果是自动识别 if autoRecogn == "1"{ let oldVolt = String(format: "%2X", Int(AppShare.dataDict[key.BatRateVolt] as! String)!) voltage = "FF" + oldVolt }else{ let oldVolt1 = String(format: "%2X", Int(BatRateVolt!)!) voltage = oldVolt1 + "00" } let BatRateVolt_cmd = "FF06E003" + voltage userArr.append(BatRateVolt_cmd) commentArr.append(BatRateVolt_cmd) liArr.append(BatRateVolt_cmd) let IchageRage = shareParamDict[key.IchageRage] //最大充电电流 let IchageRageFloat = Double(IchageRage!) let result_int = Int(IchageRageFloat! * 100) let IchageRage_cmd = String(format: "FF06E001%04X",result_int) userArr.append(IchageRage_cmd) commentArr.append(IchageRage_cmd) liArr.append(IchageRage_cmd) if self.isDemo == false { if self.isOld == false{ let CmdPowerOnOff = shareParamDict[key.CmdPowerOnOff] // 开关控制 if CmdPowerOnOff != "" || CmdPowerOnOff != "--"{ let CmdPowerOnOff_cmd = String(format: "FF06DF00%04X", Int(CmdPowerOnOff!)!) userArr.append(CmdPowerOnOff_cmd) commentArr.append(CmdPowerOnOff_cmd) liArr.append(CmdPowerOnOff_cmd) } } } if self.isOld == false { let ChgMaxTemper = shareParamDict[key.ChgMaxTemper] // 充电上限温度 if ChgMaxTemper != "--"{ let ChgMaxTemper_cmd = String(format: "FF06E015%04X", Int(ChgMaxTemper!)!) userArr.append(ChgMaxTemper_cmd) commentArr.append(ChgMaxTemper_cmd) liArr.append(ChgMaxTemper_cmd) } let ChgMinTemper = shareParamDict[key.ChgMinTemper] // 充电下限温度 if ChgMinTemper != "--"{ // 先判断正负 var ChgMinTemper_cmd = "" let ChgMinTemperInt = Int(ChgMinTemper!) if ChgMinTemperInt! < 0 { //负数 let resutA = ChgMinTemper!.subString(start: 1) let resubB = Int(resutA) let resubC = resubB! | 128 ChgMinTemper_cmd = String(format: "FF06E016%04X", resubC) // 转化为十六进制 }else{// 正数 ChgMinTemper_cmd = String(format: "FF06E016%04X", ChgMinTemperInt!) } userArr.append(ChgMinTemper_cmd) commentArr.append(ChgMinTemper_cmd) liArr.append(ChgMinTemper_cmd) } } //==============================分割线================ let BatOverVolt = shareParamDict[key.BatOverVolt] //超压电压 let BatOverVolt_cmd = setVoltCMD(BatOverVolt!, firstcmd: "E005") userArr.append(BatOverVolt_cmd) let BatChgLimitVolt = shareParamDict[key.BatChgLimitVolt] //充电限制电压 let BatChgLimitVolt_cmd = setVoltCMD(BatChgLimitVolt!, firstcmd: "E006") userArr.append(BatChgLimitVolt_cmd) let BatImprovChgVolt = shareParamDict[key.BatImprovChgVolt] // 提升充电电压/过充电压 let BatImprovChgVolt_cmd = setVoltCMD(BatImprovChgVolt!, firstcmd: "E008") userArr.append(BatImprovChgVolt_cmd) let BatFloatChgVolt = shareParamDict[key.BatFloatChgVolt] //浮充充电电压 /过充返回电压 let BatFloatChgVolt_cmd = setVoltCMD(BatFloatChgVolt!, firstcmd: "E009") userArr.append(BatFloatChgVolt_cmd) let BatImprovChgBackVolt = shareParamDict[key.BatImprovChgBackVolt] // 提升充电返回电压 let BatImprovChgBackVolt_cmd = setVoltCMD(BatImprovChgBackVolt!, firstcmd: "E00A") userArr.append(BatImprovChgBackVolt_cmd) let BatImprovChgTime = shareParamDict[key.BatImprovChgTime] //提升充电时间 let BatImprovChgTime_cmd = String(format: "FF06E012%04X", Int(BatImprovChgTime!)!) userArr.append(BatImprovChgTime_cmd) //------------------------------ let CoeffTemperCompen = shareParamDict[key.CoeffTemperCompen] // 温度补偿系数 let CoeffTemperCompen_cmd = String(format: "FF06E014%04X", Int(CoeffTemperCompen!)!) userArr.append(CoeffTemperCompen_cmd) commentArr.append(CoeffTemperCompen_cmd) //------------------------ let BatConstChgVolt = shareParamDict[key.BatConstChgVolt] // 均衡充电电压 let BatConstChgVolt_cmd = setVoltCMD(BatConstChgVolt!, firstcmd: "E007") userArr.append(BatConstChgVolt_cmd) let BatConstChgTime = shareParamDict[key.BatConstChgTime] // 均衡充电时间 let BatConstChgTime_cmd = String(format: "FF06E011%04X", Int(BatConstChgTime!)!) userArr.append(BatConstChgTime_cmd) let BatConstChgGapTime = shareParamDict[key.BatConstChgGapTime] // 均衡充电间隔 /自动均衡 let BatConstChgGapTime_cmd = String(format: "FF06E013%04X", Int(BatConstChgGapTime!)!) userArr.append(BatConstChgGapTime_cmd) if self.isOld == false { let BattEqualChgImmediate = shareParamDict[key.BattEqualChgImmediate] // 手动均衡 let BattEqualChgImmediate_cmd = String(format: "FF06DF0D%04X", Int(BattEqualChgImmediate!)!) userArr.append(BattEqualChgImmediate_cmd) } let BatOverDischgBackVolt = shareParamDict[key.BatOverDischgBackVolt] //过放返回电压 let BatOverDischgBackVolt_cmd = setVoltCMD(BatOverDischgBackVolt!, firstcmd: "E00B") userArr.append(BatOverDischgBackVolt_cmd) let BatUnderVolt = shareParamDict[key.BatUnderVolt] // 欠压警告电压 let BatUnderVolt_cmd = setVoltCMD(BatUnderVolt!, firstcmd: "E00C") userArr.append(BatUnderVolt_cmd) let BatOverDischgVolt = shareParamDict[key.BatOverDischgVolt] // 过放电压 let BatOverDischgVolt_cmd = setVoltCMD(BatOverDischgVolt!, firstcmd: "E00D") userArr.append(BatOverDischgVolt_cmd) let BatDischgLimitVolt = shareParamDict[key.BatDischgLimitVolt] //放电限制电压 let BatDischgLimitVolt_cmd = setVoltCMD(BatDischgLimitVolt!, firstcmd: "E00E") userArr.append(BatDischgLimitVolt_cmd) let BatOverDischgDelayTime = shareParamDict[key.BatOverDischgDelayTime] //过放延时时间 let BatOverDischgDelayTime_cmd = setVoltCMD(BatOverDischgDelayTime!, firstcmd: "E010") userArr.append(BatOverDischgDelayTime_cmd) //============================================== if self.isOld == false { let DisChagMaxTemper = shareParamDict[key.DisChagMaxTemper] // 放电上限温度 if DisChagMaxTemper != "--"{ let DisChagMaxTemper_cmd = String(format: "FF06E017%04X", Int(DisChagMaxTemper!)!) userArr.append(DisChagMaxTemper_cmd) commentArr.append(DisChagMaxTemper_cmd) liArr.append(DisChagMaxTemper_cmd) } let DisChaMinTemper = shareParamDict[key.DisChaMinTemper] // 放电下限温度 if DisChaMinTemper != "--"{ // 先判断正负 var DisChaMinTemper_cmd = "" let DisChaMinTemperInt = Int(DisChaMinTemper!) if DisChaMinTemperInt! < 0 { //负数 let resutA1 = DisChaMinTemper!.subString(start: 1) let resubB1 = Int(resutA1) let resubC1 = resubB1! | 128 DisChaMinTemper_cmd = String(format: "FF06E018%04X", resubC1) // 转化为十六进制 }else{// 正数 DisChaMinTemper_cmd = String(format: "FF06E018%04X", DisChaMinTemperInt!) } userArr.append(DisChaMinTemper_cmd) commentArr.append(DisChaMinTemper_cmd) liArr.append(DisChaMinTemper_cmd) } } let DcLoadMode = shareParamDict[key.DcLoadMode] // 直流工作模式 let DcLoadMode_cmd = String(format: "FF06E01D%04X", Int(DcLoadMode!)!) userArr.append(DcLoadMode_cmd) commentArr.append(DcLoadMode_cmd) liArr.append(DcLoadMode_cmd) let LightCtrlDelayTime = shareParamDict[key.LightCtrlDelayTime] //光控延时时间 let LightCtrlDelayTime_cmd = String(format: "FF06E01E%04X", Int(LightCtrlDelayTime!)!) userArr.append(LightCtrlDelayTime_cmd) commentArr.append(LightCtrlDelayTime_cmd) liArr.append(LightCtrlDelayTime_cmd) let LightCtrlVolt = shareParamDict[key.LightCtrlVolt] // 光控电压 let LightCtrlVolt_cmd = setVoltCMD(LightCtrlVolt!, firstcmd: "E01F") userArr.append(LightCtrlVolt_cmd) commentArr.append(LightCtrlVolt_cmd) liArr.append(LightCtrlVolt_cmd) let tx = shareParamDict[key.tx] var tx_funcStr = "" if tx == "000"{ tx_funcStr = "0000" }else if tx == "001"{ tx_funcStr = "0200" }else if tx == "010"{ tx_funcStr = "0400" }else if tx == "011"{ tx_funcStr = "0600" }else if tx == "100"{ tx_funcStr = "0800" } let tx_cmd = "FF10E021" + tx_funcStr userArr.append(tx_cmd) commentArr.append(tx_cmd) liArr.append(tx_cmd) let rx = shareParamDict[key.rx] var rx_funcStr = "" if rx == "000"{ rx_funcStr = "0000" }else if rx == "001"{ rx_funcStr = "1000" }else if rx == "010"{ rx_funcStr = "2000" }else if rx == "011"{ rx_funcStr = "3000" }else if rx == "100"{ rx_funcStr = "4000" } let rx_cmd = "FF10E021" + rx_funcStr userArr.append(rx_cmd) commentArr.append(rx_cmd) liArr.append(rx_cmd) importCMDArr.removeAll() if BatTypeSet == "0"{ self.importCMDArr = userArr }else if BatTypeSet == "6"{ self.importCMDArr = liArr }else{ self.importCMDArr = commentArr } } // 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 } } func setVoltCMD(_ Volt :String,firstcmd:String) -> String { let VoltFloat = (Volt as NSString).doubleValue let VoltData = VoltFloat * 10 let Volt_cmd = String(format: "FF06%@%04X", firstcmd,VoltData) // 转化为十六进制 return Volt_cmd } // 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 } /* */