OpenAPS.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // OpenAPS.swift
  3. // FreeAPS
  4. //
  5. // Created by Ivan Valkou on 12.01.2021.
  6. //
  7. import Foundation
  8. import JavaScriptCore
  9. final class OpenAPS {
  10. func test() {
  11. let pumphistory = loadJSON(name: "pumphistory")
  12. let profile = loadJSON(name: "profile")
  13. let basalProfile = loadJSON(name: "basal_profile")
  14. let clock = loadJSON(name: "clock")
  15. let carbs = loadJSON(name: "carbhistory")
  16. let glucose = loadJSON(name: "glucose")
  17. let currentTemp = loadJSON(name: "temp_basal")
  18. let reservoir = 100
  19. let tsMilliseconds: Double = 1527924300000
  20. let autosensResult = autosense(
  21. pumpHistory: pumphistory,
  22. profile: profile,
  23. carbs: carbs,
  24. glucose: glucose,
  25. basalprofile: basalProfile,
  26. temptargets: "null"
  27. )
  28. print("AUTOSENS: \(autosensResult)")
  29. let iobResult = iob(
  30. pumphistory: pumphistory,
  31. profile: profile,
  32. clock: clock,
  33. autosens: autosensResult,
  34. pumphistory24: "null"
  35. )
  36. print("IOB: \(iobResult)")
  37. let mealResult = meal(
  38. pumphistory: pumphistory,
  39. profile: profile,
  40. basalProfile: basalProfile,
  41. clock: clock,
  42. carbs: carbs,
  43. glucose: glucose
  44. )
  45. print("MEAL: \(mealResult)")
  46. let glucoseStatus = glucoseGetLast(glucose: glucose)
  47. print("GLUCOSE STATUS: \(glucoseStatus)")
  48. let suggested = determineBasal(
  49. glucoseStatus: glucoseStatus,
  50. currentTemp: currentTemp,
  51. iob: iobResult,
  52. profile: profile,
  53. aurosens: autosensResult,
  54. meal: mealResult,
  55. microBolusAllowed: true,
  56. reservoir: reservoir,
  57. tsMilliseconds: tsMilliseconds
  58. )
  59. print("SUGGESTED: \(suggested)")
  60. }
  61. func iob(pumphistory: JSON, profile: JSON, clock: JSON, autosens: JSON, pumphistory24: JSON) -> JSON {
  62. let jsWorker = JavaScriptWorker()
  63. jsWorker.evaluate(script: Script(name:"iob-bundle"))
  64. jsWorker.evaluate(script: Script(name:"prepare-iob"))
  65. return jsWorker.call(function: "generate", with: [
  66. pumphistory,
  67. profile,
  68. clock,
  69. autosens,
  70. pumphistory24
  71. ])
  72. }
  73. func meal(pumphistory: JSON, profile: JSON, basalProfile: JSON, clock: JSON, carbs: JSON, glucose: JSON) -> JSON {
  74. let jsWorker = JavaScriptWorker()
  75. jsWorker.evaluate(script: Script(name:"meal-bundle"))
  76. jsWorker.evaluate(script: Script(name:"prepare-meal"))
  77. return jsWorker.call(function: "generate", with: [
  78. pumphistory,
  79. profile,
  80. basalProfile,
  81. clock,
  82. carbs,
  83. glucose
  84. ])
  85. }
  86. func glucoseGetLast(glucose: JSON) -> JSON {
  87. let jsWorker = JavaScriptWorker()
  88. jsWorker.evaluate(script: Script(name:"glucose-get-last-bundle"))
  89. return jsWorker.call(function: "freeaps", with: [glucose])
  90. }
  91. func determineBasal(
  92. glucoseStatus: JSON,
  93. currentTemp: JSON,
  94. iob: JSON,
  95. profile: JSON,
  96. aurosens: JSON,
  97. meal: JSON,
  98. microBolusAllowed: Bool,
  99. reservoir: Int,
  100. tsMilliseconds: Double
  101. ) -> JSON {
  102. let jsWorker = JavaScriptWorker()
  103. jsWorker.evaluate(script: Script(name:"basal-set-temp-bundle"))
  104. jsWorker.evaluate(script: Script(name:"prepare-determine-basal"))
  105. let funcKey = "tempBasalFunctions"
  106. jsWorker.evaluate(script: Script(name:"determine-basal-bundle"))
  107. return jsWorker.call(
  108. function: "freeaps",
  109. with: [
  110. glucoseStatus,
  111. currentTemp,
  112. iob,
  113. profile,
  114. aurosens,
  115. meal,
  116. funcKey,
  117. microBolusAllowed,
  118. reservoir,
  119. tsMilliseconds
  120. ]
  121. )
  122. }
  123. func autosense(
  124. pumpHistory: JSON,
  125. profile: JSON,
  126. carbs: JSON,
  127. glucose: JSON,
  128. basalprofile: JSON,
  129. temptargets: JSON
  130. ) -> JSON {
  131. let jsWorker = JavaScriptWorker()
  132. jsWorker.evaluate(script: Script(name:"autosens-bundle"))
  133. jsWorker.evaluate(script: Script(name:"prepare-autosens"))
  134. return jsWorker.call(
  135. function: "generate",
  136. with: [
  137. pumpHistory,
  138. profile,
  139. carbs,
  140. glucose,
  141. basalprofile,
  142. temptargets
  143. ]
  144. )
  145. }
  146. private func loadJSON(name: String) -> String {
  147. try! String(contentsOf: Bundle.main.url(forResource: "json/\(name)", withExtension: "json")!)
  148. }
  149. }