kopia lustrzana https://github.com/cyoung/stratux
135 wiersze
3.5 KiB
Go
135 wiersze
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"fmt"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type dump1090Data struct {
|
|
Icao_addr uint32
|
|
DF int // Mode S downlink format.
|
|
CA int // Lowest 3 bits of first byte of Mode S message (DF11 and DF17 capability; DF18 control field, zero for all other DF types)
|
|
TypeCode int // Mode S type code
|
|
SubtypeCode int // Mode S subtype code
|
|
SBS_MsgType int // type of SBS message (used in "old" 1090 parsing)
|
|
SignalLevel float64 // Decimal RSSI (0-1 nominal) as reported by dump1090-mutability. Convert to dB RSSI before setting in TrafficInfo.
|
|
Tail *string
|
|
Squawk *int // 12-bit squawk code in octal format
|
|
Emitter_category *int
|
|
OnGround *bool
|
|
Lat *float32
|
|
Lng *float32
|
|
Position_valid bool
|
|
NACp *int
|
|
Alt *int
|
|
AltIsGNSS bool //
|
|
GnssDiffFromBaroAlt *int16 // GNSS height above baro altitude in feet; valid range is -3125 to 3125. +/- 3138 indicates larger difference.
|
|
Vvel *int16
|
|
Speed_valid bool
|
|
Speed *uint16
|
|
Track *uint16
|
|
Timestamp time.Time // time traffic last seen, UTC
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
fmt.Printf("es_dump_csv <sqlite file>\n")
|
|
return
|
|
}
|
|
db, err := sql.Open("sqlite3", os.Args[1])
|
|
if err != nil {
|
|
fmt.Printf("sql.Open(): %s\n", err.Error())
|
|
return
|
|
}
|
|
defer db.Close()
|
|
rows, err := db.Query("SELECT Data FROM es_messages")
|
|
if err != nil {
|
|
fmt.Printf("db.Exec(): %s\n", err.Error())
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
csvOut := make([][]string, 0)
|
|
|
|
for rows.Next() {
|
|
var Data string
|
|
if err := rows.Scan(&Data); err != nil {
|
|
fmt.Printf("rows.Scan(): %s\n", err.Error())
|
|
continue
|
|
}
|
|
var d dump1090Data
|
|
err := json.Unmarshal([]byte(Data), &d)
|
|
if err != nil {
|
|
fmt.Printf("json.Unmarshal(): %s\n", err.Error())
|
|
continue
|
|
}
|
|
|
|
r := make([]string, 23)
|
|
r[0] = fmt.Sprintf("%06x", d.Icao_addr)
|
|
r[1] = fmt.Sprintf("%d", d.DF)
|
|
r[2] = fmt.Sprintf("%d", d.CA)
|
|
r[3] = fmt.Sprintf("%d", d.TypeCode)
|
|
r[4] = fmt.Sprintf("%d", d.SubtypeCode)
|
|
r[5] = fmt.Sprintf("%d", d.SBS_MsgType)
|
|
|
|
r[6] = fmt.Sprintf("%f", d.SignalLevel)
|
|
if d.Tail != nil {
|
|
r[7] = fmt.Sprintf("%s", *d.Tail)
|
|
}
|
|
if d.Squawk != nil {
|
|
r[8] = fmt.Sprintf("%d", *d.Squawk)
|
|
}
|
|
if d.Emitter_category != nil {
|
|
r[9] = fmt.Sprintf("%d", *d.Emitter_category)
|
|
}
|
|
if d.OnGround != nil {
|
|
r[10] = fmt.Sprintf("%t", *d.OnGround)
|
|
}
|
|
if d.Lat != nil {
|
|
r[11] = fmt.Sprintf("%f", *d.Lat)
|
|
}
|
|
if d.Lng != nil {
|
|
r[12] = fmt.Sprintf("%f", *d.Lng)
|
|
}
|
|
|
|
r[13] = fmt.Sprintf("%t", d.Position_valid)
|
|
if d.NACp != nil {
|
|
r[14] = fmt.Sprintf("%d", *d.NACp)
|
|
}
|
|
if d.Alt != nil {
|
|
r[15] = fmt.Sprintf("%d", *d.Alt)
|
|
}
|
|
|
|
r[16] = fmt.Sprintf("%t", d.AltIsGNSS)
|
|
if d.GnssDiffFromBaroAlt != nil {
|
|
r[17] = fmt.Sprintf("%d", *d.GnssDiffFromBaroAlt)
|
|
}
|
|
if d.Vvel != nil {
|
|
r[18] = fmt.Sprintf("%d", *d.Vvel)
|
|
}
|
|
r[19] = fmt.Sprintf("%t", d.Speed_valid)
|
|
if d.Speed != nil {
|
|
r[20] = fmt.Sprintf("%d", *d.Speed)
|
|
}
|
|
if d.Track != nil {
|
|
r[21] = fmt.Sprintf("%d", *d.Track)
|
|
}
|
|
r[22] = fmt.Sprintf("%s", d.Timestamp)
|
|
|
|
csvOut = append(csvOut, r)
|
|
}
|
|
|
|
w := csv.NewWriter(os.Stdout)
|
|
w.WriteAll(csvOut)
|
|
|
|
if err := rows.Err(); err != nil {
|
|
fmt.Printf("rows.Scan(): %s\n", err.Error())
|
|
return
|
|
}
|
|
}
|