Skip to content

About

Weiterentwicklung der App Challenge (Porsche Club Cup Langstrecke) mit zusätzlichen Features wie z. B. Geolocation für das automatische Zählen der Runden

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

ChallengeSwift

Neufassung der App Challenge (Rundenzeiten für die Langstrecke des Porsche Club Cup) in Swift / SwiftUI. Aussehen und Funktionsumfang entsprechen dem Objective-C-Original von 2013–2025, die App läuft aber auf jedem iPhone und iPad.

Bauen und starten

open ChallengeSwift.xcodeproj

Das Projekt wird mit XcodeGen aus project.yml erzeugt; nach Änderungen an Dateien oder Einstellungen:

xcodegen generate

Tests (Logik und Oberfläche):

xcodebuild -project ChallengeSwift.xcodeproj -scheme ChallengeSwift -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone SE (3rd generation)' test
  • Mindestversion: iOS 15
  • Geräte: iPhone und iPad, ausschliesslich Hochformat (auf dem iPad auch kopfüber)

Aufbau

Datei Inhalt
ChallengeSwift/Model/ChallengeModel.swift Stoppuhr- und Rundenlogik (Portierung von ViewController.m)
ChallengeSwift/Model/AppSettings.swift Rundenzahl, Referenzrunde, Boxenzeit (ersetzt die globalen Variablen aus main.m)
ChallengeSwift/Model/TimeFormatting.swift Zeitformate m:ss.S und m:ss.SS
ChallengeSwift/Model/StartFinishLine.swift Geometrie der Start-/Ziellinie
ChallengeSwift/Model/LapDetector.swift Erkennt die Überfahrt anhand der GPS-Positionen
ChallengeSwift/Support/LocationTracker.swift CoreLocation-Anbindung
ChallengeSwift/View/Design.swift Sämtliche Positionen und Grössen des Original-Storyboards
ChallengeSwift/View/DesignCanvas.swift Skalierung der 768 × 1024-Oberfläche auf die jeweilige Bildschirmgrösse
ChallengeSwift/View/MainView.swift Hauptseite
ChallengeSwift/View/SettingsView.swift Einstellungsseite (gewöhnliche SwiftUI-Form, nicht auf dem Raster)
ChallengeSwift/Support/SoundPlayer.swift Klick- und Signaltöne

Wie das Layout identisch bleibt

Das Original war fest für 768 × 1024 Punkte (iPad hochkant) gezeichnet und wurde in viewDidLayoutSubviews als Ganzes skaliert. DesignCanvas macht dasselbe – proportional mit dem kleineren der beiden Skalierungsfaktoren, damit nie etwas abgeschnitten wird, und innerhalb des sicheren Bereichs (Statusleiste, Notch, Home-Indikator).

Da das Gerät im Einsatz immer hochkant ist, begrenzt die Breite die Skalierung, und in der Höhe bleibt Platz übrig – auf einem iPhone 16 Pro rund ein Drittel. CanvasStretch verteilt diesen Platz auf die Lücken zwischen den Zeilengruppen (MainLayout.stretchGaps), statt ihn als weissen Rand liegen zu lassen. Seitliche Positionen und Schriftgrössen bleiben dabei unverändert, die Zeilen rücken lediglich auseinander; Zusammengehörendes (etwa „Gesamtzeit“ und „Aktuelle Runde“) behält seinen Abstand. Zu beachten: die Schrift wird dadurch nicht grösser – ihre Grösse hängt allein von der Bildschirmbreite ab.

Bekommt die App ausnahmsweise ein breites Fenster (Split View, Stage Manager), greift weiterhin das zentrierte Einpassen mit Rändern. Die Einstellungsseite gibt bewusst keine Lücken an und verhält sich unverändert.

Übernommen wurden die Rahmen aus dem Storyboard 1:1. Vergrössert wurde nur die Höhe der Elemente, die kleiner waren als die Zeilenhöhe ihrer Schrift (48 pt → 56 pt, 120 pt → 141 pt, Emoji-Tasten → 70 × 60); der Mittelpunkt bleibt dabei jeweils unverändert. Zusätzlich verkleinert sich zu langer Text notfalls, statt abgeschnitten zu werden.

Runden per GPS zählen

In den Einstellungen lässt sich „Runden per GPS zählen“ einschalten. Dann wird nur noch beim ersten Überfahren der Start-/Ziellinie „Start / Runde“ gedrückt – genau dort legt die App die Ziellinie fest und zählt anschliessend selbstständig weiter. Die Tasten für Runde ± und die manuelle Rundentaste bleiben nutzbar, falls das Signal einmal aussetzt.

Damit auf realen Strecken nichts falsch gezählt wird:

  • Fahrtrichtung: Die Linie zählt nur, wenn sie in der Richtung überfahren wird, in der beim Start gefahren wurde. Streckenteile, die entgegengesetzt nahe an der Ziellinie vorbeiführen, lösen keine Runde aus.
  • Streckenbreite: Die Linie ist 30 m lang (± 15 m quer zur Fahrtrichtung) und deckt damit eine rund 20 m breite Strecke komplett ab – ganz links oder ganz rechts gefahren zählt die Runde genauso. Streckenteile, die weiter seitlich versetzt vorbeiführen, zählen nicht.
  • Boxengasse: Liegt sie neben der Start-/Ziellinie, zählt eine Durchfahrt durch die Box ebenfalls als Runde. Dafür lässt sich die Linie auf einer Seite verlängern: Einstellung „Boxengasse“ auf links oder rechts (aus Fahrersicht) plus Entfernung in Metern. Die andere Seite bleibt bei 15 m, damit dort nichts fälschlich mitzählt.
  • Zeitpunkt: Zwischen zwei Positionsmeldungen liegen bei Renngeschwindigkeit mehrere Dutzend Meter. Der Moment der Überfahrt wird deshalb zwischen den beiden Messungen interpoliert, damit die Rundenzeit stimmt.
  • Richtung ohne gültigen Kurs: Das iPhone liefert course erst ab einer gewissen Geschwindigkeit – im Schritttempo gar nicht. Fehlt die Richtung beim Druck auf „Start“, merkt sich die App den Punkt und bestimmt die Richtung aus den nächsten 12 m Bewegung. Die Statuszeile zeigt so lange „Richtung wird ermittelt“.
  • Robustheit: Positionen mit mehr als 35 m Ungenauigkeit werden verworfen, und zwischen zwei GPS-Runden müssen mindestens 10 Sekunden liegen.

Die Boxengasse einmessen

Statt den Abstand zu schätzen: mit eingeschaltetem GPS eine Runde durch die Box rollen. Wird die Vorbeifahrt nur wegen des seitlichen Abstands nicht gezählt, zeigt die Statuszeile für einige Sekunden, wie weit daneben es war – etwa „GPS: 30 m rechts neben Ziellinie“. Diesen Wert (plus etwas Reserve) in die Einstellung eintragen, fertig.

Die Einstellungen werden dauerhaft gespeichert, die Werte müssen also pro Strecke nur einmal eingetragen werden. Das weicht bewusst vom Original ab, das immer mit 20 Runden / Referenzrunde 2 / 90 s startete.

Zu Fuss ausprobieren

Das geht, mit drei Einschränkungen: im Freien bleiben (in Gebäuden liegt die Genauigkeit über den 35 m und die Positionen werden verworfen), die App im Vordergrund lassen (es gibt keine Ortung im Hintergrund) und eine Runde von mindestens rund 100 m Umfang wählen. Bei einer sehr kleinen Runde liegt die 30 m lange Ziellinie quer über einem grossen Teil der Strecke und wird auch an anderer Stelle überquert.

Die Kopfzeile der Hauptseite zeigt Zustand, Entfernung zur Ziellinie und Genauigkeit („GPS: bereit ±5 m“, „GPS: Ziel 320 m ±4 m“). Beim Start steht dort für vier Sekunden der Titel der App, danach übernimmt der laufende Status; ohne GPS bleibt der Titel stehen. Die Entfernung ist die Luftlinie zum Punkt, an dem „Start“ gedrückt wurde – unter 1 km metergenau, darüber in Kilometern. Ist GPS ausgeschaltet, entfällt die Zeile und die Seite sieht aus wie zuvor. Die App braucht die Ortungsfreigabe „Beim Verwenden der App“.

Bewusste Abweichungen vom Original

  • Zeiten über eine Stunde: Das Original formatierte über einen NSDateFormatter, die Minutenanzeige sprang nach 59:59.9 auf 0 zurück. Jetzt wird weitergezählt (61:01.5).
  • Letzte Runde: Im Original wurde in der letzten Runde durch null geteilt (TOTAL_LAP - mLap == 0); die Zielrundenzeit bleibt jetzt leer.
  • Fehlende Referenzzeit: Berechnungen ohne gemessene Referenzrunde liefern eine leere Anzeige statt undefinierter Werte.
  • Darstellung: Die App folgt dem hellen wie dem dunklen Erscheinungsbild des Systems. Das Original kannte nur hell; nachts im Cockpit blendet ein weisses iPad.
  • Einstellungsseite: statt des nachgebauten Festlayouts eine gewöhnliche Form mit Schaltern und Steppern – keine Zahlentastatur mehr, und Platz für weitere Einstellungen.
  • Zeit bis Ziel: grösser gesetzt als die übrigen Werte und rot, sobald die Zielzeit überschritten ist.
  • Tasten: „Start / Runde“ ist eine gefüllte Fläche statt blauer Text, „Reset“ ist rot – es verwirft schliesslich das ganze Rennen.

Alles andere – Rundenzähler ab −1, Tonsignale bei 5 … 1 Sekunden und im Ziel, gesperrte Korrekturtasten bis zur Referenzrunde, Box- und Reset-Abfrage, Einstellungen – verhält sich wie zuvor.

About

Weiterentwicklung der App Challenge (Porsche Club Cup Langstrecke) mit zusätzlichen Features wie z. B. Geolocation für das automatische Zählen der Runden

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages