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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
@ -9,15 +10,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var tmpl *template.Template
|
var tmpl *template.Template
|
||||||
|
var listNew = []New{}
|
||||||
|
|
||||||
|
type New struct {
|
||||||
|
DX string
|
||||||
|
Status string
|
||||||
|
}
|
||||||
|
|
||||||
type HTTPServer struct {
|
type HTTPServer struct {
|
||||||
router *mux.Router
|
router *mux.Router
|
||||||
Log4OMRepo Log4OMContactsRepository
|
Log4OMRepo Log4OMContactsRepository
|
||||||
Repo FlexDXClusterRepository
|
Repo FlexDXClusterRepository
|
||||||
Log *log.Logger
|
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()
|
gRouter := mux.NewRouter()
|
||||||
|
|
||||||
@ -26,6 +34,7 @@ func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository
|
|||||||
Log4OMRepo: cRepo,
|
Log4OMRepo: cRepo,
|
||||||
Repo: fRepo,
|
Repo: fRepo,
|
||||||
Log: log,
|
Log: log,
|
||||||
|
FlexClient: fClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,9 +43,17 @@ func (s *HTTPServer) SetRoutes() {
|
|||||||
s.router.HandleFunc("/spots", s.GetSpots).Methods("GET")
|
s.router.HandleFunc("/spots", s.GetSpots).Methods("GET")
|
||||||
s.router.HandleFunc("/spotscount", s.GetSpotsCount).Methods("GET")
|
s.router.HandleFunc("/spotscount", s.GetSpotsCount).Methods("GET")
|
||||||
s.router.HandleFunc("/spotters", s.GetSpotters).Methods("GET")
|
s.router.HandleFunc("/spotters", s.GetSpotters).Methods("GET")
|
||||||
|
s.router.HandleFunc("/new", s.GetNew).Methods("GET")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *HTTPServer) StartHTTPServer() {
|
func (s *HTTPServer) StartHTTPServer() {
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for spot := range s.FlexClient.FlexSpotChan {
|
||||||
|
s.GetListofNew(spot)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
tmpl, _ = template.ParseGlob("templates/*.html")
|
tmpl, _ = template.ParseGlob("templates/*.html")
|
||||||
s.SetRoutes()
|
s.SetRoutes()
|
||||||
s.Log.Infof("starting HTTP server on %s:%s", Cfg.HTTPServer.Host, Cfg.HTTPServer.Port)
|
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) {
|
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)
|
tmpl.ExecuteTemplate(w, "spot", spots)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,3 +85,28 @@ func (s *HTTPServer) GetSpotters(w http.ResponseWriter, r *http.Request) {
|
|||||||
spotters := s.Repo.GetSpotters()
|
spotters := s.Repo.GetSpotters()
|
||||||
tmpl.ExecuteTemplate(w, "spotters", spotters)
|
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() {
|
go func() {
|
||||||
for message := range c.TCPServer.CmdChan {
|
for message := range c.TCPServer.CmdChan {
|
||||||
message := message + "\n"
|
|
||||||
c.Log.Infof("Received DX Command: %s", message)
|
c.Log.Infof("Received DX Command: %s", message)
|
||||||
|
message := message + "\n"
|
||||||
c.WriteString(message)
|
c.WriteString(message)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -122,7 +122,7 @@ func (s *TCPServer) broadcastMessage(message string) {
|
|||||||
for client := range s.Clients {
|
for client := range s.Clients {
|
||||||
_, err := client.Write([]byte(message))
|
_, err := client.Write([]byte(message))
|
||||||
if err != nil {
|
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
|
port: 7300
|
||||||
login: xv9q-2
|
login: xv9q-2
|
||||||
skimmer: true
|
skimmer: true
|
||||||
ft8: true
|
ft8: false
|
||||||
flex:
|
flex:
|
||||||
ip: 10.10.10.120
|
ip: 10.10.10.120
|
||||||
spot_life: 600
|
spot_life: 600
|
||||||
|
@ -112,12 +112,9 @@ func (r *Log4OMContactsRepository) ListByCountry(countryID string) ([]*Contact,
|
|||||||
|
|
||||||
func (r *Log4OMContactsRepository) ListByCountryMode(countryID string, mode string) ([]*Contact, error) {
|
func (r *Log4OMContactsRepository) ListByCountryMode(countryID string, mode string) ([]*Contact, error) {
|
||||||
|
|
||||||
modeUSB := "USB"
|
|
||||||
modeLSB := "LSB"
|
|
||||||
|
|
||||||
if mode == "USB" || mode == "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 {
|
if err != nil {
|
||||||
log.Error("could not query database", err)
|
log.Error("could not query database", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -241,7 +238,7 @@ func (r *FlexDXClusterRepository) GetSpotters() []Spotter {
|
|||||||
|
|
||||||
sList := []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 {
|
if err != nil {
|
||||||
r.Log.Error(err)
|
r.Log.Error(err)
|
||||||
|
BIN
flex.sqlite
BIN
flex.sqlite
Binary file not shown.
26
flexradio.go
26
flexradio.go
@ -33,6 +33,10 @@ type FlexSpot struct {
|
|||||||
Comment string
|
Comment string
|
||||||
Color string
|
Color string
|
||||||
BackgroundColor string
|
BackgroundColor string
|
||||||
|
NewDXCC bool
|
||||||
|
NewBand bool
|
||||||
|
NewMode bool
|
||||||
|
Worked bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlexClient struct {
|
type FlexClient struct {
|
||||||
@ -45,6 +49,7 @@ type FlexClient struct {
|
|||||||
Conn *net.TCPConn
|
Conn *net.TCPConn
|
||||||
SpotChan chan TelnetSpot
|
SpotChan chan TelnetSpot
|
||||||
MsgChan chan string
|
MsgChan chan string
|
||||||
|
FlexSpotChan chan FlexSpot
|
||||||
Repo FlexDXClusterRepository
|
Repo FlexDXClusterRepository
|
||||||
Log *log.Logger
|
Log *log.Logger
|
||||||
TCPServer TCPServer
|
TCPServer TCPServer
|
||||||
@ -55,6 +60,7 @@ func NewFlexClient(repo FlexDXClusterRepository, TCPServer TCPServer, log *log.L
|
|||||||
Address: Cfg.Flex.IP,
|
Address: Cfg.Flex.IP,
|
||||||
Port: "4992",
|
Port: "4992",
|
||||||
SpotChan: make(chan TelnetSpot),
|
SpotChan: make(chan TelnetSpot),
|
||||||
|
FlexSpotChan: make(chan FlexSpot),
|
||||||
MsgChan: TCPServer.MsgChan,
|
MsgChan: TCPServer.MsgChan,
|
||||||
Repo: repo,
|
Repo: repo,
|
||||||
TCPServer: TCPServer,
|
TCPServer: TCPServer,
|
||||||
@ -127,26 +133,41 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) {
|
|||||||
Color: "#eaeaea",
|
Color: "#eaeaea",
|
||||||
BackgroundColor: "#000000",
|
BackgroundColor: "#000000",
|
||||||
Priority: "5",
|
Priority: "5",
|
||||||
|
NewDXCC: spot.NewDXCC,
|
||||||
|
NewBand: spot.NewBand,
|
||||||
|
NewMode: spot.NewMode,
|
||||||
|
Worked: spot.CallsignWorked,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If new DXCC
|
||||||
if spot.NewDXCC {
|
if spot.NewDXCC {
|
||||||
flexSpot.Color = "#3bf908"
|
flexSpot.Color = "#3bf908"
|
||||||
flexSpot.Priority = "1"
|
flexSpot.Priority = "1"
|
||||||
flexSpot.BackgroundColor = "#000000"
|
flexSpot.BackgroundColor = "#000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
if spot.NewBand || spot.NewMode && spot.Mode != "" {
|
// if New Band
|
||||||
|
if spot.NewBand {
|
||||||
flexSpot.Color = "#f9f508"
|
flexSpot.Color = "#f9f508"
|
||||||
flexSpot.Priority = "2"
|
flexSpot.Priority = "2"
|
||||||
flexSpot.BackgroundColor = "#000000"
|
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 {
|
if !spot.NewBand && !spot.NewMode && !spot.NewDXCC && !spot.CallsignWorked {
|
||||||
flexSpot.Color = "#eaeaea"
|
flexSpot.Color = "#eaeaea"
|
||||||
flexSpot.Priority = "5"
|
flexSpot.Priority = "5"
|
||||||
flexSpot.BackgroundColor = "#000000"
|
flexSpot.BackgroundColor = "#000000"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If station worked already
|
||||||
if spot.CallsignWorked {
|
if spot.CallsignWorked {
|
||||||
flexSpot.Color = "#000000"
|
flexSpot.Color = "#000000"
|
||||||
flexSpot.BackgroundColor = "#00c0c0"
|
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)
|
fc.Log.Error("could not find the DX in the database: ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// send FlexSpot to HTTP Server
|
||||||
|
fc.FlexSpotChan <- flexSpot
|
||||||
|
|
||||||
if srcFlexSpot.DX == "" {
|
if srcFlexSpot.DX == "" {
|
||||||
fc.Repo.CreateSpot(flexSpot)
|
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,
|
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)
|
TCPServer := NewTCPServer(Cfg.Telnet.Host, Cfg.Telnet.Port, log)
|
||||||
FlexClient := NewFlexClient(*fRepo, *TCPServer, log)
|
FlexClient := NewFlexClient(*fRepo, *TCPServer, log)
|
||||||
TCPClient := NewTCPClient(*Cfg, TCPServer, FlexClient, log)
|
TCPClient := NewTCPClient(*Cfg, TCPServer, FlexClient, log)
|
||||||
HTTPServer := NewHTTPServer(*cRepo, *fRepo, log)
|
HTTPServer := NewHTTPServer(*cRepo, *fRepo, *FlexClient, log)
|
||||||
|
|
||||||
sigCh := make(chan os.Signal, 1)
|
sigCh := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
|
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;
|
flex-wrap: wrap;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: grey;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
<div class="container" style="width:1000px; margin: 0 auto;">
|
<div class="container" style="width:1000px; margin: 0 auto;">
|
||||||
<div class="card-deck">
|
<div class="card-deck">
|
||||||
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
|
<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 shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title">Top Spotters</h5>
|
<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>
|
</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>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</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