This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/CC256XB-BT-SP: application crash

Part Number: CC256XB-BT-SP
Other Parts Discussed in Thread: TM4C129XNCZAD

Tool/software: Code Composer Studio

Hi,

Thanks for the reply

We have checked in the application side but we couldn't find solution.In the application side it is coming as "(server)' ~ Channel is unrecoverably broken and will be disposed".So we are not able to detect  why the channel is disposed.I am attaching the BTsnoop logs that we have taken.Can you please let me know what changes do we need to make either in embedded side or android side.So i an attaching the Bluetooth

servicemode.c
/*
 * Service_Mode.c
 *
 *  Created on: 13-Mar-2018
 *      Author: Adhitya GN
 */


/***************************************************************
*
* COPYRIGHT 2018, Vasmed Health Sciences Pvt. Ltd..
*
* Filename: Service_Mode.c
* Author:   Adhitya GN
* $Revision: -
* $Date: -
*
* Description:
*  All the codes related to service mode will be executed from here.
*
*
*****************************************************************/

#include "Main.h"
#include "Service_Mode.h"

#include <stdbool.h>
#include <stdint.h>

#include "inc/hw_memmap.h"
#include "driverlib/uart.h"
#include "driverlib/gpio.h"
#include "driverlib/watchdog.h"
#include "driverlib/sysctl.h"

#include "Battery_board.h"
#include "IBP.h"
#include "RJC.h"
#include "Keypad.h"
#include "SPPDEMO.h"


//*************************function declaration************************************************

Byte_t service_battery();
Byte_t service_ibp();
Byte_t service_rjc();
Byte_t service_keypad_00();
Byte_t service_keypad_01();
Byte_t service_baseboard();
Byte_t s_error_handler(bool , int , Byte_t );
void service_data_packet(void *UserParameter);

//----------------------------------------------------------------------------------------------


Byte_t s_adapter_connection_status(Byte_t);
Byte_t battery_connection_status(Byte_t);
Byte_t battery_adc_id(Byte_t);
Byte_t battery_charging_status(Byte_t);

Byte_t ibp_adc_id(Byte_t);
Byte_t ibp_mux_selection_0V(Byte_t);
Byte_t ibp_mux_selection_5V(Byte_t);
Byte_t ao_sensor_connection(Byte_t);
Byte_t haemodynamic_output(Byte_t);

Byte_t console_bluetooth_status(Byte_t);
Byte_t tablet_bluetooth_status(Byte_t);
Byte_t reset_reason(Byte_t,int,int);
Byte_t application_software_integrity_check(Byte_t);
bool reset_cause(int);

Byte_t reg_00_keys(Byte_t,int);
Byte_t defualt_keypad_00_01_circuitry(Byte_t);

Byte_t reg_01_keys(Byte_t,int);

Byte_t pd_sensor_connection(Byte_t);
Byte_t warm_up_status(Byte_t);
Byte_t temperature(Byte_t);
Byte_t heater_duty_cycle(Byte_t);
Byte_t maintenenace_required(Byte_t);
//Byte_t done_testing(Byte_t);

void rjc_sensor_value();

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


//********************************global variables*******************************************


int one_time_execute=0;
bool warm_up;
Byte_t sensor_name1;
Byte_t sensor_name2;
int done=0;
//********************************************************************************************


/*************************************************************
* Function:  service_battery()
*
* Description:  This is called by service_data_packet(). This is used to
* 				execute all of battery board functionality.
*
* Parameters:   NULL
*
* Returns:     value indicating the status of each battery test in a single byte.
*
* Reentrancy:  Yes.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_battery()
{
	Byte_t	l_s_battery=0;

	l_s_battery=s_adapter_connection_status(l_s_battery);
	//Display(("\n1=%x",l_s_battery));
	l_s_battery=battery_connection_status(l_s_battery);
	//Display(("\n2=%x",l_s_battery));
	l_s_battery=battery_adc_id(l_s_battery);
	//Display(("\n3=%x",l_s_battery));
	l_s_battery=battery_charging_status(l_s_battery);
	//Display(("\n4=%x",l_s_battery));
	//Display(("\n-l_s_battery= %x\n",l_s_battery));
	return(l_s_battery);
}

/*************************************************************
* Function:  service_ibp()
*
* Description:  This is called by service_data_packet(). This is used to
* 				execute all of ibp board functionality. For 0v calibration
* 				and 5v calibration, it can be executed only 3 times and
* 				store those values and from next time(after 3 times), directly
* 				send the values without executing 0v and 5v calibration.
*
* Parameters:   NULL
*
* Returns:     value indicating the status of each ibp board test in a single byte.
*
* Reentrancy:  Yes. During self_Test, and till self test finishes, this will keep on executing.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_ibp()												// need to test 5v and 0v calib for new ibp board. 26-7-18
{
	Byte_t	l_s_ibp=0;
	static bool retain_value_0V=0;
	static bool retain_value_5V=0;
	bool b;

	l_s_ibp=ibp_adc_id(l_s_ibp);

	if(	one_time_execute < 4 )										// for 0v calib
	{
		l_s_ibp=ibp_mux_selection_0V(l_s_ibp);						// 1st bit. execute this only 3 times.  when we select this
																	//channel, whether the adc values are coming in reference to 0v. if
																	// coming properly for 0v reference, then make it 1. else make it 0.
		if(one_time_execute >= 1)									// this variable will increment for first time in service_baseboard()
		{
			one_time_execute++;
			b=CHECK_BIT(l_s_ibp,1);									// check whether its 1 or 0. and retain it in variable for code
																	// life time as we need to send in each data packet.
			if(b==true)
			{
				retain_value_0V=true;								// if it is 1, store 1 in variable.
			}
			else
			{
				retain_value_0V=false;
			}
		}
	}
	else
	{
		l_s_ibp|=(retain_value_0V<<1); 								//put that above stored retain_value varaible in data packet.
	}

	l_s_ibp=ao_sensor_connection(l_s_ibp);
	l_s_ibp=haemodynamic_output(l_s_ibp);

	if( (one_time_execute > 3 ) & (one_time_execute < 7) )			//for 5v calib.. same method as used in 0v calibration.
	{
		l_s_ibp=ibp_mux_selection_5V(l_s_ibp);						//2nd bit. by changing the channel to select 5v, adc value is checked
																	//in reference with 5v and whether adc value is coming in that range
		one_time_execute++;
		b=CHECK_BIT(l_s_ibp,2);										// check whether its 1 or 0. and retain it in variable for code
																	// life time as we need to send in each data packet.
		if(b==true)
		{
			retain_value_5V=true;									// if it is 1, store 1 in variable.
		}
		else
		{
			retain_value_5V=false;
		}
	}
	else
	{
		l_s_ibp|=(retain_value_5V<<2); 								//put that above stored varaible in data packet.
	}

	//Display(("\n-l_s_ibp= %x\n",l_s_ibp));

	return(l_s_ibp);
}

/*************************************************************
* Function:  service_rjc()
*
* Description:  This is called by service_data_packet(). This is used to
* 				execute all of rjc board functionality.
*
* Parameters:   NULL
*
* Returns:      value indicating the status of each rjc board test in a single byte.
*
* Reentrancy:  Yes.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_rjc()
{
	Byte_t	l_s_rjc=0;
	service_data();
	l_s_rjc=pd_sensor_connection(l_s_rjc);
	l_s_rjc=warm_up_status(l_s_rjc);
	l_s_rjc=temperature(l_s_rjc);
	l_s_rjc=heater_duty_cycle(l_s_rjc);
	l_s_rjc=maintenenace_required(l_s_rjc);
	//l_s_rjc=done_testing(l_s_rjc);

	//Display(("\n-l_s_rjc= %x\n",l_s_rjc));
	return(l_s_rjc);
}


/*************************************************************
* Function:  service_keypad_00()
*
* Description:  This is called by service_data_packet(). This is used to get status
* 				 of keys in register keypad00 and status of two registers in keypad .
* 				 It will call two functions from this function. first function will
* 				 get the status of two registers in keypad. This is executed only once.
* 				 The second function will get the status of each key in the register 00.
*
* Parameters:   NULL
*
* Returns:      value indicating status of the keys from register 00 and status of
* 				both the registers in keypad..
*
* Reentrancy:   Yes.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_keypad_00()
{
	bool b;
	Byte_t	l_s_keypad_00=0;
	static bool retain_key00;
	static bool retain_key01;

	keypad_keys();

	if(one_time_execute==0)													// 2 and 3 bits, checking whether ff and f are coming.
	{
		l_s_keypad_00=defualt_keypad_00_01_circuitry(l_s_keypad_00);		// gets the status of the two register as a (ff and f)
																			//group(not individual key) and updated in ls_key.

		b=CHECK_BIT(l_s_keypad_00,2);										// check whether its 1 or 0. and retain it in variable for
																			// code life time as we need to send in each data packet.
		if(b==true)
		{
			retain_key00=true;												// if it is 1, store 1 in variable. If we get 'f', then 1.
		}
		else
		{
			retain_key00=false;												// if we dont get 'f', then 0 as that register has issue.
		}

		b=CHECK_BIT(l_s_keypad_00,3);										// check whether its 1 or 0. and retain it in variable for
																			// code life time as we need to send in each data packet.
		if(b==true)
		{
			retain_key01=true;												// if it is 1, store 1 in variable. If we get 'ff', then 1.
		}
		else
		{
			retain_key01=false;												// If we dont get 'ff', then 0.
		}

	}
	else
	{
		l_s_keypad_00|=(retain_key00<<2);									// whatever key status for two registers was retained
		l_s_keypad_00|=(retain_key01<<3);									// in above, put them here for the rest of the packets.
	}

	l_s_keypad_00=reg_00_keys(l_s_keypad_00,0);								// 0 bit	//enter	//2nd part

	// here ask user to press back. once back is pressed, 'd' will go. in tablet side,initially 'press' shud be there.if '0' is received,
	//that means it is pressed and this byte should be ignored from then onwards.
	//ex- back - 1)press it.... 2) if not pressed, nothing happens. 3)if pressed, in tab, changes to pressed and ok. 4)ignore this bit
	// from next time.

	l_s_keypad_00=reg_00_keys(l_s_keypad_00,1);								// 1 bit	// back	//2nd part.

	//Display(("\n-l_s_keypad_00= %x\n",l_s_keypad_00));

	return(l_s_keypad_00);
}


/*************************************************************
* Function:  service_keypad_01()
*
* Description:  This is called by service_data_packet(). This is used to get status
* 				 of keys in register keypad01. Since, the status of two register in
* 				 keypad is captured in function 'service_keypad_00', here we will
* 				 execute only status of keys in register 01.
*
* Parameters:   NULL
*
* Returns:      value indicating status of the keys from register 01
*
* Reentrancy:  Yes.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_keypad_01()
{
	Byte_t	l_s_keypad_01=0;
	keypad_keys();

	l_s_keypad_01=reg_01_keys(l_s_keypad_01,0);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,1);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,2);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,3);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,4);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,5);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,6);
	l_s_keypad_01=reg_01_keys(l_s_keypad_01,7);

	//Display(("\n-l_s_keypad_01= %x\n",l_s_keypad_01));

	return(l_s_keypad_01);
}

/*************************************************************
* Function:  service_baseboard()
*
* Description:  This is called by service_data_packet(). This is used to get status
* 				 of bluetooth and reset. The status of reset is executed only once as
* 				 the reset reasons will be cleared so that the reset reason can be
* 				 captured the next time.
*
* Parameters:   NULL
*
* Returns:      value indicating the status of baseboard.
*
* Reentrancy:  Yes.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

Byte_t service_baseboard()
{
	Byte_t	l_s_baseboard=0;

	l_s_baseboard=console_bluetooth_status(l_s_baseboard);
	l_s_baseboard=tablet_bluetooth_status(l_s_baseboard);

	if(one_time_execute==0)
	{
		l_s_baseboard=reset_reason(l_s_baseboard,3,2); 					//reset_reason
		l_s_baseboard=reset_reason(l_s_baseboard,0,3); 					//external_reset
		l_s_baseboard=reset_reason(l_s_baseboard,2,4);					//brown_out_reset
		l_s_baseboard=reset_reason(l_s_baseboard,12,6);					//hssr_reset
		one_time_execute++;
	}
	l_s_baseboard=application_software_integrity_check(l_s_baseboard);

	//Display(("\n-l_s_baseboard= %x\n",l_s_baseboard));
	return(l_s_baseboard);
}


/*************************************************************
* Function:  service_data_packet()
*
* Description: This function calls all the functions such as rjc, ibp,
* 				battery, baseboard and then forms the service packet and
* 				calls a function ProcessCommandLine3 which is in sppdemo.c
* 				which will send the service packet from console to tablet
*
* Parameters:   NULL
*
* Returns:		NULL
*
* Reentrancy:  Yes. This is scheduled in SPPDemo.c when tablet sends data
* 				to console to go to service mode.
*
* Execution Requirements/Assumptions: NULL
*
*************************************************************/

void service_data_packet(void *UserParameter)
{

	GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_3, GPIO_PIN_3);				//HARDWARE WATCHDOG
	GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_3, 0X00);					//HARDWARE WATCHDOG

	if(WatchdogIntStatus(WATCHDOG0_BASE, true)) 						// clear hardware watchdog timer.
	{
		WatchdogIntClear(WATCHDOG0_BASE);
	}

	//Display(("\nCame to service mode\n"));
	Byte_t s_data_packet[10];
	int var=0;

	Byte_t s_ibp;
	Byte_t s_battery;
	Byte_t s_rjc;
	Byte_t s_keypad_00;
	Byte_t s_keypad_01;
	Byte_t s_baseboard;
	Byte_t s_battery_percentage=battery_percentage_error_code;
	Byte_t s_temperature;
	Byte_t s_temperature_decimal;
	//Display(("\nbattery_percentage_error_code=%x\n",battery_percentage_error_code));

	s_battery=service_battery();
	s_ibp=service_ibp();
	s_rjc=service_rjc();
	s_keypad_00=service_keypad_00();
	s_keypad_01=service_keypad_01();
	s_baseboard=service_baseboard();

	//WARNING---------28-3-18-
	// if you want to see service mode packets(below), you have to uncomment rjc service_Data() also else battery flags will be error.
	//26-7-18-- test this once. maybe the above warning is not necessary.

	for(var=0;var<SERVICE_PACKET_SIZE;var++)
	{
		switch(var)
		{
			case 0:

				s_data_packet[var]=PACKET_SERVICE;								// to indicate that this is service mode packets.
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 1:

				s_data_packet[var]=s_battery;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 2:

				s_data_packet[var]=s_battery_percentage;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 3:

				s_data_packet[var]=s_ibp;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 4:

				s_data_packet[var]=s_baseboard;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 5:

				s_data_packet[var]=s_keypad_00;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 6:

				s_data_packet[var]=s_keypad_01;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 7:

				s_data_packet[var]=s_rjc;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 8:

				rjc_sensor_value();
				s_data_packet[var]=sensor_name1;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 9:

				s_data_packet[var]=sensor_name2;
				//Display(("\nvar=%d, s_data_packet[var]=%x",var,s_data_packet[var]));
				break;

			case 10:

				s_temperature=g_temperature/10;
				s_data_packet[var]=s_temperature;
				//Display(("\nvar=%d, s_data_packet_decimal[var]=%d",var,s_data_packet[var]));
				break;

			case 11:

				s_temperature_decimal=g_temperature%10;
				s_data_packet[var]=s_temperature_decimal;
				//Display(("\nvar=%d, s_data_packet_Decimal[var]=%d\n",var,s_data_packet[var]));
				break;

			default:
				break;
		}
	}

	ProcessCommandLine3(s_data_packet,SERVICE_PACKET_SIZE);
}


/*************************************************************
* Function:  s_error_handler()
*
* Description:  This is the function where the status of each board/function's variable,
* 				bit by bit is updated in the variable. This variable is of form
* 				'Byte' is used to form data packet and send to table over bluetooth.
* 				 Refer the document to know which position represents which error.
*
* Parameters:   first parameter- the value which is written in the error_handler variable
* 				second parameter- the position where the value is written in the error_handler
* 				varaiable
* 				third parametr- the variable where each board's status has to be updated.
*
* Returns:      null
*
* Reentrancy:  Yes. Whenever the error of a certain board/module changes, this will
* 				be called.
*
* Execution Requirements/Assumptions: NULL
*
************************************************************* */


Byte_t s_error_handler(bool s_value, int s_position, Byte_t s_errors)
{
	s_errors|=(s_value<<s_position);
	//Display(("\n--errors= %x\n",s_errors));
	return(s_errors);

}

//------------------------------------------------------BYTE 1-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------

Byte_t s_adapter_connection_status(Byte_t l_s_battery)
{
	if(GPIOPinRead(GPIO_PORTS_BASE, GPIO_PIN_6))					// if this gpio pin reads high, then adapter is present.
	{
		l_s_battery=s_error_handler( true, 1 , l_s_battery);
	}
	else
	{
		l_s_battery=s_error_handler( false, 1 , l_s_battery);
	}
	return(l_s_battery);
}

Byte_t battery_connection_status(Byte_t l_s_battery)						// 26-7-18- need to test
{
	//int s_battery_connection=0;
	//s_battery_connection=battery_ilim_ain0_adc_calculation();
	//if( (s_battery_connection<1002) || (s_battery_connection > 2330) )	// commented 3 lines for old battery board. 26-7-18
	if( ilim_passing != 2 )
	{
		l_s_battery=s_error_handler( true, 2 , l_s_battery);				// battery is connected
	}
	else
	{
		l_s_battery=s_error_handler( false, 2 , l_s_battery);				// battery is not connected
	}
	return(l_s_battery);
}

Byte_t battery_adc_id(Byte_t l_s_battery)
{
	bool adc_id=false;
	adc_id=battery_board_self_test();
	if(adc_id==true)
	{
		l_s_battery=s_error_handler( true, 0 , l_s_battery);
	}
	else
	{
		l_s_battery=s_error_handler( false, 0 , l_s_battery);
	}
	return(l_s_battery);

}

Byte_t battery_charging_status(Byte_t l_s_battery)								// 26-7-18- need to test
{
	//int s_battery_charging=0;
	//s_battery_charging=battery_ilim_ain0_adc_calculation();					// commented 3 lines for old battery board. 26-7-18
	//if(s_battery_charging<1002)
	if( ilim_passing == 0 )														// bat not charging. AC off or bat is full.
	{
		l_s_battery=s_error_handler( false, 3 , l_s_battery);
	}
	//else if (s_battery_charging > 2100)
	else if( ilim_passing == 1 )												// bat is charging
	{
		l_s_battery=s_error_handler( true, 3 , l_s_battery);
	}
	else																		// if ilim=3, den bat nt connected & hence nt charging.
	{
		l_s_battery=s_error_handler( false, 3 , l_s_battery);
	}
	return(l_s_battery);

}


//------------------------------------------------------BYTE 1-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------



//------------------------------------------------------BYTE 2-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------
		// done in data packet section above.
//------------------------------------------------------BYTE 2-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------



//------------------------------------------------------BYTE 3-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------

Byte_t ibp_adc_id(Byte_t l_s_ibp)
{
	bool s_ibp_id=false;
	s_ibp_id=ibp_self_test();
	if(s_ibp_id==false)
	{
		l_s_ibp=s_error_handler( false, 0 , l_s_ibp);
	}
	else
	{
		l_s_ibp=s_error_handler( true, 0 , l_s_ibp);
	}
	return(l_s_ibp);
}


Byte_t ibp_mux_selection_0V(Byte_t l_s_ibp) 										//check for new adc. 26-7-18.
{
	int calib_zero;
	calib_zero=ibp_calib_zero();
	//Display(("\ncalib_zero-->%d\n",calib_zero));
	if( (calib_zero > 16775504) && (calib_zero < 16775935) )
	{
		l_s_ibp=s_error_handler( true, 1 , l_s_ibp);
	}
	else
	{
		l_s_ibp=s_error_handler( false, 1 , l_s_ibp);
	}
	return(l_s_ibp);

}


Byte_t ibp_mux_selection_5V(Byte_t l_s_ibp)											//check for new adc. 26-7-18
{
	int calib_five=0;
	calib_five=ibp_calib_five();
	if( (calib_five >= 8110000) && (calib_five <= 8125000) )							//7bea2d
	{
		l_s_ibp=s_error_handler( true, 2 , l_s_ibp);
	}
	else
	{
		l_s_ibp=s_error_handler( false, 2 , l_s_ibp);
	}
	return(l_s_ibp);
}


Byte_t ao_sensor_connection(Byte_t l_s_ibp)											//TODO , need consultants to tell their hardware
{
	bool s_ibp_sensor=true;
	if(s_ibp_sensor==false)
	{
		l_s_ibp=s_error_handler( false, 3 , l_s_ibp);
	}
	else
	{
		l_s_ibp=s_error_handler( true, 3 , l_s_ibp);
	}
	return(l_s_ibp);
}


Byte_t haemodynamic_output(Byte_t l_s_ibp)											//TODO, consultants input needed.
{
	bool s_ibp_haemo=true;
	//s_ibp_haemo=;
	if(s_ibp_haemo==false)
	{
		l_s_ibp=s_error_handler( false, 4 , l_s_ibp);
	}
	else
	{
		l_s_ibp=s_error_handler( true, 4 , l_s_ibp);
	}
	return(l_s_ibp);
}

//------------------------------------------------------BYTE 3-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------





//------------------------------------------------------BYTE 4-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------

Byte_t console_bluetooth_status(Byte_t l_s_baseboard)
{
	bool s_bt_status;
	s_bt_status=BtTest();

	if(s_bt_status==true)
	{
		l_s_baseboard=s_error_handler( true, 0 , l_s_baseboard);
	}
	else
	{
		l_s_baseboard=s_error_handler( false, 0 , l_s_baseboard);
	}
	return(l_s_baseboard);
}


Byte_t tablet_bluetooth_status(Byte_t l_s_baseboard)
{
	if(bt_g==true)
	{
		l_s_baseboard=s_error_handler( true, 1 , l_s_baseboard);
	}
	else
	{
		l_s_baseboard=s_error_handler( false, 1 , l_s_baseboard);
	}
	return(l_s_baseboard);
}


Byte_t reset_reason(Byte_t l_s_baseboard,int key_bit, int packet_bit)
{
	bool b;
	b=reset_cause(key_bit);														//4th byte. or 0,1,2,3....3
	if(b==true)
	{
		l_s_baseboard=s_error_handler( true, packet_bit , l_s_baseboard);
	}
	else
	{
		l_s_baseboard=s_error_handler( false, packet_bit , l_s_baseboard);
	}
	return(l_s_baseboard);
}


Byte_t application_software_integrity_check(Byte_t l_s_baseboard)	//todo
{
	bool b=false;
	if(b==true)
	{
		l_s_baseboard=s_error_handler( true, 5 , l_s_baseboard);
	}
	else
	{
		l_s_baseboard=s_error_handler( false, 5 , l_s_baseboard);
	}
	return(l_s_baseboard);
}


bool reset_cause(int y)
{
	uint32_t x;
	bool b;
	x=SysCtlResetCauseGet();
	//Display(("-reset reason==%x\n",x));
	b=CHECK_BIT(x,y);
	if(y==12)												// because 12 is the last value, I am checking. 12th bit
	{
		SysCtlResetCauseClear(x);							// clearing reset reason afer capturing all resets.
	}
	return(b);
}


//------------------------------------------------------BYTE 4-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------



//------------------------------------------------------BYTE 5-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------

Byte_t reg_00_keys(Byte_t l_s_key_00,int packet_bit)						// status of two keys in reg 00 and update in bit 0 and 1.
{
	bool b;
	b=CHECK_BIT(g_reg_00,packet_bit);
	if(b==true)
	{
		l_s_key_00=s_error_handler( true, packet_bit , l_s_key_00);			// if 1, then that key was not pressed.
	}
	else
	{
		l_s_key_00=s_error_handler( false, packet_bit , l_s_key_00);		// if 0, then that key was pressed.
	}
	return(l_s_key_00);
}


Byte_t defualt_keypad_00_01_circuitry(Byte_t l_s_key_00)		// status of two registers 00 and 01 as group(f and ff) in 2 and 3rd bit).
{
	int key;
	key=keypad_keys_self_test();							// gets status of two registers. whether ff and f is coming in two registers.

	if(key==ERR_KEYPAD_OK)
	{
		l_s_key_00=s_error_handler( true, 2 , l_s_key_00);		// if 'f' is coming, make 2nd bit as true. register 00.
		l_s_key_00=s_error_handler( true, 3 , l_s_key_00);		// if 'ff' is coming, make 3rd bit as true. register 01.
	}
	else if(key==ERR_KEYPAD_00_NOT_OK)
	{
		l_s_key_00=s_error_handler( false, 2 , l_s_key_00);
		l_s_key_00=s_error_handler( true, 3 , l_s_key_00);
	}
	else if(key==ERR_KEYPAD_01_NOT_OK)
	{
		l_s_key_00=s_error_handler( true, 2 , l_s_key_00);
		l_s_key_00=s_error_handler( false, 3 , l_s_key_00);
	}
	else if(key==ERR_KEYPAD_NOT_OK)
	{
		l_s_key_00=s_error_handler( false, 2 , l_s_key_00);
		l_s_key_00=s_error_handler( false, 3 , l_s_key_00);
	}
	return(l_s_key_00);											// return the value (2nd 3rd bit) whether those bits are true or false.
}




//------------------------------------------------------BYTE 5-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------



//------------------------------------------------------BYTE 6-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------

Byte_t reg_01_keys(Byte_t l_s_key_01, int packet_bit)
{
	bool b;
	b=CHECK_BIT(g_reg_01,packet_bit);
	if(b==true)
	{
		l_s_key_01=s_error_handler( true, packet_bit , l_s_key_01);
	}
	else
	{
		l_s_key_01=s_error_handler( false, packet_bit , l_s_key_01);
	}
	return(l_s_key_01);
}

//------------------------------------------------------BYTE 6-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------


//------------------------------------------------------BYTE 7-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------


Byte_t pd_sensor_connection(Byte_t l_s_rjc)	//todo
{
//	bool b=true;
//	if (i_dummy[4]==0x20)											// status flag-2	// works if data rate is adjusted.
//	{
//		b=CHECK_BIT(i_dummy[3],7);
//		if(b == true)												//sensor connected
//		{
//			l_s_rjc=s_error_handler( true, 0 , l_s_rjc);
//			return(l_s_rjc);
//		}
//		else
//		{															// normal
//			l_s_rjc=s_error_handler( false, 0 , l_s_rjc);
//			return(l_s_rjc);
//		}
//	}
//	else					//default is not connected.	//maybe wont come coz at 10, 11, 12 or anything else from 20, this will execute.
//	{
//		l_s_rjc=s_error_handler( false, 0 , l_s_rjc);
//		return(l_s_rjc);
//	}

	if(g_Pd[1] == RJC_IS_WARMING_UP) 								// this tells rjc is still warming up
	{
		l_s_rjc=s_error_handler( false, 0 , l_s_rjc);
	}
	else
	{
		l_s_rjc=s_error_handler( true, 0 , l_s_rjc);
	}
	return(l_s_rjc);
}


Byte_t warm_up_status(Byte_t l_s_rjc)	//todo
{
	//	bool b=true;
	//	if (i_dummy[4]==0x20)										// status flag-2	// works if data rate is adjusted.
	//	{
	//		b=CHECK_BIT(i_dummy[2],2);								// why 2 in last variable.? it's 10.--5-4-18
	//		if(b == true)											//warm up  completed
	//		{
	//			l_s_rjc=s_error_handler( true, 1 , l_s_rjc);
	//			return(l_s_rjc);
	//		}
	//		else
	//		{														// still warming up
	//			l_s_rjc=s_error_handler( false, 1 , l_s_rjc);
	//			return(l_s_rjc);
	//		}
	//	}
	//	else														// still warming up
	//	{
	//		l_s_rjc=s_error_handler( false, 1 , l_s_rjc);
	//		return(l_s_rjc);
	//	}
	if(g_Pd[1] == RJC_IS_WARMING_UP) 							// this tells rjc is still warming up
	{
		l_s_rjc=s_error_handler( false, 1 , l_s_rjc);
		warm_up=false;
	}
	else
	{
		l_s_rjc=s_error_handler( true, 1 , l_s_rjc);
		warm_up=true;												// need this for getting rjc sensor id.
	}
	return(l_s_rjc);
}


Byte_t temperature(Byte_t l_s_rjc) 												// page 125 of my book
{
	//if(warm_up==true)
	//{
		if (g_Pd[4]==0x80)
		{
			if(g_Pd[2] >= RJC_BOARD_47C)										// error as temperature is high
			{																	// high
				l_s_rjc=s_error_handler( false, 2 , l_s_rjc);
			}
			else
			{																	// normal
				l_s_rjc=s_error_handler( true, 2 , l_s_rjc);
			}
		}
		else																	//default is normal
		{
			l_s_rjc=s_error_handler( true, 2 , l_s_rjc);
		}
		return(l_s_rjc);
		//}
}


Byte_t heater_duty_cycle(Byte_t l_s_rjc)
{
//	if(warm_up==true)
//	{
		if (g_Pd[4]==0xA0)
		{
			if(g_Pd[2] >= RJC_DUTY_CYCLE)							// error as dc is 1. pg 124 of my book
			{															// dc= 1.0
				l_s_rjc=s_error_handler( false, 3 , l_s_rjc);
			}
			else
			{															// normal
				l_s_rjc=s_error_handler( true, 3 , l_s_rjc);
			}
		}
		else															//default is normal
		{
			l_s_rjc=s_error_handler( true, 3 , l_s_rjc);
		}
		return(l_s_rjc);
//	}
}


Byte_t maintenenace_required(Byte_t l_s_rjc)	//todo
{
	bool b=true;
	if (g_Pd[4]==0x20)												// status flag-2
	{
		b=CHECK_BIT(g_Pd[3],1);

		if(b == true)
		{
			l_s_rjc=s_error_handler( false, 4 , l_s_rjc);
		}
		else
		{																// normal
			l_s_rjc=s_error_handler( true, 4 , l_s_rjc);
		}
	}
	else																//default is normal
	{
		l_s_rjc=s_error_handler( true, 4 , l_s_rjc);
	}
	return(l_s_rjc);
}

//Byte_t done_testing(Byte_t l_s_rjc);
//{
//
//}


//------------------------------------------------------BYTE 7-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------


//------------------------------------------------------BYTE 8-----start-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------


void rjc_sensor_value()
{
	static bool execute_once=false;

	if(execute_once==false)
	{
		if(warm_up==true)										// only if warmup is over, I will get sensor value
		{
			execute_once=true;									// don't want to execute it multiple times.
		    UARTCharPutNonBlocking(UART1_BASE,0x01);			// for getting rfid user data//upper 16 bits
		    UARTCharPutNonBlocking(UART1_BASE,0x8D);			//397d to hex.//upper 16 bits
		    UARTCharPutNonBlocking(UART1_BASE,0x00);			//lower 16bits
		    UARTCharPutNonBlocking(UART1_BASE,0x00);			//lower 16bits
		    UARTCharPutNonBlocking(UART1_BASE,0x00);
		    UARTCharPutNonBlocking(UART1_BASE,0x51);
		    UARTCharPutNonBlocking(UART1_BASE,0xC2);			//3rd seq
		    UARTCharPutNonBlocking(UART1_BASE,0x13);

		    //Display(("\n-came here1\n"));

		    while(dummy1[4]!=0xC2)								// read from rjc till we get 'C2' packet as that has serial number.
		    {

		    }

		    //Display(("\n--came here2\n"));
	    	sensor_name1=dummy1[2];
	    	sensor_name2=dummy1[3];
		}
	}
}



//------------------------------------------------------BYTE 8-----end-------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------


btsnoop_hci (1).rar program below.

  • Hi,
    - Can you pls provide more test details ?
    - What MCU are you running ?
    - Are you able to share controller logs : processors.wiki.ti.com/.../CC256x_Logger_User_Guide

    Saurabh
  • Hi,
    I am using Tiva's TM4C129XNCZAD controller.
    In this project i am capturing the patient data from the sensors and sending the data to tablet using this Bluetooth.I am able to receive the data and sending this data to tablet.In the tablet side they have developed one app to receive the data.Problem is whenever the Bluetooth is connected and disconnected for several times ie. more than 10 minutes the application crash is happening .So in application side it is showing that channel couldn't able to recover.

    These are the error logs which we are getting from application side.So we have checked this error it is showing memory leakage is happening. We have doubt in which side memory leakage is happening is it in controller side or tablet side.So plz give me the solution for this.
    10-29 17:20:03.040 com.vasmedtech.ffr.debug A/libc: Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1), thread 12560 (Thread-749)
    10-29 17:20:03.580 system_process E/InputDispatcher: channel '423465f0 com.vasmedtech.ffr.debug/com.vasmedtech.ffr.init.SelfTestActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    10-29 17:20:03.580 system_process E/InputDispatcher: channel '4232f640 com.vasmedtech.ffr.debug/com.vasmedtech.ffr.settings.ServiceModePasswordActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    10-29 17:20:03.580 system_process E/InputDispatcher: channel '42352180 com.vasmedtech.ffr.debug/com.vasmedtech.ffr.patient.DetailActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    10-29 17:20:04.080 com.vasmedtech.ffr.debug E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering
    10-29 17:20:04.600 com.vasmedtech.ffr.debug E/MediaPlayer: Should have subtitle controller already set
    10-29 17:20:04.890 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:20:04.910 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1
    10-29 17:20:05.150 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:20:05.160 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1
    10-29 17:20:09.700 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:20:09.700 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1
    10-29 17:21:09.750 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:21:09.760 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1
    10-29 17:22:09.800 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:22:09.810 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1
    10-29 17:23:09.860 com.google.android.gms.persistent E/ctxmgr: [BaseServerTask]Failed network request due to no network connectivity:
    10-29 17:23:09.860 com.google.android.gms.persistent E/ctxmgr: [AccountAclCallback]Failed Acl fetch: network status=1


    Regards
    Chandana