PodInfoPulseLogPlus.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. //
  2. // PodInfoPulseLogPlus.swift
  3. // OmniKit
  4. //
  5. // Created by Eelke Jager on 22/09/2018.
  6. // Copyright © 2018 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. // Type 3 Pod Info returns up to the last 60 pulse log entries pulse some additional info
  10. public struct PodInfoPulseLogPlus : PodInfo {
  11. // CMD 1 2 3 4 5 6 7 8 9 10
  12. // DATA 0 1 2 3 4 5 6 7 8
  13. // 02 LL 03 PP QQQQ SSSS 04 3c XXXXXXXX ...
  14. public let podInfoType : PodInfoResponseSubType = .pulseLogPlus
  15. public let faultEventCode: FaultEventCode // fault code
  16. public let timeFaultEvent: TimeInterval // fault time since activation
  17. public let timeActivation: TimeInterval // current time since activation
  18. public let entrySize : Int // always 4
  19. public let maxEntries : Int // always 60
  20. public let nEntries : Int // how many 32-bit pulse log entries returned (calculated)
  21. public let pulseLog : [UInt32]
  22. public let data : Data
  23. public init(encodedData: Data) throws {
  24. guard encodedData[6] == MemoryLayout<UInt32>.size else {
  25. throw MessageError.unknownValue(value: encodedData[6], typeDescription: "pulseLog entry size")
  26. }
  27. let entrySize = Int(encodedData[6])
  28. let logStartByteOffset = 8 // starting byte offset of the pulse log in DATA
  29. let nLogBytesReturned = encodedData.count - logStartByteOffset
  30. let nEntries = nLogBytesReturned / entrySize
  31. let maxEntries = Int(encodedData[7])
  32. guard encodedData.count >= logStartByteOffset && (nLogBytesReturned & 0x3) == 0 else {
  33. throw MessageBlockError.notEnoughData // not enough data to start log or a non-integral # of pulse log entries
  34. }
  35. guard maxEntries >= nEntries else {
  36. throw MessageBlockError.parseError
  37. }
  38. self.entrySize = entrySize
  39. self.nEntries = nEntries
  40. self.maxEntries = maxEntries
  41. self.faultEventCode = FaultEventCode(rawValue: encodedData[1])
  42. self.timeFaultEvent = TimeInterval(minutes: Double((Int(encodedData[2] & 0b1) << 8) + Int(encodedData[3])))
  43. self.timeActivation = TimeInterval(minutes: Double((Int(encodedData[4] & 0b1) << 8) + Int(encodedData[5])))
  44. self.pulseLog = createPulseLog(encodedData: encodedData, logStartByteOffset: logStartByteOffset, nEntries: self.nEntries)
  45. self.data = encodedData
  46. }
  47. }