Parameters

The parameters system makes all the gettable and settable parameters of the copter accessible. The copter holds a table of parameters which can be retrieved. In this table every parameter name is associated with an ID and a group name. Three IDs are used to acces the TOC and the parameters:

Port Channel Function
2 0 TOC access
2 1 Parameter read
2 2 Parameter write
2 3 Misc. commands

TOC access

These messages permit to access the parameters table of content. The first byte of the message is a message ID, three messages ID are defined:

Message ID Meaning in upstream packets Meaning in downstream packets
0 Reset TOC pointer Last TOC element
1 Get next TOC element TOC element (ID, type, group, name)
3 Get TOC CRC32 Number of parameters, TOC CRC32

The upstream ID are commands and are sent alone. The downstream has the following formats:

Bytes     1       1          1    Null terminated strings
        +---+------------+------+----------+--------------+
        | 0 |            |      |          |              |
        +---+  Param ID  | Type |  Group   |     Name     |
        | 1 |            |      |          |              |
        +---+------------+------+---+------+--------------+
        | 3 | Num. Param |  CRC32   |
        +---+------------+----------+
Bytes     1       1           4

The parameters are sequentially requested by the PC until the end. When the last parameter is reached it has the ID 0 'Last TOC element'. The reset command permits to reset the TOC pointers so that the next sent TOC element will be the first one. The "Get TOC CRC" command also returns the number of parameters.

The CRC32 is a hash of the copter TOC. This is aimed at implementing caching of the TOC in the PC Utils to avoid fetching the full TOC each time the copter is connected.

The type is one byte describing the parameter type:

Type code C type Python unpack
0x08 uint8_t '<B '
0x09 uint16_t '<H'
0x0A uint32_t '<L'
0x0B uint64_t '<Q'
0x00 int8_t '<b'
0x01 int16_t '<h'
0x02 int32_t '<i'
0x03 int64_t '<q'
0x05 FP16 ''
0x06 float '<f'
0x07 double '<d'

Parameter read

Byte Request fields Content
0 ID ID of the parameter to read (see TOC)
Byte Answer fields Content
0 ID ID of the parameter
1-.. value Value of the parameter. Size and format is described in the TOC

The read request is a simple packet on channel 1. Crazyflie answers with the value.

Parameter write

Byte Request fields Content
0 ID ID of the parameter to write
1-... value Value to write. Size and format is described in the TOC
Byte Answer fields Content
0 ID ID of the parameter
1-... value Value of the parameter. Size and format is described in the TOC

The write request is a simple packet on channel 2. Crazyflie sends back the parameter value as an acknowledgement.

Misc. commands

The following misc commands are implemented:

Code Command
0x00 Set by name
0x01 Value updated
0x02 Get extended type (deprecated, use 0x07)
0x03 Persistent store
0x04 Persistent get state
0x05 Persistent clear
0x06 Get default value (deprecated, use 0x08)
0x07 Get extended type V2
0x08 Get default value V2

Set by name

Byte Request fields Content
0 SET_BY_NAME 0x00
1-n group Name of the group
n-(n+1) NULL 0
(n+1)-(n+m+1) name Name of the parameter
(n+m+1)-(n+m+2) NULL 0
(n+m+2)-(n+m+3) TYPE Parameter type
(n+m+3)-... value Value. Size and format is described by type
Byte Answer fields Content
0 SET_BY_NAME 0x00
1-n group Name of the group
n-(n+1) NULL 0
(n+1)-(n+m+1) name Name of the parameter
(n+m+2) NULL 0
(n+m+3) ERROR 0 if the parameter has been successfully written. Other code are taken from errno C codes.

Group and name are ascii strings of size respectively n and m. The type corresponds to the TOC type of the parameter. It is checked for consistency.

This command is useful to set a parameter without having to fetch the full TOC. It is enough to know the group, name and type of the parameter to write it.

Value updated

There is no request packet for this message, it is only sent by the Crazyflie.

Byte Answer fields Content
0 VALUE_UPDATED 0x01
1-2 ID ID of the parameter
3-... value Value of the parameter. Size and format is described in the TOC

This packet is send by the Crazyflie when a parameters has been modified in the firmware. This can for example happen when an app is controlling the Crazyflie autonomously.

Get extended type

Deprecated: Use Get extended type V2 (0x07) instead. This command may have ambiguous responses if the extended_type value equals an error code (e.g., ENOENT=2). Currently not an issue (only extended_type=1 exists), but the V2 command provides an unambiguous format.

Get the extended type of a parameter.

Byte Request fields Content
0 PERSISTENT_GET_EXTENDED_TYPE 0x02
1-2 ID ID of the parameter
Byte Answer fields Content
0 PERSISTENT_GET_EXTENDED_TYPE 0x02
1-2 ID ID of the parameter
3 Extended type A bit field of extended types, see below

The extended type describes extended properties of the parameter. Currently only one extended type is available.

Value Exended type Description
0x01 PERSISTENT The parameter can be stored in persistent memory

Persistent store

Store the current value of a parameter to persistent storage. The parameter will be set to this value. after reboot.

Byte Request fields Content
0 PERSISTENT_STORE 0x03
1-2 ID ID of the parameter
Byte Answer fields Content
0 PERSISTENT_STORE 0x03
1-2 ID ID of the parameter
3 result 0x00 == success
0x02 (ENOENT) == parameter ID does not exist

Persistent get state

Get the persistence state of a parameter.

Byte Request fields Content
0 PERSISTENT_GET_STATE 0x04
1-2 ID ID of the parameter
Byte Answer fields Content
0 PERSISTENT_GET_STATE 0x04
1-2 ID ID of the parameter
3 result 0x00 == parameter is not stored (use default value)
0x01 == parameter is stored
0x02 (ENOENT) == parameter ID does not exist
4 + ts default value The default value that is used if no value is stored in persistent memory
4 + ts + ts [stored value] The stored value, if it is stored

ts == the type size, described in the TOC

If the result is an error (0x02) the packet is terminated after 4 bytes.

Persistent clear

Clear the persistent data for a parameter. After reboot the parameter will be set to the default value.

Byte Request fields Content
0 PERSISTENT_CLEAR 0x05
1-2 ID ID of the parameter
Byte Answer fields Content
0 PERSISTENT_CLEAR 0x05
1-2 ID ID of the parameter
3 result 0x00 == success
0x02 (ENOENT) == parameter ID does not exist or other error

Get default value

Deprecated: Use Get default value V2 (0x08) instead. This command has ambiguous responses for U8 parameters with default value 2 (ENOENT).

Get the default value of a parameter. The default value is the value the parameter has at startup if not overridden by persistent storage.

Byte Request fields Content
0 GET_DEFAULT_VALUE 0x06
1-2 ID ID of the parameter
Byte Answer fields Content
0 GET_DEFAULT_VALUE 0x06
1-2 ID ID of the parameter
3 result/value On error: 0x02 (ENOENT) == parameter ID does not exist or is read-only
On success: First byte of default value
4-… [value continued] Remaining bytes of default value (if applicable)

Protocol ambiguity: For U8 parameters with default value 2, the success response [0x06, ID_L, ID_H, 0x02] is identical to the error response with ENOENT. Clients should check the packet size to distinguish, or preferably use the V2 command.

Get extended type V2

This command provides unambiguous responses compared to the deprecated Get extended type (0x02).

Get the extended type of a parameter with an explicit status byte.

Byte Request fields Content
0 GET_EXTENDED_TYPE_V2 0x07
1-2 ID ID of the parameter
Byte Answer fields Content
0 GET_EXTENDED_TYPE_V2 0x07
1-2 ID ID of the parameter
3 status/error 0x00 == success
0x02 (ENOENT) == parameter ID does not exist or has no extended type
4 [Extended type] Bit field of extended types (only present on success)

The status byte (byte 3) allows clients to distinguish success from error unambiguously. On error, the packet is 4 bytes. On success, the packet is 5 bytes with the extended type in byte 4.

Get default value V2

This command provides unambiguous responses compared to the deprecated Get default value (0x06).

Get the default value of a parameter with an explicit status byte.

Byte Request fields Content
0 GET_DEFAULT_VALUE_V2 0x08
1-2 ID ID of the parameter
Byte Answer fields Content
0 GET_DEFAULT_VALUE_V2 0x08
1-2 ID ID of the parameter
3 status/error 0x00 == success
0x02 (ENOENT) == parameter ID does not exist or is read-only
4-… [default value] Default value (only present on success, size described in TOC)

The status byte (byte 3) allows clients to distinguish success from error unambiguously. On error, the packet is 4 bytes. On success, the packet is 4 + parameter_size bytes with the default value starting at byte 4.