/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/net/buf.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/mesh.h>
#include <zephyr/types.h>

#include "net.h"
#include "sar_cfg_internal.h"

void bt_mesh_sar_tx_encode(struct net_buf_simple *buf,
			   const struct bt_mesh_sar_tx *tx)
{
	net_buf_simple_add_u8(buf, (tx->seg_int_step & 0xf) |
					   (tx->unicast_retrans_count << 4));
	net_buf_simple_add_u8(buf, (tx->unicast_retrans_without_prog_count &
				    0xf) | (tx->unicast_retrans_int_step << 4));
	net_buf_simple_add_u8(buf, (tx->unicast_retrans_int_inc & 0xf) |
					   (tx->multicast_retrans_count << 4));
	net_buf_simple_add_u8(buf, tx->multicast_retrans_int & 0xf);
}

void bt_mesh_sar_rx_encode(struct net_buf_simple *buf,
			   const struct bt_mesh_sar_rx *rx)
{
	net_buf_simple_add_u8(buf, (rx->seg_thresh & 0x1f) |
					   (rx->ack_delay_inc << 5));
	net_buf_simple_add_u8(buf, (rx->discard_timeout & 0xf) |
					   ((rx->rx_seg_int_step & 0xf) << 4));
	net_buf_simple_add_u8(buf, (rx->ack_retrans_count & 0x3));
}

void bt_mesh_sar_tx_decode(struct net_buf_simple *buf,
			   struct bt_mesh_sar_tx *tx)
{
	uint8_t val;

	val = net_buf_simple_pull_u8(buf);
	tx->seg_int_step = (val & 0xf);
	tx->unicast_retrans_count = (val >> 4);
	val = net_buf_simple_pull_u8(buf);
	tx->unicast_retrans_without_prog_count = (val & 0xf);
	tx->unicast_retrans_int_step = (val >> 4);
	val = net_buf_simple_pull_u8(buf);
	tx->unicast_retrans_int_inc = (val & 0xf);
	tx->multicast_retrans_count = (val >> 4);
	val = net_buf_simple_pull_u8(buf);
	tx->multicast_retrans_int = (val & 0xf);
}

void bt_mesh_sar_rx_decode(struct net_buf_simple *buf,
			   struct bt_mesh_sar_rx *rx)
{
	uint8_t val;

	val = net_buf_simple_pull_u8(buf);
	rx->seg_thresh = (val & 0x1f);
	rx->ack_delay_inc = (val >> 5);
	val = net_buf_simple_pull_u8(buf);
	rx->discard_timeout = (val & 0xf);
	rx->rx_seg_int_step = (val >> 4);
	val = net_buf_simple_pull_u8(buf);
	rx->ack_retrans_count = (val & 0x3);
}
