Explorar o código

Merge pull request #223 from dnzxy/calendar-iob-cob

Extend calendar events with emojis and settings
Jon B Mårtensson %!s(int64=2) %!d(string=hai) anos
pai
achega
e79d92856e

+ 2 - 0
FreeAPS/Resources/json/defaults/freeaps/freeaps_settings.json

@@ -14,6 +14,8 @@
   "cgm" : "nightscout",
   "cgm" : "nightscout",
   "uploadGlucose" : true,
   "uploadGlucose" : true,
   "useCalendar" : false,
   "useCalendar" : false,
+  "displayCalendarEmojis" : false,
+  "displayCalendarIOBandCOB" : false,
   "glucoseBadge" : false,
   "glucoseBadge" : false,
   "glucoseNotificationsAlways" : false,
   "glucoseNotificationsAlways" : false,
   "useAlarmSound" : false,
   "useAlarmSound" : false,

+ 10 - 0
FreeAPS/Sources/Models/FreeAPSSettings.swift

@@ -15,6 +15,8 @@ struct FreeAPSSettings: JSON, Equatable {
     var cgm: CGMType = .nightscout
     var cgm: CGMType = .nightscout
     var uploadGlucose: Bool = true
     var uploadGlucose: Bool = true
     var useCalendar: Bool = false
     var useCalendar: Bool = false
+    var displayCalendarIOBandCOB: Bool = false
+    var displayCalendarEmojis: Bool = false
     var glucoseBadge: Bool = false
     var glucoseBadge: Bool = false
     var glucoseNotificationsAlways: Bool = false
     var glucoseNotificationsAlways: Bool = false
     var useAlarmSound: Bool = false
     var useAlarmSound: Bool = false
@@ -113,6 +115,14 @@ extension FreeAPSSettings: Decodable {
             settings.useCalendar = useCalendar
             settings.useCalendar = useCalendar
         }
         }
 
 
+        if let displayCalendarIOBandCOB = try? container.decode(Bool.self, forKey: .displayCalendarIOBandCOB) {
+            settings.displayCalendarIOBandCOB = displayCalendarIOBandCOB
+        }
+
+        if let displayCalendarEmojis = try? container.decode(Bool.self, forKey: .displayCalendarEmojis) {
+            settings.displayCalendarEmojis = displayCalendarEmojis
+        }
+
         if let useAppleHealth = try? container.decode(Bool.self, forKey: .useAppleHealth) {
         if let useAppleHealth = try? container.decode(Bool.self, forKey: .useAppleHealth) {
             settings.useAppleHealth = useAppleHealth
             settings.useAppleHealth = useAppleHealth
         }
         }

+ 4 - 0
FreeAPS/Sources/Modules/CGM/CGMStateModel.swift

@@ -16,6 +16,8 @@ extension CGM {
         @Published var uploadGlucose = true
         @Published var uploadGlucose = true
         @Published var smoothGlucose = false
         @Published var smoothGlucose = false
         @Published var createCalendarEvents = false
         @Published var createCalendarEvents = false
+        @Published var displayCalendarIOBandCOB = false
+        @Published var displayCalendarEmojis = false
         @Published var calendarIDs: [String] = []
         @Published var calendarIDs: [String] = []
         @Published var currentCalendarID: String = ""
         @Published var currentCalendarID: String = ""
         @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil
         @Persisted(key: "CalendarManager.currentCalendarID") var storedCalendarID: String? = nil
@@ -28,6 +30,8 @@ extension CGM {
             cgmTransmitterDeviceAddress = UserDefaults.standard.cgmTransmitterDeviceAddress
             cgmTransmitterDeviceAddress = UserDefaults.standard.cgmTransmitterDeviceAddress
 
 
             subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 }
             subscribeSetting(\.useCalendar, on: $createCalendarEvents) { createCalendarEvents = $0 }
+            subscribeSetting(\.displayCalendarIOBandCOB, on: $displayCalendarIOBandCOB) { displayCalendarIOBandCOB = $0 }
+            subscribeSetting(\.displayCalendarEmojis, on: $displayCalendarEmojis) { displayCalendarEmojis = $0 }
             subscribeSetting(\.smoothGlucose, on: $smoothGlucose, initial: { smoothGlucose = $0 })
             subscribeSetting(\.smoothGlucose, on: $smoothGlucose, initial: { smoothGlucose = $0 })
 
 
             $cgm
             $cgm

+ 3 - 1
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -54,13 +54,15 @@ extension CGM {
                         Text("Calibrations").navigationLink(to: .calibrations, from: self)
                         Text("Calibrations").navigationLink(to: .calibrations, from: self)
                     }
                     }
                     Section(header: Text("Calendar")) {
                     Section(header: Text("Calendar")) {
-                        Toggle("Create events in calendar", isOn: $state.createCalendarEvents)
+                        Toggle("Create Events in Calendar", isOn: $state.createCalendarEvents)
                         if state.calendarIDs.isNotEmpty {
                         if state.calendarIDs.isNotEmpty {
                             Picker("Calendar", selection: $state.currentCalendarID) {
                             Picker("Calendar", selection: $state.currentCalendarID) {
                                 ForEach(state.calendarIDs, id: \.self) {
                                 ForEach(state.calendarIDs, id: \.self) {
                                     Text($0).tag($0)
                                     Text($0).tag($0)
                                 }
                                 }
                             }
                             }
+                            Toggle("Display Emojis as Labels", isOn: $state.displayCalendarEmojis)
+                            Toggle("Display IOB and COB", isOn: $state.displayCalendarIOBandCOB)
                         }
                         }
                     }
                     }
 
 

+ 24 - 2
FreeAPS/Sources/Services/Calendar/CalendarManager.swift

@@ -63,6 +63,10 @@ final class BaseCalendarManager: CalendarManager, Injectable {
         // create an event now
         // create an event now
         let event = EKEvent(eventStore: eventStore)
         let event = EKEvent(eventStore: eventStore)
 
 
+        var glucoseIcon = "🟢"
+        glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon
+        glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon
+
         let glucoseText = glucoseFormatter
         let glucoseText = glucoseFormatter
             .string(from: Double(
             .string(from: Double(
                 settingsManager.settings.units == .mmolL ?glucoseValue
                 settingsManager.settings.units == .mmolL ?glucoseValue
@@ -79,9 +83,27 @@ final class BaseCalendarManager: CalendarManager, Injectable {
         let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? ""
         let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? ""
         let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? ""
         let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? ""
 
 
-        let title = glucoseText + " " + directionText + " " + deltaText + "; IOB: " + iobText + " COB: " + cobText
+        var glucoseDisplayText = settingsManager.settings.displayCalendarEmojis ? glucoseIcon + " " : ""
+        glucoseDisplayText += glucoseText + " " + directionText + " " + deltaText
+
+        var iobDisplayText = ""
+        var cobDisplayText = ""
+
+        if settingsManager.settings.displayCalendarIOBandCOB {
+            if settingsManager.settings.displayCalendarEmojis {
+                iobDisplayText += "💉"
+                cobDisplayText += "🥨"
+            } else {
+                iobDisplayText += "IOB:"
+                cobDisplayText += "COB:"
+            }
+            iobDisplayText += " " + iobText
+            cobDisplayText += " " + cobText
+
+            event.location = iobDisplayText + " " + cobDisplayText
+        }
 
 
-        event.title = title
+        event.title = glucoseDisplayText
         event.notes = "iAPS"
         event.notes = "iAPS"
         event.startDate = Date()
         event.startDate = Date()
         event.endDate = Date(timeIntervalSinceNow: 60 * 10)
         event.endDate = Date(timeIntervalSinceNow: 60 * 10)