Skip to content

Commit 9758043

Browse files
authored
Merge pull request #11 from panandafog/development
Version 0.2.0
2 parents 3b99da6 + 61d4cf2 commit 9758043

34 files changed

+1764
-788
lines changed

Accelerometer.xcodeproj/project.pbxproj

Lines changed: 82 additions & 24 deletions
Large diffs are not rendered by default.

Accelerometer.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Accelerometer/AccelerometerApp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct AccelerometerApp: App {
1717

1818
init() {
1919
self.measurer = Measurer(settings: settings)
20-
self.recorder = Recorder(measurer: measurer)
20+
self.recorder = Recorder(measurer: measurer, settings: settings)
2121
}
2222

2323
var body: some Scene {

Accelerometer/ContentView.swift

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,50 @@
88
import SwiftUI
99

1010
struct ContentView: View {
11-
11+
@EnvironmentObject var recorder: Recorder
12+
@State private var selectedTab = 0
13+
1214
var body: some View {
13-
TabView {
15+
TabView(selection: $selectedTab) {
1416
NavigationView {
1517
MeasurementsView()
16-
.navigationTitle(Text("Measurements"))
18+
.navigationTitle("Measurements")
1719
}
1820
.phoneOnlyStackNavigationView()
1921
.tabItem {
2022
Label("Measurements", systemImage: "list.bullet")
2123
}
22-
24+
.tag(0)
25+
2326
NavigationView {
2427
RecordingsView()
25-
.navigationTitle(Text("Recordings"))
28+
.navigationTitle("Recordings")
2629
}
2730
.phoneOnlyStackNavigationView()
2831
.tabItem {
2932
Label("Recordings", systemImage: "play")
3033
}
31-
34+
.tag(1)
35+
3236
NavigationView {
3337
SettingsView()
34-
.navigationTitle(Text("Settings"))
38+
.navigationTitle("Settings")
3539
}
3640
.navigationViewStyle(.stack)
3741
.tabItem {
3842
Label("Settings", systemImage: "gear")
3943
}
44+
.tag(2)
4045
}
4146
}
4247
}
4348

49+
4450
struct ContentView_Previews: PreviewProvider {
4551

4652
static let settings = Settings()
4753
static let measurer = Measurer(settings: settings)
48-
static let recorder = Recorder(measurer: measurer)
54+
static let recorder = Recorder(measurer: measurer, settings: settings)
4955

5056
static var previews: some View {
5157
ContentView()

Accelerometer/Extensions/Bool.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,29 @@
66
//
77

88
import Foundation
9+
import Charts
910

10-
extension Bool: Comparable {
11+
extension Bool: @retroactive Comparable {
1112
public static func < (lhs: Bool, rhs: Bool) -> Bool {
1213
(lhs == false) && (rhs == true)
1314
}
1415
}
16+
17+
extension Bool: @retroactive Plottable {
18+
public typealias PrimitivePlottable = Double
19+
20+
public var primitivePlottable: Double {
21+
self ? 1.0 : 0.0
22+
}
23+
24+
public init?(primitivePlottable: Double) {
25+
switch primitivePlottable {
26+
case 0.0:
27+
self = false
28+
case 1.0:
29+
self = true
30+
default:
31+
return nil
32+
}
33+
}
34+
}

Accelerometer/Extensions/View.swift

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ extension View {
2323
var statusBarOrientation: UIInterfaceOrientation? {
2424
get {
2525
guard let orientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation else {
26-
#if DEBUG
26+
#if DEBUG
2727
fatalError("Could not obtain UIInterfaceOrientation from a valid windowScene")
28-
#else
28+
#else
2929
return nil
30-
#endif
30+
#endif
3131
}
3232
return orientation
3333
}
@@ -40,6 +40,30 @@ extension View {
4040
self
4141
}
4242
}
43+
44+
func exportable(
45+
isPresented: Binding<Bool>,
46+
url: Binding<URL?>,
47+
filename: String
48+
) -> some View {
49+
modifier(ExportModifier(
50+
isPresented: isPresented,
51+
url: url,
52+
filename: filename
53+
))
54+
}
55+
56+
func exportable(
57+
isPresented: Binding<Bool>,
58+
url: Binding<URL?>,
59+
measurementType: MeasurementType
60+
) -> some View {
61+
modifier(ExportModifier(
62+
isPresented: isPresented,
63+
url: url,
64+
measurementType: measurementType
65+
))
66+
}
4367
}
4468

4569
struct RoundedCorner: Shape {

Accelerometer/Measurements/Axes/AxesSummaryViewExtended.swift

Lines changed: 60 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -66,113 +66,75 @@ struct AxesSummaryViewExtended: View {
6666
}
6767
}
6868

69+
// MARK: - Previews
70+
6971
struct AxesSummaryViewExtended_Previews: PreviewProvider {
7072

71-
static let settings = Settings()
73+
// MARK: Test Measurers
7274

73-
// TODO: refactor this
74-
static let measurer1: Measurer = {
75-
let measurer = Measurer(settings: settings)
76-
var axes = TriangleAxes.zero
77-
axes.displayableAbsMax = 1.0
78-
measurer.saveData(
79-
axesType: TriangleAxes.self,
80-
measurementType: .userAcceleration,
81-
values: [
82-
.x: 0,
83-
.y: 0,
84-
.z: 0
85-
]
86-
)
87-
measurer.saveData(
88-
axesType: TriangleAxes.self,
89-
measurementType: .magneticField,
90-
values: [
91-
.x: 0,
92-
.y: 0,
93-
.z: 0
94-
]
95-
)
96-
return measurer
97-
}()
75+
struct MeasurerScenario {
76+
let title: String
77+
let measurer: Measurer
78+
}
9879

99-
static let measurer2: Measurer = {
100-
let measurer = Measurer(settings: settings)
101-
var axes = TriangleAxes.zero
102-
axes.displayableAbsMax = 1.0
103-
measurer.saveData(
104-
axesType: TriangleAxes.self,
105-
measurementType: .userAcceleration,
106-
values: [
107-
.x: 0.5,
108-
.y: 0.5,
109-
.z: 0.5
110-
]
111-
)
112-
measurer.saveData(
113-
axesType: TriangleAxes.self,
114-
measurementType: .magneticField,
115-
values: [
116-
.x: 100,
117-
.y: 100,
118-
.z: 100
119-
]
120-
)
121-
return measurer
122-
}()
80+
private static let settings = Settings()
12381

124-
static let measurer3: Measurer = {
125-
let measurer = Measurer(settings: settings)
126-
var axes = TriangleAxes.zero
127-
axes.displayableAbsMax = 1.0
128-
measurer.saveData(
129-
axesType: TriangleAxes.self,
130-
measurementType: .userAcceleration,
131-
values: [
132-
.x: 1,
133-
.y: 1,
134-
.z: 1
135-
]
136-
)
137-
measurer.saveData(
138-
axesType: TriangleAxes.self,
139-
measurementType: .magneticField,
140-
values: [
141-
.x: 200,
142-
.y: 200,
143-
.z: 200
144-
]
145-
)
146-
return measurer
147-
}()
82+
private static func makeMeasurer(x: Double, y: Double, z: Double) -> Measurer {
83+
let m = Measurer(settings: settings)
84+
m.saveData(axesType: TriangleAxes.self, measurementType: .userAcceleration,
85+
values: [.x: x, .y: y, .z: z])
86+
m.saveData(axesType: TriangleAxes.self, measurementType: .magneticField,
87+
values: [.x: x * 200, .y: y * 200, .z: z * 200])
88+
return m
89+
}
90+
91+
private static let scenarios: [MeasurerScenario] = [
92+
MeasurerScenario(title: "Zero", measurer: makeMeasurer(x: 0, y: 0, z: 0)),
93+
MeasurerScenario(title: "Half-Max",measurer: makeMeasurer(x: 0.5, y: 0.5, z: 0.5)),
94+
MeasurerScenario(title: "Full-Max",measurer: makeMeasurer(x: 1, y: 1, z: 1))
95+
]
96+
97+
// MARK: Preview
14898

14999
static var previews: some View {
150100
Group {
151-
AxesSummaryViewExtended(type: .userAcceleration)
152-
.padding()
153-
.previewLayout(.sizeThatFits)
154-
.environmentObject(measurer1)
155-
AxesSummaryViewExtended(type: .userAcceleration)
156-
.padding()
157-
.previewLayout(.sizeThatFits)
158-
.environmentObject(measurer2)
159-
AxesSummaryViewExtended(type: .userAcceleration)
160-
.padding()
161-
.previewLayout(.sizeThatFits)
162-
.environmentObject(measurer3)
163-
AxesSummaryViewExtended(type: .magneticField)
164-
.padding()
165-
.previewLayout(.sizeThatFits)
166-
.environmentObject(measurer1)
167-
AxesSummaryViewExtended(type: .magneticField)
168-
.padding()
169-
.previewLayout(.sizeThatFits)
170-
.environmentObject(measurer2)
171-
AxesSummaryViewExtended(type: .magneticField)
172-
.padding()
173-
.previewLayout(.sizeThatFits)
174-
.environmentObject(measurer3)
101+
ForEach([MeasurementType.userAcceleration, .magneticField], id: \.self) { type in
102+
PreviewSection(type: type, scenarios: scenarios)
103+
}
175104
}
176105
.environmentObject(settings)
177106
}
178107
}
108+
109+
// MARK: Helper Views
110+
111+
private struct PreviewSection: View {
112+
let type: MeasurementType
113+
let scenarios: [AxesSummaryViewExtended_Previews.MeasurerScenario]
114+
115+
var body: some View {
116+
VStack(alignment: .leading, spacing: 10) {
117+
Text(type.name.capitalizingFirstLetter())
118+
.font(.title2)
119+
.padding(.bottom)
120+
121+
VStack(spacing: 20) {
122+
ForEach(scenarios, id: \.title) { scenario in
123+
VStack(spacing: 8) {
124+
Text(scenario.title)
125+
.font(.caption)
126+
AxesSummaryViewExtended(type: type)
127+
.environmentObject(scenario.measurer)
128+
.padding()
129+
.background(Color(.systemBackground))
130+
.cornerRadius(6)
131+
.shadow(radius: 1)
132+
}
133+
}
134+
}
135+
}
136+
.padding()
137+
.previewDisplayName(type.name.capitalizingFirstLetter())
138+
.previewLayout(.sizeThatFits)
139+
}
140+
}

Accelerometer/Measurements/MeasurementSummaryView.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ struct MeasurementSummaryView: View {
2323
}
2424

2525
var recordButton: some View {
26-
let enabled = !recorder.recordingInProgress
27-
let text = enabled ? "Start recording this value" : "Recording is already enabled"
28-
let backgroundColor: Color = enabled ? .enabledButton : .disabledButton
26+
let enabled = !recorder.recordingInProgress && recorder.hasEnoughMemory
27+
28+
let text = if !recorder.hasEnoughMemory {
29+
"Not enough memory"
30+
} else if recorder.recordingInProgress {
31+
"Recording is already started"
32+
} else {
33+
"Start recording this value"
34+
}
2935

3036
return Button(
3137
action: {
@@ -35,10 +41,10 @@ struct MeasurementSummaryView: View {
3541
.foregroundColor(.background)
3642
}
3743
)
44+
.buttonStyle(.glassProminent)
45+
.controlSize(.large)
3846
.disabled(!enabled)
3947
.padding(.defaultPadding)
40-
.background(backgroundColor)
41-
.cornerRadius(.defaultCornerRadius)
4248
}
4349

4450
var body: some View {
@@ -99,12 +105,12 @@ struct MeasurementSummaryView_Previews: PreviewProvider {
99105
}()
100106

101107
static let recorder1: Recorder = {
102-
let recorder = Recorder(measurer: measurer)
108+
let recorder = Recorder(measurer: measurer, settings: settings)
103109
return recorder
104110
}()
105111

106112
static let recorder2: Recorder = {
107-
let recorder = Recorder(measurer: measurer)
113+
let recorder = Recorder(measurer: measurer, settings: settings)
108114
recorder.record(measurements: [.acceleration])
109115
return recorder
110116
}()

0 commit comments

Comments
 (0)