浏览代码

Merge branch 'alpha' into submodule-updates-alpha

bjornoleh 2 年之前
父节点
当前提交
decca50a4d
共有 100 个文件被更改,包括 241 次插入522 次删除
  1. 1 1
      Config.xcconfig
  2. 0 20
      FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/Contents.json
  3. 二进制
      FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/OiAPS App Icon.png
  4. 二进制
      FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/OiAPS Watch Icon.png
  5. 0 0
      FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/Contents.json
  6. 0 0
      FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop 1.png
  7. 0 0
      FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop.png
  8. 二进制
      FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/17 1.png
  9. 二进制
      FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/18.png
  10. 2 2
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Contents.json
  11. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/Contents.json
  12. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/iAPS Text 1.png
  13. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/iAPS Text.png
  14. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/Contents.json
  15. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/iAPS Icon2 1.png
  16. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/iAPS Icon2.png
  17. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/Contents.json
  18. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/iAPS Icon4 1.png
  19. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/iAPS Icon4.png
  20. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Contents.json
  21. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Logo_Pink 1.png
  22. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Logo_Pink.png
  23. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/Contents.json
  24. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/iAPS Icon1 1.png
  25. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/iAPS Icon1.png
  26. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/Contents.json
  27. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/iAPS Pump_Bevel 1.png
  28. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/iAPS Pump_Bevel.png
  29. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/Contents.json
  30. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/iAPS Pump_Black 1.png
  31. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/iAPS Pump_Black.png
  32. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/Contents.json
  33. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/iAPS Pump_Bevel2_Black 1.png
  34. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/iAPS Pump_Bevel2_Black.png
  35. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/Contents.json
  36. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite 1.png
  37. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite.png
  38. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/image 1.png
  39. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/image.png
  40. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/Contents.json
  41. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite 1.png
  42. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite.png
  43. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/Contents.json
  44. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/iAPS Pump_Bevel2_Transparent.png
  45. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/iAPS_NoButtons_Gray1024x1024.png
  46. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/Contents.json
  47. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/iAPS Pump_FlatGradient 1.png
  48. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/iAPS Pump_FlatGradient.png
  49. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/Contents.json
  50. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/iAPS Icon3 1.png
  51. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/iAPS Icon3.png
  52. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/Contents.json
  53. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/iAPS Pump_White 1.png
  54. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/iAPS Pump_White.png
  55. 0 20
      FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/Contents.json
  56. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/iAPS Icon5 1.png
  57. 二进制
      FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/iAPS Icon5.png
  58. 2 2
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/Contents.json
  59. 二进制
      FreeAPS/Resources/Assets.xcassets/oiAPSWhiteShadow.appiconset/D 1.png
  60. 二进制
      FreeAPS/Resources/Assets.xcassets/oiAPSWhiteShadow.appiconset/D.png
  61. 二进制
      FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/3D Watch.png
  62. 20 0
      FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/Contents.json
  63. 二进制
      FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/OiAPS 3d.png
  64. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsBlack.appiconset/A 1.png
  65. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsBlack.appiconset/A.png
  66. 2 2
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Contents.json
  67. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsColorBG.appiconset/C 1.png
  68. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsColorBG.appiconset/C.png
  69. 2 2
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/Contents.json
  70. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/8.png
  71. 二进制
      FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/9.png
  72. 20 0
      FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/Contents.json
  73. 二进制
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2 1.png
  74. 二进制
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2.png
  75. 二进制
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4 1.png
  76. 二进制
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4.png
  77. 二进制
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3 1.png
  78. 二进制
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3.png
  79. 0 20
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Contents.json
  80. 二进制
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Pod1.png
  81. 二进制
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/pod_colorful1024x1024.png
  82. 14 4
      FreeAPS/Sources/APS/CGM/PluginSource.swift
  83. 3 1
      FreeAPS/Sources/APS/FetchGlucoseManager.swift
  84. 4 4
      FreeAPS/Sources/APS/Storage/CarbsStorage.swift
  85. 7 7
      FreeAPS/Sources/APS/Storage/GlucoseStorage.swift
  86. 148 141
      FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift
  87. 4 4
      FreeAPS/Sources/APS/Storage/TempTargetsStorage.swift
  88. 1 1
      FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings
  89. 1 1
      FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings
  90. 1 1
      FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings
  91. 1 1
      FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings
  92. 1 1
      FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings
  93. 1 1
      FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings
  94. 1 1
      FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings
  95. 1 1
      FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings
  96. 1 1
      FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings
  97. 1 1
      FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings
  98. 1 1
      FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings
  99. 1 1
      FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings
  100. 0 0
      FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings

+ 1 - 1
Config.xcconfig

@@ -5,7 +5,7 @@ COPYRIGHT_NOTICE =
 DEVELOPER_TEAM = ##TEAM_ID##
 BUNDLE_IDENTIFIER = org.nightscout.$(DEVELOPMENT_TEAM).openiaps
 APP_GROUP_ID = group.com.$(DEVELOPMENT_TEAM).loopkit.LoopGroup
-APP_ICON = OiAPS_Icon
+APP_ICON = oiapsBlack
 APP_URL_SCHEME = Open-iAPS
 
 #include? "../../ConfigOverride.xcconfig"

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "OiAPS App Icon.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "OiAPS Watch Icon.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/OiAPS App Icon.png


二进制
FreeAPS/Resources/Assets.xcassets/OiAPS_Icon.appiconset/OiAPS Watch Icon.png


FreeAPS/Resources/Assets.xcassets/iAPS_Loop.appiconset/Contents.json → FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/Contents.json


FreeAPS/Resources/Assets.xcassets/iAPS_Loop.appiconset/imageLoop 1.png → FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop 1.png


FreeAPS/Resources/Assets.xcassets/iAPS_Loop.appiconset/imageLoop.png → FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop.png


二进制
FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/17 1.png


二进制
FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/18.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "Pod2.png",
+      "filename" : "17 1.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "Pod2 1.png",
+      "filename" : "18.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Text.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Text 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/iAPS Text 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS.appiconset/iAPS Text.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Icon2.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Icon2 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/iAPS Icon2 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Black.appiconset/iAPS Icon2.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Icon4.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Icon4 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/iAPS Icon4 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Black_Black.appiconset/iAPS Icon4.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "Logo_Pink.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "Logo_Pink 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Logo_Pink 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Clean.appiconset/Logo_Pink.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Icon1.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Icon1 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/iAPS Icon1 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Glow_BG.appiconset/iAPS Icon1.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Pump_Bevel.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_Bevel 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/iAPS Pump_Bevel 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray.appiconset/iAPS Pump_Bevel.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Pump_Black.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_Black 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/iAPS Pump_Black 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_Flat.appiconset/iAPS Pump_Black.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Pump_Bevel2_Black.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_Bevel2_Black 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/iAPS Pump_Bevel2_Black 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Gray_No_Buttons_BBG.appiconset/iAPS Pump_Bevel2_Black.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "LoopWhite.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "LoopWhite 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/image 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/image.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "LoopWhite.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "LoopWhite 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS_NoButtons_Gray1024x1024.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_Bevel2_Transparent.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/iAPS Pump_Bevel2_Transparent.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_NoButtons_Gray_White_BG.appiconset/iAPS_NoButtons_Gray1024x1024.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Pump_FlatGradient.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_FlatGradient 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/iAPS Pump_FlatGradient 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Purple.appiconset/iAPS Pump_FlatGradient.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Icon3.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Icon3 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/iAPS Icon3 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_Purple_BG.appiconset/iAPS Icon3.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Pump_White.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Pump_White 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/iAPS Pump_White 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_WhiteAndGray.appiconset/iAPS Pump_White.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "iAPS Icon5.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "iAPS Icon5 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/iAPS Icon5 1.png


二进制
FreeAPS/Resources/Assets.xcassets/iAPS_White_BG.appiconset/iAPS Icon5.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "pod4.png",
+      "filename" : "D.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "pod4 1.png",
+      "filename" : "D 1.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

二进制
FreeAPS/Resources/Assets.xcassets/oiAPSWhiteShadow.appiconset/D 1.png


二进制
FreeAPS/Resources/Assets.xcassets/oiAPSWhiteShadow.appiconset/D.png


二进制
FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/3D Watch.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "OiAPS  3d.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "3D Watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
FreeAPS/Resources/Assets.xcassets/oiaps3D.appiconset/OiAPS 3d.png


二进制
FreeAPS/Resources/Assets.xcassets/oiapsBlack.appiconset/A 1.png


二进制
FreeAPS/Resources/Assets.xcassets/oiapsBlack.appiconset/A.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "Pod3.png",
+      "filename" : "A.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "Pod3 1.png",
+      "filename" : "A 1.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

二进制
FreeAPS/Resources/Assets.xcassets/oiapsColorBG.appiconset/C 1.png


二进制
FreeAPS/Resources/Assets.xcassets/oiapsColorBG.appiconset/C.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Text.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "image.png",
+      "filename" : "C 1.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "image 1.png",
+      "filename" : "C.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

二进制
FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/8.png


二进制
FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/9.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/oiapsWhite.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "9.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "8.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2 1.png


二进制
FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2.png


二进制
FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4 1.png


二进制
FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4.png


二进制
FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3 1.png


二进制
FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "pod_colorful1024x1024.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "Pod1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

二进制
FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Pod1.png


二进制
FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/pod_colorful1024x1024.png


+ 14 - 4
FreeAPS/Sources/APS/CGM/PluginSource.swift

@@ -1,5 +1,6 @@
 import Combine
 import Foundation
+import LibreTransmitter
 import LoopKit
 import LoopKitUI
 
@@ -148,8 +149,17 @@ extension PluginSource: CGMManagerDelegate {
         switch readingResult {
         case let .newData(values):
 
+            var sensorActivatedAt: Date?
+            var sensorTransmitterID: String?
+            /// specific for Libre transmitter and send SAGE
+            if let cgmTransmitterManager = cgmManager as? LibreTransmitterManagerV3 {
+                sensorActivatedAt = cgmTransmitterManager.sensorInfoObservable.activatedAt
+                sensorTransmitterID = cgmTransmitterManager.sensorInfoObservable.sensorSerial
+            }
+
             let bloodGlucose = values.compactMap { newGlucoseSample -> BloodGlucose? in
                 let quantity = newGlucoseSample.quantity
+
                 let value = Int(quantity.doubleValue(for: .milligramsPerDeciliter))
                 return BloodGlucose(
                     _id: UUID().uuidString,
@@ -161,10 +171,10 @@ extension PluginSource: CGMManagerDelegate {
                     filtered: nil,
                     noise: nil,
                     glucose: value,
-                    type: "sgv"
-//                    activationDate: activationDate,
-//                    sessionStartDate: sessionStartDate
-//                    transmitterID: self.transmitterID
+                    type: "sgv",
+                    activationDate: sensorActivatedAt,
+                    sessionStartDate: sensorActivatedAt,
+                    transmitterID: sensorTransmitterID
                 )
             }
             promise?(.success(bloodGlucose))

+ 3 - 1
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -298,7 +298,9 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         // overcalibrate
         var overcalibration: ((Int) -> (Double))?
         processQueue.sync {
-            overcalibration = calibrationService.calibrate
+            if let cal = calibrationService {
+                overcalibration = cal.calibrate
+            }
         }
 
         if let overcalibration = overcalibration {

+ 4 - 4
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -11,7 +11,7 @@ protocol CarbsStorage {
     func storeCarbs(_ carbs: [CarbsEntry])
     func syncDate() -> Date
     func recent() -> [CarbsEntry]
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
+    func nightscoutTretmentsNotUploaded() -> [NightscoutTreatment]
     func deleteCarbs(at date: Date)
 }
 
@@ -170,12 +170,12 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
         }
     }
 
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
-        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NigtscoutTreatment].self) ?? []
+    func nightscoutTretmentsNotUploaded() -> [NightscoutTreatment] {
+        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NightscoutTreatment].self) ?? []
 
         let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual }
         let treatments = eventsManual.map {
-            NigtscoutTreatment(
+            NightscoutTreatment(
                 duration: nil,
                 rawDuration: nil,
                 rawRate: nil,

+ 7 - 7
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -15,7 +15,7 @@ protocol GlucoseStorage {
     func isGlucoseFresh() -> Bool
     func isGlucoseNotFlat() -> Bool
     func nightscoutGlucoseNotUploaded() -> [BloodGlucose]
-    func nightscoutCGMStateNotUploaded() -> [NigtscoutTreatment]
+    func nightscoutCGMStateNotUploaded() -> [NightscoutTreatment]
     var alarm: GlucoseAlarm? { get }
 }
 
@@ -85,7 +85,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
             debug(.deviceManager, "start storage cgmState")
             self.storage.transaction { storage in
                 let file = OpenAPS.Monitor.cgmState
-                var treatments = storage.retrieve(file, as: [NigtscoutTreatment].self) ?? []
+                var treatments = storage.retrieve(file, as: [NightscoutTreatment].self) ?? []
                 var updated = false
                 for x in glucose {
                     debug(.deviceManager, "storeGlucose \(x)")
@@ -107,7 +107,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
                     if let a = x.activationDate {
                         notes = "\(notes) activated on \(a)"
                     }
-                    let treatment = NigtscoutTreatment(
+                    let treatment = NightscoutTreatment(
                         duration: nil,
                         rawDuration: nil,
                         rawRate: nil,
@@ -115,7 +115,7 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
                         rate: nil,
                         eventType: .nsSensorChange,
                         createdAt: sessionStartDate,
-                        enteredBy: NigtscoutTreatment.local,
+                        enteredBy: NightscoutTreatment.local,
                         bolus: nil,
                         insulin: nil,
                         notes: notes,
@@ -212,9 +212,9 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
         return Array(Set(recentGlucose).subtracting(Set(uploaded)))
     }
 
-    func nightscoutCGMStateNotUploaded() -> [NigtscoutTreatment] {
-        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCGMState, as: [NigtscoutTreatment].self) ?? []
-        let recent = storage.retrieve(OpenAPS.Monitor.cgmState, as: [NigtscoutTreatment].self) ?? []
+    func nightscoutCGMStateNotUploaded() -> [NightscoutTreatment] {
+        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedCGMState, as: [NightscoutTreatment].self) ?? []
+        let recent = storage.retrieve(OpenAPS.Monitor.cgmState, as: [NightscoutTreatment].self) ?? []
 
         return Array(Set(recent).subtracting(Set(uploaded)))
     }

+ 148 - 141
FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift

@@ -12,7 +12,7 @@ protocol PumpHistoryStorage {
     func storeEvents(_ events: [PumpHistoryEvent])
     func storeJournalCarbs(_ carbs: Int)
     func recent() -> [PumpHistoryEvent]
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
+    func nightscoutTreatmentsNotUploaded() -> [NightscoutTreatment]
     func saveCancelTempEvents()
     func deleteInsulin(at date: Date)
 }
@@ -44,7 +44,9 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                         durationMin: nil,
                         rate: nil,
                         temp: nil,
-                        carbInput: nil
+                        carbInput: nil,
+                        isSMB: dose.automatic,
+                        isExternalInsulin: dose.manuallyEntered
                     )]
                 case .tempBasal:
                     guard let dose = event.dose else { return [] }
@@ -209,155 +211,30 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
         }
     }
 
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
+    func nightscoutTreatmentsNotUploaded() -> [NightscoutTreatment] {
         let events = recent()
         guard !events.isEmpty else { return [] }
 
-        let temps: [NigtscoutTreatment] = events.reduce([]) { result, event in
-            var result = result
-            switch event.type {
-            case .tempBasal:
-                result.append(NigtscoutTreatment(
-                    duration: nil,
-                    rawDuration: nil,
-                    rawRate: event,
-                    absolute: event.rate,
-                    rate: event.rate,
-                    eventType: .nsTempBasal,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: nil,
-                    insulin: nil,
-                    notes: nil,
-                    carbs: nil,
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                ))
-            case .tempBasalDuration:
-                if var last = result.popLast(), last.eventType == .nsTempBasal, last.createdAt == event.timestamp {
-                    last.duration = event.durationMin
-                    last.rawDuration = event
-                    result.append(last)
-                }
-            default: break
-            }
-            return result
-        }
+        var treatments: [NightscoutTreatment?] = []
 
-        let bolusesAndCarbs = events.compactMap { event -> NigtscoutTreatment? in
-            switch event.type {
-            case .bolus:
-                return NigtscoutTreatment(
-                    duration: event.duration,
-                    rawDuration: nil,
-                    rawRate: nil,
-                    absolute: nil,
-                    rate: nil,
-                    eventType: .bolus,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: event,
-                    insulin: event.amount,
-                    notes: nil,
-                    carbs: nil,
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                )
-            case .journalCarbs:
-                return NigtscoutTreatment(
-                    duration: nil,
-                    rawDuration: nil,
-                    rawRate: nil,
-                    absolute: nil,
-                    rate: nil,
-                    eventType: .nsCarbCorrection,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: nil,
-                    insulin: nil,
-                    notes: nil,
-                    carbs: Decimal(event.carbInput ?? 0),
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                )
-            default: return nil
+        for i in 0 ..< events.count {
+            let event = events[i]
+            var nextEvent: PumpHistoryEvent?
+            if i + 1 < events.count {
+                nextEvent = events[i + 1]
             }
-        }
-
-        let misc = events.compactMap { event -> NigtscoutTreatment? in
-            switch event.type {
-            case .prime:
-                return NigtscoutTreatment(
-                    duration: event.duration,
-                    rawDuration: nil,
-                    rawRate: nil,
-                    absolute: nil,
-                    rate: nil,
-                    eventType: .nsSiteChange,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: event,
-                    insulin: nil,
-                    notes: nil,
-                    carbs: nil,
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                )
-            case .rewind:
-                return NigtscoutTreatment(
-                    duration: nil,
-                    rawDuration: nil,
-                    rawRate: nil,
-                    absolute: nil,
-                    rate: nil,
-                    eventType: .nsInsulinChange,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: nil,
-                    insulin: nil,
-                    notes: nil,
-                    carbs: nil,
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                )
-            case .pumpAlarm:
-                return NigtscoutTreatment(
-                    duration: 30, // minutes
-                    rawDuration: nil,
-                    rawRate: nil,
-                    absolute: nil,
-                    rate: nil,
-                    eventType: .nsAnnouncement,
-                    createdAt: event.timestamp,
-                    enteredBy: NigtscoutTreatment.local,
-                    bolus: nil,
-                    insulin: nil,
-                    notes: "Alarm \(String(describing: event.note)) \(event.type)",
-                    carbs: nil,
-                    fat: nil,
-                    protein: nil,
-                    targetTop: nil,
-                    targetBottom: nil
-                )
-            default: return nil
+            if event.type == .tempBasal, nextEvent?.type == .tempBasalDuration {
+                treatments.append(NightscoutTreatment(event: event, tempBasalDuration: nextEvent))
+            } else {
+                treatments.append(NightscoutTreatment(event: event))
             }
         }
 
-        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NigtscoutTreatment].self) ?? []
+        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedPumphistory, as: [NightscoutTreatment].self) ?? []
 
-        let treatments = Array(Set([bolusesAndCarbs, temps, misc].flatMap { $0 }).subtracting(Set(uploaded)))
+        let treatmentsToUpload = Set(treatments.compactMap { $0 }).subtracting(Set(uploaded))
 
-        return treatments.sorted { $0.createdAt! > $1.createdAt! }
+        return treatmentsToUpload.sorted { $0.createdAt! > $1.createdAt! }
     }
 
     func saveCancelTempEvents() {
@@ -392,3 +269,133 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
         storeEvents(events)
     }
 }
+
+extension NightscoutTreatment {
+    init?(event: PumpHistoryEvent, tempBasalDuration: PumpHistoryEvent? = nil) {
+        var basalDurationEvent: PumpHistoryEvent?
+        if tempBasalDuration != nil, tempBasalDuration?.timestamp == event.timestamp, event.type == .tempBasal,
+           tempBasalDuration?.type == .tempBasalDuration
+        {
+            basalDurationEvent = tempBasalDuration
+        }
+        switch event.type {
+        case .tempBasal:
+            self.init(
+                duration: basalDurationEvent?.durationMin,
+                rawDuration: basalDurationEvent,
+                rawRate: event,
+                absolute: event.rate,
+                rate: event.rate,
+                eventType: .nsTempBasal,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: nil,
+                insulin: nil,
+                notes: nil,
+                carbs: nil,
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        case .bolus:
+            let eventType = determineBolusEventType(for: event)
+            self.init(
+                duration: event.duration,
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: eventType,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: event,
+                insulin: event.amount,
+                notes: nil,
+                carbs: nil,
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        case .journalCarbs:
+            self.init(
+                duration: nil,
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: .nsCarbCorrection,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: nil,
+                insulin: nil,
+                notes: nil,
+                carbs: Decimal(event.carbInput ?? 0),
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        case .prime:
+            self.init(
+                duration: event.duration,
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: .nsSiteChange,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: event,
+                insulin: nil,
+                notes: nil,
+                carbs: nil,
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        case .rewind:
+            self.init(
+                duration: nil,
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: .nsInsulinChange,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: nil,
+                insulin: nil,
+                notes: nil,
+                carbs: nil,
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        case .pumpAlarm:
+            self.init(
+                duration: 30, // minutes
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: .nsAnnouncement,
+                createdAt: event.timestamp,
+                enteredBy: NightscoutTreatment.local,
+                bolus: nil,
+                insulin: nil,
+                notes: "Alarm \(String(describing: event.note)) \(event.type)",
+                carbs: nil,
+                fat: nil,
+                protein: nil,
+                targetTop: nil,
+                targetBottom: nil
+            )
+        default:
+            return nil
+        }
+    }
+}

+ 4 - 4
FreeAPS/Sources/APS/Storage/TempTargetsStorage.swift

@@ -10,7 +10,7 @@ protocol TempTargetsStorage {
     func storeTempTargets(_ targets: [TempTarget])
     func syncDate() -> Date
     func recent() -> [TempTarget]
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
+    func nightscoutTretmentsNotUploaded() -> [NightscoutTreatment]
     func storePresets(_ targets: [TempTarget])
     func presets() -> [TempTarget]
     func current() -> TempTarget?
@@ -82,12 +82,12 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
         return last
     }
 
-    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
-        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedTempTargets, as: [NigtscoutTreatment].self) ?? []
+    func nightscoutTretmentsNotUploaded() -> [NightscoutTreatment] {
+        let uploaded = storage.retrieve(OpenAPS.Nightscout.uploadedTempTargets, as: [NightscoutTreatment].self) ?? []
 
         let eventsManual = recent().filter { $0.enteredBy == TempTarget.manual }
         let treatments = eventsManual.map {
-            NigtscoutTreatment(
+            NightscoutTreatment(
                 duration: Int($0.duration),
                 rawDuration: nil,
                 rawRate: nil,

+ 1 - 1
FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings

@@ -940,7 +940,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings

@@ -1038,7 +1038,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "Um einen NIEDRIGEN BZ zu verhindern, werden %d g Kohlenhydrate benötigt";
 
 /* */
-"iAPS not active" = "iAPS ist nicht aktiv";
+"Open-iAPS Not Active" = "Open-iAPS ist nicht aktiv";
 
 /* */
 "Last loop was more than %d min ago" = "Letzter Loop vor mehr als %d Minuten";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
  "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
  /* */
- "iAPS not active" = "iAPS not active";
+ "Open-iAPS Not Active" = "Open-iAPS Not Active";
 
  /* */
  "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings

@@ -1034,7 +1034,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "Pour éviter BAS %d g de glucides requis";
 
 /* */
-"iAPS not active" = "iAPS pas actif";
+"Open-iAPS Not Active" = "Open-iAPS pas actif";
 
 /* */
 "Last loop was more than %d min ago" = "Dernier bouclage depuis plus de %d min";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/hu.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "To prevent LOW required %d g of carbs";
 
 /* */
-"iAPS not active" = "iAPS not active";
+"Open-iAPS Not Active" = "Open-iAPS Not Active";
 
 /* */
 "Last loop was more than %d min ago" = "Last loop was more than %d min ago";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "Per evitare glicemia BASSA servono %d g di carboidrati";
 
 /* */
-"iAPS not active" = "iAPS non attivo";
+"Open-iAPS Not Active" = "Open-iAPS non attivo";
 
 /* */
 "Last loop was more than %d min ago" = "L'ultimo ciclo è stato più di %d min fa";

+ 1 - 1
FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings

@@ -1035,7 +1035,7 @@ Enact a temp Basal or a temp target */
 "To prevent LOW required %d g of carbs" = "For å forhindre lavt blodsukker: %d g karbo nødvendig";
 
 /* */
-"iAPS not active" = "iAPS ikke aktiv";
+"Open-iAPS Not Active" = "Open-iAPS ikke aktiv";
 
 /* */
 "Last loop was more than %d min ago" = "Siste loop var mer enn %d min siden";

+ 0 - 0
FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings


部分文件因为文件数量过多而无法显示