/*
 *  Copyright (C) 2006 by Nagoya University Extension Course for
 *                       Embedded Software Specialists(NEXCESS), JAPAN
 *                2014-2018 by Nagoya University
 *                        Graduate School of Information Science
 *                        Center for Embedded Computing Systems(NCES), JAPAN
 *                2014 by Mitsuhiro Matsuura
 */

/*
 *  Task Priority
 */

#define DEFAULT_PRIORITY  8
#define SWITCH_PRIORITY   DEFAULT_PRIORITY
#define TIMER_PRIORITY    (SWITCH_PRIORITY + 1)
#define BLINK_PRIORITY    (TIMER_PRIORITY + 1)

/*
 *  Constant Definition
 */

#define STACK_SIZE      4096    /* Task Stack Size */


#define LED1_BLINK_INTERVAL 1000    /* LED1 Blink Cycle */
#define LED4_BLINK_INTERVAL 250     /* LED4 Blink Cycle */
#define SW_SCAN_INTERVAL    10      /* SW Scan Cycle    */
#define BASE_TIME_INTERVAL  1000    /* Time Unit        */

#define INIT_TIME       30  /* Timeout Time at Startup     */
#define EXTRA_UNIT      30  /* Time Extension Unit         */
#define TIMEOUT_BLINK   60  /* Blink Time at Timeout       */
#define ACT_INTERVAL    10  /* Timer Active LED Interval   */
#define ACT_BLINK_TIME  4   /* Timer Active LED Blink Time */

/*
 *  Function Prototype Declaration
 */

#ifndef TOPPERS_MACRO_ONLY
/* 外部参照宣言 */
extern void led_init(intptr_t exinf);
extern void switch_slide_init(intptr_t exinf);
extern void switch_push_init(intptr_t exinf);
extern void timer_task(intptr_t exinf);
extern void blink_task(intptr_t exinf);
extern void cup_timer_init(intptr_t exinf);
extern void led1_blink_handler(intptr_t exinf);
extern void led4_blink_time_handler(intptr_t exinf);
extern void led4_blink_time_task(intptr_t exinf);
extern void sw_scan_handler(intptr_t exinf);
extern void sw_scan_task(intptr_t exinf);
extern void base_time_handler(intptr_t exinf);
extern void base_time_task(intptr_t exinf);
extern void timer_task_init(intptr_t exinf);
extern void blink_task_init(intptr_t exinf);

/* タスク間I/F定義  */
typedef struct {
	uint32_t event;				/* イベント番号 	*/
	char test[32];				/* テスト用:何かメッセージを送ってみる */
}T_EVENT;

/* 定数宣言 */
/* タイマタスクの状態定義 */
typedef enum {
	ST_TIMER_OFF = 0,   		/* タイマOFF状態	*/
	ST_TIMER_ON,        		/* タイマON状態		*/
	ST_TIMER_NUM				/* 状態の数 		*/
}ST_TIMER;

/* タイマタスクが「受信」するイベントの定義 	*/
typedef enum {
	EV_TIMER_SW1_OFF = 0,   	/* SW1 OFF			*/
	EV_TIMER_SW1_ON,        	/* SW1 ON			*/
	EV_TIMER_PUSH1_ON,      	/* PUSH1 ON			*/
	EV_TIMER_BASE_TIME,     	/* 1秒経過			*/
	EV_TIMER_NUM				/* イベントの数 	*/
}EV_TIMER;

/* タイマタスク制御情報 */
typedef struct {
	uint32_t		ctl_flg;	/* Control flag  	*/
	ST_TIMER		nowsts;		/* 現在の状態 		*/
	ST_TIMER 		nextsts;	/* 次の状態		 	*/
	int				timer;		/* タイムアウトまでの時間 */
	T_EVENT 		*prcv_data;	/* 受信データ		*/
}TTM_CTL;

extern TTM_CTL		gtm_ctl;

#define GTM_CTLF	gtm_ctl.ctl_flg	/* Control flag     		*/
#define GTM_NOWSTS	gtm_ctl.nowsts	/* Current status		    */
#define GTM_NEXTSTS	gtm_ctl.nextsts	/* Next status		    	*/
#define GTM_REMTM	gtm_ctl.timer   /* 残り時間 				*/
#define GTM_RCVAD	gtm_ctl.prcv_data/* 受信したメッセージのアドレス 	*/
#define GTM_RCVEV	(gtm_ctl.prcv_data -> event)/* 受信イベント			*/

/* タイマタスク制御フラグ */
#define DTM_STSCHG	0x00000001 		    /* 状態遷移有無(Y=1,N=0)	*/
#define DTM_NOTREL	0x00000002		    /* メモリプール解放禁止(Y=1,N=0)	*/

/* タイマタスクの関数ポインタの型宣言 */
typedef void (*CALLBACK_TM)( void ) ;

/* ブリンクタスクの状態定義 */
typedef enum {
	ST_BLINK_IDLE = 0,		/* 休止状態			*/
	ST_BLINK_LED_OFF,   	/* 点滅状態(消灯)	*/
	ST_BLINK_LED_ON,    	/* 点滅状態(点灯) 	*/
	ST_BLINK_NUM			/* 状態の数 		*/
}ST_BLINK;

/* ブリンクタスクが「受信」するイベントの定義 	*/
typedef enum {
	EV_BLINK_TIMEOUT = 0,   /* TIMEOUT通知 		*/
	EV_BLINK_ACTIVE,        /* ACTIVE通知		*/
	EV_BLINK_OFF,           /* OFF通知 			*/
	EV_BLINK_BLINK,         /* 0.25秒経過 		*/
	EV_BLINK_NUM			/* イベントの数 	*/
}EV_BLINK;

/* ブリンクタスク制御情報 */
typedef struct {
	uint32_t		ctl_flg;	/* Control flag  	*/
	ST_BLINK		nowsts;		/* 現在の状態 		*/
	ST_BLINK 		nextsts;	/* 次の状態		 	*/
	int				bcount;		/* 点滅回数 		*/
	T_EVENT 		*prcv_data;	/* 受信データ		*/
}TBL_CTL;

extern TBL_CTL		gbl_ctl;

#define GBL_CTLF	gbl_ctl.ctl_flg	/* Control flag     		*/
#define GBL_NOWSTS	gbl_ctl.nowsts	/* Current status		    */
#define GBL_NEXTSTS	gbl_ctl.nextsts	/* Next status		    	*/
#define GBL_BCOUNT	gbl_ctl.bcount  /* 点滅回数 				*/
#define GBL_RCVAD	gbl_ctl.prcv_data/* 受信したメッセージのアドレス 	*/
#define GBL_RCVEV	(gbl_ctl.prcv_data -> event)/* 受信イベント			*/

/* タイマタスク制御フラグ */
#define DBL_STSCHG	0x00000001 		    /* 状態遷移有無(Y=1,N=0)	*/

/* ブリンクタスクの関数ポインタの型宣言 */
typedef void (*CALLBACK_BL)( void ) ;

#endif /* TOPPERS_MACRO_ONLY */
