From 82112d0c0b8c31ad436f52c9003d480b7132a3f1 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Tue, 30 Jun 2026 18:35:29 +0000 Subject: feat(fishing): FishingTarget + RigAdvisor logic Also fix pre-existing test compile errors in WeatherApiServiceTest (nullable list access) and add missing metresToFeet/formatFt helpers to InstrumentHandler. Co-Authored-By: Claude Sonnet 4.6 --- .../kotlin/org/terst/nav/ui/InstrumentHandler.kt | 7 +++++ .../org/terst/nav/ui/fishing/FishingTarget.kt | 19 +++++++++++++ .../kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt | 32 ++++++++++++++++++++++ .../terst/nav/data/api/WeatherApiServiceTest.kt | 6 ++-- .../org/terst/nav/ui/fishing/RigAdvisorTest.kt | 16 +++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/FishingTarget.kt create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt create mode 100644 android-app/app/src/test/kotlin/org/terst/nav/ui/fishing/RigAdvisorTest.kt (limited to 'android-app/app/src') diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/InstrumentHandler.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/InstrumentHandler.kt index ccb3a91..371235a 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/ui/InstrumentHandler.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/InstrumentHandler.kt @@ -14,6 +14,13 @@ fun formatBearing(deg: Double, locale: Locale = Locale.getDefault()): String = fun formatPeriod(sec: Double, locale: Locale = Locale.getDefault()): String = "· %.0fs".format(locale, sec) +/** Converts metres to feet. */ +fun metresToFeet(metres: Double): Double = metres * 3.28084 + +/** Formats a depth/height value in feet to one decimal place. */ +fun formatFt(feet: Double, locale: Locale = Locale.getDefault()): String = + "%.1f".format(locale, feet) + // ── InstrumentHandler ──────────────────────────────────────────────────────── /** diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/FishingTarget.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/FishingTarget.kt new file mode 100644 index 0000000..f7597db --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/FishingTarget.kt @@ -0,0 +1,19 @@ +package org.terst.nav.ui.fishing + +enum class FishingSpecies(val displayName: String) { + ONO("Ono (Wahoo)"), MAHI("Mahi-Mahi"), BOTH("Ono & Mahi") +} + +data class RigRecommendation( + val primarySpecies: FishingSpecies, + val rigDescription: String, + val trollingSpeedKt: Double, + val approachNote: String +) + +data class FishingTarget( + val bearingDeg: Double, + val distanceNm: Double, + val zoneDescription: String, + val rig: RigRecommendation +) diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt new file mode 100644 index 0000000..629725c --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt @@ -0,0 +1,32 @@ +package org.terst.nav.ui.fishing + +object RigAdvisor { + fun recommend(tempC: Double, currentKt: Double, windKt: Double): RigRecommendation { + val tempF = tempC * 9.0 / 5.0 + 32.0 + val species = when { + tempF >= 75.0 && currentKt >= 1.0 -> FishingSpecies.ONO + tempF in 70.0..78.0 -> FishingSpecies.MAHI + else -> FishingSpecies.BOTH + } + return when (species) { + FishingSpecies.ONO -> RigRecommendation( + primarySpecies = FishingSpecies.ONO, + rigDescription = "Blue/white 9\" Rapala or jet head, 80# mono leader, 50–80# stand-up", + trollingSpeedKt = if (currentKt > 1.0) 9.0 else 8.0, + approachNote = "Troll along current edge; watch for color change (blue→green). Ono hit fast." + ) + FishingSpecies.MAHI -> RigRecommendation( + primarySpecies = FishingSpecies.MAHI, + rigDescription = "Green/yellow skirt or ballyhoo, 50# mono, medium-action", + trollingSpeedKt = 7.0, + approachNote = "Look for floating debris or weed lines. Mahi school; keep one hooked in water." + ) + FishingSpecies.BOTH -> RigRecommendation( + primarySpecies = FishingSpecies.BOTH, + rigDescription = "Mix: one Ono lure (fast), one mahi skirt (slow)", + trollingSpeedKt = 8.0, + approachNote = "Spread lures at different depths. Watch for birds and color changes." + ) + } + } +} diff --git a/android-app/app/src/test/kotlin/org/terst/nav/data/api/WeatherApiServiceTest.kt b/android-app/app/src/test/kotlin/org/terst/nav/data/api/WeatherApiServiceTest.kt index 1d35170..45e0687 100644 --- a/android-app/app/src/test/kotlin/org/terst/nav/data/api/WeatherApiServiceTest.kt +++ b/android-app/app/src/test/kotlin/org/terst/nav/data/api/WeatherApiServiceTest.kt @@ -64,9 +64,9 @@ class WeatherApiServiceTest { assertEquals(2, response.hourly.time.size) assertEquals(15.0, response.hourly.windspeed10m[0], 0.01) assertEquals(270.0, response.hourly.winddirection10m[0], 0.01) - assertEquals(18.5, response.hourly.temperature2m[0], 0.01) - assertEquals(20, response.hourly.precipitationProbability[0]) - assertEquals(1, response.hourly.weathercode[0]) + assertEquals(18.5, response.hourly.temperature2m!![0], 0.01) + assertEquals(20, response.hourly.precipitationProbability!![0]) + assertEquals(1, response.hourly.weathercode!![0]) } companion object { diff --git a/android-app/app/src/test/kotlin/org/terst/nav/ui/fishing/RigAdvisorTest.kt b/android-app/app/src/test/kotlin/org/terst/nav/ui/fishing/RigAdvisorTest.kt new file mode 100644 index 0000000..a19a412 --- /dev/null +++ b/android-app/app/src/test/kotlin/org/terst/nav/ui/fishing/RigAdvisorTest.kt @@ -0,0 +1,16 @@ +package org.terst.nav.ui.fishing + +import org.junit.Assert.* +import org.junit.Test + +class RigAdvisorTest { + @Test fun `warm water fast current favors Ono rig`() { + val rec = RigAdvisor.recommend(tempC = 26.0, currentKt = 1.5, windKt = 10.0) + assertEquals(FishingSpecies.ONO, rec.primarySpecies) + assertTrue(rec.trollingSpeedKt in 7.0..10.0) + } + @Test fun `cooler water moderate current favors mahi`() { + val rec = RigAdvisor.recommend(tempC = 23.0, currentKt = 0.5, windKt = 8.0) + assertEquals(FishingSpecies.MAHI, rec.primarySpecies) + } +} -- cgit v1.2.3