SBTPramSettingVCtr.swift 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
  1. //
  2. // SBTPramSettingVCtr.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/3/13.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import SwiftyJSON
  10. import PKHUD
  11. extension FileManager{
  12. // 判断是否是文件夹的方法
  13. static func directoryIsExists (path: String) -> Bool {
  14. var directoryExists = ObjCBool.init(false)
  15. let fileExists = FileManager.default.fileExists(atPath: path, isDirectory: &directoryExists)
  16. return fileExists && directoryExists.boolValue
  17. }
  18. }
  19. struct ParamData {
  20. //参数设置
  21. var BatRateVolt :String? //系统电压设置
  22. var BatTypeSet :String? // 蓄电池类型
  23. var BatOverVolt :String? //超压电压
  24. var BatChgLimitVolt :String? //充电限制电压
  25. var BatConstChgVolt :String? // 均衡充电电压
  26. var BatImprovChgVolt :String? // 提升充电电压/过充电压
  27. var BatFloatChgVolt :String? //浮充充电电压 /过充返回电压
  28. var BatImprovChgBackVolt :String? // 提升充电返回电压
  29. var BatOverDischgBackVolt :String? //过放返回电压
  30. var BatUnderVolt :String? // 欠压警告电压
  31. var BatOverDischgVolt :String? // 过放电压
  32. var BatDischgLimitVolt :String? //放电限制电压
  33. var BatOverDischgDelayTime:String? //过放延时时间
  34. var BatConstChgTime :String? // 均衡充电时间
  35. var BatImprovChgTime :String? //提升充电时间
  36. var BatConstChgGapTime :String? // 均衡充电间隔
  37. var CoeffTemperCompen:String? // 温度补偿系数
  38. var ChgMaxTemper :String? // 充电上限温度
  39. var ChgMinTemper :String? // 充电下限温度
  40. var DisChagMaxTemper :String? // 放电上限温度
  41. var DisChaMinTemper:String? // 放电下限温度
  42. var DcLoadMode :String? // 直流工作模式
  43. var LightCtrlDelayTime :String? //光控延时时间
  44. var LightCtrlVolt:String? // 光控电压
  45. var tx :String?
  46. var rx :String? ;
  47. var BattEqualChgImmediate :String? // 手动均衡
  48. var CmdPowerOnOff:String? // 开关控制
  49. }
  50. class SBTPramSettingVCtr: UIViewController {
  51. var batRateVolt : String?
  52. var isAuto : Bool? = false
  53. var readBtn : UIButton?
  54. var callback:(()->Void)?
  55. var batterCell : SBTParamSet_BatteryCell?
  56. var peripheralName :String?
  57. var MaxVoltage: String?
  58. var IchageRage : String?
  59. var set_deviceName :String?
  60. var isOld :Bool?
  61. var charge_USER_Arr :[String]? = [String]()
  62. var charge_FLD_Arr :[String]? = [String]()
  63. var charge_SLD_Arr :[String]? = [String]()
  64. var charge_GEL_Arr :[String]? = [String]()
  65. var charge_LI_Arr :[String]? = [String]()
  66. var deviceName:String? // 设备名称
  67. var paramDataDict : [String: Any] = [String: Any]()
  68. let key: DeviceDictKey = DeviceDictKey()
  69. var bleKey :String?
  70. //放大倍数
  71. var Multiple : Float? = 1 // 默认为1倍
  72. var maxVolt :String? // 系统最大电压
  73. var isDemo: Bool?
  74. var fileURL : URL?
  75. lazy var device = DeviceData()
  76. var batteryArr:[String]? = [String]()
  77. var chargerArr:[String]? = [String]()
  78. var loadArr :[String]? = [String]()
  79. var txArr :[String]? = [String]()
  80. var rxArr :[String]? = [String]()
  81. var autoRecognition :Bool?
  82. var paramData:ParamData?
  83. @IBOutlet weak var tableView: UITableView!
  84. let batteryCellID = "battery"
  85. let chargerCellID = "charger"
  86. let loadCellID = "loadcell"
  87. let TxCellID = "txCell"
  88. let RxCellID = "RxCell"
  89. var isExpandArray = [String]()
  90. var foldLabelDict :NSMutableDictionary?
  91. override func viewDidAppear(_ animated: Bool) {
  92. super.viewDidAppear(animated)
  93. self.readBtn?.isEnabled = false
  94. //读取一遍数据
  95. if self.isDemo == false {
  96. delay(1) {
  97. self.readName()
  98. }
  99. delay(1.5) {
  100. self.readAction()
  101. self.readBtn?.isEnabled = true
  102. }
  103. }
  104. }
  105. override func viewWillDisappear(_ animated: Bool) {
  106. super.viewWillDisappear(animated)
  107. if self.callback != nil {
  108. self.callback!()
  109. }
  110. }
  111. override func viewWillAppear(_ animated: Bool) {
  112. super.viewWillAppear(animated)
  113. notificationRegister()
  114. }
  115. @objc func readName() {
  116. BabyBluetoothSwift.shareInstance()?.writeData2222(["FF0300490020"], completionHandler: { (result) in
  117. self.readdata_0049(result!["FF0300490020"] as! String)
  118. })
  119. }
  120. override func viewDidDisappear(_ animated: Bool) {
  121. super.viewDidDisappear(animated)
  122. notificationUnRegister()
  123. if self.callback != nil {
  124. self.callback!()
  125. }
  126. }
  127. override func viewDidLoad() {
  128. super.viewDidLoad()
  129. // self.title = "参数设置"
  130. checkTheBlueToothWasActivity()
  131. // Do any additional setup after loading the view.
  132. initParam()
  133. createUI()
  134. if self.isDemo == true {
  135. let data = SBTData()
  136. initData(data.DemoData)
  137. }else{
  138. let plist = CLDeviceDataPlist()
  139. let dataDict = plist.findData(deviceDetailPlist, key: self.bleKey!)
  140. // log.debug("-------------aekqwefknakofn== \(dataDict)")
  141. initData(dataDict as! [String : Any])
  142. }
  143. }
  144. //注册通知、 获取数据
  145. func notificationRegister() {
  146. NotificationCenter.default.addObserver(self, selector: #selector(notifitionToChangeBatteryType(_:)), name: NSNotification.Name(KNotifitionToChangeBatteryType), object: nil)
  147. }
  148. @objc func notifitionToChangeBatteryType(_ notifi:NSNotification) {
  149. chargerArr?.removeAll()
  150. //["自定义","密封铅酸SLD","开口铅酸FLD","胶体铅酸GEL","磷酸铁锂LI"]
  151. //{"batteryType": "0"}
  152. log.debug("f电池类型更改1 --- \(notifi.userInfo ?? Dictionary())")
  153. let dict = notifi.userInfo
  154. let batteryType = dict!["batteryType"] as! String
  155. log.debug("---电池类型 -- \(batteryType)")
  156. switch batteryType {
  157. case "0":
  158. chargerArr = charge_USER_Arr
  159. case "1":
  160. chargerArr = charge_FLD_Arr
  161. case "2":
  162. chargerArr = charge_SLD_Arr
  163. case "3":
  164. chargerArr = charge_GEL_Arr
  165. case "4":
  166. chargerArr = charge_LI_Arr
  167. default:
  168. break
  169. }
  170. self.tableView.reloadData()
  171. }
  172. //注销通知
  173. func notificationUnRegister() {
  174. NotificationCenter.default.removeObserver(self)
  175. }
  176. }
  177. extension SBTPramSettingVCtr {
  178. func initData(_ dataDict: [String:Any]) {
  179. let def = UserDefaults.standard
  180. let iSTemp = def.object(forKey: TEMPISCENTIGRADE) as? String
  181. chargerArr?.removeAll()
  182. loadArr?.removeAll()
  183. txArr?.removeAll()
  184. rxArr?.removeAll()
  185. batteryArr?.removeAll()
  186. charge_USER_Arr?.removeAll()
  187. charge_FLD_Arr?.removeAll()
  188. charge_SLD_Arr?.removeAll()
  189. charge_GEL_Arr?.removeAll()
  190. charge_LI_Arr?.removeAll()
  191. paramData = nil
  192. let key = DeviceDictKey()
  193. //参数设置
  194. let autoRecogn = dataDict[key.autoRecognition] as! String // 是否自动识别
  195. if autoRecogn == "1"{
  196. autoRecognition = true
  197. }else{
  198. autoRecognition = false
  199. }
  200. let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置
  201. //当前系统电压值
  202. let batBateVoltInt = Float(BatRateVolt)
  203. let multiple = batBateVoltInt! / 12.0
  204. self.Multiple = multiple
  205. let BatTypeSet = dataDict[key.BatTypeSet] as! String // 蓄电池类型
  206. let maxVolt = dataDict[key.MaxVolt] as!String // 系统支持的最大电压
  207. self.maxVolt = maxVolt
  208. switch BatTypeSet {
  209. case "自定义":
  210. AppShare.batteryType = .USER
  211. case "开口铅酸FLD":
  212. AppShare.batteryType = .FLD
  213. case "密封铅酸SLD":
  214. AppShare.batteryType = .SLD
  215. case "胶体铅酸GEL":
  216. AppShare.batteryType = .GEL
  217. case "锂LI":
  218. AppShare.batteryType = .LI
  219. default:
  220. break
  221. }
  222. if self.isOld == true {
  223. }
  224. var IchageRage = dataDict[key.MaxChargeCurrent] as! String //最大充电电流
  225. if isOld == true {
  226. IchageRage = dataDict[key.IchageRage] as! String
  227. }
  228. chargerArr?.append(IchageRage)
  229. charge_USER_Arr?.append(IchageRage)
  230. let CmdPowerOnOff = dataDict[key.CmdPowerOnOff] as! String // 开关控制
  231. if self.isOld == true {
  232. let CmdPowerOnOff1 = "On".da_localizedStr()
  233. self.chargerArr?.append(CmdPowerOnOff1)
  234. }else{
  235. self.chargerArr?.append(CmdPowerOnOff)
  236. }
  237. var ChgMaxTemper = dataDict[key.ChgMaxTemper] as! String// 充电上限温度
  238. if iSTemp == "0" {
  239. ChgMaxTemper = ChgMaxTemper.centigradeToFahrenheit_int()
  240. }
  241. if self.isOld == true {
  242. ChgMaxTemper = "--"
  243. }
  244. chargerArr?.append(ChgMaxTemper)
  245. var ChgMinTemper = dataDict[key.ChgMinTemper] as! String // 充电下限温度
  246. if iSTemp == "0" {
  247. ChgMinTemper = ChgMinTemper.centigradeToFahrenheit_int()
  248. }
  249. if self.isOld == true {
  250. ChgMinTemper = "--"
  251. }
  252. chargerArr?.append(ChgMinTemper)
  253. /*---------------电压扩大n倍----------*/
  254. let BatOverVolt = dataDict[key.BatOverVolt] as! String //超压电压
  255. chargerArr?.append(voltEnlage(BatOverVolt))
  256. /*---------------电压扩大n倍----------*/
  257. let BatChgLimitVolt = dataDict[key.BatChgLimitVolt] as! String //充电限制电压
  258. chargerArr?.append(voltEnlage(BatChgLimitVolt))
  259. /*---------------电压扩大n倍----------*/
  260. let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String // 提升充电电压/过充电压
  261. chargerArr?.append(voltEnlage(BatImprovChgVolt))
  262. /*---------------电压扩大n倍----------*/
  263. let BatFloatChgVolt = dataDict[key.BatFloatChgVolt] as! String//浮充充电电压 /过充返回电压
  264. chargerArr?.append(voltEnlage(BatFloatChgVolt))
  265. /*---------------电压扩大n倍----------*/
  266. let BatImprovChgBackVolt = dataDict[key.BatImprovChgBackVolt] as! String // 提升充电返回电压
  267. chargerArr?.append(voltEnlage(BatImprovChgBackVolt))
  268. let BatImprovChgTime = dataDict[key.BatImprovChgTime] as! String //提升充电时间
  269. chargerArr?.append(BatImprovChgTime)
  270. let CoeffTemperCompen = dataDict[key.CoeffTemperCompen] as! String // 温度补偿系数
  271. if CoeffTemperCompen == "0"{
  272. let CoeffTemperCompenSt1 = "0"
  273. self.chargerArr?.append(CoeffTemperCompenSt1)
  274. }else{
  275. let CoeffTemperCompenStr = "-\(CoeffTemperCompen)"
  276. self.chargerArr?.append(CoeffTemperCompenStr)
  277. }
  278. /*---------------电压扩大n倍----------*/
  279. let BatConstChgVolt = dataDict[key.BatConstChgVolt] as! String // 均衡充电电压
  280. chargerArr?.append(voltEnlage(BatConstChgVolt))
  281. let BatConstChgTime = dataDict[key.BatConstChgTime] as! String // 均衡充电时间
  282. chargerArr?.append(BatConstChgTime)
  283. let BatConstChgGapTime = dataDict[key.BatConstChgGapTime] as! String // 均衡充电间隔
  284. chargerArr?.append(BatConstChgGapTime)
  285. let BattEqualChgImmediate = dataDict[key.BattEqualChgImmediate] as! String// 手动均衡
  286. chargerArr?.append(BattEqualChgImmediate)
  287. /*---------------电压扩大n倍----------*/
  288. let BatOverDischgBackVolt = dataDict[key.BatOverDischgBackVolt] as! String //过放返回电压
  289. chargerArr?.append(voltEnlage(BatOverDischgBackVolt))
  290. /*---------------电压扩大n倍----------*/
  291. let BatUnderVolt = dataDict[key.BatUnderVolt] as! String // 欠压警告电压
  292. chargerArr?.append(voltEnlage(BatUnderVolt))
  293. /*---------------电压扩大n倍----------*/
  294. let BatOverDischgVolt = dataDict[key.BatOverDischgVolt] as! String// 过放电压
  295. chargerArr?.append(voltEnlage(BatOverDischgVolt))
  296. /*---------------电压扩大n倍----------*/
  297. let BatDischgLimitVolt = dataDict[key.BatDischgLimitVolt] as! String //放电限制电压
  298. chargerArr?.append(voltEnlage(BatDischgLimitVolt))
  299. let BatOverDischgDelayTime = dataDict[key.BatOverDischgDelayTime] as! String //过放延时时间
  300. chargerArr?.append(BatOverDischgDelayTime)
  301. var DisChagMaxTemper = dataDict[key.DisChagMaxTemper] as! String // 放电上限温度
  302. if iSTemp == "0" {
  303. DisChagMaxTemper = DisChagMaxTemper.centigradeToFahrenheit_int()
  304. }
  305. if self.isOld == true {
  306. DisChagMaxTemper = "--"
  307. }
  308. chargerArr?.append(DisChagMaxTemper)
  309. var DisChaMinTemper = dataDict[key.DisChaMinTemper] as! String // 放电下限温度
  310. if iSTemp == "0" {
  311. DisChaMinTemper = DisChaMinTemper.centigradeToFahrenheit_int()
  312. }
  313. if self.isOld == true {
  314. DisChaMinTemper = "--"
  315. }
  316. chargerArr?.append(DisChaMinTemper)
  317. /*******默认数据****/
  318. /// 自定义
  319. charge_USER_Arr = [IchageRage,CmdPowerOnOff,"65","-30",
  320. voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("13.8"),voltEnlage("13.2"),
  321. "120","-3",
  322. voltEnlage("14.6"),
  323. "120","30",BattEqualChgImmediate,
  324. voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"),
  325. "5","",""]
  326. charge_SLD_Arr = [IchageRage,CmdPowerOnOff,"65","-30",
  327. voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("13.8"),voltEnlage("13.2"),
  328. "120","-3",
  329. voltEnlage("14.6"),
  330. "120","30",BattEqualChgImmediate,
  331. voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"),
  332. "5","",""]
  333. charge_FLD_Arr = [IchageRage,CmdPowerOnOff,"65","-30",
  334. voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.6"),voltEnlage("13.8"),voltEnlage("13.2"),
  335. "120","-3",
  336. voltEnlage("14.6"),
  337. "120","30",BattEqualChgImmediate,
  338. voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"),
  339. "5",DisChagMaxTemper,DisChaMinTemper]
  340. charge_GEL_Arr = [IchageRage,CmdPowerOnOff,"65","-30",
  341. voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.2"),voltEnlage("13.8"),voltEnlage("13.2"),
  342. "120","-3",
  343. voltEnlage("14.6"),
  344. "120","30",BattEqualChgImmediate,
  345. voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"),
  346. "5",DisChagMaxTemper,DisChaMinTemper]
  347. charge_LI_Arr = [IchageRage,CmdPowerOnOff,"65","-30",
  348. voltEnlage("16.0"),voltEnlage("15.5"),voltEnlage("14.4"),voltEnlage("14.4"),voltEnlage("13.2"),
  349. "-120-","0",
  350. voltEnlage("14.6"),
  351. "120","30",BattEqualChgImmediate,
  352. voltEnlage("12.6"),voltEnlage("12.0"),voltEnlage("11.1"),voltEnlage("10.6"),
  353. "5",DisChagMaxTemper,DisChaMinTemper]
  354. let DcLoadMode = dataDict[key.DcLoadMode] as! String // 直流工作模式
  355. loadArr?.append(DcLoadMode)
  356. let LightCtrlDelayTime = dataDict[key.LightCtrlDelayTime] as! String //光控延时时间
  357. loadArr?.append(LightCtrlDelayTime)
  358. let LightCtrlVolt = dataDict[key.LightCtrlVolt] as! String // 光控电压
  359. loadArr?.append(LightCtrlVolt)
  360. // let tx = dataDict[key.tx] as! String
  361. var tx = "Normal_communication".da_localizedStr()
  362. if self.isOld == true{
  363. tx = ""
  364. }
  365. txArr?.append(tx)
  366. // let rx = dataDict[key.rx] as! String
  367. var rx = "Normal_communication".da_localizedStr()
  368. if self.isOld == true {
  369. rx = ""
  370. }
  371. rxArr?.append(rx)
  372. paramData = ParamData(BatRateVolt: BatRateVolt,
  373. BatTypeSet: BatTypeSet,
  374. BatOverVolt: BatOverVolt,
  375. BatChgLimitVolt: BatChgLimitVolt,
  376. BatConstChgVolt: BatConstChgVolt,
  377. BatImprovChgVolt: BatImprovChgVolt,
  378. BatFloatChgVolt: BatFloatChgVolt,
  379. BatImprovChgBackVolt: BatImprovChgBackVolt,
  380. BatOverDischgBackVolt: BatOverDischgBackVolt,
  381. BatUnderVolt: BatUnderVolt,
  382. BatOverDischgVolt: BatOverDischgVolt,
  383. BatDischgLimitVolt: BatDischgLimitVolt,
  384. BatOverDischgDelayTime: BatOverDischgDelayTime,
  385. BatConstChgTime: BatConstChgTime,
  386. BatImprovChgTime: BatImprovChgTime,
  387. BatConstChgGapTime: BatConstChgGapTime,
  388. CoeffTemperCompen: CoeffTemperCompen,
  389. ChgMaxTemper: ChgMaxTemper,
  390. ChgMinTemper: ChgMinTemper,
  391. DisChagMaxTemper: DisChagMaxTemper,
  392. DisChaMinTemper: DisChaMinTemper,
  393. DcLoadMode: DcLoadMode,
  394. LightCtrlDelayTime: LightCtrlDelayTime,
  395. LightCtrlVolt: LightCtrlVolt,
  396. tx: tx,
  397. rx: rx,
  398. BattEqualChgImmediate: BattEqualChgImmediate,
  399. CmdPowerOnOff: CmdPowerOnOff)
  400. batteryArr?.append(BatRateVolt)
  401. batteryArr?.append(BatTypeSet)
  402. log.debug("负载 - \(loadArr!)")
  403. log.debug("充电器- \(chargerArr!)")
  404. self.tableView.reloadData()
  405. }
  406. //电压放大倍数
  407. func voltEnlage(_ volt:String) -> String {
  408. let VoltFloat = Float(volt)
  409. let VoltEnlarge = VoltFloat! * self.Multiple!
  410. let VoltEnlargeStr = String(format: "%.1f", VoltEnlarge)
  411. return VoltEnlargeStr
  412. }
  413. func initParam() {
  414. for _ in 0..<5 {
  415. isExpandArray.append("0")//0 没展开 1 展开
  416. }
  417. }
  418. func createUI() {
  419. setNavigationBar()
  420. self.tableView.delegate = self
  421. self.tableView.dataSource = self
  422. self.tableView.separatorStyle = .none
  423. self.tableView.backgroundColor = UIColor.white
  424. self.tableView.register(UINib(nibName: "SBTParamSet_BatteryCell", bundle: nil), forCellReuseIdentifier: batteryCellID)
  425. self.tableView.register(UINib(nibName: "SBTParamSet_ChargerCell", bundle: nil), forCellReuseIdentifier: chargerCellID)
  426. self.tableView.register(UINib(nibName: "SBTParamSet_LoadCell", bundle: nil), forCellReuseIdentifier: loadCellID)
  427. self.tableView.register(UINib(nibName: "SBTParamSet_TXCell", bundle: nil), forCellReuseIdentifier: TxCellID)
  428. self.tableView.register(UINib(nibName: "SBTParamSet_RXCell", bundle: nil), forCellReuseIdentifier: RxCellID)
  429. self.tableView.register(headerFooterViewClassWith: SBTHeaderView.self)
  430. }
  431. func setNavigationBar() {
  432. let titleView = UIView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH - 150, height: 44))
  433. //titleView.backgroundColor = UIColor.red
  434. self.navigationItem.titleView = titleView
  435. let label = UILabel()
  436. label.text = "Parameter_settings".da_localizedStr()
  437. label.textColor = UIColor(hexString: "#222222")
  438. label.font = UIFont(name: PingFangSC_Semibold, size: 19)
  439. // label.backgroundColor = UIColor.green
  440. let labelW = label.getWidth(byHeight: 44, title: "Parameter_settings".da_localizedStr(), font: UIFont(name: PingFangSC_Semibold, size: 19)!)
  441. label.frame = CGRect(x: 0, y: 0, width: labelW + 20 , height: 44)
  442. titleView.addSubview(label)
  443. // 12
  444. let readBtn = UIButton(type: .custom)
  445. //设置rect
  446. readBtn.frame = CGRect(x: labelW + 15 + 20 , y: 10, width: 51, height: 25)
  447. //设置渐变色
  448. let bgLayer1 = CAGradientLayer()
  449. 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]
  450. bgLayer1.locations = [0, 1]
  451. bgLayer1.frame = readBtn.bounds
  452. bgLayer1.startPoint = CGPoint(x: 1, y: 1)
  453. bgLayer1.endPoint = CGPoint(x: 0, y: 0)
  454. readBtn.layer.addSublayer(bgLayer1)
  455. readBtn.layer.cornerRadius = 12.5
  456. readBtn.layer.masksToBounds = true
  457. readBtn.setTitle("Read".da_localizedStr(), for: .normal)
  458. readBtn.setTitleColor(UIColor.white, for: .normal)
  459. readBtn.titleLabel?.font = UIFont(name: PingFangSC_Medium, size: 11)
  460. readBtn.addTarget(self, action: #selector(readAction), for: .touchUpInside)
  461. titleView.addSubview(readBtn)
  462. self.readBtn = readBtn
  463. let uploadBtn = UIBarButtonItem.createBarbuttonItem(image: "上传", highImage: "上传", target: self, action: #selector(uploadAction))
  464. let downloadBtn = UIBarButtonItem.createBarbuttonItem(image: "导入", highImage: "导入", target: self, action: #selector(downloadAction))
  465. //设置空白展位bar
  466. let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
  467. spaceItem.width = 20
  468. self.navigationItem.rightBarButtonItems = [downloadBtn,spaceItem,uploadBtn]
  469. }
  470. @objc func uploadAction() {
  471. readAction()
  472. let setFileName = SBTSetFileNameVCtr()
  473. setFileName.show()
  474. setFileName.saveCallBack = {(fileName) in
  475. log.debug("保存文件 --\(fileName)")
  476. // if fileName?.isEmpty == true || fileName?.count == 0 {
  477. // HUD.flash(.error, delay: 1)
  478. // return
  479. // }
  480. log.debug("-----\\输入的文件名称 --- \(fileName)")
  481. var filenameStr = ""
  482. let alert = SBTExportDataVCtr()
  483. if self.isDemo == true {
  484. //
  485. alert.alartTitle = "Simulation_experience".da_localizedStr()
  486. }else{
  487. //let name =
  488. alert.alartTitle = self.set_deviceName!
  489. }
  490. alert.loadingImage = UIImage(named: "export")
  491. alert.message = "Paramter_export".da_localizedStr()
  492. alert.show()
  493. alert.dismiss(2)
  494. //
  495. if fileName == "" || fileName == nil {
  496. filenameStr = "paramter"
  497. }else{
  498. filenameStr = fileName!
  499. }
  500. log.debug("最后显示的文件名称 === \(filenameStr)")
  501. self.perform(#selector(self.getUploadData), with: filenameStr, afterDelay: 1.5)
  502. }
  503. setFileName.completeHandle = {(filename) in
  504. // if filename?.isEmpty == true || filename?.count == 0 {
  505. // HUD.flash(.error, delay: 1)
  506. // return
  507. // }
  508. log.debug("-----\\输入的文件名称 --- \(filename)")
  509. var filenameStr = ""
  510. let alert = SBTExportDataVCtr()
  511. if self.isDemo == true {
  512. //
  513. alert.alartTitle = "Simulation_experience".da_localizedStr()
  514. }else{
  515. //let name =
  516. alert.alartTitle = self.set_deviceName!
  517. }
  518. alert.loadingImage = UIImage(named: "export")
  519. alert.message = "Paramter_export".da_localizedStr()
  520. alert.show()
  521. alert.dismiss(2)
  522. //
  523. if filename == "" || filename == nil {
  524. filenameStr = "paramter"
  525. }else{
  526. filenameStr = filename!
  527. }
  528. log.debug("最后显示的文件名称 === \(filenameStr)")
  529. self.perform(#selector(self.getUploadData), with: filenameStr, afterDelay: 1.5)
  530. self.perform(#selector(self.shareAction), with: nil, afterDelay: 2)
  531. }
  532. }
  533. //匹配数据
  534. func StringToNumber(_ dict : [String:Any]) -> [String:Any] {
  535. let key = DeviceDictKey()
  536. var ParamDict = dict
  537. let tx = dict[key.tx] as! String
  538. let rx = dict[key.rx] as! String
  539. let BattEqualChgImmediate = dict[key.BattEqualChgImmediate] as! String
  540. let BatTypeSet = dict[key.BatTypeSet] as! String
  541. let DcLoadMode = dict[key.DcLoadMode] as! String
  542. let CmdPowerOnOff = dict[key.CmdPowerOnOff] as! String
  543. var tx_cmd = ""
  544. if tx == "正常通讯" || tx == "Normal communication" {
  545. tx_cmd = "000"
  546. }
  547. var rx_cmd = ""
  548. if rx == "正常通讯" || rx == "Normal communication" {
  549. rx_cmd = "000"
  550. }
  551. var canhandle = ""
  552. if BattEqualChgImmediate == "禁止" || BattEqualChgImmediate == "Prohibited" {
  553. canhandle = "0"
  554. }else if BattEqualChgImmediate == "使能" || BattEqualChgImmediate == "Enable"{
  555. canhandle = "1"
  556. }
  557. var batterytype = ""
  558. switch BatTypeSet {
  559. case "自定义" :
  560. batterytype = "0"
  561. case "开口铅酸FLD":
  562. batterytype = "1"
  563. case "密封铅酸SLD":
  564. batterytype = "2"
  565. case "胶体铅酸GEL":
  566. batterytype = "3"
  567. case "锂LI":
  568. batterytype = "4"
  569. case "User-defined" :
  570. batterytype = "0"
  571. case "Vented lead acid battery FLD":
  572. batterytype = "1"
  573. case "Lead acid battery SLD":
  574. batterytype = "2"
  575. case "Gel lead acid GEL":
  576. batterytype = "3"
  577. case "Lithium LI":
  578. batterytype = "4"
  579. default:
  580. break
  581. }
  582. var loadwordmode = ""
  583. switch DcLoadMode {
  584. case "光控":
  585. loadwordmode = "0"
  586. case "光控,延时1小时":
  587. loadwordmode = "1"
  588. case "光控,延时2小时":
  589. loadwordmode = "2"
  590. case "光控,延时3小时":
  591. loadwordmode = "3"
  592. case "光控,延时4小时":
  593. loadwordmode = "4"
  594. case "光控,延时5小时":
  595. loadwordmode = "5"
  596. case "光控,延时6小时":
  597. loadwordmode = "6"
  598. case "光控,延时7小时":
  599. loadwordmode = "7"
  600. case "光控,延时8小时":
  601. loadwordmode = "8"
  602. case "光控,延时9小时":
  603. loadwordmode = "9"
  604. case "光控,延时10小时":
  605. loadwordmode = "10"
  606. case "光控,延时11小时":
  607. loadwordmode = "11"
  608. case "光控,延时12小时":
  609. loadwordmode = "12"
  610. case "光控,延时13小时":
  611. loadwordmode = "13"
  612. case "光控,延时14小时":
  613. loadwordmode = "14"
  614. case "手动模式":
  615. loadwordmode = "15"
  616. case "调试模式":
  617. loadwordmode = "16"
  618. case "常开模式":
  619. loadwordmode = "17"
  620. case "定时模式":
  621. loadwordmode = "18"
  622. case "Light control":
  623. loadwordmode = "0"
  624. case "Light control, delay 1 hour":
  625. loadwordmode = "1"
  626. case "Light control, delay 2 hours":
  627. loadwordmode = "2"
  628. case "Light control, delay 3 hours":
  629. loadwordmode = "3"
  630. case "Light control, delay 4 hours":
  631. loadwordmode = "4"
  632. case "Light control, delay 5 hours":
  633. loadwordmode = "5"
  634. case "Light control, delay 6 hours":
  635. loadwordmode = "6"
  636. case "Light control, delay 7 hours":
  637. loadwordmode = "7"
  638. case "Light control, delay 8 hours":
  639. loadwordmode = "8"
  640. case "Light control, delay 9 hours":
  641. loadwordmode = "9"
  642. case "Light control, delay 10 hours":
  643. loadwordmode = "10"
  644. case "Light control, delay 11 hours":
  645. loadwordmode = "11"
  646. case "Light control, delay 12 hours":
  647. loadwordmode = "12"
  648. case "Light control, delay 13 hours":
  649. loadwordmode = "13"
  650. case "Light control, delay 14 hours":
  651. loadwordmode = "14"
  652. case "Manual mode":
  653. loadwordmode = "15"
  654. case "Debug mode":
  655. loadwordmode = "16"
  656. case "Normal-on mode":
  657. loadwordmode = "17"
  658. case "Timed mode":
  659. loadwordmode = "18"
  660. default:
  661. break
  662. }
  663. var power_cmd = ""
  664. if CmdPowerOnOff == "关" || CmdPowerOnOff == "Off" {
  665. power_cmd = "0"
  666. }else if CmdPowerOnOff == "开" || CmdPowerOnOff == "On"{
  667. power_cmd = "1"
  668. }
  669. ParamDict[key.tx] = tx_cmd
  670. ParamDict[key.rx] = rx_cmd
  671. ParamDict[key.BattEqualChgImmediate] = canhandle
  672. ParamDict[key.BatTypeSet] = batterytype
  673. ParamDict[key.DcLoadMode] = loadwordmode
  674. ParamDict[key.CmdPowerOnOff] = power_cmd
  675. return ParamDict
  676. }
  677. /// 处理分享数据数据
  678. @objc func getUploadData(_ filename :String) {
  679. log.debug("上传数据 -- \(paramDataDict)")
  680. var dict = [String:Any]()
  681. if self.isDemo == true {
  682. let dict0 = SBTData().DemoData
  683. //设置
  684. let key = DeviceDictKey()
  685. dict = ["BatImprovChgVolt": dict0[key.BatImprovChgVolt] as Any,
  686. "BatRateVolt": dict0[key.BatRateVolt] as Any,
  687. "CmdPowerOnOff": dict0[key.CmdPowerOnOff] as Any,
  688. "CoeffTemperCompen": dict0[key.CoeffTemperCompen]as Any,
  689. "BatOverVolt": dict0[key.BatOverVolt]as Any,
  690. "MaxChargeCurrent": dict0[key.MaxChargeCurrent]as Any,
  691. "BatOverDischgDelayTime": dict0[key.BatOverDischgDelayTime]as Any,
  692. "BattEqualChgImmediate": dict0[key.BattEqualChgImmediate]as Any,
  693. "BatImprovChgBackVolt": dict0[key.BatImprovChgBackVolt]as Any,
  694. "IchageRage": dict0[key.IchageRage]as Any,
  695. "MaxVolt": dict0[key.MaxVolt] as Any,
  696. "BatDischgLimitVolt": dict0[key.BatDischgLimitVolt] as Any,
  697. "BatOverDischgVolt": dict0[key.BatOverDischgVolt] as Any,
  698. "BatFloatChgVolt": dict0[key.BatFloatChgVolt]as Any,
  699. "BatImprovChgTime": dict0[key.BatImprovChgTime]as Any,
  700. "BatConstChgVolt": dict0[key.BatConstChgVolt]as Any,
  701. "BatChgLimitVolt": dict0[key.BatImprovChgVolt]as Any,
  702. "Tx": dict0[key.tx]as Any,
  703. "ChgMinTemper": dict0[key.ChgMinTemper]as Any,
  704. "DcLoadMode": dict0[key.DcLoadMode]as Any,
  705. "ChgMaxTemper": dict0[key.ChgMaxTemper]as Any,
  706. "autoRecognition": dict0[key.autoRecognition]as Any,
  707. "BatOverDischgBackVolt": dict0[key.BatOverDischgBackVolt]as Any,
  708. "LightCtrlDelayTime": dict0[key.LightCtrlDelayTime]as Any,
  709. "DisChagMinTemper": dict0[key.DisChaMinTemper]as Any,
  710. "DisChagMaxTemper": dict0[key.DisChagMaxTemper]as Any, "BatConstChgGapTime":dict0[key.BatConstChgGapTime]as Any,
  711. "Rx": dict0[key.rx]as Any,
  712. "LightCtrlVolt": dict0[key.LightCtrlVolt]as Any,
  713. "BatTypeSet": dict0[key.BatTypeSet]as Any,
  714. "BatUnderVolt": dict0[key.BatUnderVolt]as Any,
  715. "BatConstChgTime": dict0[key.BatConstChgTime]as Any]
  716. }else {
  717. dict = paramDataDict
  718. if self.isOld == true{
  719. dict["ChgMinTemper"] = "--"
  720. dict["ChgMaxTemper"] = "--"
  721. dict["DisChagMinTemper"] = "--"
  722. dict["DisChagMaxTemper"] = "--"
  723. }
  724. }
  725. let newDict = StringToNumber(dict)
  726. let dictStr = dicValueString(newDict)
  727. log.debug("字符串 \(dictStr!)")
  728. //处理数据
  729. // 1、 转成base64字符串
  730. let base64Str = dictStr?.toBase64()
  731. // 2、 开头增加三个随机字符
  732. let insetStr = String.randomStr(len: 3) + base64Str!
  733. // 3、 转成base64 字符串
  734. let reBase64Str = insetStr.toBase64()
  735. log.debug("分享字符串 \(reBase64Str!)")
  736. //获取设备名称
  737. // let devicename = paramDataDict["ProdctName"] as! String devicename + "Param.txt"
  738. let file = filename + ".txt"// this is the file. we will write to and read from it
  739. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  740. let fileURL = dir.appendingPathComponent(file)
  741. print("========》保存地址 --- \(fileURL)")
  742. self.fileURL = fileURL
  743. //writing
  744. do {
  745. try reBase64Str!.write(to: fileURL, atomically: false, encoding: .utf8)
  746. }
  747. catch {
  748. /* error handling here */
  749. }
  750. //reading
  751. do {
  752. let text2 = try String(contentsOf: fileURL, encoding: .utf8)
  753. print(text2)
  754. }
  755. catch {
  756. /* error handling here */
  757. }
  758. let home1 = NSHomeDirectory() // 获取沙盒根路径
  759. let documentsDirectory1 = home1 + "/Documents/"
  760. let documentsDirectory2 = home1 + "/Documents/SaveData/"
  761. let manager = FileManager.default
  762. let exist = manager.fileExists(atPath: home1 + "/Documents/SaveData/")
  763. if exist == false{
  764. do{
  765. let documentPath = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
  766. let inboxPath = documentPath.appendingPathComponent("SaveData")
  767. //创建制定位置的上的文件夹
  768. try manager.createDirectory(atPath: inboxPath.path, withIntermediateDirectories: true, attributes: nil)
  769. log.debug("创建文件夹成功")
  770. // g_showHUD("创建文件夹成功")
  771. }
  772. catch let error{
  773. log.debug("创建文件夹失败 --- \(error.localizedDescription) ---\(error)")
  774. // g_showHUD("创建文件夹失败")
  775. }
  776. }
  777. let filePath1 = documentsDirectory1.appending(file)
  778. let filePath2 = documentsDirectory2.appending(file)
  779. SBTFileOperation.copyFile(sourceUrl: filePath1, targetUrl: filePath2)
  780. log.debug("地址----\(filePath1)")
  781. }
  782. }
  783. //MARK : 打开分享页面
  784. @objc func shareAction() {
  785. let objectsToShare = [self.fileURL!]
  786. let controller = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
  787. present(controller, animated: true, completion: nil)
  788. }
  789. // MARK: 字典转字符串
  790. func dicValueString(_ dic:[String : Any]) -> String?{
  791. let data = try? JSONSerialization.data(withJSONObject: dic, options: [])
  792. let str = String(data: data!, encoding: String.Encoding.utf8)
  793. return str
  794. }
  795. // MARK: 字符串转字典
  796. func stringValueDic(_ str: String) -> [String : Any]?{
  797. let data = str.data(using: String.Encoding.utf8)
  798. if let dict = try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String : Any] {
  799. return dict
  800. }
  801. return nil
  802. }
  803. ///MARK : 下载文件
  804. @objc func downloadAction() {
  805. let vc = SBTReadSettingParamVCtr()
  806. vc.isOld = self.isOld
  807. vc.isDemo = self.isDemo
  808. vc.MaxVoltage = self.MaxVoltage
  809. vc.IchageRage = self.IchageRage
  810. self.navigationController?.pushViewController(vc)
  811. }
  812. @objc func readAction() {
  813. if self.isDemo == true {
  814. g_toast("Current_demo_data".da_localizedStr())
  815. return
  816. }
  817. Thread.sleep(forTimeInterval: 0.1)
  818. log.debug("读取")
  819. let arr = ["FF03000A0001","FF03E0010001","FF03E003001E","FF03DF000001","FF03DF0D0001","FF03E0210001"]
  820. BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
  821. self.realdata_000A(result!["FF03000A0001"] as! String)
  822. self.realdata_E001(result!["FF03E0010001"] as! String)
  823. self.realdata_E003(result!["FF03E003001E"] as! String)
  824. self.realdata_DF00(result!["FF03DF000001"] as! String)
  825. self.realdata_DF0D(result!["FF03DF0D0001"] as! String)
  826. self.realdata_E021(result!["FF03E0210001"] as! String)
  827. let loading = SBTReadLoadingVCtr()
  828. loading.deviceName = "Read_parameter".da_localizedStr()
  829. loading.message = "Reading_parameter".da_localizedStr()
  830. loading.show()
  831. loading.dismiss(2)
  832. self.tableView.reloadData()
  833. })
  834. // self.ReadSettingParam()
  835. DispatchQueue.main.async {
  836. let loading = SBTReadLoadingVCtr()
  837. loading.deviceName = "Read_parameter".da_localizedStr()
  838. loading.message = "Reading_parameter".da_localizedStr()
  839. loading.show()
  840. loading.dismiss(2)
  841. self.tableView.reloadData()
  842. }
  843. }
  844. /////////////////
  845. @objc func loadUIRefresh() {
  846. DispatchQueue.main.async {
  847. let dataDict = self.paramDataDict
  848. let def = UserDefaults.standard
  849. let iSTemp = def.object(forKey: TEMPISCENTIGRADE) as? String
  850. log.debug("asdfqoenwfoanwfok fa==wfkoaf- \(self.paramDataDict)")
  851. self.chargerArr?.removeAll()
  852. self.loadArr?.removeAll()
  853. self.txArr?.removeAll()
  854. self.rxArr?.removeAll()
  855. self.batteryArr?.removeAll()
  856. self.paramData = nil
  857. let key = DeviceDictKey()
  858. //参数设置
  859. let autoRecogn = dataDict[key.autoRecognition] as! String // 是否自动识别
  860. let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置
  861. if autoRecogn == "1"{
  862. self.autoRecognition = true
  863. let BatRateVolt = "Auto".da_localizedStr() //系统电压设置
  864. }else{
  865. self.autoRecognition = false
  866. let BatRateVolt = dataDict[key.BatRateVolt] as! String //系统电压设置
  867. }
  868. //当前系统电压值
  869. if BatRateVolt == "自动识别" || BatRateVolt == "Auto"{
  870. self.Multiple = 0
  871. }else{
  872. let batBateVoltInt = Float(BatRateVolt)
  873. let multiple = batBateVoltInt! / 12.0
  874. self.Multiple = multiple
  875. }
  876. let BatTypeSet = dataDict[key.BatTypeSet] as! String // 蓄电池类型
  877. let maxVolt = dataDict[key.MaxVolt] as!String // 系统支持的最大电压
  878. self.maxVolt = maxVolt
  879. switch BatTypeSet {
  880. case "自定义":
  881. AppShare.batteryType = .USER
  882. case "开口铅酸FLD":
  883. AppShare.batteryType = .FLD
  884. case "密封铅酸SLD":
  885. AppShare.batteryType = .SLD
  886. case "胶体铅酸GEL":
  887. AppShare.batteryType = .GEL
  888. case "锂LI":
  889. AppShare.batteryType = .LI
  890. case "User-defined":
  891. AppShare.batteryType = .USER
  892. case "Vented lead acid battery FLD":
  893. AppShare.batteryType = .FLD
  894. case "Lead acid battery SLD":
  895. AppShare.batteryType = .SLD
  896. case "Gel lead acid GEL":
  897. AppShare.batteryType = .GEL
  898. case "Lithium LI":
  899. AppShare.batteryType = .LI
  900. default:
  901. break
  902. }
  903. var IchageRage = dataDict[key.MaxChargeCurrent] as! String //最大充电电流
  904. if self.isOld == true {
  905. IchageRage = dataDict[key.IchageRage] as! String
  906. }
  907. self.chargerArr?.append(IchageRage)
  908. let CmdPowerOnOff = dataDict[key.CmdPowerOnOff] as! String // 开关控制
  909. if self.isOld == true {
  910. let CmdPowerOnOff1 = "On".da_localizedStr()
  911. self.chargerArr?.append(CmdPowerOnOff1)
  912. }else{
  913. self.chargerArr?.append(CmdPowerOnOff)
  914. }
  915. var ChgMaxTemper = dataDict[key.ChgMaxTemper] as! String// 充电上限温度
  916. if iSTemp == "0" {
  917. ChgMaxTemper = ChgMaxTemper.centigradeToFahrenheit_int()
  918. }
  919. if self.isOld == true {
  920. ChgMaxTemper = "--"
  921. }
  922. self.chargerArr?.append(ChgMaxTemper)
  923. var ChgMinTemper = dataDict[key.ChgMinTemper] as! String // 充电下限温度
  924. if iSTemp == "0" {
  925. ChgMinTemper = ChgMinTemper.centigradeToFahrenheit_int()
  926. }
  927. if self.isOld == true {
  928. ChgMinTemper = "--"
  929. }
  930. self.chargerArr?.append(ChgMinTemper)
  931. /*---------------电压扩大n倍----------*/
  932. let BatOverVolt = dataDict[key.BatOverVolt] as! String //超压电压
  933. self.chargerArr?.append(self.voltEnlage(BatOverVolt))
  934. /*---------------电压扩大n倍----------*/
  935. let BatChgLimitVolt = dataDict[key.BatChgLimitVolt] as! String //充电限制电压
  936. self.chargerArr?.append(self.voltEnlage(BatChgLimitVolt))
  937. /*---------------电压扩大n倍----------*/
  938. let BatImprovChgVolt = dataDict[key.BatImprovChgVolt] as! String // 提升充电电压/过充电压
  939. self.chargerArr?.append(self.voltEnlage(BatImprovChgVolt))
  940. /*---------------电压扩大n倍----------*/
  941. let BatFloatChgVolt = dataDict[key.BatFloatChgVolt] as! String//浮充充电电压 /过充返回电压
  942. self.chargerArr?.append(self.voltEnlage(BatFloatChgVolt))
  943. /*---------------电压扩大n倍----------*/
  944. let BatImprovChgBackVolt = dataDict[key.BatImprovChgBackVolt] as! String // 提升充电返回电压
  945. self.chargerArr?.append(self.voltEnlage(BatImprovChgBackVolt))
  946. let BatImprovChgTime = dataDict[key.BatImprovChgTime] as! String //提升充电时间
  947. self.chargerArr?.append(BatImprovChgTime)
  948. let CoeffTemperCompen = dataDict[key.CoeffTemperCompen] as! String // 温度补偿系数
  949. if CoeffTemperCompen == "0"{
  950. let CoeffTemperCompenSt1 = "0"
  951. self.chargerArr?.append(CoeffTemperCompenSt1)
  952. }else{
  953. let CoeffTemperCompenStr = "-\(CoeffTemperCompen)"
  954. self.chargerArr?.append(CoeffTemperCompenStr)
  955. }
  956. /*---------------电压扩大n倍----------*/
  957. let BatConstChgVolt = dataDict[key.BatConstChgVolt] as! String // 均衡充电电压
  958. self.chargerArr?.append(self.voltEnlage(BatConstChgVolt))
  959. let BatConstChgTime = dataDict[key.BatConstChgTime] as! String // 均衡充电时间
  960. self.chargerArr?.append(BatConstChgTime)
  961. let BatConstChgGapTime = dataDict[key.BatConstChgGapTime] as! String // 均衡充电间隔
  962. self.chargerArr?.append(BatConstChgGapTime)
  963. let BattEqualChgImmediate = dataDict[key.BattEqualChgImmediate] as! String// 手动均衡
  964. self.chargerArr?.append(BattEqualChgImmediate)
  965. /*---------------电压扩大n倍----------*/
  966. let BatOverDischgBackVolt = dataDict[key.BatOverDischgBackVolt] as! String //过放返回电压
  967. self.chargerArr?.append(self.voltEnlage(BatOverDischgBackVolt))
  968. /*---------------电压扩大n倍----------*/
  969. let BatUnderVolt = dataDict[key.BatUnderVolt] as! String // 欠压警告电压
  970. self.chargerArr?.append(self.voltEnlage(BatUnderVolt))
  971. /*---------------电压扩大n倍----------*/
  972. let BatOverDischgVolt = dataDict[key.BatOverDischgVolt] as! String// 过放电压
  973. self.chargerArr?.append(self.voltEnlage(BatOverDischgVolt))
  974. /*---------------电压扩大n倍----------*/
  975. let BatDischgLimitVolt = dataDict[key.BatDischgLimitVolt] as! String //放电限制电压
  976. self.chargerArr?.append(self.voltEnlage(BatDischgLimitVolt))
  977. let BatOverDischgDelayTime = dataDict[key.BatOverDischgDelayTime] as! String //过放延时时间
  978. self.chargerArr?.append(BatOverDischgDelayTime)
  979. var DisChagMaxTemper = dataDict[key.DisChagMaxTemper] as! String // 放电上限温度
  980. if iSTemp == "0" {
  981. DisChagMaxTemper = DisChagMaxTemper.centigradeToFahrenheit_int()
  982. }
  983. if self.isOld == true {
  984. DisChagMaxTemper = "--"
  985. }
  986. self.chargerArr?.append(DisChagMaxTemper)
  987. var DisChaMinTemper = dataDict[key.DisChaMinTemper] as! String // 放电下限温度
  988. if iSTemp == "0" {
  989. DisChaMinTemper = DisChaMinTemper.centigradeToFahrenheit_int()
  990. }
  991. if self.isOld == true {
  992. DisChaMinTemper = "--"
  993. }
  994. self.chargerArr?.append(DisChaMinTemper)
  995. let DcLoadMode = dataDict[key.DcLoadMode] as! String // 直流工作模式
  996. self.loadArr?.append(DcLoadMode)
  997. let LightCtrlDelayTime = dataDict[key.LightCtrlDelayTime] as! String //光控延时时间
  998. self.loadArr?.append(LightCtrlDelayTime)
  999. let LightCtrlVolt = dataDict[key.LightCtrlVolt] as! String // 光控电压
  1000. self.loadArr?.append(LightCtrlVolt)
  1001. // let tx = dataDict[key.tx] as! String
  1002. var tx = "Normal_communication".da_localizedStr()
  1003. if self.isOld!{
  1004. tx = ""
  1005. }
  1006. self.txArr?.append(tx)
  1007. // let rx = dataDict[key.rx] as! String
  1008. var rx = "Normal_communication".da_localizedStr()
  1009. if self.isOld!{
  1010. rx = ""
  1011. }
  1012. self.rxArr?.append(rx)
  1013. self.paramData = ParamData(BatRateVolt: BatRateVolt,
  1014. BatTypeSet: BatTypeSet,
  1015. BatOverVolt: BatOverVolt,
  1016. BatChgLimitVolt: BatChgLimitVolt,
  1017. BatConstChgVolt: BatConstChgVolt,
  1018. BatImprovChgVolt: BatImprovChgVolt,
  1019. BatFloatChgVolt: BatFloatChgVolt,
  1020. BatImprovChgBackVolt: BatImprovChgBackVolt,
  1021. BatOverDischgBackVolt: BatOverDischgBackVolt,
  1022. BatUnderVolt: BatUnderVolt,
  1023. BatOverDischgVolt: BatOverDischgVolt,
  1024. BatDischgLimitVolt: BatDischgLimitVolt,
  1025. BatOverDischgDelayTime: BatOverDischgDelayTime,
  1026. BatConstChgTime: BatConstChgTime,
  1027. BatImprovChgTime: BatImprovChgTime,
  1028. BatConstChgGapTime: BatConstChgGapTime,
  1029. CoeffTemperCompen: CoeffTemperCompen,
  1030. ChgMaxTemper: ChgMaxTemper,
  1031. ChgMinTemper: ChgMinTemper,
  1032. DisChagMaxTemper: DisChagMaxTemper,
  1033. DisChaMinTemper: DisChaMinTemper,
  1034. DcLoadMode: DcLoadMode,
  1035. LightCtrlDelayTime: LightCtrlDelayTime,
  1036. LightCtrlVolt: LightCtrlVolt,
  1037. tx: tx,
  1038. rx: rx,
  1039. BattEqualChgImmediate: BattEqualChgImmediate,
  1040. CmdPowerOnOff: CmdPowerOnOff)
  1041. self.batteryArr?.append(BatRateVolt)
  1042. self.batteryArr?.append(BatTypeSet)
  1043. log.debug("负载 - \(self.loadArr!)")
  1044. log.debug("充电器- \(self.chargerArr!)")
  1045. self.tableView.reloadData()
  1046. }
  1047. }
  1048. }
  1049. extension SBTPramSettingVCtr: UITableViewDelegate,UITableViewDataSource{
  1050. func numberOfSections(in tableView: UITableView) -> Int {
  1051. return 5
  1052. }
  1053. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  1054. let isExpand = isExpandArray[section]
  1055. if isExpand == "1" {
  1056. return 1
  1057. }else{
  1058. return 0
  1059. }
  1060. }
  1061. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  1062. let header = tableView.dequeueReusableHeaderFooterView(withClass: SBTHeaderView.self)
  1063. header.backgroundView?.backgroundColor = UIColor.white
  1064. if section == 0 || section == 1 {
  1065. header.isPointShow = true
  1066. }else{
  1067. header.isPointShow = false
  1068. }
  1069. let titles = ["Battery_settings".da_localizedStr(),"Charger_settings".da_localizedStr(),"Load_settings".da_localizedStr(),"TX_port_function".da_localizedStr(),"RX_port_function".da_localizedStr()]
  1070. header.title = titles[section]
  1071. if self.isExpandArray[section] == "0" {// 收起--> 展开
  1072. header.foldStr = "Expand".da_localizedStr()
  1073. }else{
  1074. header.foldStr = "Retract".da_localizedStr()
  1075. }
  1076. header.foldCalk = {() in
  1077. if self.isExpandArray[section] == "0" {// 收起--> 展开
  1078. self.isExpandArray.remove(at: section)
  1079. self.isExpandArray.insert("1", at: section)
  1080. }else{
  1081. self.isExpandArray.remove(at: section)
  1082. self.isExpandArray.insert("0", at: section)
  1083. }
  1084. let indexP = IndexPath(item: 0, section: section)
  1085. let range = NSMakeRange(indexP.section, 1)
  1086. let indexSet : NSIndexSet = NSIndexSet(indexesIn: range)
  1087. self.tableView.reloadSections(indexSet as IndexSet , with: .fade)
  1088. }
  1089. return header
  1090. }
  1091. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  1092. return 50
  1093. }
  1094. func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
  1095. return 50
  1096. }
  1097. func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
  1098. return 0.01
  1099. }
  1100. func tableView(_ tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat {
  1101. return 0.01
  1102. }
  1103. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  1104. if indexPath.section == 1 {
  1105. return 110 * 10 + 30
  1106. }else if indexPath.section == 2 {
  1107. return 110 * 2
  1108. }
  1109. return 110
  1110. }
  1111. //缓存高度 这个 跟定时器一起使用
  1112. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  1113. if indexPath.section == 1 {
  1114. return 110 * 10 + 30
  1115. }else if indexPath.section == 2 {
  1116. return 110 * 2
  1117. }
  1118. return 110
  1119. }
  1120. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  1121. if indexPath.section == 0 {
  1122. var cell = tableView.dequeueReusableCell(withIdentifier: batteryCellID) as? SBTParamSet_BatteryCell
  1123. cell?.voltageStr = self.batteryArr?.first
  1124. cell?.batteryTypeStr = self.batteryArr?.last
  1125. cell?.autoRecognition = self.autoRecognition
  1126. if cell == nil {
  1127. cell = SBTParamSet_BatteryCell(style: .default, reuseIdentifier: batteryCellID)
  1128. }
  1129. cell?.itemdidSelectCallback = { (index) in
  1130. let batteryVC = SBTSetBatteryVCtr()
  1131. batteryVC.isDemo = self.isDemo
  1132. batteryVC.selectedIndex = index
  1133. batteryVC.voltageStr = self.batteryArr?.first
  1134. batteryVC.batteryTypeStr = self.batteryArr?.last
  1135. batteryVC.maxVolt = self.maxVolt
  1136. batteryVC.isAuto = self.isAuto
  1137. batteryVC.batRateVolt = self.batRateVolt
  1138. batteryVC.completehandle = { (str) in
  1139. if self.isDemo == true{
  1140. self.batteryArr![1] = str!
  1141. log.debug("---- 回传电池类型 --- \(str)")
  1142. self.tableView.reloadData()
  1143. }else{
  1144. self.reloadCallback()
  1145. }
  1146. }
  1147. for subview in batteryVC.view.subviews {
  1148. log.debug(subview)
  1149. let transitionView = NSClassFromString("UITransitionView")!.class()
  1150. if subview.isMember(of: transitionView){
  1151. subview.backgroundColor = UIColor.clear
  1152. log.debug("111")
  1153. }else{
  1154. log.debug("没有")
  1155. }
  1156. }
  1157. batteryVC.show()
  1158. }
  1159. cell?.selectionStyle = .none
  1160. return cell!
  1161. }else if indexPath.section == 1{
  1162. var cell = tableView.dequeueReusableCell(withIdentifier: chargerCellID) as? SBTParamSet_ChargerCell
  1163. // cell?.getData(chargerArr)
  1164. cell?.isOld = self.isOld;
  1165. cell?.CellBatteryType = AppShare.batteryType
  1166. cell?.dataSources = chargerArr
  1167. if cell == nil {
  1168. cell = SBTParamSet_ChargerCell(style: .default, reuseIdentifier: chargerCellID)
  1169. }
  1170. cell?.itemdidSelectedCallBack = { (selectedIndexPath) in
  1171. let changerVC = SBTSetChargeVCtr()
  1172. changerVC.MaxVoltage = self.MaxVoltage
  1173. changerVC.isOld = self.isOld
  1174. changerVC.isDemo = self.isDemo
  1175. if self.isDemo == true{
  1176. changerVC.IchageRage = "20.00"
  1177. }else{
  1178. changerVC.IchageRage = self.IchageRage
  1179. }
  1180. changerVC.selectedIndexPath = selectedIndexPath
  1181. changerVC.CellBatteryType = AppShare.batteryType
  1182. changerVC.Multiple = self.Multiple
  1183. log.debug("当前页选择的seleceted \(selectedIndexPath)")
  1184. changerVC.dataSources = self.chargerArr
  1185. changerVC.completehandle = {
  1186. self.reloadCallback()
  1187. }
  1188. for subview in changerVC.view.subviews {
  1189. log.debug(subview)
  1190. let transitionView = NSClassFromString("UITransitionView")!.class()
  1191. if subview.isMember(of: transitionView){
  1192. subview.backgroundColor = UIColor.clear
  1193. log.debug("111")
  1194. }else{
  1195. log.debug("没有")
  1196. }
  1197. }
  1198. changerVC.show()
  1199. }
  1200. cell?.selectionStyle = .none
  1201. return cell!
  1202. }else if indexPath.section == 2 {
  1203. var cell = tableView.dequeueReusableCell(withIdentifier: loadCellID) as? SBTParamSet_LoadCell
  1204. cell?.dataSource = loadArr
  1205. if cell == nil {
  1206. cell = SBTParamSet_LoadCell(style: .default, reuseIdentifier: loadCellID)
  1207. }
  1208. cell?.itemdidSelectedCallBack = { (index) in
  1209. let loadVC = SBTSetLoadVCtr()
  1210. loadVC.isDemo = self.isDemo
  1211. loadVC.selectedIndex = index
  1212. loadVC.dataSource = self.loadArr
  1213. loadVC.completehandle = {
  1214. self.reloadCallback()
  1215. // self.readAction()
  1216. }
  1217. for subview in loadVC.view.subviews {
  1218. log.debug(subview)
  1219. let transitionView = NSClassFromString("UITransitionView")!.class()
  1220. if subview.isMember(of: transitionView){
  1221. subview.backgroundColor = UIColor.clear
  1222. log.debug("111")
  1223. }else{
  1224. log.debug("没有")
  1225. }
  1226. }
  1227. loadVC.show()
  1228. }
  1229. cell?.selectionStyle = .none
  1230. return cell!
  1231. }else if indexPath.section == 3 {
  1232. var cell = tableView.dequeueReusableCell(withIdentifier: TxCellID) as? SBTParamSet_TXCell
  1233. cell?.isOld = self.isOld
  1234. cell?.tx = txArr!.first
  1235. if cell == nil {
  1236. cell = SBTParamSet_TXCell(style: .default, reuseIdentifier: TxCellID)
  1237. }
  1238. cell?.itemdidSelectCallback = {
  1239. let txVC = SBTSetTxVCtr()
  1240. txVC.isDemo = self.isDemo
  1241. txVC.tx = self.txArr!.first
  1242. txVC.completehandle = {
  1243. // self.readAction()
  1244. self.reloadCallback()
  1245. }
  1246. for subview in txVC.view.subviews {
  1247. log.debug(subview)
  1248. let transitionView = NSClassFromString("UITransitionView")!.class()
  1249. if subview.isMember(of: transitionView){
  1250. subview.backgroundColor = UIColor.clear
  1251. log.debug("111")
  1252. }else{
  1253. log.debug("没有")
  1254. }
  1255. }
  1256. txVC.show()
  1257. }
  1258. cell?.selectionStyle = .none
  1259. return cell!
  1260. }else {
  1261. var cell = tableView.dequeueReusableCell(withIdentifier: RxCellID) as? SBTParamSet_RXCell
  1262. cell?.isOld = self.isOld
  1263. cell?.rx = rxArr?.first
  1264. if cell == nil {
  1265. cell = SBTParamSet_RXCell(style: .default, reuseIdentifier: RxCellID)
  1266. }
  1267. cell?.itemdidSelectCallback = {
  1268. let rxVC = SBTSetRxVCtr()
  1269. rxVC.rx = self.rxArr?.first
  1270. rxVC.isDemo = self.isDemo
  1271. rxVC.completehandle = {
  1272. self.reloadCallback()
  1273. }
  1274. for subview in rxVC.view.subviews {
  1275. log.debug(subview)
  1276. let transitionView = NSClassFromString("UITransitionView")!.class()
  1277. if subview.isMember(of: transitionView){
  1278. subview.backgroundColor = UIColor.clear
  1279. log.debug("111")
  1280. }else{
  1281. log.debug("没有")
  1282. }
  1283. }
  1284. rxVC.show()
  1285. }
  1286. cell?.selectionStyle = .none
  1287. return cell!
  1288. }
  1289. }
  1290. func reloadCallback() {
  1291. DispatchQueue.main.async {
  1292. // let loading = SBTReadLoadingVCtr()
  1293. // loading.deviceName = "Set_parameter".da_localizedStr()
  1294. // loading.message = "Setting_parameter".da_localizedStr()
  1295. // loading.show()
  1296. // loading.dismiss(3)
  1297. self.tableView.reloadData()
  1298. }
  1299. // self.readAction()
  1300. self.perform(#selector(readAction), with: nil, afterDelay: 3)
  1301. self.perform(#selector(reloadTable), with: nil, afterDelay: 4)
  1302. self.perform(#selector(reloadSuccess), with: nil, afterDelay: 4.5)
  1303. }
  1304. @objc func reloadSuccess() {
  1305. g_showHUD("Successful".da_localizedStr())
  1306. }
  1307. @objc func reloadTable() {
  1308. log.debug("修改之后回调数据 -- \(paramDataDict)")
  1309. self.tableView.reloadData()
  1310. }
  1311. }
  1312. extension SBTPramSettingVCtr{
  1313. //读取名称
  1314. func readdata_0049(_ reciveData : String){
  1315. let str0 = reciveData
  1316. log.debug("处理真实数据 - \(str0)")
  1317. var num5 = UUUtils.string(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  1318. log.debug("要解析的十六进制 \( str0.subString(start: 7 , length: str0.count - 12))")
  1319. num5 = num5?.trimmingCharacters(in: .whitespaces) //过滤开头结尾空白
  1320. set_deviceName = num5
  1321. log.debug("设备名称 \(num5)")
  1322. if num5 == nil || num5 == ""{
  1323. let ChineseString = UUUtils.deUnicodeString(fromHexString: str0.subString(start: 7 , length: str0.count - 12))
  1324. log.debug("设备中文名称 \(ChineseString!)")
  1325. set_deviceName = ChineseString!
  1326. }
  1327. }
  1328. //实时数据
  1329. func realdata_000A(_ reciveData : String) {
  1330. let str0 = reciveData
  1331. log.debug("处理真实数据 - \(str0)")
  1332. //系统支持的最高电压
  1333. let num00 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
  1334. log.debug("系统支持的最高电压: \(num00!)")
  1335. paramDataDict[key.MaxVolt] = "\(num00!)"
  1336. self.MaxVoltage = "\(num00!)"
  1337. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2, length: 2))
  1338. log.debug("额定充电电流: \(num0!)")
  1339. paramDataDict[key.IchageRage] = String(format: "%.2f", num0!.doubleValue)
  1340. self.IchageRage = String(format: "%.2f", num0!.doubleValue)
  1341. }
  1342. //温度处理
  1343. func temp(with num:NSNumber)-> String{
  1344. let numInt = num.intValue
  1345. // let q1 = UUUtils.numberHexString(q)?.intValue
  1346. let q2 = numInt & 128
  1347. print("判断正负\(q2)")
  1348. if q2 != 128 {
  1349. log.debug("温度\(num.floatValue )")
  1350. return "\(num.intValue )"
  1351. }else{
  1352. log.debug("温度: -\(numInt & 127 )")
  1353. return "-\(numInt & 127 )"
  1354. }
  1355. }
  1356. func realdata_E001(_ reciveData : String) {
  1357. let str0 = reciveData
  1358. log.debug("处理真实数据 - \(str0)")
  1359. //e001
  1360. // 判断是否自动识别
  1361. let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 4))
  1362. log.debug(" 最大充电电流- \(String(format: "%.2f", num0!.floatValue * 0.01))")
  1363. paramDataDict[key.MaxChargeCurrent] = "\(String(format: "%.2f", num0!.floatValue * 0.01))"
  1364. }
  1365. func realdata_E003(_ reciveData : String) {
  1366. let str0 = reciveData
  1367. log.debug("处理真实数据 - \(str0)")
  1368. //e003
  1369. if self.isOld == true {
  1370. }
  1371. // FF
  1372. let FF = str0.subString(start: 7, length: 2)
  1373. if FF == "FF" || FF == "ff"{
  1374. paramDataDict[key.autoRecognition] = "1"
  1375. // 判断是否自动识别
  1376. let num0 = UUUtils.numberHexString(str0.subString(start: 7 + 2 , length: 2))
  1377. log.debug("系统电压设置 - \(num0!)")
  1378. if num0 == 0 {
  1379. paramDataDict[key.BatRateVolt] = "Auto".da_localizedStr()
  1380. paramDataDict[key.autoRecognition] = "1"
  1381. self.batRateVolt = "Auto".da_localizedStr()
  1382. }else{
  1383. paramDataDict[key.BatRateVolt] = "\(num0!)"
  1384. self.batRateVolt = "\(num0!)"
  1385. }
  1386. self.isAuto = true
  1387. }else{
  1388. paramDataDict[key.autoRecognition] = "0"
  1389. self.isAuto = true
  1390. // 判断是否自动识别
  1391. let num0 = UUUtils.numberHexString(str0.subString(start: 7 , length: 2))
  1392. log.debug("系统电压设置 - \(num0!)")
  1393. if num0 == 0 {
  1394. paramDataDict[key.BatRateVolt] = "Auto".da_localizedStr()
  1395. paramDataDict[key.autoRecognition] = "1"
  1396. self.batRateVolt = "Auto".da_localizedStr()
  1397. }else{
  1398. paramDataDict[key.BatRateVolt] = "\(num0!)"
  1399. self.batRateVolt = "\(num0!)"
  1400. }
  1401. }
  1402. //18 0c
  1403. //e004
  1404. let num1 = UUUtils.numberHexString(str0.subString(start: 7 + 4 , length: 4))
  1405. var batterytype = ""
  1406. switch num1?.intValue {
  1407. case 0:
  1408. batterytype = "User-defined".da_localizedStr()
  1409. case 1:
  1410. batterytype = "Vented_lead_acid_battery_FLD".da_localizedStr()
  1411. case 2:
  1412. batterytype = "Lead_acid_battery_SLD".da_localizedStr()
  1413. case 3:
  1414. batterytype = "Gel_lead_acid_GEL".da_localizedStr()
  1415. case 4:
  1416. batterytype = "Lithium_iron_phosphate_battery_LI".da_localizedStr()
  1417. case 5:
  1418. batterytype = "三元锂电池".da_localizedStr()
  1419. case 6:
  1420. batterytype = "Lithium_iron_phosphate_battery_LI".da_localizedStr()
  1421. case 7:
  1422. batterytype = "超级电容".da_localizedStr()
  1423. case 10:
  1424. batterytype = "自定义(铅酸专用)".da_localizedStr()
  1425. default: break
  1426. }
  1427. log.debug("电池类型: \(batterytype)")
  1428. paramDataDict[key.BatTypeSet] = "\(batterytype)"
  1429. //e005
  1430. let num2 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 2 , length: 4))
  1431. log.debug("超压电压: \(num2!.floatValue * 0.1)")
  1432. paramDataDict[key.BatOverVolt] = "\(num2!.floatValue * 0.1)"
  1433. //e006
  1434. let num3 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 3, length: 4))
  1435. //BatChgLimitVolt
  1436. log.debug("充电限制电压:\(num3!.floatValue * 0.1)")
  1437. paramDataDict[key.BatChgLimitVolt] = "\(num3!.floatValue * 0.1)"
  1438. //e007
  1439. let num4 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 4, length: 4))
  1440. log.debug("均衡充电电压\(num4!.floatValue * 0.1)")
  1441. paramDataDict[key.BatConstChgVolt] = String(format: "%.1f", num4!.floatValue * 0.1)
  1442. //e008
  1443. let num5 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 5, length: 4))
  1444. log.debug("提升充电电压/过充返回电压\(num5!.floatValue * 0.1)")
  1445. paramDataDict[key.BatImprovChgVolt] = "\(String(format: "%.1f", num5!.floatValue * 0.1))"
  1446. //e009
  1447. let num6 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 6, length: 4))
  1448. log.debug("浮充充电电压/过充返回电压\(num6!.floatValue * 0.1)")
  1449. paramDataDict[key.BatFloatChgVolt] = "\(num6!.floatValue * 0.1)"
  1450. //e00a
  1451. let num7 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 7, length: 4))
  1452. log.debug("提升充电返回电压\(num7!.floatValue * 0.1)")
  1453. paramDataDict[key.BatImprovChgBackVolt] = String(format: "%.1f", num7!.floatValue * 0.1)
  1454. //e00b
  1455. let num8 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 8, length: 4))
  1456. log.debug("过放返回电压\(num8!.floatValue * 0.1)")
  1457. paramDataDict[key.BatOverDischgBackVolt] = "\(num8!.floatValue * 0.1)"
  1458. //e00c
  1459. let num9 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 9, length: 4))
  1460. log.debug("欠压警告电压\(num9!.floatValue * 0.1)")
  1461. paramDataDict[key.BatUnderVolt] = "\(num9!.floatValue * 0.1)"
  1462. //e00d
  1463. let num10 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 10, length: 4))
  1464. log.debug("过放电压\(num10!.floatValue * 0.1)")
  1465. paramDataDict[key.BatOverDischgVolt] = "\(num10!.floatValue * 0.1)"
  1466. //e00e
  1467. let num11 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 11, length: 4))
  1468. log.debug("放电限制电压\(num11!.floatValue * 0.1)")
  1469. paramDataDict[key.BatDischgLimitVolt] = "\(num11!.floatValue * 0.1)"
  1470. //e010
  1471. let num13 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 13, length: 4))
  1472. log.debug("过放延时时间\(num13!)")
  1473. paramDataDict[key.BatOverDischgDelayTime] = "\(num13!)"
  1474. //e011
  1475. let num14 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 14, length: 4))
  1476. log.debug("均衡充电时间\(num14!)")
  1477. paramDataDict[key.BatConstChgTime] = "\(num14!)"
  1478. //e012
  1479. let num15 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 15, length: 4))
  1480. log.debug("提升充电时间 \(num15!)")
  1481. paramDataDict[key.BatImprovChgTime] = "\(num15!)"
  1482. //e013
  1483. let num16 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 16, length: 4))
  1484. log.debug("均衡充电间隔\(num16!)")
  1485. paramDataDict[key.BatConstChgGapTime] = "\(num16!)"
  1486. //e014
  1487. let num17 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 17, length: 4))
  1488. log.debug("温度补偿系数\(num17!)")
  1489. paramDataDict[key.CoeffTemperCompen] = "\(num17!)"
  1490. //e015
  1491. let num18 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 18, length: 4))
  1492. log.debug("充电上限温度\(temp(with: num18!))")
  1493. paramDataDict[key.ChgMaxTemper] = "\(temp(with: num18!))"
  1494. //e016
  1495. let num19 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 19, length: 4))
  1496. log.debug("充电下限温度\(temp(with: num19!))")
  1497. paramDataDict[key.ChgMinTemper] = "\(temp(with: num19!))"
  1498. //e017
  1499. let num20 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 20, length: 4))
  1500. log.debug("放电上限温度\(temp(with: num20!))")
  1501. paramDataDict[key.DisChagMaxTemper] = "\(temp(with: num20!))"
  1502. //e018
  1503. let num21 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 21, length: 4))
  1504. log.debug("放电下限温度\(temp(with: num21!))")
  1505. paramDataDict[key.DisChaMinTemper] = "\(temp(with: num21!))"
  1506. //e01d
  1507. let num26 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 26, length: 4))
  1508. var loadwordmode = ""
  1509. switch num26?.intValue {
  1510. case 0:
  1511. loadwordmode = "Light_control".da_localizedStr()
  1512. case 1:
  1513. loadwordmode = "Light_control,_delay_1_hour".da_localizedStr()
  1514. case 2:
  1515. loadwordmode = "Light_control,_delay_2_hours".da_localizedStr()
  1516. case 3:
  1517. loadwordmode = "Light_control,_delay_3_hours".da_localizedStr()
  1518. case 4:
  1519. loadwordmode = "Light_control,_delay_4_hours".da_localizedStr()
  1520. case 5:
  1521. loadwordmode = "Light_control,_delay_5_hours".da_localizedStr()
  1522. case 6:
  1523. loadwordmode = "Light_control,_delay_6_hours".da_localizedStr()
  1524. case 7:
  1525. loadwordmode = "Light_control,_delay_7_hours".da_localizedStr()
  1526. case 8:
  1527. loadwordmode = "Light_control,_delay_8_hours".da_localizedStr()
  1528. case 9:
  1529. loadwordmode = "Light_control,_delay_9_hours".da_localizedStr()
  1530. case 10:
  1531. loadwordmode = "Light_control,_delay_10_hours".da_localizedStr()
  1532. case 11:
  1533. loadwordmode = "Light_control,_delay_11_hours".da_localizedStr()
  1534. case 12:
  1535. loadwordmode = "Light_control,_delay_12_hours".da_localizedStr()
  1536. case 13:
  1537. loadwordmode = "Light_control,_delay_13_hours".da_localizedStr()
  1538. case 14:
  1539. loadwordmode = "Light_control,_delay_14_hours".da_localizedStr()
  1540. case 15:
  1541. loadwordmode = "Manual_mode".da_localizedStr()
  1542. case 16:
  1543. loadwordmode = "Debug_mode".da_localizedStr()
  1544. case 17:
  1545. loadwordmode = "Normal-on_mode".da_localizedStr()
  1546. case 18:
  1547. loadwordmode = "Timed_mode".da_localizedStr()
  1548. default:
  1549. break
  1550. }
  1551. log.debug("直流负载工作模式\(loadwordmode)")
  1552. paramDataDict[key.DcLoadMode] = "\(loadwordmode)"
  1553. //e01e
  1554. let num27 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 27, length: 4))
  1555. log.debug("光控延时时间\(num27!)")
  1556. paramDataDict[key.LightCtrlDelayTime] = "\(num27!)"
  1557. //d01f
  1558. let num28 = UUUtils.numberHexString(str0.subString(start: 7 + 4 * 28, length: 4))
  1559. log.debug("光控电压\(num28!)")
  1560. paramDataDict[key.LightCtrlVolt] = "\(num28!)"
  1561. }
  1562. func realdata_DF00(_ reciveData : String) {
  1563. let str0 = reciveData
  1564. log.debug("处理真实数据 - \(str0)")
  1565. // <ff0302 0000 9190> ff0302 0c0c 9495
  1566. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  1567. log.debug("开关控制 —— \(num0)")
  1568. var cmd = ""
  1569. if num0?.intValue == 0 {
  1570. cmd = "Off".da_localizedStr()
  1571. }else if num0?.intValue == 1{
  1572. cmd = "On".da_localizedStr()
  1573. }
  1574. paramDataDict[key.CmdPowerOnOff] = cmd
  1575. }
  1576. func realdata_DF0D(_ reciveData : String) {
  1577. let str0 = reciveData
  1578. log.debug("处理真实数据 - \(str0)")
  1579. // <ff030200 009190>
  1580. let num0 = UUUtils.numberHexString(str0.subString(start: 7, length: 4))
  1581. log.debug("手动均衡 —— \(num0)")
  1582. var canhandle = ""
  1583. if num0?.intValue == 0 {
  1584. canhandle = "Prohibited".da_localizedStr()
  1585. }else if num0?.intValue == 1{
  1586. canhandle = "Enable".da_localizedStr()
  1587. }
  1588. paramDataDict[key.BattEqualChgImmediate] = canhandle
  1589. }
  1590. func realdata_E021(_ reciveData : String) {
  1591. let str0 = reciveData
  1592. log.debug("处理真实数据 - \(str0)")
  1593. let num0 = UUUtils.getBinaryByHex(str0.subString(start: 7, length: 4))
  1594. //("0000000100000000")
  1595. //00 000 001 00000000
  1596. log.debug("E021 —— \(num0!)")
  1597. //RX
  1598. let rx = num0?.subString(start: 2, length: 3)
  1599. var rx_function = ""
  1600. if rx == "000"{
  1601. rx_function = "Normal_communication".da_localizedStr()
  1602. }
  1603. // else if rx == "001"{
  1604. // rx_function = "远程开关"
  1605. //
  1606. // }else if rx == "010"{
  1607. // rx_function = "负载输出设置"
  1608. //
  1609. // }else if rx == "011"{
  1610. // rx_function = "负载输出开/关 反相"
  1611. //
  1612. // }else if rx == "100"{
  1613. // rx_function = "负载输出开/关 正常"
  1614. // }
  1615. log.debug("Rx端口 \(rx_function)")
  1616. paramDataDict[key.rx] = "\(rx_function)"
  1617. let tx = num0?.subString(start: 5, length: 3)
  1618. log.debug("")
  1619. var tx_function = ""
  1620. if tx == "000" {
  1621. tx_function = "Normal_communication".da_localizedStr()
  1622. }
  1623. // else if tx == "001"{
  1624. // tx_function = "虚拟负载输出"
  1625. // }else if tx == "010"{
  1626. // tx_function = "每0.01kwh脉冲"
  1627. // }else if tx == "011"{
  1628. // tx_function = "灯光调暗(pwm正常)"
  1629. // }else if tx == "100"{
  1630. // tx_function = "灯光调暗(pwm反相)"
  1631. // }
  1632. log.debug("tx端口 \(tx_function)")
  1633. paramDataDict[key.tx] = "\(tx_function)"
  1634. loadUIRefresh()
  1635. }
  1636. }