Тип определения указателя на функцию в Nordi c Semiconductor devkit nRF51 - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно разобраться в devkit от Nordi c semiconductor (nRF51-DK), и меня беспокоит одна строка в ble_app_alert_notification (если вы хотите увидеть исходный код).

/**@brief Alert Notification event handler type. */
typedef void (*ble_ans_c_evt_handler_t) (ble_ans_c_evt_t * p_evt);

ble_ans_c_evt_t определяется следующим образом:

typedef struct
{
    ble_ans_c_evt_type_t                evt_type;             /**< Type of event. */
    uint16_t                            conn_handle;          /**< Connection handle on which the ANS service was discovered on the peer device. This will be filled if the evt_type is @ref BLE_ANS_C_EVT_DISCOVERY_COMPLETE.*/
    ble_uuid_t                          uuid;                 /**< UUID of the event in case of an alert or notification. */
    union
    {
        ble_ans_alert_settings_t        settings;             /**< Setting returned from server on read request. */
        ble_ans_alert_notification_t    alert;                /**< Alert Notification data sent by the server. */
        uint32_t                        error_code;           /**< Additional status/error code if the event was caused by a stack error or gatt status, e.g. during service discovery. */
        ble_ans_c_service_t             service;              /**< Info on the discovered Alert Notification Service discovered. This will be filled if the evt_type is @ref BLE_ANS_C_EVT_DISCOVERY_COMPLETE.*/
    } data;
} ble_ans_c_evt_t;

и ble_ans_c_evt_handler_t находится в структуре ble_ans_c_s , которая является службой Bluetooth для это приложение:

struct ble_ans_c_s
{
    ble_ans_c_evt_handler_t             evt_handler;          /**< Event handler to be called for handling events in the Alert Notification Client Application. */
    ble_srv_error_handler_t             error_handler;        /**< Function to be called in case of an error. */
    uint16_t                            conn_handle;          /**< Handle of the current connection (as provided by the BLE stack, is BLE_CONN_HANDLE_INVALID if not in a connection). */
    uint8_t                             central_handle;       /**< Handle for the currently connected central if peer is bonded. */
    uint8_t                             service_handle;       /**< Handle to the service in the database to use for this instance. */
    uint32_t                            message_buffer_size;  /**< Size of message buffer to hold the additional text messages received on notifications. */
    uint8_t *                           p_message_buffer;     /**< Pointer to the buffer to be used for additional text message handling. */
    ble_ans_c_service_t                 service;              /**< Struct to store the different handles and UUIDs related to the service. */
};

ble_ans_c_evt_handler_t нигде не определено и упоминается только в структуре ble_ans_c_s .

Мой вопрос: как следует Я интерпретирую строку typedef void (*ble_ans_c_evt_handler_t) (ble_ans_c_evt_t * p_evt);?

Насколько я понимаю, эта строка означает, что мы определяем указатель на функцию, которая принимает указатель в качестве параметра и ничего не возвращает (void). Затем мы сможем использовать evt_handler из ble_ans_c_s , чтобы назначить любую функцию с той же сигнатурой, что и для typedef выше.

Правильно ли я понимаю?

Спасибо за ваше время.

...