RadioFirmwareVersion.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //
  2. // RadioFirmwareVersion.swift
  3. // RileyLinkBLEKit
  4. //
  5. // Copyright © 2017 Pete Schwamb. All rights reserved.
  6. //
  7. public struct RadioFirmwareVersion {
  8. private static let prefix = "subg_rfspy "
  9. let components: [Int]
  10. let versionString: String
  11. init?(versionString: String) {
  12. guard versionString.hasPrefix(RadioFirmwareVersion.prefix),
  13. let versionIndex = versionString.index(versionString.startIndex, offsetBy: RadioFirmwareVersion.prefix.count, limitedBy: versionString.endIndex)
  14. else {
  15. return nil
  16. }
  17. self.init(
  18. components: versionString[versionIndex...].split(separator: ".").compactMap({ Int($0) }),
  19. versionString: versionString
  20. )
  21. }
  22. private init(components: [Int], versionString: String) {
  23. self.versionString = versionString
  24. self.components = components
  25. }
  26. }
  27. extension RadioFirmwareVersion {
  28. static var unknown: RadioFirmwareVersion {
  29. return self.init(components: [0], versionString: "Unknown")
  30. }
  31. public var isUnknown: Bool {
  32. return self == RadioFirmwareVersion.unknown
  33. }
  34. }
  35. extension RadioFirmwareVersion: CustomStringConvertible {
  36. public var description: String {
  37. return versionString
  38. }
  39. }
  40. extension RadioFirmwareVersion: Equatable {
  41. public static func ==(lhs: RadioFirmwareVersion, rhs: RadioFirmwareVersion) -> Bool {
  42. return lhs.components == rhs.components
  43. }
  44. }
  45. // Version 2 changes
  46. extension RadioFirmwareVersion {
  47. private var atLeastV2: Bool {
  48. guard let major = components.first, major >= 2 else {
  49. return false
  50. }
  51. return true
  52. }
  53. private var atLeastV2_2: Bool {
  54. guard components.count >= 2 else {
  55. return false;
  56. }
  57. let major = components[0]
  58. let minor = components[1]
  59. return major > 2 || (major == 2 && minor >= 2)
  60. }
  61. var supportsPreambleExtension: Bool {
  62. return atLeastV2
  63. }
  64. var supportsSoftwareEncoding: Bool {
  65. return atLeastV2
  66. }
  67. var supportsResetRadioConfig: Bool {
  68. return atLeastV2
  69. }
  70. var supports16BitPacketDelay: Bool {
  71. return atLeastV2
  72. }
  73. var needsExtraByteForUpdateRegisterCommand: Bool {
  74. // Fixed in 2.2
  75. return !atLeastV2
  76. }
  77. var needsExtraByteForReadRegisterCommand: Bool {
  78. // Fixed in 2.3
  79. guard components.count >= 2 else {
  80. return true;
  81. }
  82. let major = components[0]
  83. let minor = components[1]
  84. return major < 2 || (major == 2 && minor <= 2)
  85. }
  86. var supportsRileyLinkStatistics: Bool {
  87. return atLeastV2_2
  88. }
  89. var supportsCustomPreamble: Bool {
  90. return atLeastV2
  91. }
  92. var supportsReadRegister: Bool {
  93. return atLeastV2
  94. }
  95. }