MySentryAckMessageBody.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. //
  2. // MySentryAckMessageBody.swift
  3. // Naterade
  4. //
  5. // Created by Nathan Racklyeft on 9/4/15.
  6. // Copyright © 2015 Nathan Racklyeft. All rights reserved.
  7. //
  8. import Foundation
  9. /// Describes an ACK message sent by a MySentry device in response to pump status messages.
  10. /// a2 350535 06 59 000695 00 04 00 00 00 e2
  11. public struct MySentryAckMessageBody: MessageBody {
  12. public static let length = 9
  13. let sequence: UInt8
  14. let mySentryID: Data
  15. let responseMessageTypes: [MessageType]
  16. public init?(sequence: UInt8, watchdogID: Data, responseMessageTypes: [MessageType]) {
  17. guard responseMessageTypes.count <= 4 && watchdogID.count == 3 else {
  18. return nil
  19. }
  20. self.sequence = sequence
  21. self.mySentryID = watchdogID
  22. self.responseMessageTypes = responseMessageTypes
  23. }
  24. public init?(rxData: Data) {
  25. guard rxData.count == type(of: self).length else {
  26. return nil
  27. }
  28. sequence = rxData[0]
  29. mySentryID = rxData.subdata(in: 1..<4)
  30. responseMessageTypes = rxData[5..<9].compactMap({ MessageType(rawValue: $0) })
  31. }
  32. public var txData: Data {
  33. var buffer = [UInt8](repeating: 0, count: type(of: self).length)
  34. buffer[0] = sequence
  35. buffer.replaceSubrange(1..<4, with: mySentryID[0..<3])
  36. buffer.replaceSubrange(5..<5 + responseMessageTypes.count, with: responseMessageTypes.map({ $0.rawValue }))
  37. return Data(buffer)
  38. }
  39. }