/*******************************************************************************
********************************************************************************
**
**  Copyright(c) 2022, Alliance for Automotive Innovation
**  Used only under license from the Alliance for Automotive Innovation. All Rights Reserved.
**
**  Project:  J1699-3
**  FileName: DisconnectProtocol.c
**  Author:   EnGenius
**  Date:     2/25/2022
**  Email:    <support@autosinnovate.org>
**
**  Purpose:  SAE J1699-3 Vehicle OBD II Compliance Test Cases Source Code.
**            This source code is intended to run the tests described in
**            the SAE J1699-3 document in an automated manner, when compiled
**            and used with an SAE J2534-compatible pass-thru device.
**
**            File j1699.c contains information on building and running this test.
**
**  Description:
**
**  Modifications:  12/07/2022  Initial Version
**
********************************************************************************
*******************************************************************************/

#include <stdio.h>    // C Library input and output declarations
#include <stdlib.h>   // C Library general function declarations
#include <time.h>     // C Library time and date declarations
#include <windows.h>  // Windows API declarations
#include "j2534.h"    // j1699 project j2534 declarations
#include "j1699.h"    // j1699 project general declarations


/*******************************************************************************
**
**  Function:  DisconnectOBDProtocol
**
**  Purpose:   Disconnect a protocol
**
*******************************************************************************/
STATUS DisconnectOBDProtocol ( void )
{
	STATUS eRetVal;
	STATUS eRetCode = PASS;


	// Turn off all filters and periodic messages before disconnecting
	if ( (eRetVal = PassThruIoctl ( gstProtocolList[gProtocolIdx].ChannelID,
	                                CLEAR_MSG_FILTERS,
	                                NULL,
	                                NULL )) != STATUS_NOERROR )
	{
		// If determining protocol,
		// don't print to the screen j2534 device error caused by incorrect number of ecus entered by user
		if ( eRetVal == ERR_DEVICE_NOT_CONNECTED &&
		     gbProtocolDetermined == FALSE )
		{
			Log ( J2534_FAILURE, SCREENOUTPUTOFF, LOGOUTPUTON, NO_PROMPT,
			      "%s returned %ld",
			      "PassThruDisconnect",
			      eRetVal );
		}
		else
		{
			Log ( J2534_FAILURE, SCREENOUTPUTON, LOGOUTPUTON, NO_PROMPT,
			      "%s returned %ld",
			      "PassThruIoctl(CLEAR_MSG_FILTERS)",
			      eRetVal );
		}
		eRetCode = FAIL;
	}

	StopPeriodicMsg ( FALSE );

	// Disconnect protocol
	if ( (eRetVal = PassThruDisconnect ( gstProtocolList[gProtocolIdx].ChannelID )) != STATUS_NOERROR )
	{
		// If determining protocol,
		// don't print to the screen j2534 device error caused by incorrect number of ecus entered by user
		if ( (eRetVal == ERR_DEVICE_NOT_CONNECTED ||
		      gstProtocolList[gProtocolIdx].ChannelID == 0) &&
		     gbProtocolDetermined == FALSE )
		{
			Log ( J2534_FAILURE, SCREENOUTPUTOFF, LOGOUTPUTON, NO_PROMPT,
			      "%s returned %ld",
			      "PassThruDisconnect",
			      eRetVal );
		}
		else
		{
			Log ( J2534_FAILURE, SCREENOUTPUTON, LOGOUTPUTON, NO_PROMPT,
			      "%s returned %ld",
			      "PassThruDisconnect",
			      eRetVal );
		}
		eRetCode = FAIL;
	}

	return eRetCode;
}
