.. -*- coding: utf-8; mode: rst -*-

.. _CEC_DQEVENT:

*****************
ioctl CEC_DQEVENT
*****************

Name
====

CEC_DQEVENT - Dequeue a CEC event


Synopsis
========

.. cpp:function:: int ioctl( int fd, int request, struct cec_event *argp )

Arguments
=========

``fd``
    File descriptor returned by :ref:`open() <cec-func-open>`.

``request``
    CEC_DQEVENT

``argp``


Description
===========

.. note:: This documents the proposed CEC API. This API is not yet finalized
   and is currently only available as a staging kernel module.

CEC devices can send asynchronous events. These can be retrieved by
calling :ref:`ioctl CEC_DQEVENT <CEC_DQEVENT>`. If the file descriptor is in
non-blocking mode and no event is pending, then it will return -1 and
set errno to the ``EAGAIN`` error code.

The internal event queues are per-filehandle and per-event type. If
there is no more room in a queue then the last event is overwritten with
the new one. This means that intermediate results can be thrown away but
that the latest event is always available. This also means that is it
possible to read two successive events that have the same value (e.g.
two :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>` events with
the same state). In that case the intermediate state changes were lost but
it is guaranteed that the state did change in between the two events.


.. _cec-event-state-change_s:

.. flat-table:: struct cec_event_state_change
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 8


    -  .. row 1

       -  __u16

       -  ``phys_addr``

       -  The current physical address. This is ``CEC_PHYS_ADDR_INVALID`` if no
          valid physical address is set.

    -  .. row 2

       -  __u16

       -  ``log_addr_mask``

       -  The current set of claimed logical addresses. This is 0 if no logical
          addresses are claimed or if ``phys_addr`` is ``CEC_PHYS_ADDR_INVALID``.
	  If bit 15 is set (``1 << CEC_LOG_ADDR_UNREGISTERED``) then this device
	  has the unregistered logical address. In that case all other bits are 0.



.. _cec-event-lost-msgs_s:

.. flat-table:: struct cec_event_lost_msgs
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 16


    -  .. row 1

       -  __u32

       -  ``lost_msgs``

       -  Set to the number of lost messages since the filehandle was opened
	  or since the last time this event was dequeued for this
	  filehandle. The messages lost are the oldest messages. So when a
	  new message arrives and there is no more room, then the oldest
	  message is discarded to make room for the new one. The internal
	  size of the message queue guarantees that all messages received in
	  the last two seconds will be stored. Since messages should be
	  replied to within a second according to the CEC specification,
	  this is more than enough.



.. _cec-event:

.. flat-table:: struct cec_event
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 1 8


    -  .. row 1

       -  __u64

       -  ``ts``

       -  Timestamp of the event in ns.
	  The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access
	  the same clock from userspace use :c:func:`clock_gettime(2)`.

       -

    -  .. row 2

       -  __u32

       -  ``event``

       -  The CEC event type, see :ref:`cec-events`.

       -

    -  .. row 3

       -  __u32

       -  ``flags``

       -  Event flags, see :ref:`cec-event-flags`.

       -

    -  .. row 4

       -  union

       -  (anonymous)

       -
       -

    -  .. row 5

       -
       -  struct cec_event_state_change

       -  ``state_change``

       -  The new adapter state as sent by the :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>`
	  event.

    -  .. row 6

       -
       -  struct cec_event_lost_msgs

       -  ``lost_msgs``

       -  The number of lost messages as sent by the :ref:`CEC_EVENT_LOST_MSGS <CEC-EVENT-LOST-MSGS>`
	  event.



.. _cec-events:

.. flat-table:: CEC Events Types
    :header-rows:  0
    :stub-columns: 0
    :widths:       3 1 16


    -  .. _`CEC-EVENT-STATE-CHANGE`:

       -  ``CEC_EVENT_STATE_CHANGE``

       -  1

       -  Generated when the CEC Adapter's state changes. When open() is
	  called an initial event will be generated for that filehandle with
	  the CEC Adapter's state at that time.

    -  .. _`CEC-EVENT-LOST-MSGS`:

       -  ``CEC_EVENT_LOST_MSGS``

       -  2

       -  Generated if one or more CEC messages were lost because the
	  application didn't dequeue CEC messages fast enough.



.. _cec-event-flags:

.. flat-table:: CEC Event Flags
    :header-rows:  0
    :stub-columns: 0
    :widths:       3 1 8


    -  .. _`CEC-EVENT-FL-INITIAL-VALUE`:

       -  ``CEC_EVENT_FL_INITIAL_VALUE``

       -  1

       -  Set for the initial events that are generated when the device is
	  opened. See the table above for which events do this. This allows
	  applications to learn the initial state of the CEC adapter at
	  open() time.



Return Value
============

On success 0 is returned, on error -1 and the ``errno`` variable is set
appropriately. The generic error codes are described at the
:ref:`Generic Error Codes <gen-errors>` chapter.
