File: main.go

package info (click to toggle)
golang-github-k0swe-wsjtx-go 4.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 192 kB
  • sloc: makefile: 15
file content (109 lines) | stat: -rw-r--r-- 2,464 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main

import (
	"bufio"
	"log"
	"os"
	"reflect"
	"strings"

	"github.com/k0swe/wsjtx-go/v4"
)

// Simple driver binary for wsjtx-go library.
func main() {
	log.Println("Listening for WSJT-X...")
	wsjtxServer, err := wsjtx.MakeServer()
	if err != nil {
		log.Fatalf("%v", err)
	}
	wsjtxChannel := make(chan interface{}, 5)
	errChannel := make(chan error, 5)
	go wsjtxServer.ListenToWsjtx(wsjtxChannel, errChannel)

	stdinChannel := make(chan string, 5)
	go stdinCmd(stdinChannel)

	for {
		select {
		case err := <-errChannel:
			log.Printf("error: %v", err)
		case message := <-wsjtxChannel:
			handleServerMessage(message)
		case command := <-stdinChannel:
			command = strings.ToLower(command)
			handleCommand(command, wsjtxServer)
		}
	}
}

// Goroutine to listen to stdin.
func stdinCmd(c chan string) {
	scanner := bufio.NewScanner(os.Stdin)
	for {
		for scanner.Scan() {
			input := scanner.Text()
			c <- input
		}
		if err := scanner.Err(); err != nil {
			log.Println(err)
			os.Exit(1)
		}
	}
}

// When we receive WSJT-X messages, display them.
func handleServerMessage(message interface{}) {
	switch message.(type) {
	case wsjtx.HeartbeatMessage:
		log.Println("Heartbeat:", message)
	case wsjtx.StatusMessage:
		log.Println("Status:", message)
	case wsjtx.DecodeMessage:
		log.Println("Decode:", message)
	case wsjtx.ClearMessage:
		log.Println("Clear:", message)
	case wsjtx.QsoLoggedMessage:
		log.Println("QSO Logged:", message)
	case wsjtx.CloseMessage:
		log.Println("Close:", message)
	case wsjtx.WSPRDecodeMessage:
		log.Println("WSPR Decode:", message)
	case wsjtx.LoggedAdifMessage:
		log.Println("Logged Adif:", message)
	default:
		log.Println("Other:", reflect.TypeOf(message), message)
	}
}

// When we get a command from stdin, send WSJT-X a message.
func handleCommand(command string, wsjtxServer wsjtx.Server) {
	var err error
	switch command {

	case "hb":
		log.Println("Sending Heartbeat")
		err = wsjtxServer.Heartbeat(wsjtx.HeartbeatMessage{
			Id:        "wsjtx-go",
			MaxSchema: 2,
			Version:   "0.3.1",
			Revision:  "e0d45c929",
		})

	case "clear":
		log.Println("Sending Clear")
		err = wsjtxServer.Clear(wsjtx.ClearMessage{Id: "WSJT-X", Window: 2})

	case "close":
		log.Println("Sending Close")
		err = wsjtxServer.Close(wsjtx.CloseMessage{Id: "WSJT-X"})

	case "replay":
		log.Println("Sending Replay")
		err = wsjtxServer.Replay(wsjtx.ReplayMessage{Id: "WSJT-X"})

	}
	if err != nil {
		log.Println(err)
	}
}