From ec3581b4873ebf183b925369b371d1bd8c35cb96 Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Fri, 30 Sep 2016 17:10:34 -0700 Subject: [PATCH] Using the crown sequencer directly for carb/bolus input Fixes #173 --- .../AddCarbsInterfaceController.swift | 51 +++++++++----- .../BolusInterfaceController.swift | 67 ++++++++++++------- WatchApp Extension/ExtensionDelegate.swift | 5 +- WatchApp/Base.lproj/Interface.storyboard | 24 ++----- 4 files changed, 86 insertions(+), 61 deletions(-) diff --git a/WatchApp Extension/Controllers/AddCarbsInterfaceController.swift b/WatchApp Extension/Controllers/AddCarbsInterfaceController.swift index 9f0ce8211f..f4c84a9157 100644 --- a/WatchApp Extension/Controllers/AddCarbsInterfaceController.swift +++ b/WatchApp Extension/Controllers/AddCarbsInterfaceController.swift @@ -12,7 +12,21 @@ import WatchConnectivity final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClass { - private var carbValue: Int = 15 + fileprivate var carbValue: Int = 15 { + didSet { + guard carbValue >= 0 else { + carbValue = 0 + return + } + + guard carbValue <= 100 else { + carbValue = 100 + return + } + + valueLabel.setText(String(carbValue)) + } + } private var absorptionTime = AbsorptionTimeType.medium { didSet { @@ -33,8 +47,6 @@ final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClas @IBOutlet var valueLabel: WKInterfaceLabel! - @IBOutlet var valuePicker: WKInterfacePicker! - @IBOutlet var absorptionButtonA: WKInterfaceButton! @IBOutlet var absorptionButtonB: WKInterfaceButton! @@ -45,12 +57,7 @@ final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClas super.awake(withContext: context) // Configure interface objects here. - - let items = (0...100).map { _ in WKPickerItem() } - - valuePicker.setItems(items) - - valuePicker.setSelectedItemIndex(carbValue) + crownSequencer.delegate = self absorptionTime = .medium } @@ -59,7 +66,7 @@ final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClas // This method is called when watch view controller is about to be visible to user super.willActivate() - valuePicker.focus() + crownSequencer.focus() } override func didDeactivate() { @@ -69,17 +76,12 @@ final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClas // MARK: - Actions - @IBAction func pickerValueUpdated(_ value: Int) { - carbValue = value - valueLabel.setText(String(value)) - } - @IBAction func decrement() { - valuePicker.setSelectedItemIndex(carbValue - 5) + carbValue -= 5 } @IBAction func increment() { - valuePicker.setSelectedItemIndex(carbValue + 5) + carbValue += 5 } @IBAction func setAbsorptionTimeFast() { @@ -120,4 +122,19 @@ final class AddCarbsInterfaceController: WKInterfaceController, IdentifiableClas dismiss() } + // MARK: - Crown Sequencer + + fileprivate var accumulatedRotation: Double = 0 +} + +fileprivate let rotationsPerCarb: Double = 1/24 + +extension AddCarbsInterfaceController: WKCrownDelegate { + func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) { + accumulatedRotation += rotationalDelta + + let remainder = accumulatedRotation.truncatingRemainder(dividingBy: rotationsPerCarb) + carbValue += Int((accumulatedRotation - remainder).divided(by: rotationsPerCarb)) + accumulatedRotation = remainder + } } diff --git a/WatchApp Extension/Controllers/BolusInterfaceController.swift b/WatchApp Extension/Controllers/BolusInterfaceController.swift index 41006102e3..67a5672f69 100644 --- a/WatchApp Extension/Controllers/BolusInterfaceController.swift +++ b/WatchApp Extension/Controllers/BolusInterfaceController.swift @@ -13,8 +13,20 @@ import WatchConnectivity final class BolusInterfaceController: WKInterfaceController, IdentifiableClass { - private var bolusValue: Double = 0 { + fileprivate var pickerValue: Int = 0 { didSet { + guard pickerValue >= 0 else { + pickerValue = 0 + return + } + + guard pickerValue <= maxPickerValue else { + pickerValue = maxPickerValue + return + } + + let bolusValue = bolusValueFromPickerValue(pickerValue) + switch bolusValue { case let x where x < 1: formatter.minimumFractionDigits = 3 @@ -58,23 +70,24 @@ final class BolusInterfaceController: WKInterfaceController, IdentifiableClass { return formatter }() + private var maxPickerValue = 0 + /// 1.25 @IBOutlet var valueLabel: WKInterfaceLabel! - @IBOutlet var valuePicker: WKInterfacePicker! - /// REC: 2.25 U @IBOutlet var recommendedValueLabel: WKInterfaceLabel! override func awake(withContext context: Any?) { super.awake(withContext: context) - let maxPickerValue: Int var maxBolusValue: Double = 15 - let pickerValue: Int + var pickerValue = 0 + + let info: BolusSuggestionUserInfo? = BolusSuggestionUserInfo(recommendedBolus: 3.5, maxBolus: 10) - if let context = context as? BolusSuggestionUserInfo { - let recommendedBolus = context.recommendedBolus + if let context = info { + let recommendedBolus = 3.5 if let maxBolus = context.maxBolus { maxBolusValue = maxBolus @@ -82,31 +95,26 @@ final class BolusInterfaceController: WKInterfaceController, IdentifiableClass { maxBolusValue = recommendedBolus } - maxPickerValue = pickerValueFromBolusValue(maxBolusValue) let recommendedPickerValue = pickerValueFromBolusValue(recommendedBolus) maxBolusValue = bolusValueFromPickerValue(maxPickerValue) pickerValue = Int(Double(recommendedPickerValue) * 0.75) - bolusValue = bolusValueFromPickerValue(pickerValue) if let valueString = formatter.string(from: NSNumber(value: recommendedBolus)) { recommendedValueLabel.setText(String(format: NSLocalizedString("Rec: %@ U", comment: "The label and value showing the recommended bolus"), valueString).localizedUppercase) } - } else { - maxPickerValue = pickerValueFromBolusValue(maxBolusValue) - pickerValue = pickerValueFromBolusValue(bolusValue) - bolusValue = 0 } - let items = (0...maxPickerValue).map { _ in WKPickerItem() } - valuePicker.setItems(items) - valuePicker.setSelectedItemIndex(pickerValue) + self.maxPickerValue = pickerValueFromBolusValue(maxBolusValue) + self.pickerValue = pickerValue + + crownSequencer.delegate = self } override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() - valuePicker.focus() + crownSequencer.focus() } override func didDeactivate() { @@ -116,19 +124,17 @@ final class BolusInterfaceController: WKInterfaceController, IdentifiableClass { // MARK: - Actions - @IBAction func pickerValueUpdated(_ value: Int) { - bolusValue = bolusValueFromPickerValue(value) - } - @IBAction func decrement() { - valuePicker.setSelectedItemIndex(pickerValueFromBolusValue(bolusValue) - 10) + pickerValue -= 10 } @IBAction func increment() { - valuePicker.setSelectedItemIndex(pickerValueFromBolusValue(bolusValue) + 10) + pickerValue += 10 } @IBAction func deliver() { + let bolusValue = bolusValueFromPickerValue(pickerValue) + if bolusValue > 0 { let bolus = SetBolusUserInfo(value: bolusValue, startDate: Date()) @@ -150,4 +156,19 @@ final class BolusInterfaceController: WKInterfaceController, IdentifiableClass { dismiss() } + // MARK: - Crown Sequencer + + fileprivate var accumulatedRotation: Double = 0 +} + +fileprivate let rotationsPerValue: Double = 1/24 + +extension BolusInterfaceController: WKCrownDelegate { + func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) { + accumulatedRotation += rotationalDelta + + let remainder = accumulatedRotation.truncatingRemainder(dividingBy: rotationsPerValue) + pickerValue += Int((accumulatedRotation - remainder).divided(by: rotationsPerValue)) + accumulatedRotation = remainder + } } diff --git a/WatchApp Extension/ExtensionDelegate.swift b/WatchApp Extension/ExtensionDelegate.swift index 5e2ad95f4b..b4f946b104 100644 --- a/WatchApp Extension/ExtensionDelegate.swift +++ b/WatchApp Extension/ExtensionDelegate.swift @@ -127,13 +127,12 @@ final class ExtensionDelegate: NSObject, WKExtensionDelegate { for complication in server.activeComplications ?? [] { // In watchOS 2, we forced a timeline reload every 8 hours because attempting to extend it indefinitely seemed to lead to the complication "freezing". if UserDefaults.standard.complicationDataLastRefreshed.timeIntervalSinceNow < TimeInterval(hours: -8) { + UserDefaults.standard.complicationDataLastRefreshed = Date() os_log("Reloading complication timeline") server.reloadTimeline(for: complication) } else { os_log("Extending complication timeline") - // TODO: Switch this back to extendTimeline if things are working correctly. - // Time Travel appears to be disabled by default in watchOS 3 anyway - server.reloadTimeline(for: complication) + server.extendTimeline(for: complication) } } } diff --git a/WatchApp/Base.lproj/Interface.storyboard b/WatchApp/Base.lproj/Interface.storyboard index 45440a50ce..f58c6910b6 100644 --- a/WatchApp/Base.lproj/Interface.storyboard +++ b/WatchApp/Base.lproj/Interface.storyboard @@ -1,5 +1,5 @@ - - + + @@ -12,16 +12,11 @@ - - - - - -