diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..9e41502 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,57 @@ +version: 2 +jobs: + app: + docker: + - image: circleci/golang:1.14 + + working_directory: /go/src/github.com/RoboCup-SSL/ssl-simulation-controller + steps: + - checkout + - run: go get -v -t -d ./... + - run: go test -v ./... + - run: + working_directory: cmd/ssl-simulation-controller + command: | + GOOS=linux GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_linux_amd64 + GOOS=darwin GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_darwin_amd64 + GOOS=windows GOARCH=amd64 go build -o ../../release/ssl-simulation-controller_windows_amd64.exe + - persist_to_workspace: + root: . + paths: + - release/* + + publish-github-release: + docker: + - image: circleci/golang:1.14 + steps: + - attach_workspace: + at: . + - run: + name: "Prepare artifacts" + working_directory: release + command: | + mv ssl-simulation-controller_linux_amd64 ssl-simulation-controller_${CIRCLE_TAG}_linux_amd64 + mv ssl-simulation-controller_darwin_amd64 ssl-simulation-controller_${CIRCLE_TAG}_darwin_amd64 + mv ssl-simulation-controller_windows_amd64.exe ssl-simulation-controller_${CIRCLE_TAG}_windows_amd64.exe + - run: + name: "Publish Release on GitHub" + command: | + go get github.com/tcnksm/ghr + ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${CIRCLE_TAG} ./release/ + +workflows: + version: 2 + main: + jobs: + - app: + filters: + tags: + only: /.*/ + - publish-github-release: + requires: + - app + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f54e4e4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +/.git +/Dockerfile +/.idea +/.vscode \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57e6d71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..89214a7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.14-alpine AS build +WORKDIR /go/src/github.com/RoboCup-SSL/ssl-simulation-controller +COPY go.mod go.mod +RUN go mod download +COPY cmd cmd +COPY internal internal +RUN go install ./... + +# Start fresh from a smaller image +FROM alpine:3.9 +COPY --from=build /go/bin/ssl-simulation-controller /app/ssl-simulation-controller +ENTRYPOINT ["/app/ssl-simulation-controller"] +CMD [] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbbe90d --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +[![CircleCI](https://circleci.com/gh/RoboCup-SSL/ssl-simulation-controller/tree/master.svg?style=svg)](https://circleci.com/gh/RoboCup-SSL/ssl-simulation-controller/tree/master) +[![Go Report Card](https://goreportcard.com/badge/github.com/RoboCup-SSL/ssl-simulation-controller?style=flat-square)](https://goreportcard.com/report/github.com/RoboCup-SSL/ssl-simulation-controller) +[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/RoboCup-SSL/ssl-simulation-controller/pkg/vision) +[![Release](https://img.shields.io/github/release/RoboCup-SSL/ssl-simulation-controller.svg?style=flat-square)](https://github.com/RoboCup-SSL/ssl-simulation-controller/releases/latest) + +# ssl-simulation-controller + +A controller for SSL simulation tournaments, that: + * places the ball automatically, if it can not be placed by the teams + * TODO: Adds and removes robots, if the robot count does not fit + * During gameplay, if the [conditions](https://robocup-ssl.github.io/ssl-rules/sslrules.html#_robot_substitution) are met + * During stop by selecting robots nearest to either crossing of half-way line and touch line) + * TODO: Set robot limits based on some configuration + +## Usage +If you just want to use this app, simply download the latest [release binary](https://github.com/RoboCup-SSL/ssl-simulation-controller/releases/latest). +The binary is self-contained. No dependencies are required. + +You can also use pre-build docker images: +```shell script +docker pull robocupssl/ssl-simulation-controller +docker run --network host robocupssl/ssl-simulation-controller +``` + +## Development + +### Requirements +You need to install following dependencies first: + * Go >= 1.14 + +### Prepare +Download and install to [GOPATH](https://github.com/golang/go/wiki/GOPATH): +```bash +go get -u github.com/RoboCup-SSL/ssl-simulation-controller/... +``` +Switch to project root directory +```bash +cd $GOPATH/src/github.com/RoboCup-SSL/ssl-simulation-controller/ +``` + +### Run +Run the backend: +```bash +go run cmd/ssl-simulation-controller/main.go +``` diff --git a/cmd/ssl-simulation-controller/main.go b/cmd/ssl-simulation-controller/main.go new file mode 100644 index 0000000..42f1668 --- /dev/null +++ b/cmd/ssl-simulation-controller/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "flag" + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl" + "os" + "os/signal" + "syscall" +) + +var visionAddress = flag.String("visionAddress", "224.5.23.2:10006", "The address (ip+port) from which vision packages are received") +var trackerAddress = flag.String("trackerAddress", "224.5.23.2:10010", "The address (ip+port) from which tracker packages are received") +var refereeAddress = flag.String("refereeAddress", "224.5.23.1:10003", "The address (ip+port) from which referee packages are received") +var simControlPort = flag.String("simControlPort", "10300", "The port to which simulation control packets are send") + +func main() { + flag.Parse() + ctl := simctl.NewSimulationController(*visionAddress, *refereeAddress, *trackerAddress, *simControlPort) + ctl.Start() + + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) + <-signals + ctl.Stop() +} diff --git a/generateProto.sh b/generateProto.sh new file mode 100755 index 0000000..e8e1999 --- /dev/null +++ b/generateProto.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Fail on errors +set -e +# Print commands +set -x + +# common GC +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_common.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_geometry.proto + +# vision +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_detection.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_geometry.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_wrapper.proto + +# tracked vision +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_detection_tracked.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_vision_wrapper_tracked.proto + +# game events +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_game_event.proto + +# referee message +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_gc_referee_message.proto + +# simulation control +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_error.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_config.proto +protoc -I"./proto" -I"$GOPATH/src" --go_out="$GOPATH/src" proto/ssl_simulation_control.proto diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ed15868 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/RoboCup-SSL/ssl-simulation-controller + +go 1.15 + +require ( + github.com/golang/protobuf v1.4.3 + google.golang.org/protobuf v1.25.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2384568 --- /dev/null +++ b/go.sum @@ -0,0 +1,67 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/geom/geometry.go b/internal/geom/geometry.go new file mode 100644 index 0000000..5335c33 --- /dev/null +++ b/internal/geom/geometry.go @@ -0,0 +1,61 @@ +package geom + +import ( + "fmt" + "math" +) + +// NewVector2 creates a new Vector2 from float64 values +func NewVector2(x, y float64) *Vector2 { + return NewVector2Float32(float32(x), float32(y)) +} + +// NewVector2Float32 creates a new Vector2 from float32 values +func NewVector2Float32(x, y float32) *Vector2 { + return &Vector2{X: &x, Y: &y} +} + +// Length returns the length of this vector +func (m *Vector2) Length() float64 { + x := *m.X + y := *m.Y + return math.Sqrt(float64(x*x + y*y)) +} + +// Sub subtracts the given vector from this one +func (m *Vector2) Sub(o *Vector2) *Vector2 { + return NewVector2Float32(*m.X-*o.X, *m.Y-*o.Y) +} + +// DistanceTo returns the distance between this vector and the given one +func (m *Vector2) DistanceTo(o *Vector2) float64 { + return m.Sub(o).Length() +} + +// X64 returns the x value as float64 +func (m *Vector2) X64() float64 { + return float64(*m.X) +} + +// Y64 returns the y value as float64 +func (m *Vector2) Y64() float64 { + return float64(*m.Y) +} + +// ToVector2 converts this vector into a new 2d vector, dropping the z part +func (m *Vector3) ToVector2() *Vector2 { + return NewVector2Float32(*m.X, *m.Y) +} + +// StringPretty converts the vector into a pretty printed string +func (m *Vector2) StringPretty() string { + x := float32(0) + y := float32(0) + if m.X != nil { + x = *m.X + } + if m.Y != nil { + y = *m.Y + } + return fmt.Sprintf("x: %v, y: %v", x, y) +} diff --git a/internal/geom/ssl_gc_geometry.pb.go b/internal/geom/ssl_gc_geometry.pb.go new file mode 100644 index 0000000..b25e3ae --- /dev/null +++ b/internal/geom/ssl_gc_geometry.pb.go @@ -0,0 +1,239 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_gc_geometry.proto + +package geom + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// A vector with two dimensions +type Vector2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"` +} + +func (x *Vector2) Reset() { + *x = Vector2{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_geometry_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Vector2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector2) ProtoMessage() {} + +func (x *Vector2) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_geometry_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector2.ProtoReflect.Descriptor instead. +func (*Vector2) Descriptor() ([]byte, []int) { + return file_ssl_gc_geometry_proto_rawDescGZIP(), []int{0} +} + +func (x *Vector2) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *Vector2) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +// A vector with three dimensions +type Vector3 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"` + Z *float32 `protobuf:"fixed32,3,req,name=z" json:"z,omitempty"` +} + +func (x *Vector3) Reset() { + *x = Vector3{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_geometry_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Vector3) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector3) ProtoMessage() {} + +func (x *Vector3) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_geometry_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector3.ProtoReflect.Descriptor instead. +func (*Vector3) Descriptor() ([]byte, []int) { + return file_ssl_gc_geometry_proto_rawDescGZIP(), []int{1} +} + +func (x *Vector3) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *Vector3) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +func (x *Vector3) GetZ() float32 { + if x != nil && x.Z != nil { + return *x.Z + } + return 0 +} + +var File_ssl_gc_geometry_proto protoreflect.FileDescriptor + +var file_ssl_gc_geometry_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x25, 0x0a, 0x07, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x32, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x78, + 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79, 0x22, 0x33, + 0x0a, 0x07, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, + 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, + 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, + 0x52, 0x01, 0x7a, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, + 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2f, 0x67, 0x65, 0x6f, 0x6d, +} + +var ( + file_ssl_gc_geometry_proto_rawDescOnce sync.Once + file_ssl_gc_geometry_proto_rawDescData = file_ssl_gc_geometry_proto_rawDesc +) + +func file_ssl_gc_geometry_proto_rawDescGZIP() []byte { + file_ssl_gc_geometry_proto_rawDescOnce.Do(func() { + file_ssl_gc_geometry_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_geometry_proto_rawDescData) + }) + return file_ssl_gc_geometry_proto_rawDescData +} + +var file_ssl_gc_geometry_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_ssl_gc_geometry_proto_goTypes = []interface{}{ + (*Vector2)(nil), // 0: Vector2 + (*Vector3)(nil), // 1: Vector3 +} +var file_ssl_gc_geometry_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_ssl_gc_geometry_proto_init() } +func file_ssl_gc_geometry_proto_init() { + if File_ssl_gc_geometry_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_gc_geometry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_geometry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector3); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_gc_geometry_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_gc_geometry_proto_goTypes, + DependencyIndexes: file_ssl_gc_geometry_proto_depIdxs, + MessageInfos: file_ssl_gc_geometry_proto_msgTypes, + }.Build() + File_ssl_gc_geometry_proto = out.File + file_ssl_gc_geometry_proto_rawDesc = nil + file_ssl_gc_geometry_proto_goTypes = nil + file_ssl_gc_geometry_proto_depIdxs = nil +} diff --git a/internal/referee/ssl_gc_common.pb.go b/internal/referee/ssl_gc_common.pb.go new file mode 100644 index 0000000..430d240 --- /dev/null +++ b/internal/referee/ssl_gc_common.pb.go @@ -0,0 +1,295 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_gc_common.proto + +package referee + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Team is either blue or yellow +type Team int32 + +const ( + // team not set + Team_UNKNOWN Team = 0 + // yellow team + Team_YELLOW Team = 1 + // blue team + Team_BLUE Team = 2 +) + +// Enum value maps for Team. +var ( + Team_name = map[int32]string{ + 0: "UNKNOWN", + 1: "YELLOW", + 2: "BLUE", + } + Team_value = map[string]int32{ + "UNKNOWN": 0, + "YELLOW": 1, + "BLUE": 2, + } +) + +func (x Team) Enum() *Team { + p := new(Team) + *p = x + return p +} + +func (x Team) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Team) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_gc_common_proto_enumTypes[0].Descriptor() +} + +func (Team) Type() protoreflect.EnumType { + return &file_ssl_gc_common_proto_enumTypes[0] +} + +func (x Team) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Team) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Team(num) + return nil +} + +// Deprecated: Use Team.Descriptor instead. +func (Team) EnumDescriptor() ([]byte, []int) { + return file_ssl_gc_common_proto_rawDescGZIP(), []int{0} +} + +// Division denotes the current division, which influences some rules +type Division int32 + +const ( + Division_DIV_UNKNOWN Division = 0 + Division_DIV_A Division = 1 + Division_DIV_B Division = 2 +) + +// Enum value maps for Division. +var ( + Division_name = map[int32]string{ + 0: "DIV_UNKNOWN", + 1: "DIV_A", + 2: "DIV_B", + } + Division_value = map[string]int32{ + "DIV_UNKNOWN": 0, + "DIV_A": 1, + "DIV_B": 2, + } +) + +func (x Division) Enum() *Division { + p := new(Division) + *p = x + return p +} + +func (x Division) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Division) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_gc_common_proto_enumTypes[1].Descriptor() +} + +func (Division) Type() protoreflect.EnumType { + return &file_ssl_gc_common_proto_enumTypes[1] +} + +func (x Division) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Division) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Division(num) + return nil +} + +// Deprecated: Use Division.Descriptor instead. +func (Division) EnumDescriptor() ([]byte, []int) { + return file_ssl_gc_common_proto_rawDescGZIP(), []int{1} +} + +// RobotId is the combination of a team and a robot id +type RobotId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the robot number + Id *uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` + // the team that the robot belongs to + Team *Team `protobuf:"varint,2,opt,name=team,enum=Team" json:"team,omitempty"` +} + +func (x *RobotId) Reset() { + *x = RobotId{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RobotId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RobotId) ProtoMessage() {} + +func (x *RobotId) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_common_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RobotId.ProtoReflect.Descriptor instead. +func (*RobotId) Descriptor() ([]byte, []int) { + return file_ssl_gc_common_proto_rawDescGZIP(), []int{0} +} + +func (x *RobotId) GetId() uint32 { + if x != nil && x.Id != nil { + return *x.Id + } + return 0 +} + +func (x *RobotId) GetTeam() Team { + if x != nil && x.Team != nil { + return *x.Team + } + return Team_UNKNOWN +} + +var File_ssl_gc_common_proto protoreflect.FileDescriptor + +var file_ssl_gc_common_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x34, 0x0a, 0x07, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x19, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x2a, 0x29, 0x0a, 0x04, 0x54, + 0x65, 0x61, 0x6d, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x42, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x2a, 0x31, 0x0a, 0x08, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x49, 0x56, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x49, 0x56, 0x5f, 0x41, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x44, 0x49, 0x56, 0x5f, 0x42, 0x10, 0x02, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, + 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, +} + +var ( + file_ssl_gc_common_proto_rawDescOnce sync.Once + file_ssl_gc_common_proto_rawDescData = file_ssl_gc_common_proto_rawDesc +) + +func file_ssl_gc_common_proto_rawDescGZIP() []byte { + file_ssl_gc_common_proto_rawDescOnce.Do(func() { + file_ssl_gc_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_common_proto_rawDescData) + }) + return file_ssl_gc_common_proto_rawDescData +} + +var file_ssl_gc_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_ssl_gc_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_ssl_gc_common_proto_goTypes = []interface{}{ + (Team)(0), // 0: Team + (Division)(0), // 1: Division + (*RobotId)(nil), // 2: RobotId +} +var file_ssl_gc_common_proto_depIdxs = []int32{ + 0, // 0: RobotId.team:type_name -> Team + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_ssl_gc_common_proto_init() } +func file_ssl_gc_common_proto_init() { + if File_ssl_gc_common_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_gc_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RobotId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_gc_common_proto_rawDesc, + NumEnums: 2, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_gc_common_proto_goTypes, + DependencyIndexes: file_ssl_gc_common_proto_depIdxs, + EnumInfos: file_ssl_gc_common_proto_enumTypes, + MessageInfos: file_ssl_gc_common_proto_msgTypes, + }.Build() + File_ssl_gc_common_proto = out.File + file_ssl_gc_common_proto_rawDesc = nil + file_ssl_gc_common_proto_goTypes = nil + file_ssl_gc_common_proto_depIdxs = nil +} diff --git a/internal/referee/ssl_gc_game_event.pb.go b/internal/referee/ssl_gc_game_event.pb.go new file mode 100644 index 0000000..4232199 --- /dev/null +++ b/internal/referee/ssl_gc_game_event.pb.go @@ -0,0 +1,5014 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_gc_game_event.proto + +package referee + +import ( + geom "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type GameEvent_Type int32 + +const ( + GameEvent_UNKNOWN_GAME_EVENT_TYPE GameEvent_Type = 0 + GameEvent_BALL_LEFT_FIELD_TOUCH_LINE GameEvent_Type = 6 // triggered by autoRef + GameEvent_BALL_LEFT_FIELD_GOAL_LINE GameEvent_Type = 7 // triggered by autoRef + GameEvent_AIMLESS_KICK GameEvent_Type = 11 // triggered by autoRef + GameEvent_ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA GameEvent_Type = 19 // triggered by autoRef + GameEvent_DEFENDER_IN_DEFENSE_AREA GameEvent_Type = 31 // triggered by autoRef + GameEvent_BOUNDARY_CROSSING GameEvent_Type = 41 // triggered by autoRef + GameEvent_KEEPER_HELD_BALL GameEvent_Type = 13 // triggered by GC + GameEvent_BOT_DRIBBLED_BALL_TOO_FAR GameEvent_Type = 17 // triggered by autoRef + GameEvent_BOT_PUSHED_BOT GameEvent_Type = 24 // triggered by human ref + GameEvent_BOT_HELD_BALL_DELIBERATELY GameEvent_Type = 26 // triggered by human ref + GameEvent_BOT_TIPPED_OVER GameEvent_Type = 27 // triggered by human ref + GameEvent_ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA GameEvent_Type = 15 // triggered by autoRef + GameEvent_BOT_KICKED_BALL_TOO_FAST GameEvent_Type = 18 // triggered by autoRef + GameEvent_BOT_CRASH_UNIQUE GameEvent_Type = 22 // triggered by autoRef + GameEvent_BOT_CRASH_DRAWN GameEvent_Type = 21 // triggered by autoRef + GameEvent_DEFENDER_TOO_CLOSE_TO_KICK_POINT GameEvent_Type = 29 // triggered by autoRef + GameEvent_BOT_TOO_FAST_IN_STOP GameEvent_Type = 28 // triggered by autoRef + GameEvent_BOT_INTERFERED_PLACEMENT GameEvent_Type = 20 // triggered by autoRef + GameEvent_POSSIBLE_GOAL GameEvent_Type = 39 // triggered by autoRef + GameEvent_GOAL GameEvent_Type = 8 // triggered by GC + GameEvent_INVALID_GOAL GameEvent_Type = 42 // triggered by GC + GameEvent_ATTACKER_DOUBLE_TOUCHED_BALL GameEvent_Type = 14 // triggered by autoRef + GameEvent_PLACEMENT_SUCCEEDED GameEvent_Type = 5 // triggered by autoRef + GameEvent_PENALTY_KICK_FAILED GameEvent_Type = 43 // triggered by GC and autoRef + GameEvent_NO_PROGRESS_IN_GAME GameEvent_Type = 2 // triggered by GC + GameEvent_PLACEMENT_FAILED GameEvent_Type = 3 // triggered by GC + GameEvent_MULTIPLE_CARDS GameEvent_Type = 32 // triggered by GC + GameEvent_MULTIPLE_FOULS GameEvent_Type = 34 // triggered by GC + GameEvent_BOT_SUBSTITUTION GameEvent_Type = 37 // triggered by GC + GameEvent_TOO_MANY_ROBOTS GameEvent_Type = 38 // triggered by GC + GameEvent_CHALLENGE_FLAG GameEvent_Type = 44 // triggered by GC + GameEvent_EMERGENCY_STOP GameEvent_Type = 45 // triggered by GC + GameEvent_UNSPORTING_BEHAVIOR_MINOR GameEvent_Type = 35 // triggered by human ref + GameEvent_UNSPORTING_BEHAVIOR_MAJOR GameEvent_Type = 36 // triggered by human ref + // Deprecated: Do not use. + GameEvent_PREPARED GameEvent_Type = 1 + // Deprecated: Do not use. + GameEvent_INDIRECT_GOAL GameEvent_Type = 9 + // Deprecated: Do not use. + GameEvent_CHIPPED_GOAL GameEvent_Type = 10 + // Deprecated: Do not use. + GameEvent_KICK_TIMEOUT GameEvent_Type = 12 + // Deprecated: Do not use. + GameEvent_ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA GameEvent_Type = 16 + // Deprecated: Do not use. + GameEvent_ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED GameEvent_Type = 40 + // Deprecated: Do not use. + GameEvent_BOT_CRASH_UNIQUE_SKIPPED GameEvent_Type = 23 + // Deprecated: Do not use. + GameEvent_BOT_PUSHED_BOT_SKIPPED GameEvent_Type = 25 + // Deprecated: Do not use. + GameEvent_DEFENDER_IN_DEFENSE_AREA_PARTIALLY GameEvent_Type = 30 + // Deprecated: Do not use. + GameEvent_MULTIPLE_PLACEMENT_FAILURES GameEvent_Type = 33 +) + +// Enum value maps for GameEvent_Type. +var ( + GameEvent_Type_name = map[int32]string{ + 0: "UNKNOWN_GAME_EVENT_TYPE", + 6: "BALL_LEFT_FIELD_TOUCH_LINE", + 7: "BALL_LEFT_FIELD_GOAL_LINE", + 11: "AIMLESS_KICK", + 19: "ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA", + 31: "DEFENDER_IN_DEFENSE_AREA", + 41: "BOUNDARY_CROSSING", + 13: "KEEPER_HELD_BALL", + 17: "BOT_DRIBBLED_BALL_TOO_FAR", + 24: "BOT_PUSHED_BOT", + 26: "BOT_HELD_BALL_DELIBERATELY", + 27: "BOT_TIPPED_OVER", + 15: "ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA", + 18: "BOT_KICKED_BALL_TOO_FAST", + 22: "BOT_CRASH_UNIQUE", + 21: "BOT_CRASH_DRAWN", + 29: "DEFENDER_TOO_CLOSE_TO_KICK_POINT", + 28: "BOT_TOO_FAST_IN_STOP", + 20: "BOT_INTERFERED_PLACEMENT", + 39: "POSSIBLE_GOAL", + 8: "GOAL", + 42: "INVALID_GOAL", + 14: "ATTACKER_DOUBLE_TOUCHED_BALL", + 5: "PLACEMENT_SUCCEEDED", + 43: "PENALTY_KICK_FAILED", + 2: "NO_PROGRESS_IN_GAME", + 3: "PLACEMENT_FAILED", + 32: "MULTIPLE_CARDS", + 34: "MULTIPLE_FOULS", + 37: "BOT_SUBSTITUTION", + 38: "TOO_MANY_ROBOTS", + 44: "CHALLENGE_FLAG", + 45: "EMERGENCY_STOP", + 35: "UNSPORTING_BEHAVIOR_MINOR", + 36: "UNSPORTING_BEHAVIOR_MAJOR", + 1: "PREPARED", + 9: "INDIRECT_GOAL", + 10: "CHIPPED_GOAL", + 12: "KICK_TIMEOUT", + 16: "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA", + 40: "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED", + 23: "BOT_CRASH_UNIQUE_SKIPPED", + 25: "BOT_PUSHED_BOT_SKIPPED", + 30: "DEFENDER_IN_DEFENSE_AREA_PARTIALLY", + 33: "MULTIPLE_PLACEMENT_FAILURES", + } + GameEvent_Type_value = map[string]int32{ + "UNKNOWN_GAME_EVENT_TYPE": 0, + "BALL_LEFT_FIELD_TOUCH_LINE": 6, + "BALL_LEFT_FIELD_GOAL_LINE": 7, + "AIMLESS_KICK": 11, + "ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA": 19, + "DEFENDER_IN_DEFENSE_AREA": 31, + "BOUNDARY_CROSSING": 41, + "KEEPER_HELD_BALL": 13, + "BOT_DRIBBLED_BALL_TOO_FAR": 17, + "BOT_PUSHED_BOT": 24, + "BOT_HELD_BALL_DELIBERATELY": 26, + "BOT_TIPPED_OVER": 27, + "ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA": 15, + "BOT_KICKED_BALL_TOO_FAST": 18, + "BOT_CRASH_UNIQUE": 22, + "BOT_CRASH_DRAWN": 21, + "DEFENDER_TOO_CLOSE_TO_KICK_POINT": 29, + "BOT_TOO_FAST_IN_STOP": 28, + "BOT_INTERFERED_PLACEMENT": 20, + "POSSIBLE_GOAL": 39, + "GOAL": 8, + "INVALID_GOAL": 42, + "ATTACKER_DOUBLE_TOUCHED_BALL": 14, + "PLACEMENT_SUCCEEDED": 5, + "PENALTY_KICK_FAILED": 43, + "NO_PROGRESS_IN_GAME": 2, + "PLACEMENT_FAILED": 3, + "MULTIPLE_CARDS": 32, + "MULTIPLE_FOULS": 34, + "BOT_SUBSTITUTION": 37, + "TOO_MANY_ROBOTS": 38, + "CHALLENGE_FLAG": 44, + "EMERGENCY_STOP": 45, + "UNSPORTING_BEHAVIOR_MINOR": 35, + "UNSPORTING_BEHAVIOR_MAJOR": 36, + "PREPARED": 1, + "INDIRECT_GOAL": 9, + "CHIPPED_GOAL": 10, + "KICK_TIMEOUT": 12, + "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA": 16, + "ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED": 40, + "BOT_CRASH_UNIQUE_SKIPPED": 23, + "BOT_PUSHED_BOT_SKIPPED": 25, + "DEFENDER_IN_DEFENSE_AREA_PARTIALLY": 30, + "MULTIPLE_PLACEMENT_FAILURES": 33, + } +) + +func (x GameEvent_Type) Enum() *GameEvent_Type { + p := new(GameEvent_Type) + *p = x + return p +} + +func (x GameEvent_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GameEvent_Type) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_gc_game_event_proto_enumTypes[0].Descriptor() +} + +func (GameEvent_Type) Type() protoreflect.EnumType { + return &file_ssl_gc_game_event_proto_enumTypes[0] +} + +func (x GameEvent_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GameEvent_Type) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GameEvent_Type(num) + return nil +} + +// Deprecated: Use GameEvent_Type.Descriptor instead. +func (GameEvent_Type) EnumDescriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 0} +} + +// GameEvent contains exactly one game event +// Each game event has optional and required fields. The required fields are mandatory to process the event. +// Some optional fields are only used for visualization, others are required to determine the ball placement position. +// If fields are missing that are required for the ball placement position, no ball placement command will be issued. +// Fields are marked optional to make testing and extending of the protocol easier. +// An autoRef should ideally set all fields, except if there are good reasons to not do so. +type GameEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *GameEvent_Type `protobuf:"varint,40,opt,name=type,enum=GameEvent_Type" json:"type,omitempty"` + // The origins of this game event. + // Empty, if it originates from game controller. + // Contains autoRef name(s), if it originates from one or more autoRefs. + // Ignored if sent by autoRef to game controller. + Origin []string `protobuf:"bytes,41,rep,name=origin" json:"origin,omitempty"` + // the event that occurred + // + // Types that are assignable to Event: + // *GameEvent_BallLeftFieldTouchLine + // *GameEvent_BallLeftFieldGoalLine + // *GameEvent_AimlessKick_ + // *GameEvent_AttackerTooCloseToDefenseArea_ + // *GameEvent_DefenderInDefenseArea_ + // *GameEvent_BoundaryCrossing_ + // *GameEvent_KeeperHeldBall_ + // *GameEvent_BotDribbledBallTooFar_ + // *GameEvent_BotPushedBot_ + // *GameEvent_BotHeldBallDeliberately_ + // *GameEvent_BotTippedOver_ + // *GameEvent_AttackerTouchedBallInDefenseArea_ + // *GameEvent_BotKickedBallTooFast_ + // *GameEvent_BotCrashUnique_ + // *GameEvent_BotCrashDrawn_ + // *GameEvent_DefenderTooCloseToKickPoint_ + // *GameEvent_BotTooFastInStop_ + // *GameEvent_BotInterferedPlacement_ + // *GameEvent_PossibleGoal + // *GameEvent_Goal_ + // *GameEvent_InvalidGoal + // *GameEvent_AttackerDoubleTouchedBall_ + // *GameEvent_PlacementSucceeded_ + // *GameEvent_PenaltyKickFailed_ + // *GameEvent_NoProgressInGame_ + // *GameEvent_PlacementFailed_ + // *GameEvent_MultipleCards_ + // *GameEvent_MultipleFouls_ + // *GameEvent_BotSubstitution_ + // *GameEvent_TooManyRobots_ + // *GameEvent_ChallengeFlag_ + // *GameEvent_EmergencyStop_ + // *GameEvent_UnsportingBehaviorMinor_ + // *GameEvent_UnsportingBehaviorMajor_ + // *GameEvent_Prepared_ + // *GameEvent_IndirectGoal_ + // *GameEvent_ChippedGoal_ + // *GameEvent_KickTimeout_ + // *GameEvent_AttackerTouchedOpponentInDefenseArea_ + // *GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped + // *GameEvent_BotCrashUniqueSkipped + // *GameEvent_BotPushedBotSkipped + // *GameEvent_DefenderInDefenseAreaPartially_ + // *GameEvent_MultiplePlacementFailures_ + Event isGameEvent_Event `protobuf_oneof:"event"` +} + +func (x *GameEvent) Reset() { + *x = GameEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent) ProtoMessage() {} + +func (x *GameEvent) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent.ProtoReflect.Descriptor instead. +func (*GameEvent) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0} +} + +func (x *GameEvent) GetType() GameEvent_Type { + if x != nil && x.Type != nil { + return *x.Type + } + return GameEvent_UNKNOWN_GAME_EVENT_TYPE +} + +func (x *GameEvent) GetOrigin() []string { + if x != nil { + return x.Origin + } + return nil +} + +func (m *GameEvent) GetEvent() isGameEvent_Event { + if m != nil { + return m.Event + } + return nil +} + +func (x *GameEvent) GetBallLeftFieldTouchLine() *GameEvent_BallLeftField { + if x, ok := x.GetEvent().(*GameEvent_BallLeftFieldTouchLine); ok { + return x.BallLeftFieldTouchLine + } + return nil +} + +func (x *GameEvent) GetBallLeftFieldGoalLine() *GameEvent_BallLeftField { + if x, ok := x.GetEvent().(*GameEvent_BallLeftFieldGoalLine); ok { + return x.BallLeftFieldGoalLine + } + return nil +} + +func (x *GameEvent) GetAimlessKick() *GameEvent_AimlessKick { + if x, ok := x.GetEvent().(*GameEvent_AimlessKick_); ok { + return x.AimlessKick + } + return nil +} + +func (x *GameEvent) GetAttackerTooCloseToDefenseArea() *GameEvent_AttackerTooCloseToDefenseArea { + if x, ok := x.GetEvent().(*GameEvent_AttackerTooCloseToDefenseArea_); ok { + return x.AttackerTooCloseToDefenseArea + } + return nil +} + +func (x *GameEvent) GetDefenderInDefenseArea() *GameEvent_DefenderInDefenseArea { + if x, ok := x.GetEvent().(*GameEvent_DefenderInDefenseArea_); ok { + return x.DefenderInDefenseArea + } + return nil +} + +func (x *GameEvent) GetBoundaryCrossing() *GameEvent_BoundaryCrossing { + if x, ok := x.GetEvent().(*GameEvent_BoundaryCrossing_); ok { + return x.BoundaryCrossing + } + return nil +} + +func (x *GameEvent) GetKeeperHeldBall() *GameEvent_KeeperHeldBall { + if x, ok := x.GetEvent().(*GameEvent_KeeperHeldBall_); ok { + return x.KeeperHeldBall + } + return nil +} + +func (x *GameEvent) GetBotDribbledBallTooFar() *GameEvent_BotDribbledBallTooFar { + if x, ok := x.GetEvent().(*GameEvent_BotDribbledBallTooFar_); ok { + return x.BotDribbledBallTooFar + } + return nil +} + +func (x *GameEvent) GetBotPushedBot() *GameEvent_BotPushedBot { + if x, ok := x.GetEvent().(*GameEvent_BotPushedBot_); ok { + return x.BotPushedBot + } + return nil +} + +func (x *GameEvent) GetBotHeldBallDeliberately() *GameEvent_BotHeldBallDeliberately { + if x, ok := x.GetEvent().(*GameEvent_BotHeldBallDeliberately_); ok { + return x.BotHeldBallDeliberately + } + return nil +} + +func (x *GameEvent) GetBotTippedOver() *GameEvent_BotTippedOver { + if x, ok := x.GetEvent().(*GameEvent_BotTippedOver_); ok { + return x.BotTippedOver + } + return nil +} + +func (x *GameEvent) GetAttackerTouchedBallInDefenseArea() *GameEvent_AttackerTouchedBallInDefenseArea { + if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedBallInDefenseArea_); ok { + return x.AttackerTouchedBallInDefenseArea + } + return nil +} + +func (x *GameEvent) GetBotKickedBallTooFast() *GameEvent_BotKickedBallTooFast { + if x, ok := x.GetEvent().(*GameEvent_BotKickedBallTooFast_); ok { + return x.BotKickedBallTooFast + } + return nil +} + +func (x *GameEvent) GetBotCrashUnique() *GameEvent_BotCrashUnique { + if x, ok := x.GetEvent().(*GameEvent_BotCrashUnique_); ok { + return x.BotCrashUnique + } + return nil +} + +func (x *GameEvent) GetBotCrashDrawn() *GameEvent_BotCrashDrawn { + if x, ok := x.GetEvent().(*GameEvent_BotCrashDrawn_); ok { + return x.BotCrashDrawn + } + return nil +} + +func (x *GameEvent) GetDefenderTooCloseToKickPoint() *GameEvent_DefenderTooCloseToKickPoint { + if x, ok := x.GetEvent().(*GameEvent_DefenderTooCloseToKickPoint_); ok { + return x.DefenderTooCloseToKickPoint + } + return nil +} + +func (x *GameEvent) GetBotTooFastInStop() *GameEvent_BotTooFastInStop { + if x, ok := x.GetEvent().(*GameEvent_BotTooFastInStop_); ok { + return x.BotTooFastInStop + } + return nil +} + +func (x *GameEvent) GetBotInterferedPlacement() *GameEvent_BotInterferedPlacement { + if x, ok := x.GetEvent().(*GameEvent_BotInterferedPlacement_); ok { + return x.BotInterferedPlacement + } + return nil +} + +func (x *GameEvent) GetPossibleGoal() *GameEvent_Goal { + if x, ok := x.GetEvent().(*GameEvent_PossibleGoal); ok { + return x.PossibleGoal + } + return nil +} + +func (x *GameEvent) GetGoal() *GameEvent_Goal { + if x, ok := x.GetEvent().(*GameEvent_Goal_); ok { + return x.Goal + } + return nil +} + +func (x *GameEvent) GetInvalidGoal() *GameEvent_Goal { + if x, ok := x.GetEvent().(*GameEvent_InvalidGoal); ok { + return x.InvalidGoal + } + return nil +} + +func (x *GameEvent) GetAttackerDoubleTouchedBall() *GameEvent_AttackerDoubleTouchedBall { + if x, ok := x.GetEvent().(*GameEvent_AttackerDoubleTouchedBall_); ok { + return x.AttackerDoubleTouchedBall + } + return nil +} + +func (x *GameEvent) GetPlacementSucceeded() *GameEvent_PlacementSucceeded { + if x, ok := x.GetEvent().(*GameEvent_PlacementSucceeded_); ok { + return x.PlacementSucceeded + } + return nil +} + +func (x *GameEvent) GetPenaltyKickFailed() *GameEvent_PenaltyKickFailed { + if x, ok := x.GetEvent().(*GameEvent_PenaltyKickFailed_); ok { + return x.PenaltyKickFailed + } + return nil +} + +func (x *GameEvent) GetNoProgressInGame() *GameEvent_NoProgressInGame { + if x, ok := x.GetEvent().(*GameEvent_NoProgressInGame_); ok { + return x.NoProgressInGame + } + return nil +} + +func (x *GameEvent) GetPlacementFailed() *GameEvent_PlacementFailed { + if x, ok := x.GetEvent().(*GameEvent_PlacementFailed_); ok { + return x.PlacementFailed + } + return nil +} + +func (x *GameEvent) GetMultipleCards() *GameEvent_MultipleCards { + if x, ok := x.GetEvent().(*GameEvent_MultipleCards_); ok { + return x.MultipleCards + } + return nil +} + +func (x *GameEvent) GetMultipleFouls() *GameEvent_MultipleFouls { + if x, ok := x.GetEvent().(*GameEvent_MultipleFouls_); ok { + return x.MultipleFouls + } + return nil +} + +func (x *GameEvent) GetBotSubstitution() *GameEvent_BotSubstitution { + if x, ok := x.GetEvent().(*GameEvent_BotSubstitution_); ok { + return x.BotSubstitution + } + return nil +} + +func (x *GameEvent) GetTooManyRobots() *GameEvent_TooManyRobots { + if x, ok := x.GetEvent().(*GameEvent_TooManyRobots_); ok { + return x.TooManyRobots + } + return nil +} + +func (x *GameEvent) GetChallengeFlag() *GameEvent_ChallengeFlag { + if x, ok := x.GetEvent().(*GameEvent_ChallengeFlag_); ok { + return x.ChallengeFlag + } + return nil +} + +func (x *GameEvent) GetEmergencyStop() *GameEvent_EmergencyStop { + if x, ok := x.GetEvent().(*GameEvent_EmergencyStop_); ok { + return x.EmergencyStop + } + return nil +} + +func (x *GameEvent) GetUnsportingBehaviorMinor() *GameEvent_UnsportingBehaviorMinor { + if x, ok := x.GetEvent().(*GameEvent_UnsportingBehaviorMinor_); ok { + return x.UnsportingBehaviorMinor + } + return nil +} + +func (x *GameEvent) GetUnsportingBehaviorMajor() *GameEvent_UnsportingBehaviorMajor { + if x, ok := x.GetEvent().(*GameEvent_UnsportingBehaviorMajor_); ok { + return x.UnsportingBehaviorMajor + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetPrepared() *GameEvent_Prepared { + if x, ok := x.GetEvent().(*GameEvent_Prepared_); ok { + return x.Prepared + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetIndirectGoal() *GameEvent_IndirectGoal { + if x, ok := x.GetEvent().(*GameEvent_IndirectGoal_); ok { + return x.IndirectGoal + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetChippedGoal() *GameEvent_ChippedGoal { + if x, ok := x.GetEvent().(*GameEvent_ChippedGoal_); ok { + return x.ChippedGoal + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetKickTimeout() *GameEvent_KickTimeout { + if x, ok := x.GetEvent().(*GameEvent_KickTimeout_); ok { + return x.KickTimeout + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetAttackerTouchedOpponentInDefenseArea() *GameEvent_AttackerTouchedOpponentInDefenseArea { + if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedOpponentInDefenseArea_); ok { + return x.AttackerTouchedOpponentInDefenseArea + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetAttackerTouchedOpponentInDefenseAreaSkipped() *GameEvent_AttackerTouchedOpponentInDefenseArea { + if x, ok := x.GetEvent().(*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped); ok { + return x.AttackerTouchedOpponentInDefenseAreaSkipped + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetBotCrashUniqueSkipped() *GameEvent_BotCrashUnique { + if x, ok := x.GetEvent().(*GameEvent_BotCrashUniqueSkipped); ok { + return x.BotCrashUniqueSkipped + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetBotPushedBotSkipped() *GameEvent_BotPushedBot { + if x, ok := x.GetEvent().(*GameEvent_BotPushedBotSkipped); ok { + return x.BotPushedBotSkipped + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetDefenderInDefenseAreaPartially() *GameEvent_DefenderInDefenseAreaPartially { + if x, ok := x.GetEvent().(*GameEvent_DefenderInDefenseAreaPartially_); ok { + return x.DefenderInDefenseAreaPartially + } + return nil +} + +// Deprecated: Do not use. +func (x *GameEvent) GetMultiplePlacementFailures() *GameEvent_MultiplePlacementFailures { + if x, ok := x.GetEvent().(*GameEvent_MultiplePlacementFailures_); ok { + return x.MultiplePlacementFailures + } + return nil +} + +type isGameEvent_Event interface { + isGameEvent_Event() +} + +type GameEvent_BallLeftFieldTouchLine struct { + BallLeftFieldTouchLine *GameEvent_BallLeftField `protobuf:"bytes,6,opt,name=ball_left_field_touch_line,json=ballLeftFieldTouchLine,oneof"` +} + +type GameEvent_BallLeftFieldGoalLine struct { + BallLeftFieldGoalLine *GameEvent_BallLeftField `protobuf:"bytes,7,opt,name=ball_left_field_goal_line,json=ballLeftFieldGoalLine,oneof"` +} + +type GameEvent_AimlessKick_ struct { + AimlessKick *GameEvent_AimlessKick `protobuf:"bytes,11,opt,name=aimless_kick,json=aimlessKick,oneof"` +} + +type GameEvent_AttackerTooCloseToDefenseArea_ struct { + AttackerTooCloseToDefenseArea *GameEvent_AttackerTooCloseToDefenseArea `protobuf:"bytes,19,opt,name=attacker_too_close_to_defense_area,json=attackerTooCloseToDefenseArea,oneof"` +} + +type GameEvent_DefenderInDefenseArea_ struct { + DefenderInDefenseArea *GameEvent_DefenderInDefenseArea `protobuf:"bytes,31,opt,name=defender_in_defense_area,json=defenderInDefenseArea,oneof"` +} + +type GameEvent_BoundaryCrossing_ struct { + BoundaryCrossing *GameEvent_BoundaryCrossing `protobuf:"bytes,43,opt,name=boundary_crossing,json=boundaryCrossing,oneof"` +} + +type GameEvent_KeeperHeldBall_ struct { + KeeperHeldBall *GameEvent_KeeperHeldBall `protobuf:"bytes,13,opt,name=keeper_held_ball,json=keeperHeldBall,oneof"` +} + +type GameEvent_BotDribbledBallTooFar_ struct { + BotDribbledBallTooFar *GameEvent_BotDribbledBallTooFar `protobuf:"bytes,17,opt,name=bot_dribbled_ball_too_far,json=botDribbledBallTooFar,oneof"` +} + +type GameEvent_BotPushedBot_ struct { + BotPushedBot *GameEvent_BotPushedBot `protobuf:"bytes,24,opt,name=bot_pushed_bot,json=botPushedBot,oneof"` +} + +type GameEvent_BotHeldBallDeliberately_ struct { + BotHeldBallDeliberately *GameEvent_BotHeldBallDeliberately `protobuf:"bytes,26,opt,name=bot_held_ball_deliberately,json=botHeldBallDeliberately,oneof"` +} + +type GameEvent_BotTippedOver_ struct { + BotTippedOver *GameEvent_BotTippedOver `protobuf:"bytes,27,opt,name=bot_tipped_over,json=botTippedOver,oneof"` +} + +type GameEvent_AttackerTouchedBallInDefenseArea_ struct { + AttackerTouchedBallInDefenseArea *GameEvent_AttackerTouchedBallInDefenseArea `protobuf:"bytes,15,opt,name=attacker_touched_ball_in_defense_area,json=attackerTouchedBallInDefenseArea,oneof"` +} + +type GameEvent_BotKickedBallTooFast_ struct { + BotKickedBallTooFast *GameEvent_BotKickedBallTooFast `protobuf:"bytes,18,opt,name=bot_kicked_ball_too_fast,json=botKickedBallTooFast,oneof"` +} + +type GameEvent_BotCrashUnique_ struct { + BotCrashUnique *GameEvent_BotCrashUnique `protobuf:"bytes,22,opt,name=bot_crash_unique,json=botCrashUnique,oneof"` +} + +type GameEvent_BotCrashDrawn_ struct { + BotCrashDrawn *GameEvent_BotCrashDrawn `protobuf:"bytes,21,opt,name=bot_crash_drawn,json=botCrashDrawn,oneof"` +} + +type GameEvent_DefenderTooCloseToKickPoint_ struct { + DefenderTooCloseToKickPoint *GameEvent_DefenderTooCloseToKickPoint `protobuf:"bytes,29,opt,name=defender_too_close_to_kick_point,json=defenderTooCloseToKickPoint,oneof"` +} + +type GameEvent_BotTooFastInStop_ struct { + BotTooFastInStop *GameEvent_BotTooFastInStop `protobuf:"bytes,28,opt,name=bot_too_fast_in_stop,json=botTooFastInStop,oneof"` +} + +type GameEvent_BotInterferedPlacement_ struct { + BotInterferedPlacement *GameEvent_BotInterferedPlacement `protobuf:"bytes,20,opt,name=bot_interfered_placement,json=botInterferedPlacement,oneof"` +} + +type GameEvent_PossibleGoal struct { + PossibleGoal *GameEvent_Goal `protobuf:"bytes,39,opt,name=possible_goal,json=possibleGoal,oneof"` +} + +type GameEvent_Goal_ struct { + Goal *GameEvent_Goal `protobuf:"bytes,8,opt,name=goal,oneof"` +} + +type GameEvent_InvalidGoal struct { + InvalidGoal *GameEvent_Goal `protobuf:"bytes,44,opt,name=invalid_goal,json=invalidGoal,oneof"` +} + +type GameEvent_AttackerDoubleTouchedBall_ struct { + AttackerDoubleTouchedBall *GameEvent_AttackerDoubleTouchedBall `protobuf:"bytes,14,opt,name=attacker_double_touched_ball,json=attackerDoubleTouchedBall,oneof"` +} + +type GameEvent_PlacementSucceeded_ struct { + PlacementSucceeded *GameEvent_PlacementSucceeded `protobuf:"bytes,5,opt,name=placement_succeeded,json=placementSucceeded,oneof"` +} + +type GameEvent_PenaltyKickFailed_ struct { + PenaltyKickFailed *GameEvent_PenaltyKickFailed `protobuf:"bytes,45,opt,name=penalty_kick_failed,json=penaltyKickFailed,oneof"` +} + +type GameEvent_NoProgressInGame_ struct { + NoProgressInGame *GameEvent_NoProgressInGame `protobuf:"bytes,2,opt,name=no_progress_in_game,json=noProgressInGame,oneof"` +} + +type GameEvent_PlacementFailed_ struct { + PlacementFailed *GameEvent_PlacementFailed `protobuf:"bytes,3,opt,name=placement_failed,json=placementFailed,oneof"` +} + +type GameEvent_MultipleCards_ struct { + MultipleCards *GameEvent_MultipleCards `protobuf:"bytes,32,opt,name=multiple_cards,json=multipleCards,oneof"` +} + +type GameEvent_MultipleFouls_ struct { + MultipleFouls *GameEvent_MultipleFouls `protobuf:"bytes,34,opt,name=multiple_fouls,json=multipleFouls,oneof"` +} + +type GameEvent_BotSubstitution_ struct { + BotSubstitution *GameEvent_BotSubstitution `protobuf:"bytes,37,opt,name=bot_substitution,json=botSubstitution,oneof"` +} + +type GameEvent_TooManyRobots_ struct { + TooManyRobots *GameEvent_TooManyRobots `protobuf:"bytes,38,opt,name=too_many_robots,json=tooManyRobots,oneof"` +} + +type GameEvent_ChallengeFlag_ struct { + ChallengeFlag *GameEvent_ChallengeFlag `protobuf:"bytes,46,opt,name=challenge_flag,json=challengeFlag,oneof"` +} + +type GameEvent_EmergencyStop_ struct { + EmergencyStop *GameEvent_EmergencyStop `protobuf:"bytes,47,opt,name=emergency_stop,json=emergencyStop,oneof"` +} + +type GameEvent_UnsportingBehaviorMinor_ struct { + UnsportingBehaviorMinor *GameEvent_UnsportingBehaviorMinor `protobuf:"bytes,35,opt,name=unsporting_behavior_minor,json=unsportingBehaviorMinor,oneof"` +} + +type GameEvent_UnsportingBehaviorMajor_ struct { + UnsportingBehaviorMajor *GameEvent_UnsportingBehaviorMajor `protobuf:"bytes,36,opt,name=unsporting_behavior_major,json=unsportingBehaviorMajor,oneof"` +} + +type GameEvent_Prepared_ struct { + // replaced by ready_to_continue flag + // + // Deprecated: Do not use. + Prepared *GameEvent_Prepared `protobuf:"bytes,1,opt,name=prepared,oneof"` +} + +type GameEvent_IndirectGoal_ struct { + // obsolete + // + // Deprecated: Do not use. + IndirectGoal *GameEvent_IndirectGoal `protobuf:"bytes,9,opt,name=indirect_goal,json=indirectGoal,oneof"` +} + +type GameEvent_ChippedGoal_ struct { + // replaced by the meta-information in the possible_goal event + // + // Deprecated: Do not use. + ChippedGoal *GameEvent_ChippedGoal `protobuf:"bytes,10,opt,name=chipped_goal,json=chippedGoal,oneof"` +} + +type GameEvent_KickTimeout_ struct { + // obsolete + // + // Deprecated: Do not use. + KickTimeout *GameEvent_KickTimeout `protobuf:"bytes,12,opt,name=kick_timeout,json=kickTimeout,oneof"` +} + +type GameEvent_AttackerTouchedOpponentInDefenseArea_ struct { + // rule removed + // + // Deprecated: Do not use. + AttackerTouchedOpponentInDefenseArea *GameEvent_AttackerTouchedOpponentInDefenseArea `protobuf:"bytes,16,opt,name=attacker_touched_opponent_in_defense_area,json=attackerTouchedOpponentInDefenseArea,oneof"` +} + +type GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped struct { + // obsolete + // + // Deprecated: Do not use. + AttackerTouchedOpponentInDefenseAreaSkipped *GameEvent_AttackerTouchedOpponentInDefenseArea `protobuf:"bytes,42,opt,name=attacker_touched_opponent_in_defense_area_skipped,json=attackerTouchedOpponentInDefenseAreaSkipped,oneof"` +} + +type GameEvent_BotCrashUniqueSkipped struct { + // obsolete + // + // Deprecated: Do not use. + BotCrashUniqueSkipped *GameEvent_BotCrashUnique `protobuf:"bytes,23,opt,name=bot_crash_unique_skipped,json=botCrashUniqueSkipped,oneof"` +} + +type GameEvent_BotPushedBotSkipped struct { + // can not be used as long as autoRefs do not judge pushing + // + // Deprecated: Do not use. + BotPushedBotSkipped *GameEvent_BotPushedBot `protobuf:"bytes,25,opt,name=bot_pushed_bot_skipped,json=botPushedBotSkipped,oneof"` +} + +type GameEvent_DefenderInDefenseAreaPartially_ struct { + // rule removed + // + // Deprecated: Do not use. + DefenderInDefenseAreaPartially *GameEvent_DefenderInDefenseAreaPartially `protobuf:"bytes,30,opt,name=defender_in_defense_area_partially,json=defenderInDefenseAreaPartially,oneof"` +} + +type GameEvent_MultiplePlacementFailures_ struct { + // the referee msg already indicates this + // + // Deprecated: Do not use. + MultiplePlacementFailures *GameEvent_MultiplePlacementFailures `protobuf:"bytes,33,opt,name=multiple_placement_failures,json=multiplePlacementFailures,oneof"` +} + +func (*GameEvent_BallLeftFieldTouchLine) isGameEvent_Event() {} + +func (*GameEvent_BallLeftFieldGoalLine) isGameEvent_Event() {} + +func (*GameEvent_AimlessKick_) isGameEvent_Event() {} + +func (*GameEvent_AttackerTooCloseToDefenseArea_) isGameEvent_Event() {} + +func (*GameEvent_DefenderInDefenseArea_) isGameEvent_Event() {} + +func (*GameEvent_BoundaryCrossing_) isGameEvent_Event() {} + +func (*GameEvent_KeeperHeldBall_) isGameEvent_Event() {} + +func (*GameEvent_BotDribbledBallTooFar_) isGameEvent_Event() {} + +func (*GameEvent_BotPushedBot_) isGameEvent_Event() {} + +func (*GameEvent_BotHeldBallDeliberately_) isGameEvent_Event() {} + +func (*GameEvent_BotTippedOver_) isGameEvent_Event() {} + +func (*GameEvent_AttackerTouchedBallInDefenseArea_) isGameEvent_Event() {} + +func (*GameEvent_BotKickedBallTooFast_) isGameEvent_Event() {} + +func (*GameEvent_BotCrashUnique_) isGameEvent_Event() {} + +func (*GameEvent_BotCrashDrawn_) isGameEvent_Event() {} + +func (*GameEvent_DefenderTooCloseToKickPoint_) isGameEvent_Event() {} + +func (*GameEvent_BotTooFastInStop_) isGameEvent_Event() {} + +func (*GameEvent_BotInterferedPlacement_) isGameEvent_Event() {} + +func (*GameEvent_PossibleGoal) isGameEvent_Event() {} + +func (*GameEvent_Goal_) isGameEvent_Event() {} + +func (*GameEvent_InvalidGoal) isGameEvent_Event() {} + +func (*GameEvent_AttackerDoubleTouchedBall_) isGameEvent_Event() {} + +func (*GameEvent_PlacementSucceeded_) isGameEvent_Event() {} + +func (*GameEvent_PenaltyKickFailed_) isGameEvent_Event() {} + +func (*GameEvent_NoProgressInGame_) isGameEvent_Event() {} + +func (*GameEvent_PlacementFailed_) isGameEvent_Event() {} + +func (*GameEvent_MultipleCards_) isGameEvent_Event() {} + +func (*GameEvent_MultipleFouls_) isGameEvent_Event() {} + +func (*GameEvent_BotSubstitution_) isGameEvent_Event() {} + +func (*GameEvent_TooManyRobots_) isGameEvent_Event() {} + +func (*GameEvent_ChallengeFlag_) isGameEvent_Event() {} + +func (*GameEvent_EmergencyStop_) isGameEvent_Event() {} + +func (*GameEvent_UnsportingBehaviorMinor_) isGameEvent_Event() {} + +func (*GameEvent_UnsportingBehaviorMajor_) isGameEvent_Event() {} + +func (*GameEvent_Prepared_) isGameEvent_Event() {} + +func (*GameEvent_IndirectGoal_) isGameEvent_Event() {} + +func (*GameEvent_ChippedGoal_) isGameEvent_Event() {} + +func (*GameEvent_KickTimeout_) isGameEvent_Event() {} + +func (*GameEvent_AttackerTouchedOpponentInDefenseArea_) isGameEvent_Event() {} + +func (*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped) isGameEvent_Event() {} + +func (*GameEvent_BotCrashUniqueSkipped) isGameEvent_Event() {} + +func (*GameEvent_BotPushedBotSkipped) isGameEvent_Event() {} + +func (*GameEvent_DefenderInDefenseAreaPartially_) isGameEvent_Event() {} + +func (*GameEvent_MultiplePlacementFailures_) isGameEvent_Event() {} + +// the ball left the field normally +type GameEvent_BallLeftField struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that last touched the ball + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that last touched the ball + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location where the ball left the field [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_BallLeftField) Reset() { + *x = GameEvent_BallLeftField{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BallLeftField) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BallLeftField) ProtoMessage() {} + +func (x *GameEvent_BallLeftField) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BallLeftField.ProtoReflect.Descriptor instead. +func (*GameEvent_BallLeftField) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *GameEvent_BallLeftField) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BallLeftField) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BallLeftField) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +// the ball left the field via goal line and a team committed an aimless kick +type GameEvent_AimlessKick struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that last touched the ball + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that last touched the ball + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location where the ball left the field [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the location where the ball was last touched [m] + KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"` +} + +func (x *GameEvent_AimlessKick) Reset() { + *x = GameEvent_AimlessKick{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_AimlessKick) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_AimlessKick) ProtoMessage() {} + +func (x *GameEvent_AimlessKick) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_AimlessKick.ProtoReflect.Descriptor instead. +func (*GameEvent_AimlessKick) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 1} +} + +func (x *GameEvent_AimlessKick) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_AimlessKick) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_AimlessKick) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_AimlessKick) GetKickLocation() *geom.Vector2 { + if x != nil { + return x.KickLocation + } + return nil +} + +// a team shot a goal +type GameEvent_Goal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that scored the goal + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the team that shot the goal (different from by_team for own goals) + KickingTeam *Team `protobuf:"varint,6,opt,name=kicking_team,json=kickingTeam,enum=Team" json:"kicking_team,omitempty"` + // the bot that shot the goal + KickingBot *uint32 `protobuf:"varint,2,opt,name=kicking_bot,json=kickingBot" json:"kicking_bot,omitempty"` + // the location where the ball entered the goal [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the location where the ball was kicked (for deciding if this was a valid goal) [m] + KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"` + // the maximum height the ball reached during the goal kick (for deciding if this was a valid goal) [m] + MaxBallHeight *float32 `protobuf:"fixed32,5,opt,name=max_ball_height,json=maxBallHeight" json:"max_ball_height,omitempty"` + // number of robots of scoring team when the ball entered the goal (for deciding if this was a valid goal) + NumRobotsByTeam *uint32 `protobuf:"varint,7,opt,name=num_robots_by_team,json=numRobotsByTeam" json:"num_robots_by_team,omitempty"` + // The UNIX timestamp [μs] when the scoring team last touched the ball + LastTouchByTeam *uint64 `protobuf:"varint,8,opt,name=last_touch_by_team,json=lastTouchByTeam" json:"last_touch_by_team,omitempty"` + // An additional message with e.g. a reason for invalid goals + Message *string `protobuf:"bytes,9,opt,name=message" json:"message,omitempty"` +} + +func (x *GameEvent_Goal) Reset() { + *x = GameEvent_Goal{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_Goal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_Goal) ProtoMessage() {} + +func (x *GameEvent_Goal) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_Goal.ProtoReflect.Descriptor instead. +func (*GameEvent_Goal) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 2} +} + +func (x *GameEvent_Goal) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_Goal) GetKickingTeam() Team { + if x != nil && x.KickingTeam != nil { + return *x.KickingTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_Goal) GetKickingBot() uint32 { + if x != nil && x.KickingBot != nil { + return *x.KickingBot + } + return 0 +} + +func (x *GameEvent_Goal) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_Goal) GetKickLocation() *geom.Vector2 { + if x != nil { + return x.KickLocation + } + return nil +} + +func (x *GameEvent_Goal) GetMaxBallHeight() float32 { + if x != nil && x.MaxBallHeight != nil { + return *x.MaxBallHeight + } + return 0 +} + +func (x *GameEvent_Goal) GetNumRobotsByTeam() uint32 { + if x != nil && x.NumRobotsByTeam != nil { + return *x.NumRobotsByTeam + } + return 0 +} + +func (x *GameEvent_Goal) GetLastTouchByTeam() uint64 { + if x != nil && x.LastTouchByTeam != nil { + return *x.LastTouchByTeam + } + return 0 +} + +func (x *GameEvent_Goal) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +// the ball entered the goal directly during an indirect free kick +type GameEvent_IndirectGoal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that tried to shoot the goal + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that kicked the ball - at least the team must be set + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location where the ball entered the goal [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the location where the ball was kicked [m] + KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"` +} + +func (x *GameEvent_IndirectGoal) Reset() { + *x = GameEvent_IndirectGoal{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_IndirectGoal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_IndirectGoal) ProtoMessage() {} + +func (x *GameEvent_IndirectGoal) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_IndirectGoal.ProtoReflect.Descriptor instead. +func (*GameEvent_IndirectGoal) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 3} +} + +func (x *GameEvent_IndirectGoal) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_IndirectGoal) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_IndirectGoal) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_IndirectGoal) GetKickLocation() *geom.Vector2 { + if x != nil { + return x.KickLocation + } + return nil +} + +// the ball entered the goal, but was initially chipped +type GameEvent_ChippedGoal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that tried to shoot the goal + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that kicked the ball + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location where the ball entered the goal [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the location where the ball was kicked [m] + KickLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=kick_location,json=kickLocation" json:"kick_location,omitempty"` + // the maximum height [m] of the ball, before it entered the goal and since the last kick [m] + MaxBallHeight *float32 `protobuf:"fixed32,5,opt,name=max_ball_height,json=maxBallHeight" json:"max_ball_height,omitempty"` +} + +func (x *GameEvent_ChippedGoal) Reset() { + *x = GameEvent_ChippedGoal{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_ChippedGoal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_ChippedGoal) ProtoMessage() {} + +func (x *GameEvent_ChippedGoal) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_ChippedGoal.ProtoReflect.Descriptor instead. +func (*GameEvent_ChippedGoal) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 4} +} + +func (x *GameEvent_ChippedGoal) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_ChippedGoal) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_ChippedGoal) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_ChippedGoal) GetKickLocation() *geom.Vector2 { + if x != nil { + return x.KickLocation + } + return nil +} + +func (x *GameEvent_ChippedGoal) GetMaxBallHeight() float32 { + if x != nil && x.MaxBallHeight != nil { + return *x.MaxBallHeight + } + return 0 +} + +// a bot moved too fast while the game was stopped +type GameEvent_BotTooFastInStop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that was too fast + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the bot speed [m/s] + Speed *float32 `protobuf:"fixed32,4,opt,name=speed" json:"speed,omitempty"` +} + +func (x *GameEvent_BotTooFastInStop) Reset() { + *x = GameEvent_BotTooFastInStop{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotTooFastInStop) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotTooFastInStop) ProtoMessage() {} + +func (x *GameEvent_BotTooFastInStop) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotTooFastInStop.ProtoReflect.Descriptor instead. +func (*GameEvent_BotTooFastInStop) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 5} +} + +func (x *GameEvent_BotTooFastInStop) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotTooFastInStop) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotTooFastInStop) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotTooFastInStop) GetSpeed() float32 { + if x != nil && x.Speed != nil { + return *x.Speed + } + return 0 +} + +// a bot of the defending team got too close to the kick point during a free kick +type GameEvent_DefenderTooCloseToKickPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that was found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that violates the distance to the kick point + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the distance [m] from bot to the kick point (including the minimum radius) + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) Reset() { + *x = GameEvent_DefenderTooCloseToKickPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_DefenderTooCloseToKickPoint) ProtoMessage() {} + +func (x *GameEvent_DefenderTooCloseToKickPoint) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_DefenderTooCloseToKickPoint.ProtoReflect.Descriptor instead. +func (*GameEvent_DefenderTooCloseToKickPoint) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 6} +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_DefenderTooCloseToKickPoint) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +// two robots crashed into each other with similar speeds +type GameEvent_BotCrashDrawn struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the bot of the yellow team + BotYellow *uint32 `protobuf:"varint,1,opt,name=bot_yellow,json=botYellow" json:"bot_yellow,omitempty"` + // the bot of the blue team + BotBlue *uint32 `protobuf:"varint,2,opt,name=bot_blue,json=botBlue" json:"bot_blue,omitempty"` + // the location of the crash (center between both bots) [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the calculated crash speed [m/s] of the two bots + CrashSpeed *float32 `protobuf:"fixed32,4,opt,name=crash_speed,json=crashSpeed" json:"crash_speed,omitempty"` + // the difference [m/s] of the velocity of the two bots + SpeedDiff *float32 `protobuf:"fixed32,5,opt,name=speed_diff,json=speedDiff" json:"speed_diff,omitempty"` + // the angle [rad] in the range [0, π] of the bot velocity vectors + // an angle of 0 rad ( 0°) means, the bots barely touched each other + // an angle of π rad (180°) means, the bots crashed frontal into each other + CrashAngle *float32 `protobuf:"fixed32,6,opt,name=crash_angle,json=crashAngle" json:"crash_angle,omitempty"` +} + +func (x *GameEvent_BotCrashDrawn) Reset() { + *x = GameEvent_BotCrashDrawn{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotCrashDrawn) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotCrashDrawn) ProtoMessage() {} + +func (x *GameEvent_BotCrashDrawn) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotCrashDrawn.ProtoReflect.Descriptor instead. +func (*GameEvent_BotCrashDrawn) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 7} +} + +func (x *GameEvent_BotCrashDrawn) GetBotYellow() uint32 { + if x != nil && x.BotYellow != nil { + return *x.BotYellow + } + return 0 +} + +func (x *GameEvent_BotCrashDrawn) GetBotBlue() uint32 { + if x != nil && x.BotBlue != nil { + return *x.BotBlue + } + return 0 +} + +func (x *GameEvent_BotCrashDrawn) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotCrashDrawn) GetCrashSpeed() float32 { + if x != nil && x.CrashSpeed != nil { + return *x.CrashSpeed + } + return 0 +} + +func (x *GameEvent_BotCrashDrawn) GetSpeedDiff() float32 { + if x != nil && x.SpeedDiff != nil { + return *x.SpeedDiff + } + return 0 +} + +func (x *GameEvent_BotCrashDrawn) GetCrashAngle() float32 { + if x != nil && x.CrashAngle != nil { + return *x.CrashAngle + } + return 0 +} + +// two robots crashed into each other and one team was found guilty to due significant speed difference +type GameEvent_BotCrashUnique struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that caused the crash + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that caused the crash + Violator *uint32 `protobuf:"varint,2,opt,name=violator" json:"violator,omitempty"` + // the bot of the opposite team that was involved in the crash + Victim *uint32 `protobuf:"varint,3,opt,name=victim" json:"victim,omitempty"` + // the location of the crash (center between both bots) [m] + Location *geom.Vector2 `protobuf:"bytes,4,opt,name=location" json:"location,omitempty"` + // the calculated crash speed vector [m/s] of the two bots + CrashSpeed *float32 `protobuf:"fixed32,5,opt,name=crash_speed,json=crashSpeed" json:"crash_speed,omitempty"` + // the difference [m/s] of the velocity of the two bots + SpeedDiff *float32 `protobuf:"fixed32,6,opt,name=speed_diff,json=speedDiff" json:"speed_diff,omitempty"` + // the angle [rad] in the range [0, π] of the bot velocity vectors + // an angle of 0 rad ( 0°) means, the bots barely touched each other + // an angle of π rad (180°) means, the bots crashed frontal into each other + CrashAngle *float32 `protobuf:"fixed32,7,opt,name=crash_angle,json=crashAngle" json:"crash_angle,omitempty"` +} + +func (x *GameEvent_BotCrashUnique) Reset() { + *x = GameEvent_BotCrashUnique{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotCrashUnique) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotCrashUnique) ProtoMessage() {} + +func (x *GameEvent_BotCrashUnique) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotCrashUnique.ProtoReflect.Descriptor instead. +func (*GameEvent_BotCrashUnique) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 8} +} + +func (x *GameEvent_BotCrashUnique) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotCrashUnique) GetViolator() uint32 { + if x != nil && x.Violator != nil { + return *x.Violator + } + return 0 +} + +func (x *GameEvent_BotCrashUnique) GetVictim() uint32 { + if x != nil && x.Victim != nil { + return *x.Victim + } + return 0 +} + +func (x *GameEvent_BotCrashUnique) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotCrashUnique) GetCrashSpeed() float32 { + if x != nil && x.CrashSpeed != nil { + return *x.CrashSpeed + } + return 0 +} + +func (x *GameEvent_BotCrashUnique) GetSpeedDiff() float32 { + if x != nil && x.SpeedDiff != nil { + return *x.SpeedDiff + } + return 0 +} + +func (x *GameEvent_BotCrashUnique) GetCrashAngle() float32 { + if x != nil && x.CrashAngle != nil { + return *x.CrashAngle + } + return 0 +} + +// a bot pushed another bot over a significant distance +type GameEvent_BotPushedBot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that pushed the other team + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that pushed the other bot + Violator *uint32 `protobuf:"varint,2,opt,name=violator" json:"violator,omitempty"` + // the bot of the opposite team that was pushed + Victim *uint32 `protobuf:"varint,3,opt,name=victim" json:"victim,omitempty"` + // the location of the push (center between both bots) [m] + Location *geom.Vector2 `protobuf:"bytes,4,opt,name=location" json:"location,omitempty"` + // the pushed distance [m] + PushedDistance *float32 `protobuf:"fixed32,5,opt,name=pushed_distance,json=pushedDistance" json:"pushed_distance,omitempty"` +} + +func (x *GameEvent_BotPushedBot) Reset() { + *x = GameEvent_BotPushedBot{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotPushedBot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotPushedBot) ProtoMessage() {} + +func (x *GameEvent_BotPushedBot) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotPushedBot.ProtoReflect.Descriptor instead. +func (*GameEvent_BotPushedBot) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 9} +} + +func (x *GameEvent_BotPushedBot) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotPushedBot) GetViolator() uint32 { + if x != nil && x.Violator != nil { + return *x.Violator + } + return 0 +} + +func (x *GameEvent_BotPushedBot) GetVictim() uint32 { + if x != nil && x.Victim != nil { + return *x.Victim + } + return 0 +} + +func (x *GameEvent_BotPushedBot) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotPushedBot) GetPushedDistance() float32 { + if x != nil && x.PushedDistance != nil { + return *x.PushedDistance + } + return 0 +} + +// a bot tipped over +type GameEvent_BotTippedOver struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that tipped over + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the location of the ball at the moment when this foul occurred [m] + BallLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"` +} + +func (x *GameEvent_BotTippedOver) Reset() { + *x = GameEvent_BotTippedOver{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotTippedOver) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotTippedOver) ProtoMessage() {} + +func (x *GameEvent_BotTippedOver) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotTippedOver.ProtoReflect.Descriptor instead. +func (*GameEvent_BotTippedOver) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 10} +} + +func (x *GameEvent_BotTippedOver) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotTippedOver) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotTippedOver) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotTippedOver) GetBallLocation() *geom.Vector2 { + if x != nil { + return x.BallLocation + } + return nil +} + +// a defender other than the keeper was fully located inside its own defense and touched the ball +type GameEvent_DefenderInDefenseArea struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that is inside the penalty area + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the distance [m] from bot case to the nearest point outside the defense area + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` +} + +func (x *GameEvent_DefenderInDefenseArea) Reset() { + *x = GameEvent_DefenderInDefenseArea{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_DefenderInDefenseArea) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_DefenderInDefenseArea) ProtoMessage() {} + +func (x *GameEvent_DefenderInDefenseArea) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_DefenderInDefenseArea.ProtoReflect.Descriptor instead. +func (*GameEvent_DefenderInDefenseArea) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 11} +} + +func (x *GameEvent_DefenderInDefenseArea) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_DefenderInDefenseArea) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_DefenderInDefenseArea) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_DefenderInDefenseArea) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +// a defender other than the keeper was partially located inside its own defense area and touched the ball +type GameEvent_DefenderInDefenseAreaPartially struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that is partially inside the penalty area + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the distance [m] that the bot is inside the penalty area + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` + // the location of the ball at the moment when this foul occurred [m] + BallLocation *geom.Vector2 `protobuf:"bytes,5,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"` +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) Reset() { + *x = GameEvent_DefenderInDefenseAreaPartially{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_DefenderInDefenseAreaPartially) ProtoMessage() {} + +func (x *GameEvent_DefenderInDefenseAreaPartially) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_DefenderInDefenseAreaPartially.ProtoReflect.Descriptor instead. +func (*GameEvent_DefenderInDefenseAreaPartially) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 12} +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +func (x *GameEvent_DefenderInDefenseAreaPartially) GetBallLocation() *geom.Vector2 { + if x != nil { + return x.BallLocation + } + return nil +} + +// an attacker touched the ball inside the opponent defense area +type GameEvent_AttackerTouchedBallInDefenseArea struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that is inside the penalty area + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the distance [m] that the bot is inside the penalty area + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) Reset() { + *x = GameEvent_AttackerTouchedBallInDefenseArea{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_AttackerTouchedBallInDefenseArea) ProtoMessage() {} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_AttackerTouchedBallInDefenseArea.ProtoReflect.Descriptor instead. +func (*GameEvent_AttackerTouchedBallInDefenseArea) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 13} +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_AttackerTouchedBallInDefenseArea) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +// a bot kicked the ball too fast +type GameEvent_BotKickedBallTooFast struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that kicked too fast + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the ball at the time of the highest speed [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the absolute initial ball speed (kick speed) [m/s] + InitialBallSpeed *float32 `protobuf:"fixed32,4,opt,name=initial_ball_speed,json=initialBallSpeed" json:"initial_ball_speed,omitempty"` + // was the ball chipped? + Chipped *bool `protobuf:"varint,5,opt,name=chipped" json:"chipped,omitempty"` +} + +func (x *GameEvent_BotKickedBallTooFast) Reset() { + *x = GameEvent_BotKickedBallTooFast{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotKickedBallTooFast) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotKickedBallTooFast) ProtoMessage() {} + +func (x *GameEvent_BotKickedBallTooFast) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotKickedBallTooFast.ProtoReflect.Descriptor instead. +func (*GameEvent_BotKickedBallTooFast) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 14} +} + +func (x *GameEvent_BotKickedBallTooFast) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotKickedBallTooFast) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotKickedBallTooFast) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotKickedBallTooFast) GetInitialBallSpeed() float32 { + if x != nil && x.InitialBallSpeed != nil { + return *x.InitialBallSpeed + } + return 0 +} + +func (x *GameEvent_BotKickedBallTooFast) GetChipped() bool { + if x != nil && x.Chipped != nil { + return *x.Chipped + } + return false +} + +// a bot dribbled to ball too far +type GameEvent_BotDribbledBallTooFar struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that dribbled too far + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location where the dribbling started [m] + Start *geom.Vector2 `protobuf:"bytes,3,opt,name=start" json:"start,omitempty"` + // the location where the maximum dribbling distance was reached [m] + End *geom.Vector2 `protobuf:"bytes,4,opt,name=end" json:"end,omitempty"` +} + +func (x *GameEvent_BotDribbledBallTooFar) Reset() { + *x = GameEvent_BotDribbledBallTooFar{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotDribbledBallTooFar) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotDribbledBallTooFar) ProtoMessage() {} + +func (x *GameEvent_BotDribbledBallTooFar) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotDribbledBallTooFar.ProtoReflect.Descriptor instead. +func (*GameEvent_BotDribbledBallTooFar) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 15} +} + +func (x *GameEvent_BotDribbledBallTooFar) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotDribbledBallTooFar) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotDribbledBallTooFar) GetStart() *geom.Vector2 { + if x != nil { + return x.Start + } + return nil +} + +func (x *GameEvent_BotDribbledBallTooFar) GetEnd() *geom.Vector2 { + if x != nil { + return x.End + } + return nil +} + +// an attacker touched the opponent robot inside defense area +type GameEvent_AttackerTouchedOpponentInDefenseArea struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that touched the opponent robot + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the bot of the opposite team that was touched + Victim *uint32 `protobuf:"varint,4,opt,name=victim" json:"victim,omitempty"` + // the location of the contact point between both bots [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) Reset() { + *x = GameEvent_AttackerTouchedOpponentInDefenseArea{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_AttackerTouchedOpponentInDefenseArea) ProtoMessage() {} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_AttackerTouchedOpponentInDefenseArea.ProtoReflect.Descriptor instead. +func (*GameEvent_AttackerTouchedOpponentInDefenseArea) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 16} +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetVictim() uint32 { + if x != nil && x.Victim != nil { + return *x.Victim + } + return 0 +} + +func (x *GameEvent_AttackerTouchedOpponentInDefenseArea) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +// an attacker touched the ball multiple times when it was not allowed to +type GameEvent_AttackerDoubleTouchedBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that touched the ball twice + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the ball when it was first touched [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_AttackerDoubleTouchedBall) Reset() { + *x = GameEvent_AttackerDoubleTouchedBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_AttackerDoubleTouchedBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_AttackerDoubleTouchedBall) ProtoMessage() {} + +func (x *GameEvent_AttackerDoubleTouchedBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_AttackerDoubleTouchedBall.ProtoReflect.Descriptor instead. +func (*GameEvent_AttackerDoubleTouchedBall) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 17} +} + +func (x *GameEvent_AttackerDoubleTouchedBall) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_AttackerDoubleTouchedBall) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_AttackerDoubleTouchedBall) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +// an attacker was located too near to the opponent defense area during stop or free kick +type GameEvent_AttackerTooCloseToDefenseArea struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that is too close to the defense area + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the distance [m] of the bot to the penalty area + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` + // the location of the ball at the moment when this foul occurred [m] + BallLocation *geom.Vector2 `protobuf:"bytes,5,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"` +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) Reset() { + *x = GameEvent_AttackerTooCloseToDefenseArea{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_AttackerTooCloseToDefenseArea) ProtoMessage() {} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_AttackerTooCloseToDefenseArea.ProtoReflect.Descriptor instead. +func (*GameEvent_AttackerTooCloseToDefenseArea) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 18} +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +func (x *GameEvent_AttackerTooCloseToDefenseArea) GetBallLocation() *geom.Vector2 { + if x != nil { + return x.BallLocation + } + return nil +} + +// a bot held the ball for too long +type GameEvent_BotHeldBallDeliberately struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that holds the ball + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the ball [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` + // the duration [s] that the bot hold the ball + Duration *float32 `protobuf:"fixed32,4,opt,name=duration" json:"duration,omitempty"` +} + +func (x *GameEvent_BotHeldBallDeliberately) Reset() { + *x = GameEvent_BotHeldBallDeliberately{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotHeldBallDeliberately) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotHeldBallDeliberately) ProtoMessage() {} + +func (x *GameEvent_BotHeldBallDeliberately) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotHeldBallDeliberately.ProtoReflect.Descriptor instead. +func (*GameEvent_BotHeldBallDeliberately) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 19} +} + +func (x *GameEvent_BotHeldBallDeliberately) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotHeldBallDeliberately) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotHeldBallDeliberately) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_BotHeldBallDeliberately) GetDuration() float32 { + if x != nil && x.Duration != nil { + return *x.Duration + } + return 0 +} + +// a bot interfered the ball placement of the other team +type GameEvent_BotInterferedPlacement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the bot that interfered the placement + ByBot *uint32 `protobuf:"varint,2,opt,name=by_bot,json=byBot" json:"by_bot,omitempty"` + // the location of the bot [m] + Location *geom.Vector2 `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_BotInterferedPlacement) Reset() { + *x = GameEvent_BotInterferedPlacement{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotInterferedPlacement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotInterferedPlacement) ProtoMessage() {} + +func (x *GameEvent_BotInterferedPlacement) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotInterferedPlacement.ProtoReflect.Descriptor instead. +func (*GameEvent_BotInterferedPlacement) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 20} +} + +func (x *GameEvent_BotInterferedPlacement) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BotInterferedPlacement) GetByBot() uint32 { + if x != nil && x.ByBot != nil { + return *x.ByBot + } + return 0 +} + +func (x *GameEvent_BotInterferedPlacement) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +// a team collected multiple cards (yellow and red), which results in a penalty kick +type GameEvent_MultipleCards struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that received multiple yellow cards + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_MultipleCards) Reset() { + *x = GameEvent_MultipleCards{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_MultipleCards) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_MultipleCards) ProtoMessage() {} + +func (x *GameEvent_MultipleCards) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_MultipleCards.ProtoReflect.Descriptor instead. +func (*GameEvent_MultipleCards) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 21} +} + +func (x *GameEvent_MultipleCards) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// a team collected multiple fouls, which results in a yellow card +type GameEvent_MultipleFouls struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that collected multiple fouls + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_MultipleFouls) Reset() { + *x = GameEvent_MultipleFouls{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_MultipleFouls) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_MultipleFouls) ProtoMessage() {} + +func (x *GameEvent_MultipleFouls) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_MultipleFouls.ProtoReflect.Descriptor instead. +func (*GameEvent_MultipleFouls) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 22} +} + +func (x *GameEvent_MultipleFouls) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// a team failed to place the ball multiple times in a row +type GameEvent_MultiplePlacementFailures struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that failed multiple times + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_MultiplePlacementFailures) Reset() { + *x = GameEvent_MultiplePlacementFailures{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_MultiplePlacementFailures) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_MultiplePlacementFailures) ProtoMessage() {} + +func (x *GameEvent_MultiplePlacementFailures) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_MultiplePlacementFailures.ProtoReflect.Descriptor instead. +func (*GameEvent_MultiplePlacementFailures) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 23} +} + +func (x *GameEvent_MultiplePlacementFailures) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// timeout waiting for the attacking team to perform the free kick +type GameEvent_KickTimeout struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that that should have kicked + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the location of the ball [m] + Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"` + // the time [s] that was waited + Time *float32 `protobuf:"fixed32,3,opt,name=time" json:"time,omitempty"` +} + +func (x *GameEvent_KickTimeout) Reset() { + *x = GameEvent_KickTimeout{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_KickTimeout) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_KickTimeout) ProtoMessage() {} + +func (x *GameEvent_KickTimeout) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_KickTimeout.ProtoReflect.Descriptor instead. +func (*GameEvent_KickTimeout) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 24} +} + +func (x *GameEvent_KickTimeout) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_KickTimeout) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_KickTimeout) GetTime() float32 { + if x != nil && x.Time != nil { + return *x.Time + } + return 0 +} + +// game was stuck +type GameEvent_NoProgressInGame struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the location of the ball + Location *geom.Vector2 `protobuf:"bytes,1,opt,name=location" json:"location,omitempty"` + // the time [s] that was waited + Time *float32 `protobuf:"fixed32,2,opt,name=time" json:"time,omitempty"` +} + +func (x *GameEvent_NoProgressInGame) Reset() { + *x = GameEvent_NoProgressInGame{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_NoProgressInGame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_NoProgressInGame) ProtoMessage() {} + +func (x *GameEvent_NoProgressInGame) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_NoProgressInGame.ProtoReflect.Descriptor instead. +func (*GameEvent_NoProgressInGame) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 25} +} + +func (x *GameEvent_NoProgressInGame) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_NoProgressInGame) GetTime() float32 { + if x != nil && x.Time != nil { + return *x.Time + } + return 0 +} + +// ball placement failed +type GameEvent_PlacementFailed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that failed + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the remaining distance [m] from ball to placement position + RemainingDistance *float32 `protobuf:"fixed32,2,opt,name=remaining_distance,json=remainingDistance" json:"remaining_distance,omitempty"` +} + +func (x *GameEvent_PlacementFailed) Reset() { + *x = GameEvent_PlacementFailed{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_PlacementFailed) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_PlacementFailed) ProtoMessage() {} + +func (x *GameEvent_PlacementFailed) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_PlacementFailed.ProtoReflect.Descriptor instead. +func (*GameEvent_PlacementFailed) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 26} +} + +func (x *GameEvent_PlacementFailed) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_PlacementFailed) GetRemainingDistance() float32 { + if x != nil && x.RemainingDistance != nil { + return *x.RemainingDistance + } + return 0 +} + +// a team was found guilty for minor unsporting behavior +type GameEvent_UnsportingBehaviorMinor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // an explanation of the situation and decision + Reason *string `protobuf:"bytes,2,req,name=reason" json:"reason,omitempty"` +} + +func (x *GameEvent_UnsportingBehaviorMinor) Reset() { + *x = GameEvent_UnsportingBehaviorMinor{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_UnsportingBehaviorMinor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_UnsportingBehaviorMinor) ProtoMessage() {} + +func (x *GameEvent_UnsportingBehaviorMinor) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_UnsportingBehaviorMinor.ProtoReflect.Descriptor instead. +func (*GameEvent_UnsportingBehaviorMinor) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 27} +} + +func (x *GameEvent_UnsportingBehaviorMinor) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_UnsportingBehaviorMinor) GetReason() string { + if x != nil && x.Reason != nil { + return *x.Reason + } + return "" +} + +// a team was found guilty for major unsporting behavior +type GameEvent_UnsportingBehaviorMajor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // an explanation of the situation and decision + Reason *string `protobuf:"bytes,2,req,name=reason" json:"reason,omitempty"` +} + +func (x *GameEvent_UnsportingBehaviorMajor) Reset() { + *x = GameEvent_UnsportingBehaviorMajor{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_UnsportingBehaviorMajor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_UnsportingBehaviorMajor) ProtoMessage() {} + +func (x *GameEvent_UnsportingBehaviorMajor) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_UnsportingBehaviorMajor.ProtoReflect.Descriptor instead. +func (*GameEvent_UnsportingBehaviorMajor) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 28} +} + +func (x *GameEvent_UnsportingBehaviorMajor) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_UnsportingBehaviorMajor) GetReason() string { + if x != nil && x.Reason != nil { + return *x.Reason + } + return "" +} + +// a keeper held the ball in its defense area for too long +type GameEvent_KeeperHeldBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that found guilty + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the location of the ball [m] + Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"` + // the duration [s] that the keeper hold the ball + Duration *float32 `protobuf:"fixed32,3,opt,name=duration" json:"duration,omitempty"` +} + +func (x *GameEvent_KeeperHeldBall) Reset() { + *x = GameEvent_KeeperHeldBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_KeeperHeldBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_KeeperHeldBall) ProtoMessage() {} + +func (x *GameEvent_KeeperHeldBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_KeeperHeldBall.ProtoReflect.Descriptor instead. +func (*GameEvent_KeeperHeldBall) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 29} +} + +func (x *GameEvent_KeeperHeldBall) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_KeeperHeldBall) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +func (x *GameEvent_KeeperHeldBall) GetDuration() float32 { + if x != nil && x.Duration != nil { + return *x.Duration + } + return 0 +} + +// a team successfully placed the ball +type GameEvent_PlacementSucceeded struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that did the placement + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the time [s] taken for placing the ball + TimeTaken *float32 `protobuf:"fixed32,2,opt,name=time_taken,json=timeTaken" json:"time_taken,omitempty"` + // the distance [m] between placement location and actual ball position + Precision *float32 `protobuf:"fixed32,3,opt,name=precision" json:"precision,omitempty"` + // the distance [m] between the initial ball location and the placement position + Distance *float32 `protobuf:"fixed32,4,opt,name=distance" json:"distance,omitempty"` +} + +func (x *GameEvent_PlacementSucceeded) Reset() { + *x = GameEvent_PlacementSucceeded{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_PlacementSucceeded) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_PlacementSucceeded) ProtoMessage() {} + +func (x *GameEvent_PlacementSucceeded) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_PlacementSucceeded.ProtoReflect.Descriptor instead. +func (*GameEvent_PlacementSucceeded) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 30} +} + +func (x *GameEvent_PlacementSucceeded) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_PlacementSucceeded) GetTimeTaken() float32 { + if x != nil && x.TimeTaken != nil { + return *x.TimeTaken + } + return 0 +} + +func (x *GameEvent_PlacementSucceeded) GetPrecision() float32 { + if x != nil && x.Precision != nil { + return *x.Precision + } + return 0 +} + +func (x *GameEvent_PlacementSucceeded) GetDistance() float32 { + if x != nil && x.Distance != nil { + return *x.Distance + } + return 0 +} + +// both teams are prepared - all conditions are met to continue (with kickoff or penalty kick) +type GameEvent_Prepared struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the time [s] taken for preparing + TimeTaken *float32 `protobuf:"fixed32,1,opt,name=time_taken,json=timeTaken" json:"time_taken,omitempty"` +} + +func (x *GameEvent_Prepared) Reset() { + *x = GameEvent_Prepared{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_Prepared) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_Prepared) ProtoMessage() {} + +func (x *GameEvent_Prepared) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_Prepared.ProtoReflect.Descriptor instead. +func (*GameEvent_Prepared) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 31} +} + +func (x *GameEvent_Prepared) GetTimeTaken() float32 { + if x != nil && x.TimeTaken != nil { + return *x.TimeTaken + } + return 0 +} + +// bots are being substituted by a team +type GameEvent_BotSubstitution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that substitutes robots + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_BotSubstitution) Reset() { + *x = GameEvent_BotSubstitution{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BotSubstitution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BotSubstitution) ProtoMessage() {} + +func (x *GameEvent_BotSubstitution) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BotSubstitution.ProtoReflect.Descriptor instead. +func (*GameEvent_BotSubstitution) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 32} +} + +func (x *GameEvent_BotSubstitution) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// A challenge flag, requested by a team previously, is flagged +type GameEvent_ChallengeFlag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that substitutes robots + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_ChallengeFlag) Reset() { + *x = GameEvent_ChallengeFlag{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_ChallengeFlag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_ChallengeFlag) ProtoMessage() {} + +func (x *GameEvent_ChallengeFlag) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_ChallengeFlag.ProtoReflect.Descriptor instead. +func (*GameEvent_ChallengeFlag) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 33} +} + +func (x *GameEvent_ChallengeFlag) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// An emergency stop, requested by team previously, occurred +type GameEvent_EmergencyStop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that substitutes robots + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` +} + +func (x *GameEvent_EmergencyStop) Reset() { + *x = GameEvent_EmergencyStop{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_EmergencyStop) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_EmergencyStop) ProtoMessage() {} + +func (x *GameEvent_EmergencyStop) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_EmergencyStop.ProtoReflect.Descriptor instead. +func (*GameEvent_EmergencyStop) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 34} +} + +func (x *GameEvent_EmergencyStop) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +// a team has too many robots on the field +type GameEvent_TooManyRobots struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that has too many robots + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // number of robots allowed at the moment + NumRobotsAllowed *int32 `protobuf:"varint,2,opt,name=num_robots_allowed,json=numRobotsAllowed" json:"num_robots_allowed,omitempty"` + // number of robots currently on the field + NumRobotsOnField *int32 `protobuf:"varint,3,opt,name=num_robots_on_field,json=numRobotsOnField" json:"num_robots_on_field,omitempty"` + // the location of the ball at the moment when this foul occurred [m] + BallLocation *geom.Vector2 `protobuf:"bytes,4,opt,name=ball_location,json=ballLocation" json:"ball_location,omitempty"` +} + +func (x *GameEvent_TooManyRobots) Reset() { + *x = GameEvent_TooManyRobots{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_TooManyRobots) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_TooManyRobots) ProtoMessage() {} + +func (x *GameEvent_TooManyRobots) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_TooManyRobots.ProtoReflect.Descriptor instead. +func (*GameEvent_TooManyRobots) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 35} +} + +func (x *GameEvent_TooManyRobots) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_TooManyRobots) GetNumRobotsAllowed() int32 { + if x != nil && x.NumRobotsAllowed != nil { + return *x.NumRobotsAllowed + } + return 0 +} + +func (x *GameEvent_TooManyRobots) GetNumRobotsOnField() int32 { + if x != nil && x.NumRobotsOnField != nil { + return *x.NumRobotsOnField + } + return 0 +} + +func (x *GameEvent_TooManyRobots) GetBallLocation() *geom.Vector2 { + if x != nil { + return x.BallLocation + } + return nil +} + +// a robot chipped the ball over the field boundary out of the playing surface +type GameEvent_BoundaryCrossing struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that has too many robots + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the location of the ball [m] + Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_BoundaryCrossing) Reset() { + *x = GameEvent_BoundaryCrossing{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_BoundaryCrossing) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_BoundaryCrossing) ProtoMessage() {} + +func (x *GameEvent_BoundaryCrossing) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_BoundaryCrossing.ProtoReflect.Descriptor instead. +func (*GameEvent_BoundaryCrossing) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 36} +} + +func (x *GameEvent_BoundaryCrossing) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_BoundaryCrossing) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +// the penalty kick failed (by time or by keeper) +type GameEvent_PenaltyKickFailed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the team that last touched the ball + ByTeam *Team `protobuf:"varint,1,req,name=by_team,json=byTeam,enum=Team" json:"by_team,omitempty"` + // the location of the ball at the moment of this event [m] + Location *geom.Vector2 `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"` +} + +func (x *GameEvent_PenaltyKickFailed) Reset() { + *x = GameEvent_PenaltyKickFailed{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_game_event_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEvent_PenaltyKickFailed) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEvent_PenaltyKickFailed) ProtoMessage() {} + +func (x *GameEvent_PenaltyKickFailed) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_game_event_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEvent_PenaltyKickFailed.ProtoReflect.Descriptor instead. +func (*GameEvent_PenaltyKickFailed) Descriptor() ([]byte, []int) { + return file_ssl_gc_game_event_proto_rawDescGZIP(), []int{0, 37} +} + +func (x *GameEvent_PenaltyKickFailed) GetByTeam() Team { + if x != nil && x.ByTeam != nil { + return *x.ByTeam + } + return Team_UNKNOWN +} + +func (x *GameEvent_PenaltyKickFailed) GetLocation() *geom.Vector2 { + if x != nil { + return x.Location + } + return nil +} + +var File_ssl_gc_game_event_proto protoreflect.FileDescriptor + +var file_ssl_gc_game_event_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67, + 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, + 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfa, 0x4e, 0x0a, 0x09, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x18, 0x29, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x12, 0x56, 0x0a, 0x1a, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x48, 0x00, + 0x52, 0x16, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, + 0x6f, 0x75, 0x63, 0x68, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x54, 0x0a, 0x19, 0x62, 0x61, 0x6c, 0x6c, + 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, + 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, 0x74, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x15, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x66, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x3b, + 0x0a, 0x0c, 0x61, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x41, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x4b, 0x69, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b, + 0x61, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, 0x4b, 0x69, 0x63, 0x6b, 0x12, 0x75, 0x0a, 0x22, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, + 0x61, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, + 0x61, 0x48, 0x00, 0x52, 0x1d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, + 0x65, 0x61, 0x12, 0x5b, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, + 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x48, 0x00, 0x52, 0x15, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, + 0x4a, 0x0a, 0x11, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x72, 0x6f, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x61, 0x72, 0x79, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x45, 0x0a, 0x10, 0x6b, + 0x65, 0x65, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, + 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, + 0x6c, 0x6c, 0x12, 0x5c, 0x0a, 0x19, 0x62, 0x6f, 0x74, 0x5f, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c, + 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x66, 0x61, 0x72, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x44, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c, + 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72, 0x48, 0x00, 0x52, 0x15, 0x62, 0x6f, 0x74, 0x44, 0x72, + 0x69, 0x62, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72, + 0x12, 0x3f, 0x0a, 0x0e, 0x62, 0x6f, 0x74, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x62, + 0x6f, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f, + 0x74, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f, + 0x74, 0x12, 0x61, 0x0a, 0x1a, 0x62, 0x6f, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x61, + 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c, + 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x17, 0x62, 0x6f, 0x74, + 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x79, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x6f, 0x74, 0x54, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x25, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, + 0x6c, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, + 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, + 0x41, 0x72, 0x65, 0x61, 0x48, 0x00, 0x52, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x44, 0x65, 0x66, + 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x59, 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f, + 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, + 0x66, 0x61, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x4b, 0x69, 0x63, 0x6b, 0x65, 0x64, + 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x62, + 0x6f, 0x74, 0x4b, 0x69, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, + 0x61, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, + 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x43, 0x72, 0x61, + 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x74, 0x43, + 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x6f, + 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x42, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x48, 0x00, 0x52, + 0x0d, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x6f, + 0x0a, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x1b, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x4d, 0x0a, 0x14, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x5f, 0x66, 0x61, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x6f, 0x6f, + 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6f, + 0x74, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x5d, + 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x62, 0x6f, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, + 0x0d, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x47, 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0c, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x2c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x6f, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x47, 0x6f, + 0x61, 0x6c, 0x12, 0x67, 0x0a, 0x1c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x61, + 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x48, 0x00, + 0x52, 0x19, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x50, 0x0a, 0x13, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x4e, 0x0a, + 0x13, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69, + 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x4b, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, + 0x13, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x5f, + 0x67, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x6f, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x6f, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x5f, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, + 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x43, 0x61, 0x72, 0x64, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x75, 0x6c, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6f, + 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x25, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x42, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0f, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x6f, 0x6f, 0x5f, 0x6d, 0x61, 0x6e, 0x79, 0x5f, + 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, + 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, + 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, + 0x79, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6c, + 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x68, 0x61, + 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x2f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x0d, + 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x60, 0x0a, + 0x19, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, + 0x69, 0x6e, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, + 0x60, 0x0a, 0x19, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x24, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x61, 0x6a, 0x6f, + 0x72, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x08, + 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0c, + 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x3f, 0x0a, 0x0c, + 0x63, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, + 0x52, 0x0b, 0x63, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x3f, 0x0a, + 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x4b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, + 0x00, 0x52, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x8e, + 0x01, 0x0a, 0x29, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x5f, + 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, + 0x72, 0x65, 0x61, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, + 0x9d, 0x01, 0x0a, 0x31, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x75, + 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x5f, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x5f, 0x73, 0x6b, + 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x47, 0x61, + 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x42, 0x02, 0x18, 0x01, + 0x48, 0x00, 0x52, 0x2b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, + 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x66, + 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, + 0x58, 0x0a, 0x18, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x5f, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, + 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x42, 0x02, 0x18, 0x01, + 0x48, 0x00, 0x52, 0x15, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x16, 0x62, 0x6f, 0x74, + 0x5f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x61, 0x6d, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, + 0x6f, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x13, 0x62, 0x6f, 0x74, 0x50, 0x75, 0x73, + 0x68, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x7b, 0x0a, + 0x22, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x66, + 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x6c, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x47, 0x61, 0x6d, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x6c, 0x79, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x65, 0x66, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, + 0x61, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x6a, 0x0a, 0x1b, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x6c, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x6c, 0x4c, 0x65, + 0x66, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, + 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x99, 0x01, 0x0a, 0x0b, 0x41, 0x69, 0x6d, 0x6c, 0x65, 0x73, 0x73, + 0x4b, 0x69, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, + 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, + 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0xe2, 0x02, 0x0a, 0x04, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x28, 0x0a, 0x0c, 0x6b, 0x69, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, + 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x62, + 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6b, 0x69, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, + 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69, + 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63, + 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x42, 0x61, 0x6c, 0x6c, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, + 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x6e, + 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x42, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2b, + 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x5f, 0x62, 0x79, 0x5f, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x42, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x9a, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, + 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, + 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0xc1, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x47, 0x6f, + 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, + 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x0d, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, + 0x52, 0x0c, 0x6b, 0x69, 0x63, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, + 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x42, 0x61, 0x6c, 0x6c, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x10, 0x42, 0x6f, 0x74, 0x54, 0x6f, + 0x6f, 0x46, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x62, + 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, + 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, + 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x1a, 0x96, + 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x54, 0x6f, 0x4b, 0x69, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, + 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xd0, 0x01, 0x0a, 0x0d, 0x42, 0x6f, 0x74, 0x43, + 0x72, 0x61, 0x73, 0x68, 0x44, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x74, + 0x5f, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, + 0x6f, 0x74, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, + 0x62, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x42, + 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, + 0x73, 0x68, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, + 0x63, 0x72, 0x61, 0x73, 0x68, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, + 0x73, 0x68, 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, + 0x63, 0x72, 0x61, 0x73, 0x68, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x1a, 0xeb, 0x01, 0x0a, 0x0e, 0x42, + 0x6f, 0x74, 0x43, 0x72, 0x61, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x1e, 0x0a, + 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x0a, + 0x08, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63, + 0x74, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, + 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, 0x73, 0x68, + 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x72, + 0x61, 0x73, 0x68, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x61, 0x73, 0x68, + 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x72, + 0x61, 0x73, 0x68, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x1a, 0xb1, 0x01, 0x0a, 0x0c, 0x42, 0x6f, 0x74, + 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x69, 0x6f, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x69, 0x6f, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x12, 0x24, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x70, 0x75, + 0x73, 0x68, 0x65, 0x64, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x9b, 0x01, 0x0a, + 0x0d, 0x42, 0x6f, 0x74, 0x54, 0x69, 0x70, 0x70, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, + 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x62, + 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61, + 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x90, 0x01, 0x0a, 0x15, 0x44, + 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, + 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, + 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, + 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xc8, 0x01, + 0x0a, 0x1e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, + 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, + 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, + 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, + 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c, + 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x9b, 0x01, 0x0a, 0x20, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, + 0x49, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, + 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, + 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, + 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0xbb, 0x01, 0x0a, 0x14, 0x42, 0x6f, 0x74, 0x4b, 0x69, + 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, + 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x70, 0x65, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x42, 0x61, 0x6c, 0x6c, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, + 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x68, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x1a, 0x8a, 0x01, 0x0a, 0x15, 0x42, 0x6f, 0x74, 0x44, 0x72, 0x69, 0x62, + 0x62, 0x6c, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x6f, 0x46, 0x61, 0x72, 0x12, 0x1e, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, + 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x65, 0x6e, + 0x64, 0x1a, 0x9b, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, + 0x75, 0x63, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x44, + 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, + 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, + 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x78, 0x0a, 0x19, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x44, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x07, + 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, + 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, + 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xc7, 0x01, 0x0a, 0x1d, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x6f, + 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x41, 0x72, 0x65, 0x61, 0x12, 0x1e, 0x0a, 0x07, 0x62, + 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, + 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, + 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x92, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x64, 0x42, + 0x61, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x12, + 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, + 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x75, 0x0a, 0x16, 0x42, 0x6f, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, + 0x61, 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x79, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x62, 0x79, 0x42, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x2f, 0x0a, 0x0d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x43, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, + 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, + 0x1a, 0x2f, 0x0a, 0x0d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x75, 0x6c, + 0x73, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, + 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, + 0x6d, 0x1a, 0x3b, 0x0a, 0x19, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x50, 0x6c, 0x61, + 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x1a, 0x67, + 0x0a, 0x0b, 0x4b, 0x69, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1e, 0x0a, + 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x24, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x4c, 0x0a, 0x10, 0x4e, 0x6f, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x60, 0x0a, 0x0f, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x6d, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x44, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x51, 0x0a, 0x17, 0x55, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4d, 0x69, 0x6e, + 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, + 0x61, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x02, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x51, 0x0a, 0x17, 0x55, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, + 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, + 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x02, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x72, 0x0a, + 0x0e, 0x4b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, + 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, + 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x8d, 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x70, 0x72, 0x65, 0x63, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x1a, 0x29, 0x0a, 0x08, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x1a, 0x31, 0x0a, 0x0f, + 0x42, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, + 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x1a, + 0x2f, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x46, 0x6c, 0x61, 0x67, + 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, + 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, + 0x1a, 0x2f, 0x0a, 0x0d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, + 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, + 0x6d, 0x1a, 0xbb, 0x01, 0x0a, 0x0d, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x6f, 0x62, + 0x6f, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, + 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, + 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, + 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, + 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, + 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x4f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x2d, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x32, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x58, 0x0a, 0x10, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x72, 0x6f, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, + 0x20, 0x02, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, + 0x65, 0x61, 0x6d, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x59, 0x0a, 0x11, 0x50, 0x65, 0x6e, + 0x61, 0x6c, 0x74, 0x79, 0x4b, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x05, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x62, 0x79, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x24, + 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe2, 0x09, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, + 0x17, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x41, + 0x4c, 0x4c, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x4f, + 0x55, 0x43, 0x48, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x41, + 0x4c, 0x4c, 0x5f, 0x4c, 0x45, 0x46, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x47, 0x4f, + 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x49, 0x4d, + 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x41, + 0x54, 0x54, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x43, 0x4c, 0x4f, 0x53, + 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, + 0x41, 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, + 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10, + 0x1f, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x41, 0x52, 0x59, 0x5f, 0x43, 0x52, + 0x4f, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x29, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x45, 0x45, 0x50, + 0x45, 0x52, 0x5f, 0x48, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x10, 0x0d, 0x12, 0x1d, + 0x0a, 0x19, 0x42, 0x4f, 0x54, 0x5f, 0x44, 0x52, 0x49, 0x42, 0x42, 0x4c, 0x45, 0x44, 0x5f, 0x42, + 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x52, 0x10, 0x11, 0x12, 0x12, 0x0a, + 0x0e, 0x42, 0x4f, 0x54, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10, + 0x18, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x4f, 0x54, 0x5f, 0x48, 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x41, + 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x42, 0x45, 0x52, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10, + 0x1a, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, 0x54, 0x5f, 0x54, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, + 0x4f, 0x56, 0x45, 0x52, 0x10, 0x1b, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, + 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x5f, + 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10, + 0x0f, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x54, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x45, 0x44, 0x5f, + 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x53, 0x54, 0x10, 0x12, 0x12, + 0x14, 0x0a, 0x10, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x41, 0x53, 0x48, 0x5f, 0x55, 0x4e, 0x49, + 0x51, 0x55, 0x45, 0x10, 0x16, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x41, + 0x53, 0x48, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x4e, 0x10, 0x15, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45, + 0x46, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x5f, 0x54, 0x4f, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x1d, + 0x12, 0x18, 0x0a, 0x14, 0x42, 0x4f, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x46, 0x41, 0x53, 0x54, + 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x1c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, + 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x4c, 0x41, + 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x53, 0x53, + 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x27, 0x12, 0x08, 0x0a, 0x04, 0x47, + 0x4f, 0x41, 0x4c, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x2a, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x54, 0x54, 0x41, 0x43, + 0x4b, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, + 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4c, 0x41, + 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, + 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x4b, 0x49, + 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x2b, 0x12, 0x17, 0x0a, 0x13, 0x4e, + 0x4f, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x47, 0x41, + 0x4d, 0x45, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, + 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x55, + 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x53, 0x10, 0x20, 0x12, 0x12, + 0x0a, 0x0e, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x46, 0x4f, 0x55, 0x4c, 0x53, + 0x10, 0x22, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x54, 0x49, + 0x54, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x4f, 0x4f, 0x5f, + 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x52, 0x4f, 0x42, 0x4f, 0x54, 0x53, 0x10, 0x26, 0x12, 0x12, 0x0a, + 0x0e, 0x43, 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x2c, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x53, + 0x54, 0x4f, 0x50, 0x10, 0x2d, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x53, 0x50, 0x4f, 0x52, 0x54, + 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x4e, + 0x4f, 0x52, 0x10, 0x23, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x53, 0x50, 0x4f, 0x52, 0x54, 0x49, + 0x4e, 0x47, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x4a, 0x4f, + 0x52, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x08, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x44, 0x10, + 0x01, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, + 0x54, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x09, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x14, 0x0a, 0x0c, + 0x43, 0x48, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x47, 0x4f, 0x41, 0x4c, 0x10, 0x0a, 0x1a, 0x02, + 0x08, 0x01, 0x12, 0x14, 0x0a, 0x0c, 0x4b, 0x49, 0x43, 0x4b, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, + 0x55, 0x54, 0x10, 0x0c, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x31, 0x0a, 0x29, 0x41, 0x54, 0x54, 0x41, + 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x4f, 0x50, 0x50, + 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, + 0x5f, 0x41, 0x52, 0x45, 0x41, 0x10, 0x10, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x39, 0x0a, 0x31, 0x41, + 0x54, 0x54, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x55, 0x43, 0x48, 0x45, 0x44, 0x5f, + 0x4f, 0x50, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, + 0x4e, 0x53, 0x45, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, + 0x10, 0x28, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x20, 0x0a, 0x18, 0x42, 0x4f, 0x54, 0x5f, 0x43, 0x52, + 0x41, 0x53, 0x48, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x17, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x1e, 0x0a, 0x16, 0x42, 0x4f, 0x54, 0x5f, + 0x50, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x19, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x2a, 0x0a, 0x22, 0x44, 0x45, 0x46, 0x45, + 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x4e, 0x53, 0x45, 0x5f, + 0x41, 0x52, 0x45, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x10, 0x1e, + 0x1a, 0x02, 0x08, 0x01, 0x12, 0x23, 0x0a, 0x1b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, + 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, + 0x52, 0x45, 0x53, 0x10, 0x21, 0x1a, 0x02, 0x08, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, + 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, +} + +var ( + file_ssl_gc_game_event_proto_rawDescOnce sync.Once + file_ssl_gc_game_event_proto_rawDescData = file_ssl_gc_game_event_proto_rawDesc +) + +func file_ssl_gc_game_event_proto_rawDescGZIP() []byte { + file_ssl_gc_game_event_proto_rawDescOnce.Do(func() { + file_ssl_gc_game_event_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_game_event_proto_rawDescData) + }) + return file_ssl_gc_game_event_proto_rawDescData +} + +var file_ssl_gc_game_event_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_ssl_gc_game_event_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_ssl_gc_game_event_proto_goTypes = []interface{}{ + (GameEvent_Type)(0), // 0: GameEvent.Type + (*GameEvent)(nil), // 1: GameEvent + (*GameEvent_BallLeftField)(nil), // 2: GameEvent.BallLeftField + (*GameEvent_AimlessKick)(nil), // 3: GameEvent.AimlessKick + (*GameEvent_Goal)(nil), // 4: GameEvent.Goal + (*GameEvent_IndirectGoal)(nil), // 5: GameEvent.IndirectGoal + (*GameEvent_ChippedGoal)(nil), // 6: GameEvent.ChippedGoal + (*GameEvent_BotTooFastInStop)(nil), // 7: GameEvent.BotTooFastInStop + (*GameEvent_DefenderTooCloseToKickPoint)(nil), // 8: GameEvent.DefenderTooCloseToKickPoint + (*GameEvent_BotCrashDrawn)(nil), // 9: GameEvent.BotCrashDrawn + (*GameEvent_BotCrashUnique)(nil), // 10: GameEvent.BotCrashUnique + (*GameEvent_BotPushedBot)(nil), // 11: GameEvent.BotPushedBot + (*GameEvent_BotTippedOver)(nil), // 12: GameEvent.BotTippedOver + (*GameEvent_DefenderInDefenseArea)(nil), // 13: GameEvent.DefenderInDefenseArea + (*GameEvent_DefenderInDefenseAreaPartially)(nil), // 14: GameEvent.DefenderInDefenseAreaPartially + (*GameEvent_AttackerTouchedBallInDefenseArea)(nil), // 15: GameEvent.AttackerTouchedBallInDefenseArea + (*GameEvent_BotKickedBallTooFast)(nil), // 16: GameEvent.BotKickedBallTooFast + (*GameEvent_BotDribbledBallTooFar)(nil), // 17: GameEvent.BotDribbledBallTooFar + (*GameEvent_AttackerTouchedOpponentInDefenseArea)(nil), // 18: GameEvent.AttackerTouchedOpponentInDefenseArea + (*GameEvent_AttackerDoubleTouchedBall)(nil), // 19: GameEvent.AttackerDoubleTouchedBall + (*GameEvent_AttackerTooCloseToDefenseArea)(nil), // 20: GameEvent.AttackerTooCloseToDefenseArea + (*GameEvent_BotHeldBallDeliberately)(nil), // 21: GameEvent.BotHeldBallDeliberately + (*GameEvent_BotInterferedPlacement)(nil), // 22: GameEvent.BotInterferedPlacement + (*GameEvent_MultipleCards)(nil), // 23: GameEvent.MultipleCards + (*GameEvent_MultipleFouls)(nil), // 24: GameEvent.MultipleFouls + (*GameEvent_MultiplePlacementFailures)(nil), // 25: GameEvent.MultiplePlacementFailures + (*GameEvent_KickTimeout)(nil), // 26: GameEvent.KickTimeout + (*GameEvent_NoProgressInGame)(nil), // 27: GameEvent.NoProgressInGame + (*GameEvent_PlacementFailed)(nil), // 28: GameEvent.PlacementFailed + (*GameEvent_UnsportingBehaviorMinor)(nil), // 29: GameEvent.UnsportingBehaviorMinor + (*GameEvent_UnsportingBehaviorMajor)(nil), // 30: GameEvent.UnsportingBehaviorMajor + (*GameEvent_KeeperHeldBall)(nil), // 31: GameEvent.KeeperHeldBall + (*GameEvent_PlacementSucceeded)(nil), // 32: GameEvent.PlacementSucceeded + (*GameEvent_Prepared)(nil), // 33: GameEvent.Prepared + (*GameEvent_BotSubstitution)(nil), // 34: GameEvent.BotSubstitution + (*GameEvent_ChallengeFlag)(nil), // 35: GameEvent.ChallengeFlag + (*GameEvent_EmergencyStop)(nil), // 36: GameEvent.EmergencyStop + (*GameEvent_TooManyRobots)(nil), // 37: GameEvent.TooManyRobots + (*GameEvent_BoundaryCrossing)(nil), // 38: GameEvent.BoundaryCrossing + (*GameEvent_PenaltyKickFailed)(nil), // 39: GameEvent.PenaltyKickFailed + (Team)(0), // 40: Team + (*geom.Vector2)(nil), // 41: Vector2 +} +var file_ssl_gc_game_event_proto_depIdxs = []int32{ + 0, // 0: GameEvent.type:type_name -> GameEvent.Type + 2, // 1: GameEvent.ball_left_field_touch_line:type_name -> GameEvent.BallLeftField + 2, // 2: GameEvent.ball_left_field_goal_line:type_name -> GameEvent.BallLeftField + 3, // 3: GameEvent.aimless_kick:type_name -> GameEvent.AimlessKick + 20, // 4: GameEvent.attacker_too_close_to_defense_area:type_name -> GameEvent.AttackerTooCloseToDefenseArea + 13, // 5: GameEvent.defender_in_defense_area:type_name -> GameEvent.DefenderInDefenseArea + 38, // 6: GameEvent.boundary_crossing:type_name -> GameEvent.BoundaryCrossing + 31, // 7: GameEvent.keeper_held_ball:type_name -> GameEvent.KeeperHeldBall + 17, // 8: GameEvent.bot_dribbled_ball_too_far:type_name -> GameEvent.BotDribbledBallTooFar + 11, // 9: GameEvent.bot_pushed_bot:type_name -> GameEvent.BotPushedBot + 21, // 10: GameEvent.bot_held_ball_deliberately:type_name -> GameEvent.BotHeldBallDeliberately + 12, // 11: GameEvent.bot_tipped_over:type_name -> GameEvent.BotTippedOver + 15, // 12: GameEvent.attacker_touched_ball_in_defense_area:type_name -> GameEvent.AttackerTouchedBallInDefenseArea + 16, // 13: GameEvent.bot_kicked_ball_too_fast:type_name -> GameEvent.BotKickedBallTooFast + 10, // 14: GameEvent.bot_crash_unique:type_name -> GameEvent.BotCrashUnique + 9, // 15: GameEvent.bot_crash_drawn:type_name -> GameEvent.BotCrashDrawn + 8, // 16: GameEvent.defender_too_close_to_kick_point:type_name -> GameEvent.DefenderTooCloseToKickPoint + 7, // 17: GameEvent.bot_too_fast_in_stop:type_name -> GameEvent.BotTooFastInStop + 22, // 18: GameEvent.bot_interfered_placement:type_name -> GameEvent.BotInterferedPlacement + 4, // 19: GameEvent.possible_goal:type_name -> GameEvent.Goal + 4, // 20: GameEvent.goal:type_name -> GameEvent.Goal + 4, // 21: GameEvent.invalid_goal:type_name -> GameEvent.Goal + 19, // 22: GameEvent.attacker_double_touched_ball:type_name -> GameEvent.AttackerDoubleTouchedBall + 32, // 23: GameEvent.placement_succeeded:type_name -> GameEvent.PlacementSucceeded + 39, // 24: GameEvent.penalty_kick_failed:type_name -> GameEvent.PenaltyKickFailed + 27, // 25: GameEvent.no_progress_in_game:type_name -> GameEvent.NoProgressInGame + 28, // 26: GameEvent.placement_failed:type_name -> GameEvent.PlacementFailed + 23, // 27: GameEvent.multiple_cards:type_name -> GameEvent.MultipleCards + 24, // 28: GameEvent.multiple_fouls:type_name -> GameEvent.MultipleFouls + 34, // 29: GameEvent.bot_substitution:type_name -> GameEvent.BotSubstitution + 37, // 30: GameEvent.too_many_robots:type_name -> GameEvent.TooManyRobots + 35, // 31: GameEvent.challenge_flag:type_name -> GameEvent.ChallengeFlag + 36, // 32: GameEvent.emergency_stop:type_name -> GameEvent.EmergencyStop + 29, // 33: GameEvent.unsporting_behavior_minor:type_name -> GameEvent.UnsportingBehaviorMinor + 30, // 34: GameEvent.unsporting_behavior_major:type_name -> GameEvent.UnsportingBehaviorMajor + 33, // 35: GameEvent.prepared:type_name -> GameEvent.Prepared + 5, // 36: GameEvent.indirect_goal:type_name -> GameEvent.IndirectGoal + 6, // 37: GameEvent.chipped_goal:type_name -> GameEvent.ChippedGoal + 26, // 38: GameEvent.kick_timeout:type_name -> GameEvent.KickTimeout + 18, // 39: GameEvent.attacker_touched_opponent_in_defense_area:type_name -> GameEvent.AttackerTouchedOpponentInDefenseArea + 18, // 40: GameEvent.attacker_touched_opponent_in_defense_area_skipped:type_name -> GameEvent.AttackerTouchedOpponentInDefenseArea + 10, // 41: GameEvent.bot_crash_unique_skipped:type_name -> GameEvent.BotCrashUnique + 11, // 42: GameEvent.bot_pushed_bot_skipped:type_name -> GameEvent.BotPushedBot + 14, // 43: GameEvent.defender_in_defense_area_partially:type_name -> GameEvent.DefenderInDefenseAreaPartially + 25, // 44: GameEvent.multiple_placement_failures:type_name -> GameEvent.MultiplePlacementFailures + 40, // 45: GameEvent.BallLeftField.by_team:type_name -> Team + 41, // 46: GameEvent.BallLeftField.location:type_name -> Vector2 + 40, // 47: GameEvent.AimlessKick.by_team:type_name -> Team + 41, // 48: GameEvent.AimlessKick.location:type_name -> Vector2 + 41, // 49: GameEvent.AimlessKick.kick_location:type_name -> Vector2 + 40, // 50: GameEvent.Goal.by_team:type_name -> Team + 40, // 51: GameEvent.Goal.kicking_team:type_name -> Team + 41, // 52: GameEvent.Goal.location:type_name -> Vector2 + 41, // 53: GameEvent.Goal.kick_location:type_name -> Vector2 + 40, // 54: GameEvent.IndirectGoal.by_team:type_name -> Team + 41, // 55: GameEvent.IndirectGoal.location:type_name -> Vector2 + 41, // 56: GameEvent.IndirectGoal.kick_location:type_name -> Vector2 + 40, // 57: GameEvent.ChippedGoal.by_team:type_name -> Team + 41, // 58: GameEvent.ChippedGoal.location:type_name -> Vector2 + 41, // 59: GameEvent.ChippedGoal.kick_location:type_name -> Vector2 + 40, // 60: GameEvent.BotTooFastInStop.by_team:type_name -> Team + 41, // 61: GameEvent.BotTooFastInStop.location:type_name -> Vector2 + 40, // 62: GameEvent.DefenderTooCloseToKickPoint.by_team:type_name -> Team + 41, // 63: GameEvent.DefenderTooCloseToKickPoint.location:type_name -> Vector2 + 41, // 64: GameEvent.BotCrashDrawn.location:type_name -> Vector2 + 40, // 65: GameEvent.BotCrashUnique.by_team:type_name -> Team + 41, // 66: GameEvent.BotCrashUnique.location:type_name -> Vector2 + 40, // 67: GameEvent.BotPushedBot.by_team:type_name -> Team + 41, // 68: GameEvent.BotPushedBot.location:type_name -> Vector2 + 40, // 69: GameEvent.BotTippedOver.by_team:type_name -> Team + 41, // 70: GameEvent.BotTippedOver.location:type_name -> Vector2 + 41, // 71: GameEvent.BotTippedOver.ball_location:type_name -> Vector2 + 40, // 72: GameEvent.DefenderInDefenseArea.by_team:type_name -> Team + 41, // 73: GameEvent.DefenderInDefenseArea.location:type_name -> Vector2 + 40, // 74: GameEvent.DefenderInDefenseAreaPartially.by_team:type_name -> Team + 41, // 75: GameEvent.DefenderInDefenseAreaPartially.location:type_name -> Vector2 + 41, // 76: GameEvent.DefenderInDefenseAreaPartially.ball_location:type_name -> Vector2 + 40, // 77: GameEvent.AttackerTouchedBallInDefenseArea.by_team:type_name -> Team + 41, // 78: GameEvent.AttackerTouchedBallInDefenseArea.location:type_name -> Vector2 + 40, // 79: GameEvent.BotKickedBallTooFast.by_team:type_name -> Team + 41, // 80: GameEvent.BotKickedBallTooFast.location:type_name -> Vector2 + 40, // 81: GameEvent.BotDribbledBallTooFar.by_team:type_name -> Team + 41, // 82: GameEvent.BotDribbledBallTooFar.start:type_name -> Vector2 + 41, // 83: GameEvent.BotDribbledBallTooFar.end:type_name -> Vector2 + 40, // 84: GameEvent.AttackerTouchedOpponentInDefenseArea.by_team:type_name -> Team + 41, // 85: GameEvent.AttackerTouchedOpponentInDefenseArea.location:type_name -> Vector2 + 40, // 86: GameEvent.AttackerDoubleTouchedBall.by_team:type_name -> Team + 41, // 87: GameEvent.AttackerDoubleTouchedBall.location:type_name -> Vector2 + 40, // 88: GameEvent.AttackerTooCloseToDefenseArea.by_team:type_name -> Team + 41, // 89: GameEvent.AttackerTooCloseToDefenseArea.location:type_name -> Vector2 + 41, // 90: GameEvent.AttackerTooCloseToDefenseArea.ball_location:type_name -> Vector2 + 40, // 91: GameEvent.BotHeldBallDeliberately.by_team:type_name -> Team + 41, // 92: GameEvent.BotHeldBallDeliberately.location:type_name -> Vector2 + 40, // 93: GameEvent.BotInterferedPlacement.by_team:type_name -> Team + 41, // 94: GameEvent.BotInterferedPlacement.location:type_name -> Vector2 + 40, // 95: GameEvent.MultipleCards.by_team:type_name -> Team + 40, // 96: GameEvent.MultipleFouls.by_team:type_name -> Team + 40, // 97: GameEvent.MultiplePlacementFailures.by_team:type_name -> Team + 40, // 98: GameEvent.KickTimeout.by_team:type_name -> Team + 41, // 99: GameEvent.KickTimeout.location:type_name -> Vector2 + 41, // 100: GameEvent.NoProgressInGame.location:type_name -> Vector2 + 40, // 101: GameEvent.PlacementFailed.by_team:type_name -> Team + 40, // 102: GameEvent.UnsportingBehaviorMinor.by_team:type_name -> Team + 40, // 103: GameEvent.UnsportingBehaviorMajor.by_team:type_name -> Team + 40, // 104: GameEvent.KeeperHeldBall.by_team:type_name -> Team + 41, // 105: GameEvent.KeeperHeldBall.location:type_name -> Vector2 + 40, // 106: GameEvent.PlacementSucceeded.by_team:type_name -> Team + 40, // 107: GameEvent.BotSubstitution.by_team:type_name -> Team + 40, // 108: GameEvent.ChallengeFlag.by_team:type_name -> Team + 40, // 109: GameEvent.EmergencyStop.by_team:type_name -> Team + 40, // 110: GameEvent.TooManyRobots.by_team:type_name -> Team + 41, // 111: GameEvent.TooManyRobots.ball_location:type_name -> Vector2 + 40, // 112: GameEvent.BoundaryCrossing.by_team:type_name -> Team + 41, // 113: GameEvent.BoundaryCrossing.location:type_name -> Vector2 + 40, // 114: GameEvent.PenaltyKickFailed.by_team:type_name -> Team + 41, // 115: GameEvent.PenaltyKickFailed.location:type_name -> Vector2 + 116, // [116:116] is the sub-list for method output_type + 116, // [116:116] is the sub-list for method input_type + 116, // [116:116] is the sub-list for extension type_name + 116, // [116:116] is the sub-list for extension extendee + 0, // [0:116] is the sub-list for field type_name +} + +func init() { file_ssl_gc_game_event_proto_init() } +func file_ssl_gc_game_event_proto_init() { + if File_ssl_gc_game_event_proto != nil { + return + } + file_ssl_gc_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_ssl_gc_game_event_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BallLeftField); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_AimlessKick); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_Goal); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_IndirectGoal); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_ChippedGoal); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotTooFastInStop); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_DefenderTooCloseToKickPoint); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotCrashDrawn); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotCrashUnique); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotPushedBot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotTippedOver); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_DefenderInDefenseArea); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_DefenderInDefenseAreaPartially); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_AttackerTouchedBallInDefenseArea); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotKickedBallTooFast); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotDribbledBallTooFar); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_AttackerTouchedOpponentInDefenseArea); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_AttackerDoubleTouchedBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_AttackerTooCloseToDefenseArea); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotHeldBallDeliberately); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotInterferedPlacement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_MultipleCards); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_MultipleFouls); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_MultiplePlacementFailures); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_KickTimeout); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_NoProgressInGame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_PlacementFailed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_UnsportingBehaviorMinor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_UnsportingBehaviorMajor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_KeeperHeldBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_PlacementSucceeded); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_Prepared); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BotSubstitution); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_ChallengeFlag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_EmergencyStop); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_TooManyRobots); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_BoundaryCrossing); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_game_event_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEvent_PenaltyKickFailed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_ssl_gc_game_event_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*GameEvent_BallLeftFieldTouchLine)(nil), + (*GameEvent_BallLeftFieldGoalLine)(nil), + (*GameEvent_AimlessKick_)(nil), + (*GameEvent_AttackerTooCloseToDefenseArea_)(nil), + (*GameEvent_DefenderInDefenseArea_)(nil), + (*GameEvent_BoundaryCrossing_)(nil), + (*GameEvent_KeeperHeldBall_)(nil), + (*GameEvent_BotDribbledBallTooFar_)(nil), + (*GameEvent_BotPushedBot_)(nil), + (*GameEvent_BotHeldBallDeliberately_)(nil), + (*GameEvent_BotTippedOver_)(nil), + (*GameEvent_AttackerTouchedBallInDefenseArea_)(nil), + (*GameEvent_BotKickedBallTooFast_)(nil), + (*GameEvent_BotCrashUnique_)(nil), + (*GameEvent_BotCrashDrawn_)(nil), + (*GameEvent_DefenderTooCloseToKickPoint_)(nil), + (*GameEvent_BotTooFastInStop_)(nil), + (*GameEvent_BotInterferedPlacement_)(nil), + (*GameEvent_PossibleGoal)(nil), + (*GameEvent_Goal_)(nil), + (*GameEvent_InvalidGoal)(nil), + (*GameEvent_AttackerDoubleTouchedBall_)(nil), + (*GameEvent_PlacementSucceeded_)(nil), + (*GameEvent_PenaltyKickFailed_)(nil), + (*GameEvent_NoProgressInGame_)(nil), + (*GameEvent_PlacementFailed_)(nil), + (*GameEvent_MultipleCards_)(nil), + (*GameEvent_MultipleFouls_)(nil), + (*GameEvent_BotSubstitution_)(nil), + (*GameEvent_TooManyRobots_)(nil), + (*GameEvent_ChallengeFlag_)(nil), + (*GameEvent_EmergencyStop_)(nil), + (*GameEvent_UnsportingBehaviorMinor_)(nil), + (*GameEvent_UnsportingBehaviorMajor_)(nil), + (*GameEvent_Prepared_)(nil), + (*GameEvent_IndirectGoal_)(nil), + (*GameEvent_ChippedGoal_)(nil), + (*GameEvent_KickTimeout_)(nil), + (*GameEvent_AttackerTouchedOpponentInDefenseArea_)(nil), + (*GameEvent_AttackerTouchedOpponentInDefenseAreaSkipped)(nil), + (*GameEvent_BotCrashUniqueSkipped)(nil), + (*GameEvent_BotPushedBotSkipped)(nil), + (*GameEvent_DefenderInDefenseAreaPartially_)(nil), + (*GameEvent_MultiplePlacementFailures_)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_gc_game_event_proto_rawDesc, + NumEnums: 1, + NumMessages: 39, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_gc_game_event_proto_goTypes, + DependencyIndexes: file_ssl_gc_game_event_proto_depIdxs, + EnumInfos: file_ssl_gc_game_event_proto_enumTypes, + MessageInfos: file_ssl_gc_game_event_proto_msgTypes, + }.Build() + File_ssl_gc_game_event_proto = out.File + file_ssl_gc_game_event_proto_rawDesc = nil + file_ssl_gc_game_event_proto_goTypes = nil + file_ssl_gc_game_event_proto_depIdxs = nil +} diff --git a/internal/referee/ssl_gc_referee_message.pb.go b/internal/referee/ssl_gc_referee_message.pb.go new file mode 100644 index 0000000..121f14c --- /dev/null +++ b/internal/referee/ssl_gc_referee_message.pb.go @@ -0,0 +1,1006 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_gc_referee_message.proto + +package referee + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// These are the "coarse" stages of the game. +type Referee_Stage int32 + +const ( + // The first half is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + Referee_NORMAL_FIRST_HALF_PRE Referee_Stage = 0 + // The first half of the normal game, before half time. + Referee_NORMAL_FIRST_HALF Referee_Stage = 1 + // Half time between first and second halves. + Referee_NORMAL_HALF_TIME Referee_Stage = 2 + // The second half is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + Referee_NORMAL_SECOND_HALF_PRE Referee_Stage = 3 + // The second half of the normal game, after half time. + Referee_NORMAL_SECOND_HALF Referee_Stage = 4 + // The break before extra time. + Referee_EXTRA_TIME_BREAK Referee_Stage = 5 + // The first half of extra time is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + Referee_EXTRA_FIRST_HALF_PRE Referee_Stage = 6 + // The first half of extra time. + Referee_EXTRA_FIRST_HALF Referee_Stage = 7 + // Half time between first and second extra halves. + Referee_EXTRA_HALF_TIME Referee_Stage = 8 + // The second half of extra time is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + Referee_EXTRA_SECOND_HALF_PRE Referee_Stage = 9 + // The second half of extra time. + Referee_EXTRA_SECOND_HALF Referee_Stage = 10 + // The break before penalty shootout. + Referee_PENALTY_SHOOTOUT_BREAK Referee_Stage = 11 + // The penalty shootout. + Referee_PENALTY_SHOOTOUT Referee_Stage = 12 + // The game is over. + Referee_POST_GAME Referee_Stage = 13 +) + +// Enum value maps for Referee_Stage. +var ( + Referee_Stage_name = map[int32]string{ + 0: "NORMAL_FIRST_HALF_PRE", + 1: "NORMAL_FIRST_HALF", + 2: "NORMAL_HALF_TIME", + 3: "NORMAL_SECOND_HALF_PRE", + 4: "NORMAL_SECOND_HALF", + 5: "EXTRA_TIME_BREAK", + 6: "EXTRA_FIRST_HALF_PRE", + 7: "EXTRA_FIRST_HALF", + 8: "EXTRA_HALF_TIME", + 9: "EXTRA_SECOND_HALF_PRE", + 10: "EXTRA_SECOND_HALF", + 11: "PENALTY_SHOOTOUT_BREAK", + 12: "PENALTY_SHOOTOUT", + 13: "POST_GAME", + } + Referee_Stage_value = map[string]int32{ + "NORMAL_FIRST_HALF_PRE": 0, + "NORMAL_FIRST_HALF": 1, + "NORMAL_HALF_TIME": 2, + "NORMAL_SECOND_HALF_PRE": 3, + "NORMAL_SECOND_HALF": 4, + "EXTRA_TIME_BREAK": 5, + "EXTRA_FIRST_HALF_PRE": 6, + "EXTRA_FIRST_HALF": 7, + "EXTRA_HALF_TIME": 8, + "EXTRA_SECOND_HALF_PRE": 9, + "EXTRA_SECOND_HALF": 10, + "PENALTY_SHOOTOUT_BREAK": 11, + "PENALTY_SHOOTOUT": 12, + "POST_GAME": 13, + } +) + +func (x Referee_Stage) Enum() *Referee_Stage { + p := new(Referee_Stage) + *p = x + return p +} + +func (x Referee_Stage) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Referee_Stage) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_gc_referee_message_proto_enumTypes[0].Descriptor() +} + +func (Referee_Stage) Type() protoreflect.EnumType { + return &file_ssl_gc_referee_message_proto_enumTypes[0] +} + +func (x Referee_Stage) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Referee_Stage) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Referee_Stage(num) + return nil +} + +// Deprecated: Use Referee_Stage.Descriptor instead. +func (Referee_Stage) EnumDescriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 0} +} + +// These are the "fine" states of play on the field. +type Referee_Command int32 + +const ( + // All robots should completely stop moving. + Referee_HALT Referee_Command = 0 + // Robots must keep 50 cm from the ball. + Referee_STOP Referee_Command = 1 + // A prepared kickoff or penalty may now be taken. + Referee_NORMAL_START Referee_Command = 2 + // The ball is dropped and free for either team. + Referee_FORCE_START Referee_Command = 3 + // The yellow team may move into kickoff position. + Referee_PREPARE_KICKOFF_YELLOW Referee_Command = 4 + // The blue team may move into kickoff position. + Referee_PREPARE_KICKOFF_BLUE Referee_Command = 5 + // The yellow team may move into penalty position. + Referee_PREPARE_PENALTY_YELLOW Referee_Command = 6 + // The blue team may move into penalty position. + Referee_PREPARE_PENALTY_BLUE Referee_Command = 7 + // The yellow team may take a direct free kick. + Referee_DIRECT_FREE_YELLOW Referee_Command = 8 + // The blue team may take a direct free kick. + Referee_DIRECT_FREE_BLUE Referee_Command = 9 + // The yellow team may take an indirect free kick. + Referee_INDIRECT_FREE_YELLOW Referee_Command = 10 + // The blue team may take an indirect free kick. + Referee_INDIRECT_FREE_BLUE Referee_Command = 11 + // The yellow team is currently in a timeout. + Referee_TIMEOUT_YELLOW Referee_Command = 12 + // The blue team is currently in a timeout. + Referee_TIMEOUT_BLUE Referee_Command = 13 + // The yellow team just scored a goal. + // For information only. + // For rules compliance, teams must treat as STOP. + // Deprecated: Use the score field from the team infos instead. That way, you can also detect revoked goals. + // + // Deprecated: Do not use. + Referee_GOAL_YELLOW Referee_Command = 14 + // The blue team just scored a goal. See also GOAL_YELLOW. + // + // Deprecated: Do not use. + Referee_GOAL_BLUE Referee_Command = 15 + // Equivalent to STOP, but the yellow team must pick up the ball and + // drop it in the Designated Position. + Referee_BALL_PLACEMENT_YELLOW Referee_Command = 16 + // Equivalent to STOP, but the blue team must pick up the ball and drop + // it in the Designated Position. + Referee_BALL_PLACEMENT_BLUE Referee_Command = 17 +) + +// Enum value maps for Referee_Command. +var ( + Referee_Command_name = map[int32]string{ + 0: "HALT", + 1: "STOP", + 2: "NORMAL_START", + 3: "FORCE_START", + 4: "PREPARE_KICKOFF_YELLOW", + 5: "PREPARE_KICKOFF_BLUE", + 6: "PREPARE_PENALTY_YELLOW", + 7: "PREPARE_PENALTY_BLUE", + 8: "DIRECT_FREE_YELLOW", + 9: "DIRECT_FREE_BLUE", + 10: "INDIRECT_FREE_YELLOW", + 11: "INDIRECT_FREE_BLUE", + 12: "TIMEOUT_YELLOW", + 13: "TIMEOUT_BLUE", + 14: "GOAL_YELLOW", + 15: "GOAL_BLUE", + 16: "BALL_PLACEMENT_YELLOW", + 17: "BALL_PLACEMENT_BLUE", + } + Referee_Command_value = map[string]int32{ + "HALT": 0, + "STOP": 1, + "NORMAL_START": 2, + "FORCE_START": 3, + "PREPARE_KICKOFF_YELLOW": 4, + "PREPARE_KICKOFF_BLUE": 5, + "PREPARE_PENALTY_YELLOW": 6, + "PREPARE_PENALTY_BLUE": 7, + "DIRECT_FREE_YELLOW": 8, + "DIRECT_FREE_BLUE": 9, + "INDIRECT_FREE_YELLOW": 10, + "INDIRECT_FREE_BLUE": 11, + "TIMEOUT_YELLOW": 12, + "TIMEOUT_BLUE": 13, + "GOAL_YELLOW": 14, + "GOAL_BLUE": 15, + "BALL_PLACEMENT_YELLOW": 16, + "BALL_PLACEMENT_BLUE": 17, + } +) + +func (x Referee_Command) Enum() *Referee_Command { + p := new(Referee_Command) + *p = x + return p +} + +func (x Referee_Command) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Referee_Command) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_gc_referee_message_proto_enumTypes[1].Descriptor() +} + +func (Referee_Command) Type() protoreflect.EnumType { + return &file_ssl_gc_referee_message_proto_enumTypes[1] +} + +func (x Referee_Command) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Referee_Command) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Referee_Command(num) + return nil +} + +// Deprecated: Use Referee_Command.Descriptor instead. +func (Referee_Command) EnumDescriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 1} +} + +// Each UDP packet contains one of these messages. +type Referee struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The UNIX timestamp when the packet was sent, in microseconds. + // Divide by 1,000,000 to get a time_t. + PacketTimestamp *uint64 `protobuf:"varint,1,req,name=packet_timestamp,json=packetTimestamp" json:"packet_timestamp,omitempty"` + Stage *Referee_Stage `protobuf:"varint,2,req,name=stage,enum=Referee_Stage" json:"stage,omitempty"` + // The number of microseconds left in the stage. + // The following stages have this value; the rest do not: + // NORMAL_FIRST_HALF + // NORMAL_HALF_TIME + // NORMAL_SECOND_HALF + // EXTRA_TIME_BREAK + // EXTRA_FIRST_HALF + // EXTRA_HALF_TIME + // EXTRA_SECOND_HALF + // PENALTY_SHOOTOUT_BREAK + // + // If the stage runs over its specified time, this value + // becomes negative. + StageTimeLeft *int32 `protobuf:"zigzag32,3,opt,name=stage_time_left,json=stageTimeLeft" json:"stage_time_left,omitempty"` + Command *Referee_Command `protobuf:"varint,4,req,name=command,enum=Referee_Command" json:"command,omitempty"` + // The number of commands issued since startup (mod 2^32). + CommandCounter *uint32 `protobuf:"varint,5,req,name=command_counter,json=commandCounter" json:"command_counter,omitempty"` + // The UNIX timestamp when the command was issued, in microseconds. + // This value changes only when a new command is issued, not on each packet. + CommandTimestamp *uint64 `protobuf:"varint,6,req,name=command_timestamp,json=commandTimestamp" json:"command_timestamp,omitempty"` + // Information about the two teams. + Yellow *Referee_TeamInfo `protobuf:"bytes,7,req,name=yellow" json:"yellow,omitempty"` + Blue *Referee_TeamInfo `protobuf:"bytes,8,req,name=blue" json:"blue,omitempty"` + DesignatedPosition *Referee_Point `protobuf:"bytes,9,opt,name=designated_position,json=designatedPosition" json:"designated_position,omitempty"` + // Information about the direction of play. + // True, if the blue team will have it's goal on the positive x-axis of the ssl-vision coordinate system. + // Obviously, the yellow team will play on the opposite half. + BlueTeamOnPositiveHalf *bool `protobuf:"varint,10,opt,name=blue_team_on_positive_half,json=blueTeamOnPositiveHalf" json:"blue_team_on_positive_half,omitempty"` + // The command that will be issued after the current stoppage and ball placement to continue the game. + NextCommand *Referee_Command `protobuf:"varint,12,opt,name=next_command,json=nextCommand,enum=Referee_Command" json:"next_command,omitempty"` + GameEvents []*GameEvent `protobuf:"bytes,16,rep,name=game_events,json=gameEvents" json:"game_events,omitempty"` + GameEventProposals []*GameEventProposalGroup `protobuf:"bytes,17,rep,name=game_event_proposals,json=gameEventProposals" json:"game_event_proposals,omitempty"` + // The time in microseconds that is remaining until the current action times out + // The time will not be reset. It can get negative. + // An autoRef would raise an appropriate event, if the time gets negative. + // Possible actions where this time is relevant: + // * free kicks + // * kickoff, penalty kick, force start + // * ball placement + CurrentActionTimeRemaining *int32 `protobuf:"varint,15,opt,name=current_action_time_remaining,json=currentActionTimeRemaining" json:"current_action_time_remaining,omitempty"` +} + +func (x *Referee) Reset() { + *x = Referee{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_referee_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Referee) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Referee) ProtoMessage() {} + +func (x *Referee) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_referee_message_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Referee.ProtoReflect.Descriptor instead. +func (*Referee) Descriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0} +} + +func (x *Referee) GetPacketTimestamp() uint64 { + if x != nil && x.PacketTimestamp != nil { + return *x.PacketTimestamp + } + return 0 +} + +func (x *Referee) GetStage() Referee_Stage { + if x != nil && x.Stage != nil { + return *x.Stage + } + return Referee_NORMAL_FIRST_HALF_PRE +} + +func (x *Referee) GetStageTimeLeft() int32 { + if x != nil && x.StageTimeLeft != nil { + return *x.StageTimeLeft + } + return 0 +} + +func (x *Referee) GetCommand() Referee_Command { + if x != nil && x.Command != nil { + return *x.Command + } + return Referee_HALT +} + +func (x *Referee) GetCommandCounter() uint32 { + if x != nil && x.CommandCounter != nil { + return *x.CommandCounter + } + return 0 +} + +func (x *Referee) GetCommandTimestamp() uint64 { + if x != nil && x.CommandTimestamp != nil { + return *x.CommandTimestamp + } + return 0 +} + +func (x *Referee) GetYellow() *Referee_TeamInfo { + if x != nil { + return x.Yellow + } + return nil +} + +func (x *Referee) GetBlue() *Referee_TeamInfo { + if x != nil { + return x.Blue + } + return nil +} + +func (x *Referee) GetDesignatedPosition() *Referee_Point { + if x != nil { + return x.DesignatedPosition + } + return nil +} + +func (x *Referee) GetBlueTeamOnPositiveHalf() bool { + if x != nil && x.BlueTeamOnPositiveHalf != nil { + return *x.BlueTeamOnPositiveHalf + } + return false +} + +func (x *Referee) GetNextCommand() Referee_Command { + if x != nil && x.NextCommand != nil { + return *x.NextCommand + } + return Referee_HALT +} + +func (x *Referee) GetGameEvents() []*GameEvent { + if x != nil { + return x.GameEvents + } + return nil +} + +func (x *Referee) GetGameEventProposals() []*GameEventProposalGroup { + if x != nil { + return x.GameEventProposals + } + return nil +} + +func (x *Referee) GetCurrentActionTimeRemaining() int32 { + if x != nil && x.CurrentActionTimeRemaining != nil { + return *x.CurrentActionTimeRemaining + } + return 0 +} + +// List of matching proposals +type GameEventProposalGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The proposed game event. + GameEvent []*GameEvent `protobuf:"bytes,1,rep,name=game_event,json=gameEvent" json:"game_event,omitempty"` + // Whether the proposal group was accepted + Accepted *bool `protobuf:"varint,2,opt,name=accepted" json:"accepted,omitempty"` +} + +func (x *GameEventProposalGroup) Reset() { + *x = GameEventProposalGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_referee_message_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameEventProposalGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameEventProposalGroup) ProtoMessage() {} + +func (x *GameEventProposalGroup) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_referee_message_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameEventProposalGroup.ProtoReflect.Descriptor instead. +func (*GameEventProposalGroup) Descriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{1} +} + +func (x *GameEventProposalGroup) GetGameEvent() []*GameEvent { + if x != nil { + return x.GameEvent + } + return nil +} + +func (x *GameEventProposalGroup) GetAccepted() bool { + if x != nil && x.Accepted != nil { + return *x.Accepted + } + return false +} + +// Information about a single team. +type Referee_TeamInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The team's name (empty string if operator has not typed anything). + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + // The number of goals scored by the team during normal play and overtime. + Score *uint32 `protobuf:"varint,2,req,name=score" json:"score,omitempty"` + // The number of red cards issued to the team since the beginning of the game. + RedCards *uint32 `protobuf:"varint,3,req,name=red_cards,json=redCards" json:"red_cards,omitempty"` + // The amount of time (in microseconds) left on each yellow card issued to the team. + // If no yellow cards are issued, this array has no elements. + // Otherwise, times are ordered from smallest to largest. + YellowCardTimes []uint32 `protobuf:"varint,4,rep,packed,name=yellow_card_times,json=yellowCardTimes" json:"yellow_card_times,omitempty"` + // The total number of yellow cards ever issued to the team. + YellowCards *uint32 `protobuf:"varint,5,req,name=yellow_cards,json=yellowCards" json:"yellow_cards,omitempty"` + // The number of timeouts this team can still call. + // If in a timeout right now, that timeout is excluded. + Timeouts *uint32 `protobuf:"varint,6,req,name=timeouts" json:"timeouts,omitempty"` + // The number of microseconds of timeout this team can use. + TimeoutTime *uint32 `protobuf:"varint,7,req,name=timeout_time,json=timeoutTime" json:"timeout_time,omitempty"` + // The pattern number of this team's goalkeeper. + Goalkeeper *uint32 `protobuf:"varint,8,req,name=goalkeeper" json:"goalkeeper,omitempty"` + // The total number of countable fouls that act towards yellow cards + FoulCounter *uint32 `protobuf:"varint,9,opt,name=foul_counter,json=foulCounter" json:"foul_counter,omitempty"` + // The number of consecutive ball placement failures of this team + BallPlacementFailures *uint32 `protobuf:"varint,10,opt,name=ball_placement_failures,json=ballPlacementFailures" json:"ball_placement_failures,omitempty"` + // Indicate if the team is able and allowed to place the ball + CanPlaceBall *bool `protobuf:"varint,12,opt,name=can_place_ball,json=canPlaceBall" json:"can_place_ball,omitempty"` + // The maximum number of bots allowed on the field based on division and cards + MaxAllowedBots *uint32 `protobuf:"varint,13,opt,name=max_allowed_bots,json=maxAllowedBots" json:"max_allowed_bots,omitempty"` + // The team has submitted an intent to substitute one or more robots at the next chance + BotSubstitutionIntent *bool `protobuf:"varint,14,opt,name=bot_substitution_intent,json=botSubstitutionIntent" json:"bot_substitution_intent,omitempty"` + // Indicate if the team reached the maximum allowed ball placement failures and is thus not allowed to place the ball anymore + BallPlacementFailuresReached *bool `protobuf:"varint,15,opt,name=ball_placement_failures_reached,json=ballPlacementFailuresReached" json:"ball_placement_failures_reached,omitempty"` +} + +func (x *Referee_TeamInfo) Reset() { + *x = Referee_TeamInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_referee_message_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Referee_TeamInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Referee_TeamInfo) ProtoMessage() {} + +func (x *Referee_TeamInfo) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_referee_message_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Referee_TeamInfo.ProtoReflect.Descriptor instead. +func (*Referee_TeamInfo) Descriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *Referee_TeamInfo) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Referee_TeamInfo) GetScore() uint32 { + if x != nil && x.Score != nil { + return *x.Score + } + return 0 +} + +func (x *Referee_TeamInfo) GetRedCards() uint32 { + if x != nil && x.RedCards != nil { + return *x.RedCards + } + return 0 +} + +func (x *Referee_TeamInfo) GetYellowCardTimes() []uint32 { + if x != nil { + return x.YellowCardTimes + } + return nil +} + +func (x *Referee_TeamInfo) GetYellowCards() uint32 { + if x != nil && x.YellowCards != nil { + return *x.YellowCards + } + return 0 +} + +func (x *Referee_TeamInfo) GetTimeouts() uint32 { + if x != nil && x.Timeouts != nil { + return *x.Timeouts + } + return 0 +} + +func (x *Referee_TeamInfo) GetTimeoutTime() uint32 { + if x != nil && x.TimeoutTime != nil { + return *x.TimeoutTime + } + return 0 +} + +func (x *Referee_TeamInfo) GetGoalkeeper() uint32 { + if x != nil && x.Goalkeeper != nil { + return *x.Goalkeeper + } + return 0 +} + +func (x *Referee_TeamInfo) GetFoulCounter() uint32 { + if x != nil && x.FoulCounter != nil { + return *x.FoulCounter + } + return 0 +} + +func (x *Referee_TeamInfo) GetBallPlacementFailures() uint32 { + if x != nil && x.BallPlacementFailures != nil { + return *x.BallPlacementFailures + } + return 0 +} + +func (x *Referee_TeamInfo) GetCanPlaceBall() bool { + if x != nil && x.CanPlaceBall != nil { + return *x.CanPlaceBall + } + return false +} + +func (x *Referee_TeamInfo) GetMaxAllowedBots() uint32 { + if x != nil && x.MaxAllowedBots != nil { + return *x.MaxAllowedBots + } + return 0 +} + +func (x *Referee_TeamInfo) GetBotSubstitutionIntent() bool { + if x != nil && x.BotSubstitutionIntent != nil { + return *x.BotSubstitutionIntent + } + return false +} + +func (x *Referee_TeamInfo) GetBallPlacementFailuresReached() bool { + if x != nil && x.BallPlacementFailuresReached != nil { + return *x.BallPlacementFailuresReached + } + return false +} + +// The coordinates of the Designated Position. These are measured in +// millimetres and correspond to SSL-Vision coordinates. These fields are +// always either both present (in the case of a ball placement command) or +// both absent (in the case of any other command). +type Referee_Point struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"` +} + +func (x *Referee_Point) Reset() { + *x = Referee_Point{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_gc_referee_message_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Referee_Point) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Referee_Point) ProtoMessage() {} + +func (x *Referee_Point) ProtoReflect() protoreflect.Message { + mi := &file_ssl_gc_referee_message_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Referee_Point.ProtoReflect.Descriptor instead. +func (*Referee_Point) Descriptor() ([]byte, []int) { + return file_ssl_gc_referee_message_proto_rawDescGZIP(), []int{0, 1} +} + +func (x *Referee_Point) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *Referee_Point) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +var File_ssl_gc_referee_message_proto protoreflect.FileDescriptor + +var file_ssl_gc_referee_message_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, + 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x10, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0f, 0x70, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x0e, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0d, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x2a, 0x0a, 0x07, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x02, 0x28, + 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x10, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, + 0x0a, 0x06, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x07, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x06, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x25, 0x0a, 0x04, 0x62, 0x6c, 0x75, + 0x65, 0x18, 0x08, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x62, 0x6c, 0x75, 0x65, + 0x12, 0x3f, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x64, + 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x1a, 0x62, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x6f, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x62, 0x6c, 0x75, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x4f, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x48, 0x61, 0x6c, 0x66, 0x12, 0x33, 0x0a, + 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x49, 0x0a, 0x14, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x12, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x1a, 0xad, 0x04, + 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x64, 0x43, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x2e, 0x0a, 0x11, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x61, 0x72, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, + 0x52, 0x0f, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x72, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x43, + 0x61, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x6b, 0x65, 0x65, 0x70, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x6b, 0x65, 0x65, + 0x70, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x75, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66, 0x6f, 0x75, 0x6c, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x62, 0x61, 0x6c, 0x6c, 0x50, 0x6c, 0x61, + 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x6c, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x61, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, + 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x73, 0x12, 0x36, + 0x0a, 0x17, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x62, 0x6f, 0x74, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1c, 0x62, 0x61, 0x6c, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x1a, 0x23, 0x0a, + 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, + 0x01, 0x79, 0x22, 0xd1, 0x02, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x15, + 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x52, 0x4d, 0x41, + 0x4c, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, + 0x4d, 0x45, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, + 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x03, + 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, + 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, + 0x41, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x05, 0x12, 0x18, + 0x0a, 0x14, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, + 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x52, + 0x41, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x10, 0x07, 0x12, 0x13, + 0x0a, 0x0f, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, + 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15, + 0x0a, 0x11, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x48, + 0x41, 0x4c, 0x46, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, + 0x5f, 0x53, 0x48, 0x4f, 0x4f, 0x54, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, + 0x0b, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x53, 0x48, 0x4f, + 0x4f, 0x54, 0x4f, 0x55, 0x54, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4f, 0x53, 0x54, 0x5f, + 0x47, 0x41, 0x4d, 0x45, 0x10, 0x0d, 0x22, 0x8e, 0x03, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x41, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, + 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x43, + 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, + 0x50, 0x41, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x59, 0x45, 0x4c, + 0x4c, 0x4f, 0x57, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, + 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x05, 0x12, + 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, + 0x54, 0x59, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, + 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, + 0x4c, 0x55, 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, + 0x46, 0x52, 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x08, 0x12, 0x14, 0x0a, + 0x10, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, 0x4c, 0x55, + 0x45, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, + 0x46, 0x52, 0x45, 0x45, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0a, 0x12, 0x16, 0x0a, + 0x12, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x42, + 0x4c, 0x55, 0x45, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, + 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x49, 0x4d, + 0x45, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0d, 0x12, 0x13, 0x0a, 0x0b, 0x47, + 0x4f, 0x41, 0x4c, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x0e, 0x1a, 0x02, 0x08, 0x01, + 0x12, 0x11, 0x0a, 0x09, 0x47, 0x4f, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x0f, 0x1a, + 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, + 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x59, 0x45, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x10, 0x12, 0x17, + 0x0a, 0x13, 0x42, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x42, 0x4c, 0x55, 0x45, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, + 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x61, 0x6d, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x29, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, + 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, +} + +var ( + file_ssl_gc_referee_message_proto_rawDescOnce sync.Once + file_ssl_gc_referee_message_proto_rawDescData = file_ssl_gc_referee_message_proto_rawDesc +) + +func file_ssl_gc_referee_message_proto_rawDescGZIP() []byte { + file_ssl_gc_referee_message_proto_rawDescOnce.Do(func() { + file_ssl_gc_referee_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_gc_referee_message_proto_rawDescData) + }) + return file_ssl_gc_referee_message_proto_rawDescData +} + +var file_ssl_gc_referee_message_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_ssl_gc_referee_message_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_ssl_gc_referee_message_proto_goTypes = []interface{}{ + (Referee_Stage)(0), // 0: Referee.Stage + (Referee_Command)(0), // 1: Referee.Command + (*Referee)(nil), // 2: Referee + (*GameEventProposalGroup)(nil), // 3: GameEventProposalGroup + (*Referee_TeamInfo)(nil), // 4: Referee.TeamInfo + (*Referee_Point)(nil), // 5: Referee.Point + (*GameEvent)(nil), // 6: GameEvent +} +var file_ssl_gc_referee_message_proto_depIdxs = []int32{ + 0, // 0: Referee.stage:type_name -> Referee.Stage + 1, // 1: Referee.command:type_name -> Referee.Command + 4, // 2: Referee.yellow:type_name -> Referee.TeamInfo + 4, // 3: Referee.blue:type_name -> Referee.TeamInfo + 5, // 4: Referee.designated_position:type_name -> Referee.Point + 1, // 5: Referee.next_command:type_name -> Referee.Command + 6, // 6: Referee.game_events:type_name -> GameEvent + 3, // 7: Referee.game_event_proposals:type_name -> GameEventProposalGroup + 6, // 8: GameEventProposalGroup.game_event:type_name -> GameEvent + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_ssl_gc_referee_message_proto_init() } +func file_ssl_gc_referee_message_proto_init() { + if File_ssl_gc_referee_message_proto != nil { + return + } + file_ssl_gc_game_event_proto_init() + if !protoimpl.UnsafeEnabled { + file_ssl_gc_referee_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Referee); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_referee_message_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameEventProposalGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_referee_message_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Referee_TeamInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_gc_referee_message_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Referee_Point); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_gc_referee_message_proto_rawDesc, + NumEnums: 2, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_gc_referee_message_proto_goTypes, + DependencyIndexes: file_ssl_gc_referee_message_proto_depIdxs, + EnumInfos: file_ssl_gc_referee_message_proto_enumTypes, + MessageInfos: file_ssl_gc_referee_message_proto_msgTypes, + }.Build() + File_ssl_gc_referee_message_proto = out.File + file_ssl_gc_referee_message_proto_rawDesc = nil + file_ssl_gc_referee_message_proto_goTypes = nil + file_ssl_gc_referee_message_proto_depIdxs = nil +} diff --git a/internal/simctl/replace_ball.go b/internal/simctl/replace_ball.go new file mode 100644 index 0000000..8634133 --- /dev/null +++ b/internal/simctl/replace_ball.go @@ -0,0 +1,85 @@ +package simctl + +import ( + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom" + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee" + "github.com/golang/protobuf/proto" + "log" + "time" +) + +type BallReplacer struct { + c *SimulationController + + lastTimePlacedBall time.Time + haltTime *time.Time +} + +func (r *BallReplacer) handleReplaceBall() { + if *r.c.lastRefereeMsg.Command != referee.Referee_HALT { + // Only during HALT + r.haltTime = nil + return + } + if r.haltTime == nil { + r.haltTime = new(time.Time) + *r.haltTime = time.Now() + } + + if time.Now().Sub(*r.haltTime) < 500*time.Millisecond { + // Halt must be set for at least 1 second + return + } + + if r.c.lastRefereeMsg.DesignatedPosition == nil { + // Only when ball placement position set + return + } + + if time.Now().Sub(r.lastTimePlacedBall) < 500*time.Millisecond { + // Placed ball just recently + return + } + + targetPos := geom.NewVector2Float32( + *r.c.lastRefereeMsg.DesignatedPosition.X/1000, + *r.c.lastRefereeMsg.DesignatedPosition.Y/1000, + ) + + balls := r.c.lastTrackedFrame.TrackedFrame.Balls + if len(balls) == 0 { + r.placeBall(targetPos) + return + } + + currentPos := geom.NewVector2Float32(*balls[0].Pos.X, *balls[0].Pos.Y) + + if targetPos.DistanceTo(currentPos) > 0.1 { + r.placeBall(targetPos) + } +} + +func (r *BallReplacer) placeBall(ballPos *geom.Vector2) { + log.Printf("Placing ball to %v", ballPos) + + zero := float32(0) + command := SimulatorCommand{ + Control: &SimulatorControl{ + TeleportBall: &TeleportBall{ + X: ballPos.X, + Y: ballPos.Y, + Z: &zero, + Vx: &zero, + Vy: &zero, + Vz: &zero, + }, + }, + } + + if data, err := proto.Marshal(&command); err != nil { + log.Println("Could not marshal command: ", err) + } else { + r.c.simControlClient.Send(data) + r.lastTimePlacedBall = time.Now() + } +} diff --git a/internal/simctl/simctl.go b/internal/simctl/simctl.go new file mode 100644 index 0000000..563f2d0 --- /dev/null +++ b/internal/simctl/simctl.go @@ -0,0 +1,117 @@ +package simctl + +import ( + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee" + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/sslnet" + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker" + "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision" + "github.com/golang/protobuf/proto" + "log" + "net" +) + +type SimulationController struct { + visionServer *sslnet.MulticastServer + refereeServer *sslnet.MulticastServer + trackerServer *sslnet.MulticastServer + simControlClient *sslnet.UdpClient + + simControlPort string + + lastTrackedFrame *tracker.TrackerWrapperPacket + lastRefereeMsg *referee.Referee + fieldSize *vision.SSL_GeometryFieldSize + + ballReplacer BallReplacer +} + +func NewSimulationController(visionAddress, refereeAddress, trackerAddress string, simControlPort string) (c *SimulationController) { + c = new(SimulationController) + c.visionServer = sslnet.NewMulticastServer(visionAddress, c.onNewVisionData) + c.refereeServer = sslnet.NewMulticastServer(refereeAddress, c.onNewRefereeData) + c.trackerServer = sslnet.NewMulticastServer(trackerAddress, c.onNewTrackerData) + c.simControlPort = simControlPort + c.ballReplacer.c = c + return +} + +func (c *SimulationController) onNewVisionData(data []byte, remoteAddr *net.UDPAddr) { + wrapper := vision.SSL_WrapperPacket{} + if err := proto.Unmarshal(data, &wrapper); err != nil { + log.Println("Could not unmarshal vision wrapper packet", err) + return + } + + if wrapper.Geometry != nil && wrapper.Geometry.Field != nil { + c.fieldSize = wrapper.Geometry.Field + } + + if c.simControlClient == nil { + address := remoteAddr.IP.String() + ":" + c.simControlPort + c.simControlClient = sslnet.NewUdpClient(address) + c.simControlClient.Consumer = c.onNewSimControlResponseData + c.simControlClient.Start() + } +} + +func (c *SimulationController) onNewRefereeData(data []byte, _ *net.UDPAddr) { + refereeMsg := new(referee.Referee) + if err := proto.Unmarshal(data, refereeMsg); err != nil { + log.Println("Could not unmarshal referee packet", err) + return + } + c.lastRefereeMsg = refereeMsg +} + +func (c *SimulationController) onNewTrackerData(data []byte, _ *net.UDPAddr) { + frame := new(tracker.TrackerWrapperPacket) + if err := proto.Unmarshal(data, frame); err != nil { + log.Println("Could not unmarshal tracker packet", err) + return + } + if c.lastTrackedFrame == nil || // very first frame + *c.lastTrackedFrame.Uuid == *frame.Uuid || // frame from same origin + // new frame is significantly newer than last frame + (*frame.TrackedFrame.Timestamp-*c.lastTrackedFrame.TrackedFrame.Timestamp) > 5 { + c.lastTrackedFrame = frame + c.handle() + } +} + +func (c *SimulationController) onNewSimControlResponseData(data []byte) { + response := new(SimulatorResponse) + if err := proto.Unmarshal(data, response); err != nil { + log.Println("Could not unmarshal tracker packet", err) + return + } + for _, responseError := range response.Errors { + log.Printf("SimControl Error: %v", responseError) + } +} + +func (c *SimulationController) handle() { + if c.lastTrackedFrame == nil || + c.fieldSize == nil || + c.lastRefereeMsg == nil || + c.simControlClient == nil { + return + } + + c.ballReplacer.handleReplaceBall() +} + +func (c *SimulationController) Start() { + c.visionServer.Start() + c.refereeServer.Start() + c.trackerServer.Start() +} + +func (c *SimulationController) Stop() { + c.visionServer.Stop() + c.refereeServer.Stop() + c.trackerServer.Stop() + if c.simControlClient != nil { + c.simControlClient.Stop() + c.simControlClient = nil + } +} diff --git a/internal/simctl/ssl_simulation_config.pb.go b/internal/simctl/ssl_simulation_config.pb.go new file mode 100644 index 0000000..55e8e0d --- /dev/null +++ b/internal/simctl/ssl_simulation_config.pb.go @@ -0,0 +1,683 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_simulation_config.proto + +package simctl + +import ( + referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee" + vision "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Movement limits for a robot +type RobotLimits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Max absolute speed-up acceleration [m/s^2] + AccSpeedupAbsoluteMax *float32 `protobuf:"fixed32,1,opt,name=acc_speedup_absolute_max,json=accSpeedupAbsoluteMax" json:"acc_speedup_absolute_max,omitempty"` + // Max angular speed-up acceleration [rad/s^2] + AccSpeedupAngularMax *float32 `protobuf:"fixed32,2,opt,name=acc_speedup_angular_max,json=accSpeedupAngularMax" json:"acc_speedup_angular_max,omitempty"` + // Max absolute brake acceleration [m/s^2] + AccBrakeAbsoluteMax *float32 `protobuf:"fixed32,3,opt,name=acc_brake_absolute_max,json=accBrakeAbsoluteMax" json:"acc_brake_absolute_max,omitempty"` + // Max angular brake acceleration [rad/s^2] + AccBrakeAngularMax *float32 `protobuf:"fixed32,4,opt,name=acc_brake_angular_max,json=accBrakeAngularMax" json:"acc_brake_angular_max,omitempty"` + // Max absolute velocity [m/s] + VelAbsoluteMax *float32 `protobuf:"fixed32,5,opt,name=vel_absolute_max,json=velAbsoluteMax" json:"vel_absolute_max,omitempty"` + // Max angular velocity [rad/s] + VelAngularMax *float32 `protobuf:"fixed32,6,opt,name=vel_angular_max,json=velAngularMax" json:"vel_angular_max,omitempty"` +} + +func (x *RobotLimits) Reset() { + *x = RobotLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RobotLimits) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RobotLimits) ProtoMessage() {} + +func (x *RobotLimits) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_config_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RobotLimits.ProtoReflect.Descriptor instead. +func (*RobotLimits) Descriptor() ([]byte, []int) { + return file_ssl_simulation_config_proto_rawDescGZIP(), []int{0} +} + +func (x *RobotLimits) GetAccSpeedupAbsoluteMax() float32 { + if x != nil && x.AccSpeedupAbsoluteMax != nil { + return *x.AccSpeedupAbsoluteMax + } + return 0 +} + +func (x *RobotLimits) GetAccSpeedupAngularMax() float32 { + if x != nil && x.AccSpeedupAngularMax != nil { + return *x.AccSpeedupAngularMax + } + return 0 +} + +func (x *RobotLimits) GetAccBrakeAbsoluteMax() float32 { + if x != nil && x.AccBrakeAbsoluteMax != nil { + return *x.AccBrakeAbsoluteMax + } + return 0 +} + +func (x *RobotLimits) GetAccBrakeAngularMax() float32 { + if x != nil && x.AccBrakeAngularMax != nil { + return *x.AccBrakeAngularMax + } + return 0 +} + +func (x *RobotLimits) GetVelAbsoluteMax() float32 { + if x != nil && x.VelAbsoluteMax != nil { + return *x.VelAbsoluteMax + } + return 0 +} + +func (x *RobotLimits) GetVelAngularMax() float32 { + if x != nil && x.VelAngularMax != nil { + return *x.VelAngularMax + } + return 0 +} + +// Robot wheel angle configuration +// all angles are relative to looking forward, +// all wheels / angles are clockwise +type RobotWheelAngles struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Angle front right [rad] + FrontRight *float32 `protobuf:"fixed32,1,req,name=front_right,json=frontRight" json:"front_right,omitempty"` + // Angle back right [rad] + BackRight *float32 `protobuf:"fixed32,2,req,name=back_right,json=backRight" json:"back_right,omitempty"` + // Angle back left [rad] + BackLeft *float32 `protobuf:"fixed32,3,req,name=back_left,json=backLeft" json:"back_left,omitempty"` + // Angle front left [rad] + FrontLeft *float32 `protobuf:"fixed32,4,req,name=front_left,json=frontLeft" json:"front_left,omitempty"` +} + +func (x *RobotWheelAngles) Reset() { + *x = RobotWheelAngles{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RobotWheelAngles) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RobotWheelAngles) ProtoMessage() {} + +func (x *RobotWheelAngles) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_config_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RobotWheelAngles.ProtoReflect.Descriptor instead. +func (*RobotWheelAngles) Descriptor() ([]byte, []int) { + return file_ssl_simulation_config_proto_rawDescGZIP(), []int{1} +} + +func (x *RobotWheelAngles) GetFrontRight() float32 { + if x != nil && x.FrontRight != nil { + return *x.FrontRight + } + return 0 +} + +func (x *RobotWheelAngles) GetBackRight() float32 { + if x != nil && x.BackRight != nil { + return *x.BackRight + } + return 0 +} + +func (x *RobotWheelAngles) GetBackLeft() float32 { + if x != nil && x.BackLeft != nil { + return *x.BackLeft + } + return 0 +} + +func (x *RobotWheelAngles) GetFrontLeft() float32 { + if x != nil && x.FrontLeft != nil { + return *x.FrontLeft + } + return 0 +} + +// Specs of a robot +type RobotSpecs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Id of the robot + Id *referee.RobotId `protobuf:"bytes,1,req,name=id" json:"id,omitempty"` + // Robot radius [m] + Radius *float32 `protobuf:"fixed32,2,opt,name=radius,def=0.09" json:"radius,omitempty"` + // Robot height [m] + Height *float32 `protobuf:"fixed32,3,opt,name=height,def=0.15" json:"height,omitempty"` + // Robot mass [kg] + Mass *float32 `protobuf:"fixed32,4,opt,name=mass" json:"mass,omitempty"` + // Max linear kick speed [m/s] (unset = unlimited) + MaxLinearKickSpeed *float32 `protobuf:"fixed32,7,opt,name=max_linear_kick_speed,json=maxLinearKickSpeed" json:"max_linear_kick_speed,omitempty"` + // Max chip kick speed [m/s] (unset = unlimited) + MaxChipKickSpeed *float32 `protobuf:"fixed32,8,opt,name=max_chip_kick_speed,json=maxChipKickSpeed" json:"max_chip_kick_speed,omitempty"` + // Width of the dribbler [m] (implicitly defines the distance from robot center to dribbler and opening angle) + DribblerWidth *float32 `protobuf:"fixed32,9,opt,name=dribbler_width,json=dribblerWidth" json:"dribbler_width,omitempty"` + // Movement limits + Limits *RobotLimits `protobuf:"bytes,10,opt,name=limits" json:"limits,omitempty"` + // Wheel angle configuration + WheelAngles *RobotWheelAngles `protobuf:"bytes,13,opt,name=wheel_angles,json=wheelAngles" json:"wheel_angles,omitempty"` + // Custom robot spec for specific simulators (the protobuf files are managed by the simulators) + Custom *any.Any `protobuf:"bytes,14,opt,name=custom" json:"custom,omitempty"` +} + +// Default values for RobotSpecs fields. +const ( + Default_RobotSpecs_Radius = float32(0.09000000357627869) + Default_RobotSpecs_Height = float32(0.15000000596046448) +) + +func (x *RobotSpecs) Reset() { + *x = RobotSpecs{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_config_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RobotSpecs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RobotSpecs) ProtoMessage() {} + +func (x *RobotSpecs) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_config_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RobotSpecs.ProtoReflect.Descriptor instead. +func (*RobotSpecs) Descriptor() ([]byte, []int) { + return file_ssl_simulation_config_proto_rawDescGZIP(), []int{2} +} + +func (x *RobotSpecs) GetId() *referee.RobotId { + if x != nil { + return x.Id + } + return nil +} + +func (x *RobotSpecs) GetRadius() float32 { + if x != nil && x.Radius != nil { + return *x.Radius + } + return Default_RobotSpecs_Radius +} + +func (x *RobotSpecs) GetHeight() float32 { + if x != nil && x.Height != nil { + return *x.Height + } + return Default_RobotSpecs_Height +} + +func (x *RobotSpecs) GetMass() float32 { + if x != nil && x.Mass != nil { + return *x.Mass + } + return 0 +} + +func (x *RobotSpecs) GetMaxLinearKickSpeed() float32 { + if x != nil && x.MaxLinearKickSpeed != nil { + return *x.MaxLinearKickSpeed + } + return 0 +} + +func (x *RobotSpecs) GetMaxChipKickSpeed() float32 { + if x != nil && x.MaxChipKickSpeed != nil { + return *x.MaxChipKickSpeed + } + return 0 +} + +func (x *RobotSpecs) GetDribblerWidth() float32 { + if x != nil && x.DribblerWidth != nil { + return *x.DribblerWidth + } + return 0 +} + +func (x *RobotSpecs) GetLimits() *RobotLimits { + if x != nil { + return x.Limits + } + return nil +} + +func (x *RobotSpecs) GetWheelAngles() *RobotWheelAngles { + if x != nil { + return x.WheelAngles + } + return nil +} + +func (x *RobotSpecs) GetCustom() *any.Any { + if x != nil { + return x.Custom + } + return nil +} + +type RealismConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Custom config for specific simulators (the protobuf files are managed by the simulators) + Custom *any.Any `protobuf:"bytes,1,opt,name=custom" json:"custom,omitempty"` +} + +func (x *RealismConfig) Reset() { + *x = RealismConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_config_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RealismConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RealismConfig) ProtoMessage() {} + +func (x *RealismConfig) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_config_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RealismConfig.ProtoReflect.Descriptor instead. +func (*RealismConfig) Descriptor() ([]byte, []int) { + return file_ssl_simulation_config_proto_rawDescGZIP(), []int{3} +} + +func (x *RealismConfig) GetCustom() *any.Any { + if x != nil { + return x.Custom + } + return nil +} + +// Change the simulator configuration +type SimulatorConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Update the geometry + Geometry *vision.SSL_GeometryData `protobuf:"bytes,1,opt,name=geometry" json:"geometry,omitempty"` + // Update the robot specs + RobotSpecs []*RobotSpecs `protobuf:"bytes,2,rep,name=robot_specs,json=robotSpecs" json:"robot_specs,omitempty"` + // Update realism configuration + RealismConfig *RealismConfig `protobuf:"bytes,3,opt,name=realism_config,json=realismConfig" json:"realism_config,omitempty"` + // Change the vision publish port + VisionPort *uint32 `protobuf:"varint,4,opt,name=vision_port,json=visionPort" json:"vision_port,omitempty"` +} + +func (x *SimulatorConfig) Reset() { + *x = SimulatorConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_config_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SimulatorConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SimulatorConfig) ProtoMessage() {} + +func (x *SimulatorConfig) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_config_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SimulatorConfig.ProtoReflect.Descriptor instead. +func (*SimulatorConfig) Descriptor() ([]byte, []int) { + return file_ssl_simulation_config_proto_rawDescGZIP(), []int{4} +} + +func (x *SimulatorConfig) GetGeometry() *vision.SSL_GeometryData { + if x != nil { + return x.Geometry + } + return nil +} + +func (x *SimulatorConfig) GetRobotSpecs() []*RobotSpecs { + if x != nil { + return x.RobotSpecs + } + return nil +} + +func (x *SimulatorConfig) GetRealismConfig() *RealismConfig { + if x != nil { + return x.RealismConfig + } + return nil +} + +func (x *SimulatorConfig) GetVisionPort() uint32 { + if x != nil && x.VisionPort != nil { + return *x.VisionPort + } + return 0 +} + +var File_ssl_simulation_config_proto protoreflect.FileDescriptor + +var file_ssl_simulation_config_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x65, + 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, + 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x13, 0x73, 0x73, + 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x65, + 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x62, 0x6f, + 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x61, 0x63, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x61, 0x63, 0x63, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x75, 0x70, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78, + 0x12, 0x35, 0x0a, 0x17, 0x61, 0x63, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x5f, + 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x14, 0x61, 0x63, 0x63, 0x53, 0x70, 0x65, 0x65, 0x64, 0x75, 0x70, 0x41, 0x6e, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x12, 0x33, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x5f, 0x62, + 0x72, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x61, 0x63, 0x63, 0x42, 0x72, 0x61, 0x6b, + 0x65, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x15, + 0x61, 0x63, 0x63, 0x5f, 0x62, 0x72, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x61, 0x63, 0x63, + 0x42, 0x72, 0x61, 0x6b, 0x65, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, 0x78, 0x12, + 0x28, 0x0a, 0x10, 0x76, 0x65, 0x6c, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x76, 0x65, 0x6c, 0x41, 0x62, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x65, 0x6c, + 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0d, 0x76, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x4d, 0x61, + 0x78, 0x22, 0x8e, 0x01, 0x0a, 0x10, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x57, 0x68, 0x65, 0x65, 0x6c, + 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x5f, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x62, 0x61, 0x63, + 0x6b, 0x52, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6c, + 0x65, 0x66, 0x74, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x4c, + 0x65, 0x66, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x66, + 0x74, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0xc5, 0x03, 0x0a, 0x0a, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63, + 0x73, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x06, 0x72, + 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x30, 0x2e, 0x30, + 0x39, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x30, 0x2e, 0x31, 0x35, 0x52, + 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, + 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, 0x73, + 0x70, 0x65, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x4b, 0x69, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x2d, + 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x69, 0x70, 0x5f, 0x6b, 0x69, 0x63, 0x6b, 0x5f, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x78, + 0x43, 0x68, 0x69, 0x70, 0x4b, 0x69, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x64, 0x72, 0x69, 0x62, 0x62, 0x6c, 0x65, 0x72, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, + 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x52, 0x0a, 0x0c, 0x77, 0x68, 0x65, 0x65, + 0x6c, 0x5f, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, + 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x6f, 0x62, 0x6f, 0x74, 0x57, 0x68, 0x65, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x52, + 0x0b, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x06, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, + 0x6e, 0x79, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x22, 0x3d, 0x0a, 0x0d, 0x52, 0x65, + 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x06, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x22, 0x82, 0x02, 0x0a, 0x0f, 0x53, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, + 0x08, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x0b, + 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, + 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x0a, 0x72, 0x6f, + 0x62, 0x6f, 0x74, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c, + 0x69, 0x73, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, + 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, + 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, + 0x0b, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x42, + 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, + 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63, + 0x74, 0x6c, +} + +var ( + file_ssl_simulation_config_proto_rawDescOnce sync.Once + file_ssl_simulation_config_proto_rawDescData = file_ssl_simulation_config_proto_rawDesc +) + +func file_ssl_simulation_config_proto_rawDescGZIP() []byte { + file_ssl_simulation_config_proto_rawDescOnce.Do(func() { + file_ssl_simulation_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_config_proto_rawDescData) + }) + return file_ssl_simulation_config_proto_rawDescData +} + +var file_ssl_simulation_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_ssl_simulation_config_proto_goTypes = []interface{}{ + (*RobotLimits)(nil), // 0: edu.tigers.sumatra.simulation.RobotLimits + (*RobotWheelAngles)(nil), // 1: edu.tigers.sumatra.simulation.RobotWheelAngles + (*RobotSpecs)(nil), // 2: edu.tigers.sumatra.simulation.RobotSpecs + (*RealismConfig)(nil), // 3: edu.tigers.sumatra.simulation.RealismConfig + (*SimulatorConfig)(nil), // 4: edu.tigers.sumatra.simulation.SimulatorConfig + (*referee.RobotId)(nil), // 5: RobotId + (*any.Any)(nil), // 6: google.protobuf.Any + (*vision.SSL_GeometryData)(nil), // 7: SSL_GeometryData +} +var file_ssl_simulation_config_proto_depIdxs = []int32{ + 5, // 0: edu.tigers.sumatra.simulation.RobotSpecs.id:type_name -> RobotId + 0, // 1: edu.tigers.sumatra.simulation.RobotSpecs.limits:type_name -> edu.tigers.sumatra.simulation.RobotLimits + 1, // 2: edu.tigers.sumatra.simulation.RobotSpecs.wheel_angles:type_name -> edu.tigers.sumatra.simulation.RobotWheelAngles + 6, // 3: edu.tigers.sumatra.simulation.RobotSpecs.custom:type_name -> google.protobuf.Any + 6, // 4: edu.tigers.sumatra.simulation.RealismConfig.custom:type_name -> google.protobuf.Any + 7, // 5: edu.tigers.sumatra.simulation.SimulatorConfig.geometry:type_name -> SSL_GeometryData + 2, // 6: edu.tigers.sumatra.simulation.SimulatorConfig.robot_specs:type_name -> edu.tigers.sumatra.simulation.RobotSpecs + 3, // 7: edu.tigers.sumatra.simulation.SimulatorConfig.realism_config:type_name -> edu.tigers.sumatra.simulation.RealismConfig + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_ssl_simulation_config_proto_init() } +func file_ssl_simulation_config_proto_init() { + if File_ssl_simulation_config_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_simulation_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RobotLimits); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RobotWheelAngles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RobotSpecs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RealismConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SimulatorConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_simulation_config_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_simulation_config_proto_goTypes, + DependencyIndexes: file_ssl_simulation_config_proto_depIdxs, + MessageInfos: file_ssl_simulation_config_proto_msgTypes, + }.Build() + File_ssl_simulation_config_proto = out.File + file_ssl_simulation_config_proto_rawDesc = nil + file_ssl_simulation_config_proto_goTypes = nil + file_ssl_simulation_config_proto_depIdxs = nil +} diff --git a/internal/simctl/ssl_simulation_control.pb.go b/internal/simctl/ssl_simulation_control.pb.go new file mode 100644 index 0000000..48d4b4a --- /dev/null +++ b/internal/simctl/ssl_simulation_control.pb.go @@ -0,0 +1,640 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_simulation_control.proto + +package simctl + +import ( + referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Teleport the ball to a new location and optionally set it to some velocity +type TeleportBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // x-coordinate [m] + X *float32 `protobuf:"fixed32,1,opt,name=x" json:"x,omitempty"` + // y-coordinate [m] + Y *float32 `protobuf:"fixed32,2,opt,name=y" json:"y,omitempty"` + // z-coordinate (height) [m] + Z *float32 `protobuf:"fixed32,3,opt,name=z" json:"z,omitempty"` + // Velocity in x-direction [m/s] + Vx *float32 `protobuf:"fixed32,4,opt,name=vx" json:"vx,omitempty"` + // Velocity in y-direction [m/s] + Vy *float32 `protobuf:"fixed32,5,opt,name=vy" json:"vy,omitempty"` + // Velocity in z-direction [m/s] + Vz *float32 `protobuf:"fixed32,6,opt,name=vz" json:"vz,omitempty"` + // Teleport the ball safely to the target, for example by + // moving robots out of the way in case of collision and set speed of robots close-by to zero + TeleportSafely *bool `protobuf:"varint,7,opt,name=teleport_safely,json=teleportSafely,def=0" json:"teleport_safely,omitempty"` + // Adapt the angular ball velocity such that the ball is rolling + Roll *bool `protobuf:"varint,8,opt,name=roll,def=0" json:"roll,omitempty"` +} + +// Default values for TeleportBall fields. +const ( + Default_TeleportBall_TeleportSafely = bool(false) + Default_TeleportBall_Roll = bool(false) +) + +func (x *TeleportBall) Reset() { + *x = TeleportBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeleportBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeleportBall) ProtoMessage() {} + +func (x *TeleportBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_control_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeleportBall.ProtoReflect.Descriptor instead. +func (*TeleportBall) Descriptor() ([]byte, []int) { + return file_ssl_simulation_control_proto_rawDescGZIP(), []int{0} +} + +func (x *TeleportBall) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *TeleportBall) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +func (x *TeleportBall) GetZ() float32 { + if x != nil && x.Z != nil { + return *x.Z + } + return 0 +} + +func (x *TeleportBall) GetVx() float32 { + if x != nil && x.Vx != nil { + return *x.Vx + } + return 0 +} + +func (x *TeleportBall) GetVy() float32 { + if x != nil && x.Vy != nil { + return *x.Vy + } + return 0 +} + +func (x *TeleportBall) GetVz() float32 { + if x != nil && x.Vz != nil { + return *x.Vz + } + return 0 +} + +func (x *TeleportBall) GetTeleportSafely() bool { + if x != nil && x.TeleportSafely != nil { + return *x.TeleportSafely + } + return Default_TeleportBall_TeleportSafely +} + +func (x *TeleportBall) GetRoll() bool { + if x != nil && x.Roll != nil { + return *x.Roll + } + return Default_TeleportBall_Roll +} + +// Teleport a robot to some location and give it a velocity +type TeleportRobot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Robot id to teleport + Id *referee.RobotId `protobuf:"bytes,1,req,name=id" json:"id,omitempty"` + // x-coordinate [m] + X *float32 `protobuf:"fixed32,2,opt,name=x" json:"x,omitempty"` + // y-coordinate [m] + Y *float32 `protobuf:"fixed32,3,opt,name=y" json:"y,omitempty"` + // Orientation [rad], measured from the x-axis counter-clockwise + Orientation *float32 `protobuf:"fixed32,4,opt,name=orientation" json:"orientation,omitempty"` + // Global velocity [m/s] towards x-axis + VX *float32 `protobuf:"fixed32,5,opt,name=v_x,json=vX,def=0" json:"v_x,omitempty"` + // Global velocity [m/s] towards y-axis + VY *float32 `protobuf:"fixed32,6,opt,name=v_y,json=vY,def=0" json:"v_y,omitempty"` + // Angular velocity [rad/s] + VAngular *float32 `protobuf:"fixed32,7,opt,name=v_angular,json=vAngular,def=0" json:"v_angular,omitempty"` + // Robot should be present on the field? + // true -> robot will be added, if it does not exist yet + // false -> robot will be removed, if it is present + Present *bool `protobuf:"varint,8,opt,name=present" json:"present,omitempty"` +} + +// Default values for TeleportRobot fields. +const ( + Default_TeleportRobot_VX = float32(0) + Default_TeleportRobot_VY = float32(0) + Default_TeleportRobot_VAngular = float32(0) +) + +func (x *TeleportRobot) Reset() { + *x = TeleportRobot{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeleportRobot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeleportRobot) ProtoMessage() {} + +func (x *TeleportRobot) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_control_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeleportRobot.ProtoReflect.Descriptor instead. +func (*TeleportRobot) Descriptor() ([]byte, []int) { + return file_ssl_simulation_control_proto_rawDescGZIP(), []int{1} +} + +func (x *TeleportRobot) GetId() *referee.RobotId { + if x != nil { + return x.Id + } + return nil +} + +func (x *TeleportRobot) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *TeleportRobot) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +func (x *TeleportRobot) GetOrientation() float32 { + if x != nil && x.Orientation != nil { + return *x.Orientation + } + return 0 +} + +func (x *TeleportRobot) GetVX() float32 { + if x != nil && x.VX != nil { + return *x.VX + } + return Default_TeleportRobot_VX +} + +func (x *TeleportRobot) GetVY() float32 { + if x != nil && x.VY != nil { + return *x.VY + } + return Default_TeleportRobot_VY +} + +func (x *TeleportRobot) GetVAngular() float32 { + if x != nil && x.VAngular != nil { + return *x.VAngular + } + return Default_TeleportRobot_VAngular +} + +func (x *TeleportRobot) GetPresent() bool { + if x != nil && x.Present != nil { + return *x.Present + } + return false +} + +// Control the simulation +type SimulatorControl struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Teleport the ball + TeleportBall *TeleportBall `protobuf:"bytes,1,opt,name=teleport_ball,json=teleportBall" json:"teleport_ball,omitempty"` + // Teleport robots + TeleportRobot []*TeleportRobot `protobuf:"bytes,2,rep,name=teleport_robot,json=teleportRobot" json:"teleport_robot,omitempty"` + // Change the simulation speed + SimulationSpeed *float32 `protobuf:"fixed32,3,opt,name=simulation_speed,json=simulationSpeed" json:"simulation_speed,omitempty"` +} + +func (x *SimulatorControl) Reset() { + *x = SimulatorControl{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SimulatorControl) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SimulatorControl) ProtoMessage() {} + +func (x *SimulatorControl) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_control_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SimulatorControl.ProtoReflect.Descriptor instead. +func (*SimulatorControl) Descriptor() ([]byte, []int) { + return file_ssl_simulation_control_proto_rawDescGZIP(), []int{2} +} + +func (x *SimulatorControl) GetTeleportBall() *TeleportBall { + if x != nil { + return x.TeleportBall + } + return nil +} + +func (x *SimulatorControl) GetTeleportRobot() []*TeleportRobot { + if x != nil { + return x.TeleportRobot + } + return nil +} + +func (x *SimulatorControl) GetSimulationSpeed() float32 { + if x != nil && x.SimulationSpeed != nil { + return *x.SimulationSpeed + } + return 0 +} + +// Command from the connected client to the simulator +type SimulatorCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Control the simulation + Control *SimulatorControl `protobuf:"bytes,1,opt,name=control" json:"control,omitempty"` + // Configure the simulation + Config *SimulatorConfig `protobuf:"bytes,2,opt,name=config" json:"config,omitempty"` +} + +func (x *SimulatorCommand) Reset() { + *x = SimulatorCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SimulatorCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SimulatorCommand) ProtoMessage() {} + +func (x *SimulatorCommand) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_control_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SimulatorCommand.ProtoReflect.Descriptor instead. +func (*SimulatorCommand) Descriptor() ([]byte, []int) { + return file_ssl_simulation_control_proto_rawDescGZIP(), []int{3} +} + +func (x *SimulatorCommand) GetControl() *SimulatorControl { + if x != nil { + return x.Control + } + return nil +} + +func (x *SimulatorCommand) GetConfig() *SimulatorConfig { + if x != nil { + return x.Config + } + return nil +} + +// Response of the simulator to the connected client +type SimulatorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of errors, like using unsupported features + Errors []*SimulatorError `protobuf:"bytes,1,rep,name=errors" json:"errors,omitempty"` +} + +func (x *SimulatorResponse) Reset() { + *x = SimulatorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SimulatorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SimulatorResponse) ProtoMessage() {} + +func (x *SimulatorResponse) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_control_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SimulatorResponse.ProtoReflect.Descriptor instead. +func (*SimulatorResponse) Descriptor() ([]byte, []int) { + return file_ssl_simulation_control_proto_rawDescGZIP(), []int{4} +} + +func (x *SimulatorResponse) GetErrors() []*SimulatorError { + if x != nil { + return x.Errors + } + return nil +} + +var File_ssl_simulation_control_proto protoreflect.FileDescriptor + +var file_ssl_simulation_control_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, + 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, + 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x13, 0x73, + 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1b, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x01, 0x0a, 0x0c, + 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x0c, 0x0a, 0x01, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x01, 0x7a, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x02, 0x76, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x02, 0x76, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x76, 0x7a, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x02, 0x76, 0x7a, 0x12, 0x2e, 0x0a, 0x0f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x53, 0x61, 0x66, 0x65, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, + 0x6c, 0x22, 0xc9, 0x01, 0x0a, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, + 0x62, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x69, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, + 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x03, 0x76, + 0x5f, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52, 0x02, 0x76, 0x58, 0x12, + 0x12, 0x0a, 0x03, 0x76, 0x5f, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52, + 0x02, 0x76, 0x59, 0x12, 0x1e, 0x0a, 0x09, 0x76, 0x5f, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x01, 0x30, 0x52, 0x08, 0x76, 0x41, 0x6e, 0x67, 0x75, + 0x6c, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x22, 0xe4, 0x01, + 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x50, 0x0a, 0x0d, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62, + 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x64, 0x75, 0x2e, + 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, + 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x0c, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x53, 0x0a, 0x0e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, + 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, + 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0d, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x22, 0xa5, 0x01, 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x49, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x64, 0x75, + 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, + 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, + 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x46, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, + 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x5a, 0x0a, 0x11, + 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x45, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x64, 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, + 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, + 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63, 0x74, 0x6c, +} + +var ( + file_ssl_simulation_control_proto_rawDescOnce sync.Once + file_ssl_simulation_control_proto_rawDescData = file_ssl_simulation_control_proto_rawDesc +) + +func file_ssl_simulation_control_proto_rawDescGZIP() []byte { + file_ssl_simulation_control_proto_rawDescOnce.Do(func() { + file_ssl_simulation_control_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_control_proto_rawDescData) + }) + return file_ssl_simulation_control_proto_rawDescData +} + +var file_ssl_simulation_control_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_ssl_simulation_control_proto_goTypes = []interface{}{ + (*TeleportBall)(nil), // 0: edu.tigers.sumatra.simulation.TeleportBall + (*TeleportRobot)(nil), // 1: edu.tigers.sumatra.simulation.TeleportRobot + (*SimulatorControl)(nil), // 2: edu.tigers.sumatra.simulation.SimulatorControl + (*SimulatorCommand)(nil), // 3: edu.tigers.sumatra.simulation.SimulatorCommand + (*SimulatorResponse)(nil), // 4: edu.tigers.sumatra.simulation.SimulatorResponse + (*referee.RobotId)(nil), // 5: RobotId + (*SimulatorConfig)(nil), // 6: edu.tigers.sumatra.simulation.SimulatorConfig + (*SimulatorError)(nil), // 7: edu.tigers.sumatra.simulation.SimulatorError +} +var file_ssl_simulation_control_proto_depIdxs = []int32{ + 5, // 0: edu.tigers.sumatra.simulation.TeleportRobot.id:type_name -> RobotId + 0, // 1: edu.tigers.sumatra.simulation.SimulatorControl.teleport_ball:type_name -> edu.tigers.sumatra.simulation.TeleportBall + 1, // 2: edu.tigers.sumatra.simulation.SimulatorControl.teleport_robot:type_name -> edu.tigers.sumatra.simulation.TeleportRobot + 2, // 3: edu.tigers.sumatra.simulation.SimulatorCommand.control:type_name -> edu.tigers.sumatra.simulation.SimulatorControl + 6, // 4: edu.tigers.sumatra.simulation.SimulatorCommand.config:type_name -> edu.tigers.sumatra.simulation.SimulatorConfig + 7, // 5: edu.tigers.sumatra.simulation.SimulatorResponse.errors:type_name -> edu.tigers.sumatra.simulation.SimulatorError + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name +} + +func init() { file_ssl_simulation_control_proto_init() } +func file_ssl_simulation_control_proto_init() { + if File_ssl_simulation_control_proto != nil { + return + } + file_ssl_simulation_config_proto_init() + file_ssl_simulation_error_proto_init() + if !protoimpl.UnsafeEnabled { + file_ssl_simulation_control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeleportBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeleportRobot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SimulatorControl); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SimulatorCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_simulation_control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SimulatorResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_simulation_control_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_simulation_control_proto_goTypes, + DependencyIndexes: file_ssl_simulation_control_proto_depIdxs, + MessageInfos: file_ssl_simulation_control_proto_msgTypes, + }.Build() + File_ssl_simulation_control_proto = out.File + file_ssl_simulation_control_proto_rawDesc = nil + file_ssl_simulation_control_proto_goTypes = nil + file_ssl_simulation_control_proto_depIdxs = nil +} diff --git a/internal/simctl/ssl_simulation_error.pb.go b/internal/simctl/ssl_simulation_error.pb.go new file mode 100644 index 0000000..da2f903 --- /dev/null +++ b/internal/simctl/ssl_simulation_error.pb.go @@ -0,0 +1,164 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_simulation_error.proto + +package simctl + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Errors in the simulator +type SimulatorError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unique code of the error for automatic handling on client side + Code *string `protobuf:"bytes,1,opt,name=code" json:"code,omitempty"` + // Human readable description of the error + Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` +} + +func (x *SimulatorError) Reset() { + *x = SimulatorError{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_simulation_error_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SimulatorError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SimulatorError) ProtoMessage() {} + +func (x *SimulatorError) ProtoReflect() protoreflect.Message { + mi := &file_ssl_simulation_error_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SimulatorError.ProtoReflect.Descriptor instead. +func (*SimulatorError) Descriptor() ([]byte, []int) { + return file_ssl_simulation_error_proto_rawDescGZIP(), []int{0} +} + +func (x *SimulatorError) GetCode() string { + if x != nil && x.Code != nil { + return *x.Code + } + return "" +} + +func (x *SimulatorError) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +var File_ssl_simulation_error_proto protoreflect.FileDescriptor + +var file_ssl_simulation_error_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x65, 0x64, + 0x75, 0x2e, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x75, 0x6d, 0x61, 0x74, 0x72, 0x61, + 0x2e, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x53, + 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x42, 0x5a, 0x40, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, + 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x69, 0x6d, 0x63, 0x74, 0x6c, +} + +var ( + file_ssl_simulation_error_proto_rawDescOnce sync.Once + file_ssl_simulation_error_proto_rawDescData = file_ssl_simulation_error_proto_rawDesc +) + +func file_ssl_simulation_error_proto_rawDescGZIP() []byte { + file_ssl_simulation_error_proto_rawDescOnce.Do(func() { + file_ssl_simulation_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_simulation_error_proto_rawDescData) + }) + return file_ssl_simulation_error_proto_rawDescData +} + +var file_ssl_simulation_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_ssl_simulation_error_proto_goTypes = []interface{}{ + (*SimulatorError)(nil), // 0: edu.tigers.sumatra.simulation.SimulatorError +} +var file_ssl_simulation_error_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_ssl_simulation_error_proto_init() } +func file_ssl_simulation_error_proto_init() { + if File_ssl_simulation_error_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_simulation_error_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SimulatorError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_simulation_error_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_simulation_error_proto_goTypes, + DependencyIndexes: file_ssl_simulation_error_proto_depIdxs, + MessageInfos: file_ssl_simulation_error_proto_msgTypes, + }.Build() + File_ssl_simulation_error_proto = out.File + file_ssl_simulation_error_proto_rawDesc = nil + file_ssl_simulation_error_proto_goTypes = nil + file_ssl_simulation_error_proto_depIdxs = nil +} diff --git a/internal/sslnet/multicast_server.go b/internal/sslnet/multicast_server.go new file mode 100644 index 0000000..3e6e92c --- /dev/null +++ b/internal/sslnet/multicast_server.go @@ -0,0 +1,141 @@ +package sslnet + +import ( + "log" + "net" + "sync" + "time" +) + +const maxDatagramSize = 8192 + +type MulticastServer struct { + multicastAddress string + connection *net.UDPConn + running bool + consumer func([]byte, *net.UDPAddr) + mutex sync.Mutex + SkipInterfaces []string + Verbose bool +} + +func NewMulticastServer(multicastAddress string, consumer func([]byte, *net.UDPAddr)) (r *MulticastServer) { + r = new(MulticastServer) + r.multicastAddress = multicastAddress + r.consumer = consumer + return +} + +func (r *MulticastServer) Start() { + r.running = true + go r.receive(r.multicastAddress) +} + +func (r *MulticastServer) Stop() { + r.mutex.Lock() + defer r.mutex.Unlock() + r.running = false + if err := r.connection.Close(); err != nil { + log.Println("Could not close connection: ", err) + } +} + +func (r *MulticastServer) receive(multicastAddress string) { + log.Printf("Receiving multicast traffic on %v", multicastAddress) + var currentIfiIdx = 0 + for r.isRunning() { + ifis := r.interfaces() + currentIfiIdx = currentIfiIdx % len(ifis) + ifi := ifis[currentIfiIdx] + r.receiveOnInterface(multicastAddress, ifi) + currentIfiIdx++ + if currentIfiIdx >= len(ifis) { + // cycled though all interfaces once, make a short break to avoid producing endless log messages + time.Sleep(1 * time.Second) + } + } +} + +func (r *MulticastServer) isRunning() bool { + r.mutex.Lock() + defer r.mutex.Unlock() + return r.running +} + +func (r *MulticastServer) interfaces() (interfaces []net.Interface) { + interfaces = []net.Interface{} + ifis, err := net.Interfaces() + if err != nil { + log.Println("Could not get available interfaces: ", err) + } + for _, ifi := range ifis { + if ifi.Flags&net.FlagMulticast == 0 || // No multicast support + r.skipInterface(ifi.Name) { + continue + } + interfaces = append(interfaces, ifi) + } + return +} + +func (r *MulticastServer) skipInterface(ifiName string) bool { + for _, skipIfi := range r.SkipInterfaces { + if skipIfi == ifiName { + return true + } + } + return false +} + +func (r *MulticastServer) receiveOnInterface(multicastAddress string, ifi net.Interface) { + addr, err := net.ResolveUDPAddr("udp", multicastAddress) + if err != nil { + log.Printf("Could resolve multicast address %v: %v", multicastAddress, err) + return + } + + r.connection, err = net.ListenMulticastUDP("udp", &ifi, addr) + if err != nil { + log.Printf("Could not listen at %v: %v", multicastAddress, err) + return + } + + if err := r.connection.SetReadBuffer(maxDatagramSize); err != nil { + log.Println("Could not set read buffer: ", err) + } + + if r.Verbose { + log.Printf("Listening on %s (%s)", multicastAddress, ifi.Name) + } + + first := true + data := make([]byte, maxDatagramSize) + for { + if err := r.connection.SetDeadline(time.Now().Add(300 * time.Millisecond)); err != nil { + log.Println("Could not set deadline on connection: ", err) + } + n, remoteAddr, err := r.connection.ReadFromUDP(data) + if err != nil { + if r.Verbose { + log.Println("ReadFromUDP failed:", err) + } + break + } + + if first { + log.Printf("Got first data packets from %s (%s)", multicastAddress, ifi.Name) + first = false + } + + r.consumer(data[:n], remoteAddr) + } + + if r.Verbose { + log.Printf("Stop listening on %s (%s)", multicastAddress, ifi.Name) + } + + if err := r.connection.Close(); err != nil { + log.Println("Could not close listener: ", err) + } + return +} diff --git a/internal/sslnet/udp_client.go b/internal/sslnet/udp_client.go new file mode 100644 index 0000000..b8f8372 --- /dev/null +++ b/internal/sslnet/udp_client.go @@ -0,0 +1,125 @@ +package sslnet + +import ( + "log" + "net" + "sync" +) + +// UdpClient establishes a UDP connection to a server +type UdpClient struct { + Name string + Consumer func([]byte) + address string + conns []*net.UDPConn + running bool + mutex sync.Mutex + receivers sync.WaitGroup +} + +// NewUdpClient creates a new UDP client +func NewUdpClient(address string) (t *UdpClient) { + t = new(UdpClient) + t.Name = "UdpClient" + t.address = address + t.Consumer = func([]byte) {} + return +} + +// Start the client by listening for responses it a separate goroutine +func (c *UdpClient) Start() { + c.mutex.Lock() + defer c.mutex.Unlock() + if !c.running { + log.Printf("%v - Starting", c.Name) + c.running = true + c.connect() + log.Printf("%v - Started", c.Name) + } +} + +// Stop the client by stop listening for responses and closing all existing connections +func (c *UdpClient) Stop() { + c.mutex.Lock() + defer c.mutex.Unlock() + if c.running { + log.Printf("%v - Stopping", c.Name) + c.running = false + for _, conn := range c.conns { + if err := conn.Close(); err != nil { + log.Printf("%v - Could not close client connection: %v", c.Name, err) + } + } + c.receivers.Wait() + c.conns = []*net.UDPConn{} + log.Printf("%v - Stopped", c.Name) + } +} + +// Send data to the server +func (c *UdpClient) Send(data []byte) { + c.mutex.Lock() + defer c.mutex.Unlock() + for _, conn := range c.conns { + if _, err := conn.Write(data); err != nil { + log.Printf("%v - Could not write to %s at %s: %s", c.Name, conn.RemoteAddr(), conn.LocalAddr(), err) + } + } +} + +func (c *UdpClient) connect() { + log.Printf("%v - Connecting to %v", c.Name, c.address) + addr, err := net.ResolveUDPAddr("udp", c.address) + if err != nil { + log.Printf("%v - Could resolve address %v: %v", c.Name, c.address, err) + return + } + + iaddrs, err := net.InterfaceAddrs() + if err != nil { + log.Printf("%v - Could not retrieve interface addresses: %v", c.Name, err) + return + } + + for _, iaddr := range iaddrs { + ip := iaddr.(*net.IPNet).IP + if ip.To4() == nil { + // Ignore IPv6 for now + continue + } + laddr := &net.UDPAddr{IP: ip} + conn, err := net.DialUDP("udp", laddr, addr) + if err != nil { + log.Printf("%v - Could not connect to %v at %v: %v", c.Name, addr, laddr, err) + continue + } + + if err := conn.SetWriteBuffer(maxDatagramSize); err != nil { + log.Printf("%v - Could not set read buffer: %v", c.Name, err) + } + + c.conns = append(c.conns, conn) + go c.receive(conn) + } +} + +func (c *UdpClient) receive(conn *net.UDPConn) { + log.Printf("%v - Connected to %s at %s", c.Name, conn.RemoteAddr(), conn.LocalAddr()) + defer log.Printf("%v - Disconnected from %s at %s", c.Name, conn.RemoteAddr(), conn.LocalAddr()) + + c.receivers.Add(1) + defer c.receivers.Done() + + data := make([]byte, maxDatagramSize) + for { + n, _, err := conn.ReadFrom(data) + if err != nil { + if opErr, ok := err.(*net.OpError); !ok || opErr.Err.Error() != "use of closed network connection" { + log.Printf("%v - Could not receive data from %s at %s: %s", c.Name, conn.RemoteAddr(), conn.LocalAddr(), err) + } + return + } else { + c.Consumer(data[:n]) + } + } +} diff --git a/internal/tracker/ssl_vision_detection_tracked.pb.go b/internal/tracker/ssl_vision_detection_tracked.pb.go new file mode 100644 index 0000000..348b311 --- /dev/null +++ b/internal/tracker/ssl_vision_detection_tracked.pb.go @@ -0,0 +1,641 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_vision_detection_tracked.proto + +package tracker + +import ( + geom "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom" + referee "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Capabilities that a source implementation can have +type Capability int32 + +const ( + Capability_CAPABILITY_UNKNOWN Capability = 0 + Capability_CAPABILITY_DETECT_FLYING_BALLS Capability = 1 + Capability_CAPABILITY_DETECT_MULTIPLE_BALLS Capability = 2 + Capability_CAPABILITY_DETECT_KICKED_BALLS Capability = 3 +) + +// Enum value maps for Capability. +var ( + Capability_name = map[int32]string{ + 0: "CAPABILITY_UNKNOWN", + 1: "CAPABILITY_DETECT_FLYING_BALLS", + 2: "CAPABILITY_DETECT_MULTIPLE_BALLS", + 3: "CAPABILITY_DETECT_KICKED_BALLS", + } + Capability_value = map[string]int32{ + "CAPABILITY_UNKNOWN": 0, + "CAPABILITY_DETECT_FLYING_BALLS": 1, + "CAPABILITY_DETECT_MULTIPLE_BALLS": 2, + "CAPABILITY_DETECT_KICKED_BALLS": 3, + } +) + +func (x Capability) Enum() *Capability { + p := new(Capability) + *p = x + return p +} + +func (x Capability) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Capability) Descriptor() protoreflect.EnumDescriptor { + return file_ssl_vision_detection_tracked_proto_enumTypes[0].Descriptor() +} + +func (Capability) Type() protoreflect.EnumType { + return &file_ssl_vision_detection_tracked_proto_enumTypes[0] +} + +func (x Capability) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Capability) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Capability(num) + return nil +} + +// Deprecated: Use Capability.Descriptor instead. +func (Capability) EnumDescriptor() ([]byte, []int) { + return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{0} +} + +// A single tracked ball +type TrackedBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The position (x, y, height) [m] in the ssl-vision coordinate system + Pos *geom.Vector3 `protobuf:"bytes,1,req,name=pos" json:"pos,omitempty"` + // The velocity [m/s] in the ssl-vision coordinate system + Vel *geom.Vector3 `protobuf:"bytes,2,opt,name=vel" json:"vel,omitempty"` + // The visibility of the ball + // A value between 0 (not visible) and 1 (visible) + // The exact implementation depends on the source software + Visibility *float32 `protobuf:"fixed32,3,opt,name=visibility" json:"visibility,omitempty"` +} + +func (x *TrackedBall) Reset() { + *x = TrackedBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrackedBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackedBall) ProtoMessage() {} + +func (x *TrackedBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackedBall.ProtoReflect.Descriptor instead. +func (*TrackedBall) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{0} +} + +func (x *TrackedBall) GetPos() *geom.Vector3 { + if x != nil { + return x.Pos + } + return nil +} + +func (x *TrackedBall) GetVel() *geom.Vector3 { + if x != nil { + return x.Vel + } + return nil +} + +func (x *TrackedBall) GetVisibility() float32 { + if x != nil && x.Visibility != nil { + return *x.Visibility + } + return 0 +} + +// A ball kicked by a robot, including predictions when the ball will come to a stop +type KickedBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The initial position [m] from which the ball was kicked + Pos *geom.Vector2 `protobuf:"bytes,1,req,name=pos" json:"pos,omitempty"` + // The initial velocity [m/s] with which the ball was kicked + Vel *geom.Vector3 `protobuf:"bytes,2,req,name=vel" json:"vel,omitempty"` + // The unix timestamp [s] when the kick was performed + StartTimestamp *float64 `protobuf:"fixed64,3,req,name=start_timestamp,json=startTimestamp" json:"start_timestamp,omitempty"` + // The predicted unix timestamp [s] when the ball comes to a stop + StopTimestamp *float64 `protobuf:"fixed64,4,opt,name=stop_timestamp,json=stopTimestamp" json:"stop_timestamp,omitempty"` + // The predicted position [m] at which the ball will come to a stop + StopPos *geom.Vector2 `protobuf:"bytes,5,opt,name=stop_pos,json=stopPos" json:"stop_pos,omitempty"` + // The robot that kicked the ball + RobotId *referee.RobotId `protobuf:"bytes,6,opt,name=robot_id,json=robotId" json:"robot_id,omitempty"` +} + +func (x *KickedBall) Reset() { + *x = KickedBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KickedBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KickedBall) ProtoMessage() {} + +func (x *KickedBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KickedBall.ProtoReflect.Descriptor instead. +func (*KickedBall) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{1} +} + +func (x *KickedBall) GetPos() *geom.Vector2 { + if x != nil { + return x.Pos + } + return nil +} + +func (x *KickedBall) GetVel() *geom.Vector3 { + if x != nil { + return x.Vel + } + return nil +} + +func (x *KickedBall) GetStartTimestamp() float64 { + if x != nil && x.StartTimestamp != nil { + return *x.StartTimestamp + } + return 0 +} + +func (x *KickedBall) GetStopTimestamp() float64 { + if x != nil && x.StopTimestamp != nil { + return *x.StopTimestamp + } + return 0 +} + +func (x *KickedBall) GetStopPos() *geom.Vector2 { + if x != nil { + return x.StopPos + } + return nil +} + +func (x *KickedBall) GetRobotId() *referee.RobotId { + if x != nil { + return x.RobotId + } + return nil +} + +// A single tracked robot +type TrackedRobot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RobotId *referee.RobotId `protobuf:"bytes,1,req,name=robot_id,json=robotId" json:"robot_id,omitempty"` + // The position [m] in the ssl-vision coordinate system + Pos *geom.Vector2 `protobuf:"bytes,2,req,name=pos" json:"pos,omitempty"` + // The orientation [rad] in the ssl-vision coordinate system + Orientation *float32 `protobuf:"fixed32,3,req,name=orientation" json:"orientation,omitempty"` + // The velocity [m/s] in the ssl-vision coordinate system + Vel *geom.Vector2 `protobuf:"bytes,4,opt,name=vel" json:"vel,omitempty"` + // The angular velocity [rad/s] in the ssl-vision coordinate system + VelAngular *float32 `protobuf:"fixed32,5,opt,name=vel_angular,json=velAngular" json:"vel_angular,omitempty"` + // The visibility of the robot + // A value between 0 (not visible) and 1 (visible) + // The exact implementation depends on the source software + Visibility *float32 `protobuf:"fixed32,6,opt,name=visibility" json:"visibility,omitempty"` +} + +func (x *TrackedRobot) Reset() { + *x = TrackedRobot{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrackedRobot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackedRobot) ProtoMessage() {} + +func (x *TrackedRobot) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackedRobot.ProtoReflect.Descriptor instead. +func (*TrackedRobot) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{2} +} + +func (x *TrackedRobot) GetRobotId() *referee.RobotId { + if x != nil { + return x.RobotId + } + return nil +} + +func (x *TrackedRobot) GetPos() *geom.Vector2 { + if x != nil { + return x.Pos + } + return nil +} + +func (x *TrackedRobot) GetOrientation() float32 { + if x != nil && x.Orientation != nil { + return *x.Orientation + } + return 0 +} + +func (x *TrackedRobot) GetVel() *geom.Vector2 { + if x != nil { + return x.Vel + } + return nil +} + +func (x *TrackedRobot) GetVelAngular() float32 { + if x != nil && x.VelAngular != nil { + return *x.VelAngular + } + return 0 +} + +func (x *TrackedRobot) GetVisibility() float32 { + if x != nil && x.Visibility != nil { + return *x.Visibility + } + return 0 +} + +// A frame that contains all currently tracked objects on the field on all cameras +type TrackedFrame struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A monotonous increasing frame counter + FrameNumber *uint32 `protobuf:"varint,1,req,name=frame_number,json=frameNumber" json:"frame_number,omitempty"` + // The unix timestamp in [s] of the data + // If timestamp is larger than timestamp_captured, the source has applied a prediction already + Timestamp *float64 `protobuf:"fixed64,2,req,name=timestamp" json:"timestamp,omitempty"` + // The list of detected balls + // The first ball is the primary one + // Sources may add additional balls based on their capabilities + Balls []*TrackedBall `protobuf:"bytes,3,rep,name=balls" json:"balls,omitempty"` + // The list of detected robots of both teams + Robots []*TrackedRobot `protobuf:"bytes,4,rep,name=robots" json:"robots,omitempty"` + // Information about a kicked ball, if the ball was kicked by a robot and is still moving + // Note: This field is optional. Some source implementations might not set this at any time + KickedBall *KickedBall `protobuf:"bytes,5,opt,name=kicked_ball,json=kickedBall" json:"kicked_ball,omitempty"` + // List of capabilities of the source implementation + Capabilities []Capability `protobuf:"varint,6,rep,name=capabilities,enum=Capability" json:"capabilities,omitempty"` +} + +func (x *TrackedFrame) Reset() { + *x = TrackedFrame{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrackedFrame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackedFrame) ProtoMessage() {} + +func (x *TrackedFrame) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_tracked_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackedFrame.ProtoReflect.Descriptor instead. +func (*TrackedFrame) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_tracked_proto_rawDescGZIP(), []int{3} +} + +func (x *TrackedFrame) GetFrameNumber() uint32 { + if x != nil && x.FrameNumber != nil { + return *x.FrameNumber + } + return 0 +} + +func (x *TrackedFrame) GetTimestamp() float64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +func (x *TrackedFrame) GetBalls() []*TrackedBall { + if x != nil { + return x.Balls + } + return nil +} + +func (x *TrackedFrame) GetRobots() []*TrackedRobot { + if x != nil { + return x.Robots + } + return nil +} + +func (x *TrackedFrame) GetKickedBall() *KickedBall { + if x != nil { + return x.KickedBall + } + return nil +} + +func (x *TrackedFrame) GetCapabilities() []Capability { + if x != nil { + return x.Capabilities + } + return nil +} + +var File_ssl_vision_detection_tracked_proto protoreflect.FileDescriptor + +var file_ssl_vision_detection_tracked_proto_rawDesc = []byte{ + 0x0a, 0x22, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x73, 0x6c, 0x5f, 0x67, 0x63, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x73, 0x6c, 0x5f, 0x67, + 0x63, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x65, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, + 0x1a, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x76, + 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x33, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xde, 0x01, 0x0a, 0x0a, 0x4b, 0x69, 0x63, 0x6b, + 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x1a, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x70, + 0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x33, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x03, 0x20, 0x02, 0x28, 0x01, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x70, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, + 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, + 0x50, 0x6f, 0x73, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, + 0x07, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x22, 0xce, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x6f, 0x62, + 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x6f, + 0x62, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x07, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, + 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, + 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x03, + 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x32, 0x52, 0x03, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x65, 0x6c, 0x5f, + 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76, + 0x65, 0x6c, 0x41, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xf9, 0x01, 0x0a, 0x0c, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x02, 0x28, 0x01, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x05, 0x62, + 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x12, + 0x25, 0x0a, 0x06, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x06, + 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x0b, 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x62, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4b, 0x69, + 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x0a, 0x6b, 0x69, 0x63, 0x6b, 0x65, 0x64, + 0x42, 0x61, 0x6c, 0x6c, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x2a, 0x92, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, + 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, + 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x5f, 0x46, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x01, + 0x12, 0x24, 0x0a, 0x20, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x42, + 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x43, 0x4b, + 0x45, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x4c, 0x53, 0x10, 0x03, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, + 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, +} + +var ( + file_ssl_vision_detection_tracked_proto_rawDescOnce sync.Once + file_ssl_vision_detection_tracked_proto_rawDescData = file_ssl_vision_detection_tracked_proto_rawDesc +) + +func file_ssl_vision_detection_tracked_proto_rawDescGZIP() []byte { + file_ssl_vision_detection_tracked_proto_rawDescOnce.Do(func() { + file_ssl_vision_detection_tracked_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_detection_tracked_proto_rawDescData) + }) + return file_ssl_vision_detection_tracked_proto_rawDescData +} + +var file_ssl_vision_detection_tracked_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_ssl_vision_detection_tracked_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_ssl_vision_detection_tracked_proto_goTypes = []interface{}{ + (Capability)(0), // 0: Capability + (*TrackedBall)(nil), // 1: TrackedBall + (*KickedBall)(nil), // 2: KickedBall + (*TrackedRobot)(nil), // 3: TrackedRobot + (*TrackedFrame)(nil), // 4: TrackedFrame + (*geom.Vector3)(nil), // 5: Vector3 + (*geom.Vector2)(nil), // 6: Vector2 + (*referee.RobotId)(nil), // 7: RobotId +} +var file_ssl_vision_detection_tracked_proto_depIdxs = []int32{ + 5, // 0: TrackedBall.pos:type_name -> Vector3 + 5, // 1: TrackedBall.vel:type_name -> Vector3 + 6, // 2: KickedBall.pos:type_name -> Vector2 + 5, // 3: KickedBall.vel:type_name -> Vector3 + 6, // 4: KickedBall.stop_pos:type_name -> Vector2 + 7, // 5: KickedBall.robot_id:type_name -> RobotId + 7, // 6: TrackedRobot.robot_id:type_name -> RobotId + 6, // 7: TrackedRobot.pos:type_name -> Vector2 + 6, // 8: TrackedRobot.vel:type_name -> Vector2 + 1, // 9: TrackedFrame.balls:type_name -> TrackedBall + 3, // 10: TrackedFrame.robots:type_name -> TrackedRobot + 2, // 11: TrackedFrame.kicked_ball:type_name -> KickedBall + 0, // 12: TrackedFrame.capabilities:type_name -> Capability + 13, // [13:13] is the sub-list for method output_type + 13, // [13:13] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_ssl_vision_detection_tracked_proto_init() } +func file_ssl_vision_detection_tracked_proto_init() { + if File_ssl_vision_detection_tracked_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_vision_detection_tracked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrackedBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_detection_tracked_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KickedBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_detection_tracked_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrackedRobot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_detection_tracked_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrackedFrame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_vision_detection_tracked_proto_rawDesc, + NumEnums: 1, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_vision_detection_tracked_proto_goTypes, + DependencyIndexes: file_ssl_vision_detection_tracked_proto_depIdxs, + EnumInfos: file_ssl_vision_detection_tracked_proto_enumTypes, + MessageInfos: file_ssl_vision_detection_tracked_proto_msgTypes, + }.Build() + File_ssl_vision_detection_tracked_proto = out.File + file_ssl_vision_detection_tracked_proto_rawDesc = nil + file_ssl_vision_detection_tracked_proto_goTypes = nil + file_ssl_vision_detection_tracked_proto_depIdxs = nil +} diff --git a/internal/tracker/ssl_vision_wrapper_tracked.pb.go b/internal/tracker/ssl_vision_wrapper_tracked.pb.go new file mode 100644 index 0000000..2962827 --- /dev/null +++ b/internal/tracker/ssl_vision_wrapper_tracked.pb.go @@ -0,0 +1,183 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_vision_wrapper_tracked.proto + +package tracker + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// A wrapper packet containing meta data of the source +// Also serves for the possibility to extend the protocol later +type TrackerWrapperPacket struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A random UUID of the source that is kept constant at the source while running + // If multiple sources are broadcasting to the same network, this id can be used to identify individual sources + Uuid *string `protobuf:"bytes,1,req,name=uuid" json:"uuid,omitempty"` + // The name of the source software that is producing this messages. + SourceName *string `protobuf:"bytes,2,opt,name=source_name,json=sourceName" json:"source_name,omitempty"` + // The tracked frame + TrackedFrame *TrackedFrame `protobuf:"bytes,3,opt,name=tracked_frame,json=trackedFrame" json:"tracked_frame,omitempty"` +} + +func (x *TrackerWrapperPacket) Reset() { + *x = TrackerWrapperPacket{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_wrapper_tracked_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrackerWrapperPacket) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackerWrapperPacket) ProtoMessage() {} + +func (x *TrackerWrapperPacket) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_wrapper_tracked_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackerWrapperPacket.ProtoReflect.Descriptor instead. +func (*TrackerWrapperPacket) Descriptor() ([]byte, []int) { + return file_ssl_vision_wrapper_tracked_proto_rawDescGZIP(), []int{0} +} + +func (x *TrackerWrapperPacket) GetUuid() string { + if x != nil && x.Uuid != nil { + return *x.Uuid + } + return "" +} + +func (x *TrackerWrapperPacket) GetSourceName() string { + if x != nil && x.SourceName != nil { + return *x.SourceName + } + return "" +} + +func (x *TrackerWrapperPacket) GetTrackedFrame() *TrackedFrame { + if x != nil { + return x.TrackedFrame + } + return nil +} + +var File_ssl_vision_wrapper_tracked_proto protoreflect.FileDescriptor + +var file_ssl_vision_wrapper_tracked_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x22, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7f, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x72, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, + 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, +} + +var ( + file_ssl_vision_wrapper_tracked_proto_rawDescOnce sync.Once + file_ssl_vision_wrapper_tracked_proto_rawDescData = file_ssl_vision_wrapper_tracked_proto_rawDesc +) + +func file_ssl_vision_wrapper_tracked_proto_rawDescGZIP() []byte { + file_ssl_vision_wrapper_tracked_proto_rawDescOnce.Do(func() { + file_ssl_vision_wrapper_tracked_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_wrapper_tracked_proto_rawDescData) + }) + return file_ssl_vision_wrapper_tracked_proto_rawDescData +} + +var file_ssl_vision_wrapper_tracked_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_ssl_vision_wrapper_tracked_proto_goTypes = []interface{}{ + (*TrackerWrapperPacket)(nil), // 0: TrackerWrapperPacket + (*TrackedFrame)(nil), // 1: TrackedFrame +} +var file_ssl_vision_wrapper_tracked_proto_depIdxs = []int32{ + 1, // 0: TrackerWrapperPacket.tracked_frame:type_name -> TrackedFrame + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_ssl_vision_wrapper_tracked_proto_init() } +func file_ssl_vision_wrapper_tracked_proto_init() { + if File_ssl_vision_wrapper_tracked_proto != nil { + return + } + file_ssl_vision_detection_tracked_proto_init() + if !protoimpl.UnsafeEnabled { + file_ssl_vision_wrapper_tracked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrackerWrapperPacket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_vision_wrapper_tracked_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_vision_wrapper_tracked_proto_goTypes, + DependencyIndexes: file_ssl_vision_wrapper_tracked_proto_depIdxs, + MessageInfos: file_ssl_vision_wrapper_tracked_proto_msgTypes, + }.Build() + File_ssl_vision_wrapper_tracked_proto = out.File + file_ssl_vision_wrapper_tracked_proto_rawDesc = nil + file_ssl_vision_wrapper_tracked_proto_goTypes = nil + file_ssl_vision_wrapper_tracked_proto_depIdxs = nil +} diff --git a/internal/vision/ssl_vision_detection.pb.go b/internal/vision/ssl_vision_detection.pb.go new file mode 100644 index 0000000..d935459 --- /dev/null +++ b/internal/vision/ssl_vision_detection.pb.go @@ -0,0 +1,465 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_vision_detection.proto + +package vision + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type SSL_DetectionBall struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Confidence *float32 `protobuf:"fixed32,1,req,name=confidence" json:"confidence,omitempty"` + Area *uint32 `protobuf:"varint,2,opt,name=area" json:"area,omitempty"` + X *float32 `protobuf:"fixed32,3,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,4,req,name=y" json:"y,omitempty"` + Z *float32 `protobuf:"fixed32,5,opt,name=z" json:"z,omitempty"` + PixelX *float32 `protobuf:"fixed32,6,req,name=pixel_x,json=pixelX" json:"pixel_x,omitempty"` + PixelY *float32 `protobuf:"fixed32,7,req,name=pixel_y,json=pixelY" json:"pixel_y,omitempty"` +} + +func (x *SSL_DetectionBall) Reset() { + *x = SSL_DetectionBall{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_DetectionBall) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_DetectionBall) ProtoMessage() {} + +func (x *SSL_DetectionBall) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_DetectionBall.ProtoReflect.Descriptor instead. +func (*SSL_DetectionBall) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_proto_rawDescGZIP(), []int{0} +} + +func (x *SSL_DetectionBall) GetConfidence() float32 { + if x != nil && x.Confidence != nil { + return *x.Confidence + } + return 0 +} + +func (x *SSL_DetectionBall) GetArea() uint32 { + if x != nil && x.Area != nil { + return *x.Area + } + return 0 +} + +func (x *SSL_DetectionBall) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *SSL_DetectionBall) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +func (x *SSL_DetectionBall) GetZ() float32 { + if x != nil && x.Z != nil { + return *x.Z + } + return 0 +} + +func (x *SSL_DetectionBall) GetPixelX() float32 { + if x != nil && x.PixelX != nil { + return *x.PixelX + } + return 0 +} + +func (x *SSL_DetectionBall) GetPixelY() float32 { + if x != nil && x.PixelY != nil { + return *x.PixelY + } + return 0 +} + +type SSL_DetectionRobot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Confidence *float32 `protobuf:"fixed32,1,req,name=confidence" json:"confidence,omitempty"` + RobotId *uint32 `protobuf:"varint,2,opt,name=robot_id,json=robotId" json:"robot_id,omitempty"` + X *float32 `protobuf:"fixed32,3,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,4,req,name=y" json:"y,omitempty"` + Orientation *float32 `protobuf:"fixed32,5,opt,name=orientation" json:"orientation,omitempty"` + PixelX *float32 `protobuf:"fixed32,6,req,name=pixel_x,json=pixelX" json:"pixel_x,omitempty"` + PixelY *float32 `protobuf:"fixed32,7,req,name=pixel_y,json=pixelY" json:"pixel_y,omitempty"` + Height *float32 `protobuf:"fixed32,8,opt,name=height" json:"height,omitempty"` +} + +func (x *SSL_DetectionRobot) Reset() { + *x = SSL_DetectionRobot{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_DetectionRobot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_DetectionRobot) ProtoMessage() {} + +func (x *SSL_DetectionRobot) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_DetectionRobot.ProtoReflect.Descriptor instead. +func (*SSL_DetectionRobot) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_proto_rawDescGZIP(), []int{1} +} + +func (x *SSL_DetectionRobot) GetConfidence() float32 { + if x != nil && x.Confidence != nil { + return *x.Confidence + } + return 0 +} + +func (x *SSL_DetectionRobot) GetRobotId() uint32 { + if x != nil && x.RobotId != nil { + return *x.RobotId + } + return 0 +} + +func (x *SSL_DetectionRobot) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *SSL_DetectionRobot) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +func (x *SSL_DetectionRobot) GetOrientation() float32 { + if x != nil && x.Orientation != nil { + return *x.Orientation + } + return 0 +} + +func (x *SSL_DetectionRobot) GetPixelX() float32 { + if x != nil && x.PixelX != nil { + return *x.PixelX + } + return 0 +} + +func (x *SSL_DetectionRobot) GetPixelY() float32 { + if x != nil && x.PixelY != nil { + return *x.PixelY + } + return 0 +} + +func (x *SSL_DetectionRobot) GetHeight() float32 { + if x != nil && x.Height != nil { + return *x.Height + } + return 0 +} + +type SSL_DetectionFrame struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameNumber *uint32 `protobuf:"varint,1,req,name=frame_number,json=frameNumber" json:"frame_number,omitempty"` + TCapture *float64 `protobuf:"fixed64,2,req,name=t_capture,json=tCapture" json:"t_capture,omitempty"` + TSent *float64 `protobuf:"fixed64,3,req,name=t_sent,json=tSent" json:"t_sent,omitempty"` + CameraId *uint32 `protobuf:"varint,4,req,name=camera_id,json=cameraId" json:"camera_id,omitempty"` + Balls []*SSL_DetectionBall `protobuf:"bytes,5,rep,name=balls" json:"balls,omitempty"` + RobotsYellow []*SSL_DetectionRobot `protobuf:"bytes,6,rep,name=robots_yellow,json=robotsYellow" json:"robots_yellow,omitempty"` + RobotsBlue []*SSL_DetectionRobot `protobuf:"bytes,7,rep,name=robots_blue,json=robotsBlue" json:"robots_blue,omitempty"` +} + +func (x *SSL_DetectionFrame) Reset() { + *x = SSL_DetectionFrame{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_detection_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_DetectionFrame) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_DetectionFrame) ProtoMessage() {} + +func (x *SSL_DetectionFrame) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_detection_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_DetectionFrame.ProtoReflect.Descriptor instead. +func (*SSL_DetectionFrame) Descriptor() ([]byte, []int) { + return file_ssl_vision_detection_proto_rawDescGZIP(), []int{2} +} + +func (x *SSL_DetectionFrame) GetFrameNumber() uint32 { + if x != nil && x.FrameNumber != nil { + return *x.FrameNumber + } + return 0 +} + +func (x *SSL_DetectionFrame) GetTCapture() float64 { + if x != nil && x.TCapture != nil { + return *x.TCapture + } + return 0 +} + +func (x *SSL_DetectionFrame) GetTSent() float64 { + if x != nil && x.TSent != nil { + return *x.TSent + } + return 0 +} + +func (x *SSL_DetectionFrame) GetCameraId() uint32 { + if x != nil && x.CameraId != nil { + return *x.CameraId + } + return 0 +} + +func (x *SSL_DetectionFrame) GetBalls() []*SSL_DetectionBall { + if x != nil { + return x.Balls + } + return nil +} + +func (x *SSL_DetectionFrame) GetRobotsYellow() []*SSL_DetectionRobot { + if x != nil { + return x.RobotsYellow + } + return nil +} + +func (x *SSL_DetectionFrame) GetRobotsBlue() []*SSL_DetectionRobot { + if x != nil { + return x.RobotsBlue + } + return nil +} + +var File_ssl_vision_detection_proto protoreflect.FileDescriptor + +var file_ssl_vision_detection_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x01, 0x0a, + 0x11, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, + 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x61, 0x72, 0x65, 0x61, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x03, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, + 0x01, 0x79, 0x12, 0x0c, 0x0a, 0x01, 0x7a, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x01, 0x7a, + 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x78, 0x18, 0x06, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x58, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78, + 0x65, 0x6c, 0x5f, 0x79, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, + 0x6c, 0x59, 0x22, 0xd7, 0x01, 0x0a, 0x12, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x62, + 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x6f, 0x62, + 0x6f, 0x74, 0x49, 0x64, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, + 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x01, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x78, 0x18, 0x06, 0x20, + 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x58, 0x12, 0x17, 0x0a, 0x07, 0x70, + 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x79, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x06, 0x70, 0x69, + 0x78, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xa2, 0x02, 0x0a, + 0x12, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x01, 0x52, 0x08, 0x74, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x02, 0x28, 0x01, 0x52, 0x05, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x63, + 0x61, 0x6d, 0x65, 0x72, 0x61, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x05, 0x62, 0x61, 0x6c, 0x6c, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x6c, 0x52, 0x05, 0x62, 0x61, 0x6c, 0x6c, + 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, 0x79, 0x65, 0x6c, 0x6c, + 0x6f, 0x77, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0c, 0x72, + 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x0b, 0x72, + 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x42, 0x6c, 0x75, + 0x65, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, + 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, +} + +var ( + file_ssl_vision_detection_proto_rawDescOnce sync.Once + file_ssl_vision_detection_proto_rawDescData = file_ssl_vision_detection_proto_rawDesc +) + +func file_ssl_vision_detection_proto_rawDescGZIP() []byte { + file_ssl_vision_detection_proto_rawDescOnce.Do(func() { + file_ssl_vision_detection_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_detection_proto_rawDescData) + }) + return file_ssl_vision_detection_proto_rawDescData +} + +var file_ssl_vision_detection_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_ssl_vision_detection_proto_goTypes = []interface{}{ + (*SSL_DetectionBall)(nil), // 0: SSL_DetectionBall + (*SSL_DetectionRobot)(nil), // 1: SSL_DetectionRobot + (*SSL_DetectionFrame)(nil), // 2: SSL_DetectionFrame +} +var file_ssl_vision_detection_proto_depIdxs = []int32{ + 0, // 0: SSL_DetectionFrame.balls:type_name -> SSL_DetectionBall + 1, // 1: SSL_DetectionFrame.robots_yellow:type_name -> SSL_DetectionRobot + 1, // 2: SSL_DetectionFrame.robots_blue:type_name -> SSL_DetectionRobot + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_ssl_vision_detection_proto_init() } +func file_ssl_vision_detection_proto_init() { + if File_ssl_vision_detection_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_vision_detection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_DetectionBall); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_detection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_DetectionRobot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_detection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_DetectionFrame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_vision_detection_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_vision_detection_proto_goTypes, + DependencyIndexes: file_ssl_vision_detection_proto_depIdxs, + MessageInfos: file_ssl_vision_detection_proto_msgTypes, + }.Build() + File_ssl_vision_detection_proto = out.File + file_ssl_vision_detection_proto_rawDesc = nil + file_ssl_vision_detection_proto_goTypes = nil + file_ssl_vision_detection_proto_depIdxs = nil +} diff --git a/internal/vision/ssl_vision_geometry.pb.go b/internal/vision/ssl_vision_geometry.pb.go new file mode 100644 index 0000000..fb0e6c3 --- /dev/null +++ b/internal/vision/ssl_vision_geometry.pb.go @@ -0,0 +1,790 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_vision_geometry.proto + +package vision + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// A 2D float vector. +type Vector2F struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + X *float32 `protobuf:"fixed32,1,req,name=x" json:"x,omitempty"` + Y *float32 `protobuf:"fixed32,2,req,name=y" json:"y,omitempty"` +} + +func (x *Vector2F) Reset() { + *x = Vector2F{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Vector2F) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector2F) ProtoMessage() {} + +func (x *Vector2F) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector2F.ProtoReflect.Descriptor instead. +func (*Vector2F) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{0} +} + +func (x *Vector2F) GetX() float32 { + if x != nil && x.X != nil { + return *x.X + } + return 0 +} + +func (x *Vector2F) GetY() float32 { + if x != nil && x.Y != nil { + return *x.Y + } + return 0 +} + +// Represents a field marking as a line segment represented by a start point p1, +// and end point p2, and a line thickness. The start and end points are along +// the center of the line, so the thickness of the line extends by thickness / 2 +// on either side of the line. +type SSL_FieldLineSegment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name of this field marking. + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + // Start point of the line segment. + P1 *Vector2F `protobuf:"bytes,2,req,name=p1" json:"p1,omitempty"` + // End point of the line segment. + P2 *Vector2F `protobuf:"bytes,3,req,name=p2" json:"p2,omitempty"` + // Thickness of the line segment. + Thickness *float32 `protobuf:"fixed32,4,req,name=thickness" json:"thickness,omitempty"` +} + +func (x *SSL_FieldLineSegment) Reset() { + *x = SSL_FieldLineSegment{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_FieldLineSegment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_FieldLineSegment) ProtoMessage() {} + +func (x *SSL_FieldLineSegment) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_FieldLineSegment.ProtoReflect.Descriptor instead. +func (*SSL_FieldLineSegment) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{1} +} + +func (x *SSL_FieldLineSegment) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *SSL_FieldLineSegment) GetP1() *Vector2F { + if x != nil { + return x.P1 + } + return nil +} + +func (x *SSL_FieldLineSegment) GetP2() *Vector2F { + if x != nil { + return x.P2 + } + return nil +} + +func (x *SSL_FieldLineSegment) GetThickness() float32 { + if x != nil && x.Thickness != nil { + return *x.Thickness + } + return 0 +} + +// Represents a field marking as a circular arc segment represented by center point, a +// start angle, an end angle, and an arc thickness. +type SSL_FieldCicularArc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name of this field marking. + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + // Center point of the circular arc. + Center *Vector2F `protobuf:"bytes,2,req,name=center" json:"center,omitempty"` + // Radius of the arc. + Radius *float32 `protobuf:"fixed32,3,req,name=radius" json:"radius,omitempty"` + // Start angle in counter-clockwise order. + A1 *float32 `protobuf:"fixed32,4,req,name=a1" json:"a1,omitempty"` + // End angle in counter-clockwise order. + A2 *float32 `protobuf:"fixed32,5,req,name=a2" json:"a2,omitempty"` + // Thickness of the arc. + Thickness *float32 `protobuf:"fixed32,6,req,name=thickness" json:"thickness,omitempty"` +} + +func (x *SSL_FieldCicularArc) Reset() { + *x = SSL_FieldCicularArc{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_FieldCicularArc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_FieldCicularArc) ProtoMessage() {} + +func (x *SSL_FieldCicularArc) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_FieldCicularArc.ProtoReflect.Descriptor instead. +func (*SSL_FieldCicularArc) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{2} +} + +func (x *SSL_FieldCicularArc) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *SSL_FieldCicularArc) GetCenter() *Vector2F { + if x != nil { + return x.Center + } + return nil +} + +func (x *SSL_FieldCicularArc) GetRadius() float32 { + if x != nil && x.Radius != nil { + return *x.Radius + } + return 0 +} + +func (x *SSL_FieldCicularArc) GetA1() float32 { + if x != nil && x.A1 != nil { + return *x.A1 + } + return 0 +} + +func (x *SSL_FieldCicularArc) GetA2() float32 { + if x != nil && x.A2 != nil { + return *x.A2 + } + return 0 +} + +func (x *SSL_FieldCicularArc) GetThickness() float32 { + if x != nil && x.Thickness != nil { + return *x.Thickness + } + return 0 +} + +type SSL_GeometryFieldSize struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldLength *int32 `protobuf:"varint,1,req,name=field_length,json=fieldLength" json:"field_length,omitempty"` + FieldWidth *int32 `protobuf:"varint,2,req,name=field_width,json=fieldWidth" json:"field_width,omitempty"` + GoalWidth *int32 `protobuf:"varint,3,req,name=goal_width,json=goalWidth" json:"goal_width,omitempty"` + GoalDepth *int32 `protobuf:"varint,4,req,name=goal_depth,json=goalDepth" json:"goal_depth,omitempty"` + BoundaryWidth *int32 `protobuf:"varint,5,req,name=boundary_width,json=boundaryWidth" json:"boundary_width,omitempty"` + FieldLines []*SSL_FieldLineSegment `protobuf:"bytes,6,rep,name=field_lines,json=fieldLines" json:"field_lines,omitempty"` + FieldArcs []*SSL_FieldCicularArc `protobuf:"bytes,7,rep,name=field_arcs,json=fieldArcs" json:"field_arcs,omitempty"` +} + +func (x *SSL_GeometryFieldSize) Reset() { + *x = SSL_GeometryFieldSize{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_GeometryFieldSize) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_GeometryFieldSize) ProtoMessage() {} + +func (x *SSL_GeometryFieldSize) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_GeometryFieldSize.ProtoReflect.Descriptor instead. +func (*SSL_GeometryFieldSize) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{3} +} + +func (x *SSL_GeometryFieldSize) GetFieldLength() int32 { + if x != nil && x.FieldLength != nil { + return *x.FieldLength + } + return 0 +} + +func (x *SSL_GeometryFieldSize) GetFieldWidth() int32 { + if x != nil && x.FieldWidth != nil { + return *x.FieldWidth + } + return 0 +} + +func (x *SSL_GeometryFieldSize) GetGoalWidth() int32 { + if x != nil && x.GoalWidth != nil { + return *x.GoalWidth + } + return 0 +} + +func (x *SSL_GeometryFieldSize) GetGoalDepth() int32 { + if x != nil && x.GoalDepth != nil { + return *x.GoalDepth + } + return 0 +} + +func (x *SSL_GeometryFieldSize) GetBoundaryWidth() int32 { + if x != nil && x.BoundaryWidth != nil { + return *x.BoundaryWidth + } + return 0 +} + +func (x *SSL_GeometryFieldSize) GetFieldLines() []*SSL_FieldLineSegment { + if x != nil { + return x.FieldLines + } + return nil +} + +func (x *SSL_GeometryFieldSize) GetFieldArcs() []*SSL_FieldCicularArc { + if x != nil { + return x.FieldArcs + } + return nil +} + +type SSL_GeometryCameraCalibration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CameraId *uint32 `protobuf:"varint,1,req,name=camera_id,json=cameraId" json:"camera_id,omitempty"` + FocalLength *float32 `protobuf:"fixed32,2,req,name=focal_length,json=focalLength" json:"focal_length,omitempty"` + PrincipalPointX *float32 `protobuf:"fixed32,3,req,name=principal_point_x,json=principalPointX" json:"principal_point_x,omitempty"` + PrincipalPointY *float32 `protobuf:"fixed32,4,req,name=principal_point_y,json=principalPointY" json:"principal_point_y,omitempty"` + Distortion *float32 `protobuf:"fixed32,5,req,name=distortion" json:"distortion,omitempty"` + Q0 *float32 `protobuf:"fixed32,6,req,name=q0" json:"q0,omitempty"` + Q1 *float32 `protobuf:"fixed32,7,req,name=q1" json:"q1,omitempty"` + Q2 *float32 `protobuf:"fixed32,8,req,name=q2" json:"q2,omitempty"` + Q3 *float32 `protobuf:"fixed32,9,req,name=q3" json:"q3,omitempty"` + Tx *float32 `protobuf:"fixed32,10,req,name=tx" json:"tx,omitempty"` + Ty *float32 `protobuf:"fixed32,11,req,name=ty" json:"ty,omitempty"` + Tz *float32 `protobuf:"fixed32,12,req,name=tz" json:"tz,omitempty"` + DerivedCameraWorldTx *float32 `protobuf:"fixed32,13,opt,name=derived_camera_world_tx,json=derivedCameraWorldTx" json:"derived_camera_world_tx,omitempty"` + DerivedCameraWorldTy *float32 `protobuf:"fixed32,14,opt,name=derived_camera_world_ty,json=derivedCameraWorldTy" json:"derived_camera_world_ty,omitempty"` + DerivedCameraWorldTz *float32 `protobuf:"fixed32,15,opt,name=derived_camera_world_tz,json=derivedCameraWorldTz" json:"derived_camera_world_tz,omitempty"` +} + +func (x *SSL_GeometryCameraCalibration) Reset() { + *x = SSL_GeometryCameraCalibration{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_GeometryCameraCalibration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_GeometryCameraCalibration) ProtoMessage() {} + +func (x *SSL_GeometryCameraCalibration) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_GeometryCameraCalibration.ProtoReflect.Descriptor instead. +func (*SSL_GeometryCameraCalibration) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{4} +} + +func (x *SSL_GeometryCameraCalibration) GetCameraId() uint32 { + if x != nil && x.CameraId != nil { + return *x.CameraId + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetFocalLength() float32 { + if x != nil && x.FocalLength != nil { + return *x.FocalLength + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetPrincipalPointX() float32 { + if x != nil && x.PrincipalPointX != nil { + return *x.PrincipalPointX + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetPrincipalPointY() float32 { + if x != nil && x.PrincipalPointY != nil { + return *x.PrincipalPointY + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetDistortion() float32 { + if x != nil && x.Distortion != nil { + return *x.Distortion + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetQ0() float32 { + if x != nil && x.Q0 != nil { + return *x.Q0 + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetQ1() float32 { + if x != nil && x.Q1 != nil { + return *x.Q1 + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetQ2() float32 { + if x != nil && x.Q2 != nil { + return *x.Q2 + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetQ3() float32 { + if x != nil && x.Q3 != nil { + return *x.Q3 + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetTx() float32 { + if x != nil && x.Tx != nil { + return *x.Tx + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetTy() float32 { + if x != nil && x.Ty != nil { + return *x.Ty + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetTz() float32 { + if x != nil && x.Tz != nil { + return *x.Tz + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTx() float32 { + if x != nil && x.DerivedCameraWorldTx != nil { + return *x.DerivedCameraWorldTx + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTy() float32 { + if x != nil && x.DerivedCameraWorldTy != nil { + return *x.DerivedCameraWorldTy + } + return 0 +} + +func (x *SSL_GeometryCameraCalibration) GetDerivedCameraWorldTz() float32 { + if x != nil && x.DerivedCameraWorldTz != nil { + return *x.DerivedCameraWorldTz + } + return 0 +} + +type SSL_GeometryData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field *SSL_GeometryFieldSize `protobuf:"bytes,1,req,name=field" json:"field,omitempty"` + Calib []*SSL_GeometryCameraCalibration `protobuf:"bytes,2,rep,name=calib" json:"calib,omitempty"` +} + +func (x *SSL_GeometryData) Reset() { + *x = SSL_GeometryData{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_geometry_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_GeometryData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_GeometryData) ProtoMessage() {} + +func (x *SSL_GeometryData) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_geometry_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_GeometryData.ProtoReflect.Descriptor instead. +func (*SSL_GeometryData) Descriptor() ([]byte, []int) { + return file_ssl_vision_geometry_proto_rawDescGZIP(), []int{5} +} + +func (x *SSL_GeometryData) GetField() *SSL_GeometryFieldSize { + if x != nil { + return x.Field + } + return nil +} + +func (x *SSL_GeometryData) GetCalib() []*SSL_GeometryCameraCalibration { + if x != nil { + return x.Calib + } + return nil +} + +var File_ssl_vision_geometry_proto protoreflect.FileDescriptor + +var file_ssl_vision_geometry_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x6f, + 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, 0x08, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x02, + 0x28, 0x02, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, + 0x52, 0x01, 0x79, 0x22, 0x7e, 0x0a, 0x14, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4c, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x19, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x52, 0x02, 0x70, 0x31, 0x12, 0x19, 0x0a, 0x02, 0x70, 0x32, + 0x18, 0x03, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, + 0x66, 0x52, 0x02, 0x70, 0x32, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, + 0x73, 0x73, 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x74, 0x68, 0x69, 0x63, 0x6b, 0x6e, + 0x65, 0x73, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x13, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x72, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x06, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, + 0x09, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x66, 0x52, 0x06, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x03, 0x20, 0x02, + 0x28, 0x02, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x31, + 0x18, 0x04, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, 0x61, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x32, + 0x18, 0x05, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, 0x61, 0x32, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, + 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x74, + 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x15, 0x53, 0x53, 0x4c, + 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x61, 0x6c, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x61, 0x6c, 0x5f, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x18, 0x04, 0x20, 0x02, 0x28, 0x05, 0x52, 0x09, 0x67, 0x6f, 0x61, 0x6c, 0x44, + 0x65, 0x70, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x05, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0b, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x69, 0x6e, 0x65, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x61, 0x72, 0x63, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x43, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x72, 0x63, 0x52, 0x09, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x41, 0x72, 0x63, 0x73, 0x22, 0xec, 0x03, 0x0a, 0x1d, 0x53, 0x53, 0x4c, + 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x43, + 0x61, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x08, 0x63, + 0x61, 0x6d, 0x65, 0x72, 0x61, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0b, 0x66, + 0x6f, 0x63, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x78, 0x18, + 0x03, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x58, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x79, 0x18, 0x04, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x59, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x30, 0x18, 0x06, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x71, 0x30, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x31, 0x18, 0x07, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x71, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x32, 0x18, 0x08, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x71, 0x32, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x33, 0x18, 0x09, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x71, 0x33, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x74, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x7a, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x02, 0x52, 0x02, + 0x74, 0x7a, 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x74, 0x78, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65, + 0x72, 0x61, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x78, 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72, + 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c, + 0x64, 0x5f, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69, + 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x79, + 0x12, 0x35, 0x0a, 0x17, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x6d, 0x65, + 0x72, 0x61, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x74, 0x7a, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x14, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, + 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x7a, 0x22, 0x76, 0x0a, 0x10, 0x53, 0x53, 0x4c, 0x5f, 0x47, + 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x53, 0x4c, + 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x69, + 0x7a, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x61, 0x6c, + 0x69, 0x62, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x53, 0x53, 0x4c, 0x5f, 0x47, + 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x43, 0x61, 0x6c, + 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x63, 0x61, 0x6c, 0x69, 0x62, 0x42, + 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, + 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, +} + +var ( + file_ssl_vision_geometry_proto_rawDescOnce sync.Once + file_ssl_vision_geometry_proto_rawDescData = file_ssl_vision_geometry_proto_rawDesc +) + +func file_ssl_vision_geometry_proto_rawDescGZIP() []byte { + file_ssl_vision_geometry_proto_rawDescOnce.Do(func() { + file_ssl_vision_geometry_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_geometry_proto_rawDescData) + }) + return file_ssl_vision_geometry_proto_rawDescData +} + +var file_ssl_vision_geometry_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_ssl_vision_geometry_proto_goTypes = []interface{}{ + (*Vector2F)(nil), // 0: Vector2f + (*SSL_FieldLineSegment)(nil), // 1: SSL_FieldLineSegment + (*SSL_FieldCicularArc)(nil), // 2: SSL_FieldCicularArc + (*SSL_GeometryFieldSize)(nil), // 3: SSL_GeometryFieldSize + (*SSL_GeometryCameraCalibration)(nil), // 4: SSL_GeometryCameraCalibration + (*SSL_GeometryData)(nil), // 5: SSL_GeometryData +} +var file_ssl_vision_geometry_proto_depIdxs = []int32{ + 0, // 0: SSL_FieldLineSegment.p1:type_name -> Vector2f + 0, // 1: SSL_FieldLineSegment.p2:type_name -> Vector2f + 0, // 2: SSL_FieldCicularArc.center:type_name -> Vector2f + 1, // 3: SSL_GeometryFieldSize.field_lines:type_name -> SSL_FieldLineSegment + 2, // 4: SSL_GeometryFieldSize.field_arcs:type_name -> SSL_FieldCicularArc + 3, // 5: SSL_GeometryData.field:type_name -> SSL_GeometryFieldSize + 4, // 6: SSL_GeometryData.calib:type_name -> SSL_GeometryCameraCalibration + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_ssl_vision_geometry_proto_init() } +func file_ssl_vision_geometry_proto_init() { + if File_ssl_vision_geometry_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_ssl_vision_geometry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Vector2F); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_geometry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_FieldLineSegment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_geometry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_FieldCicularArc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_geometry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_GeometryFieldSize); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_geometry_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_GeometryCameraCalibration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ssl_vision_geometry_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_GeometryData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_vision_geometry_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_vision_geometry_proto_goTypes, + DependencyIndexes: file_ssl_vision_geometry_proto_depIdxs, + MessageInfos: file_ssl_vision_geometry_proto_msgTypes, + }.Build() + File_ssl_vision_geometry_proto = out.File + file_ssl_vision_geometry_proto_rawDesc = nil + file_ssl_vision_geometry_proto_goTypes = nil + file_ssl_vision_geometry_proto_depIdxs = nil +} diff --git a/internal/vision/ssl_vision_wrapper.pb.go b/internal/vision/ssl_vision_wrapper.pb.go new file mode 100644 index 0000000..95d7d26 --- /dev/null +++ b/internal/vision/ssl_vision_wrapper.pb.go @@ -0,0 +1,172 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: ssl_vision_wrapper.proto + +package vision + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type SSL_WrapperPacket struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detection *SSL_DetectionFrame `protobuf:"bytes,1,opt,name=detection" json:"detection,omitempty"` + Geometry *SSL_GeometryData `protobuf:"bytes,2,opt,name=geometry" json:"geometry,omitempty"` +} + +func (x *SSL_WrapperPacket) Reset() { + *x = SSL_WrapperPacket{} + if protoimpl.UnsafeEnabled { + mi := &file_ssl_vision_wrapper_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SSL_WrapperPacket) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SSL_WrapperPacket) ProtoMessage() {} + +func (x *SSL_WrapperPacket) ProtoReflect() protoreflect.Message { + mi := &file_ssl_vision_wrapper_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SSL_WrapperPacket.ProtoReflect.Descriptor instead. +func (*SSL_WrapperPacket) Descriptor() ([]byte, []int) { + return file_ssl_vision_wrapper_proto_rawDescGZIP(), []int{0} +} + +func (x *SSL_WrapperPacket) GetDetection() *SSL_DetectionFrame { + if x != nil { + return x.Detection + } + return nil +} + +func (x *SSL_WrapperPacket) GetGeometry() *SSL_GeometryData { + if x != nil { + return x.Geometry + } + return nil +} + +var File_ssl_vision_wrapper_proto protoreflect.FileDescriptor + +var file_ssl_vision_wrapper_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x73, 0x73, 0x6c, 0x5f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x73, 0x73, 0x6c, 0x5f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x75, 0x0a, 0x11, 0x53, 0x53, 0x4c, 0x5f, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x53, 0x4c, 0x5f, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x67, 0x65, 0x6f, + 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x53, + 0x4c, 0x5f, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x6f, 0x62, 0x6f, 0x43, 0x75, 0x70, 0x2d, 0x53, + 0x53, 0x4c, 0x2f, 0x73, 0x73, 0x6c, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, +} + +var ( + file_ssl_vision_wrapper_proto_rawDescOnce sync.Once + file_ssl_vision_wrapper_proto_rawDescData = file_ssl_vision_wrapper_proto_rawDesc +) + +func file_ssl_vision_wrapper_proto_rawDescGZIP() []byte { + file_ssl_vision_wrapper_proto_rawDescOnce.Do(func() { + file_ssl_vision_wrapper_proto_rawDescData = protoimpl.X.CompressGZIP(file_ssl_vision_wrapper_proto_rawDescData) + }) + return file_ssl_vision_wrapper_proto_rawDescData +} + +var file_ssl_vision_wrapper_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_ssl_vision_wrapper_proto_goTypes = []interface{}{ + (*SSL_WrapperPacket)(nil), // 0: SSL_WrapperPacket + (*SSL_DetectionFrame)(nil), // 1: SSL_DetectionFrame + (*SSL_GeometryData)(nil), // 2: SSL_GeometryData +} +var file_ssl_vision_wrapper_proto_depIdxs = []int32{ + 1, // 0: SSL_WrapperPacket.detection:type_name -> SSL_DetectionFrame + 2, // 1: SSL_WrapperPacket.geometry:type_name -> SSL_GeometryData + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_ssl_vision_wrapper_proto_init() } +func file_ssl_vision_wrapper_proto_init() { + if File_ssl_vision_wrapper_proto != nil { + return + } + file_ssl_vision_detection_proto_init() + file_ssl_vision_geometry_proto_init() + if !protoimpl.UnsafeEnabled { + file_ssl_vision_wrapper_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SSL_WrapperPacket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_ssl_vision_wrapper_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_ssl_vision_wrapper_proto_goTypes, + DependencyIndexes: file_ssl_vision_wrapper_proto_depIdxs, + MessageInfos: file_ssl_vision_wrapper_proto_msgTypes, + }.Build() + File_ssl_vision_wrapper_proto = out.File + file_ssl_vision_wrapper_proto_rawDesc = nil + file_ssl_vision_wrapper_proto_goTypes = nil + file_ssl_vision_wrapper_proto_depIdxs = nil +} diff --git a/proto/ssl_gc_common.proto b/proto/ssl_gc_common.proto new file mode 100644 index 0000000..c217fd7 --- /dev/null +++ b/proto/ssl_gc_common.proto @@ -0,0 +1,28 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"; + +// Team is either blue or yellow +enum Team { + // team not set + UNKNOWN = 0; + // yellow team + YELLOW = 1; + // blue team + BLUE = 2; +} + +// RobotId is the combination of a team and a robot id +message RobotId { + // the robot number + optional uint32 id = 1; + // the team that the robot belongs to + optional Team team = 2; +} + +// Division denotes the current division, which influences some rules +enum Division { + DIV_UNKNOWN = 0; + DIV_A = 1; + DIV_B = 2; +} diff --git a/proto/ssl_gc_game_event.proto b/proto/ssl_gc_game_event.proto new file mode 100644 index 0000000..09d4a56 --- /dev/null +++ b/proto/ssl_gc_game_event.proto @@ -0,0 +1,554 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"; + +import "ssl_gc_common.proto"; +import "ssl_gc_geometry.proto"; + +// GameEvent contains exactly one game event +// Each game event has optional and required fields. The required fields are mandatory to process the event. +// Some optional fields are only used for visualization, others are required to determine the ball placement position. +// If fields are missing that are required for the ball placement position, no ball placement command will be issued. +// Fields are marked optional to make testing and extending of the protocol easier. +// An autoRef should ideally set all fields, except if there are good reasons to not do so. +message GameEvent { + + optional Type type = 40; + + // The origins of this game event. + // Empty, if it originates from game controller. + // Contains autoRef name(s), if it originates from one or more autoRefs. + // Ignored if sent by autoRef to game controller. + repeated string origin = 41; + + // the event that occurred + oneof event { + + // Ball out of field events (stopping) + + BallLeftField ball_left_field_touch_line = 6; + BallLeftField ball_left_field_goal_line = 7; + AimlessKick aimless_kick = 11; + + // Stopping Fouls + + AttackerTooCloseToDefenseArea attacker_too_close_to_defense_area = 19; + DefenderInDefenseArea defender_in_defense_area = 31; + BoundaryCrossing boundary_crossing = 43; + KeeperHeldBall keeper_held_ball = 13; + BotDribbledBallTooFar bot_dribbled_ball_too_far = 17; + + BotPushedBot bot_pushed_bot = 24; + BotHeldBallDeliberately bot_held_ball_deliberately = 26; + BotTippedOver bot_tipped_over = 27; + + // Non-Stopping Fouls + + AttackerTouchedBallInDefenseArea attacker_touched_ball_in_defense_area = 15; + BotKickedBallTooFast bot_kicked_ball_too_fast = 18; + BotCrashUnique bot_crash_unique = 22; + BotCrashDrawn bot_crash_drawn = 21; + + // Fouls while ball out of play + + DefenderTooCloseToKickPoint defender_too_close_to_kick_point = 29; + BotTooFastInStop bot_too_fast_in_stop = 28; + BotInterferedPlacement bot_interfered_placement = 20; + + // Scoring goals + + Goal possible_goal = 39; + Goal goal = 8; + Goal invalid_goal = 44; + + // Other events + + AttackerDoubleTouchedBall attacker_double_touched_ball = 14; + PlacementSucceeded placement_succeeded = 5; + PenaltyKickFailed penalty_kick_failed = 45; + + NoProgressInGame no_progress_in_game = 2; + PlacementFailed placement_failed = 3; + MultipleCards multiple_cards = 32; + MultipleFouls multiple_fouls = 34; + BotSubstitution bot_substitution = 37; + TooManyRobots too_many_robots = 38; + ChallengeFlag challenge_flag = 46; + EmergencyStop emergency_stop = 47; + + UnsportingBehaviorMinor unsporting_behavior_minor = 35; + UnsportingBehaviorMajor unsporting_behavior_major = 36; + + // Deprecated events + + // replaced by ready_to_continue flag + Prepared prepared = 1 [deprecated = true]; + // obsolete + IndirectGoal indirect_goal = 9 [deprecated = true]; + // replaced by the meta-information in the possible_goal event + ChippedGoal chipped_goal = 10 [deprecated = true]; + // obsolete + KickTimeout kick_timeout = 12 [deprecated = true]; + // rule removed + AttackerTouchedOpponentInDefenseArea attacker_touched_opponent_in_defense_area = 16 [deprecated = true]; + // obsolete + AttackerTouchedOpponentInDefenseArea attacker_touched_opponent_in_defense_area_skipped = 42 [deprecated = true]; + // obsolete + BotCrashUnique bot_crash_unique_skipped = 23 [deprecated = true]; + // can not be used as long as autoRefs do not judge pushing + BotPushedBot bot_pushed_bot_skipped = 25 [deprecated = true]; + // rule removed + DefenderInDefenseAreaPartially defender_in_defense_area_partially = 30 [deprecated = true]; + // the referee msg already indicates this + MultiplePlacementFailures multiple_placement_failures = 33 [deprecated = true]; + } + + // the ball left the field normally + message BallLeftField { + // the team that last touched the ball + required Team by_team = 1; + // the bot that last touched the ball + optional uint32 by_bot = 2; + // the location where the ball left the field [m] + optional Vector2 location = 3; + } + // the ball left the field via goal line and a team committed an aimless kick + message AimlessKick { + // the team that last touched the ball + required Team by_team = 1; + // the bot that last touched the ball + optional uint32 by_bot = 2; + // the location where the ball left the field [m] + optional Vector2 location = 3; + // the location where the ball was last touched [m] + optional Vector2 kick_location = 4; + } + // a team shot a goal + message Goal { + // the team that scored the goal + required Team by_team = 1; + // the team that shot the goal (different from by_team for own goals) + optional Team kicking_team = 6; + // the bot that shot the goal + optional uint32 kicking_bot = 2; + // the location where the ball entered the goal [m] + optional Vector2 location = 3; + // the location where the ball was kicked (for deciding if this was a valid goal) [m] + optional Vector2 kick_location = 4; + // the maximum height the ball reached during the goal kick (for deciding if this was a valid goal) [m] + optional float max_ball_height = 5; + // number of robots of scoring team when the ball entered the goal (for deciding if this was a valid goal) + optional uint32 num_robots_by_team = 7; + // The UNIX timestamp [μs] when the scoring team last touched the ball + optional uint64 last_touch_by_team = 8; + // An additional message with e.g. a reason for invalid goals + optional string message = 9; + } + // the ball entered the goal directly during an indirect free kick + message IndirectGoal { + // the team that tried to shoot the goal + required Team by_team = 1; + // the bot that kicked the ball - at least the team must be set + optional uint32 by_bot = 2; + // the location where the ball entered the goal [m] + optional Vector2 location = 3; + // the location where the ball was kicked [m] + optional Vector2 kick_location = 4; + } + // the ball entered the goal, but was initially chipped + message ChippedGoal { + // the team that tried to shoot the goal + required Team by_team = 1; + // the bot that kicked the ball + optional uint32 by_bot = 2; + // the location where the ball entered the goal [m] + optional Vector2 location = 3; + // the location where the ball was kicked [m] + optional Vector2 kick_location = 4; + // the maximum height [m] of the ball, before it entered the goal and since the last kick [m] + optional float max_ball_height = 5; + } + // a bot moved too fast while the game was stopped + message BotTooFastInStop { + // the team that found guilty + required Team by_team = 1; + // the bot that was too fast + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the bot speed [m/s] + optional float speed = 4; + } + // a bot of the defending team got too close to the kick point during a free kick + message DefenderTooCloseToKickPoint { + // the team that was found guilty + required Team by_team = 1; + // the bot that violates the distance to the kick point + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the distance [m] from bot to the kick point (including the minimum radius) + optional float distance = 4; + } + // two robots crashed into each other with similar speeds + message BotCrashDrawn { + // the bot of the yellow team + optional uint32 bot_yellow = 1; + // the bot of the blue team + optional uint32 bot_blue = 2; + // the location of the crash (center between both bots) [m] + optional Vector2 location = 3; + // the calculated crash speed [m/s] of the two bots + optional float crash_speed = 4; + // the difference [m/s] of the velocity of the two bots + optional float speed_diff = 5; + // the angle [rad] in the range [0, π] of the bot velocity vectors + // an angle of 0 rad ( 0°) means, the bots barely touched each other + // an angle of π rad (180°) means, the bots crashed frontal into each other + optional float crash_angle = 6; + } + // two robots crashed into each other and one team was found guilty to due significant speed difference + message BotCrashUnique { + // the team that caused the crash + required Team by_team = 1; + // the bot that caused the crash + optional uint32 violator = 2; + // the bot of the opposite team that was involved in the crash + optional uint32 victim = 3; + // the location of the crash (center between both bots) [m] + optional Vector2 location = 4; + // the calculated crash speed vector [m/s] of the two bots + optional float crash_speed = 5; + // the difference [m/s] of the velocity of the two bots + optional float speed_diff = 6; + // the angle [rad] in the range [0, π] of the bot velocity vectors + // an angle of 0 rad ( 0°) means, the bots barely touched each other + // an angle of π rad (180°) means, the bots crashed frontal into each other + optional float crash_angle = 7; + } + // a bot pushed another bot over a significant distance + message BotPushedBot { + // the team that pushed the other team + required Team by_team = 1; + // the bot that pushed the other bot + optional uint32 violator = 2; + // the bot of the opposite team that was pushed + optional uint32 victim = 3; + // the location of the push (center between both bots) [m] + optional Vector2 location = 4; + // the pushed distance [m] + optional float pushed_distance = 5; + } + // a bot tipped over + message BotTippedOver { + // the team that found guilty + required Team by_team = 1; + // the bot that tipped over + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the location of the ball at the moment when this foul occurred [m] + optional Vector2 ball_location = 4; + } + // a defender other than the keeper was fully located inside its own defense and touched the ball + message DefenderInDefenseArea { + // the team that found guilty + required Team by_team = 1; + // the bot that is inside the penalty area + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the distance [m] from bot case to the nearest point outside the defense area + optional float distance = 4; + } + // a defender other than the keeper was partially located inside its own defense area and touched the ball + message DefenderInDefenseAreaPartially { + // the team that found guilty + required Team by_team = 1; + // the bot that is partially inside the penalty area + optional uint32 by_bot = 2; + // the location of the bot + optional Vector2 location = 3; + // the distance [m] that the bot is inside the penalty area + optional float distance = 4; + // the location of the ball at the moment when this foul occurred [m] + optional Vector2 ball_location = 5; + } + // an attacker touched the ball inside the opponent defense area + message AttackerTouchedBallInDefenseArea { + // the team that found guilty + required Team by_team = 1; + // the bot that is inside the penalty area + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the distance [m] that the bot is inside the penalty area + optional float distance = 4; + } + // a bot kicked the ball too fast + message BotKickedBallTooFast { + // the team that found guilty + required Team by_team = 1; + // the bot that kicked too fast + optional uint32 by_bot = 2; + // the location of the ball at the time of the highest speed [m] + optional Vector2 location = 3; + // the absolute initial ball speed (kick speed) [m/s] + optional float initial_ball_speed = 4; + // was the ball chipped? + optional bool chipped = 5; + } + // a bot dribbled to ball too far + message BotDribbledBallTooFar { + // the team that found guilty + required Team by_team = 1; + // the bot that dribbled too far + optional uint32 by_bot = 2; + // the location where the dribbling started [m] + optional Vector2 start = 3; + // the location where the maximum dribbling distance was reached [m] + optional Vector2 end = 4; + } + // an attacker touched the opponent robot inside defense area + message AttackerTouchedOpponentInDefenseArea { + // the team that found guilty + required Team by_team = 1; + // the bot that touched the opponent robot + optional uint32 by_bot = 2; + // the bot of the opposite team that was touched + optional uint32 victim = 4; + // the location of the contact point between both bots [m] + optional Vector2 location = 3; + } + // an attacker touched the ball multiple times when it was not allowed to + message AttackerDoubleTouchedBall { + // the team that found guilty + required Team by_team = 1; + // the bot that touched the ball twice + optional uint32 by_bot = 2; + // the location of the ball when it was first touched [m] + optional Vector2 location = 3; + } + // an attacker was located too near to the opponent defense area during stop or free kick + message AttackerTooCloseToDefenseArea { + // the team that found guilty + required Team by_team = 1; + // the bot that is too close to the defense area + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + // the distance [m] of the bot to the penalty area + optional float distance = 4; + // the location of the ball at the moment when this foul occurred [m] + optional Vector2 ball_location = 5; + } + // a bot held the ball for too long + message BotHeldBallDeliberately { + // the team that found guilty + required Team by_team = 1; + // the bot that holds the ball + optional uint32 by_bot = 2; + // the location of the ball [m] + optional Vector2 location = 3; + // the duration [s] that the bot hold the ball + optional float duration = 4; + } + // a bot interfered the ball placement of the other team + message BotInterferedPlacement { + // the team that found guilty + required Team by_team = 1; + // the bot that interfered the placement + optional uint32 by_bot = 2; + // the location of the bot [m] + optional Vector2 location = 3; + } + // a team collected multiple cards (yellow and red), which results in a penalty kick + message MultipleCards { + // the team that received multiple yellow cards + required Team by_team = 1; + } + // a team collected multiple fouls, which results in a yellow card + message MultipleFouls { + // the team that collected multiple fouls + required Team by_team = 1; + } + // a team failed to place the ball multiple times in a row + message MultiplePlacementFailures { + // the team that failed multiple times + required Team by_team = 1; + } + // timeout waiting for the attacking team to perform the free kick + message KickTimeout { + // the team that that should have kicked + required Team by_team = 1; + // the location of the ball [m] + optional Vector2 location = 2; + // the time [s] that was waited + optional float time = 3; + } + // game was stuck + message NoProgressInGame { + // the location of the ball + optional Vector2 location = 1; + // the time [s] that was waited + optional float time = 2; + } + // ball placement failed + message PlacementFailed { + // the team that failed + required Team by_team = 1; + // the remaining distance [m] from ball to placement position + optional float remaining_distance = 2; + } + // a team was found guilty for minor unsporting behavior + message UnsportingBehaviorMinor { + // the team that found guilty + required Team by_team = 1; + // an explanation of the situation and decision + required string reason = 2; + } + // a team was found guilty for major unsporting behavior + message UnsportingBehaviorMajor { + // the team that found guilty + required Team by_team = 1; + // an explanation of the situation and decision + required string reason = 2; + } + // a keeper held the ball in its defense area for too long + message KeeperHeldBall { + // the team that found guilty + required Team by_team = 1; + // the location of the ball [m] + optional Vector2 location = 2; + // the duration [s] that the keeper hold the ball + optional float duration = 3; + } + // a team successfully placed the ball + message PlacementSucceeded { + // the team that did the placement + required Team by_team = 1; + // the time [s] taken for placing the ball + optional float time_taken = 2; + // the distance [m] between placement location and actual ball position + optional float precision = 3; + // the distance [m] between the initial ball location and the placement position + optional float distance = 4; + } + // both teams are prepared - all conditions are met to continue (with kickoff or penalty kick) + message Prepared { + // the time [s] taken for preparing + optional float time_taken = 1; + } + // bots are being substituted by a team + message BotSubstitution { + // the team that substitutes robots + required Team by_team = 1; + } + // A challenge flag, requested by a team previously, is flagged + message ChallengeFlag { + // the team that substitutes robots + required Team by_team = 1; + } + // An emergency stop, requested by team previously, occurred + message EmergencyStop { + // the team that substitutes robots + required Team by_team = 1; + } + // a team has too many robots on the field + message TooManyRobots { + // the team that has too many robots + required Team by_team = 1; + // number of robots allowed at the moment + optional int32 num_robots_allowed = 2; + // number of robots currently on the field + optional int32 num_robots_on_field = 3; + // the location of the ball at the moment when this foul occurred [m] + optional Vector2 ball_location = 4; + } + // a robot chipped the ball over the field boundary out of the playing surface + message BoundaryCrossing { + // the team that has too many robots + required Team by_team = 1; + // the location of the ball [m] + optional Vector2 location = 2; + } + // the penalty kick failed (by time or by keeper) + message PenaltyKickFailed { + // the team that last touched the ball + required Team by_team = 1; + // the location of the ball at the moment of this event [m] + optional Vector2 location = 2; + } + + enum Type { + UNKNOWN_GAME_EVENT_TYPE = 0; + + // Ball out of field events (stopping) + + BALL_LEFT_FIELD_TOUCH_LINE = 6; // triggered by autoRef + BALL_LEFT_FIELD_GOAL_LINE = 7; // triggered by autoRef + AIMLESS_KICK = 11; // triggered by autoRef + + // Stopping Fouls + + ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA = 19; // triggered by autoRef + DEFENDER_IN_DEFENSE_AREA = 31; // triggered by autoRef + BOUNDARY_CROSSING = 41; // triggered by autoRef + KEEPER_HELD_BALL = 13; // triggered by GC + BOT_DRIBBLED_BALL_TOO_FAR = 17; // triggered by autoRef + + BOT_PUSHED_BOT = 24; // triggered by human ref + BOT_HELD_BALL_DELIBERATELY = 26; // triggered by human ref + BOT_TIPPED_OVER = 27; // triggered by human ref + + // Non-Stopping Fouls + + ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA = 15; // triggered by autoRef + BOT_KICKED_BALL_TOO_FAST = 18; // triggered by autoRef + BOT_CRASH_UNIQUE = 22; // triggered by autoRef + BOT_CRASH_DRAWN = 21; // triggered by autoRef + + // Fouls while ball out of play + + DEFENDER_TOO_CLOSE_TO_KICK_POINT = 29; // triggered by autoRef + BOT_TOO_FAST_IN_STOP = 28; // triggered by autoRef + BOT_INTERFERED_PLACEMENT = 20; // triggered by autoRef + + // Scoring goals + + POSSIBLE_GOAL = 39; // triggered by autoRef + GOAL = 8; // triggered by GC + INVALID_GOAL = 42; // triggered by GC + + // Other events + + ATTACKER_DOUBLE_TOUCHED_BALL = 14; // triggered by autoRef + PLACEMENT_SUCCEEDED = 5; // triggered by autoRef + PENALTY_KICK_FAILED = 43; // triggered by GC and autoRef + + NO_PROGRESS_IN_GAME = 2; // triggered by GC + PLACEMENT_FAILED = 3; // triggered by GC + MULTIPLE_CARDS = 32; // triggered by GC + MULTIPLE_FOULS = 34; // triggered by GC + BOT_SUBSTITUTION = 37; // triggered by GC + TOO_MANY_ROBOTS = 38; // triggered by GC + CHALLENGE_FLAG = 44; // triggered by GC + EMERGENCY_STOP = 45; // triggered by GC + + UNSPORTING_BEHAVIOR_MINOR = 35; // triggered by human ref + UNSPORTING_BEHAVIOR_MAJOR = 36; // triggered by human ref + + // Deprecated events + + PREPARED = 1 [deprecated = true]; + INDIRECT_GOAL = 9 [deprecated = true]; + CHIPPED_GOAL = 10 [deprecated = true]; + KICK_TIMEOUT = 12 [deprecated = true]; + ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA = 16 [deprecated = true]; + ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED = 40 [deprecated = true]; + BOT_CRASH_UNIQUE_SKIPPED = 23 [deprecated = true]; + BOT_PUSHED_BOT_SKIPPED = 25 [deprecated = true]; + DEFENDER_IN_DEFENSE_AREA_PARTIALLY = 30 [deprecated = true]; + MULTIPLE_PLACEMENT_FAILURES = 33 [deprecated = true]; + } +} diff --git a/proto/ssl_gc_geometry.proto b/proto/ssl_gc_geometry.proto new file mode 100644 index 0000000..daf3593 --- /dev/null +++ b/proto/ssl_gc_geometry.proto @@ -0,0 +1,16 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/geom"; + +// A vector with two dimensions +message Vector2 { + required float x = 1; + required float y = 2; +} + +// A vector with three dimensions +message Vector3 { + required float x = 1; + required float y = 2; + required float z = 3; +} diff --git a/proto/ssl_gc_referee_message.proto b/proto/ssl_gc_referee_message.proto new file mode 100644 index 0000000..f604e1b --- /dev/null +++ b/proto/ssl_gc_referee_message.proto @@ -0,0 +1,209 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/referee"; + +import "ssl_gc_game_event.proto"; + +// Each UDP packet contains one of these messages. +message Referee { + // The UNIX timestamp when the packet was sent, in microseconds. + // Divide by 1,000,000 to get a time_t. + required uint64 packet_timestamp = 1; + + // These are the "coarse" stages of the game. + enum Stage { + // The first half is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + NORMAL_FIRST_HALF_PRE = 0; + // The first half of the normal game, before half time. + NORMAL_FIRST_HALF = 1; + // Half time between first and second halves. + NORMAL_HALF_TIME = 2; + // The second half is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + NORMAL_SECOND_HALF_PRE = 3; + // The second half of the normal game, after half time. + NORMAL_SECOND_HALF = 4; + // The break before extra time. + EXTRA_TIME_BREAK = 5; + // The first half of extra time is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + EXTRA_FIRST_HALF_PRE = 6; + // The first half of extra time. + EXTRA_FIRST_HALF = 7; + // Half time between first and second extra halves. + EXTRA_HALF_TIME = 8; + // The second half of extra time is about to start. + // A kickoff is called within this stage. + // This stage ends with the NORMAL_START. + EXTRA_SECOND_HALF_PRE = 9; + // The second half of extra time. + EXTRA_SECOND_HALF = 10; + // The break before penalty shootout. + PENALTY_SHOOTOUT_BREAK = 11; + // The penalty shootout. + PENALTY_SHOOTOUT = 12; + // The game is over. + POST_GAME = 13; + } + required Stage stage = 2; + + // The number of microseconds left in the stage. + // The following stages have this value; the rest do not: + // NORMAL_FIRST_HALF + // NORMAL_HALF_TIME + // NORMAL_SECOND_HALF + // EXTRA_TIME_BREAK + // EXTRA_FIRST_HALF + // EXTRA_HALF_TIME + // EXTRA_SECOND_HALF + // PENALTY_SHOOTOUT_BREAK + // + // If the stage runs over its specified time, this value + // becomes negative. + optional sint32 stage_time_left = 3; + + // These are the "fine" states of play on the field. + enum Command { + // All robots should completely stop moving. + HALT = 0; + // Robots must keep 50 cm from the ball. + STOP = 1; + // A prepared kickoff or penalty may now be taken. + NORMAL_START = 2; + // The ball is dropped and free for either team. + FORCE_START = 3; + // The yellow team may move into kickoff position. + PREPARE_KICKOFF_YELLOW = 4; + // The blue team may move into kickoff position. + PREPARE_KICKOFF_BLUE = 5; + // The yellow team may move into penalty position. + PREPARE_PENALTY_YELLOW = 6; + // The blue team may move into penalty position. + PREPARE_PENALTY_BLUE = 7; + // The yellow team may take a direct free kick. + DIRECT_FREE_YELLOW = 8; + // The blue team may take a direct free kick. + DIRECT_FREE_BLUE = 9; + // The yellow team may take an indirect free kick. + INDIRECT_FREE_YELLOW = 10; + // The blue team may take an indirect free kick. + INDIRECT_FREE_BLUE = 11; + // The yellow team is currently in a timeout. + TIMEOUT_YELLOW = 12; + // The blue team is currently in a timeout. + TIMEOUT_BLUE = 13; + // The yellow team just scored a goal. + // For information only. + // For rules compliance, teams must treat as STOP. + // Deprecated: Use the score field from the team infos instead. That way, you can also detect revoked goals. + GOAL_YELLOW = 14 [deprecated = true]; + // The blue team just scored a goal. See also GOAL_YELLOW. + GOAL_BLUE = 15 [deprecated = true]; + // Equivalent to STOP, but the yellow team must pick up the ball and + // drop it in the Designated Position. + BALL_PLACEMENT_YELLOW = 16; + // Equivalent to STOP, but the blue team must pick up the ball and drop + // it in the Designated Position. + BALL_PLACEMENT_BLUE = 17; + } + required Command command = 4; + + // The number of commands issued since startup (mod 2^32). + required uint32 command_counter = 5; + + // The UNIX timestamp when the command was issued, in microseconds. + // This value changes only when a new command is issued, not on each packet. + required uint64 command_timestamp = 6; + + // Information about a single team. + message TeamInfo { + // The team's name (empty string if operator has not typed anything). + required string name = 1; + // The number of goals scored by the team during normal play and overtime. + required uint32 score = 2; + // The number of red cards issued to the team since the beginning of the game. + required uint32 red_cards = 3; + // The amount of time (in microseconds) left on each yellow card issued to the team. + // If no yellow cards are issued, this array has no elements. + // Otherwise, times are ordered from smallest to largest. + repeated uint32 yellow_card_times = 4 [packed = true]; + // The total number of yellow cards ever issued to the team. + required uint32 yellow_cards = 5; + // The number of timeouts this team can still call. + // If in a timeout right now, that timeout is excluded. + required uint32 timeouts = 6; + // The number of microseconds of timeout this team can use. + required uint32 timeout_time = 7; + // The pattern number of this team's goalkeeper. + required uint32 goalkeeper = 8; + // The total number of countable fouls that act towards yellow cards + optional uint32 foul_counter = 9; + // The number of consecutive ball placement failures of this team + optional uint32 ball_placement_failures = 10; + // Indicate if the team is able and allowed to place the ball + optional bool can_place_ball = 12; + // The maximum number of bots allowed on the field based on division and cards + optional uint32 max_allowed_bots = 13; + // The team has submitted an intent to substitute one or more robots at the next chance + optional bool bot_substitution_intent = 14; + // Indicate if the team reached the maximum allowed ball placement failures and is thus not allowed to place the ball anymore + optional bool ball_placement_failures_reached = 15; + } + + // Information about the two teams. + required TeamInfo yellow = 7; + required TeamInfo blue = 8; + + // The coordinates of the Designated Position. These are measured in + // millimetres and correspond to SSL-Vision coordinates. These fields are + // always either both present (in the case of a ball placement command) or + // both absent (in the case of any other command). + message Point { + required float x = 1; + required float y = 2; + } + optional Point designated_position = 9; + + // Information about the direction of play. + // True, if the blue team will have it's goal on the positive x-axis of the ssl-vision coordinate system. + // Obviously, the yellow team will play on the opposite half. + optional bool blue_team_on_positive_half = 10; + + // The game event that caused the referee command. + // deprecated in favor of game_events. +// optional Game_Event game_event = 11 [deprecated = true]; + reserved 11; + + // The command that will be issued after the current stoppage and ball placement to continue the game. + optional Command next_command = 12; + + // All game events that were detected since the last RUNNING state. + // Will be cleared as soon as the game is continued. + reserved 13; + repeated GameEvent game_events = 16; + + // All non-finished proposed game events that may be processed next. + reserved 14; + repeated GameEventProposalGroup game_event_proposals = 17; + + // The time in microseconds that is remaining until the current action times out + // The time will not be reset. It can get negative. + // An autoRef would raise an appropriate event, if the time gets negative. + // Possible actions where this time is relevant: + // * free kicks + // * kickoff, penalty kick, force start + // * ball placement + optional int32 current_action_time_remaining = 15; +} + +// List of matching proposals +message GameEventProposalGroup { + // The proposed game event. + repeated GameEvent game_event = 1; + // Whether the proposal group was accepted + optional bool accepted = 2; +} diff --git a/proto/ssl_simulation_config.proto b/proto/ssl_simulation_config.proto new file mode 100644 index 0000000..f7f84c7 --- /dev/null +++ b/proto/ssl_simulation_config.proto @@ -0,0 +1,78 @@ +syntax = "proto2"; +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl"; +package edu.tigers.sumatra.simulation; + +import "ssl_gc_common.proto"; +import "ssl_vision_geometry.proto"; +import "google/protobuf/any.proto"; + +// Movement limits for a robot +message RobotLimits { + // Max absolute speed-up acceleration [m/s^2] + optional float acc_speedup_absolute_max = 1; + // Max angular speed-up acceleration [rad/s^2] + optional float acc_speedup_angular_max = 2; + // Max absolute brake acceleration [m/s^2] + optional float acc_brake_absolute_max = 3; + // Max angular brake acceleration [rad/s^2] + optional float acc_brake_angular_max = 4; + // Max absolute velocity [m/s] + optional float vel_absolute_max = 5; + // Max angular velocity [rad/s] + optional float vel_angular_max = 6; +} + +// Robot wheel angle configuration +// all angles are relative to looking forward, +// all wheels / angles are clockwise +message RobotWheelAngles { + // Angle front right [rad] + required float front_right = 1; + // Angle back right [rad] + required float back_right = 2; + // Angle back left [rad] + required float back_left = 3; + // Angle front left [rad] + required float front_left = 4; +} + +// Specs of a robot +message RobotSpecs { + // Id of the robot + required RobotId id = 1; + // Robot radius [m] + optional float radius = 2 [default = 0.09]; + // Robot height [m] + optional float height = 3 [default = 0.15]; + // Robot mass [kg] + optional float mass = 4; + // Max linear kick speed [m/s] (unset = unlimited) + optional float max_linear_kick_speed = 7; + // Max chip kick speed [m/s] (unset = unlimited) + optional float max_chip_kick_speed = 8; + // Width of the dribbler [m] (implicitly defines the distance from robot center to dribbler and opening angle) + optional float dribbler_width = 9; + // Movement limits + optional RobotLimits limits = 10; + // Wheel angle configuration + optional RobotWheelAngles wheel_angles = 13; + // Custom robot spec for specific simulators (the protobuf files are managed by the simulators) + optional google.protobuf.Any custom = 14; +} + +message RealismConfig { + // Custom config for specific simulators (the protobuf files are managed by the simulators) + optional google.protobuf.Any custom = 1; +} + +// Change the simulator configuration +message SimulatorConfig { + // Update the geometry + optional SSL_GeometryData geometry = 1; + // Update the robot specs + repeated RobotSpecs robot_specs = 2; + // Update realism configuration + optional RealismConfig realism_config = 3; + // Change the vision publish port + optional uint32 vision_port = 4; +} \ No newline at end of file diff --git a/proto/ssl_simulation_control.proto b/proto/ssl_simulation_control.proto new file mode 100644 index 0000000..47ff308 --- /dev/null +++ b/proto/ssl_simulation_control.proto @@ -0,0 +1,74 @@ +syntax = "proto2"; +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl"; +package edu.tigers.sumatra.simulation; + +import "ssl_gc_common.proto"; +import "ssl_simulation_config.proto"; +import "ssl_simulation_error.proto"; + +// Teleport the ball to a new location and optionally set it to some velocity +message TeleportBall { + // x-coordinate [m] + optional float x = 1; + // y-coordinate [m] + optional float y = 2; + // z-coordinate (height) [m] + optional float z = 3; + // Velocity in x-direction [m/s] + optional float vx = 4; + // Velocity in y-direction [m/s] + optional float vy = 5; + // Velocity in z-direction [m/s] + optional float vz = 6; + // Teleport the ball safely to the target, for example by + // moving robots out of the way in case of collision and set speed of robots close-by to zero + optional bool teleport_safely = 7 [default = false]; + // Adapt the angular ball velocity such that the ball is rolling + optional bool roll = 8 [default = false]; +} + +// Teleport a robot to some location and give it a velocity +message TeleportRobot { + // Robot id to teleport + required RobotId id = 1; + // x-coordinate [m] + optional float x = 2; + // y-coordinate [m] + optional float y = 3; + // Orientation [rad], measured from the x-axis counter-clockwise + optional float orientation = 4; + // Global velocity [m/s] towards x-axis + optional float v_x = 5 [default = 0]; + // Global velocity [m/s] towards y-axis + optional float v_y = 6 [default = 0]; + // Angular velocity [rad/s] + optional float v_angular = 7 [default = 0]; + // Robot should be present on the field? + // true -> robot will be added, if it does not exist yet + // false -> robot will be removed, if it is present + optional bool present = 8; +} + +// Control the simulation +message SimulatorControl { + // Teleport the ball + optional TeleportBall teleport_ball = 1; + // Teleport robots + repeated TeleportRobot teleport_robot = 2; + // Change the simulation speed + optional float simulation_speed = 3; +} + +// Command from the connected client to the simulator +message SimulatorCommand { + // Control the simulation + optional SimulatorControl control = 1; + // Configure the simulation + optional SimulatorConfig config = 2; +} + +// Response of the simulator to the connected client +message SimulatorResponse { + // List of errors, like using unsupported features + repeated SimulatorError errors = 1; +} diff --git a/proto/ssl_simulation_error.proto b/proto/ssl_simulation_error.proto new file mode 100644 index 0000000..6ca4d6c --- /dev/null +++ b/proto/ssl_simulation_error.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/simctl"; +package edu.tigers.sumatra.simulation; + +// Errors in the simulator +message SimulatorError { + // Unique code of the error for automatic handling on client side + optional string code = 1; + // Human readable description of the error + optional string message = 2; +} diff --git a/proto/ssl_vision_detection.proto b/proto/ssl_vision_detection.proto new file mode 100644 index 0000000..093aea8 --- /dev/null +++ b/proto/ssl_vision_detection.proto @@ -0,0 +1,34 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"; + +message SSL_DetectionBall { + required float confidence = 1; + optional uint32 area = 2; + required float x = 3; + required float y = 4; + optional float z = 5; + required float pixel_x = 6; + required float pixel_y = 7; +} + +message SSL_DetectionRobot { + required float confidence = 1; + optional uint32 robot_id = 2; + required float x = 3; + required float y = 4; + optional float orientation = 5; + required float pixel_x = 6; + required float pixel_y = 7; + optional float height = 8; +} + +message SSL_DetectionFrame { + required uint32 frame_number = 1; + required double t_capture = 2; + required double t_sent = 3; + required uint32 camera_id = 4; + repeated SSL_DetectionBall balls = 5; + repeated SSL_DetectionRobot robots_yellow = 6; + repeated SSL_DetectionRobot robots_blue = 7; +} diff --git a/proto/ssl_vision_detection_tracked.proto b/proto/ssl_vision_detection_tracked.proto new file mode 100644 index 0000000..8e9087e --- /dev/null +++ b/proto/ssl_vision_detection_tracked.proto @@ -0,0 +1,91 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker"; + +import "ssl_gc_common.proto"; +import "ssl_gc_geometry.proto"; + +// Default network address: 224.5.23.2:10010 + +// Capabilities that a source implementation can have +enum Capability { + CAPABILITY_UNKNOWN = 0; + CAPABILITY_DETECT_FLYING_BALLS = 1; + CAPABILITY_DETECT_MULTIPLE_BALLS = 2; + CAPABILITY_DETECT_KICKED_BALLS = 3; +} + +// A single tracked ball +message TrackedBall { + // The position (x, y, height) [m] in the ssl-vision coordinate system + required Vector3 pos = 1; + + // The velocity [m/s] in the ssl-vision coordinate system + optional Vector3 vel = 2; + + // The visibility of the ball + // A value between 0 (not visible) and 1 (visible) + // The exact implementation depends on the source software + optional float visibility = 3; +} + +// A ball kicked by a robot, including predictions when the ball will come to a stop +message KickedBall { + // The initial position [m] from which the ball was kicked + required Vector2 pos = 1; + // The initial velocity [m/s] with which the ball was kicked + required Vector3 vel = 2; + // The unix timestamp [s] when the kick was performed + required double start_timestamp = 3; + + // The predicted unix timestamp [s] when the ball comes to a stop + optional double stop_timestamp = 4; + // The predicted position [m] at which the ball will come to a stop + optional Vector2 stop_pos = 5; + + // The robot that kicked the ball + optional RobotId robot_id = 6; +} + +// A single tracked robot +message TrackedRobot { + required RobotId robot_id = 1; + + // The position [m] in the ssl-vision coordinate system + required Vector2 pos = 2; + // The orientation [rad] in the ssl-vision coordinate system + required float orientation = 3; + + // The velocity [m/s] in the ssl-vision coordinate system + optional Vector2 vel = 4; + // The angular velocity [rad/s] in the ssl-vision coordinate system + optional float vel_angular = 5; + + // The visibility of the robot + // A value between 0 (not visible) and 1 (visible) + // The exact implementation depends on the source software + optional float visibility = 6; +} + +// A frame that contains all currently tracked objects on the field on all cameras +message TrackedFrame { + // A monotonous increasing frame counter + required uint32 frame_number = 1; + // The unix timestamp in [s] of the data + // If timestamp is larger than timestamp_captured, the source has applied a prediction already + required double timestamp = 2; + + // The list of detected balls + // The first ball is the primary one + // Sources may add additional balls based on their capabilities + repeated TrackedBall balls = 3; + // The list of detected robots of both teams + repeated TrackedRobot robots = 4; + + // Information about a kicked ball, if the ball was kicked by a robot and is still moving + // Note: This field is optional. Some source implementations might not set this at any time + optional KickedBall kicked_ball = 5; + + // List of capabilities of the source implementation + repeated Capability capabilities = 6; +} diff --git a/proto/ssl_vision_geometry.proto b/proto/ssl_vision_geometry.proto new file mode 100644 index 0000000..ad82d78 --- /dev/null +++ b/proto/ssl_vision_geometry.proto @@ -0,0 +1,74 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"; + +// A 2D float vector. +message Vector2f { + required float x = 1; + required float y = 2; +} + +// Represents a field marking as a line segment represented by a start point p1, +// and end point p2, and a line thickness. The start and end points are along +// the center of the line, so the thickness of the line extends by thickness / 2 +// on either side of the line. +message SSL_FieldLineSegment { + // Name of this field marking. + required string name = 1; + // Start point of the line segment. + required Vector2f p1 = 2; + // End point of the line segment. + required Vector2f p2 = 3; + // Thickness of the line segment. + required float thickness = 4; +} + +// Represents a field marking as a circular arc segment represented by center point, a +// start angle, an end angle, and an arc thickness. +message SSL_FieldCicularArc { + // Name of this field marking. + required string name = 1; + // Center point of the circular arc. + required Vector2f center = 2; + // Radius of the arc. + required float radius = 3; + // Start angle in counter-clockwise order. + required float a1 = 4; + // End angle in counter-clockwise order. + required float a2 = 5; + // Thickness of the arc. + required float thickness = 6; +} + +message SSL_GeometryFieldSize { + required int32 field_length = 1; + required int32 field_width = 2; + required int32 goal_width = 3; + required int32 goal_depth = 4; + required int32 boundary_width = 5; + repeated SSL_FieldLineSegment field_lines = 6; + repeated SSL_FieldCicularArc field_arcs = 7; +} + +message SSL_GeometryCameraCalibration { + required uint32 camera_id = 1; + required float focal_length = 2; + required float principal_point_x = 3; + required float principal_point_y = 4; + required float distortion = 5; + required float q0 = 6; + required float q1 = 7; + required float q2 = 8; + required float q3 = 9; + required float tx = 10; + required float ty = 11; + required float tz = 12; + optional float derived_camera_world_tx = 13; + optional float derived_camera_world_ty = 14; + optional float derived_camera_world_tz = 15; +} + +message SSL_GeometryData { + required SSL_GeometryFieldSize field = 1; + repeated SSL_GeometryCameraCalibration calib = 2; +} diff --git a/proto/ssl_vision_wrapper.proto b/proto/ssl_vision_wrapper.proto new file mode 100644 index 0000000..cc682b2 --- /dev/null +++ b/proto/ssl_vision_wrapper.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"; + +import "ssl_vision_detection.proto"; +import "ssl_vision_geometry.proto"; + +message SSL_WrapperPacket { + optional SSL_DetectionFrame detection = 1; + optional SSL_GeometryData geometry = 2; +} diff --git a/proto/ssl_vision_wrapper_tracked.proto b/proto/ssl_vision_wrapper_tracked.proto new file mode 100644 index 0000000..714497c --- /dev/null +++ b/proto/ssl_vision_wrapper_tracked.proto @@ -0,0 +1,17 @@ +syntax = "proto2"; + +option go_package = "github.com/RoboCup-SSL/ssl-simulation-controller/internal/tracker"; + +import "ssl_vision_detection_tracked.proto"; + +// A wrapper packet containing meta data of the source +// Also serves for the possibility to extend the protocol later +message TrackerWrapperPacket { + // A random UUID of the source that is kept constant at the source while running + // If multiple sources are broadcasting to the same network, this id can be used to identify individual sources + required string uuid = 1; + // The name of the source software that is producing this messages. + optional string source_name = 2; + // The tracked frame + optional TrackedFrame tracked_frame = 3; +}