2020-04-16 19:37:54 -05:00
|
|
|
// Copyright 2020 Team 254. All Rights Reserved.
|
|
|
|
|
// Author: kenschenke@gmail.com (Ken Schenke)
|
|
|
|
|
//
|
|
|
|
|
// Web handlers for handling realtime scores API.
|
|
|
|
|
|
2020-04-17 20:59:07 -05:00
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
API Docs
|
|
|
|
|
|
|
|
|
|
JSON Schema:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
“red”: {“auto”: 99, “teleop”: 99, “endgame": 99},
|
|
|
|
|
“blue”: {“auto”: 99, “teleop”: 99, “endgame": 99}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GET http://10.0.100.5/api/scores
|
|
|
|
|
|
|
|
|
|
Returns current score.
|
|
|
|
|
|
|
|
|
|
PUT http://10.0.100.5/api/scores
|
|
|
|
|
|
|
|
|
|
Sets the current scores from the request body. All
|
|
|
|
|
parts are optional. Anything missing is set to zero.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
“red”: {“auto”: 10}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Red teleop and endgame are set to zero as well as all blue scores.
|
|
|
|
|
|
|
|
|
|
PATCH http://10.0.100.5/api/scores
|
|
|
|
|
|
|
|
|
|
Adds or subtracts the current scores from the request
|
|
|
|
|
body. All parts are optional. Scores missing from the
|
|
|
|
|
request body are left untouched.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
“red”: {“auto”: 10},
|
|
|
|
|
"blue": {"teleop": -5}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
10 is added to red auto. Red teleop and endgame are left untouched.
|
|
|
|
|
5 is subtracted from blue teleop. Blue auto and endgame are left untouched.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
2020-04-16 19:37:54 -05:00
|
|
|
package web
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
2021-05-16 11:00:29 -07:00
|
|
|
"github.com/Team254/cheesy-arena-lite/field"
|
|
|
|
|
"github.com/Team254/cheesy-arena-lite/game"
|
2020-04-16 19:37:54 -05:00
|
|
|
"io/ioutil"
|
|
|
|
|
"net/http"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type jsonAllianceScore struct {
|
|
|
|
|
Auto int `json:"auto"`
|
|
|
|
|
Teleop int `json:"teleop"`
|
|
|
|
|
Endgame int `json:"endgame"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type jsonScore struct {
|
|
|
|
|
Red jsonAllianceScore `json:"red"`
|
|
|
|
|
Blue jsonAllianceScore `json:"blue"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (web *Web) getScoresHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
json.NewEncoder(w).Encode(jsonScore{
|
|
|
|
|
Red: jsonAllianceScore{
|
|
|
|
|
Auto: web.arena.RedScore.AutoPoints,
|
|
|
|
|
Teleop: web.arena.RedScore.TeleopPoints,
|
|
|
|
|
Endgame: web.arena.RedScore.EndgamePoints,
|
|
|
|
|
},
|
|
|
|
|
Blue: jsonAllianceScore{
|
|
|
|
|
Auto: web.arena.BlueScore.AutoPoints,
|
|
|
|
|
Teleop: web.arena.BlueScore.TeleopPoints,
|
|
|
|
|
Endgame: web.arena.BlueScore.EndgamePoints,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (web *Web) setScoresHandler(w http.ResponseWriter, r *http.Request) {
|
2020-04-25 15:21:06 -07:00
|
|
|
if web.arena.MatchState == field.PreMatch || web.arena.MatchState == field.TimeoutActive ||
|
|
|
|
|
web.arena.MatchState == field.PostTimeout {
|
|
|
|
|
http.Error(w, "Score cannot be updated in this match state", http.StatusBadRequest)
|
2020-04-16 19:37:54 -05:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var scores jsonScore
|
|
|
|
|
reqBody, err := ioutil.ReadAll(r.Body)
|
|
|
|
|
if err != nil {
|
2020-04-25 15:21:06 -07:00
|
|
|
handleWebErr(w, err)
|
2020-04-16 19:37:54 -05:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
json.Unmarshal(reqBody, &scores)
|
|
|
|
|
|
|
|
|
|
if r.Method == "PUT" {
|
|
|
|
|
web.arena.RedScore = new(game.Score)
|
|
|
|
|
web.arena.BlueScore = new(game.Score)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
web.arena.RedScore.AutoPoints += scores.Red.Auto
|
|
|
|
|
web.arena.RedScore.TeleopPoints += scores.Red.Teleop
|
|
|
|
|
web.arena.RedScore.EndgamePoints += scores.Red.Endgame
|
|
|
|
|
web.arena.BlueScore.AutoPoints += scores.Blue.Auto
|
|
|
|
|
web.arena.BlueScore.TeleopPoints += scores.Blue.Teleop
|
|
|
|
|
web.arena.BlueScore.EndgamePoints += scores.Blue.Endgame
|
|
|
|
|
web.arena.RealtimeScoreNotifier.Notify()
|
|
|
|
|
}
|