static int gap_event()

in apps/mesh_badge/src/main.c [180:273]


static int gap_event(struct ble_gap_event *event, void *arg)
{
	struct ble_gap_conn_desc desc;
	int rc;

	switch (event->type) {
		case BLE_GAP_EVENT_CONNECT:
			/* A new connection was established or a connection attempt failed. */
			MODLOG_DFLT(INFO, "connection %s; status=%d ",
				    event->connect.status == 0 ? "established" : "failed",
				    event->connect.status);
			if (event->connect.status == 0) {
				rc = ble_gap_conn_find(event->connect.conn_handle, &desc);
				assert(rc == 0);
				print_conn_desc(&desc);
				connected(event->connect.conn_handle,
					  event->connect.status);
			}
			MODLOG_DFLT(INFO, "\n");

			if (event->connect.status != 0) {
				/* Connection failed; resume advertising. */
				advertise();
			}
			return 0;

		case BLE_GAP_EVENT_DISCONNECT:
			MODLOG_DFLT(INFO, "disconnect; reason=%d ", event->disconnect.reason);
			print_conn_desc(&event->disconnect.conn);
			MODLOG_DFLT(INFO, "\n");

			/* Connection terminated; resume advertising. */
			advertise();

			disconnected(event->disconnect.conn.conn_handle,
				     event->disconnect.reason);
			return 0;

		case BLE_GAP_EVENT_CONN_UPDATE:
			/* The central has updated the connection parameters. */
			MODLOG_DFLT(INFO, "connection updated; status=%d ",
				    event->conn_update.status);
			rc = ble_gap_conn_find(event->connect.conn_handle, &desc);
			assert(rc == 0);
			print_conn_desc(&desc);
			MODLOG_DFLT(INFO, "\n");
			return 0;

		case BLE_GAP_EVENT_ENC_CHANGE:
			/* Encryption has been enabled or disabled for this connection. */
			MODLOG_DFLT(INFO, "encryption change event; status=%d ",
				    event->enc_change.status);
			rc = ble_gap_conn_find(event->connect.conn_handle, &desc);
			assert(rc == 0);
			print_conn_desc(&desc);
			MODLOG_DFLT(INFO, "\n");

			if (desc.sec_state.bonded) {
				pairing_complete(event->enc_change.conn_handle, true);
			} else if(desc.sec_state.encrypted) {
				pairing_complete(event->enc_change.conn_handle, false);
			} else {
				pairing_failed(event->enc_change.conn_handle);
			}
			return 0;

		case BLE_GAP_EVENT_PASSKEY_ACTION:
			MODLOG_DFLT(INFO, "passkey action event; conn_handle=%d action=%d numcmp=%d\n",
				    event->passkey.conn_handle,
				    event->passkey.params.action,
				    event->passkey.params.numcmp);
			passkey_display(event->passkey.conn_handle);
			return 0;

		case BLE_GAP_EVENT_REPEAT_PAIRING:
			/* We already have a bond with the peer, but it is attempting to
			 * establish a new secure link.  This app sacrifices security for
			 * convenience: just throw away the old bond and accept the new link.
			 */

			/* Delete the old bond. */
			rc = ble_gap_conn_find(event->repeat_pairing.conn_handle, &desc);
			assert(rc == 0);
			ble_store_util_delete_peer(&desc.peer_id_addr);

			/* Return BLE_GAP_REPEAT_PAIRING_RETRY to indicate that the host should
			 * continue with the pairing operation.
			 */
			return BLE_GAP_REPEAT_PAIRING_RETRY;

	}

	return 0;
}