Skip to content

Commit

Permalink
Merge pull request #387 from NordicSemiconductor/improvement/app-not-…
Browse files Browse the repository at this point in the history
…responding

App not responding issue fixed
  • Loading branch information
philips77 authored Oct 2, 2020
2 parents ad5c2e9 + d8d1684 commit 6526c67
Showing 1 changed file with 35 additions and 19 deletions.
54 changes: 35 additions & 19 deletions Example/iOSDFULibrary/View Controllers/DFUViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD
private var peripheralName : String?
private var dfuController : DFUServiceController!
private var centralManager : CBCentralManager!
private var firmwareProvider : DFUFirmwareProvider!
private var firmwareProvider : DFUFirmwareProvider?
private var partsCompleted : Int = 0
private var currentFirmwarePartsCompleted : Int = 0
private var firstPartRatio : Float = 1.0
Expand Down Expand Up @@ -98,26 +98,39 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD
func setTargetPeripheral(_ targetPeripheral: CBPeripheral, withName name: String?) {
self.dfuPeripheral = targetPeripheral
self.peripheralName = name
self.firmwareProvider = DFUFirmwareProvider.get(byName: name)
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
self.firmwareProvider = DFUFirmwareProvider.get(byName: name)
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if self.isViewLoaded {
self.initialize()
self.startDFUProcess()
}
}
}
}

override func viewDidLoad() {
super.viewDidLoad()

initialize()
startDFUProcess()
if let _ = firmwareProvider {
startDFUProcess()
}
}

private func initialize() {
if let firmware = firmwareProvider.firmware {
if let firmware = firmwareProvider?.firmware {
dfuStatusLabel.text = ""
partLabel.text = "1 / \(firmware.parts)"

startTime = Date()
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(DFUViewController.updateTimer), userInfo: nil, repeats: true)
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self,
selector: #selector(DFUViewController.updateTimer),
userInfo: nil, repeats: true)
updateTimer()
} else {
dfuStatusLabel.text = "No firmware found"
dfuStatusLabel.text = "Loading firmware..."
partLabel.text = "N/A"
}
totalProgressView.progress = 0.0
Expand Down Expand Up @@ -162,7 +175,8 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD
print("No DFU peripheral was set")
return
}
guard let firmware = firmwareProvider.firmware else {
guard let firmwareProvider = firmwareProvider,
let firmware = firmwareProvider.firmware else {
print("No firmware found. Check your Test Set")
return
}
Expand Down Expand Up @@ -238,9 +252,11 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD
// TODO:
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any], rssi RSSI: NSNumber) {
// Using the step filter, look for next target
if firmwareProvider.filter!(advertisementData) {
if let firmwareProvider = firmwareProvider,
firmwareProvider.filter!(advertisementData) {
// We found it!

// Stop scanning
Expand Down Expand Up @@ -288,11 +304,11 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD

addStepToCompleted(success: true)

if firmwareProvider.hasNext() {
if firmwareProvider.expectedError == nil {
if firmwareProvider!.hasNext() {
if firmwareProvider!.expectedError == nil {
prepareNextStep()
} else {
stepDescriptionLabel.text = "Step completed but error \(firmwareProvider.expectedError!.rawValue) was expected"
stepDescriptionLabel.text = "Step completed but error \(firmwareProvider!.expectedError!.rawValue) was expected"
}
} else {
stopTimer()
Expand All @@ -311,26 +327,26 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD
dfuController = nil

// If expected error was returned, continue with next test
if let expectedError = firmwareProvider.expectedError {
if let expectedError = firmwareProvider!.expectedError {
if expectedError == error {
// Increment the parts counter
partsCompleted += firmwareProvider.firmware!.parts - currentFirmwarePartsCompleted
partsCompleted += firmwareProvider!.firmware!.parts - currentFirmwarePartsCompleted

// Update the total progress view
let totalProgress = Float(partsCompleted) / Float(firmwareProvider.totalParts)
let totalProgress = Float(partsCompleted) / Float(firmwareProvider!.totalParts)
totalProgressView.setProgress(totalProgress, animated: true)

addStepToCompleted(success: false)

if firmwareProvider.hasNext() {
if firmwareProvider!.hasNext() {
prepareNextStep()
} else {
stopTimer()
stepDescriptionLabel.text = "Test finished"
}
} else {
stopTimer()
stepDescriptionLabel.text! += ": Failed with error \(error.rawValue) but \(firmwareProvider.expectedError!.rawValue) was expected"
stepDescriptionLabel.text! += ": Failed with error \(error.rawValue) but \(firmwareProvider!.expectedError!.rawValue) was expected"
stopProcessButton.setTitle("Restart", for: .normal)
}
} else {
Expand All @@ -342,7 +358,7 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD

private func addStepToCompleted(success: Bool) {
let mark = success ? "" : ""
completedStepsLabel.text = "\(mark) \(firmwareProvider.description!) (\(stepTimerLabel.text!))\n\(completedStepsLabel.text!)"
completedStepsLabel.text = "\(mark) \(firmwareProvider!.description!) (\(stepTimerLabel.text!))\n\(completedStepsLabel.text!)"
stepTimerLabel.text = ""
stepStartTime = nil
}
Expand All @@ -351,7 +367,7 @@ class DFUViewController: UIViewController, CBCentralManagerDelegate, DFUServiceD

func dfuProgressDidChange(for part: Int, outOf totalParts: Int, to progress: Int, currentSpeedBytesPerSecond: Double, avgSpeedBytesPerSecond: Double) {
// Update the total progress view
let totalProgress = (Float(partsCompleted) + (Float(progress) / 100.0)) / Float(firmwareProvider.totalParts)
let totalProgress = (Float(partsCompleted) + (Float(progress) / 100.0)) / Float(firmwareProvider!.totalParts)
totalProgressView.setProgress(totalProgress, animated: true)

// Update step progress view
Expand Down

0 comments on commit 6526c67

Please sign in to comment.