Skip to content

Commit

Permalink
FEAT: Add ability to set bed temperature
Browse files Browse the repository at this point in the history
  • Loading branch information
josefdolezal committed May 7, 2017
1 parent c2b0f73 commit 8c4b640
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 4 deletions.
2 changes: 1 addition & 1 deletion OctoPhone/Coordinators/BedSettingsCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ final class BedSettingsCoordinator: ContextCoordinator {
}

override func start() {
let viewModel = BedSettingsViewModel(delegate: self)
let viewModel = BedSettingsViewModel(delegate: self, provider: provider)
let controller = BedSettingsViewController(viewModel: viewModel)
let navigation = UINavigationController(rootViewController: controller)

Expand Down
4 changes: 4 additions & 0 deletions OctoPhone/Generated/Localizable.Generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ enum L10n {
case couldNotSaveDownloadedListOfLogs
/// Could not save printer profiles.
case couldNotSavePrinterProfiles
/// Could not set bed temperature
case couldNotSetBedTemperature
/// Created profile could not be saved localy, but is created on printer.
case createdProfileCouldNotBeSavedLocaly
/// Database error
Expand Down Expand Up @@ -393,6 +395,8 @@ extension L10n: CustomStringConvertible {
return L10n.tr(key: "Could not save downloaded list of logs")
case .couldNotSavePrinterProfiles:
return L10n.tr(key: "Could not save printer profiles")
case .couldNotSetBedTemperature:
return L10n.tr(key: "Could not set bed temperature")
case .createdProfileCouldNotBeSavedLocaly:
return L10n.tr(key: "Created profile could not be saved localy")
case .databaseError:
Expand Down
14 changes: 14 additions & 0 deletions OctoPhone/Networking/OctoPrintAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ typealias OctoPrintProvider = DynamicProvider<OctoPrintAPI>
/// - homePrintHead - Moves print head to home position on given axes
/// - extrudeFilamen - Extrudes fixed amount of filament
/// - currentBedState - Reads current bed state
/// - setBedTemperature - Sets given amount to given temperature type
/// - currentJob - Reads info about current job
/// - cancelJob - Cancels current job
/// - listConnections - List available printer connections
Expand Down Expand Up @@ -78,6 +79,7 @@ enum OctoPrintAPI {
case extrudeFilament
// Bed
case currentBedState
case setBedTemperature(amout: Double, BedTemperatureType)
// Job
case currentJob
case cancelJob
Expand Down Expand Up @@ -202,6 +204,9 @@ extension OctoPrintAPI: TargetPart {
case .currentBedState:
return ("api/printer/bed", .get, .request, nil)

case let .setBedTemperature(amount, type):
return ("api/printer/bed", .post, .request, ["command": type.rawValue, type.rawValue: amount])

// Job
case .currentJob:
return ("api/job", .get, .request, nil)
Expand Down Expand Up @@ -273,3 +278,12 @@ enum JogDirection: Int {
case increase = 10
case decrease = -10
}

/// Supported bed temperature
///
/// - target: Target temperature
/// - offset: Offset temperature
enum BedTemperatureType: String {
case target
case offset
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class BedSettingsViewController: BaseViewController {
private let offsetTempLabel = BedSettingsViewController.inputLabel(text: tr(.offsetTemperature))

/// Input for bed target temperature
private let tagetTempField = BedSettingsViewController.inputField(placeholder: tr(.targetTemperature))
private let targetTempField = BedSettingsViewController.inputField(placeholder: tr(.targetTemperature))

/// Input for bed offset temperature
private let offsetTempField = BedSettingsViewController.inputField(placeholder: tr(.offsetTemperature))
Expand All @@ -57,7 +57,7 @@ class BedSettingsViewController: BaseViewController {
override func loadView() {
super.loadView()

let stackView = UIStackView(arrangedSubviews: [targetTempLabel, tagetTempField,
let stackView = UIStackView(arrangedSubviews: [targetTempLabel, targetTempField,
offsetTempLabel, offsetTempField],
axis: .vertical)

Expand All @@ -82,6 +82,16 @@ class BedSettingsViewController: BaseViewController {
/// user interaction to View Model inputs
private func bindViewModel() {
title = viewModel.outputs.title.value

reactive.displayableError <~ viewModel.outputs.displayError

targetTempField.reactive.continuousTextValues.observeValues { [weak self] value in
self?.viewModel.inputs.targetTemperatureChanged(value)
}

offsetTempField.reactive.continuousTextValues.observeValues { [weak self] value in
self?.viewModel.inputs.offsetTemperatureChanged(value)
}
}

/// UI Callback for done button tap
Expand Down Expand Up @@ -115,6 +125,7 @@ class BedSettingsViewController: BaseViewController {
}

input.placeholder = placeholder
input.keyboardType = .numbersAndPunctuation

return input
}
Expand Down
70 changes: 69 additions & 1 deletion OctoPhone/View Related/Bed Settings/BedSettingsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ import Result
protocol BedSettingsViewModelInputs {
/// Call when user decided to close bed settings
func doneButtonTapped()

/// Call when user changed target temperature
///
/// - Parameter value: New value of target temperature
func targetTemperatureChanged(_ value: String?)

/// Call when user changed offset temperature
///
/// - Parameter value: New value of offset temperature
func offsetTemperatureChanged(_ value: String?)
}

// MARK: - Outputs
Expand All @@ -23,6 +33,9 @@ protocol BedSettingsViewModelInputs {
protocol BedSettingsViewModelOutputs {
/// Screen title
var title: Property<String> { get }

/// Stream of displayable errors
var displayError: SignalProducer<DisplayableError, NoError> { get }
}

// MARK: - Common public interface
Expand Down Expand Up @@ -50,15 +63,48 @@ final class BedSettingsViewModel: BedSettingsViewModelType, BedSettingsViewModel

let title = Property<String>(value: tr(.bedSettings))

let displayError: SignalProducer<DisplayableError, NoError>

// MARK: Private properties

/// Actual value of target temperature
private let targetTemperatureProperty = MutableProperty<String?>(nil)

/// Actual value of offset temperature
private let offsetTemperatureProperty = MutableProperty<String?>(nil)

/// Holds last occured error
private let displayErrorProperty = MutableProperty<DisplayableError?>(nil)

/// Bed settings flow delegate
private weak var delegate: BedSettingsViewControllerDelegate?

/// Printer requests provider
private let provider: OctoPrintProvider

// MARK: Initializers

init(delegate: BedSettingsViewControllerDelegate) {
init(delegate: BedSettingsViewControllerDelegate, provider: OctoPrintProvider) {
self.delegate = delegate
self.provider = provider
self.displayError = displayErrorProperty.producer.skipNil()

targetTemperatureProperty.producer.skipNil()
.map({ Double($0) }).skipNil()
.filter({ $0 >= 0 })
.debounce(1, on: QueueScheduler.main)
.skipRepeats()
.startWithValues { [weak self] temperature in
self?.setTemperature(temprature: temperature, type: .target)
}

offsetTemperatureProperty.producer.skipNil()
.map({ Double($0) }).skipNil()
.debounce(1, on: QueueScheduler.main)
.skipRepeats()
.startWithValues { [weak self] temperature in
self?.setTemperature(temprature: temperature, type: .offset)
}
}

// MARK: Input methods
Expand All @@ -67,7 +113,29 @@ final class BedSettingsViewModel: BedSettingsViewModelType, BedSettingsViewModel
delegate?.doneButtonTapped()
}

func targetTemperatureChanged(_ value: String?) {
targetTemperatureProperty.value = value
}

func offsetTemperatureChanged(_ value: String?) {
offsetTemperatureProperty.value = value
}

// MARK: Output methods

// MARK: Internal logic

/// Sets the given temperature to the printer bed
///
/// - Parameters:
/// - temprature: Amount of degrees
/// - type: Type bed temperature
private func setTemperature(temprature: Double, type: BedTemperatureType) {
provider.request(.setBedTemperature(amout: temprature, type))
.filterSuccessfulStatusCodes()
.startWithFailed { [weak self] _ in
self?.displayErrorProperty.value = (tr(.anErrorOccured),
tr(.couldNotSetBedTemperature))
}
}
}
1 change: 1 addition & 0 deletions en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -256,3 +256,4 @@
"Bed settings" = "Bed settings";
"Target temperature" = "Target temeprature";
"Offset temperature" = "Offset temperature";
"Could not set bed temperature" = "Could not set bed temperature";

0 comments on commit 8c4b640

Please sign in to comment.