-
Notifications
You must be signed in to change notification settings - Fork 0
/
page_parser.go
86 lines (74 loc) · 2.51 KB
/
page_parser.go
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
package main
import (
"bytes"
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func ParseDiagnosticsPage(pagebody string) (signalsdata *SignalsData, err error) {
pagebytes := bytes.NewBufferString(pagebody)
doc, err := goquery.NewDocumentFromReader(pagebytes)
if err != nil {
return nil, err
}
defer func() {
if p := recover(); p != nil {
err = fmt.Errorf("%v", p)
signalsdata = nil
}
}()
forward_rows := doc.Find("table.light").Slice(0, 1).Find("tr")
fchannels_count := forward_rows.Length() - 1
fchannels := make(Channels, fchannels_count, fchannels_count)
forward_rows.Slice(1, forward_rows.Length()).Each(func(i int, tr *goquery.Selection) {
var frequency, power, snr, ber float32
var channel, modulation int
row_str, _ := tr.Html()
layout := `<td align="right">%d</td><td align="right">%f MHz</td><td align="right">%f dBmV</td><td align="right">%f dB</td><td align="right">%f %%</td><td align="right">%d QAM</td>`
_, err := fmt.Sscanf(row_str, layout, &channel, &frequency, &power, &snr, &ber, &modulation)
if err != nil {
panic(fmt.Errorf("scanning forward rows: %v", err))
}
fchannels[i] = &ChannelData{
channel: channel,
power: power,
frequency: frequency,
modulation: modulation,
snr: snr,
ber: ber,
}
})
back_rows := doc.Find("table.light").Slice(1, 2).Find("tr")
bchannels_count := back_rows.Length() - 1
bchannels := make(Channels, bchannels_count, bchannels_count)
back_rows.Slice(1, back_rows.Length()).Each(func(i int, tr *goquery.Selection) {
var frequency, power float32
var channel, modulation int
row_str, _ := tr.Html()
var layout string
var err error
if strings.Contains(row_str, "QPSK") {
layout = `<td align="right">%d</td><td align="right">%f MHz</td><td align="right">%f dBmV</td><td align="right">QPSK</td>`
_, err = fmt.Sscanf(row_str, layout, &channel, &frequency, &power)
if err != nil {
panic(fmt.Errorf("scanning return signal rows with QPSK: %v", err))
}
} else {
layout = `<td align="right">%d</td><td align="right">%f MHz</td><td align="right">%f dBmV</td><td align="right">%d QAM</td>`
_, err = fmt.Sscanf(row_str, layout, &channel, &frequency, &power, &modulation)
if err != nil {
panic(fmt.Errorf("scanning return signal rows with QAM: %v", err))
}
}
bchannels[i] = &ChannelData{
channel: channel,
power: power,
frequency: frequency,
modulation: modulation,
}
})
return &SignalsData{
ForwardSignals: fchannels,
ReturnSignals: bchannels,
}, err
}