int sts_presence_rss_fall_rise_detection(void)
{
	const acc_hal_t *hal = acc_hal_integration_get_implementation();

	if (!acc_rss_activate(hal))
	{
		APP_LOG(TS_OFF, VLEVEL_H,"Failed to activate RSS\n");
		return EXIT_FAILURE;
	}

	acc_rss_override_sensor_id_check_at_creation(true);

	acc_detector_presence_configuration_t presence_configuration = acc_detector_presence_configuration_create();
	if (presence_configuration == NULL)
	{
		APP_LOG(TS_OFF, VLEVEL_H,"Failed to create configuration\n");
		acc_rss_deactivate();
		return EXIT_FAILURE;
	}

	switch (sts_rss_config_updated_flag)
	{
	case STS_RSS_CONFIG_DEFAULT:
		set_default_configuration(presence_configuration);
		break;
	case STS_RSS_CONFIG_SIMPLE:
		sts_rss_set_current_configuration_simple(presence_configuration);
		APP_LOG(TS_OFF, VLEVEL_L,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n");

		break;
	case STS_RSS_CONFIG_FULL:
		sts_rss_set_current_configuration_full(presence_configuration);
		APP_LOG(TS_OFF, VLEVEL_L,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n");
		break;
	default:
		break;
	}
	sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; //update finished, set to 0

	acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration);
	if (handle == NULL)
	{
			APP_LOG(TS_OFF, VLEVEL_H,"Failed to create detector\n");
			acc_detector_presence_configuration_destroy(&presence_configuration);
			acc_detector_presence_destroy(&handle);
			acc_rss_deactivate();
			return EXIT_FAILURE;
	}

// ********  First Half detection of fall down and rise up
	if (!acc_detector_presence_activate(handle))
	{
		APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n");
		return false;
	}

	bool                           success    = true;
	const int                      iterations = (DEFAULT_UPDATE_RATE_PRESENCE+1);
	acc_detector_presence_result_t result;
	uint8_t	 average_result = 0;
	float average_distance =0.0f;
	float average_score =0.0f;
	for (int i = 0; i < (iterations/2); i++)
	{
		success = acc_detector_presence_get_next(handle, &result);
		if (!success)
		{
			APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n");
			break;
		}

		print_result(result);
		//if (!result.data_saturated)
		{
			if (result.presence_detected)
			{
				average_result++;
				average_distance += result.presence_distance;
				average_score += result.presence_score;
			}

				if (sts_presence_fall_detection == 1)
				{
					sts_motion_dataset[motion_count].presence_distance = result.presence_distance;
					sts_motion_dataset[motion_count].presence_score = result.presence_score;

					if (motion_count ++ == DEFAULT_MOTION_DATASET_LEN)
					{
						STS_YunhornCheckStandardDeviation();
						motion_count = 0;
					}
				}
			}

		acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); 				//	DEFAULT_UPDATE_RATE);
	}

	acc_detector_presence_deactivate(handle);
	APP_LOG(TS_OFF, VLEVEL_L,"First Half Presence Detection, Motion Count  = %u \r\n", (int)motion_count);

// ********  Second Half detection of fall down and rise up

	set_default_fall_rise_configuration(presence_configuration);

	if (!acc_detector_presence_reconfigure(&handle, presence_configuration))
	{
		APP_LOG(TS_OFF, VLEVEL_M,"Failed to reconfigure detector\n");
		acc_detector_presence_configuration_destroy(&presence_configuration);
		acc_detector_presence_destroy(&handle);
		acc_rss_deactivate();
		return EXIT_FAILURE;
	}


	if (!acc_detector_presence_activate(handle))
	{
		APP_LOG(TS_OFF, VLEVEL_H, "Failed to activate detector \n");
		return false;
	}
	acc_detector_presence_configuration_destroy(&presence_configuration);

	for (int i = 0; i < (iterations/2); i++)
	{
		success = acc_detector_presence_get_next(handle, &result);
		if (!success)
		{
			APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n");
			break;
		}

		print_result(result);
		//if (!result.data_saturated)
		{
			if (result.presence_detected)
			{
				average_result++;
				average_distance += result.presence_distance;
				average_score += result.presence_score;
			}

				if (sts_presence_fall_detection == 1)
				{
					sts_motion_dataset[motion_count].presence_distance = result.presence_distance;
					sts_motion_dataset[motion_count].presence_score = result.presence_score;

					if (motion_count ++ == DEFAULT_MOTION_DATASET_LEN)
					{
						STS_YunhornCheckStandardDeviation();
						motion_count = 0;
					}
				}
			}

		acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); 				//	DEFAULT_UPDATE_RATE);
	}

	APP_LOG(TS_OFF, VLEVEL_L,"Second Half, Fall Rise Detection, Motion Count  = %u \r\n", (int)motion_count);

	sts_rss_result = (average_result > 3)? 1: 0;
	average_distance = (1000.0f*average_distance)/average_result;		// in meters
	average_score = (1000.0f*average_score)/average_result;
	sts_presence_rss_distance = average_distance;
	sts_presence_rss_score = average_score;
	if (average_score !=0) //if (sts_rss_result)
	{
		APP_LOG(TS_OFF, VLEVEL_H,"\r\n######## Motion: %u   Distance=%u mm, Score=%u Average_result=%u out of %u \r\n",
				(uint8_t)sts_rss_result,(int) average_distance, (int)(average_score), (int)average_result, (int)iterations);
	}


	bool deactivated = acc_detector_presence_deactivate(handle);

	acc_detector_presence_destroy(&handle);

	acc_rss_deactivate();

	if (deactivated && success)
	{
		//APP_LOG(TS_OFF, VLEVEL_M,"Application finished OK\n");
		return EXIT_SUCCESS;
	}

	return EXIT_FAILURE;

}




int sts_presence_rss_presence_detection(void)
{
	const acc_hal_t *hal = acc_hal_integration_get_implementation();

	if (!acc_rss_activate(hal))
	{
		APP_LOG(TS_OFF, VLEVEL_H,"Failed to activate RSS\n");
		return EXIT_FAILURE;
	}

	acc_rss_override_sensor_id_check_at_creation(true);

	acc_detector_presence_configuration_t presence_configuration = acc_detector_presence_configuration_create();
	if (presence_configuration == NULL)
	{
		APP_LOG(TS_OFF, VLEVEL_H,"Failed to create configuration\n");
		acc_rss_deactivate();
		return EXIT_FAILURE;
	}

	switch (sts_rss_config_updated_flag)
	{
	case STS_RSS_CONFIG_DEFAULT:
		set_default_configuration(presence_configuration);
		break;
	case STS_RSS_CONFIG_SIMPLE:
		sts_rss_set_current_configuration_simple(presence_configuration);
		APP_LOG(TS_OFF, VLEVEL_L,"\r\n##### YUNHORN STS *** Simple *** cfg applied\n");

		break;
	case STS_RSS_CONFIG_FULL:
		sts_rss_set_current_configuration_full(presence_configuration);
		APP_LOG(TS_OFF, VLEVEL_L,"\r\n######### YUNHORN STS *** FULL *** cfg applied\n");
		break;
	default:
		break;
	}
	sts_rss_config_updated_flag = STS_RSS_CONFIG_DEFAULT; //update finished, set to 0

	acc_detector_presence_handle_t handle = acc_detector_presence_create(presence_configuration);
	if (handle == NULL)
	{
			APP_LOG(TS_OFF, VLEVEL_H,"Failed to create detector\n");
			acc_detector_presence_configuration_destroy(&presence_configuration);
			acc_detector_presence_destroy(&handle);
			acc_rss_deactivate();
			return EXIT_FAILURE;
	}

	acc_detector_presence_configuration_destroy(&presence_configuration);

	if (!acc_detector_presence_activate(handle))
	{
			APP_LOG(TS_OFF, VLEVEL_H,"Failed to activate detector\n");
			acc_detector_presence_destroy(&handle);
			acc_rss_deactivate();
			return EXIT_FAILURE;
	}

	bool                           success    = true;
	const int                      iterations = DEFAULT_UPDATE_RATE_PRESENCE;
	acc_detector_presence_result_t result;
	uint8_t	 average_result = 0;
	float average_distance =0.0f;
	float average_score =0.0f;
	for (int i = 0; i < iterations; i++)
	{
		success = acc_detector_presence_get_next(handle, &result);
		if (!success)
		{
			APP_LOG(TS_OFF, VLEVEL_H,"acc_detector_presence_get_next() failed\n");
			break;
		}

		print_result(result);
		//if (!result.data_saturated)
		{
			if (result.presence_detected)
			{
				average_result++;
				average_distance += result.presence_distance;
				average_score += result.presence_score;
			}

				if (sts_presence_fall_detection == 1)
				{
					sts_motion_dataset[motion_count].presence_distance = result.presence_distance;
					sts_motion_dataset[motion_count].presence_score = result.presence_score;

					if (motion_count ++ == DEFAULT_MOTION_DATASET_LEN)
					{
						STS_YunhornCheckStandardDeviation();
						motion_count = 0;
					}
				}
			}

		acc_integration_sleep_ms(1000 / DEFAULT_UPDATE_RATE_PRESENCE); 				//	DEFAULT_UPDATE_RATE);
	}

	sts_rss_result = (average_result > 3)? 1: 0;
	average_distance = (1000.0f*average_distance)/average_result;		// in meters
	average_score = (1000.0f*average_score)/average_result;
	sts_presence_rss_distance = average_distance;
	sts_presence_rss_score = average_score;
	if (average_score !=0) //if (sts_rss_result)
	{
		APP_LOG(TS_OFF, VLEVEL_H,"\r\n######## Motion: %u   Distance=%u mm, Score=%u Average_result=%u out of %u \r\n",
				(uint8_t)sts_rss_result,(int) average_distance, (int)(average_score), (int)average_result, (int)iterations);
	}

	bool deactivated = acc_detector_presence_deactivate(handle);

	acc_detector_presence_destroy(&handle);

	acc_rss_deactivate();

	if (deactivated && success)
	{
		//APP_LOG(TS_OFF, VLEVEL_M,"Application finished OK\n");
		return EXIT_SUCCESS;
	}

	return EXIT_FAILURE;
}