# VHF Simulator

Webbasert simulator for trening i maritim VHF-radio og GMDSS-prosedyrer.

Simulatoren er fasit for hva som faktisk støttes. Dokumentasjonen beskriver derfor observerbar funksjon i koden og brukergrensesnittet, ikke planlagte funksjoner eller eldre prosjektmål.

## Hva simulatoren inneholder

- Interaktiv VHF-radio med kanalvalg, volum, squelch, PTT og tekstinntasting.
- DSC-meny med rutine-, sikkerhets- og nødmeldingsflyt.
- Talegjenkjenning med tekstinntasting som reserve.
- Syntetisk tale for simulatorens svar.
- Scenario- og frimodus med kontekststyrt kystradio, andre fartøy og meldingslogg.
- Vurdering og scorekort for øvelser som har vurderingsregler.
- Action cards og sjekkliste for øvelser som bruker dem.
- Felles avslutningslogikk for normale samtaler, med særskilte sluttregler for nød- og sikkerhetsprosedyrer.

Scenarioregisteret er den autoritative listen over tilgjengelige øvelser. Per 3. november 2026 har det 60 oppføringer inkludert to frimodusprofiler. Det synlige engelske utvalget omfatter 38 øvelser og én Free Roam-profil. Registeret dekker blant annet rutine-/anropsøvelser, radio check, MAYDAY, PAN PAN, SÉCURITÉ/MSI, SAR, DSC og internasjonale kystradiostasjoner. Se [samlet simulatorstatus](docs/SIMULATOR_STATUS_2026-11-03.md) for skillet mellom implementert og verifisert funksjon.

## Kom i gang

Kursdeltakere åpner simulatorøvelsen fra den innloggede LearnPress-leksjonen,
leser briefing og Action Card og trykker **Start exercise**. **Full VHF Simulator**
åpner i Free Roam. Se [brukerveiledningen](docs/Brukerveiledning/README.md).
Instruksjonene under gjelder lokal utvikling.

Installer avhengigheter og start simulatoren lokalt gjennom Netlify Dev. Netlify Dev starter appserveren, edge functions og API-rutene. Startkommandoen velger ledige porter automatisk og skriver ut en adresse du kan åpne i nettleseren:

```powershell
npm install
npm run dev
```

For å starte et bestemt engelsk scenario direkte, oppgi scenario-ID:

```powershell
npm run dev -- int_distress_sinking_shetland
```

La terminalen stå åpen mens du tester. Trykk Ctrl+C for å stoppe simulatoren. Netlify Dev-proxyen brukes med vilje, slik at lokale edge functions og API-ruter er med. Lokal kursbeskyttelse omgås bare i Netlifys `dev`-kontekst; deployede kontekster bruker fortsatt vanlig kursinnlogging. Direkte åpning av `index.html` anbefales ikke, fordi moduler, lyd og enkelte nettleser-API-er krever en serverkontekst.

Kjør hvilken som helst Jest-testfil under `test/` mot den Netlify-startede simulatoren. Runneren finner ledige porter, starter Netlify Dev og appserveren, venter til `index.html` svarer, kjører de valgte testene og stopper prosessene den selv startet. Nettlesertester peker direkte mot appserverens målport fordi `course-access` beskytter `/index.html` gjennom Netlify-proxyen.

```powershell
npm run test:netlify -- test/ui/e2e.language.reactivity.puppeteer.test.cjs
```

Flere testfiler kan oppgis etter hverandre. 2B har også en snarvei: `npm run test:e2e:2b`. Nettlesertestene kontrollerer simulatorflyten, ikke kursinnlogging gjennom edge function. Netlify CLI må være i npm-cachen; hvis den mangler, kjør `npx --yes netlify-cli --version` én gang med nettverkstilgang.

## Moduser

- **Kurs-/scenariomodus:** øvelsen kan låse fartøy, kystradio, posisjon, språk og tilgjengelige valg.
- **Simulator-/frimodus:** brukeren kan utforske radioen uten samme scenario-låser. Frimodus bruker fortsatt samme parser-, keyterm-, DSC- og avslutningslogikk som scenarioene.
- **Trenings- og eksamensprofiler:** profilene bestemmer hvilke hjelpemidler og begrensninger som gjelder; de endrer ikke de maritime prosedyrene.

## Arkitektur i korte trekk

Scenarioene ligger under `src/engine/assessment/scenarios`. Komponeringen av simulatorens radiosvar ligger i composer-/engine-lagene. UI-et håndterer radio, input, DSC og scorekort, mens motorene eier prosedyretilstand. Felles signoff brukes der en ordinær samtale skal avsluttes; MAYDAY, SÉCURITÉ og andre særprosedyrer har egne faglige sluttpunkter.

Talegjenkjenning bruker kontekstuelle keyterms. I frimodus bygges keyterms dynamisk fra maritime grunnord, aktive aktører, fartøyets navn/kallesignal og valgt kystradio. Dette gjør ikke frimodus til en fri tekstgenerator: radio- og sikkerhetsreglene gjelder fortsatt.

## Språk og tale

UI- og tekstressurser finnes for flere språk. Den kanoniske prosedyre- og testdokumentasjonen er for tiden engelsk; utvidet norsk readback er uttrykkelig ikke en del av denne arbeidsfasen. Ikke les språkressurser alene som bevis på at alle prosedyrer er fullt oversatt eller like godt testet.

## Testing

```powershell
npm test
npm run test:all
npm run test:e2e
```

Testregimet og resultatene ligger i `docs/testing`. Testfiler som er merket som skippet eller utsatt skal ikke omtales som gjennomført funksjonalitet.

## Dokumentasjon

- [Dokumentasjonskart](docs/README.md)
- [Prosjektbeskrivelse](docs/Claude/01_PROSJEKTOVERSIKT.md)
- [Bruksanvisning](docs/Brukerveiledning/README.md)
- [HTML-bruksanvisning](docs/Brukerveiledning/user-guide.html)
- [Testregime](docs/testing/README.md)
- [Arkitekturdokumentasjon](docs/architecture/)

Historiske planer, arbeidsnotater og tidligere statusrapporter er beholdt for sporbarhet og skal ikke brukes som gjeldende produktbeskrivelse.
