update
This commit is contained in:
parent
eef2b4b938
commit
c57258cc3a
BIN
FlexDXCluster.exe
Normal file
BIN
FlexDXCluster.exe
Normal file
Binary file not shown.
@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net/http"
|
||||
|
||||
@ -9,15 +10,22 @@ import (
|
||||
)
|
||||
|
||||
var tmpl *template.Template
|
||||
var listNew = []New{}
|
||||
|
||||
type New struct {
|
||||
DX string
|
||||
Status string
|
||||
}
|
||||
|
||||
type HTTPServer struct {
|
||||
router *mux.Router
|
||||
Log4OMRepo Log4OMContactsRepository
|
||||
Repo FlexDXClusterRepository
|
||||
Log *log.Logger
|
||||
FlexClient FlexClient
|
||||
}
|
||||
|
||||
func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository, log *log.Logger) *HTTPServer {
|
||||
func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository, fClient FlexClient, log *log.Logger) *HTTPServer {
|
||||
|
||||
gRouter := mux.NewRouter()
|
||||
|
||||
@ -26,6 +34,7 @@ func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository
|
||||
Log4OMRepo: cRepo,
|
||||
Repo: fRepo,
|
||||
Log: log,
|
||||
FlexClient: fClient,
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,9 +43,17 @@ func (s *HTTPServer) SetRoutes() {
|
||||
s.router.HandleFunc("/spots", s.GetSpots).Methods("GET")
|
||||
s.router.HandleFunc("/spotscount", s.GetSpotsCount).Methods("GET")
|
||||
s.router.HandleFunc("/spotters", s.GetSpotters).Methods("GET")
|
||||
s.router.HandleFunc("/new", s.GetNew).Methods("GET")
|
||||
}
|
||||
|
||||
func (s *HTTPServer) StartHTTPServer() {
|
||||
|
||||
go func() {
|
||||
for spot := range s.FlexClient.FlexSpotChan {
|
||||
s.GetListofNew(spot)
|
||||
}
|
||||
}()
|
||||
|
||||
tmpl, _ = template.ParseGlob("templates/*.html")
|
||||
s.SetRoutes()
|
||||
s.Log.Infof("starting HTTP server on %s:%s", Cfg.HTTPServer.Host, Cfg.HTTPServer.Port)
|
||||
@ -54,7 +71,7 @@ func (s *HTTPServer) Homepage(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func (s *HTTPServer) GetSpots(w http.ResponseWriter, r *http.Request) {
|
||||
spots := s.Repo.GetAllSpots("25")
|
||||
spots := s.Repo.GetAllSpots("20")
|
||||
tmpl.ExecuteTemplate(w, "spot", spots)
|
||||
}
|
||||
|
||||
@ -68,3 +85,28 @@ func (s *HTTPServer) GetSpotters(w http.ResponseWriter, r *http.Request) {
|
||||
spotters := s.Repo.GetSpotters()
|
||||
tmpl.ExecuteTemplate(w, "spotters", spotters)
|
||||
}
|
||||
|
||||
func (s *HTTPServer) GetNew(w http.ResponseWriter, r *http.Request) {
|
||||
tmpl.ExecuteTemplate(w, "new", listNew)
|
||||
}
|
||||
|
||||
func (s *HTTPServer) GetListofNew(spot FlexSpot) {
|
||||
new := New{}
|
||||
|
||||
new.DX = spot.DX
|
||||
|
||||
if spot.NewDXCC {
|
||||
new.Status = fmt.Sprintf("New DXCC (%s) (%s)", spot.Band, spot.Mode)
|
||||
} else if !spot.NewBand && spot.NewMode && spot.Mode != "" {
|
||||
new.Status = fmt.Sprintf("New Mode (%s)", spot.Mode)
|
||||
} else if spot.NewBand && spot.NewMode && spot.Mode != "" {
|
||||
new.Status = fmt.Sprintf("New Band (%s) & Mode (%s)", spot.Band, spot.Mode)
|
||||
}
|
||||
|
||||
if new.Status != "" {
|
||||
if len(listNew) > 3 {
|
||||
listNew = append(listNew[:0], listNew[1:]...)
|
||||
}
|
||||
listNew = append(listNew, new)
|
||||
}
|
||||
}
|
||||
|
@ -80,8 +80,8 @@ func (c *TCPClient) StartClient() {
|
||||
|
||||
go func() {
|
||||
for message := range c.TCPServer.CmdChan {
|
||||
message := message + "\n"
|
||||
c.Log.Infof("Received DX Command: %s", message)
|
||||
message := message + "\n"
|
||||
c.WriteString(message)
|
||||
}
|
||||
}()
|
||||
|
@ -122,7 +122,7 @@ func (s *TCPServer) broadcastMessage(message string) {
|
||||
for client := range s.Clients {
|
||||
_, err := client.Write([]byte(message))
|
||||
if err != nil {
|
||||
fmt.Println("Erreur lors de l'envoi du message au client:", client.RemoteAddr())
|
||||
fmt.Println("error while sending message to clients:", client.RemoteAddr())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ cluster:
|
||||
port: 7300
|
||||
login: xv9q-2
|
||||
skimmer: true
|
||||
ft8: true
|
||||
ft8: false
|
||||
flex:
|
||||
ip: 10.10.10.120
|
||||
spot_life: 600
|
||||
|
@ -112,12 +112,9 @@ func (r *Log4OMContactsRepository) ListByCountry(countryID string) ([]*Contact,
|
||||
|
||||
func (r *Log4OMContactsRepository) ListByCountryMode(countryID string, mode string) ([]*Contact, error) {
|
||||
|
||||
modeUSB := "USB"
|
||||
modeLSB := "LSB"
|
||||
|
||||
if mode == "USB" || mode == "LSB" {
|
||||
|
||||
rows, err := r.db.Query("SELECT callsign, band, mode, dxcc, stationcallsign, country FROM log WHERE dxcc = ? AND (mode = ? OR mode = ?)", countryID, modeLSB, modeUSB)
|
||||
rows, err := r.db.Query("SELECT callsign, band, mode, dxcc, stationcallsign, country FROM log WHERE dxcc = ? AND (mode = ? OR mode = ?)", countryID, "USB", "LSB")
|
||||
if err != nil {
|
||||
log.Error("could not query database", err)
|
||||
return nil, err
|
||||
@ -241,7 +238,7 @@ func (r *FlexDXClusterRepository) GetSpotters() []Spotter {
|
||||
|
||||
sList := []Spotter{}
|
||||
|
||||
rows, err := r.db.Query("select spotter, count(*) as occurences from spots group by spotter order by occurences desc, spotter limit 3")
|
||||
rows, err := r.db.Query("select spotter, count(*) as occurences from spots group by spotter order by occurences desc, spotter limit 5")
|
||||
|
||||
if err != nil {
|
||||
r.Log.Error(err)
|
||||
|
BIN
flex.sqlite
BIN
flex.sqlite
Binary file not shown.
64
flexradio.go
64
flexradio.go
@ -33,32 +33,38 @@ type FlexSpot struct {
|
||||
Comment string
|
||||
Color string
|
||||
BackgroundColor string
|
||||
NewDXCC bool
|
||||
NewBand bool
|
||||
NewMode bool
|
||||
Worked bool
|
||||
}
|
||||
|
||||
type FlexClient struct {
|
||||
Address string
|
||||
Port string
|
||||
Timeout time.Duration
|
||||
LogWriter *bufio.Writer
|
||||
Reader *bufio.Reader
|
||||
Writer *bufio.Writer
|
||||
Conn *net.TCPConn
|
||||
SpotChan chan TelnetSpot
|
||||
MsgChan chan string
|
||||
Repo FlexDXClusterRepository
|
||||
Log *log.Logger
|
||||
TCPServer TCPServer
|
||||
Address string
|
||||
Port string
|
||||
Timeout time.Duration
|
||||
LogWriter *bufio.Writer
|
||||
Reader *bufio.Reader
|
||||
Writer *bufio.Writer
|
||||
Conn *net.TCPConn
|
||||
SpotChan chan TelnetSpot
|
||||
MsgChan chan string
|
||||
FlexSpotChan chan FlexSpot
|
||||
Repo FlexDXClusterRepository
|
||||
Log *log.Logger
|
||||
TCPServer TCPServer
|
||||
}
|
||||
|
||||
func NewFlexClient(repo FlexDXClusterRepository, TCPServer TCPServer, log *log.Logger) *FlexClient {
|
||||
return &FlexClient{
|
||||
Address: Cfg.Flex.IP,
|
||||
Port: "4992",
|
||||
SpotChan: make(chan TelnetSpot),
|
||||
MsgChan: TCPServer.MsgChan,
|
||||
Repo: repo,
|
||||
TCPServer: TCPServer,
|
||||
Log: log,
|
||||
Address: Cfg.Flex.IP,
|
||||
Port: "4992",
|
||||
SpotChan: make(chan TelnetSpot),
|
||||
FlexSpotChan: make(chan FlexSpot),
|
||||
MsgChan: TCPServer.MsgChan,
|
||||
Repo: repo,
|
||||
TCPServer: TCPServer,
|
||||
Log: log,
|
||||
}
|
||||
}
|
||||
|
||||
@ -127,26 +133,41 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) {
|
||||
Color: "#eaeaea",
|
||||
BackgroundColor: "#000000",
|
||||
Priority: "5",
|
||||
NewDXCC: spot.NewDXCC,
|
||||
NewBand: spot.NewBand,
|
||||
NewMode: spot.NewMode,
|
||||
Worked: spot.CallsignWorked,
|
||||
}
|
||||
|
||||
// If new DXCC
|
||||
if spot.NewDXCC {
|
||||
flexSpot.Color = "#3bf908"
|
||||
flexSpot.Priority = "1"
|
||||
flexSpot.BackgroundColor = "#000000"
|
||||
}
|
||||
|
||||
if spot.NewBand || spot.NewMode && spot.Mode != "" {
|
||||
// if New Band
|
||||
if spot.NewBand {
|
||||
flexSpot.Color = "#f9f508"
|
||||
flexSpot.Priority = "2"
|
||||
flexSpot.BackgroundColor = "#000000"
|
||||
}
|
||||
|
||||
// if New Mode
|
||||
if spot.NewMode {
|
||||
flexSpot.Color = "#f9a908"
|
||||
flexSpot.Priority = "2"
|
||||
flexSpot.BackgroundColor = "#000000"
|
||||
}
|
||||
|
||||
// If not New DXCC nor Mode nor Band and never worked
|
||||
if !spot.NewBand && !spot.NewMode && !spot.NewDXCC && !spot.CallsignWorked {
|
||||
flexSpot.Color = "#eaeaea"
|
||||
flexSpot.Priority = "5"
|
||||
flexSpot.BackgroundColor = "#000000"
|
||||
}
|
||||
|
||||
// If station worked already
|
||||
if spot.CallsignWorked {
|
||||
flexSpot.Color = "#000000"
|
||||
flexSpot.BackgroundColor = "#00c0c0"
|
||||
@ -167,6 +188,9 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) {
|
||||
fc.Log.Error("could not find the DX in the database: ", err)
|
||||
}
|
||||
|
||||
// send FlexSpot to HTTP Server
|
||||
fc.FlexSpotChan <- flexSpot
|
||||
|
||||
if srcFlexSpot.DX == "" {
|
||||
fc.Repo.CreateSpot(flexSpot)
|
||||
stringSpot := fmt.Sprintf("C%v|spot add rx_freq=%v callsign=%s mode=%s source=%s spotter_callsign=%s timestamp=%v lifetime_seconds=%s comment=%s color=%s background_color=%s priority=%s", flexSpot.CommandNumber, flexSpot.FrequencyMhz,
|
||||
|
209733
flexradio.log
209733
flexradio.log
File diff suppressed because it is too large
Load Diff
2
main.go
2
main.go
@ -60,7 +60,7 @@ func main() {
|
||||
TCPServer := NewTCPServer(Cfg.Telnet.Host, Cfg.Telnet.Port, log)
|
||||
FlexClient := NewFlexClient(*fRepo, *TCPServer, log)
|
||||
TCPClient := NewTCPClient(*Cfg, TCPServer, FlexClient, log)
|
||||
HTTPServer := NewHTTPServer(*cRepo, *fRepo, log)
|
||||
HTTPServer := NewHTTPServer(*cRepo, *fRepo, *FlexClient, log)
|
||||
|
||||
sigCh := make(chan os.Signal, 1)
|
||||
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
|
||||
|
BIN
resources/background.jpg
Normal file
BIN
resources/background.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
@ -17,9 +17,15 @@
|
||||
flex-wrap: wrap;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
body {
|
||||
background: grey;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<br>
|
||||
<br>
|
||||
<div class="container" style="width:1000px; margin: 0 auto;">
|
||||
<div class="card-deck">
|
||||
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
|
||||
@ -32,12 +38,19 @@
|
||||
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Top Spotters</h5>
|
||||
<div id="spotters" hx-get="/spotters" hx-trigger="every 1s" hx-swap="innerHTML"><p class="card-text"></p></div>
|
||||
<div class="card-text" id="spotters" hx-get="/spotters" hx-trigger="every 1s" hx-swap="innerHTML"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">To Work</h5>
|
||||
<h6 class="card-subtitle mb-2 text-muted">New DXCC, Band or Mode</h6>
|
||||
<div class="card-text" id="new" hx-get="/new" hx-trigger="every 1s" hx-swap="innerHTML"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="spot" style="width:1000px; margin:0 auto;" hx-get="/spots" hx-trigger="every 1s" hx-swap="innerHTML"></div>
|
||||
<div class="container" id="spot" style="width:1000px; margin:0 auto;" hx-get="/spots" hx-trigger="every 1s" hx-swap="innerHTML"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
9
templates/new.html
Normal file
9
templates/new.html
Normal file
@ -0,0 +1,9 @@
|
||||
{{ define "new" }}
|
||||
|
||||
{{ range.}}
|
||||
|
||||
<span class="fw-bold">{{ .DX }}</span>: <span>{{ .Status }}</span><br>
|
||||
|
||||
{{ end }}
|
||||
|
||||
{{ end }}
|
Loading…
Reference in New Issue
Block a user