/****************************************************************************

  (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
      www.systec-electronic.com

  Project:      openPOWERLINK

  Description:  include file for EPL API layer

  License:

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.

    3. Neither the name of SYSTEC electronic GmbH nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without prior written permission. For written
       permission, please contact info@systec-electronic.com.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGE.

    Severability Clause:

        If a provision of this License is or becomes illegal, invalid or
        unenforceable in any jurisdiction, that shall not affect:
        1. the validity or enforceability in that jurisdiction of any other
           provision of this License; or
        2. the validity or enforceability in other jurisdictions of that or
           any other provision of this License.

  -------------------------------------------------------------------------

                $RCSfile: Epl.h,v $

                $Author: D.Krueger $

                $Revision: 1.8 $  $Date: 2008/11/17 16:40:39 $

                $State: Exp $

                Build Environment:
                    GCC V3.4

  -------------------------------------------------------------------------

  Revision History:

  2006/05/22 d.k.:   start of the implementation, version 1.00

****************************************************************************/

#ifndef _EPL_API_H_
#define _EPL_API_H_

#include "EplInc.h"
#include "EplSdo.h"
#include "EplObd.h"
#include "EplLed.h"
#include "EplEvent.h"

//---------------------------------------------------------------------------
// const defines
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// typedef
//---------------------------------------------------------------------------

typedef struct {
	unsigned int m_uiNodeId;
	tEplNmtState m_NmtState;
	tEplNmtNodeEvent m_NodeEvent;
	u16 m_wErrorCode;	// EPL error code if m_NodeEvent == kEplNmtNodeEventError
	BOOL m_fMandatory;

} tEplApiEventNode;

typedef struct {
	tEplNmtState m_NmtState;	// local NMT state
	tEplNmtBootEvent m_BootEvent;
	u16 m_wErrorCode;	// EPL error code if m_BootEvent == kEplNmtBootEventError

} tEplApiEventBoot;

typedef struct {
	tEplLedType m_LedType;	// type of the LED (e.g. Status or Error)
	BOOL m_fOn;		// state of the LED (e.g. on or off)

} tEplApiEventLed;

typedef enum {
	kEplApiEventNmtStateChange = 0x10,	// m_NmtStateChange
//    kEplApiEventRequestNmt     = 0x11,    // m_bNmtCmd
	kEplApiEventCriticalError = 0x12,	// m_InternalError, Stack halted
	kEplApiEventWarning = 0x13,	// m_InternalError, Stack running
	kEplApiEventNode = 0x20,	// m_Node
	kEplApiEventBoot = 0x21,	// m_Boot
	kEplApiEventSdo = 0x62,	// m_Sdo
	kEplApiEventObdAccess = 0x69,	// m_ObdCbParam
	kEplApiEventLed = 0x70,	// m_Led

} tEplApiEventType;

typedef union {
	tEplEventNmtStateChange m_NmtStateChange;
	tEplEventError m_InternalError;
	tEplSdoComFinished m_Sdo;
	tEplObdCbParam m_ObdCbParam;
	tEplApiEventNode m_Node;
	tEplApiEventBoot m_Boot;
	tEplApiEventLed m_Led;

} tEplApiEventArg;

typedef tEplKernel(*tEplApiCbEvent) (tEplApiEventType EventType_p,	// IN: event type (enum)
				     tEplApiEventArg *pEventArg_p,	// IN: event argument (union)
				      void *pUserArg_p);

typedef struct {
	unsigned int m_uiSizeOfStruct;
	BOOL m_fAsyncOnly;	// do not need to register PRes
	unsigned int m_uiNodeId;	// local node ID
	u8 m_abMacAddress[6];	// local MAC address

	// 0x1F82: NMT_FeatureFlags_U32
	u32 m_dwFeatureFlags;
	// Cycle Length (0x1006: NMT_CycleLen_U32) in [us]
	u32 m_dwCycleLen;	// required for error detection
	// 0x1F98: NMT_CycleTiming_REC
	// 0x1F98.1: IsochrTxMaxPayload_U16
	unsigned int m_uiIsochrTxMaxPayload;	// const
	// 0x1F98.2: IsochrRxMaxPayload_U16
	unsigned int m_uiIsochrRxMaxPayload;	// const
	// 0x1F98.3: PResMaxLatency_U32
	u32 m_dwPresMaxLatency;	// const in [ns], only required for IdentRes
	// 0x1F98.4: PReqActPayloadLimit_U16
	unsigned int m_uiPreqActPayloadLimit;	// required for initialisation (+28 bytes)
	// 0x1F98.5: PResActPayloadLimit_U16
	unsigned int m_uiPresActPayloadLimit;	// required for initialisation of Pres frame (+28 bytes)
	// 0x1F98.6: ASndMaxLatency_U32
	u32 m_dwAsndMaxLatency;	// const in [ns], only required for IdentRes
	// 0x1F98.7: MultiplCycleCnt_U8
	unsigned int m_uiMultiplCycleCnt;	// required for error detection
	// 0x1F98.8: AsyncMTU_U16
	unsigned int m_uiAsyncMtu;	// required to set up max frame size
	// 0x1F98.9: Prescaler_U16
	unsigned int m_uiPrescaler;	// required for sync
	// $$$ Multiplexed Slot

	// 0x1C14: DLL_LossOfFrameTolerance_U32 in [ns]
	u32 m_dwLossOfFrameTolerance;

	// 0x1F8A: NMT_MNCycleTiming_REC
	// 0x1F8A.1: WaitSoCPReq_U32 in [ns]
	u32 m_dwWaitSocPreq;

	// 0x1F8A.2: AsyncSlotTimeout_U32 in [ns]
	u32 m_dwAsyncSlotTimeout;

	u32 m_dwDeviceType;	// NMT_DeviceType_U32
	u32 m_dwVendorId;	// NMT_IdentityObject_REC.VendorId_U32
	u32 m_dwProductCode;	// NMT_IdentityObject_REC.ProductCode_U32
	u32 m_dwRevisionNumber;	// NMT_IdentityObject_REC.RevisionNo_U32
	u32 m_dwSerialNumber;	// NMT_IdentityObject_REC.SerialNo_U32
	u64 m_qwVendorSpecificExt1;
	u32 m_dwVerifyConfigurationDate;	// CFM_VerifyConfiguration_REC.ConfDate_U32
	u32 m_dwVerifyConfigurationTime;	// CFM_VerifyConfiguration_REC.ConfTime_U32
	u32 m_dwApplicationSwDate;	// PDL_LocVerApplSw_REC.ApplSwDate_U32 on programmable device or date portion of NMT_ManufactSwVers_VS on non-programmable device
	u32 m_dwApplicationSwTime;	// PDL_LocVerApplSw_REC.ApplSwTime_U32 on programmable device or time portion of NMT_ManufactSwVers_VS on non-programmable device
	u32 m_dwIpAddress;
	u32 m_dwSubnetMask;
	u32 m_dwDefaultGateway;
	u8 m_sHostname[32];
	u8 m_abVendorSpecificExt2[48];

	char *m_pszDevName;	// NMT_ManufactDevName_VS (0x1008/0 local OD)
	char *m_pszHwVersion;	// NMT_ManufactHwVers_VS  (0x1009/0 local OD)
	char *m_pszSwVersion;	// NMT_ManufactSwVers_VS  (0x100A/0 local OD)

	tEplApiCbEvent m_pfnCbEvent;
	void *m_pEventUserArg;
	tEplSyncCb m_pfnCbSync;

} tEplApiInitParam;

typedef struct {
	void *m_pImage;
	unsigned int m_uiSize;

} tEplApiProcessImage;

//---------------------------------------------------------------------------
// function prototypes
//---------------------------------------------------------------------------

tEplKernel EplApiInitialize(tEplApiInitParam *pInitParam_p);

tEplKernel EplApiShutdown(void);

tEplKernel EplApiReadObject(tEplSdoComConHdl *pSdoComConHdl_p,
			    unsigned int uiNodeId_p,
			    unsigned int uiIndex_p,
			    unsigned int uiSubindex_p,
			    void *pDstData_le_p,
			    unsigned int *puiSize_p,
			    tEplSdoType SdoType_p, void *pUserArg_p);

tEplKernel EplApiWriteObject(tEplSdoComConHdl *pSdoComConHdl_p,
			     unsigned int uiNodeId_p,
			     unsigned int uiIndex_p,
			     unsigned int uiSubindex_p,
			     void *pSrcData_le_p,
			     unsigned int uiSize_p,
			     tEplSdoType SdoType_p, void *pUserArg_p);

tEplKernel EplApiFreeSdoChannel(tEplSdoComConHdl SdoComConHdl_p);

tEplKernel EplApiReadLocalObject(unsigned int uiIndex_p,
				 unsigned int uiSubindex_p,
				 void *pDstData_p,
				 unsigned int *puiSize_p);

tEplKernel EplApiWriteLocalObject(unsigned int uiIndex_p,
				  unsigned int uiSubindex_p,
				  void *pSrcData_p,
				  unsigned int uiSize_p);

tEplKernel EplApiCbObdAccess(tEplObdCbParam *pParam_p);

tEplKernel EplApiLinkObject(unsigned int uiObjIndex_p,
			    void *pVar_p,
			    unsigned int *puiVarEntries_p,
			    tEplObdSize *pEntrySize_p,
			    unsigned int uiFirstSubindex_p);

tEplKernel EplApiExecNmtCommand(tEplNmtEvent NmtEvent_p);

tEplKernel EplApiProcess(void);

#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
tEplKernel EplApiMnTriggerStateChange(unsigned int uiNodeId_p,
				      tEplNmtNodeCommand NodeCommand_p);
#endif

tEplKernel EplApiGetIdentResponse(unsigned int uiNodeId_p,
				  tEplIdentResponse **ppIdentResponse_p);

// functions for process image will be implemented in separate file
tEplKernel EplApiProcessImageSetup(void);
tEplKernel EplApiProcessImageExchangeIn(tEplApiProcessImage *pPI_p);
tEplKernel EplApiProcessImageExchangeOut(tEplApiProcessImage *pPI_p);

#endif // #ifndef _EPL_API_H_
