#ifndef _NM_CFG_H_
#define _NM_CFG_H_



typedef struct {
	unsigned int AppId;
	unsigned int AppCycleTime;  //unit:ms
	unsigned int AppCycleTimeMax;  //unit:ms
	unsigned char AppLen;
	unsigned char AppData[8];
}_AppMsgTime;

#define VoltUpCh0Limit 1820  //18.2V
#define VoltDownCh0Limit 680   //6.8V
	
#define VoltUpCh1Limit 1820  //18.2V
#define VoltDownCh1Limit 680   //6.8V

typedef enum {
	NM_STATE_LIMPHOME_MAIN,
	NM_STATE_NORMAL_MAIN,
	NM_STATE_TWBSNORMAL_MAIN,
	NM_STATE_NORMALPREPSLEEP_MAIN,
	NM_STATE_BUSSLEEP_MAIN,
	NM_STATE_LIMPHOMEPREPSLEEP_MAIN,
	NM_STATE_TWBSLIMPHOME_MAIN,
	NM_STATE_RESET_MAIN,
	NM_STATE_DO_NOTHING,
}_NM_STATE;


typedef struct {
	unsigned int RecoverTime;
	unsigned char RecoverCnt;
}_NM_BusOffCtlInfo;

typedef struct {
  unsigned int NmIdBase;                    //default:0x400
  unsigned int NmIdBottom;                  //default:0x4ff
  unsigned char NmIdOwn;                    //default:0x4;
  unsigned char NmRxLimit;                  //default:0x4
  unsigned char NmTxLimit;                  //default:0x8
  unsigned int NmTimeType;                  //default:100,unit:ms
  unsigned int NmTimeMax;                   //default:260,unit:ms
  unsigned int NmTimeError;                 //default:1000,unit:ms
  unsigned int NmTimeWaitBusSleep;          //default:1500,unit:ms
  unsigned int NmTimeRequestSleepInd;       //default:5000,unit:ms
  unsigned char NmTimeRequestLimpSleepInd;  //default:4
}OSEK_NM_INIT;

typedef struct { 
  volatile _NetWorkStatus NmNetWorkStatus;          //NetWorkStatus
  volatile _NM_STATE NmState;                       //NM_State
  volatile unsigned char NmTaskLock;                //NM_Task_Lock
	volatile unsigned int NmIdBase;                   //#define NM_CAN_ID_BASE 0x400
	volatile unsigned int NmIdBottom;                 //#define NM_CAN_ID_BOTTOM 0x4FF
	volatile unsigned char NmIdOwn;                   //#define OWN_NODE_CHL0 0x04
	volatile unsigned char NmLastSendPDUType;         //NM_LastSend_PDU_Type
	volatile unsigned char NmDestination;             //NM_Destination
	volatile unsigned int NmCanLastId;                //NM_LAST_ID
	volatile unsigned int NmRxErrCount;               //NM_rx_err_count                                          
	volatile unsigned int NmTxErrCount;               //NM_tx_err_count
	volatile unsigned char NmTxState;                 //NM_TX_STATE
	volatile unsigned char NmRxState;                 //NM_RX_STATE
	volatile unsigned char NmErrState;                //NM_ER_STATE
	volatile unsigned char NmRxLimit;                 //#define NM_RX_LIMIT 4
	volatile unsigned char NmTxLimit;                 //#define NM_TX_LIMIT 8 
	volatile unsigned int NmTimeType;                 //#define NM_Time_Type 100
	volatile unsigned int NmTimeMax;                  //#define NM_Time_Max 260
	volatile unsigned int NmTimeError;                //#define NM_Time_Error 1000
	volatile unsigned int NmTimeWaitBusSleep;         //#define NM_Time_WaitBusSleep 1500
	volatile unsigned int NmTimeRequestSleepInd;      //#define NM_Time_RequestSleepInd 5000
	volatile unsigned char NmTimeRequestLimpSleepInd; //#define NM_Time_RequestLimpSleepInd 4
	volatile _NM_BusOffCtlInfo NmBusOffCtrl;          //NM_BusOffCtl;
  volatile unsigned char NmLimpHomeTxCnt;           //LimpHomeTxCnt
  volatile unsigned char NmResetContinueCallCnt;    //NM_ResetContinueCallCnt
  volatile _SleepStatus NmSleep;                    //NM_Sleep
  volatile _MarkerStatus NmMarker;                  //NM_Marker
  volatile unsigned int NmSleepRequestMin;          //NM_tSleepRequestMin;
  volatile _NMPDU NmRecvPdu;                        //NM_RPDU receive PDU buf
  volatile _NMPDU NmSendPdu;                        //NM_SPDU send PDU buf  
  
	volatile unsigned int NmIdBuf;                    //NM_ID_BUF
  volatile _NMPDU NmPduBuf;                         //NM_PDU_BUF
  
  volatile _NM_TimeInfo NmTime;                     //NM_Time
  void (*NM_Main_Program)(void);
  void (*NMInitReset_Program)(void);
  void (*NMReset_Program)(void);
  
	volatile unsigned char NmIGNState;                //NM_IGN_State
                                       
  volatile unsigned char AppMsgSendRequest;
  volatile _AppMsgTime AppMsg[20];
}OSEK_NM_PARA;

extern OSEK_NM_PARA NmPara;


void InitNM(OSEK_NM_INIT *NmInit);
void SetTxState(unsigned char n);
void SetRxState(unsigned char n);
void SetErrState(unsigned char n);

#endif