/* mailbox_b.c */

/*
 * Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "master.h"

#ifdef MAILBOX_BENCH

static struct k_mbox_msg message;

#ifdef FLOAT
#define PRINT_HEADER()                                                       \
	(PRINT_STRING                                         \
	   ("|   size(B) |       time/packet (usec)       |          MB/sec" \
	    "                |\n", output_file))
#define PRINT_ONE_RESULT()                                                   \
	PRINT_F(output_file, "|%11u|%32.3f|%32f|\n", putsize, puttime / 1000.0,\
	     (1000.0 * putsize) / SAFE_DIVISOR(puttime))

#define PRINT_OVERHEAD()                                                     \
	PRINT_F(output_file,						\
	     "| message overhead:  %10.3f     usec/packet                   "\
	     "            |\n", empty_msg_put_time / 1000.0)

#define PRINT_XFER_RATE()                                                     \
	double netto_transfer_rate;                                           \
	netto_transfer_rate = 1000.0 * \
		(putsize >> 1) / SAFE_DIVISOR(puttime - empty_msg_put_time);  \
	PRINT_F(output_file,						\
	     "| raw transfer rate:     %10.3f MB/sec (without"		\
	     " overhead)                 |\n", netto_transfer_rate)

#else
#define PRINT_HEADER()                                                       \
	(PRINT_STRING                                                         \
	   ("|   size(B) |       time/packet (nsec)       |          KB/sec" \
	    "                |\n", output_file))

#define PRINT_ONE_RESULT()                                                   \
	PRINT_F(output_file, "|%11u|%32u|%32u|\n", putsize, puttime,	     \
	     (uint32_t)(((uint64_t)putsize * 1000000U) / SAFE_DIVISOR(puttime)))

#define PRINT_OVERHEAD()                                                     \
	PRINT_F(output_file,						\
	     "| message overhead:  %10u     nsec/packet                     "\
	     "          |\n", empty_msg_put_time)

#define PRINT_XFER_RATE()                                                    \
	PRINT_F(output_file, "| raw transfer rate:     %10u KB/sec (without" \
	     " overhead)                 |\n",                               \
	     (uint32_t)((uint64_t)(putsize >> 1) * 1000000U                   \
	     / SAFE_DIVISOR(puttime - empty_msg_put_time)))

#endif


/*
 * Function prototypes.
 */
void mailbox_put(uint32_t size, int count, uint32_t *time);

/*
 * Function declarations.
 */

/**
 *
 * @brief Mailbox transfer speed test
 *
 */
void mailbox_test(void)
{
	uint32_t putsize;
	uint32_t puttime;
	int putcount;
	unsigned int empty_msg_put_time;
	struct getinfo getinfo;

	PRINT_STRING(dashline, output_file);
	PRINT_STRING("|                "
				 "M A I L B O X   M E A S U R E M E N T S"
				 "                      |\n", output_file);
	PRINT_STRING(dashline, output_file);
	PRINT_STRING("| Send mailbox message to waiting high "
		 "priority task and wait                 |\n", output_file);
	PRINT_F(output_file, "| repeat for %4d times and take the "
			"average                                  |\n",
			NR_OF_MBOX_RUNS);
	PRINT_STRING(dashline, output_file);
	PRINT_HEADER();
	PRINT_STRING(dashline, output_file);
	k_sem_reset(&SEM0);
	k_sem_give(&STARTRCV);

	putcount = NR_OF_MBOX_RUNS;

	putsize = 0U;
	mailbox_put(putsize, putcount, &puttime);
	/* waiting for ack */
	k_msgq_get(&MB_COMM, &getinfo, K_FOREVER);
	PRINT_ONE_RESULT();
	empty_msg_put_time = puttime;
	for (putsize = 8U; putsize <= MESSAGE_SIZE; putsize <<= 1) {
		mailbox_put(putsize, putcount, &puttime);
		/* waiting for ack */
		k_msgq_get(&MB_COMM, &getinfo, K_FOREVER);
		PRINT_ONE_RESULT();
	}
	PRINT_STRING(dashline, output_file);
	PRINT_OVERHEAD();
	PRINT_XFER_RATE();
}


/**
 *
 * @brief Write the number of data chunks into the mailbox
 *
 * @param size    The size of the data chunk.
 * @param count   Number of data chunks.
 * @param time    The total time.
 *
 */
void mailbox_put(uint32_t size, int count, uint32_t *time)
{
	int i;
	unsigned int t;

	message.rx_source_thread = K_ANY;
	message.tx_target_thread = K_ANY;

	/* first sync with the receiver */
	k_sem_give(&SEM0);
	t = BENCH_START();
	for (i = 0; i < count; i++) {
		k_mbox_put(&MAILB1, &message, K_FOREVER);
	}
	t = TIME_STAMP_DELTA_GET(t);
	*time = SYS_CLOCK_HW_CYCLES_TO_NS_AVG(t, count);
	check_result();
}

#endif /* MAILBOX_BENCH */
