/*
 * Copyright (c) 2018 Oticon A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#ifndef _BSTESTS_ENTRY_H
#define _BSTESTS_ENTRY_H

#include "bs_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * TEST HOOKS:
 *
 * You may register some of these functions in your testbench
 *
 * Note that you can overwrite this function pointers on the fly
 */
/*
 * Will be called with the command line arguments for the testcase.
 * This is BEFORE any SW has run, and before the HW has been initialized
 */
typedef void (*bst_test_args_t)(int, char**);
/* It will be called (in the HW models thread) before the CPU is booted */
typedef void (*bst_test_pre_init_t)(void);
/*
 * It will be called (in the HW models thread) when the CPU goes to sleep
 * for the first time
 */
typedef void (*bst_test_post_init_t)(void);
/* It will be called (in the HW models thread) each time the bst_timer ticks */
typedef void (*bst_test_tick_t)(bs_time_t time);
/*
 * It will be called (in the HW models thread) when the execution is being
 * terminated (clean up memory and close your files here)
 */
typedef void (*bst_test_delete_t)(void);
/*
 * It will be called (in SW context) when a HW interrupt is raised.
 * If it returns true, the normal interrupt handler will NOT be called and
 *  Zephyr will only see a spurious wake
 * Note: Use this only to perform special tasks, like sniffing interrupts,
 * or any other interrupt related cheat, but not as a normal interrupt handler
 */
typedef bool (*bst_test_irq_sniffer_t)(int irq_number);
/*
 * This function will be called (in SW context) as a Zephyr PRE_KERNEL_1
 * device driver initialization function
 * Note that the app's main() has not executed yet, and the kernel is not yet
 * fully ready => You canNOT spawn new threads without wait time yet (or it
 * will crash)
 */
typedef void (*bst_test_fake_ddriver_prekernel_t)(void);
/*
 * This function will be called (in SW context) as a Zephyr POST_KERNEL
 * device driver initialization function
 * You may spawn any test threads you may need here.
 * Note that the app main() has not executed yet.
 */
typedef void (*bst_test_fake_ddriver_postkernel_t)(void);
/*
 * This function will be called (in SW context) as the Zephyr application main
 */
typedef void (*bst_test_main_t)(void);

struct bst_test_instance {
	char *test_id;
	char *test_descr;
	bst_test_args_t                    test_args_f;
	bst_test_pre_init_t                test_pre_init_f;
	bst_test_post_init_t               test_post_init_f;
	bst_test_tick_t                    test_tick_f;
	bst_test_delete_t                  test_delete_f;
	bst_test_irq_sniffer_t             test_irq_sniffer_f;
	bst_test_fake_ddriver_prekernel_t  test_fake_ddriver_prekernel_f;
	bst_test_fake_ddriver_postkernel_t test_fake_ddriver_postkernel_f;
	bst_test_main_t                    test_main_f;
};

#define BSTEST_END_MARKER \
{NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}

struct bst_test_list {
	struct bst_test_instance  *test_instance;
	struct bst_test_list    *next;
};

typedef struct bst_test_list *(*bst_test_install_t)(struct bst_test_list
							*test_tail);

struct bst_test_list *bst_add_tests(struct bst_test_list *tests,
				    const struct bst_test_instance *test_def);
void bst_set_testapp_mode(char *test_id);
void bst_pass_args(int argc, char **argv);
void bst_pre_init(void);
void bst_post_init(void);
void bst_main(void);
void bst_tick(bs_time_t Absolute_device_time);
bool bst_irq_sniffer(int irq_number);
uint8_t bst_delete(void);

/* These return codes need to fit in a uint8_t (0..255), where 0 = successful */
enum bst_result_t {Passed = 0, In_progress = 1, Failed = 2};

void bst_print_testslist(void);

/**
 * Interface for the fake HW device (timer) dedicated to the tests
 */
void bst_ticker_set_period(bs_time_t tick_period);
void bst_ticker_set_next_tick_absolute(bs_time_t absolute_time);
void bst_ticker_set_next_tick_delta(bs_time_t absolute_time);
void bst_awake_cpu_asap(void);

#ifdef __cplusplus
}
#endif

#endif
