blob: 1fb672f4c00d7486f6c0a454c450941f3bb86284 [file] [log] [blame]
Philipp Schrader80587432022-03-05 15:41:22 -08001import { Component, OnInit } from '@angular/core';
2
Philipp Schrader8b8ed672022-03-05 18:08:50 -08003import * as flatbuffer_builder from 'org_frc971/external/com_github_google_flatbuffers/ts/builder';
4import {ByteBuffer} from 'org_frc971/external/com_github_google_flatbuffers/ts/byte-buffer';
5import * as error_response from 'org_frc971/scouting/webserver/requests/messages/error_response_generated';
6import * as submit_data_scouting_response from 'org_frc971/scouting/webserver/requests/messages/submit_data_scouting_response_generated';
7import * as submit_data_scouting from 'org_frc971/scouting/webserver/requests/messages/submit_data_scouting_generated';
8import SubmitDataScouting = submit_data_scouting.scouting.webserver.requests.SubmitDataScouting;
9import SubmitDataScoutingResponse = submit_data_scouting_response.scouting.webserver.requests.SubmitDataScoutingResponse;
10import ErrorResponse = error_response.scouting.webserver.requests.ErrorResponse;
11
Philipp Schrader93ade042022-03-05 17:16:10 -080012type Section = 'Team Selection'|'Auto'|'TeleOp'|'Climb'|'Defense'|'Review and Submit'|'Home'
Milo Linefef48f2022-03-12 15:18:56 -080013type Level = 'Failed'|'Low'|'Medium'|'High'|'Transversal'
Philipp Schrader80587432022-03-05 15:41:22 -080014
15@Component({
16 selector: 'app-entry',
17 templateUrl: './entry.ng.html',
Philipp Schrader72beced2022-03-07 05:29:52 -080018 styleUrls: ['../common.css', './entry.component.css']
Philipp Schrader80587432022-03-05 15:41:22 -080019})
20export class EntryComponent {
Philipp Schrader93ade042022-03-05 17:16:10 -080021 section: Section = 'Team Selection';
22 matchNumber: number = 1
23 teamNumber: number = 1
Philipp Schrader80587432022-03-05 15:41:22 -080024 autoUpperShotsMade: number = 0;
25 autoLowerShotsMade: number = 0;
26 autoShotsMissed: number = 0;
27 teleUpperShotsMade: number = 0;
28 teleLowerShotsMade: number = 0;
29 teleShotsMissed: number = 0;
Alex Perrybb3d2062022-03-05 18:14:33 -080030 defensePlayedOnScore: number = 3;
31 defensePlayedScore: number = 3;
Philipp Schrader80587432022-03-05 15:41:22 -080032 level: Level;
33 proper: boolean = false;
34 climbed: boolean = false;
Philipp Schrader8b8ed672022-03-05 18:08:50 -080035 errorMessage: string = '';
Philipp Schrader80587432022-03-05 15:41:22 -080036
37 toggleProper() {
38 this.proper = !this.proper;
39 }
40
Milo Linefef48f2022-03-12 15:18:56 -080041 setFailed() {
42 this.level = 'Failed';
43 }
44
Philipp Schrader80587432022-03-05 15:41:22 -080045 setLow() {
46 this.level = 'Low';
47 }
48
49 setMedium() {
50 this.level = 'Medium';
51 }
52
53 setHigh() {
54 this.level = 'High';
55 }
56
57 setTransversal() {
58 this.level = 'Transversal';
59 }
60
61 defensePlayedOnSlider(event) {
62 this.defensePlayedOnScore = event.target.value;
63 }
64
65 defensePlayedSlider(event) {
66 this.defensePlayedScore = event.target.value;
67 }
68
69 setClimbedTrue() {
70 this.climbed = true;
71 }
72
73 setClimbedFalse() {
74 this.climbed = false;
75 }
76
77 nextSection() {
Philipp Schrader93ade042022-03-05 17:16:10 -080078 if (this.section === 'Team Selection') {
79 this.section = 'Auto';
80 } else if (this.section === 'Auto') {
Philipp Schrader80587432022-03-05 15:41:22 -080081 this.section = 'TeleOp';
82 } else if (this.section === 'TeleOp') {
83 this.section = 'Climb';
84 } else if (this.section === 'Climb') {
85 this.section = 'Defense';
86 } else if (this.section === 'Defense') {
87 this.section = 'Review and Submit';
88 } else if (this.section === 'Review and Submit') {
Philipp Schrader8b8ed672022-03-05 18:08:50 -080089 this.submitDataScouting();
Philipp Schrader80587432022-03-05 15:41:22 -080090 }
91 }
92
Alex Perrybb3d2062022-03-05 18:14:33 -080093 prevSection() {
Philipp Schrader93ade042022-03-05 17:16:10 -080094 if (this.section === 'Auto') {
95 this.section = 'Team Selection';
96 } else if (this.section === 'TeleOp') {
Alex Perrybb3d2062022-03-05 18:14:33 -080097 this.section = 'Auto';
98 } else if (this.section === 'Climb') {
99 this.section = 'TeleOp';
100 } else if (this.section === 'Defense') {
101 this.section = 'Climb';
102 } else if (this.section === 'Review and Submit') {
103 this.section = 'Defense';
104 }
105 }
106
Philipp Schrader8b8ed672022-03-05 18:08:50 -0800107 async submitDataScouting() {
108 const builder = new flatbuffer_builder.Builder() as unknown as flatbuffers.Builder;
109 SubmitDataScouting.startSubmitDataScouting(builder);
110 SubmitDataScouting.addTeam(builder, this.teamNumber);
111 SubmitDataScouting.addMatch(builder, this.matchNumber);
112 SubmitDataScouting.addMissedShotsAuto(builder, this.autoShotsMissed);
113 SubmitDataScouting.addUpperGoalAuto(builder, this.autoUpperShotsMade);
114 SubmitDataScouting.addLowerGoalAuto(builder, this.autoLowerShotsMade);
115 SubmitDataScouting.addMissedShotsTele(builder, this.teleShotsMissed);
116 SubmitDataScouting.addUpperGoalTele(builder, this.teleUpperShotsMade);
117 SubmitDataScouting.addLowerGoalTele(builder, this.teleLowerShotsMade);
118 SubmitDataScouting.addDefenseRating(builder, this.defensePlayedScore);
119 // TODO(phil): Add support for defensePlayedOnScore.
120 // TODO(phil): Fix the Climbing score.
121 SubmitDataScouting.addClimbing(builder, 1);
122 builder.finish(SubmitDataScouting.endSubmitDataScouting(builder));
123
124 const buffer = builder.asUint8Array();
125 const res = await fetch(
126 '/requests/submit/data_scouting', {method: 'POST', body: buffer});
127
128 if (res.ok) {
129 // We successfully submitted the data. Go back to Home.
130 this.section = 'Home';
131 } else {
132 const resBuffer = await res.arrayBuffer();
133 const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
134 const parsedResponse = ErrorResponse.getRootAsErrorResponse(
135 fbBuffer as unknown as flatbuffers.ByteBuffer);
136
137 const errorMessage = parsedResponse.errorMessage();
138 this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
139 }
140 }
Philipp Schrader80587432022-03-05 15:41:22 -0800141}