DataFrameMessageBody.swift 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // DataFrameMessageBody.swift
  3. // RileyLink
  4. //
  5. // Created by Pete Schwamb on 5/6/17.
  6. // Copyright © 2017 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. public class DataFrameMessageBody: CarelinkLongMessageBody {
  10. public let isLastFrame: Bool
  11. public let frameNumber: Int
  12. public let contents: Data
  13. public required init?(rxData: Data) {
  14. guard rxData.count == type(of: self).length else {
  15. return nil
  16. }
  17. self.isLastFrame = rxData[0] & 0b1000_0000 != 0
  18. self.frameNumber = Int(rxData[0] & 0b0111_1111)
  19. self.contents = rxData.subdata(in: (1..<rxData.count))
  20. super.init(rxData: rxData)
  21. }
  22. init(frameNumber: Int, isLastFrame: Bool, contents: Data) {
  23. self.frameNumber = frameNumber
  24. self.isLastFrame = isLastFrame
  25. self.contents = contents
  26. super.init(rxData: Data())!
  27. }
  28. public override var txData: Data {
  29. var byte0 = UInt8(frameNumber)
  30. if isLastFrame {
  31. byte0 |= 0b1000_0000
  32. }
  33. var data = Data([byte0])
  34. data.append(contents)
  35. return data
  36. }
  37. }
  38. extension DataFrameMessageBody {
  39. public static func dataFramesFromContents(_ contents: Data) -> [DataFrameMessageBody] {
  40. var frames = [DataFrameMessageBody]()
  41. let frameContentsSize = DataFrameMessageBody.length - 1
  42. for frameNumber in sequence(first: 0, next: { $0 + 1 }) {
  43. let startIndex = frameNumber * frameContentsSize
  44. var endIndex = startIndex + frameContentsSize
  45. var isLastFrame = false
  46. if endIndex >= contents.count {
  47. isLastFrame = true
  48. endIndex = contents.count
  49. }
  50. frames.append(DataFrameMessageBody(
  51. frameNumber: frameNumber + 1,
  52. isLastFrame: isLastFrame,
  53. contents: contents[startIndex..<endIndex]
  54. ))
  55. if isLastFrame {
  56. break
  57. }
  58. }
  59. return frames
  60. }
  61. }