blob: 71938361152ede749936dcf1ae1d0c69035f794e [file] [log] [blame]
# 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 }