Barco F80-4K9 User Manual

RS232 and Network Command Catalog
For JSON RPC/Pulse Based Projectors
For F80
End User
Reference guide
1.7
2019-02-20
Pulse API Reference Guide Version 1.7
Table of contents
Pulse API Reference Guide 2 of 218
Pulse API Reference Guide Version 1.7
Pulse API
This document describes the application programmers interface to Pulse projectors.
How to connect to the projector, the communication protocol and a programmers guide is presented in the following
section.
Introduction
The facade API is based on the JSON-RPC 2.0 protocol and provides access to Pulse services to clients. The services
can be accessed through the network using the TCP/IP protocol, or using a RS232 serial cable.
Connecting to Pulse services
Network
If the projector is on a network, TCP/IP can be used to connect to Pulse services. The service is available on port
number 9090.
Serial port
A serial cable can be connected to the projector in order to access the Pulse services.
Connect the projector and host using a standard serial cable with 9-pin female to the host, and 9-pin male to the
projector. Pin 2 connects to pin 2, pin 3 connects to pin 3 and pin 5 connects to pin 5.
RS232 Communication Parameters
Parameter Value
Baud rate 19200
Parity None
Data bits 8
Stop bits 1
Flow control None
Pulse API Reference Guide 3 of 218
Pulse API Reference Guide Version 1.7
Quick start guide
The following sections are examples of frequently used commands, just to get you started. This assumes that the
connection is set up as described in the previous chapter. The type of connection is not important. The same
commands are available for all connection types.
Power on projector
Request
{
"jsonrpc": "2.0",
"method": "system.poweron"
}
Power off projector
Request
{
"jsonrpc": "2.0",
"method": "system.poweroff"
}
Select DisplayPort 1 as input source
Request
{
"jsonrpc": "2.0",
"method": "property.set",
"params": {
"property": "image.window.main.source",
"value": "DisplayPort 1"
}
}
Select HDMI as input source
Pulse API Reference Guide 4 of 218
Pulse API Reference Guide Version 1.7
Request
{
"jsonrpc": "2.0",
"method": "property.set",
"params": {
"property": "image.window.main.source",
"value": "HDMI"
}
}
Object and method naming
Objects and members are named usingdot notation in lowercase format (JavaScript-like notation). Members are
either a method, property, signal or object. A typical method part of an invocation will then look like:
method: "foo.echo"
If there are more than one object of a "kind", it may be modeled and notated like:
tempctrl.fans
tempctrl.fans.mainfan
tempctrl.fans.lampblower
In the example above it is possible to get all fans by introspecting the object represented by temptrl.fans. Example:
accessing the rpm property of the mainfan:
tempctrl.fans.mainfan.rpm
Type support
Basic types
string (e.g. "hello")
integer (e.g 114)
float (e.g 3.141592653589793)
boolean (e.g true)
Container types
array (e.g ["hello", "world"] )
object (e.g {"name": "Johnny", "age": 30, "children": ["Agnes", "Tim"] } )
dictionary with string key (e.g gold medals in 2018 Winter Olympics Peyongchang {"Norway": 13, "Germany": 13 } )
Pulse API Reference Guide 5 of 218
Pulse API Reference Guide Version 1.7
Parameters
All parameters are passed by name, but the position or order of the parameters doesn't matter.
Thus:
{
"jsonrpc": "2.0",
"method": "property.set",
"params": {
"property": "image.window.main.source",
"value": "DisplayPort 1"
}
}
is exactly the same as:
{
"method": "property.set",
"jsonrpc": "2.0",
"params": {
"value": "DisplayPort 1",
"property": "image.window.main.source"
}
}
Authentication
A client session must start with an authentication request containing a secret pass code. The purpose of the
authentication protocol is to set the user access level. Authentication is only necessary when a higher level than
normal end user is required. For normal end user access the authentication can be skipped. To authenticate with the
server use the following type of request.
Request Response
{
"jsonrpc": "2.0",
"method": "authenticate",
"params": {
"code": 98765
},
"id": 1
}
Pulse API Reference Guide 6 of 218
{
"jsonrpc": "2.0",
"result": true,
"id": 1
}
Pulse API Reference Guide Version 1.7
Service API
Property Type Required Comments
jsonrpc string
method string
params
id string | number
error object
yes
yes see below
no Request identier
yes, if error Error object - see JSON-RPC 2.0
Methods
Method invocation API
Request Response
2.0
see below
{
"jsonrpc": "2.0",
"method": "ledctrl.blink",
"params": {
"led": "systemstatus",
"color": "red",
"period": 42
},
"id": 3
}
{
"jsonrpc": "2.0",
"result": 0,
"id": 3
}
Properties
API for setting and getting property values
Set value of a property
Pulse API Reference Guide 7 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.set",
"params": {
"property": "objectname.propertyname",
"value": 100
},
"id": 3
}
{
"jsonrpc": "2.0",
"result": true,
"id": 3
}
It is best practice to wait for the conrmation of the property.set before setting the same property again.
Continuously setting the same property without waiting for conrmation may flood the server with unnecessary
request and may reduce performance.
Read the value of a property
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": "objectname.propertyname"
},
"id": 4
}
Read values of multiple properties
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": [
"image.brightness",
"image.contrast"
]
},
"id": 5
}
{
"jsonrpc": "2.0",
"result": {
"image.brightness": 0,
"image.contrast": 1
},
"id": 5
}
{
"jsonrpc": "2.0",
"result": 100,
"id": 4
}
Pulse API Reference Guide 8 of 218
Pulse API Reference Guide Version 1.7
Observe changes on one property
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": "image.brightness"
},
"id": 6
}
{
"jsonrpc": "2.0",
"result": true,
"id": 6
}
Observe changes on multiple properties
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": [
"image.brightness",
"image.contrast"
]
},
"id": 7
}
{
"jsonrpc": "2.0",
"result": true,
"id": 7
}
Stop observing one property
For change notications, see Notications
Pulse API Reference Guide 9 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.unsubscribe",
"params": {
"property": "image.brightness"
},
"id": 8
}
{
"jsonrpc": "2.0",
"result": true,
"id": 8
}
Stop observing multiple properties
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "property.unsubscribe",
"params": {
"property": [
"image.brightness",
"image.contrast"
]
},
"id": 9
}
{
"jsonrpc": "2.0",
"result": true,
"id": 9
}
Signals
Subscribe to a signal
For change notications, see Notications
Pulse API Reference Guide 10 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "signal.subscribe",
"params": {
"signal": "modelupdated"
},
"id": 10
}
{
"jsonrpc": "2.0",
"result": true,
"id": 10
}
Subscribe to multiple signals
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "signal.subscribe",
"params": {
"signal": [
"modelupdated",
"image.processing.warp.gridchanged"
]
},
"id": 11
}
{
"jsonrpc": "2.0",
"result": true,
"id": 11
}
Unsubscribe from a signal
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "signal.unsubscribe",
"params": {
"signal": "modelupdated"
},
"id": 12
}
{
"jsonrpc": "2.0",
"result": true,
"id": 12
}
Unsubscribe from multiple signals
Pulse API Reference Guide 11 of 218
Pulse API Reference Guide Version 1.7
For change notications, see Notications
Request Response
{
"jsonrpc": "2.0",
"method": "signal.unsubscribe",
"params": {
"signal": [
"modelupdated",
"image.processing.warp.gridchanged"
]
},
"id": 13
}
{
"jsonrpc": "2.0",
"result": true,
"id": 13
}
Notications
The client has to implement the notication API to retrieve notications. Notication messages will not have an id and
no response message must be returned.
Properties
The client must implement the property.changed function which receives an array of property/value pairs.
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"objectname.propertyname": 100
},
{
"otherobject.otherproperty": "bar"
}
]
}
}
Signals
The client must implement the signal.callback function which receives an array of signal/argument-list pairs.
Pulse API Reference Guide 12 of 218
Pulse API Reference Guide Version 1.7
Notication
{
"jsonrpc": "2.0",
"method": "signal.callback",
"params": {
"signal": [
{
"objectname.signalname": {
"arg1": 100,
"arg2": "cat"
}
},
{
"otherobject.othersignal": {
"foo": "bar"
}
}
]
}
}
Introspection API
Read metadata method
Metadata of available objects (methods, properties, signals) can be read out. The data is restricted by the client's
authenticated access level. A typical usage for metadata is to set up OSD menus, etc. The format of the metadata is
described here:API introspection data format.
Introspection API (recursive)
Pulse API Reference Guide 13 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "introspect",
"params": {
"object": "foo",
"recursive": true,
"id": 1
}
}
- or -
{
"jsonrpc": "2.0",
"method": "introspect",
"params": [
"foo",
true
],
"id": 1
}
{
"jsonrpc": "2.0",
"result": {
"object": "foo",
"methods": [
{
"name": "echo"
}
],
"more": ".... see API introspection data "
},
"id": 1
}
Introspection API (non recursive)
Pulse API Reference Guide 14 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "introspect",
"params": {
"object": "motors",
"recursive": false,
"id": 2
}
}
{
"jsonrpc": "2.0",
"result": {
"name": "motors",
"objects": [
{
"name": "motors.motor1"
},
{
"name": "motors.motor2"
},
{
"name": "motors.motor3"
}
]
},
"id": 2
}
- or -
{
"jsonrpc": "2.0",
"method": "introspect",
"params": [
"motors",
false
],
"id": 2
}
Property Type Required Comments
jsonrpc string
method string
yes
yes
2.0
introspect
params object {"object":
string}
no (default =
"")
"object": name of object to introspect (dot notation allowed),
default/empty will introspect everything. The object and string
notations are equivalents.
Pulse API Reference Guide 15 of 218
Pulse API Reference Guide Version 1.7
Property Type Required Comments
{"recursive":
bool}
id string | number
result object
no
(default=true)
recursive": if false then only object names are listed (one level).
This is convenient if you want to list collections of objects
no Request identier
yes The full format of the result is described here API Introspection
data format
error object
if error Error object - see JSON-RPC 2.0
Object changed signal
The introspect API provides asignal that triggers when new objects arrive, or when objects are removed. The name of
the signal is: modelupdated.(See sectionSignals on how to subscribe and unsubscribe to signals.)
Subscribe to the model updated signal
Request Response
{
"jsonrpc": "2.0",
"method": "signal.subscribe",
"params": {
"signal": "modelupdated"
},
"id": 2
}
{
"jsonrpc": "2.0",
"result": true,
"id": 2
}
Callback method on client side
Pulse API Reference Guide 16 of 218
Pulse API Reference Guide Version 1.7
Notication
{
"jsonrpc": "2.0",
"method": "signal.callback",
"params": {
"signal": [
{
"introspect.objectchanged": {
"object": "motors.motor1",
"newobject": true
}
}
]
}
}
Argument Type Decription
object string
isnew bool
Name of object
true: object is new, false: object is lost
File endpoints
Some objects provide endpoints for uploading or downloading various data types. For example, a warp grid can be
uploaded to the warp engine.The objects that provide end points are found in the documentation below under the File
endpoints headings.
To download a le from the projector, you must enter its URL. The URL is constructed from the following parts:
http://
Address of the projector. E.g: 192.168.1.100
/api
File endpoint. E.g: /image/processing/warp/file/transfer
This will give you a URL that looks like this: http://192.168.100/api/image/processing/warp/file/transfer
Entering this URL in a browser will trigger a download from the projector and save the current warp grid to your
download folder.
You can also use the curl program to do the same. E.g: curl -O -J http://api/image/processing/warp/file/
transfer
Pulse API Reference Guide 17 of 218
Pulse API Reference Guide Version 1.7
Note that not all endpoints supports downloading the current le. In those cases you need to specify which le to
download. E.g: http://192.168.1.100/api/image/processing/warp/file/transfer/warpgrid.xml
To upload a le to the projector, use the curl program, or some other tool that supports HTTP upload.To upload a
warp grid to the projector from your local drive, enter the following command:
curl -F file=@warpgrid.xml http://192.168.1.100/api/image/processing/warp/file/transfer
You can also specify -X POST to the command, but in this case that's implied.
Pulse API Reference Guide 18 of 218
Pulse API Reference Guide Version 1.7
Programmers guide
This section describes common tasks for controlling the projector. For example, selecting input source and adjusting
image properties.
Basic operation
This chapter describes basic operation such as powering on/off the projector.
Projector state
To get the current operation state from the projector, use the following command.
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": "system.state"
},
"id": 1
}
{
"jsonrpc": "2.0",
"result": "on",
"id": 1
}
The resulting value will be one of the following:
"boot" - the projector is booting up
"eco" - the projector is in ECO/power save mode
"standby" - the projector is in standby mode
"ready" - the projector is in ready mode
"conditioning" - the projector is warming up
"on" - the projector is on
"deconditioning" - the projector is cooling down
To be notied when the state changes, a subscription must be requested, as shown in the following example.
Pulse API Reference Guide 19 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": "system.state"
},
"id": 2
}
{
"jsonrpc": "2.0",
"result": true,
"id": 2
}
When ever there is a change in the state, the server will notify the client as shown in the next example.
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"system.state": "ready"
}
]
}
}
Power on
To power on the projector, issue the following request.
Request Response
{
"jsonrpc": "2.0",
"method": "system.poweron",
"params": {
"property": "system.state"
},
"id": 3
}
Notice that the result is null. This is not an error, it's just that the method does not return a proper result. If there
was an error, the response would contain an error member that contains information about the error that occurred.
{
"jsonrpc": "2.0",
"result": null,
"id": 3
}
Pulse API Reference Guide 20 of 218
Pulse API Reference Guide Version 1.7
Also notice that this method does not need any arguments, so the params member does not need to be present.
Nothing bad happens if the params member is present. It will just be ignored.
If the projector already is on, or if it's in transition between states, nothing will happen. Therefore, it's good practice to
verify that the projector state is either standby or ready before issuing the power on command.
Power off
To power on the projector, issue the following request.
Request Response
{
"jsonrpc": "2.0",
"method": "system.poweroff",
"params": {
"property": "system.state"
},
"id": 4
}
{
"jsonrpc": "2.0",
"result": null,
"id": 4
}
If the projector already is off, or if it's in transition between states, nothing will happen. Therefore, it's good practice to
verify that the projector state is on before issuing the power off command.
Sources
The source input management is made up windows, sources and connectors. Each window has a source attached,
and each source is made up of one or more connectors.
Active source
To get the name of the currently active source, use the following request.
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": "image.window.main.source"
},
"id": 0
}
{
"jsonrpc": "2.0",
"id": 0,
"result": "DisplayPort 1"
}
List available sources
Pulse API Reference Guide 21 of 218
Pulse API Reference Guide Version 1.7
To get a list of available sources, use the following request.
Request Response
{
"jsonrpc": "2.0",
"method": "image.source.list",
"id": 1
}
{
"jsonrpc": "2.0",
"id": 1,
"result": [
"DVI 1",
"DVI 2",
"DisplayPort 1",
"DisplayPort 2",
"Dual DVI",
"Dual DisplayPort",
"Dual Head DVI",
"Dual Head DisplayPort",
"HDBaseT",
"HDMI",
"SDI"
]
}
The response contains a list of all the available source names. The list contents will vary depending on the projector
model.
Set the active source
To set the active source, rst get the list of available sources as shown in the previous section. Then use the following
request.
Request Response
{
"jsonrpc": "2.0",
"method": "property.2et",
"params": {
"property": "image.window.main.source",
"value": "DisplayPort 1"
},
"id": 2
}
{
"jsonrpc": "2.0",
"id": 2,
"result": true
}
Connectors
The connectors are the physical input connectors of the projector. Available connectors depend on the projector
Pulse API Reference Guide 22 of 218
Pulse API Reference Guide Version 1.7
model.
To list all the available connectors, use the following request.
Request Response
{
"jsonrpc": "2.0",
"method": "image.connector.list",
"id": 3
}
{
"jsonrpc": "2.0",
"id": 3,
"result": [
"DVI 1",
"DVI 2",
"DisplayPort 1",
"DisplayPort 2",
"HDBaseT",
"HDMI",
"SDI"
]
}
To list the connectors used by a specic source, the source object name must be acquired. This can be done by
translating the source name, or by introspection.
The easiest way is to translate the source name. Given the source name of DisplayPort 1, remove all non word
characters and convert to all lower case characters. This can be done quite easy by using regular expressions.
Example in JavaScript shown below.
const sourceName = 'DisplayPort 1';
const objectName = sourceName.replace(/\W/g, '').toLowerCase();
/* objectName is now 'displayport1' */
Now that we have the source object name, we can call the method that lists all the connectors used by this source.
Pulse API Reference Guide 23 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "image.source.displayport1.listconnectors",
"id": 4
}
{
"jsonrpc": "2.0",
"id": 4,
"result": [
{
"gridposition": {
"row": 0,
"column": 0,
"plane": 0
},
"name": "DisplayPort 1"
}
]
}
The result of the method is an array of connector information. This information contains the connector name and the
grid position of the connector, which is useful when multiple connectors are used.
Source signal
Given a connector name of DisplayPort 1, this translated to a connector name of displayport1. We can then get
signal information by using the following request.
Pulse API Reference Guide 24 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property":
"image.connector.displayport1.detectedsignal"
},
"id": 5
}
{
"jsonrpc": "2.0",
"id": 5,
"result": {
"active": true,
"name": "2560x1600 @ 50.10Hz",
"vertical_total": 1638,
"horizontal_total": 2720,
"vertical_resolution": 1600,
"horizontal_resolution": 2560,
"vertical_sync_width": 6,
"vertical_front_porch": 3,
"vertical_back_porch": 29,
"horizontal_sync_width": 32,
"horizontal_front_porch": 48,
"horizontal_back_porch": 80,
"horizontal_frequency":
82068.11653672549,
"vertical_frequency":
50.102710556641114,
"pixel_rate": 223222961,
"scan": "Progressive",
"bits_per_component": 10,
"color_space": "RGB",
"signal_range": "0-255",
"chroma_sampling": "4:4:4",
"gamma_type": "POWER"
}
}
Source and signal updates
To get updates when a new source is selected, or the signal on a connector change, you must listen forchanges on a
number of properties.
Subscribe to the source property of the window
Pulse API Reference Guide 25 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": "image.window.main.source"
},
"id": 6
}
{
"jsonrpc": "2.0",
"id": 6,
"result": true
}
This will generate a property change notication when ever there is a change in the active source. E.g when the user
switches from DisplayPort 1 to DisplayPort 2.
The JSON RPC client must therefore implement the property change listener in order to prcess the notication.
The JSON RPC servier will send notications as shown below.
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"image.window.main.source": ""
}
]
}
}
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"image.window.main.source": "DisplayPort 2"
}
]
}
}
Pulse API Reference Guide 26 of 218
Pulse API Reference Guide Version 1.7
Note that two notications are delivered in this case. First, when the previously selected source is deselected.Next,
when the new source is selected.
Connector signal updates
To get updates when there is a change in the signal on sources connectors, each connector of the sourcemust have a
listener for the signal detection property of the connector.
The recommended way to do this is to reflect the source and connector structure of the server in the client application.
That means:
Store all the source names and object names
Call image.source.list
Translate the source names into source object names as shown in the beginning of the chapter
For each source object
Call image.source.[name].listconnectors
Translate the connector names to connector object names
Maintain a list of connectors per source
For each connector object
Subscribe to image.connector.[name].detectedsignal
When the notications are received, match up the connector names with the connectors used by the active source and
show the new information to the user.
Keep in mind that notications are only sent when there is an actual change in a value. Simply subscribing to a
property does not get the current value. To get the current value use the property.get method and specify which
property you are interested in.
Illumination
This section describes how to set the lamp/LED/laser power of the projector.
Illumination state
To read the state of the illumination use the following commands.
Pulse API Reference Guide 27 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": "illumination.state"
},
"id": 0
}
{
"jsonrpc": "2.0",
"id": 0,
"result": "Off"
}
The result will be either On or Off. To receive notications when the state changes, you need to subscribe. The
following commands will request change notications for the illumination state.
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": "illumination.state"
},
"id": 1
}
{
"jsonrpc": "2.0",
"id": 1,
"result": true
}
The client needs to implement the property change listener to receive notications.
When a change happens, the server will send the following notications to the client.
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"illumination.state": "On"
}
]
}
}
Illumination sources
Pulse API Reference Guide 28 of 218
Pulse API Reference Guide Version 1.7
Different projectors will have different types of illumination sources. Some will have lasers, others will have LEDs, or a
combination of both, and yet others may have xenon or UHP lamps.
To query the available sources, you must do an introspection of the illumination object. The following command
shows an example of that.
Request Response
{
"jsonrpc": "2.0",
"method": "introspect",
"params": {
"property": "illumination.sources",
"recursive": false
},
"id": 2
}
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"objects": [
{
"name": "illuminations.sources.laser"
}
]
}
}
From the response, we can see that this projector has a laser illumination source. Each source has properties that give
you information about the minimum, maximum and the current illumination power level.
The current power level can be read or written, the minimum and maxium power level are read only, but they are
dynamic values and may change depending on the setting of the projector. The lens type and lens position may also
affect the power levels.
To read the current power level, use the following commands.
Request Response
{
"jsonrpc": "2.0",
"method": "property.get",
"params": {
"property": "illumination.sources.laser.power"
},
"id": 3
}
{
"jsonrpc": "2.0",
"id": 3,
"result": 30
}
To be notied of changes in the power level, you must subscribe to property changes.
Pulse API Reference Guide 29 of 218
Pulse API Reference Guide Version 1.7
Request Response
{
"jsonrpc": "2.0",
"method": "property.subscribe",
"params": {
"property": [
"illumination.sources.laser.power"
]
},
"id": 4
}
{
"jsonrpc": "2.0",
"id": 4,
"result": true
}
To set the value of the laser power, use the following command.
Request Response
{
"jsonrpc": "2.0",
"method": "property.set",
"params": {
"property": "illumination.sources.laser.power",
"value": 40
},
"id": 5
}
{
"jsonrpc": "2.0",
"id": 5,
"result": true
}
After the conrmation of the value, a change notication is also sent.
Notication
{
"jsonrpc": "2.0",
"method": "property.changed",
"params": {
"property": [
{
"illumination.sources.laser.power": 40
}
]
}
}
To get the minimum and maximum power levels, use the following commands.
Pulse API Reference Guide 30 of 218
Loading...
+ 188 hidden pages