HistoryPage.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // HistoryPage.swift
  3. // RileyLink
  4. //
  5. // Created by Pete Schwamb on 3/3/16.
  6. // Copyright © 2016 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. public enum HistoryPageError: Error {
  10. case invalidCRC
  11. case unknownEventType(eventType: UInt8)
  12. }
  13. extension HistoryPageError: LocalizedError {
  14. public var errorDescription: String? {
  15. switch self {
  16. case .invalidCRC:
  17. return LocalizedString("History page failed crc check", comment: "Error description for history page failing crc check")
  18. case .unknownEventType(let eventType):
  19. return String(format: LocalizedString("Unknown history record type: %$1@", comment: "Format string for error description for an unknown record type in a history page. (1: event type number)"), eventType)
  20. }
  21. }
  22. }
  23. public struct HistoryPage {
  24. public let events: [PumpEvent]
  25. // Useful interface for testing
  26. init(events: [PumpEvent]) {
  27. self.events = events
  28. }
  29. public init(pageData: Data, pumpModel: PumpModel) throws {
  30. guard checkCRC16(pageData) else {
  31. events = [PumpEvent]()
  32. throw HistoryPageError.invalidCRC
  33. }
  34. let pageData = pageData.subdata(in: 0..<1022)
  35. func matchEvent(_ offset: Int) -> PumpEvent? {
  36. if let eventType = PumpEventType(rawValue: pageData[offset]) {
  37. let remainingData = pageData.subdata(in: offset..<pageData.count)
  38. if let event = eventType.eventType.init(availableData: remainingData, pumpModel: pumpModel) {
  39. return event
  40. }
  41. }
  42. return nil
  43. }
  44. var offset = 0
  45. let length = pageData.count
  46. var unabsorbedInsulinRecord: UnabsorbedInsulinPumpEvent?
  47. var tempEvents = [PumpEvent]()
  48. while offset < length {
  49. // Slurp up 0's
  50. if pageData[offset] == 0 {
  51. offset += 1
  52. continue
  53. }
  54. guard var event = matchEvent(offset) else {
  55. events = [PumpEvent]()
  56. throw HistoryPageError.unknownEventType(eventType: pageData[offset])
  57. }
  58. if unabsorbedInsulinRecord != nil, var bolus = event as? BolusNormalPumpEvent {
  59. bolus.unabsorbedInsulinRecord = unabsorbedInsulinRecord
  60. unabsorbedInsulinRecord = nil
  61. event = bolus
  62. }
  63. if let event = event as? UnabsorbedInsulinPumpEvent {
  64. unabsorbedInsulinRecord = event
  65. } else {
  66. tempEvents.append(event)
  67. }
  68. offset += event.length
  69. }
  70. events = tempEvents
  71. }
  72. }