Skip to content

Commit

Permalink
Merge pull request #138 from treastrain/replace-to-async-sequence-int…
Browse files Browse the repository at this point in the history
…erface

Replace to async sequence interface
  • Loading branch information
treastrain authored Oct 20, 2024
2 parents 4bdd3d8 + 9ea16fa commit 96cb10b
Show file tree
Hide file tree
Showing 72 changed files with 1,103 additions and 4,303 deletions.
89 changes: 24 additions & 65 deletions Examples/TRETNFCKitExample/NFCFeliCaTagReaderExampleView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
//

import SwiftUI
import TRETNFCKit_Async
import TRETNFCKit_Core
import TRETNFCKit_FeliCa

struct NFCFeliCaTagReaderExampleView: View {
@State private var isPresented = false
@ObservedObject var viewModel = ViewModel()
@State private var readerSession: AsyncNFCTagReaderSession?
@State private var readerSession: NFCTagReaderSession?

var body: some View {
List {
Expand All @@ -21,69 +20,55 @@ struct NFCFeliCaTagReaderExampleView: View {
} label: {
Text("Read (using view modifier)")
}
.disabled(!NFCTagReaderSession.readingAvailable || isPresented)
Button {
Task {
try await viewModel.read()
}
} label: {
Text("Read (using reader)")
}
Button {
readerSession = AsyncNFCTagReaderSession(pollingOption: .iso18092)
readerSession = NFCTagReaderSession(pollingOption: .iso18092)
} label: {
Text("Read (using async stream)")
}
.disabled(readerSession != nil)
.disabled(!NFCTagReaderSession.readingAvailable || readerSession != nil)
}
.feliCaTagReader(
isPresented: $isPresented,
detectingAlertMessage: "Place the tag on a flat, non-metal surface and rest your iPhone on the tag.",
onBeginReadingError: { error in
print(error)
terminatingAlertMessage: "CANCELLED",
onDidBecomeActive: { readerSession in
print(readerSession.alertMessage)
},
didBecomeActive: { reader in
await print(reader.alertMessage)
onDidDetect: { readerSession, tags in
do {
let tag = tags.first!
let feliCaTag = try await readerSession.connectAsFeliCaTag(to: tag)
let (idm, systemCode) = try await feliCaTag.polling(systemCode: Data([0xFE, 0x00]), requestCode: .systemCode, timeSlot: .max1)
readerSession.alertMessage = "\(systemCode as NSData)\n\(idm as NSData)"
readerSession.invalidate()
} catch {
readerSession.invalidate(errorMessage: error.localizedDescription)
}
},
didInvalidate: { error in
onDidInvalidate: { error in
print(error)
},
didDetect: { reader, tags in
let tag = tags.first!
let feliCaTag = try await reader.connectAsFeliCaTag(to: tag)
let (idm, systemCode) = try await feliCaTag.polling(systemCode: Data([0xFE, 0x00]), requestCode: .systemCode, timeSlot: .max1)
await reader.set(alertMessage: "\(systemCode as NSData)\n\(idm as NSData)")
return .success
}
)
.task(id: readerSession == nil) {
defer { readerSession = nil }
guard let readerSession else { return }
guard AsyncNFCTagReaderSession.readingAvailable else { return }

guard NFCTagReaderSession.readingAvailable else { return }
readerSession.alertMessage = "Place the tag on a flat, non-metal surface and rest your iPhone on the tag."
for await event in readerSession.eventStream {
switch event {
case .sessionIsReady:
readerSession.alertMessage = "Place the tag on a flat, non-metal surface and rest your iPhone on the tag."
readerSession.start()
case .sessionStarted:
break
case .sessionBecomeActive:
break
case .sessionDetected(let tags):
do {
let tag = tags.first!
guard case .feliCa(let feliCaTag) = tag else {
throw NFCReaderError(.readerErrorInvalidParameter)
}
try await readerSession.connect(to: tag)
let feliCaTag = try await readerSession.connectAsFeliCaTag(to: tag)
let (idm, systemCode) = try await feliCaTag.polling(systemCode: Data([0xFE, 0x00]), requestCode: .systemCode, timeSlot: .max1)
readerSession.alertMessage = "\(systemCode as NSData)\n\(idm as NSData)"
readerSession.stop()
readerSession.invalidate()
} catch {
readerSession.stop(errorMessage: error.localizedDescription)
readerSession.invalidate(errorMessage: error.localizedDescription)
}
case .sessionCreationFailed(let reason):
print(reason)
case .sessionInvalidated(let reason):
print(reason)
}
Expand All @@ -92,29 +77,3 @@ struct NFCFeliCaTagReaderExampleView: View {
.navigationTitle("FeliCa")
}
}

extension NFCFeliCaTagReaderExampleView {
final class ViewModel : ObservableObject {
private var reader: FeliCaTagReader!

func read() async throws {
reader = .init()
try await reader.read(
detectingAlertMessage: "Place the tag on a flat, non-metal surface and rest your iPhone on the tag.",
didBecomeActive: { reader in
await print(reader.alertMessage)
},
didInvalidate: { error in
print(error)
},
didDetect: { reader, tags in
let tag = tags.first!
let feliCaTag = try await reader.connectAsFeliCaTag(to: tag)
let (idm, systemCode) = try await feliCaTag.polling(systemCode: Data([0xFE, 0x00]), requestCode: .systemCode, timeSlot: .max1)
await reader.set(alertMessage: "\(systemCode as NSData)\n\(idm as NSData)")
return .success
}
)
}
}
}
81 changes: 22 additions & 59 deletions Examples/TRETNFCKitExample/NFCISO15693TagReaderExampleView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
//

import SwiftUI
import TRETNFCKit_Async
import TRETNFCKit_Core
import TRETNFCKit_ISO15693

struct NFCISO15693TagReaderExampleView: View {
@State private var isPresented = false
@ObservedObject var viewModel = ViewModel()
@State private var readerSession: AsyncNFCTagReaderSession?
@State private var readerSession: NFCTagReaderSession?

var body: some View {
List {
Expand All @@ -21,51 +20,42 @@ struct NFCISO15693TagReaderExampleView: View {
} label: {
Text("Read (using view modifier)")
}
.disabled(!NFCTagReaderSession.readingAvailable || isPresented)
Button {
Task {
try await viewModel.read()
}
} label: {
Text("Read (using reader)")
}
Button {
readerSession = AsyncNFCTagReaderSession(pollingOption: .iso15693)
readerSession = NFCTagReaderSession(pollingOption: .iso15693)
} label: {
Text("Read (using async stream)")
}
.disabled(readerSession != nil)
.disabled(!NFCTagReaderSession.readingAvailable || readerSession != nil)
}
.iso15693TagReader(
isPresented: $isPresented,
detectingAlertMessage: "Place the tag on a flat, non-metal surface and rest your iPhone on the tag.",
onBeginReadingError: { error in
print(error)
terminatingAlertMessage: "CANCELLED",
onDidBecomeActive: { readerSession in
print(readerSession.alertMessage)
},
didBecomeActive: { reader in
await print(reader.alertMessage)
onDidDetect: { readerSession, tags in
do {
let tag = tags.first!
let iso15693Tag = try await readerSession.connectAsISO15693Tag(to: tag)
readerSession.alertMessage = "\(iso15693Tag.identifier as NSData)"
readerSession.invalidate()
} catch {
readerSession.invalidate(errorMessage: error.localizedDescription)
}
},
didInvalidate: { error in
onDidInvalidate: { error in
print(error)
},
didDetect: { reader, tags in
let tag = tags.first!
let iso15693Tag = try await reader.connectAsISO15693Tag(to: tag)
await reader.set(alertMessage: "\(iso15693Tag.identifier as NSData)")
return .success
}
)
.task(id: readerSession == nil) {
defer { readerSession = nil }
guard let readerSession else { return }
guard AsyncNFCTagReaderSession.readingAvailable else { return }

guard NFCTagReaderSession.readingAvailable else { return }
readerSession.alertMessage = "Place the tag on a flat, non-metal surface and rest your iPhone on the tag."
for await event in readerSession.eventStream {
switch event {
case .sessionIsReady:
readerSession.alertMessage = "Place the tag on a flat, non-metal surface and rest your iPhone on the tag."
readerSession.start()
case .sessionStarted:
break
case .sessionBecomeActive:
break
case .sessionDetected(let tags):
Expand All @@ -76,12 +66,10 @@ struct NFCISO15693TagReaderExampleView: View {
}
try await readerSession.connect(to: tag)
readerSession.alertMessage = "\(iso15693Tag.identifier as NSData)"
readerSession.stop()
readerSession.invalidate()
} catch {
readerSession.stop(errorMessage: error.localizedDescription)
readerSession.invalidate(errorMessage: error.localizedDescription)
}
case .sessionCreationFailed(let reason):
print(reason)
case .sessionInvalidated(let reason):
print(reason)
}
Expand All @@ -90,28 +78,3 @@ struct NFCISO15693TagReaderExampleView: View {
.navigationTitle("ISO 15693-compatible")
}
}

extension NFCISO15693TagReaderExampleView {
final class ViewModel : ObservableObject {
private var reader: ISO15693TagReader!

func read() async throws {
reader = .init()
try await reader.read(
detectingAlertMessage: "Place the tag on a flat, non-metal surface and rest your iPhone on the tag.",
didBecomeActive: { reader in
await print(reader.alertMessage)
},
didInvalidate: { error in
print(error)
},
didDetect: { reader, tags in
let tag = tags.first!
let iso15693Tag = try await reader.connectAsISO15693Tag(to: tag)
await reader.set(alertMessage: "\(iso15693Tag.identifier as NSData)")
return .success
}
)
}
}
}
Loading

0 comments on commit 96cb10b

Please sign in to comment.