Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions cmd/oceanbench/broadcast.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ const (
broadcastToken
broadcastDelete
broadcastSelect
broadcastResetState

// Vidforward control API request actions.
vidforwardCreate
Expand Down Expand Up @@ -435,6 +436,22 @@ func broadcastHandler(w http.ResponseWriter, r *http.Request) {

}
msg = "slate uploaded successfully"
case broadcastResetState:
err = resetState(ctx, &req.CurrentBroadcast)
if err != nil {
reportError(w, r, req, "could not reset state: %v", err)
return
}
v, err := model.GetVariable(ctx, settingsStore, sKey, broadcastScope+"."+cfg.Name)
if err != nil {
reportError(w, r, req, "could not load saved broadcast: %v", err)
return
}
err = json.Unmarshal([]byte(v.Value), cfg)
if err != nil {
reportError(w, r, req, "could not unmarshal broadcast: %v", err)
return
}
}

writeTemplate(w, r, "broadcast.html", &req, msg)
Expand All @@ -450,6 +467,7 @@ func stringToAction(s string, req broadcastRequest) Action {
"broadcast-token": broadcastToken,
"broadcast-delete": broadcastDelete,
"broadcast-select": broadcastSelect,
"broadcast-reset-state": broadcastResetState,
"vidforward-create": vidforwardCreate,
"vidforward-play": vidforwardPlay,
"vidforward-slate": vidforwardSlate,
Expand Down Expand Up @@ -495,6 +513,37 @@ func saveBroadcast(ctx context.Context, cfg *Cfg) error {
return nil
}

// resetState sends a request to reset the state of a broadcast to the broadcast manager service (oceantv).
// TODO: Add JWT signing.
func resetState(ctx context.Context, cfg *Cfg) error {
data, err := json.Marshal(cfg)
if err != nil {
return fmt.Errorf("error marshalling BroadcastConfig: %w", err)
}

const resetStateEndpoint = "/broadcast/reset-state"
url := tvURL + resetStateEndpoint
reader := bytes.NewReader(data)
req, err := http.NewRequest("POST", url, reader)
if err != nil {
return fmt.Errorf("error creating %s request: %w", resetStateEndpoint, err)
}
req.Header.Set("Content-Type", "application/json")

clt := &http.Client{}
resp, err := clt.Do(req)
if err != nil {
return fmt.Errorf("error sending %s request: %w", resetStateEndpoint, err)
}

if resp.StatusCode != http.StatusOK {
return fmt.Errorf("%s request failed with status code: %s", resetStateEndpoint, http.StatusText(resp.StatusCode))
}

log.Printf("%s OK", resetStateEndpoint)
return nil
}

// deleteBroadcast deletes a broadcast from the datastore and also updates the BroadcastVars
// list and CurrentBroadcast config to clear the form on next page write.
func deleteBroadcast(ctx context.Context, req *broadcastRequest, store datastore.Store) error {
Expand Down
2 changes: 1 addition & 1 deletion cmd/oceanbench/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ import (
)

const (
version = "v0.32.2"
version = "v0.32.3"
localSite = "localhost"
localDevice = "localdevice"
localEmail = "localuser@localhost"
Expand Down
18 changes: 9 additions & 9 deletions cmd/oceanbench/t/broadcast.html
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,10 @@ <h2 class="pt-5">Stream Settings</h2>
<label class="w-25 text-end">Hardware State Data:</label>
<input class="w-50 align-items-center form-control" id="hardware-state-data" size="1" value="{{.CurrentBroadcast.PrettyHardwareStateData}}" readonly />
</div>
<div class="d-flex align-items-center gap-1 mb-1">
<div class="w-25"></div>
<button class="w-50 btn btn-secondary btn-sm" onclick="buttonClick(this)" value="broadcast-reset-state">Reset States</button>
</div>
</div>
</fieldset>
<h2 class="pt-5">Device Settings</h2>
Expand All @@ -159,12 +163,10 @@ <h2 class="pt-5">Device Settings</h2>
<select id="camera-select" name="camera-mac" class="form-select h-auto w-50">
<option {{if eq .CurrentBroadcast.CameraMac 0}}selected{{end}}>Select</option>
{{range .Cameras}}
<option value="{{.MAC}}" {{if eq .Mac $.CurrentBroadcast.CameraMac }}selected{{end}}>
{{.Name}}
</option>
<option value="{{.MAC}}" {{if eq .Mac $.CurrentBroadcast.CameraMac }}selected{{end}}>{{.Name}}</option>
{{end}}
</select>
</select>

<div class="d-flex gap-3 flex-row">
{{range .Settings.Resolution}}
<div>
Expand All @@ -181,11 +183,9 @@ <h2 class="pt-5">Device Settings</h2>
<select id="controller-select" name="controller-mac" class="form-select h-auto w-50">
<option {{if eq .CurrentBroadcast.ControllerMAC 0}}selected{{end}}>Select</option>
{{range .Controllers}}
<option value="{{.MAC}}" {{if eq .Mac $.CurrentBroadcast.ControllerMAC}}selected{{end}}>
{{.Name}}
</option>
<option value="{{.MAC}}" {{if eq .Mac $.CurrentBroadcast.ControllerMAC}}selected{{end}}>{{.Name}}</option>
{{end}}
</select>
</select>
<button type="button" onclick="generateActions()" class="btn btn-primary">Generate Actions</button>
</div>
</div>
Expand Down
29 changes: 27 additions & 2 deletions cmd/oceantv/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import (

const (
projectID = "oceantv"
version = "v0.10.7"
version = "v0.11.0"
projectURL = "https://oceantv.appspot.com"
cronServiceAccount = "oceancron@appspot.gserviceaccount.com"
locationID = "Australia/Adelaide" // TODO: Use site location.
Expand Down Expand Up @@ -365,7 +365,8 @@ func broadcastHandler(w http.ResponseWriter, r *http.Request) {
}

op := req[2]
if op != "save" {
const resetState string = "reset-state"
if op != "save" && op != resetState {
writeError(w, http.StatusBadRequest, fmt.Errorf("invalid operation: %s", op))
return
}
Expand Down Expand Up @@ -402,6 +403,30 @@ func broadcastHandler(w http.ResponseWriter, r *http.Request) {
// NOTE: This needs to be kept in sync with the UI. To aid this, the fields
// have been updated in the same order which they're currently being updated on oceanbench.

// Reset State.
if op == resetState {
_cfg.InFailure = false
_cfg.StartFailures = 0
_cfg.AttemptingToStart = false
_cfg.Enabled = true
_cfg.Events = []string{}
_cfg.Issues = 0

if cfg.UsingVidforward {
if strings.Contains(cfg.Name, secondaryBroadcastPostfix) {
_cfg.BroadcastState = stateToString(&vidforwardSecondaryIdle{})
} else {
_cfg.BroadcastState = stateToString(&vidforwardPermanentIdle{})
}
} else {
_cfg.BroadcastState = stateToString(&directIdle{})
}
_cfg.StateData = nil
_cfg.HardwareState = hardwareStateToString(&hardwareOff{})
_cfg.HardwareStateData = nil
return
}

// Values parsed initially from the form submission.
_cfg.SKey = cfg.SKey
_cfg.Name = cfg.Name
Expand Down
Loading