|
- package main
-
- import (
- "flag"
- "fmt"
- "log"
- "net/http"
- "os"
- "time"
-
- apppkg "github.com/jan/fm-rds-tx/internal/app"
- cfgpkg "github.com/jan/fm-rds-tx/internal/config"
- ctrlpkg "github.com/jan/fm-rds-tx/internal/control"
- drypkg "github.com/jan/fm-rds-tx/internal/dryrun"
- )
-
- func main() {
- configPath := flag.String("config", "", "path to JSON config")
- printConfig := flag.Bool("print-config", false, "print effective config and exit")
- dryRun := flag.Bool("dry-run", false, "run no-hardware dry-run output")
- dryOutput := flag.String("dry-output", "-", "dry-run output path or - for stdout")
- simulate := flag.Bool("simulate-tx", false, "run simulated Soapy/backend transmit path")
- simulateOutput := flag.String("simulate-output", "", "simulated transmit output file")
- simulateDuration := flag.Duration("simulate-duration", 500*time.Millisecond, "simulated transmit duration")
- flag.Parse()
-
- cfg, err := cfgpkg.Load(*configPath)
- if err != nil { log.Fatalf("load config: %v", err) }
-
- if *printConfig {
- preemph := "off"
- if cfg.FM.PreEmphasisTauUS > 0 { preemph = fmt.Sprintf("%.0fµs", cfg.FM.PreEmphasisTauUS) }
- fmt.Printf("backend=%s freq=%.1fMHz stereo=%t rds=%t preemph=%s limiter=%t fmmod=%t deviation=±%.0fHz deviceRate=%.0fHz listen=%s\n",
- cfg.Backend.Kind, cfg.FM.FrequencyMHz, cfg.FM.StereoEnabled, cfg.RDS.Enabled,
- preemph, cfg.FM.LimiterEnabled, cfg.FM.FMModulationEnabled, cfg.FM.MaxDeviationHz,
- cfg.EffectiveDeviceRate(), cfg.Control.ListenAddress)
- return
- }
- if *dryRun {
- frame := drypkg.Generate(cfg)
- if err := drypkg.WriteJSON(*dryOutput, frame); err != nil { log.Fatalf("dry-run: %v", err) }
- if *dryOutput != "" && *dryOutput != "-" { fmt.Fprintf(os.Stderr, "dry run frame written to %s\n", *dryOutput) }
- return
- }
- if *simulate {
- summary, err := apppkg.RunSimulatedTransmit(cfg, *simulateOutput, *simulateDuration)
- if err != nil { log.Fatalf("simulate-tx: %v", err) }
- fmt.Println(summary)
- return
- }
-
- srv := ctrlpkg.NewServer(cfg)
- log.Printf("fm-rds-tx listening on %s (TX default: off, use POST /tx/start)", cfg.Control.ListenAddress)
- log.Fatal(http.ListenAndServe(cfg.Control.ListenAddress, srv.Handler()))
- }
|