summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/InstrumentHandler.kt7
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/FishingTarget.kt19
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/fishing/RigAdvisor.kt32
-rw-r--r--android-app/app/src/test/kotlin/org/terst/nav/data/api/WeatherApiServiceTest.kt6
-rw-r--r--android-app/app/src/test/kotlin/org/terst/nav/ui/fishing/RigAdvisorTest.kt16
5 files changed, 77 insertions, 3 deletions
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)
+ }
+}