Restrict ESP32 only plugins, finish telemetry log.

This commit is contained in:
Garth Vander Houwen 2022-07-08 12:05:39 -07:00
parent 3b90bb7ecc
commit 95b35e7e45
6 changed files with 192 additions and 7 deletions

View file

@ -1259,13 +1259,12 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph
}
public func saveCannedMessageModuleConfig(config: ModuleConfig.CannedMessageConfig, messages: String, fromUser: UserEntity, toUser: UserEntity, wantResponse: Bool) -> Int64 {
public func saveCannedMessageModuleConfig(config: ModuleConfig.CannedMessageConfig, fromUser: UserEntity, toUser: UserEntity, wantResponse: Bool) -> Int64 {
var newMessageId: Int64 = 0
var adminPacket = AdminMessage()
adminPacket.setModuleConfig.cannedMessage = config
//adminPacket.setCannedMessageModulePart1 = messages
var meshPacket: MeshPacket = MeshPacket()
meshPacket.to = UInt32(toUser.num)
@ -1317,7 +1316,62 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph
return newMessageId
}
public func saveCannedMessageModuleMessages(messages: String, fromUser: UserEntity, toUser: UserEntity, wantResponse: Bool) -> Int64 {
var newMessageId: Int64 = 0
var adminPacket = AdminMessage()
adminPacket.setCannedMessageModulePart1 = messages
var meshPacket: MeshPacket = MeshPacket()
meshPacket.to = UInt32(toUser.num)
meshPacket.from = 0 //UInt32(fromUser.num)
meshPacket.id = UInt32.random(in: UInt32(UInt8.max)..<UInt32.max)
meshPacket.priority = MeshPacket.Priority.reliable
meshPacket.wantAck = wantResponse
var dataMessage = DataMessage()
dataMessage.payload = try! adminPacket.serializedData()
dataMessage.portnum = PortNum.adminApp
meshPacket.decoded = dataMessage
var toRadio: ToRadio!
toRadio = ToRadio()
toRadio.packet = meshPacket
let binaryData: Data = try! toRadio.serializedData()
if connectedPeripheral!.peripheral.state == CBPeripheralState.connected {
let newMessage = MessageEntity(context: context!)
newMessage.messageId = Int64(meshPacket.id)
newMessageId = newMessage.messageId
newMessage.messageTimestamp = Int32(Date().timeIntervalSince1970)
newMessage.receivedACK = false
newMessage.admin = true
newMessage.adminDescription = "Saved Canned Message Module Messages for \(toUser.longName ?? "Unknown")"
newMessage.fromUser = fromUser
newMessage.toUser = toUser
newMessage.messagePayload = messages
do {
try context!.save()
if meshLoggingEnabled { MeshLogger.log("💾 Saved Canned Message Module Messages Admin Message for node: \(String(toUser.num))") }
connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse)
} catch {
context!.rollback()
let nsError = error as NSError
print("💥 Error Inserting New Core Data MessageEntity: \(nsError)")
}
}
return newMessageId
}
public func saveExternalNotificationModuleConfig(config: ModuleConfig.ExternalNotificationConfig, fromUser: UserEntity, toUser: UserEntity, wantResponse: Bool) -> Int64 {
@ -1547,4 +1601,35 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph
}
return newMessageId
}
// Send an admin message to a radio, save a message to core data for logging
private func sendAdminMessageToRadio(adminDescription: String, messageId: Int64, fromUser: UserEntity, toUser: UserEntity, binaryData: Data) {
if connectedPeripheral!.peripheral.state == CBPeripheralState.connected {
let newMessage = MessageEntity(context: context!)
newMessage.messageId = Int64(messageId)
newMessage.messageTimestamp = Int32(Date().timeIntervalSince1970)
newMessage.receivedACK = false
newMessage.admin = true
newMessage.adminDescription = adminDescription
newMessage.fromUser = fromUser
newMessage.toUser = toUser
do {
try context!.save()
if meshLoggingEnabled { MeshLogger.log("💾 \(adminDescription)") }
connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse)
} catch {
context!.rollback()
let nsError = error as NSError
print("💥 Error inserting new core data MessageEntity: \(nsError)")
}
}
}
}

View file

@ -1299,6 +1299,8 @@ func telemetryPacket(packet: MeshPacket, meshLogging: Bool, context: NSManagedOb
telemetry.gasResistance = telemetryMessage.environmentMetrics.gasResistance
telemetry.relativeHumidity = telemetryMessage.environmentMetrics.relativeHumidity
telemetry.temperature = telemetryMessage.environmentMetrics.temperature
telemetry.current = telemetryMessage.environmentMetrics.current
telemetry.voltage = telemetryMessage.environmentMetrics.voltage
telemetry.metricsType = 1
}

View file

@ -26,8 +26,10 @@ struct TelemetryLog: View {
if UIDevice.current.userInterfaceIdiom == .pad || UIDevice.current.userInterfaceIdiom == .mac {
if tel.metricsType == 0 {
// Device Metrics
HStack {
Text("Device Metrics")
@ -75,6 +77,101 @@ struct TelemetryLog: View {
.foregroundColor(.gray)
.font(.callout)
}
} else if tel.metricsType == 1 {
// Environment Metrics
HStack {
Text("Environment Metrics")
.font(.title3)
let sensor = SensorTypes(rawValue: Int(node.telemetryConfig?.environmentSensorType ?? 0))
let tempReadingType = (!(node.telemetryConfig?.environmentDisplayFahrenheit ?? true)) ? "°F" : "°C"
if sensor == SensorTypes.bme280 ||
sensor == SensorTypes.bme680 ||
sensor == SensorTypes.shtc3 ||
sensor == SensorTypes.mcp9808 {
Image(systemName: "thermometer")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Temperature: \(String(format: "%.2f", tel.temperature))\(tempReadingType)")
.foregroundColor(.gray)
.font(.callout)
}
if sensor == SensorTypes.bme280 ||
sensor == SensorTypes.bme680 ||
sensor == SensorTypes.shtc3 {
Image(systemName: "humidity")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Relative Humidity: \(String(format: "%.2f", tel.relativeHumidity))")
.foregroundColor(.gray)
.font(.callout)
}
if sensor == SensorTypes.bme280 ||
sensor == SensorTypes.bme680 {
Image(systemName: "barometer")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Barometric Pressure: \(String(format: "%.2f", tel.barometricPressure))")
.foregroundColor(.gray)
.font(.callout)
}
if sensor == SensorTypes.bme680 {
Image(systemName: "aqi.medium")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Gas Resistance: \(String(format: "%.2f", tel.gasResistance))")
.foregroundColor(.gray)
.font(.callout)
}
if sensor == SensorTypes.ina219 ||
sensor == SensorTypes.ina260 {
Image(systemName: "directcurrent")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Current: \(String(format: "%.2f", tel.current))")
.foregroundColor(.gray)
.font(.callout)
Image(systemName: "bolt")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Voltage: \(String(format: "%.2f", tel.voltage))")
.foregroundColor(.gray)
.font(.callout)
}
Image(systemName: "clock.badge.checkmark.fill")
.font(.callout)
.foregroundColor(.accentColor)
.symbolRenderingMode(.hierarchical)
Text("Time:")
.foregroundColor(.gray)
.font(.callout)
DateTimeText(dateTime: tel.time)
.foregroundColor(.gray)
.font(.callout)
}
}
} else {

View file

@ -316,7 +316,7 @@ struct CannedMessagesConfig: View {
cmc.inputbrokerEventCcw = InputEventChars(rawValue: inputbrokerEventCcw)!.protoEnumValue()
cmc.inputbrokerEventPress = InputEventChars(rawValue: inputbrokerEventPress)!.protoEnumValue()
let adminMessageId = bleManager.saveCannedMessageModuleConfig(config: cmc, messages: "Where are you garth?, Hello",fromUser: node!.user!, toUser: node!.user!, wantResponse: true)
let adminMessageId = bleManager.saveCannedMessageModuleConfig(config: cmc, fromUser: node!.user!, toUser: node!.user!, wantResponse: true)
if adminMessageId > 0 {
// Should show a saved successfully alert once I know that to be true

View file

@ -272,6 +272,7 @@ struct SerialConfig: View {
.font(.caption)
}
}
.disabled(!(node!.myInfo?.hasWifi ?? false))
Button {
@ -281,7 +282,7 @@ struct SerialConfig: View {
Label("Save", systemImage: "square.and.arrow.down")
}
.disabled(bleManager.connectedPeripheral == nil || !hasChanges)
.disabled(bleManager.connectedPeripheral == nil || !hasChanges || !(node!.myInfo?.hasWifi ?? false))
.buttonStyle(.bordered)
.buttonBorderShape(.capsule)
.controlSize(.large)

View file

@ -135,7 +135,7 @@ struct Settings: View {
Image(systemName: "point.3.connected.trianglepath.dotted")
.symbolRenderingMode(.hierarchical)
Text("Range Test")
Text("Range Test (ESP32 Only)")
}
.disabled(bleManager.connectedPeripheral == nil)
@ -146,7 +146,7 @@ struct Settings: View {
Image(systemName: "terminal")
.symbolRenderingMode(.hierarchical)
Text("Serial")
Text("Serial (ESP32 Only)")
}
.disabled(bleManager.connectedPeripheral == nil)