#ifndef icsneo40_API__h_
#define icsneo40_API__h_


#include "icsSpyData.h"
#include "icsnvc40.h"

//
// If borland c is defined we need to have "extern "c" added
// before each api call and a closing bracket after each api call
#ifdef BORLANDC
	#define BORLANDC_HEADER		extern "C" {
	#define BORLANDC_FOOTER		}
#else
	#define BORLANDC_HEADER	
	#define BORLANDC_FOOTER	
#endif


BORLANDC_HEADER void _stdcall icsneoGetISO15765Status(int hObject, 
									  int lNetwork,
									  int lClearTxStatus, 
									  int lClearRxStatus,  
									  int *lTxStatus, 
									  int *lRxStatus); BORLANDC_FOOTER


BORLANDC_HEADER void _stdcall  icsneoSetISO15765RxParameters(int hObject,
											 int lNetwork,
											 int lEnable,
										     spyFilterLong *pFF_CFMsgFilter,
											 icsSpyMessage *pTxMsg, 
											 int lCFTimeOutMs,
											 int lFlowCBlockSize,
											 int lUsesExtendedAddressing, 
											 int lUseHardwareIfPresent); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoGetSerialNumber(int hObject, unsigned int *iSerialNumber); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoFindAllUSBDevices(int lDriverType,
									 int iGetSerialNumbers,
									 int *iDevices, 
									 int *iSerialNumbers,
									 int *iOpenedStates,
									 int *iNumDevices); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoEnableNetworkCom(int hObject, int iEnable); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoEnableNetworkRXQueue(int hObject, int iEnable); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoOpenPortEx(int lPortNumber,
							  int lPortType, 
							  int lDriverType, 
							  int lIPAddressMSB, 
							  int lIPAddressLSBOrBaudRate, 
							  int bConfigRead,
							  unsigned char *bNetworkID, 
							  int * hObject); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoOpenPort(int lPortNumber, 
							int lPortType, 
							int lDriverType, 
					        unsigned char *bNetworkID, 
							unsigned char *bSCPIDs,  
							int * hObject); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoFindNeoDevices(unsigned long DeviceTypes, NeoDevice *pNeoDevice, int *pNumDevices); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoFindNeoDevicesEx(unsigned long DeviceTypes, 
									NeoDeviceEx *pNeoDeviceEx, 
									int *pNumDevices,
									const POptionsFindNeoEx pOptionsFindNeoEx); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoOpenNeoDevice(NeoDevice *pNeoDevice,	
								 int *hObject, 
								 unsigned char * bNetworkIDs,
								 int bConfigRead, 
								 int iOptions); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoOpenNeoDeviceEx(const NeoDeviceEx *pNeoDeviceEx,
								 int *hObject, 
							unsigned char * bNetworkIDs,
							int bConfigRead, 
							int iOptions,
							OptionsOpenNeoEx * stOptionsOpenNeoEx); BORLANDC_FOOTER

//This function is used by the Vector wrapper DLL and always uses the neoVI Server
BORLANDC_HEADER int _stdcall icsneoOpenNeoDeviceBySerialNumber(int SerialNumber,
											   int *hObject, 
											   int iOpenFastDeviceType, 
								               int bConfigRead,
								               int bSyncToPC); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoClosePort(int hObject, int * pNumberOfErrors); BORLANDC_FOOTER


BORLANDC_HEADER void _stdcall icsneoFreeObject(int hObject); BORLANDC_FOOTER


/**
 * @fn	int _stdcall icsneoSetContext(int hObject)
 *
 * @brief	Sets the "context" of how icsneoFindNeoDevices(Ex) and icsneoOpenNeoDevice(Ex)
 * 			function. If the context is 0 (null) than icsneoFindNeoDevices(Ex) will be system
 * 			wide, searching USB and other supported computer interfaces. icsneoFindNeoDevices can
 * 			then be used to connect to devices found in this manner. If the context is a handle
 * 			to connected CAN tool than icsneoFindNeoDevices(Ex) will search a specific CAN bus
 * 			for supported IntrepidCS CAN Nodes. Again icsneoOpenNeoDevice(Ex) would be used
 * 			create logical connections to found CAN Nodes.
 * 			
 * 			Example. 
 * 			
 *			// Context defaults to 0(system wide) on DLL load so no need to do this
 * 			icsneoSetContext(0);
 * 			
 * 			// finds USB device 
 *			icsneoFindNeoDevices(NEODEVICE_FIRE,neoDevice,&neo_cnt);
 * 			
 * 			// connect to USB device 
 *			icsneoOpenNeoDevice(neoDevice,&hObject,0,0,0,&stOptionsOpenNeoEx);
 * 			
 * 			icsneoSetContext(hObject); // Set Context to the USB device
 * 			
 * 			//Find CAN Nodes using FIRE, filter for neoECU
 * 			stOptionsFindNeoEx.CANOptions.iNetworkID = NETID_HSCAN;
 * 			icsneoFindNeoDevicesEx(NEODEVICE_ECU,neoDeviceEx,&neo_cnt,&stOptionsFindNeoEx);
 * 			
 *			// connect to the neoECU
 * 			stOptionsOpenNeoEx.CANOptions.iNetworkID = NETID_HSCAN;
 * 			icsneoOpenNeoDeviceEx(neoDeviceEx,&hCANObject,0,0,0,&stOptionsOpenNeoEx);	
 * 			
 *			// back to system context but hCANObject can be used any time for any API
 * 			SetContext(0); 
 * 			
 *			// load CoreMini To neoECU 
 * 			icsneoScriptLoad(	hCANObject,
 *								ExampleCoreMini,
 *								sizeof(ExampleCoreMini),
 * 								SCRIPT_LOCATION_FLASH_MEM); 
 *
 *			// Transmit Message request to FIRE. 
 * 			icsneoTxMessages(hObject, &Msg,NETID_HSCAN, 1); 
 *
 * @author	Ozrien
 * @date	9/9/2009
 *
 * @param	hObject	Handle to set context to, can be 0 for system wide(USB,TCPIP,etc...). 
 *
 * @return	1 if successfull, 0 if failed. 
 */
BORLANDC_HEADER int _stdcall icsneoSetContext(int hObject); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetMessages(int hObject, icsSpyMessage * pMsg, int * pNumberOfMessages,
							   int * pNumberOfErrors); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoTxMessages(int hObject, icsSpyMessage *pMsg,	int lNetworkID, int lNumMessages); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetErrorMessages(int hObject, int *pErrorMsgs, int *pNumberOfErrors); BORLANDC_FOOTER


//BORLANDC_HEADER int _stdcall icsneoGetCmdMessages(int hObject, icsneoVICommand *pCmdMsgs, int *pNumberOfCmds); BORLANDC_FOOTER


//BORLANDC_HEADER int _stdcall icsneoSendRawCmds(int hObject, icsneoVICommand * pCmdMsgs, int lNumOfCmds); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSendConfiguration(int hObject, unsigned char * pData, int lNumBytes); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetConfiguration(int hObject, unsigned char *pData, int *lNumBytes); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetFireSettings(int hObject, SFireSettings *pSettings, int iNumBytes); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetFireSettings(int hObject, SFireSettings *pSettings, int iNumBytes, int bSaveToEEPROM); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetVCAN3Settings(int hObject, SVCAN3Settings *pSettings, int iNumBytes); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetVCAN3Settings(int hObject, SVCAN3Settings *pSettings, int iNumBytes, int bSaveToEEPROM); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetYellowSettings(int hObject, SYellowSettings *pSettings, int iNumBytes); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetYellowSettings(int hObject, SYellowSettings *pSettings, int iNumBytes, int bSaveToEEPROM); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoStartSockServer(int hObject, int iPort); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoStopSockServer(int hObject); BORLANDC_FOOTER




BORLANDC_HEADER int _stdcall icsneoGetErrorInfo(int iErrorNumber,
								TCHAR *szErrorDescriptionShort,
								TCHAR *szErrorDescriptionLong,
								int *iMaxLengthShort,
								int *iMaxLengthLong,
								int *iErrorSeverity,
								int *iRestartNeeded); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetErrorInfoW(int iErrorNumber,
								 WCHAR *szErrorDescriptionShort,
								 WCHAR *szErrorDescriptionLong,
								 int *iMaxLengthShort,
								 int *iMaxLengthLong,
							  	 int *iErrorSeverity,
								 int *iRestartNeeded); BORLANDC_FOOTER




BORLANDC_HEADER int _stdcall icsneoGetDLLVersion(); BORLANDC_FOOTER

BORLANDC_HEADER void _stdcall icsneoGetDLLVersionEx(DWORD *dwMSVersion, DWORD *dwLSVersion); BORLANDC_FOOTER





BORLANDC_HEADER int _stdcall icsneoGetPerformanceParameters(int hObject, 
											int *iBufferCount, 
											int *iBufferMax, 
											int *iOverFlowCount, 
											int *iReserved1, 
											int *iReserved2,
											int *iReserved3,
											int *iReserved4,
											int *iReserved5); BORLANDC_FOOTER


double _stdcall icsneoGetPerformanceTimer(int hObject); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetupISO15765HwSupport(int hObject, 
										  int iNetIDCAN,
										  int iFilter, 
										  int iFilterMask,
										  int iFilterXtdCANID, 
										  int iFilterXtdAddress,
										  icsSpyMessage * p_stFlowControl, 
										  int iFlowControlXtdAddress,
										  int iEnableFCTransmit); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetupISO15765HwSupportEx(int hObject, int iNetIDCAN, int iFilter, int iFilterMask,
														  int iFilterXtdCANID, int iFilterXtdAddress,
														  icsSpyMessage * p_stFlowControl, int iFlowControlXtdAddress,int iEnableFCTransmit,
														  unsigned char CCPLength); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetPerformanceParameters(int hObject, 
											int iCOMReceiveMode, 
											int iCOMTxMode, 
											int iUSBReceiveMode, 
											int iUSBTxMode, 
											int iTxThreadPriority,
											int iRxThreadPriority,
											int iTxSleepMs,
											int iRxSleepMs); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoWaitForRxMessagesWithTimeOut(int hObject, unsigned int iTimeOut); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetOpenPorts(unsigned char * pBuf, unsigned long Size); BORLANDC_FOOTER




BORLANDC_HEADER int _stdcall icsneoFindFirstFreeDevice(int *iComPortNum, int *iSerialNumber, int *iDeviceType); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoForceFirmwareUpdate(int hObject); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetHWFirmwareInfo( int hObject, stAPIFirmwareInfo* pInfo ); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetDLLFirmwareInfo(int hObject, stAPIFirmwareInfo* pInfo); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoSetBitRate(int hObject, int BitRate, int NetworkID); BORLANDC_FOOTER



    
BORLANDC_HEADER int _stdcall icsneoSetBootloaderPromptEnable(int hObject,BOOL enable); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetBootloaderPromptCallback(int hObject, void (*OnPrompt)(unsigned long) ); BORLANDC_FOOTER
      

BORLANDC_HEADER int _stdcall icsneoReadSDCard(int hObject,unsigned long iSectorIndex,unsigned char *data, unsigned long *bytesRead); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoWriteSDCard(int hObject,unsigned long iSectorIndex,const unsigned char *data); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetTimeStampForMsg(int hObject, icsSpyMessage *pMsg, double *pTimeStamp); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetRTC(int hObject,const icsSpyTime *time); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetRTC(int hObject,icsSpyTime *time); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptStop(int hObject); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptStart(int hObject, int iLocation); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptLoad(int hObject, const unsigned char * bin, unsigned long len_bytes, int iLocation); BORLANDC_FOOTER 


BORLANDC_HEADER int _stdcall icsneoScriptClear(int hObject, int iLocation); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptStartFBlock(int hObject,unsigned int fb_index); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptStopFBlock(int hObject,unsigned int fb_index); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptGetFBlockStatus(int hObject, unsigned int fb_index, int *piStatus); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoScriptReadISO15765_2_TxMessage(int hObject, unsigned int iIndex, stCM_ISO157652_TxMessage *pTxMessage); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptWriteISO15765_2_TxMessage(int hObject, unsigned int iIndex,const stCM_ISO157652_TxMessage * pTxMessage); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptReadTxMessage(int hObject, unsigned int iIndex, icsSpyMessage *pTxMessage); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptWriteTxMessage(int hObject, unsigned int iIndex,const icsSpyMessage *pTxMessage); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptReadRxMessage(int hObject, unsigned int iIndex, icsSpyMessage *pTxMessageMask, icsSpyMessage *pTxMessageValue); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoScriptWriteRxMessage(int hObject, unsigned int iIndex,const icsSpyMessage *pTxMessageMask,const  icsSpyMessage *pTxMessageValue); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptReadAppSignal(int hObject, unsigned int iIndex,double * dValue); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptWriteAppSignal(int hObject, unsigned int iIndex,double dValue); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoScriptGetScriptStatus(int hObject, int *piStatus); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetLastAPIError(int hObject, unsigned long *pErrorNumber); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoValidateHObject(int hObject); BORLANDC_FOOTER




BORLANDC_HEADER int _stdcall icsneoInitTxRxApp(	int hObject,
						unsigned long timeout); BORLANDC_FOOTER 


BORLANDC_HEADER int _stdcall icsneoPerformTxRxPairs(	int hObject,
							icsSpyMessage * tx_msgs,
							icsSpyMessage * rx_msgs,
							icsSpyMessage * rx_mask_msgs,
							unsigned long msg_cnt); BORLANDC_FOOTER 


BORLANDC_HEADER int _stdcall icsneoClearApp(int hObject); BORLANDC_FOOTER 


BORLANDC_HEADER int _stdcall icsneoGetPerformanceStats(int hObject,SPerformanceStats * stPerformanceStats); BORLANDC_FOOTER 

BORLANDC_HEADER int _stdcall icsneoResetPerformanceStats(int hObject); BORLANDC_FOOTER 


BORLANDC_HEADER int _stdcall icsneoGetDeviceParameters(int hObject, char *pParameters, char *pValues, short ValuesLength); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoSetDeviceParameters(int hObject, char *pParmValue, int *pErrorIndex, int bSaveToEEPROM); BORLANDC_FOOTER


BORLANDC_HEADER void _stdcall icsneoSetReflashCallback( void(*OnReflashUpdate)(const wchar_t*,unsigned long) ); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoSetReflashDisplayCallbacks(void (*OnPrompt)(unsigned long),
											  void (*OnReflashUpdate)(const wchar_t*,unsigned long)); BORLANDC_FOOTER



BORLANDC_HEADER void _stdcall icsneoClearReflashDisplayCallbacks(void); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoTransmitISO15765_2_Message(int hObject, stCM_ISO157652_TxMessage *pTxMessage); BORLANDC_FOOTER




BORLANDC_HEADER int _stdcall icsneoEnable_ISO15765_2_By_Network(int hObject, unsigned int NetworkID, BOOL bDisableNormalMsgQueue); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoDisable_ISO15765_2(int hObject); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoSetISO15765_2_FlowCtlID(int hObject, int Index, unsigned int ID, unsigned int FC_ID, BOOL bIs29Bit,
                                           unsigned int BlockSize, unsigned int STMIN, unsigned int bIsExtAddr); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoClearISO15765_2_FlowCtlID(int hObject, int Index); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoClearAllISO15765_2_FlowCtlIDs(int hObject); BORLANDC_FOOTER

BORLANDC_HEADER int _stdcall icsneoLoadFirmwareToRam(int lPortNumber, int lPortType, 
									 int lDriverType,unsigned char * bFirmware, 
									 int iNumBytes, int iStartAddress); BORLANDC_FOOTER



BORLANDC_HEADER int _stdcall icsneoFindAllCOMDevices(int lDriverType,
									  int iGetSerialNumbers,
									  int iStopAtFirst,
									  int iUSBCommOnly,
									  int *iDeviceTypes, 
									  int *iComPorts,
									  int *iSerialNumbers,
									  int *iNumDevices); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall icsneoGetStoredFirmwareInfo(unsigned long NeoDeviceType, char *VersionInfo); BORLANDC_FOOTER


BORLANDC_HEADER int _stdcall FlashDevice(	unsigned long seed,
							NeoDevice *pNeoDevice,
							SReflashRequest * stReflashRequest,
							void (*MessageCallback)(const char * message,bool success) ); BORLANDC_FOOTER

#endif // icsneo40_API__h_




