RCBControllerでモータを制御します。うおーるぼっとも動かせました。

Dependencies:   BLE_API TB6612FNG2 mbed nRF51822

Fork of BLE_RCBController2 by Junichi Katsu

うまく接続できない時は、iPhone/iPadのBluetoothをOFF->ONしてキャッシュをクリアしてみてください。

ライブラリ類をUpdateするとコンパイル出来なくなります。インポートした物をそのまま使って下さい。

RCBControllerでうおーるぼっとを操縦する例 /media/uploads/robo8080/img_1671.jpg

Components / Wallbot
This robot has switch, line sensors and motors. It controls by mbed.

RCBControllerでの操縦は次の4種類あります。 それぞれうおーるぼっとの動きが異なりますので試してみてください。

  • 左十字ボタン
  • 左のみアナログ
  • 右のみアナログ
  • 両方アナログ

うおーるぼっと(LPC1768のソケット)とHRM1017の接続はこれです。

LPC1768 ー HRM1017

p11 ーーー P0_0

p12 ーーー P0_1

p13 ーーー P0_28

p14 ーーー P0_29

p21 ーーー P0_30

p22 ーーー P0_25

GND ーーー GND

/media/uploads/robo8080/img_1711.jpg

/media/uploads/robo8080/img_1703.jpg

HRM1017の電源はうおーるぼっとのUSBコネクタからとります。 /media/uploads/robo8080/img_1674.jpg

Committer:
jksoft
Date:
Wed Aug 20 13:41:01 2014 +0000
Revision:
4:ebda47d22091
Parent:
nRF51822/nordic/nrf-sdk/ble/ble_services/ble_dfu.h@1:48f6e08a3ac2
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 1:48f6e08a3ac2 1 /* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
jksoft 1:48f6e08a3ac2 2 *
jksoft 1:48f6e08a3ac2 3 * The information contained herein is property of Nordic Semiconductor ASA.
jksoft 1:48f6e08a3ac2 4 * Terms and conditions of usage are described in detail in NORDIC
jksoft 1:48f6e08a3ac2 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
jksoft 1:48f6e08a3ac2 6 *
jksoft 1:48f6e08a3ac2 7 * Licensees are granted free, non-transferable use of the information. NO
jksoft 1:48f6e08a3ac2 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
jksoft 1:48f6e08a3ac2 9 * the file.
jksoft 1:48f6e08a3ac2 10 *
jksoft 1:48f6e08a3ac2 11 */
jksoft 1:48f6e08a3ac2 12
jksoft 1:48f6e08a3ac2 13 /**@file
jksoft 1:48f6e08a3ac2 14 *
jksoft 1:48f6e08a3ac2 15 * @defgroup ble_sdk_srv_dfu Device Firmware Update Service
jksoft 1:48f6e08a3ac2 16 * @{
jksoft 1:48f6e08a3ac2 17 * @ingroup ble_sdk_srv
jksoft 1:48f6e08a3ac2 18 * @brief Device Firmware Update Service
jksoft 1:48f6e08a3ac2 19 *
jksoft 1:48f6e08a3ac2 20 * @details The Device Firmware Update (DFU) service is a GATT based service that can be used for
jksoft 1:48f6e08a3ac2 21 * performing firmware updates over BLE. Note that this implementation uses vendor
jksoft 1:48f6e08a3ac2 22 * specific UUIDs for service and characteristics and is intended to demonstrate the
jksoft 1:48f6e08a3ac2 23 * firmware updates over BLE. Refer @ref dfu_ble_service_spec and @ref
jksoft 1:48f6e08a3ac2 24 * dfu_ble_profile_spec for more information on the service and profile respectively.
jksoft 1:48f6e08a3ac2 25 */
jksoft 1:48f6e08a3ac2 26
jksoft 1:48f6e08a3ac2 27 #ifndef BLE_DFU_H__
jksoft 1:48f6e08a3ac2 28 #define BLE_DFU_H__
jksoft 1:48f6e08a3ac2 29
jksoft 1:48f6e08a3ac2 30 #include <stdint.h>
jksoft 1:48f6e08a3ac2 31 #include "ble_gatts.h"
jksoft 1:48f6e08a3ac2 32 #include "ble.h"
jksoft 1:48f6e08a3ac2 33 #include "ble_srv_common.h"
jksoft 1:48f6e08a3ac2 34
jksoft 1:48f6e08a3ac2 35 #define BLE_DFU_SERVICE_UUID 0x1530 /**< The UUID of the DFU Service. */
jksoft 1:48f6e08a3ac2 36 #define BLE_DFU_PKT_CHAR_UUID 0x1532 /**< The UUID of the DFU Packet Characteristic. */
jksoft 1:48f6e08a3ac2 37 #define BLE_DFU_CTRL_PT_UUID 0x1531 /**< The UUID of the DFU Control Point. */
jksoft 1:48f6e08a3ac2 38 #define BLE_DFU_STATUS_REP_UUID 0x1533 /**< The UUID of the DFU Status Report Characteristic. */
jksoft 1:48f6e08a3ac2 39
jksoft 1:48f6e08a3ac2 40
jksoft 1:48f6e08a3ac2 41 /**@brief DFU Event type.
jksoft 1:48f6e08a3ac2 42 *
jksoft 1:48f6e08a3ac2 43 * @details This enumeration contains the types of events that will be received from the DFU Service.
jksoft 1:48f6e08a3ac2 44 */
jksoft 1:48f6e08a3ac2 45 typedef enum
jksoft 1:48f6e08a3ac2 46 {
jksoft 1:48f6e08a3ac2 47 BLE_DFU_START, /**< The event indicating that the peer wants the application to prepare for a new firmware update. */
jksoft 1:48f6e08a3ac2 48 BLE_DFU_RECEIVE_INIT_DATA, /**< The event indicating that the peer wants the application to prepare to receive init parameters. */
jksoft 1:48f6e08a3ac2 49 BLE_DFU_RECEIVE_APP_DATA, /**< The event indicating that the peer wants the application to prepare to receive the new firmware image. */
jksoft 1:48f6e08a3ac2 50 BLE_DFU_VALIDATE, /**< The event indicating that the peer wants the application to validate the newly received firmware image. */
jksoft 1:48f6e08a3ac2 51 BLE_DFU_ACTIVATE_N_RESET, /**< The event indicating that the peer wants the application to undergo activate new firmware and restart with new valid application */
jksoft 1:48f6e08a3ac2 52 BLE_DFU_SYS_RESET, /**< The event indicating that the peer wants the application to undergo a reset and start the currently valid application image.*/
jksoft 1:48f6e08a3ac2 53 BLE_DFU_PKT_RCPT_NOTIF_ENABLED, /**< The event indicating that the peer has enabled packet receipt notifications. It is the responsibility of the application to call @ref ble_dfu_pkts_rcpt_notify each time the number of packets indicated by num_of_pkts field in @ref ble_dfu_evt_t is received.*/
jksoft 1:48f6e08a3ac2 54 BLE_DFU_PKT_RCPT_NOTIF_DISABLED, /**< The event indicating that the peer has disabled the packet receipt notifications.*/
jksoft 1:48f6e08a3ac2 55 BLE_DFU_PACKET_WRITE, /**< The event indicating that the peer has written a value to the 'DFU Packet' characteristic. The data received from the peer will be present in the @ref ble_dfu_pkt_write element contained within @ref ble_dfu_evt_t.*/
jksoft 1:48f6e08a3ac2 56 BLE_DFU_BYTES_RECEIVED_SEND /**< The event indicating that the peer is requesting for the number of bytes of firmware data last received by the application. It is the responsibility of the application to call @ref ble_dfu_pkts_rcpt_notify in response to this event. */
jksoft 1:48f6e08a3ac2 57 } ble_dfu_evt_type_t;
jksoft 1:48f6e08a3ac2 58
jksoft 1:48f6e08a3ac2 59 /**@brief DFU Procedure type.
jksoft 1:48f6e08a3ac2 60 *
jksoft 1:48f6e08a3ac2 61 * @details This enumeration contains the types of DFU procedures.
jksoft 1:48f6e08a3ac2 62 */
jksoft 1:48f6e08a3ac2 63 typedef enum
jksoft 1:48f6e08a3ac2 64 {
jksoft 1:48f6e08a3ac2 65 BLE_DFU_START_PROCEDURE = 1, /**< DFU Start procedure.*/
jksoft 1:48f6e08a3ac2 66 BLE_DFU_INIT_PROCEDURE = 2, /**< DFU Initialization procedure.*/
jksoft 1:48f6e08a3ac2 67 BLE_DFU_RECEIVE_APP_PROCEDURE = 3, /**< Firmware receiving procedure.*/
jksoft 1:48f6e08a3ac2 68 BLE_DFU_VALIDATE_PROCEDURE = 4, /**< Firmware image validation procedure .*/
jksoft 1:48f6e08a3ac2 69 BLE_DFU_PKT_RCPT_REQ_PROCEDURE = 8 /**< Packet receipt notification request procedure. */
jksoft 1:48f6e08a3ac2 70 } ble_dfu_procedure_t;
jksoft 1:48f6e08a3ac2 71
jksoft 1:48f6e08a3ac2 72 /**@brief DFU Response value type.
jksoft 1:48f6e08a3ac2 73 */
jksoft 1:48f6e08a3ac2 74 typedef enum
jksoft 1:48f6e08a3ac2 75 {
jksoft 1:48f6e08a3ac2 76 BLE_DFU_RESP_VAL_SUCCESS = 1, /**< Success.*/
jksoft 1:48f6e08a3ac2 77 BLE_DFU_RESP_VAL_INVALID_STATE, /**< Invalid state.*/
jksoft 1:48f6e08a3ac2 78 BLE_DFU_RESP_VAL_NOT_SUPPORTED, /**< Operation not supported.*/
jksoft 1:48f6e08a3ac2 79 BLE_DFU_RESP_VAL_DATA_SIZE, /**< Data size exceeds limit.*/
jksoft 1:48f6e08a3ac2 80 BLE_DFU_RESP_VAL_CRC_ERROR, /**< CRC Error.*/
jksoft 1:48f6e08a3ac2 81 BLE_DFU_RESP_VAL_OPER_FAILED /**< Operation failed.*/
jksoft 1:48f6e08a3ac2 82 } ble_dfu_resp_val_t;
jksoft 1:48f6e08a3ac2 83
jksoft 1:48f6e08a3ac2 84 /**@brief DFU Packet structure.
jksoft 1:48f6e08a3ac2 85 *
jksoft 1:48f6e08a3ac2 86 * @details This structure contains the value of the DFU Packet characteristic as written by the
jksoft 1:48f6e08a3ac2 87 * peer and the length of the value written. It will be filled by the DFU Service when the
jksoft 1:48f6e08a3ac2 88 * peer writes to the DFU Packet characteristic.
jksoft 1:48f6e08a3ac2 89 */
jksoft 1:48f6e08a3ac2 90 typedef struct
jksoft 1:48f6e08a3ac2 91 {
jksoft 1:48f6e08a3ac2 92 uint8_t len; /**< Length of the packet received. */
jksoft 1:48f6e08a3ac2 93 uint8_t * p_data; /**< Pointer to the received packet. This will point to a word aligned memory location.*/
jksoft 1:48f6e08a3ac2 94 } ble_dfu_pkt_write_t;
jksoft 1:48f6e08a3ac2 95
jksoft 1:48f6e08a3ac2 96 /**@brief Packet receipt notification request structure.
jksoft 1:48f6e08a3ac2 97 *
jksoft 1:48f6e08a3ac2 98 * @details This structure contains the contents of the packet receipt notification request
jksoft 1:48f6e08a3ac2 99 * sent by the DFU Controller.
jksoft 1:48f6e08a3ac2 100 */
jksoft 1:48f6e08a3ac2 101 typedef struct
jksoft 1:48f6e08a3ac2 102 {
jksoft 1:48f6e08a3ac2 103 uint16_t num_of_pkts; /**< The number of packets of firmware data to be received by application before sending the next Packet Receipt Notification to the peer. */
jksoft 1:48f6e08a3ac2 104 } ble_pkt_rcpt_notif_req_t;
jksoft 1:48f6e08a3ac2 105
jksoft 1:48f6e08a3ac2 106 /**@brief DFU Event structure.
jksoft 1:48f6e08a3ac2 107 *
jksoft 1:48f6e08a3ac2 108 * @details This structure contains the event generated by the DFU Service based on the data
jksoft 1:48f6e08a3ac2 109 * received from the peer.
jksoft 1:48f6e08a3ac2 110 */
jksoft 1:48f6e08a3ac2 111 typedef struct
jksoft 1:48f6e08a3ac2 112 {
jksoft 1:48f6e08a3ac2 113 ble_dfu_evt_type_t ble_dfu_evt_type; /**< Type of the event.*/
jksoft 1:48f6e08a3ac2 114 union
jksoft 1:48f6e08a3ac2 115 {
jksoft 1:48f6e08a3ac2 116 ble_dfu_pkt_write_t ble_dfu_pkt_write; /**< The DFU packet received. This field is when the @ref ble_dfu_evt_type field is set to @ref BLE_DFU_PACKET_WRITE.*/
jksoft 1:48f6e08a3ac2 117 ble_pkt_rcpt_notif_req_t pkt_rcpt_notif_req; /**< Packet receipt notification request. This field is when the @ref ble_dfu_evt_type field is set to @ref BLE_DFU_PKT_RCPT_NOTIF_ENABLED.*/
jksoft 1:48f6e08a3ac2 118 } evt;
jksoft 1:48f6e08a3ac2 119 } ble_dfu_evt_t;
jksoft 1:48f6e08a3ac2 120
jksoft 1:48f6e08a3ac2 121 // Forward declaration of the ble_dfu_t type.
jksoft 1:48f6e08a3ac2 122 typedef struct ble_dfu_s ble_dfu_t;
jksoft 1:48f6e08a3ac2 123
jksoft 1:48f6e08a3ac2 124 /**@brief DFU Service event handler type. */
jksoft 1:48f6e08a3ac2 125 typedef void (*ble_dfu_evt_handler_t) (ble_dfu_t * p_dfu, ble_dfu_evt_t * p_evt);
jksoft 1:48f6e08a3ac2 126
jksoft 1:48f6e08a3ac2 127 /**@brief DFU service structure.
jksoft 1:48f6e08a3ac2 128 *
jksoft 1:48f6e08a3ac2 129 * @details This structure contains status information related to the service.
jksoft 1:48f6e08a3ac2 130 */
jksoft 1:48f6e08a3ac2 131 typedef struct ble_dfu_s
jksoft 1:48f6e08a3ac2 132 {
jksoft 1:48f6e08a3ac2 133 uint16_t conn_handle; /**< Handle of the current connection (as provided by the S110 SoftDevice). This will be BLE_CONN_HANDLE_INVALID when not in a connection. */
jksoft 1:48f6e08a3ac2 134 uint16_t service_handle; /**< Handle of DFU Service (as provided by the S110 SoftDevice). */
jksoft 1:48f6e08a3ac2 135 uint8_t uuid_type; /**< UUID type assigned for DFU Service by the S110 SoftDevice. */
jksoft 1:48f6e08a3ac2 136 ble_gatts_char_handles_t dfu_pkt_handles; /**< Handles related to the DFU Packet characteristic. */
jksoft 1:48f6e08a3ac2 137 ble_gatts_char_handles_t dfu_ctrl_pt_handles; /**< Handles related to the DFU Control Point characteristic. */
jksoft 1:48f6e08a3ac2 138 ble_gatts_char_handles_t dfu_status_rep_handles; /**< Handles related to the DFU Status Report characteristic. */
jksoft 1:48f6e08a3ac2 139 ble_dfu_evt_handler_t evt_handler; /**< The event handler to be called when an event is to be sent to the application.*/
jksoft 1:48f6e08a3ac2 140 ble_srv_error_handler_t error_handler; /**< Function to be called in case of an error. */
jksoft 1:48f6e08a3ac2 141 } ble_dfu_t;
jksoft 1:48f6e08a3ac2 142
jksoft 1:48f6e08a3ac2 143 /**@brief DFU service initialization structure.
jksoft 1:48f6e08a3ac2 144 *
jksoft 1:48f6e08a3ac2 145 * @details This structure contains the initialization information for the DFU Service. The
jksoft 1:48f6e08a3ac2 146 * application needs to fill this structure and pass it to the DFU Service using the
jksoft 1:48f6e08a3ac2 147 * @ref ble_dfu_init function.
jksoft 1:48f6e08a3ac2 148 */
jksoft 1:48f6e08a3ac2 149 typedef struct
jksoft 1:48f6e08a3ac2 150 {
jksoft 1:48f6e08a3ac2 151 ble_dfu_evt_handler_t evt_handler; /**< Event handler to be called for handling events in the Device Firmware Update Service. */
jksoft 1:48f6e08a3ac2 152 ble_srv_error_handler_t error_handler; /**< Function to be called in case of an error. */
jksoft 1:48f6e08a3ac2 153 } ble_dfu_init_t;
jksoft 1:48f6e08a3ac2 154
jksoft 1:48f6e08a3ac2 155 /**@brief Function for handling a BLE event.
jksoft 1:48f6e08a3ac2 156 *
jksoft 1:48f6e08a3ac2 157 * @details The DFU service expects the application to call this function each time an event
jksoft 1:48f6e08a3ac2 158 * is received from the S110 SoftDevice. This function processes the event, if it is
jksoft 1:48f6e08a3ac2 159 * relevant for the DFU service and calls the DFU event handler of the application if
jksoft 1:48f6e08a3ac2 160 * necessary.
jksoft 1:48f6e08a3ac2 161 *
jksoft 1:48f6e08a3ac2 162 * @param[in] p_dfu Pointer to the DFU service structure.
jksoft 1:48f6e08a3ac2 163 * @param[in] p_ble_evt Pointer to the event received from S110 SoftDevice.
jksoft 1:48f6e08a3ac2 164 */
jksoft 1:48f6e08a3ac2 165 void ble_dfu_on_ble_evt(ble_dfu_t * p_dfu, ble_evt_t * p_ble_evt);
jksoft 1:48f6e08a3ac2 166
jksoft 1:48f6e08a3ac2 167 /**@brief Function for initializing the DFU service.
jksoft 1:48f6e08a3ac2 168 *
jksoft 1:48f6e08a3ac2 169 * @param[out] p_dfu Device Firmware Update service structure. This structure will have to be
jksoft 1:48f6e08a3ac2 170 * supplied by the application. It will be initialized by this function,
jksoft 1:48f6e08a3ac2 171 * and will later be used to identify the service instance.
jksoft 1:48f6e08a3ac2 172 * @param[in] p_dfu_init Information needed to initialize the service.
jksoft 1:48f6e08a3ac2 173 *
jksoft 1:48f6e08a3ac2 174 * @return NRF_SUCCESS if the DFU service and its characteristics were successfully added to the
jksoft 1:48f6e08a3ac2 175 * S110 SoftDevice. Otherwise an error code.
jksoft 1:48f6e08a3ac2 176 * This function returns NRF_ERROR_NULL if the value of evt_handler in p_dfu_init
jksoft 1:48f6e08a3ac2 177 * structure provided is NULL or if the pointers supplied as input are NULL.
jksoft 1:48f6e08a3ac2 178 */
jksoft 1:48f6e08a3ac2 179 uint32_t ble_dfu_init(ble_dfu_t * p_dfu, ble_dfu_init_t * p_dfu_init);
jksoft 1:48f6e08a3ac2 180
jksoft 1:48f6e08a3ac2 181 /**@brief Function for sending response to a control point command.
jksoft 1:48f6e08a3ac2 182 *
jksoft 1:48f6e08a3ac2 183 * @details This function will encode a DFU Control Point response using the given input
jksoft 1:48f6e08a3ac2 184 * parameters and will send a notification of the same to the peer.
jksoft 1:48f6e08a3ac2 185 *
jksoft 1:48f6e08a3ac2 186 * @param[in] p_dfu Pointer to the DFU service structure.
jksoft 1:48f6e08a3ac2 187 * @param[in] dfu_proc Procedure for which this response is to be sent.
jksoft 1:48f6e08a3ac2 188 * @param[in] resp_val Response value.
jksoft 1:48f6e08a3ac2 189 *
jksoft 1:48f6e08a3ac2 190 * @return NRF_SUCCESS if the DFU Service has successfully requested the S110 SoftDevice to
jksoft 1:48f6e08a3ac2 191 * send the notification. Otherwise an error code.
jksoft 1:48f6e08a3ac2 192 * This function returns NRF_ERROR_INVALID_STATE if the device is not connected to a
jksoft 1:48f6e08a3ac2 193 * peer or if the DFU service is not initialized or if the notification of the DFU
jksoft 1:48f6e08a3ac2 194 * Status Report characteristic was not enabled by the peer. It returns NRF_ERROR_NULL
jksoft 1:48f6e08a3ac2 195 * if the pointer p_dfu is NULL.
jksoft 1:48f6e08a3ac2 196 */
jksoft 1:48f6e08a3ac2 197 uint32_t ble_dfu_response_send(ble_dfu_t * p_dfu,
jksoft 1:48f6e08a3ac2 198 ble_dfu_procedure_t dfu_proc,
jksoft 1:48f6e08a3ac2 199 ble_dfu_resp_val_t resp_val);
jksoft 1:48f6e08a3ac2 200
jksoft 1:48f6e08a3ac2 201 /**@brief Function for notifying the peer about the number of bytes of firmware data received.
jksoft 1:48f6e08a3ac2 202 *
jksoft 1:48f6e08a3ac2 203 * @param[in] p_dfu Pointer to the DFU service structure.
jksoft 1:48f6e08a3ac2 204 * @param[in] num_of_firmware_bytes_rcvd Number of bytes.
jksoft 1:48f6e08a3ac2 205 *
jksoft 1:48f6e08a3ac2 206 * @return NRF_SUCCESS if the DFU Service has successfully requested the S110 SoftDevice to send
jksoft 1:48f6e08a3ac2 207 * the notification. Otherwise an error code.
jksoft 1:48f6e08a3ac2 208 * This function returns NRF_ERROR_INVALID_STATE if the device is not connected to a
jksoft 1:48f6e08a3ac2 209 * peer or if the DFU service is not initialized or if the notification of the DFU
jksoft 1:48f6e08a3ac2 210 * Status Report characteristic was not enabled by the peer. It returns NRF_ERROR_NULL
jksoft 1:48f6e08a3ac2 211 * if the pointer p_dfu is NULL.
jksoft 1:48f6e08a3ac2 212 */
jksoft 1:48f6e08a3ac2 213 uint32_t ble_dfu_bytes_rcvd_report(ble_dfu_t * p_dfu, uint32_t num_of_firmware_bytes_rcvd);
jksoft 1:48f6e08a3ac2 214
jksoft 1:48f6e08a3ac2 215 /**@brief Function for sending Packet Receipt Notification to the peer.
jksoft 1:48f6e08a3ac2 216 *
jksoft 1:48f6e08a3ac2 217 * This function will encode the number of bytes received as input parameter into a
jksoft 1:48f6e08a3ac2 218 * notification of the control point characteristic and send it to the peer.
jksoft 1:48f6e08a3ac2 219 *
jksoft 1:48f6e08a3ac2 220 * @param[in] p_dfu Pointer to the DFU service structure.
jksoft 1:48f6e08a3ac2 221 * @param[in] num_of_firmware_bytes_rcvd Number of bytes of firmware image received.
jksoft 1:48f6e08a3ac2 222 *
jksoft 1:48f6e08a3ac2 223 * @return NRF_SUCCESS if the DFU Service has successfully requested the S110 SoftDevice to send
jksoft 1:48f6e08a3ac2 224 * the notification. Otherwise an error code.
jksoft 1:48f6e08a3ac2 225 * This function returns NRF_ERROR_INVALID_STATE if the device is not connected to a
jksoft 1:48f6e08a3ac2 226 * peer or if the DFU service is not initialized or if the notification of the DFU
jksoft 1:48f6e08a3ac2 227 * Status Report characteristic was not enabled by the peer. It returns NRF_ERROR_NULL
jksoft 1:48f6e08a3ac2 228 * if the pointer p_dfu is NULL.
jksoft 1:48f6e08a3ac2 229 */
jksoft 1:48f6e08a3ac2 230 uint32_t ble_dfu_pkts_rcpt_notify(ble_dfu_t * p_dfu, uint32_t num_of_firmware_bytes_rcvd);
jksoft 1:48f6e08a3ac2 231
jksoft 1:48f6e08a3ac2 232 #endif // BLE_DFU_H__
jksoft 1:48f6e08a3ac2 233
jksoft 1:48f6e08a3ac2 234 /** @} */