/*****************************************************************************
* egAPI.h
*
*   RT-edge system API header file
*
*     Copyright(C) 2020 Micronet Co. All Rights Reserved.
\*****************************************************************************/

#pragma once
#include <stdint.h>
#include <stdbool.h>
#include "edgeAPI_RTCD.h"
#ifdef __cplusplus
extern "C"
{
#endif

#ifdef  edge_API_EXPORTS
#define edge_API 
#else
#define edge_API __declspec(dllimport)
#endif

//------------------------------------------------------------------------------
// エラーコード
//------------------------------------------------------------------------------
#define EDGE_SUCCESS							0x00000000	// 正常終了
#define EDGE_LOCATION_ERROR						0x80000001	// ロケーションハンドル取得エラー
#define EDGE_KERNEL_NOT_RUNNING					0x80000002	// カーネルが起動していません
#define EDGE_ROOTPROCESS_ERROR					0x80000003	// ルートプロセス取得エラー
#define EDGE_PARAM_INVALID						0x80000004	// パラメータが不正です
#define EDGE_THREAD_ERROR						0x80000005	// スレッド開始エラー


// RTCD関連
#define EDGE_RTCD_NAME_INVALID					0x80000100	// RTCD名称が不正です
#define EDGE_RTCD_NAME_LENGTH_ERROR				0x80000101	// RTCD名称の文字数エラー
#define EDGE_RTCD_RECORD_LENGTH_ERROR			0x80000102	// レコード長エラー
#define EDGE_RTCD_RECORD_NUM_ERROR				0x80000103	// レコード数エラー
#define EDGE_RTCD_WRITE_MODE_ERROR				0x80000105	// 書込みモードエラー
#define EDGE_RTCD_EXIST_ERROR					0x80000106	// 既に同じRTCDが存在します
#define EDGE_RTCD_NOT_EXIST_ERROR				0x80000107	// RTCDが存在しません
#define EDGE_RTCD_NAME_EXIST_ERROR				0x80000108	// 既に同じ名前が使われています
#define EDGE_RTCD_ALLOCATE_ERROR				0x80000109	// メモリ確保失敗
#define EDGE_RTCD_FREE_ERROR					0x8000010A	// メモリ解放失敗
#define EDGE_RTCD_CREATE_MEM_HANDLE_ERROR		0x8000010B	// メモリハンドル生成失敗
#define EDGE_RTCD_DELETE_MEM_HANDLE_ERROR		0x8000010C	// メモリハンドル削除失敗
#define EDGE_RTCD_CATALOG_ERROR					0x8000010D	// カタログ失敗
#define EDGE_RTCD_UNCATALOG_ERROR				0x8000010E	// アンカタログ失敗
#define EDGE_RTCD_LOOKUP_ERROR					0x8000010F	// ルックアップ失敗
#define EDGE_RTCD_MAPPING_ERROR					0x80000110	// マッピング失敗
#define EDGE_RTCD_UNMAPPING_ERROR				0x80000111	// アンマッピング失敗
#define EDGE_RTCD_ACCESS_MODE_ERROR				0x80000112	// アクセスモードエラー
#define EDGE_RTCD_ALREADY_OPEN_READ_ERROR		0x80000113	// 既に読込みアクセスでオープンされています
#define EDGE_RTCD_ALREADY_OPEN_WRITE_ERROR		0x80000114	// 既に書込みアクセスでオープンされています(シングルモード時)
#define EDGE_RTCD_MEMINFO_INVALID				0x80000115	// RTCDメモリ情報が不正です
#define EDGE_RTCD_HANDLE_INVALID				0x80000116	// ハンドルが不正です
#define EDGE_RTCD_BUFFER_INVALID				0x80000117	// バッファが不正です
#define EDGE_RTCD_BUFFER_SIZE_INVALID			0x80000118	// バッファサイズが不正です
#define EDGE_RTCD_WRITE_SIZE_INVALID			0x80000119	// 書込みサイズが不正です
#define EDGE_RTCD_RECORD_HEADER_INVALID			0x8000011A	// RTCDヘッダーが不正です
#define EDGE_RTCD_INFO_INVALID					0x8000011B	// RTCD情報が不正です
#define EDGE_RTCD_NO_UPDATE						0x8000011C	// データ更新がありません
#define EDGE_RTCD_BUFFER_FULL_ERROR				0x8000011D	// バッファフルエラー
#define EDGE_RTCD_CREATE_LOGMBOX_ERROR			0x8000011E	// ログ用MAILBOX生成失敗
#define EDGE_RTCD_PROPERTY_NOT_SUPPORT			0x8000011F	// 指定したプロパティはサポートしていません
#define EDGE_RTCD_CANNOT_GET_ENTRY				0x80000120	// タグの生成・Entryが取得できません。

#define EDGE_RTCD_CREATE_SEMAPHORE1_ERROR		0x80000200	// セマフォ生成エラー(排他用セマフォ)
#define EDGE_RTCD_CREATE_SEMAPHORE2_ERROR		0x80000201	// セマフォ生成エラー(書込通知用セマフォ)
#define EDGE_RTCD_DELETE_SEMAPHORE1_ERROR		0x80000202	// セマフォ削除エラー(排他用セマフォ)
#define EDGE_RTCD_DELETE_SEMAPHORE2_ERROR		0x80000203	// セマフォ削除エラー(書込通知用セマフォ)
#define EDGE_RTCD_CATALOG_SEMAPHORE1_ERROR		0x80000204	// セマフォカタログエラー(排他用セマフォ)
#define EDGE_RTCD_CATALOG_SEMAPHORE2_ERROR		0x80000205	// セマフォカタログエラー(書込通知用セマフォ)
#define EDGE_RTCD_SEMAPHORE_TIMEOUT				0x80000206	// セマフォ取得タイムアウト
#define EDGE_RTCD_WAIT_SEMAPHORE_ERROR			0x80000207	// セマフォ取得エラー
#define EDGE_RTCD_RELEASE_SEMAPHORE_ERROR		0x80000208	// セマフォ解放エラー
#define EDGE_RTCD_OPEN_SEMAPHORE1_ERROR			0x80000209	// セマフォオープンエラー(排他用セマフォ)
#define EDGE_RTCD_OPEN_SEMAPHORE2_ERROR			0x8000020A	// セマフォオープンエラー(書込通知用セマフォ)
#define EDGE_RTCD_NOT_EXIST_SEMAPHORE_ERROR		0x8000020B	// セマフォが存在しません
#define EDGE_RTCD_LOOKUP_SEMAPHORE_ERROR		0x8000020C	// セマフォルックアップエラー
#define EDGE_RTCD_SEMAPHORE1_EXIST_ERROR		0x8000020D	// 既に同じセマフォが存在します(排他用セマフォ)
#define EDGE_RTCD_SEMAPHORE1_NAME_EXIST_ERROR	0x8000020E	// 既に同じ名前が使われています(排他用セマフォ)
#define EDGE_RTCD_SEMAPHORE2_EXIST_ERROR		0x8000020F	// 既に同じセマフォが存在します(書込通知用セマフォ)
#define EDGE_RTCD_SEMAPHORE2_NAME_EXIST_ERROR	0x80000210	// 既に同じ名前が使われています(書込通知用セマフォ)
#define EDGE_RTCD_OSDEP_CREATE_SEMAPHORE_ERROR	0x80000211	// セマフォ生成エラー(共通関数)
#define EDGE_RTCD_OSDEP_DELETE_SEMAPHORE_ERROR	0x80000212	// セマフォ削除エラー(共通関数)
#define EDGE_RTCD_OSDEP_SEMAPHORE_TIMEOUT		0x80000213	// セマフォ取得タイムアウト
#define EDGE_RTCD_OSDEP_WAIT_SEMAPHORE_ERROR	0x80000214	// セマフォ取得エラー
#define EDGE_RTCD_OSDEP_RELEASE_SEMAPHORE_ERROR	0x80000215	// セマフォ解放エラー

#define EDGE_RTCD_ARG_DATA_SIZE_ERROR			0x80000300	// 指定した引数の変数サイズが既定のサイズより大きい,または小さいためバッファを壊す

#define EDGE_TTABLE_MEMORRY_ERROR					0x80000400	// メモリの作成ができない(INtimeの場合はカーネルが起動していない等)
#define EDGE_TTABLE_EXIST_ERROR						0x80000401	// 既に同じTAGINFOTABLEが存在します
#define EDGE_TTABLE_CREATE_FILEMAPPING_ERROR		0x80000402	// ファイルマッピング生成エラー
#define EDGE_TTABLE_MAP_VIEW_ERROR					0x80000403	// ビューマップエラー
#define EDGE_TTABLE_MEMINFO_INVALID					0x80000404	// TTableメモリ情報が不正です
#define EDGE_TTABLE_UNMAP_VIEW_ERROR				0x80000405	// ビューアンマップエラー
#define EDGE_TTABLE_CREATE_MEM_HANDLE_ERROR			0x80000406	// メモリハンドル生成失敗
#define EDGE_TTABLE_DELETE_MEM_HANDLE_ERROR			0x80000407	// メモリハンドル削除失敗
#define EDGE_TTABLE_OPEN_FILEMAPPING_ERROR			0x80000408	// ファイルマッピングオープンエラー
#define EDGE_TTABLE_ISEXIST_TAGNAME					0x80000409	// 同名登録済み
#define EDGE_TTABLE_NOEXISTT_TAGNAME				0x8000040A	// 指定したタグ名がタグテーブルに存在しない。
#define EDGE_TTABLE_HASH_ERROR						0x8000040B	// ハッシュ値が不正です。
#define EDGE_TTABLE_INDEX_ERROR						0x8000040C	// Index値が不正です。
#define EDGE_TTABLE_DATA_ERROR						0x8000040D	// データ値が存在しません。
#define EDGE_TTABLE_NOEMPTY							0x8000040E	// テーブルに空きがありません。
#define EDGE_TTABLE_VALUE_OVERFLOW					0x8000040F	// 書き込み/読込データサイズが不正です。
#define EDGE_TTABLE_NAME_EXIST_ERROR				0x80000410	// 同じ名前が存在している
#define EDGE_TTABLE_CATALOG_ERROR					0x80000411	// カタログに失敗
#define EDGE_TTABLE_LOOKUP_ERROR					0x80000412	// LOOKUP失敗
#define EDGE_TTABLE_MAPPING_ERROR					0x80000413	// マッピング失敗
#define EDGE_TTABLE_NOT_EXIST_ERROR					0x80000414	// エントリがある前提なのに、エントリがない失敗
#define EDGE_TTABLE_FREE_ERROR						0x80000415	// フリー失敗
#define EDGE_TTABLE_TYPE_ERROR						0x80000416	// Tagの型タイプが範囲外
#define EDGE_TTABLE_DATASIZE_ERROR					0x80000417	// Tagのデータサイズが範囲外
#define EDGE_TTABLE_DUPLICATE_ERROR					0x80000418	// Tagの重複登録NG
#define EDGE_TTABLE_RESET_DEFAULT_VALUE				0x80000419	// Tagの初期値セット失敗
#define EDGE_TTABLE_RESET_DEFAULT_VALUE_TIMEOUT		0x8000041A	// Tagの初期値セット失敗、タイムアウト発生
#define EDGE_TTABLE_NOEXISTT_DSETNAME				0x80000501	// 指定されたDataset名はテーブルに存在しない
#define EDGE_TTABLE_NOEXISTT_DSETITEM				0x80000502	// 指定されたDataset名にはTagが登録されていない
#define EDGE_TTABLE_TAG_IS_NULL						0x80000503	// nextのTagは存在しない
#define EDGE_TTABLE_SERVICE_INDEX_NULL				0x80000504	// Service名のIndex化がされていない
#define EDGE_TTABLE_SYSTEM_CONFIG_NULL				0x80000505	// オブジェクト数制限値共有メモリが作成できない
#define EDGE_TTABLE_NOT_EXIST_EGIO					0x80000506	// EdgeIOポート情報が存在しない

#define EDGE_FAILED_TO_START_PROCESS                0x80000601	// プロセスを開始できませんでした

// Framework関連
#define EDGE_FW_INIT_ERROR							0x80001001  //FATALエラー(フレームワークとして動作できない環境です。他のエラーを確認してください						
#define EDGE_FW_NAME_INVALID						0x80001002	//サービス名称（プロセス名)が不正です
#define EDGE_FW_XML_FORMAT_ERROR					0x80001003  //XMLフォーマットエラー						
#define EDGE_FW_COLLECTOR_ALREADY_WORKING			0x80001004  //コレクタは既に動作しています。						
#define EDGE_FW_OBJECT_NOTEXIST						0x80001005  //指定したオブジェクトは存在しない					
#define EDGE_FW_MESSAGE_NOTEXIST					0x80001006  //指定したツール間通信メッセージは存在しない
#define EDGE_FW_DUPLICATE_OBJECT					0x80001007	//同名のオブジェクトが存在する
#define EDGE_FW_OBJECT_SIZE_OVER					0x80001008	//オブジェクト数が制限値を超えます/超えています

// 共通関数関連
#define EGDE_COMMON_DECODE_FORMAT_CMPIDENT_ERR		0x80002001  //Decode時のアドレス書式(format)が不正(比較エントリの識別子)
#define EGDE_COMMON_DECODE_FORMAT_PRIOD1_ERR		0x80002002  //Decode時のアドレス書式(format)が不正(ピリオド指定があるべきところにない)
#define EGDE_COMMON_DECODE_FORMAT_PRIOD2_ERR		0x80002003  //Decode時のアドレス書式(format)が不正(ピリオド後の指定がない)
#define EGDE_COMMON_DECODE_FORMAT_PRIOD3_ERR		0x80002004  //Decode時のアドレス書式(format)が不正(ピリオド値下限オーバー)
#define EGDE_COMMON_DECODE_FORMAT_PRIOD4_ERR		0x80002005  //Decode時のアドレス書式(format)が不正(ピリオド値上限オーバー)
#define EGDE_COMMON_DECODE_FORMAT_DST_BUFFERR		0x80002006  //Decode時のアドレス書式(format)が不正(dstバッファ超過)
#define EGDE_COMMON_DECODE_FORMAT_OFFSET1_ERR		0x80002007  //Decode時のアドレス書式(format)が不正(不適切なオフセット位置)
#define EGDE_COMMON_DECODE_FORMAT_OFFSET2_ERR		0x80002008  //Decode時のアドレス書式(format)が不正(srcバッファをoffset指定が超過)

#define EDGE_MODULE_LOAD_ERROR						0x80003001	//内部モジュールのロード失敗

// タグポインタ関連									0x80004001 ... 
#define	EDGE_TAGPTR_CREATE_ERROR					0x80004001	// タグポインタ用ヒープ領域の生成ができない
#define	EDGE_TAGPTR_MAP_ERROR						0x80004002	// タグポインタ用ヒープ領域のマップができない
#define	EDGE_TAGPTR_EXIST_ERROR						0x80004003	// 既にタグポインタ用ヒープ領域が存在します
#define	EDGE_TAGPTR_COUNT_OVER						0x80004004	// タグポインタ登録数が最大数のため、タグポインタが登録できない
#define EDGE_TAGPTR_NO_FREE_SPACE					0x80004005	// タグポインタ用ヒープ領域の空き容量がないため、タグポインタが登録できない
#define EDGE_TAGPTR_SIZE_ZERO						0x80004006	// サイズに0が指定された
#define EDGE_TAGPTR_SIZE_UNMATCH					0x80004007	// リンクタグのサイズ不一致
#define EDGE_TAGPTR_SIZE_OVERFLOW					0x80004008	// 書き込み/読み込みデータサイズが不正です。
#define EDGE_TAGPTR_TYPE_UNMATCH					0x80004009	// タグタイプ不一致
#define EDGE_TAGPTR_OFFSET_OVERFLOW					0x8000400A	// オフセットが範囲外
#define EDGE_TAGPTR_BUFFER_NULL						0x8000400B	// バッファにNULLが指定された
#define EDGE_TAGPTR_LOCK_TIMOUT						0x8000400C	// 書き込み/読み込み失敗

// 共有メモリ関連
#define EDGE_SHM_ALLOCATE_ERROR						0x80005001	// ローカルメモリ確保失敗
#define EDGE_SHM_MAP_ERROR							0x80005002	// 共有メモリ領域のマップができない
#define	EDGE_SHM_EXIST_ERROR						0x80005003	// 既に共有メモリ管理初期化が済んでいます
#define EDGE_SHM_PARAM_INVALID						0x80005004	// パラメータが不正です
#define	EDGE_SHM_LTB_FULL							0x80005005	// ローカルテーブルの空き無し
#define	EDGE_SHM_MAX_TAGS_NUM						0x80005006	// Tag数の最大サイズ取得失敗
#define	EDGE_SHM_NO_MAPPED							0x80005007	// マップされていない
#define EDGE_SHM_TYPE_UNMATCH						0x80005009	// タグタイプ不一致
#define EDGE_SHM_OFFSET_OVERFLOW					0x8000500A	// オフセット＋サイズがマップサイズ範囲外
#define EDGE_SHM_SYNTAX1_ERROR						0x80005ADA	// 共有メモリAddress構文エラー1
#define EDGE_SHM_SYNTAX2_ERROR						0x80005ADB	// 共有メモリAddress構文エラー2
#define EDGE_SHM_SYNTAX3_ERROR						0x80005ADC	// 共有メモリAddress構文エラー3
#define EDGE_SHM_SYNTAX4_ERROR						0x80005ADD	// 共有メモリAddress構文エラー4
#define EDGE_SHM_SYNTAX5_ERROR						0x80005ADE	// 共有メモリAddress構文エラー5
#define EDGE_SHM_SYNTAX6_ERROR						0x80005ADF	// 共有メモリAddress構文エラー6

// FIFOタグ関連
#define EDGE_FIFO_UNDERRUN							0x80006001	// FIFOバッファのアンダランが発生した(取得シーケンスが崩壊したことを示す)
#define EDGE_FIFO_OVERRUN							0x80006002	// FIFOバッファのオーバランが発生した(古いデータを破壊した / 読み捨てたことを示す)
#define EDGE_FIFO_TAG_ERROR							0x80006003	// タグの内部整合性エラー(FIFOタグが共有メモリタグではない)

#pragma pack(push,1)

//------------------------------------------------------------------------------
// Spinlock定義
//------------------------------------------------------------------------------
	typedef struct tEgSpinlock
	{
		uint32_t		current;				// 現在
		uint32_t		limit;					// 制限 (current==limit)はfree
	}EGSPINLOCK, *HEGSPINLOCK;

	void _EgInitializeSpinLock(HEGSPINLOCK spin);
	void _EgAcquireSpinLock(HEGSPINLOCK spin);
	void _EgReleaseSpinLock(HEGSPINLOCK spin);

//------------------------------------------------------------------------------
// Egオブジェクト参照用インデックス定義
//------------------------------------------------------------------------------
	typedef struct tEdgeIndex
	{
		uint32_t	hint;						// 予約(システム内部用)
		uint32_t	offset;						// アイテムへのバイトオフセット
	}EDGE_INDEX, *LPEDGE_INDEX;

//------------------------------------------------------------------------------
// EgVARIANTオブジェクト定義
//------------------------------------------------------------------------------

	//
	// 文字列型(Ver3.1時点 未対応 使用禁止
	//

	typedef struct EgBSTR
	{
		uint16_t		len;
		char			string[1];
	}*EGBSTR;

// EgStringAlloc
// EgStringFree
// EgStringLen

	//
	// EgTag データ型定数
	//
	enum egTagDataType
	{
		EgVtNull = 99,
		EgVtEmpty = 0,
		EgVtBoolean = 1,
		EgVtSByte = 2,
		EgVtByte = 3,
		EgVtInt16 = 4,
		EgVtUInt16 = 5,
		EgVtInt32 = 6,
		EgVtUInt32 = 7,
		EgVtInt64 = 8,
		EgVtUInt64 = 9,
		EgVtFloat = 10,
		EgVtDouble = 11,
		EgVtString = 12,
		EgVtSegment = 13,
		EgVtFIFO = 14,
	};

	//
	// EGVARIANT型
	//

	typedef struct EgVARIANT {
		struct {
			uint16_t	vt;								// Value Type 
			uint16_t	size;							// Size
			EGSPINLOCK	lock;							// (Internal Use) Exclusive control flag
			union {
				union EgVARIANTValues
				{
					bool		boolVal;
					float		fltVal;
					double		dblVal;
					time_t		date;
					char		cVal;
					int16_t		iVal;
					int32_t		lVal;
					int32_t		intVal;
					int64_t		llVal;
					uint8_t		bVal;
					uint16_t	uiVal;
					uint32_t	ulVal;					// Segment: (Internal Use) Offset value from the top by edge-segment
					uint32_t	uintVal;
					uint64_t	ullVal;
					bool		*pboolVal;
					float		*pfltVal;
					double		*pdblVal;
					time_t		*pdate;
					char		*pcVal;
					int16_t		*piVal;
					int32_t		*plVal;
					int32_t		*pintVal;
					int64_t		*pllVal;
					uint8_t		*pbVal;
					uint16_t	*puiVal;
					uint32_t	*pulVal;
					uint32_t	*puintVal;
					uint64_t	*pullVal;
					void		*byref;
					EGBSTR		*pStr;
					struct EgVARIANT		*pvarVal;
				};
				intptr_t	val;
			} ;
			uint64_t	pSegment;						// Segment     : Base address + offset value
														// SharedMemory: Base address + offset value
		} ;
	} EGVAR;

	//------------------------------------------------------------------------------
	// API用定数
	//------------------------------------------------------------------------------

	//
	// システムメッセージ
	// ※egapiWrap/EGDEFINE.csも併せて更新してください。
	//
	enum EDGE_MSG
	{
		EM_RETURN_RECEIVE_OK = 1,					// 応答用メッセージ（返信依頼があるようなケース)
		EM_SERVICE_STOP = 101,						// サービスストップメッセージ
		EM_SERVICE_RUN = 102,						// サービス実行開始指令
		EM_SERVICE_PAUSE = 103,						// サービス実行停止指令
		EM_SERVICE_UPDATE = 104,					// データリフレッシュ指令
		EM_SERVICE_ADD_TAG = 111,					// サービス内EgTagRef追加
		EM_SERVICE_REMOVE_TAG = 112,				// サービス内EgTagRef削除(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_CLEAR_TAG = 113,					// サービス内EgTagRefオールクリア(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_ADD_OUT_TAG = 114,				// サービス内EgTagRef_OUT追加
		EM_SERVICE_REMOVE_OUT_TAG = 115,			// サービス内EgTagRef_OUT削除(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_CLEAR_OUT_TAG = 116,				// サービス内EgTagRef_OUTオールクリア(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_ADD_IN_TAG = 117,				// サービス内EgTagRef_IN追加
		EM_SERVICE_REMOVE_IN_TAG = 118,				// サービス内EgTagRef_IN削除(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_CLEAR_IN_TAG = 119,				// サービス内EgTagRef_INオールクリア
		EM_SERVICE_ADD_CLCTREF = 121,				// サービス内EgCollectorRef追加
		EM_SERVICE_REMOVE_CLCTREF = 122,			// サービス内EgCollectorRef削除(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_CLEAR_CLCTREF = 123,				// サービス内EgCollectorRefオールクリア(Ver.3.1では未実装 以降拡張用)
		EM_SERVICE_ADD_MBOX = 124,					// サービス内EgMailbox追加
		EM_SERVICE_REMOVE_MBOX = 125,				// サービス内EgMailbox削除
		EM_SERVICE_ADD_TAGTRIGGER = 126,			// サービス内TagTrigger追加
		EM_SERVICE_READ_TAGTRIG_FINISH = 127,		// サービス内TagTrigger設定読み込み完了
		EM_SERVICE_ADD_MESSAGEOBJ = 128,			// サービス内MessageObj追加
		EM_COLLECTOR_CREATE = 201,					// コレクタ作成メッセージ
		EM_COLLECTOR_START_ALL = 202,				// サービス内コレクタ全スタートメッセージ
		EM_COLLECTOR_STOP_ALL = 203,				// サービス内コレクタ全ストップメッセージ
		EM_COLLECTOR_START_ONE = 204,				// サービス内コレクタ一つスタートメッセージ(コレクタ名指定)
		EM_COLLECTOR_STOP_ONE = 205,				// サービス内コレクタ一つストップメッセージ(コレクタ名指定)
		EM_COLLECTOR_WRITED_DATA = 206,				// サービス内コレクタデータ書き込み時のメッセージID
		EM_TAGTRIGGER_NOTIFICATION = 250,			// トリガー対象タグ値変化通知
		EM_TAGTRIGGER_START = 251,					// タグトリガースレッドスタートメッセージ
		EM_READ_REQUEST_SERVICE_XML = 1000,			// フレームワーク処理 xml読み込み命令メッセージ
		EM_READ_REQUEST_SERVICE_XML_END = 1001,		// サービスごとフレームワークからのxml読み込み命令受信時、xmlを読み終わったときにサービスに送信するメッセージ
		EM_READ_XML_SERVICE_END = 1002,				// xml内のServiceタグを読み終わった際にCreate有無関係なく、対象のサービスに送るメッセージ
		EM_CORE_CREATE_SERVICE_END = 1003,			// xml内のServiceタグを読み終わった際にCreate時のみ対象のサービスに送るメッセージ
		EM_TAG_DEFAULT_VALUE_SET = 1004,			// タグのデフォルト値をロードする指令メッセージ
		EM_TAG_DEFAULT_VALUE_SET_END = 1005,		// タグのデフォルト値をロードし終えた完了メッセージ
		EM_WRAPONLY_UPDATE_TAGTRIGREF = 2000,		// Wrap用 TagTrigger List更新処理
		EM_DEBUG_WRITE_SERVICEOBJ = 9000			// ログにdebug情報を出力するメッセージ
	};

#define	EG_MSG_USER 20000	//ユーザーメッセージ用 開始番号
#define EG_FALSE	0		// false, 偽
#define EG_TRUE		1		// true,  真

//------------------------------------------------------------------------------
// スレッドPriority定義(Windows用) 数値が低い方がプライオリティが高い
//  ※egapiWrap/EGDEFINE.csも併せて更新してください。
//------------------------------------------------------------------------------
#define EG_PRIORITY_240_255 240	// Base priority(Win) = 1
#define EG_PRIORITY_232_239 232	// Base priority(Win) = 2
#define EG_PRIORITY_224_231 224	// Base priority(Win) = 3
#define EG_PRIORITY_216_223 216	// Base priority(Win) = 4
#define EG_PRIORITY_208_215 208	// Base priority(Win) = 5
#define EG_PRIORITY_200_207 200	// Base priority(Win) = 6
#define EG_PRIORITY_192_199 192	// Base priority(Win) = 7
#define EG_PRIORITY_184_191 184	// Base priority(Win) = 8
#define EG_PRIORITY_176_183 176	// Base priority(Win) = 9
#define EG_PRIORITY_168_175 168	// Base priority(Win) = 10
#define EG_PRIORITY_160_167 160	// Base priority(Win) = 11
#define EG_PRIORITY_152_159 152	// Base priority(Win) = 12
#define EG_PRIORITY_144_151 144	// Base priority(Win) = 13
#define EG_PRIORITY_136_143 136	// Base priority(Win) = 14
#define EG_PRIORITY_128_135 128	// Base priority(Win) = 15
#define EG_PRIORITY_80_127 80	// Base priority(Win) = 16
#define EG_PRIORITY_72_79 72	// Base priority(Win) = 22
#define EG_PRIORITY_64_71 64	// Base priority(Win) = 23
#define EG_PRIORITY_56_63 56	// Base priority(Win) = 24
#define EG_PRIORITY_48_55 48	// Base priority(Win) = 25
#define EG_PRIORITY_8_47 8		// Base priority(Win) = 26
#define EG_PRIORITY_0_7 0		// Base priority(Win) = 31


//------------------------------------------------------------------------------
// ログ出力用定義
//------------------------------------------------------------------------------
#define EG_LOG_MSG "MSG"	// メッセージハンドラ
#define EG_LOG_OPE "OPE"	// オペレーション
#define EG_LOG_WRN "WRN"	// ワーニング
#define EG_LOG_ERR "ERR"	// エラー
#define EG_LOG_DBG "DBG"	// デバッグ情報
#define EG_LOG_FER "FER"	// FATAL ERROR

//
// その他
//
#define EG_WAIT_FOREVER 0xFFFFFFFF	// = WAIT_FOREVER (Win版に無かったので)
//------------------------------------------------------------------------------
// Edgeシステムスペック定義
//
//  ※egapiWrap/EGDEFINE.csも併せて更新してください。
//	※20200514_EgApiスペック表.xlsxも併せて更新してください	
//------------------------------------------------------------------------------
#define EG_MAX_TAGENTRY				10000	// タグエントリ最大数（テーブルのインデックス数制限）(デフォルト)
#define EG_MAX_TAGNAME			48		// タグ名最大長
#define	EG_MAX_TAGCOMMENT		48		// タグコメント最大長
#define	EG_MAX_TAGADDRESS		512		// タグアドレス最大長
#define EG_MIN_TAGBITNO			0		// タグアドレス最小ビット指定値
#define EG_MAX_TAGBITNO			7		// タグアドレス最大ビット指定値
#define EG_MAX_TAGADDRCATEGORY	10		// タグアドレス(EdgeIOポート)のカテゴリ最大数
#define EG_MIN_TAGSTRINGLEN		1		// タグ文字列最小長
#define EG_MAX_TAGSTRINGLEN		84		// タグ文字列最大長
#define EG_MAX_TAGDATASIZE		128		// タグデータ上限サイズ

#define EG_MAX_DSETENTRY		512		// データセットエントリ最大数（テーブルのインデックス数制限）デフォルト値(ファイル優先)
#define	EG_MAX_DSETNAME			32		// データセット名最大長
#define	EG_MAX_DSETLINK			2048	// データセットにリンクできるタグ最大数 デフォルト値(ファイル優先)

#define EG_MAX_CLCTENTRY		64		// コレクタエントリ最大数（テーブルのインデックス数制限） デフォルト値(ファイル優先)
#define	EG_MAX_CLCTNAME			8		// コレクタ名最大長 = Mailbox名最大長

#define EG_MAX_SERVICEENTRY		32		// サービスエントリ最大数（実質制限判定していない） デフォルト値(ファイル優先)
#define EG_MAX_SERVICENAME		24		// サービス名最大長
#define EG_MAX_SERVICEMAILBOXNAME	4		// サービスメールボックス名 NameSpace Index指定値4byte
#define EG_MAX_SERVICEPATH		260		// サービスパス最大長
#define EG_MAX_NODENAME			64		// ノード名最大長

#define EG_MAX_SPACEENTRY		32		// ネームスペースエントリ最大数
#define	EG_MAX_SPACENAME		16		// ネームスペース名最大長

#define EG_MAX_MAILBOXENTRY		64		// メールボックスエントリ最大数 デフォルト値(ファイル優先)
#define EG_MAX_MAILBOXNAME		8		// メールボックス名(8byte)

#define EGFW_MAX_CLCTENTRY		16		// フレームワークの扱うコレクタ最大数 デフォルト値(ファイル優先)
#define EGFW_MAX_MAILBOXENTRY	16		// フレームワークの扱うメールボックス最大数 デフォルト値(ファイル優先)
#define EGFW_MAX_TAGREFENTRY	1024	// フレームワークの扱うTagRefエントリ最大数 デフォルト値(ファイル優先)

#define EGFW_MAX_C2C_MAILBOXCOL	131072	// コンテナ間通信メールボックス1レコード最大データ数 デフォルト値(ファイル優先)
#define EGFW_MAX_C2C_MAILBOXROW	4096	// コンテナ間通信メールボックス最大レコード数 デフォルト値(ファイル優先)

#define	EG_MAX_TAGPTR_NUM		256				// タグポインタ最大数(ファイル優先)
#define	EG_MAX_TAGPTR_SIZE		(1024 * 1024)	// タグポインタ最データサイズ(ファイル優先)
#define	EG_MAX_TAGPTR_RETRY		3				// タグポインタロックを試みる回数(ファイル優先)

#define EG_MAX_CATALOGNAME		12		// カタログ名(12byte)
#define EG_DIFF_VALUE_SIZE		8       // 値比較用データサイズ
#define EG_MAX_PATH				260

#define EGFW_MAX_TAGTRIGENTRY	128		// フレームワークの扱うTagTriggerエントリ最大数 デフォルト値(ファイル優先) 32以下であること

#define EG_SHM_MAX_NODENAME		64		// 共有メモリ登録ノード名最大サイズ(バイト数)
#define EG_SHM_MAX_PROCNAME		12		// 共有メモリ登録プロセス名最大サイズ(バイト数)
#define EG_SHM_MAX_OBJENAME		12		// 共有メモリ登録オブジェクト名最大サイズ(バイト数)
#define EG_SHM_MAX_RETRY_LOCK	3		// ロックリトライ回数

#define EG_SHM_KEYWORD			"MAP"
#define EG_SHM_DELIMITER		"/"
#define EG_SHM_KEY_DELI			EG_SHM_KEYWORD EG_SHM_DELIMITER
#define EG_SHM_IN_USE			1

#define EG_FIFO_MAX_RETRY_LOCK	3		// ロックリトライ回数

#define EGFW_MAX_MESSAGEENTRY	16		// フレームワークの扱うXMLで定義可能なメッセージ最大数
#define EG_MAX_MESSAGENAME		48		// メッセージ名(48byte) XMLで指定時のみ使用
#define EG_MAX_MESSAGEARGS		260		// メッセージ引数 XMLで指定時のみ使用
#define EG_MESSFIFOTAG_RECORDSIZE 1024	// メッセージAPIで使用するFIFOタグの１レコードサイズ	
#define EG_MESSFIFOTAG_RECORDCOUNT 32	// メッセージAPIで使用するFIFOタグのレコード数			

#pragma pack(push,1)
//------------------------------------------------------------------------------
// 共有メモリ情報保持用構造体
//------------------------------------------------------------------------------
/// <summary>
/// 共有メモリ情報保持用構造体
/// </summary>
	typedef struct tSHM_DESC {
		char		chSourceUpper[255];			// タグアドレス255文字まで
		char		chNull;						// NULL文字 (以降のデータ破損防止)
		uint8_t		InUse;						// 0:未使用、1:使用中
		uint8_t		BitUse;						// Bitオフセットの使用有無
		uint16_t	BitOffset;					// Bitオフセット値
		uint32_t	Offset;						// 共有メモリ先頭からのオフセット値(BYTE単位)
		uint32_t	MapSize;					// 共有メモリそのもののサイズ(BYTE単位)
		uint32_t	Hash;						// ﾊｯｼｭ値のｷｬｯｼｭ
		char		NodeName[((EG_SHM_MAX_NODENAME + 1 + 3) & ~3)];	// 共有メモリがカタログされているノード名  (64 + NULL文字)
		char		ProcName[((EG_SHM_MAX_PROCNAME + 1 + 3) & ~3)];	// 共有メモリがカタログされているプロセス名(12 + NULL文字)
		char		ObjeName[((EG_SHM_MAX_OBJENAME + 1 + 3) & ~3)];	// カタログされている共有メモリ名(12 + NULL文字)
	} SHM_DESC;
	#define EG_SHM_DESC_SIZE	sizeof(SHM_DESC)	// 372 byte
#pragma pack(pop)

#pragma pack(push,1)
//------------------------------------------------------------------------------
// EgTagオブジェクト定義
//------------------------------------------------------------------------------
/// <summary>
/// EgTAGオブジェクトエントリー構造
/// </summary>
	typedef struct tTagsDesc
	{
		bool		force;								// ReadOnly属性(Trueの場合は書込み不可)
		bool		isLink;								// リンクタグを示すフラグ
		uint8_t		cnt;								// タグ書き込み時に値変化があった場合カウントを一つ上げる
		EGVAR		var;
		char		chName[EG_MAX_TAGNAME + 1];			// タグ名
		char		chComment[EG_MAX_TAGCOMMENT + 1];	// タグコメント
		union {
			char		chSource[EG_MAX_TAGADDRESS + 1];	// タグアドレス
			SHM_DESC	SHM;								// 共有メモリ情報保持用構造体
		};

		/* ﾀｸﾞﾀｲﾌﾟ別 固有ﾌﾟﾛﾊﾟﾃｨｴﾘｱ */
		union {

			/* FIFOﾀｸﾞ 固有ｴﾘｱ */
			struct {
				uint16_t	record_count;					// FIFOﾊﾞｯﾌｧ領域の総ﾚｺｰﾄﾞ数(@memo ﾚｺｰﾄﾞ長はvar.sizeで管理している。)
				bool		block_overrun;					// @todo
			} fifo;

		} extData;

	} TagsDesc, *LPTagsDesc;
#pragma pack(pop)


//------------------------------------------------------------------------------
// 構造体定義
//------------------------------------------------------------------------------
typedef	 int32_t(*FUNC_POINTER)(const char *, int32_t, void*);						// メッセージハンドラ用 コールバック関数 サイズ固定(2048)
typedef	 int32_t(*FUNC_POINTEREX)(const char *, int32_t, void*, int32_t);			// メッセージハンドラ用 コールバック関数 サイズ可変
#pragma pack(push,1)
	//
	// RT-edge system 各オブジェクトデータサイズ設定値 (ファイル読み込み値)
	//
	typedef struct tEdgeSystemConfig
	{
		uint32_t			MaxDsetEntry;		// データセットエントリ最大数（テーブルのインデックス数制限）
		uint32_t			MaxDsetLink;		// データセット データリンクタグ最大数(TagRef数)
		uint32_t			MaxClctEntry;		// コレクタ エントリ最大数
		uint32_t			MaxServiceEntry;	// サービスコンテナ エントリ最大数
		uint32_t			MaxMailboxEntry;	// メールボックス エントリ最大数
		uint32_t			MaxC2CMailboxCol;	// RT-edgeフレームワーク コンテナ間通信メールボックス最大データサイズ(ColSize) 
		uint32_t			MaxC2CMailboxRow;	// RT-edgeフレームワーク コンテナ間通信メールボックス 最大保持件数(RowSize)
		uint32_t			MaxFwClctEntry;		// RT-edgeフレームワーク  コレクタオブジェクト参照 エントリ最大数
		uint32_t			MaxFwMailboxEntry;	// RT-edgeフレームワーク メールボックスオブジェクト エントリ最大数
		uint32_t			MaxFwTagRefEntry;	// RT-edgeフレームワーク TagRefオブジェクト エントリ最大数
		uint32_t			MaxTagPtrNum;		// タグポインタ最大数
		uint32_t			MaxTagPtrSize;		// タグポインタ最大データサイズ(バイト単位)
		uint32_t			MaxTagPtrRetry;		// タグポインタロックを試みる回数
		uint32_t			MaxFwTagTrigEntry;	// RT-edgeフレームワーク TagTrigger最大数
		uint32_t			MaxFwMessageEntry; // RT-edgeフレームワーク Message エントリ最大数

	}EDGESYSTEMCONFIG, *LPEDGESYSTEMCONFIG;
	//
	// RT-edge system 動作設定
	//
	typedef struct tEdgeConfig
	{
		uint8_t				bDebug;		// デバッグフラグ
		uint8_t				bReadXmlF;	// xmlを読むか読まないかのフラグ 0:読まない, 1:読む (Core用)　デフォルト 1:読む 
		uint16_t			shPriority; // メールボックススレッド　プライオリティ (65535=デフォルト採用指定:150)
		FUNC_POINTER		fpUserMessHdlFunc;		//ユーザーメッセージハンドラ サイズ固定
		char				Path[EG_MAX_SERVICEPATH+1];	// サービスプロセス/DLLファイルパス(内部でサービス名・xmlのパスに変換するために使用)
		char				_nil00;
		uint8_t				_reserve1[2];
		FUNC_POINTEREX		fpUserMessHdlFuncEx;	//ユーザーメッセージハンドラ サイズ可変
	}EDGECONFIG ,*LPEDGECONFIG;
	#define EDGE_CONFIG_DEFAULT {0, 1, 65535, 0, 0}

	//
	// RT-edge ServiceCreate設定
	//
	typedef struct tEdgeServiceConfig
	{
		char			NodeName[EG_MAX_NODENAME + 1];	// サービスの起動ノード名
		uint16_t		Class;							// サービスクラス
	}EDGESERVICECONFIG, *LPEDGESERVICECONFIG;
	#define EDGE_SERVICECONFIG_DEFAULT { 0 }


#pragma pack(pop)

//
// For Framework
//
#pragma pack(push,1)
	//------------------------------------------------------------------------------
	// TagRef オブジェクト
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		Name[EG_MAX_TAGNAME+1];			// EgTag名
		char		Address[EG_MAX_TAGADDRESS+1];	// アドレス(ソース)
		uint16_t	Type;							// データ型
		uint16_t	Size;							// データサイズ
		void*		Entry;							// EgTagのEntryポインタ
		BYTE		_byOldVal[EG_DIFF_VALUE_SIZE];	// 内部的に比較用に使用 自身で値を入れる必要あり(自動では変更しない)
	} EGTAGREF;

	//------------------------------------------------------------------------------
	//コレクタのアイテムの情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		CollectorName[EG_MAX_CLCTNAME+1];	// コレクタ名
		char		DatasetName[EG_MAX_DSETNAME+1];		// データセット名
	} EGCOLLECTORITEMINFO;
	//------------------------------------------------------------------------------
	// Collectorオブジェクト
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		CollectorName[EG_MAX_CLCTNAME+1];		// コレクタ名
		char		OwnerServiceName[EG_MAX_SERVICENAME+1];	// コレクタ実行サービス名
		char		DatasetName[EG_MAX_DSETNAME+1];			// データセット名
		uint32_t	dwInterVal;								// 収集周期(ms)
		uint8_t		byPriority;								// スレッドプライオリティ
		uint32_t	dwStackSize;							// スタックサイズ(現状固定)
		uint32_t	dwColSize;								// 格納する1レコードのサイズ(デフォルト2048)
		uint32_t	dwRowSize;								// 格納数
		void*		hHandle;								// スレッドハンドル
		uint8_t		bWorkingF;								// FALSE:停止中 , TRUE:動作中
		uint8_t		bCancelF;								// TRUE:停止フラグ
	} EGLOCALCOLLECTOR;
	//------------------------------------------------------------------------------
	// CollectorRefオブジェクト
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		CollectorName[EG_MAX_CLCTNAME+1];		// コレクタ名
		char		DatasetName[EG_MAX_DSETNAME+1];			// データセット名
		uint32_t	dwColSize;								//格納する1レコードのサイズ(デフォルト2048)
		uint32_t	dwRowSize;								//格納数
	} EGCOLLECTORREF;
	//------------------------------------------------------------------------------
	// MailBoxを構成する情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		MailBoxName[EG_MAX_MAILBOXNAME+1];		// メールボックス名
		uint32_t	dwColSize;								// 1レコード長
		uint32_t	dwRowSize;								// レコード数
	} EGMAILBOXINFO;

	//------------------------------------------------------------------------------
	// MailBoxを構成する情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		MailBoxName[EG_MAX_MAILBOXNAME+1];		// メールボックス名
		uint32_t	dwColSize;								// 1レコード長
		uint32_t	dwRowSize;								// レコード数
		RTCDMEMINFO MemInfo;								// RTCDの構造体 (RTCDMEMINFO)
	} EGMAILBOX;
	//------------------------------------------------------------------------------
	// Edge I/Oポート情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		void*		Entry;									// EgTagのEntryポインタ
		char		SrcAddr[EG_MAX_TAGADDRESS + 1];			// 元アドレス
		char		AddrName[EG_MAX_CATALOGNAME + 1];		// アドレス名(仮称：薄皮名)
		int32_t		Index;									// ソート前インデックス値 0〜
		uint32_t	Offset;									// アドレス分解後のオフセットアドレス
		uint8_t		byBitUse;								// ビット使用フラグ
		uint16_t	woBitPos;								// ビット位置 最大2byte (0x0〜0xF)
		uint16_t	woMaxBit;								// 最大ビット数 使用時に全てのEGIOPORTを比べ設定 
		uint8_t		bIsValied;								// 有効なI/Oポートの場合は1 無効の場合は0
	} EGIOPORT;
	//------------------------------------------------------------------------------
	// TagTrigger サービスコンテナで持つデータ
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		Name[EG_MAX_TAGNAME + 1];		// タグ名
		char		Address[EG_MAX_TAGADDRESS + 1];	// アドレス(ソース)
		void*		Entry;							// EgTagのEntryポインタ
		uint16_t	Type;							// データ型
		uint16_t	Size;							// データサイズ
		BYTE		Count;							// 以前のカウンター
	} EGTAGTRIGGER, *LPEGTAGTRIGGER;
	//------------------------------------------------------------------------------
	// TagTrigger スレッド間データ受け渡し用　1Tag情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		uint16_t	arrNo;								// ローカルメンバ変数 配列No
		// タグ値 トリガー送信時にReadして渡す
		union {
			union EgTrigValues
			{
				bool		boolVal;
				float		fltVal;
				double		dblVal;
				char		cVal;
				int16_t		iVal;
				int32_t		lVal;
				int32_t		intVal;
				int64_t		llVal;
				uint8_t		bVal;
				uint16_t	uiVal;
				uint32_t	ulVal;
				uint32_t	uintVal;
				uint64_t	ullVal;
			};
			intptr_t	val;
		};
	} EGTAGTRIGINFO, *LPEGTAGTRIGINFO;
	//------------------------------------------------------------------------------
	// TagTrigger スレッド間データ受け渡し用 1メッセージ
	//------------------------------------------------------------------------------
	typedef struct
	{
		uint16_t TblCount;								// テーブルの配列数
		EGTAGTRIGINFO pTblTagTriggers[1];				// タグトリガー構造体テーブル
	} EGTAGTRIGINFOS, *LPEGTAGTRIGINFOS;
	//------------------------------------------------------------------------------
	// Messageを構成する情報
	//------------------------------------------------------------------------------
	typedef struct
	{
		char		Name[EG_MAX_MESSAGENAME + 1];		// メッセージ名
		uint32_t	No;									// メッセージNo
		char		DestName[EG_MAX_SERVICENAME + 1];	// 送信先サービス名
		BYTE		ExecTiming;							// 実行タイミング　0:任意(自身で実装) , 1:Initialize終了後
		BYTE		Timer;								// ExecTimingが1の時、関数呼び出し後実行するタイミングをsec(秒)で指定
														// 例：0の場合は実行関数呼び出し時即実行する
														//     1の場合は実行関数呼び出し後1sec後に実施する
		BYTE		ArgType;							// ArgsのType(変換時に必要) Tagのタイプと一緒
		uint32_t	Size;								// Argsで指定したサイズ(現在xmlでの指定は不可)
		BYTE		Args[EG_MAX_MESSAGEARGS + 1];		// 引数(現在xmlでの指定は不可)
	} EGMESSAGEOBJ;
#pragma pack(pop)
//------------------------------------------------------------------------------
// RT-edge API定義
//------------------------------------------------------------------------------

	//
	// System関連
	//
	edge_API int32_t EgInit(EDGECONFIG *Config);	// イニシャライズ処理実行関数
	edge_API int32_t EgFinalize();					// ファイナライズ処理実行関数
	edge_API int32_t EgSetRTCD(const char *Name);	// RTCD初期化
	edge_API int32_t _EgSysDefSetting(EDGESYSTEMCONFIG* SysCfg);	// RT-edge object 生成初期サイズ設定
	edge_API bool _EgSysTagCreate();				// システム用TAG作成
	//
	// Decoder関連
	//
	edge_API int32_t EgDecode(void* dst, size_t dstsize, const void* src, size_t srcsize, const char* addrformat, size_t *actualsize);	// address formatに則ってデータ抽出
	edge_API int32_t EgEncode(void* dst, size_t dstsize, const void* src, size_t srcsize, const char* addrformat, size_t *actualsize);	// address formatに則ってデータ書出
	edge_API const char* EgMakeAddress(int32_t offset, size_t size, char* buff, size_t buffsize);					// オフセット・サイズからaddress format作成
	edge_API int32_t EgParseAddress(const char* addrformat, int32_t *offset, size_t *size, int16_t *bit, uint8_t *typemode);	// address formatからオフセット・サイズに分解

	//
	// Tag関連
	//
	edge_API int32_t EgTagInit(uint32_t NumMax);	// EgTag初期化（ネームスペース生成）
	edge_API int32_t EgTagInitConfig(void);
	edge_API int32_t EgTagCreate(const char *Name, uint16_t Type, uint16_t Size, const char *Source, const char *Comment);	// EgTagの作成
	edge_API int32_t EgTagCreateEx(const char *Name, uint16_t Type, const char *Source, const char *Comment);	// EgTagの作成（サイズ指定なし版）
	edge_API int32_t EgTagCreateSp(const char *Name, uint16_t Type, const char *Source, const char *Comment, char *regName, uint16_t regNameSize, uint16_t *isLink);	// EgTagの作成（タグ名重複対応版）
	edge_API int32_t EgTagWrite(const char *Name, void *pBuffer, uint16_t wSize);	// EgTagの値書き込み
	edge_API int32_t EgTagWriteByIndex(EDGE_INDEX *index, void *pBuffer, uint16_t wSize);	// EgTagの値書き込み(INDEX指定)
	edge_API int32_t EgTagWriteByEntry(void *pEntry, void *pBuffer, uint16_t wSize);		// EgTagの値書き込み(Entry指定)
	edge_API int32_t EgTagRead(const char *Name, void* byteArray, uint16_t wSize);	// EgTagの値読み込み
	edge_API int32_t EgTagReadByIndex(EDGE_INDEX *index, void* byteArray, uint16_t wSize);	// EgTagの値読込(INDEX指定)
	edge_API int32_t EgTagReadByEntry(void *pEntry, void* byteArray, uint16_t wSize);		// EgTagの値読込(Entry指定)
	edge_API int32_t EgTagGetProperty(const char *Name, const char *propName, void* Value, int32_t dwSize);	// EgTagのProperty(Size, Type, Source等読み込み)
	edge_API int32_t EgTagGetPropertyByIndex(EDGE_INDEX *index, const char *propName, void* Value, int32_t dwSize);	// EgTagのProperty(Size, Type, Source等読み込み)(INDEX指定)
	edge_API int32_t EgTagGetPropertyByEntry(void *pEntry, const char *propName, void* Value, int32_t dwSize);	// EgTagのProperty(Size, Type, Source等読み込み)(Entry指定)
	edge_API void * EgTagGetHandle(void);									// ハンドル値取得
	edge_API int32_t EgTagWriteVar(const char *Name, EGVAR val);			// Variant書き込み
	edge_API EGVAR EgTagReadVar(const char *Name);							// Variant読み込み
	edge_API int32_t EgTagGetCount(uint32_t *itemNum);						// 現在のEgTag登録数取得
	edge_API int32_t EgTagGetEnum(EDGE_INDEX *pBuffer, uint32_t dwSize, uint32_t *itemNum);	// EgTagのインデックス一覧取得
	edge_API int32_t EgTagInitSegment();
	edge_API int32_t EgTagReadSegment(const char *Name, uint16_t wOffset, void* byteArray, uint16_t wSize);
	edge_API int32_t EgTagWriteSegment(const char *Name, uint16_t wOffset, void *pBuffer, uint16_t wSize);
	edge_API int32_t EgTagIsAliveSegment(const char *Name);
	edge_API int32_t EgTagCreateSegment(const char *Name, uint16_t Type, uint16_t Size, const char *Source, const char *Comment, char *regName, uint16_t regNameSize, uint16_t *isLink);
	edge_API int32_t EgTagReadString(const char *Name, char* pString, uint16_t wSize);
	edge_API int32_t EgTagWriteString(const char *Name, char *pString);
	edge_API int32_t EgTagReadSegmentByIndex(EDGE_INDEX *index, uint16_t wOffset, void* byteArray, uint16_t wSize);	// EgTagの値読込(INDEX指定)
	edge_API int32_t EgTagWriteSegmentByIndex(EDGE_INDEX *index, uint16_t wOffset, void *pBuffer, uint16_t wSize);	// EgTagの値書き込み(INDEX指定)
	edge_API int32_t EgTagReadSegmentByEntry(void *pEntry, uint16_t wOffset, void* byteArray, uint16_t wSize);		// EgTagの値読込(Entry指定)
	edge_API int32_t EgTagWriteSegmentByEntry(void *pEntry, uint16_t wOffset, void *pBuffer, uint16_t wSize);		// EgTagの値書き込み(Entry指定)
	edge_API int32_t EgTagSetDefaultValue();	// タグ初期値セット
	edge_API int32_t EgTagSetDefaultValueByGroup(uint16_t wGroup);	// タグ初期値セット

	edge_API int32_t EgTagCreateFIFO(const char *Name, uint16_t RecordSize, uint16_t RecordCount, bool Reserved1_LetFalse, const char *Comment, char *regName, uint16_t regNameSize, uint16_t *isLink);
	edge_API int32_t EgTagDequeueFIFOByEntry(void *pEntry, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagDequeueFIFOByIndex(EDGE_INDEX *index, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagDequeueFIFO(const char *Name, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueFIFOByEntry(void *pEntry, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueFIFOByIndex(EDGE_INDEX *index, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueFIFO(const char *Name, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueRingFIFOByEntry(void *pEntry, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueRingFIFOByIndex(EDGE_INDEX *index, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagEnqueueRingFIFO(const char *Name, void* byteArray, uint16_t wSize, uint16_t *wRemain);
	edge_API int32_t EgTagGetRemainFIFOByEntry(void *pEntry, uint16_t *wRemain);
	edge_API int32_t EgTagGetRemainFIFOByIndex(EDGE_INDEX *index, uint16_t *wRemain);
	edge_API int32_t EgTagGetRemainFIFO(const char *Name, uint16_t *wRemain);
	edge_API int32_t EgTagClearFIFOByEntry(void *pEntry);
	edge_API int32_t EgTagClearFIFOByIndex(EDGE_INDEX *index);
	edge_API int32_t EgTagClearFIFO(const char *Name);

	//
	// EgValiant (EGVAR)型変数
	//
	edge_API int32_t EgTagWriteVar(const char *Name, EGVAR val);			// Variant書き込み 
	edge_API EGVAR EgTagReadVar(const char *Name);							// Variant読み込み
	edge_API int32_t EgVariantInit(EGVAR *pvarg);							// Variantデータ初期化
	edge_API int32_t EgVariantCopy(EGVAR *pvargDest, const EGVAR *pvargSrc);// Variantデータコピー
	edge_API EGVAR EgAllocateString(const char* string);					// 文字列可変メモリ作成

	//
	// Mailbox関連
	//

	edge_API int32_t EgMailboxCreateEx(const char *pName, uint32_t dwColSize, uint32_t dwRowSize, RTCDMEMINFO *pRtcdInfo);	// EgMailbox作成
	edge_API int32_t EgMailboxDelete(RTCDMEMINFO *pRtcdInfo);																// EgMailbox削除
	edge_API int32_t EgMailboxOpen(const char *pName, uint32_t dwAccess, RTCDHANDLE *pHandle);								// EgMailboxオープン
	edge_API int32_t EgMailboxClose(RTCDHANDLE *pHandle);																	// EgMailboxクローズ
	edge_API int32_t EgMailboxSend(RTCDHANDLE *pHandle, const char *SenderName, int32_t MessageNo, void* pData, uint32_t dwSize);	// EgMailboxへデータ・メッセージ送信
	edge_API int32_t EgMailboxReceive(RTCDHANDLE *pHandle, char *SenderName, uint32_t dwNameSize, int32_t* MessageNo, void* pData, uint32_t dwSize, uint32_t dwTimeOut);// EgMailboxからデータ・メッセージ受信
	edge_API int32_t EgMailboxGetInfo(RTCDHANDLE *pHandle, EDGE_RTCD_HEADER *pInfo);										// EgMailbox情報取得
	edge_API void * EgMailboxGetHandle(void);																				// EgMailboxのハンドル値取得
	edge_API int32_t EgMailboxGetProperty(const char *Name, const char *propName, void* Value, int32_t dwSize);				// EgMailboxのProperty取得 
	edge_API int32_t EgMailboxGetPropertyByIndex(EDGE_INDEX *pBuffer, const char *propName, void* Value, int32_t dwSize);	// EgMailboxのProperty取得(インデックス指定)
	edge_API int32_t EgMailboxGetCount(uint32_t *itemNum);																	// EgMailbox登録数取得
	edge_API int32_t EgMailboxGetEnum(EDGE_INDEX *pBuffer, uint32_t dwSize, uint32_t *pItemNum);							// EgMailboxのインデックス一覧取得
	edge_API int32_t EgMailboxOpenSC(const char *Name, uint32_t dwAccess, RTCDHANDLE *pHandle);					// EgMailboxオープン



	//
	// Dataset関連
	//
	typedef struct tdslink					// DSetのサーチ用
	{
		char* TagName;	// タグ名
		void* tag;		// TagDesc*
		void* ds;		// DsetDesc*
		uint16_t inst;	// FindFirst/Next
		uint16_t offset; // データセットに登録されているTagのデータサイズ位置
	}dslink;
	edge_API int32_t EgDatasetCreate(const char *Name);										// Dataset作成
	edge_API int32_t EgDatasetAddTag(const char *Name, const char *TagName);				// DatasetにEgTag追加
	edge_API void * EgDatasetGetHandle(void);												// Datasetのハンドル値取得
	edge_API size_t EgDatasetGetSize(const char *Name);										// Datasetの総データサイズ取得
	edge_API int32_t EgDatasetGetFirst(const char *Name, dslink *dslink);					// Datasetの最初のEgTagへのリンク取得
	edge_API int32_t EgDatasetGetNext(dslink *dslink);										// Datasetの次のEgTagへのリンク取得
	edge_API int32_t EgDatasetGetBinary(const char *Name, void* Dest, size_t DestSize);		// Datasetの総データ値(バイナリ)を取得
	edge_API int32_t EgDatasetSetBinary(const char *Name, void* Source, size_t SourceSize);	// DatasetのTagに指定したバイナリ値を分解して設定
	edge_API int32_t EgDatasetGetPropertyByIndex(EDGE_INDEX *pBuffer, const char *propName, void* Value, int32_t dwSize);	// DatasetのProperty取得(インデックス指定)
	edge_API int32_t EgDatasetGetCount(uint32_t *itemNum);									// Dataset登録数取得
	edge_API int32_t EgDatasetGetEnum(EDGE_INDEX *pBuffer, uint32_t dwSize, uint32_t *pItemNum);	// Datasetのインデックス一覧取得


	//
	// Collector関連
	//
	edge_API int32_t EgCollectorCreate(const char *Name, const char *OwnerName, uint32_t Interval, uint8_t Priority, uint32_t ColSize, uint32_t RowSize, const char *DSetName);	// コレクタの作成
	edge_API int32_t EgCollectorGetProperty(const char *Name, const char *propName, void* Value, int32_t dwSize);	// コレクタのProperty取得 
	edge_API int32_t EgCollectorGetPropertyByIndex(EDGE_INDEX *pBuffer, const char *propName, void* Value, int32_t dwSize);	// コレクタのProperty取得(インデックス指定)
	edge_API void * EgCollectorGetHandle(void);	//　コレクタのハンドル取得
	edge_API int32_t EgCollectorGetCount(uint32_t *itemNum);										// コレクタ登録数取得
	edge_API int32_t EgCollectorGetEnum(EDGE_INDEX *Buffer, uint32_t dwSize, uint32_t *pItemNum);	// コレクタのインデックス一覧取得


	//
	// Service関連
	//
	typedef intptr_t	EGSERVICEHANDLE;	// サービスのハンドル
	edge_API void * EgServiceGetHandle(void);									// ハンドル値取得
	edge_API int32_t EgServiceCreate(const char *Name, const char *path, const char *arg, EGSERVICEHANDLE *pid); // サービスの作成
	edge_API int32_t EgServiceCreateEx(const char *Name, const char *path, const char *arg, EGSERVICEHANDLE *pid, EDGESERVICECONFIG *config); // リモートサービスの作成
	edge_API int32_t EgServiceGetCount(uint32_t *itemNum);										// サービス登録数取得
	edge_API int32_t EgServiceGetEnum(EDGE_INDEX *pBuffer, uint32_t dwSize, uint32_t *itemNum);	// サービスのインデックス一覧取得
	edge_API int32_t EgServiceGetProperty(const char *Name, const char *propName, void* Value, int32_t dwSize);	// サービスのProperty取得 
	edge_API int32_t EgServiceGetPropertyByIndex(EDGE_INDEX *pBuffer, const char *propName, void* Value, int32_t dwSize);	// サービスのProperty取得(インデックス指定)

	//
	// Framework
	//


	typedef  void(*INITENDFUNC_POINTER)();							// 初期化処理終了時用 コールバック関数
	typedef  void(*DEBUGFUNC_POINTER)();							// デバッグ出力用 コールバック関数

	edge_API int32_t _EgFW_Initialize(EDGECONFIG *Config);			//初期化処理
	edge_API int32_t _EgFW_Finalize();								//最終処理
	edge_API int32_t EgFW_AddInitEndFunc(INITENDFUNC_POINTER p);	//初期化終了時に呼ぶ関数 追加
	edge_API int32_t EgFW_AddDebugFunc(DEBUGFUNC_POINTER p);		//デバッグ用関数追加
	edge_API void EgFW_PrintLog(const char* pServiceName, const char* pMode, const char* format, ...);		// ログ出力用関数
	edge_API void _EgFW_PrintSysLog(const char* pServiceName, const char* pMode, const char* format, ...);	// ログ出力用(システム用)関数
	edge_API int32_t EgFW_AddTagTrigger(const char* pTagName);		// タグトリガー登録用関数
	edge_API int32_t EgFW_SendMessageAsync(const char* ServiceName, int32_t messageNo, void* arg, uint32_t dwSize);		// メッセージ非同期送信関数

	edge_API int32_t _EgFW_GetServiceName(char* pName);				// サービス名(ハッシュ値)の取得
	edge_API int32_t _EgFW_GetServiceRealName(char* pName);			// サービス名の取得
	edge_API int32_t _EgFW_GetServiceStateName(char* pName);		// サービスステータス名の取得
	edge_API int32_t _EgFW_GetEgTagRef_OUT_Count();					// EgTagRef_OUTの数取得
	edge_API int32_t _EgFW_GetEgTagRef_IN_Count();					// EgTagRef_INの数取得
	edge_API int32_t _EgFW_GetEgTagRef_Count();						// EgTagRefの数取得
	edge_API int32_t _EgFW_GetCollectorRef_Count();					// EgCollectorRefの数取得
	edge_API int32_t _EgFW_GetMailbox_Count();						// EgMailbox数取得
	edge_API int32_t _EgFW_GetTagTrigger_Count();					// TagTriggerの数取得
	edge_API int32_t _EgFW_GetTagRef_OUT(EGTAGREF* tagref, int32_t index);	// EgTagRef_OUT取得
	edge_API int32_t _EgFW_GetTagRef_IN(EGTAGREF* tagref, int32_t index);	// EgTagRef_IN取得
	edge_API int32_t _EgFW_GetTagRef(EGTAGREF* tagref, int32_t index);		// EgTagRef取得
	edge_API int32_t _EgFW_GetEgTagRef_OUT_PortInfo_Count();						// EgTagRef_OUT_PortInfoの数取得
	edge_API int32_t _EgFW_GetEgTagRef_IN_PortInfo_Count();							// EgTagRef_IN_PortInfoの数取得
	edge_API int32_t _EgFW_GetEgTagRef_PortInfo_Count();							// EgTagRef_PortInfoの数取得
	edge_API int32_t _EgFW_GetTagRef_OUT_PortInfo(EGIOPORT* egio, int32_t index);	// EgTagRef_OUT_PortInfo取得
	edge_API int32_t _EgFW_GetTagRef_IN_PortInfo(EGIOPORT* egio, int32_t index);	// EgTagRef_IN_PortInfo取得
	edge_API int32_t _EgFW_GetTagRef_PortInfo(EGIOPORT* egio, int32_t index);		// EgTagRef_PortInfo取得
	edge_API int32_t _EgFW_GetCollector(EGLOCALCOLLECTOR* collector, int32_t index);		// EgCollecor取得
	edge_API int32_t _EgFW_GetCollectorRef(EGCOLLECTORREF* collectorRef, int32_t index);	// EgCollectorRef取得
	edge_API int32_t _EgFW_GetMailBox(EGMAILBOX* mailBoxe, int32_t index);					// EgMailbox取得
	edge_API int32_t _EgFW_GetTagTrigger_Count();											// EgTagTriggerの数取得
	edge_API int32_t _EgFW_GetTagTrigger(EGTAGTRIGGER* tagtrigger, int32_t index);			// EgTagTrigger取得
	edge_API int32_t _EgFW_GetMessageObj_Count();											// EgMessageObjの数取得
	edge_API int32_t _EgFW_GetMessageObj(EGMESSAGEOBJ* messageObj, int32_t index);			// EgMessageObj取得
	//
	// Framework Member
	//
	extern edge_API char ServiceRealName[EG_MAX_SERVICENAME +1];			//サービス名
	extern edge_API char ServiceName[EG_MAX_SERVICEMAILBOXNAME + 1];		//サービスインデックス名
	extern edge_API char ServiceMailboxName[EG_MAX_SERVICEMAILBOXNAME + 1];	//サービスインデックス名
	extern edge_API char ServiceStateName[EG_MAX_TAGNAME+1];				//サービスのアクティブステータス名(Tag名)
	extern edge_API char ServiceStateErrName[EG_MAX_TAGNAME+1];				//サービスの異常状態ステータス名(Tag名)
	extern edge_API char ServiceStateRunName[EG_MAX_TAGNAME+1];				//サービスの実行状態ステータス名(Tag名)
	extern edge_API char ServiceStateLiveName[EG_MAX_TAGNAME+1];			//サービス実行中を示すインクリメント名(Tag名)
	extern edge_API char ServiceMboxTagName[EG_MAX_TAGNAME + 1];			//サービスメールボックス Tag登録名
	extern edge_API char ServiceMboxColSizeName[EG_MAX_TAGNAME + 1];		//サービス間通信メールボックスの1レコードサイズ名(Tag名)
	extern edge_API char ServiceMboxRowSizeName[EG_MAX_TAGNAME + 1];		//サービス間通信メールボックスのレコード数名(Tag名)
	extern edge_API int32_t egTagRefs_OUT_Count;							//TagRef OUT の数
	extern edge_API int32_t egTagRefs_IN_Count;								//TagRef IN  の数
	extern edge_API int32_t egTagRefs_Count;								//TagRef     の数
	extern edge_API int32_t egCollectors_Count;								//Collector  の数
	extern edge_API int32_t egCollectorRefs_Count;							//CollectorRef の数
	extern edge_API int32_t egMailBoxes_Count;								//MailBox    の数
	extern edge_API int32_t egTagTriggers_Count;							//TagTrigger の数
	extern edge_API int32_t egMessages_Count;								//Message    の数

	extern edge_API EGTAGREF* egTagRefs_OUT;								//TagRef OUT 一覧 ポインタ
	extern edge_API EGTAGREF* egTagRefs_IN;									//TagRef IN  一覧 ポインタ
	extern edge_API EGTAGREF* egTagRefs;									//TagRef     一覧 ポインタ
	extern edge_API EGIOPORT* egTagRefs_OUT_PortInfo;						//TagRef OUT拡張テーブル(EdgeIOポート情報) 一覧 ポインタ
	extern edge_API EGIOPORT* egTagRefs_IN_PortInfo;						//TagRef IN 拡張テーブル(EdgeIOポート情報) 一覧 ポインタ
	extern edge_API EGIOPORT* egTagRefs_PortInfo;							//TagRef    拡張テーブル(EdgeIOポート情報) 一覧 ポインタ
	extern edge_API EGLOCALCOLLECTOR* egCollectors;							//Collector  一覧 ポインタ
	extern edge_API EGCOLLECTORREF* egCollectorRefs;						//CollectorRef 一覧 ポインタ
	extern edge_API EGMAILBOX* egMailBoxes;									//MailBox    一覧 ポインタ
	extern edge_API EGTAGTRIGGER* egTagTriggers;							//TagTrigger 一覧ポインタ
	extern edge_API EGMESSAGEOBJ* egMessageObjs;							//MessageObj 一覧ポインタ

	//
	// etc
	//
	extern edge_API int32_t EgGetTime(EDGE_TIME_STAMP *pTime);				//時間の取得
	extern edge_API int32_t EgGetTimeVal(EDGE_TIME_VAL *pTime);				//時間の取得
	extern edge_API int32_t EgLocaltime64(void* pTime, void* pLongtime);	//時間の変換

#pragma pack(pop)

#ifdef __cplusplus
}
#endif
