diff --git a/docs/api.md b/docs/api.md index 5a24f16..4eb6a14 100644 --- a/docs/api.md +++ b/docs/api.md @@ -37,8 +37,8 @@ Call imported successfully { errorCount: number; freq: number; // in hertz - len: number; // in seconds - pos: number; // in seconds + len: number; // in seconds + pos: number; // in seconds spikeCount: number; }[]; @@ -49,7 +49,8 @@ Call imported successfully { pos: number; // in seconds - src: number; // the unit ID + src: number; // unit ID + tag: number; // [optional] unit tag }[]; - **system** - [optional] system ID. diff --git a/server/admin.go b/server/admin.go index 6f6eb44..40472b1 100644 --- a/server/admin.go +++ b/server/admin.go @@ -271,8 +271,6 @@ func (admin *Admin) GetAuthorization(r *http.Request) string { } func (admin *Admin) GetConfig() map[string]interface{} { - // _, docker := os.LookupEnv("DOCKER") - systems := []map[string]interface{}{} for _, system := range *admin.Controller.Systems { systems = append(systems, map[string]interface{}{ @@ -284,14 +282,14 @@ func (admin *Admin) GetConfig() map[string]interface{} { "led": system.Led, "order": system.Order, "talkgroups": system.Talkgroups, + "units": system.Units, }) } return map[string]interface{}{ - "access": *admin.Controller.Accesses, - "apiKeys": *admin.Controller.Apikeys, - "dirWatch": *admin.Controller.Dirwatches, - // "docker": docker, + "access": *admin.Controller.Accesses, + "apiKeys": *admin.Controller.Apikeys, + "dirWatch": *admin.Controller.Dirwatches, "downstreams": *admin.Controller.Downstreams, "groups": *admin.Controller.Groups, "options": *admin.Controller.Options, diff --git a/server/api.go b/server/api.go index d1b2c91..7d5f340 100644 --- a/server/api.go +++ b/server/api.go @@ -68,6 +68,7 @@ func (api *Api) CallUploadHandler(w http.ResponseWriter, r *http.Request) { talkgroupGroup interface{} talkgroupLabel interface{} talkgroupTag interface{} + units interface{} ) mediaType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) @@ -190,9 +191,22 @@ func (api *Api) CallUploadHandler(w http.ResponseWriter, r *http.Request) { src["pos"] = uint(v) } - switch v := v["src"].(type) { + switch s := v["src"].(type) { case float64: - src["src"] = uint(v) + src["src"] = uint(s) + + switch t := v["tag"].(type) { + case string: + var u Units + switch v := units.(type) { + case Units: + u = v + default: + u = Units{} + } + u.Add(uint(s), t) + units = u + } } } @@ -246,6 +260,7 @@ func (api *Api) CallUploadHandler(w http.ResponseWriter, r *http.Request) { talkgroupGroup: talkgroupGroup, talkgroupLabel: talkgroupLabel, talkgroupTag: talkgroupTag, + units: units, } if call.IsValid() { diff --git a/server/call.go b/server/call.go index e182ac1..926d0a8 100644 --- a/server/call.go +++ b/server/call.go @@ -39,6 +39,7 @@ type Call struct { talkgroupGroup interface{} talkgroupLabel interface{} talkgroupTag interface{} + units interface{} } func (call *Call) IsValid() bool { diff --git a/server/controller.go b/server/controller.go index 87791da..f24b64d 100644 --- a/server/controller.go +++ b/server/controller.go @@ -288,6 +288,14 @@ func (controller *Controller) IngestCall(call *Call) { system.Talkgroups = append(system.Talkgroups, talkgroup) } + if controller.Options.AutoPopulate || system.AutoPopulate { + switch v := call.units.(type) { + case Units: + populated = true + system.Units.Merge(&v) + } + } + if populated { if err = controller.Systems.Write(controller.Database); err != nil { logError(err) diff --git a/server/parsers.go b/server/parsers.go index a4cd8f9..4815fec 100644 --- a/server/parsers.go +++ b/server/parsers.go @@ -109,22 +109,27 @@ func ParseTrunkRecorderMeta(call *Call, b []byte) error { case float64: freq["errorCount"] = uint(v) } + switch v := v["freq"].(type) { case float64: freq["freq"] = uint(v) } + switch v := v["len"].(type) { case float64: freq["len"] = uint(v) } + switch v := v["pos"].(type) { case float64: freq["pos"] = uint(v) } + switch v := v["spike_count"].(type) { case float64: freq["spikeCount"] = uint(v) } + freqs = append(freqs, freq) } } @@ -142,10 +147,25 @@ func ParseTrunkRecorderMeta(call *Call, b []byte) error { case float64: source["pos"] = uint(v) } - switch v := v["src"].(type) { + + switch s := v["src"].(type) { case float64: - source["src"] = uint(v) + source["src"] = uint(s) + + switch t := v["tag"].(type) { + case string: + var units Units + switch v := call.units.(type) { + case Units: + units = v + default: + units = Units{} + } + units.Add(uint(s), t) + call.units = units + } } + sources = append(sources, source) } } @@ -167,5 +187,11 @@ func ParseTrunkRecorderMeta(call *Call, b []byte) error { call.Talkgroup = uint(v) } + switch v := m["talkgroup_tag"].(type) { + case string: + call.talkgroupTag = v + call.talkgroupLabel = v + } + return nil } diff --git a/server/unit.go b/server/unit.go index 16278de..5fe1051 100644 --- a/server/unit.go +++ b/server/unit.go @@ -39,6 +39,23 @@ func (unit *Unit) FromMap(m map[string]interface{}) { type Units []Unit +func (units *Units) Add(id uint, label string) *Units { + found := false + + for _, u := range *units { + if u.Id == id { + found = true + break + } + } + + if !found { + *units = append(*units, Unit{Id: id, Label: label}) + } + + return units +} + func (units *Units) FromJson(str string) error { var v interface{} @@ -67,6 +84,12 @@ func (units *Units) FromJson(str string) error { return nil } +func (u *Units) Merge(units *Units) { + for _, v := range *units { + u.Add(v.Id, v.Label) + } +} + func (units *Units) ToJson() (string, error) { if b, err := json.Marshal(*units); err == nil { return string(b), nil