#pragma once
#include <egAPI.h>			// RT-edge system API

/*****************************************************************************
*
* FILE NAME:		edgeCommon.h
*
* DESCRIPTION:		サービス共通定義・関数　ヘッダファイル
*
* [TODO]:			必要に応じて各種定義/関数の追加・削除・変更を行ってください   
*                   SERVICENAME は必ず変更してください
*
\*****************************************************************************/
//////////////////////////////////////////////////////////////////////////////
/// 各種定義追加
///

/// <summary>
/// サービス名
/// </summary>
#define	SERVICENAME			"IoSmpl"						// 固定プロセス名称

/// <summary>
/// サービスインジケータ名
/// </summary>
extern char	IND_MYSERV_STATUS	[EG_MAX_TAGNAME + 1];		// サービス起動
#define		SERVICE_UP		1								// 起動中
#define		SERVICE_DOWN	0								// 停止中
extern char	IND_MYSERV_ERROR	[EG_MAX_TAGNAME + 1];		// サービスエラー発生中
extern char	IND_MYSERV_RUN		[EG_MAX_TAGNAME + 1];		// サービス実行中
extern char	ND_MYSERV_LIVE		[EG_MAX_TAGNAME + 1];		// サービス実行カウンタ

/// <summary>
/// サービスプロパティタグ名
/// </summary>
extern char PROP_MYSERV_MODE	[EG_MAX_TAGNAME + 1];		// サービス動作モード
#define		MODE_AUTO		1								// 入出自動サイクル
#define		MODE_SEMIAUTO	2								// 入力サイクル＋出力デマンド
#define		MODE_MANUAL		3								// 入出力デマンド
#define		DEFAULT_MODE		MODE_SEMIAUTO
extern char PROP_MYSERV_CYCLE	[EG_MAX_TAGNAME + 1];		// サービス動作サイクル(ms)
#define		DEFAULT_CYCLE		1
extern char PROP_MYSERV_INPRIO	[EG_MAX_TAGNAME + 1];		// Edgeシステムへの入力サービススレッドプライオリティ
#define		DEFAULT_INPRIO		148
extern char PROP_MYSERV_OUTPRIO	[EG_MAX_TAGNAME + 1];		// Edgeシステムからの出力サービススレッドプライオリティ	
#define		DEFAULT_OUTPRIO		149

/// <summary>
/// サービス提供タグ名
/// </summary>
//[TODO] : 任意のタグ追加 (XMLで定義することを推奨)
//#define TAG_MYSERV_XXX 追加が必要の場合ここに記載

/// <summary>
/// サービス固有メッセージ
/// </summary>
//[TODO] : 任意のメッセージID追加 
//       ユーザメッセージ(20000〜29999)
#define	EM_SERVICE_IO_MODE_1			EG_MSG_USER + 0			// 任意の値設定
#define	EM_SERVICE_IO_MODE_2			EG_MSG_USER + 1			// 任意の値設定
#define	EM_SERVICE_IO_MODE_3			EG_MSG_USER + 2			// 任意の値設定
//
/// <summary>
/// サービス内部状態
/// </summary>
typedef struct MYSTATE
{
	bool		State;			// インジケータ.エッジシステム接続状態
	bool		Run;			// インジケータ.サービス実行状態
	bool		Error;			// インジケータ.サービス異常状態
	uint32_t	Live;			// インジケータ.サービス実行カウンタ
	uint64_t	StartTime;		// インジケータ.サービス開始時のタイムスタンプ
	uint8_t		Mode;			// プロパティ.サービス実行モード
	uint32_t	Cycle;			// プロパティ.サービス実行サイクル(ms)	[TODO] : 必要に応じて実装
	uint8_t		InPriority;		// プロパティ.サービス(入力)プライオリティ	[TODO] : 必要に応じて実装
	uint8_t		OutPriority;	// プロパティ.サービス(出力)プライオリティ	[TODO] : 必要に応じて実装
	RTHANDLE	hInTrigSem;		// 入力サービストリガセマフォハンドル	[TODO] : 必要に応じて実装
	RTHANDLE	hOutTrigSem;	// 出力サービストリガセマフォハンドル	[TODO] : 必要に応じて実装
	//[TODO] : 任意のステータス追加
	uint8_t		SmplIoMode;		// サンプル用波形出力モード 0:ノーマル, 1:倍速モード, 2:3倍速モード
} EgState;

EgState MyState;				// グローバル変数として登録
/// <summary>
/// サービス内部関数 //[TODO] : 必要に応じて実装
/// </summary>
extern void ThreadAutoCycle(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern void ThreadInService(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern void ThreadOutService(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern void KickInput(struct MYSTATE *state); 			//[TODO]: 必要に応じて実装
extern void KickOutput(struct MYSTATE *state); 			//[TODO]: 必要に応じて実装
extern int32_t CreateServiceTags(struct MYSTATE *state);//[TODO]: 必要に応じて実装
extern int32_t UpdateIndicator(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern int32_t GetProperty(struct MYSTATE *state); 		//[TODO]: 必要に応じて実装
extern int32_t StartService(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern int32_t PauseService(struct MYSTATE *state); 	//[TODO]: 必要に応じて実装
extern int32_t InitService(struct MYSTATE *state); 		//[TODO]: 必要に応じて実装
extern int32_t KillService(struct MYSTATE *state); 		//[TODO]: 必要に応じて実装
extern void WarningMsg(int32_t position, int32_t reason);
#define WARN(reason)	WarningMsg(__LINE__,(reason))

///
/// 各種定義終了
//////////////////////////////////////////////////////////////////////////////

