wip: add openmct-type historical api
This commit is contained in:
parent
245a654164
commit
3f9df5c1eb
8
http.go
8
http.go
|
@ -81,11 +81,11 @@ func apiV1(broker *Broker, db *db.TelemDb) chi.Router {
|
|||
|
||||
})
|
||||
|
||||
// this is to get packets by a name.
|
||||
r.Get("/{name:[a-z_]+}", func(w http.ResponseWriter, r *http.Request) {
|
||||
// support field getting (matching too?)
|
||||
// support limit
|
||||
// this is to get a single field
|
||||
r.Get("/{name:[a-z_]+}/{field:[a-z_]}", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// we need a start and end time. If none is provided,
|
||||
// we use unix epoch as start, and now + 1 day as end.
|
||||
})
|
||||
|
||||
})
|
||||
|
|
49
internal/db/getters.go
Normal file
49
internal/db/getters.go
Normal file
|
@ -0,0 +1,49 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Datum is a single measurement - it is more granular than a packet.
|
||||
// the classic example is bms_measurement.current
|
||||
type Datum struct {
|
||||
Timestamp time.Time `db:"timestamp"`
|
||||
Value any `db:"val"`
|
||||
}
|
||||
|
||||
// GetValues queries the database for values in a given time range.
|
||||
// A value is a specific data point. For example, bms_measurement.current
|
||||
// would be a value.
|
||||
func (tdb *TelemDb) GetValues(ctx context.Context, packetName, field string , start time.Time,
|
||||
end time.Time) ([]Datum, error) {
|
||||
// this fragment uses json_extract from sqlite to get a single
|
||||
// nested value.
|
||||
const SqlFrag = `
|
||||
SELECT
|
||||
datetime(ts /1000.0, 'unixepoch', 'subsec') as timestamp,
|
||||
json_extract(data, ?) as val,
|
||||
FROM bus_events WHERE name IS ? AND timestamp BETWEEN ? AND ?
|
||||
`
|
||||
|
||||
fieldJson := "$." + field
|
||||
|
||||
rows, err := tdb.db.QueryxContext(ctx, fieldJson, packetName, start, end)
|
||||
defer rows.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data := make([]Datum, 0, 10)
|
||||
for rows.Next() {
|
||||
var d Datum
|
||||
err = rows.StructScan(&d)
|
||||
if err != nil {
|
||||
return data, err
|
||||
}
|
||||
data = append(data, d)
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
CREATE TABLE "import_log" (
|
||||
"filename" TEXT NOT NULL,
|
||||
"date" INTEGER NOT NULL,
|
||||
"date" TIMESTAMP NOT NULL,
|
||||
"count" INTEGER NOT NULL,
|
||||
"start_time" INTEGER NOT NULL,
|
||||
"end_time" INTEGER NOT NULL
|
|
@ -128,6 +128,11 @@ func parseTelemLogLine(line string) (b skylab.BusEvent, err error) {
|
|||
}
|
||||
ts := time.Unix(unixSeconds, unixMillis*1e6)
|
||||
|
||||
// VALIDATION STEP: sometimes the data gets really whack.
|
||||
// We check that the time is between 2017 and 2032.
|
||||
// Realistically we will not be using this software then.
|
||||
// TODO: add this
|
||||
|
||||
id, err := strconv.ParseUint(a[3], 16, 16)
|
||||
if err != nil {
|
||||
err = NewFormatError("failed to parse id", err)
|
||||
|
|
Loading…
Reference in a new issue