| # Copyright 2022 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| openapi: 3.0.0 |
| info: |
| description: | |
| Pica aims to be a platform agnostic UWB virtual controller. Pica should scale UWB testing since no hardware |
| is required and thus have a massive impact on testing afterwards. |
| version: "1.0.0" |
| title: Pica - A platform agnostic UWB virtual controller |
| contact: |
| name: Pica core team |
| email: pica-core@google.com |
| license: |
| name: Apache 2.0 |
| url: 'http://www.apache.org/licenses/LICENSE-2.0.html' |
| tags: |
| - name: Commands |
| description: sent to the scene to interact with Devices or get the current State of Pica. |
| |
| - name: Events |
| description: Events coming from Pica for the associated Device. |
| |
| components: |
| requestBodies: |
| PositionBodyRequired: |
| description: A JSON object containing Position information |
| required: true |
| content: |
| application/json: |
| schema: |
| $ref: '#/components/schemas/Position' |
| PositionBodyOptionnal: |
| description: A JSON object containing Position information |
| content: |
| application/json: |
| schema: |
| $ref: '#/components/schemas/Position' |
| schemas: |
| Device: |
| description: |
| A Device is a generic term representing an Anchor, noted `anchor`, |
| or an UCI Device as described in the Fira UCI Specification, noted `uci`. |
| type: object |
| properties: |
| category: |
| $ref: "#/components/schemas/Category" |
| mac_address: |
| $ref: "#/components/schemas/MacAddress" |
| position: |
| $ref: "#/components/schemas/Position" |
| Category: |
| description: Represents the device's category, uci or anchor. |
| type: string |
| enum: [uci, anchor] |
| MacAddress: |
| description: | |
| Valid UWB mac addresses must follow the above format |
| * Short Mode: "XX:XX" |
| * Extend Mode: "XX:XX:XX:XX:XX:XX:XX:XX" |
| where X is an hexadecimal number. |
| type: string |
| Position: |
| description: |
| The position includes the Cartesian coordinates in cm, and the yaw, pitch, roll angles in degrees. |
| type: object |
| properties: |
| x: |
| type: integer |
| description: x coordinate in cm |
| y: |
| type: integer |
| description: y coordinate in cm |
| z: |
| type: integer |
| description: z coordinate in cm |
| yaw: |
| type: integer |
| description: yaw in degrees |
| minimum: -180 |
| maximum: 180 |
| pitch: |
| type: integer |
| description: pitch in degrees |
| minimum: -90 |
| maximum: 90 |
| roll: |
| type: integer |
| description: roll in degrees |
| minimum: -180 |
| maximum: 180 |
| parameters: |
| MacAddress: |
| name: mac-address |
| in: path |
| description: | |
| Valid UWB mac addresses must follow the above format |
| * Short Mode: "XX:XX" |
| * Extend Mode: "XX:XX:XX:XX:XX:XX:XX:XX" |
| where X is an hexadecimal number. |
| required: true |
| schema: |
| type: string |
| paths: |
| /init-uci-device/{mac-address}: |
| post: |
| tags: [Commands] |
| summary: Init a new uwb subsystem and instantiate an UCI Device |
| description: |
| This command should be call by any host wishing to use Pica as an UWB Subsystem |
| and shall be called only once by UCI Device. |
| parameters: |
| - $ref: "#/components/parameters/MacAddress" |
| requestBody: |
| $ref: "#/components/requestBodies/PositionBodyOptionnal" |
| responses: |
| '200': { description: Success } |
| '403': { description: Device already initialized } |
| '500': { description: Internal error } |
| /set-position/{mac-address}: |
| post: |
| tags: [Commands] |
| summary: Set the position of a Device |
| description: | |
| Set the position of the Device for x, y, z, yaw, pitch and roll. Pica will trigger the |
| `neighbor-updated` event for every other device present in the scene closer that the maximum distance UINT16_MAX cm. |
| parameters: |
| - $ref: "#/components/parameters/MacAddress" |
| requestBody: |
| $ref: "#/components/requestBodies/PositionBodyRequired" |
| responses: |
| '200': { description: Success } |
| '404': { description: Device not found } |
| '500': { description: Internal error } |
| /create-anchor/{mac-address}: |
| post: |
| tags: [Commands] |
| summary: Create an anchor Device in the scene |
| description: |
| Create an anchor Device in the scene with a given MacAddress. If the position |
| is not specified then the anchor will be create at the origin of the |
| scene, [0,0,0,0,0,0] |
| parameters: |
| - $ref: "#/components/parameters/MacAddress" |
| requestBody: |
| $ref: "#/components/requestBodies/PositionBodyOptionnal" |
| responses: |
| '200': { description: Success } |
| '406': { description: Wrong argument } |
| '409': { description: Anchor already exist } |
| /destroy-anchor/{mac-address}: |
| delete: |
| tags: [Commands] |
| summary: Delete the anchor Device |
| description: |
| Delete the anchor Device from the scene |
| sessions |
| parameters: |
| - $ref: "#/components/parameters/MacAddress" |
| responses: |
| '200': { description: Success } |
| '404': { description: Anchor not found } |
| '500': { description: Internal error } |
| /get-state: |
| get: |
| tags: [Commands] |
| summary: Get state of Pica itself |
| description: |
| Get the state of Pica itself and return a list of connected |
| Devices |
| responses: |
| '200': |
| description: Success, return a list of Devices |
| content: |
| application/json: |
| schema: |
| type: array |
| items: |
| $ref: "#/components/schemas/Device" |
| '500': { description: Internal error } |
| /events: |
| get: |
| tags: [Events] |
| summary: Events from Pica |
| description: | |
| Events coming from Pica for the associated Device. |
| * device-added - Device added to the scene |
| * device-removed - Device deleted from the scene |
| * device-updated - Device position updated |
| * neighbor-updated - Neighbor position updated |
| |
| responses: |
| '200': |
| description: | |
| Represent an event source: https://developer.mozilla.org/en-US/docs/Web/API/EventSource |
| Pica triggers an event everytime a command is completed. |
| content: |
| text/event-stream: |
| schema: |
| type: array |
| format: event-stream |
| items: |
| oneOf: |
| - type: object |
| properties: |
| event: |
| const: device-added |
| description: Device added to the scene |
| data: |
| $ref: "#/components/schemas/Device" |
| - type: object |
| properties: |
| event: |
| const: device-removed |
| description: Device removed from the scene, the device's position is ignored |
| data: |
| type: object |
| properties: |
| category: |
| $ref: "#/components/schemas/Category" |
| mac_address: |
| $ref: "#/components/schemas/MacAddress" |
| - type: object |
| properties: |
| event: |
| const: device-updated |
| description: Device position updated |
| data: |
| $ref: "#/components/schemas/Device" |
| - type: object |
| properties: |
| event: |
| const: neighbor-updated |
| description: Neighbor device updated |
| data: |
| type: object |
| properties: |
| source_category: |
| $ref: "#/components/schemas/Category" |
| source_mac_address: |
| $ref: "#/components/schemas/MacAddress" |
| destination_category: |
| $ref: "#/components/schemas/Category" |
| destination_mac_address: |
| $ref: "#/components/schemas/MacAddress" |
| distance: |
| description: Distance in cm. |
| type: integer # u16 |
| minimum: 0 |
| maximum: 65535 |
| azimuth: |
| description: Azimuth in degrees |
| type: integer |
| minimum: -180 |
| maximum: 180 |
| elevation: |
| description: Elevation is degrees |
| type: integer |
| minimum: -90 |
| maximum: 90 |
| |
| |
| '500': { description: Internal error } |