Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

App not responding issue fixed #387

Merged
merged 2 commits into from
Oct 2, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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