mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
After this change, a developer can now clone the project and run without the build failing due to lint errors! 😃
* I ran `swiftlint --fix` to resolve many auto-correctable issues (mostly whitespace)
* Excluded the `Meshtastic/Protobufs` directory from lint, since that code is automatically generated.
* Converted some single letter method parameters to lowercase.
* Converted several instances `force_cast` to instead use `guard` or `if let` to unwrap optional values. During this change, some of the SwiftUI views became "too complex to be solved in a reasonable time", so I broke up the views into distinct sub-expressions.
I was able to build and run the app on an iOS simulator.
142 lines
5 KiB
Swift
142 lines
5 KiB
Swift
//
|
|
// WriteCsvFile.swift
|
|
// Meshtastic
|
|
//
|
|
// Copyright(c) Garth Vander Houwen 7/15/22.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> String {
|
|
var csvString: String = ""
|
|
let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current)
|
|
let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "")
|
|
if metricsType == 0 {
|
|
// Create Device Metrics Header
|
|
csvString = "\("battery.level".localized), \("voltage".localized), \("channel.utilization".localized), \("airtime".localized), \("uptime".localized), \("timestamp".localized)"
|
|
for dm in telemetry {
|
|
if dm.metricsType == 0 {
|
|
csvString += "\n"
|
|
csvString += String(dm.batteryLevel)
|
|
csvString += ", "
|
|
csvString += String(dm.voltage)
|
|
csvString += ", "
|
|
csvString += String(dm.channelUtilization)
|
|
csvString += ", "
|
|
csvString += String(dm.airUtilTx)
|
|
csvString += ", "
|
|
csvString += String(dm.uptimeSeconds)
|
|
csvString += ", "
|
|
csvString += dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized
|
|
}
|
|
}
|
|
} else if metricsType == 1 {
|
|
// Create Environment Telemetry Header
|
|
csvString = "Temperature, Relative Humidity, Barometric Pressure, Indoor Air Quality, Gas Resistance, \("timestamp".localized)"
|
|
for dm in telemetry {
|
|
if dm.metricsType == 1 {
|
|
csvString += "\n"
|
|
csvString += String(dm.temperature.localeTemperature())
|
|
csvString += ", "
|
|
csvString += String(dm.relativeHumidity)
|
|
csvString += ", "
|
|
csvString += String(dm.barometricPressure)
|
|
csvString += ", "
|
|
csvString += String(dm.iaq)
|
|
csvString += ", "
|
|
csvString += String(dm.gasResistance)
|
|
csvString += ", "
|
|
csvString += dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized
|
|
}
|
|
}
|
|
}
|
|
return csvString
|
|
}
|
|
|
|
func detectionsToCsv(detections: [MessageEntity]) -> String {
|
|
var csvString: String = ""
|
|
let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current)
|
|
let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "")
|
|
// Create Header
|
|
csvString = "Detection event, \("timestamp".localized)"
|
|
for d in detections {
|
|
csvString += "\n"
|
|
csvString += d.messagePayload ?? "Detection"
|
|
csvString += ", "
|
|
csvString += d.timestamp.formattedDate(format: dateFormatString).localized
|
|
}
|
|
return csvString
|
|
}
|
|
|
|
func paxToCsvFile(pax: [PaxCounterEntity]) -> String {
|
|
var csvString: String = ""
|
|
let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current)
|
|
let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "")
|
|
// Create PAX Header
|
|
csvString = "BLE, WiFi, Total Pax, Uptime, \("timestamp".localized)"
|
|
for p in pax {
|
|
csvString += "\n"
|
|
csvString += String(p.ble)
|
|
csvString += ", "
|
|
csvString += String(p.wifi)
|
|
csvString += ", "
|
|
csvString += String(p.ble + p.wifi)
|
|
csvString += ", "
|
|
csvString += String(p.uptime)
|
|
csvString += ", "
|
|
csvString += p.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized
|
|
}
|
|
return csvString
|
|
}
|
|
|
|
func positionToCsvFile(positions: [PositionEntity]) -> String {
|
|
var csvString: String = ""
|
|
let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current)
|
|
let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "")
|
|
// Create Position Header
|
|
csvString = "SeqNo, Latitude, Longitude, Altitude, Sats, Speed, Heading, SNR, \("timestamp".localized)"
|
|
for pos in positions {
|
|
csvString += "\n"
|
|
csvString += String(pos.seqNo)
|
|
csvString += ", "
|
|
csvString += String((pos.latitude ?? 0))
|
|
csvString += ", "
|
|
csvString += String(pos.longitude ?? 0)
|
|
csvString += ", "
|
|
csvString += String(pos.altitude)
|
|
csvString += ", "
|
|
csvString += String(pos.satsInView)
|
|
csvString += ", "
|
|
csvString += String(pos.speed)
|
|
csvString += ", "
|
|
csvString += String(pos.heading)
|
|
csvString += ", "
|
|
csvString += String(pos.snr)
|
|
csvString += ", "
|
|
csvString += pos.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized
|
|
}
|
|
return csvString
|
|
}
|
|
|
|
func routeToCsvFile(locations: [LocationEntity]) -> String {
|
|
var csvString: String = ""
|
|
let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current)
|
|
let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "")
|
|
// Create Position Header
|
|
csvString = "Id, Latitude, Longitude, Altitude, Speed, Heading"
|
|
for loc in locations {
|
|
csvString += "\n"
|
|
csvString += String(loc.id)
|
|
csvString += ", "
|
|
csvString += String((loc.latitude ?? 0))
|
|
csvString += ", "
|
|
csvString += String(loc.longitude ?? 0)
|
|
csvString += ", "
|
|
csvString += String(loc.altitude)
|
|
csvString += ", "
|
|
csvString += String(loc.speed)
|
|
csvString += ", "
|
|
csvString += String(loc.heading)
|
|
}
|
|
return csvString
|
|
}
|