Meshtastic-Apple/Meshtastic/Views/Settings/ShareChannel.swift
Garth Vander Houwen 6c9e04284f
Merge pull request #163 from meshtastic/text_size_cleanup
Assorted 1.3.40 bug fixes
2022-09-06 16:51:13 -07:00

111 lines
2.9 KiB
Swift

//
// ShareChannel.swift
// MeshtasticApple
//
// Created by Garth Vander Houwen on 4/8/22.
//
import SwiftUI
import CoreData
import CoreImage.CIFilterBuiltins
struct QrCodeImage {
let context = CIContext()
func generateQRCode(from text: String) -> UIImage {
var qrImage = UIImage(systemName: "xmark.circle") ?? UIImage()
let data = Data(text.utf8)
let filter = CIFilter.qrCodeGenerator()
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 20, y: 20)
if let outputImage = filter.outputImage?.transformed(by: transform) {
if let image = context.createCGImage(
outputImage,
from: outputImage.extent) {
qrImage = UIImage(cgImage: image)
}
}
return qrImage
}
}
struct ShareChannel: View {
@Environment(\.managedObjectContext) var context
@EnvironmentObject var bleManager: BLEManager
@EnvironmentObject var userSettings: UserSettings
var node: NodeInfoEntity?
@State private var text = "https://meshtastic.org/E/#test"
var qrCodeImage = QrCodeImage()
var body: some View {
VStack {
GeometryReader { bounds in
let smallest = min(bounds.size.width, bounds.size.height)
ScrollView {
VStack {
Text("Scan the QR code below with the Apple or Android device you would like to share your channel settings with.")
.fixedSize(horizontal: false, vertical: true)
.font(.callout)
let image = qrCodeImage.generateQRCode(from: text)
Image(uiImage: image)
.resizable()
.scaledToFit()
.frame(
minWidth: smallest * 0.8,
maxWidth: smallest * 0.8,
minHeight: smallest * 0.8,
maxHeight: smallest * 0.8,
alignment: .center
)
if node!.loRaConfig != nil {
HStack {
let preset = ModemPresets(rawValue: Int(node!.loRaConfig!.modemPreset))
Text("Modem Preset \(preset!.description)").font(.title3)
}
}
HStack {
Text("Number of Channels: \(node!.myInfo!.maxChannels)").font(.title2)
}
}
.frame(width: bounds.size.width, height: bounds.size.height)
}
}
.navigationTitle("Share Channel")
.navigationBarTitleDisplayMode(.automatic)
.navigationBarItems(trailing:
ZStack {
ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "????")
})
.onAppear {
self.bleManager.context = context
let i: UInt32 = 1;
// while i < 9 { // this should actually loop over MyNodeInfo.maxChannels to get all channels
print("requesting channel",i)
let resp = self.bleManager.getChannel(channelIndex: i, wantResponse: true)
print("resp from getChannel", resp)
// i+=1;
// }
}
}
.navigationViewStyle(StackNavigationViewStyle())
}
}