//-------------------------------------------------------------------
// This function library dynamically links the ADSmartIO library
// and library functions.
//
// Differences from documentation
// - Spelling
//     SIOBackLightVEEPwm -> SIOVeePwm (documentation is correct, .h file was not)
//     SIOBackLightPWM -> SIOBacklightPWM
//     SIOBackLightON -> SIOBacklightOn
//     SIOBackLightOFF -> SIOBacklightOff
//     SIOSetKeyPadSize -> SIOSetKeypadSize
// - Omitted
//     version 0x8003 functions
//
//
// 14nov02 20-11331 ADS/ak
// - initial release
//-------------------------------------------------------------------

#include "stdafx.h"
#include "ADSmartIO_load.h"

SIO_UINT_VOID		SIOFirmwareVersion, 
					SIOReadDeviceVersion, 
					SIOReadDevicePartType;
SIO_VOID_BYTE		SIOSelectOption;
SIOSETSSPTIMEOUT	SIOSetSSPTimeout;
SIO_VOID_BYTE		SIOInitDDRA,
					SIOInitDDRB, 
					SIOInitDDRC, 
					SIOInitDDRD;
SIO_VOID_BYTE		SIOWritePortA,
					SIOWritePortB, 
					SIOWritePortC, 
					SIOWritePortD;
SIO_UINT_VOID		SIOReadPortA, 
					SIOReadPortB, 
					SIOReadPortC, 
					SIOReadPortD;
SIO_VOID_BYTE		SIOVeePwm,
					SIOBacklightPwm;
SIO_VOID_VOID		SIOBacklightOn, 
					SIOBacklightOff;
SIO_UINT_VOID		SIOReadTemperature;
SIO_BOOL_2BYTE		SIOSetKeypadSize;
SIO_BYTE_VOID		SIOReadKeypad;
SIO_UINT_BYTE		SIOAnalogConversion;

//-------------------------------------------------------------------
// Tests a function to make sure it linked correctly.  
//
// Returns 0 if successful, 1 if failed.
// Gives debug messages about success or failure
//-------------------------------------------------------------------
int TestLink (void *fcnLink, LPWSTR fcnName)
{
	if (fcnLink == NULL)
	{
		DEBUGMSG (TRUE,(L"! Failed to link function %s.\r\n",fcnName));
		return 1;
	}
	else
	{
		DEBUGMSG (TRUE,(L"  Linked to function %s ok.\r\n",fcnName));
		return 0;
	}
}

//-------------------------------------------------------------------
// Loads the ADSmartIO library for the system.
// Links function library names to local function names.
//
// Returns number of functions that failed to link (0=full success)
//-------------------------------------------------------------------
int LoadADSmartIOFunctions()
{
  HINSTANCE gSIOLib = NULL;
  HINSTANCE gLibKEYBDDR = NULL;

  // 1. Load the DLL
	gSIOLib = LoadLibrary((L"SMARTIO.dll"));

	if(gSIOLib == NULL)
	{	
		gLibKEYBDDR = LoadLibrary((L"KEYBDDR.dll"));

		if(gLibKEYBDDR == NULL)
		{	
			RETAILMSG(TRUE,(L"\r\nFailed to load ADSmartIO library.\r\n"));
			return FALSE;
		}
		else
		{	
			DEBUGMSG(TRUE,(L"- Using KEYBDDR.DLL\r\n"));
			gSIOLib = gLibKEYBDDR;
		}
	}
	else
		DEBUGMSG(TRUE,(L"- Using SMARTIO.DLL\r\n"));

  // 2. Link function names to library

	SIOFirmwareVersion = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOFirmwareVersion")));
	SIOReadDeviceVersion = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadDeviceVersion")));
	SIOReadDevicePartType = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadDevicePartType")));

	SIOSelectOption = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOSelectOption")));
	SIOSetSSPTimeout = (SIOSETSSPTIMEOUT)GetProcAddress(gSIOLib,(_T("SIOSetSSPTimeout")));

	SIOInitDDRA = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOInitDDRA")));
	SIOInitDDRB = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOInitDDRB")));
	SIOInitDDRC = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOInitDDRC")));
	SIOInitDDRD = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOInitDDRD")));

	SIOWritePortA = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOWritePortA")));
	SIOWritePortB = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOWritePortB")));
	SIOWritePortC = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOWritePortC")));
	SIOWritePortD = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOWritePortD")));

	SIOReadPortA = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadPortA")));
	SIOReadPortB = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadPortB")));
	SIOReadPortC = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadPortC")));
	SIOReadPortD = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadPortD")));

	SIOVeePwm = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOBackLightVEEPwm")));
	SIOBacklightPwm = (SIO_VOID_BYTE)GetProcAddress(gSIOLib,(_T("SIOBackLightPwm")));
	SIOBacklightOn = (SIO_VOID_VOID)GetProcAddress(gSIOLib,(_T("SIOBackLightON")));
	SIOBacklightOff = (SIO_VOID_VOID)GetProcAddress(gSIOLib,(_T("SIOBackLightOFF")));

	SIOReadTemperature = (SIO_UINT_VOID)GetProcAddress(gSIOLib,(_T("SIOReadTemperature")));

	SIOSetKeypadSize = (SIO_BOOL_2BYTE)GetProcAddress(gSIOLib,(_T("SIOSetKeyPadSize")));
	SIOReadKeypad = (SIO_BYTE_VOID)GetProcAddress(gSIOLib,(_T("SIOReadKeypad")));

	SIOAnalogConversion = (SIO_UINT_BYTE)GetProcAddress(gSIOLib,(_T("SIOAnalogConversion")));


	// 3. Test each function link to make sure it is valid
	int LinkFailures = 0; 

	LinkFailures += TestLink(SIOFirmwareVersion, L"SIOFirmwareVersion");
	LinkFailures += TestLink(SIOReadDeviceVersion, L"SIOReadDeviceVersion");
	LinkFailures += TestLink(SIOReadDevicePartType, L"SIOReadDevicePartType");

	LinkFailures += TestLink(SIOSelectOption, L"SIOSelectOption");
	LinkFailures += TestLink(SIOSetSSPTimeout, L"SIOSetSSPTimeout");

	LinkFailures += TestLink(SIOInitDDRA, L"SIOInitDDRA");
	LinkFailures += TestLink(SIOInitDDRB, L"SIOInitDDRB");
	LinkFailures += TestLink(SIOInitDDRC, L"SIOInitDDRC");
	LinkFailures += TestLink(SIOInitDDRD, L"SIOInitDDRD");

	LinkFailures += TestLink(SIOWritePortA, L"SIOWritePortA");
	LinkFailures += TestLink(SIOWritePortB, L"SIOWritePortB");
	LinkFailures += TestLink(SIOWritePortC, L"SIOWritePortC");
	LinkFailures += TestLink(SIOWritePortD, L"SIOWritePortD");

	LinkFailures += TestLink(SIOReadPortA, L"SIOReadPortA");
	LinkFailures += TestLink(SIOReadPortB, L"SIOReadPortB");
	LinkFailures += TestLink(SIOReadPortC, L"SIOReadPortC");
	LinkFailures += TestLink(SIOReadPortD, L"SIOReadPortD");

	LinkFailures += TestLink(SIOVeePwm, L"SIOVeePwm");
	LinkFailures += TestLink(SIOBacklightPwm, L"SIOBacklightPwm");
	LinkFailures += TestLink(SIOBacklightOn, L"SIOBacklightOn");
	LinkFailures += TestLink(SIOBacklightOff, L"SIOBacklightOff");

	LinkFailures += TestLink(SIOReadTemperature, L"SIOReadTemperature");
	LinkFailures += TestLink(SIOSetKeypadSize, L"SIOSetKeypadSize");
	LinkFailures += TestLink(SIOReadKeypad, L"SIOReadKeypad");
	LinkFailures += TestLink(SIOAnalogConversion, L"SIOAnalogConversion");


	return LinkFailures;
}