O7/Core/Src/example_detector_distance.c

207 lines
8.1 KiB
C

// Copyright (c) Acconeer AB, 2020-2022
// All rights reserved
// This file is subject to the terms and conditions defined in the file
// 'LICENSES/license_acconeer.txt', (BSD 3-Clause License) which is part
// of this source code package.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "sys_app.h"
#include "acc_detector_distance.h"
#include "acc_hal_definitions.h"
#include "acc_hal_integration.h"
#include "acc_rss.h"
#include "acc_version.h"
#include "yunhorn_sts_sensors.h"
/** \example example_detector_distance.c
* @brief This is an example on how the distance detector can be used
* @n
* The example executes as follows:
* - Activate Radar System Software (RSS)
* - Create a distance detector configuration
* - Update the distance detector configuration
* - Create a distance detector using the previously updated configuration
* - Destroy the distance detector configuration
* - Activate the distance detector
* - Get the result and print it 5 times
* - Deactivate and destroy the distance detector
* - Deactivate Radar System Software (RSS)
*/
#define EXAMPLE_START_M (0.8f) //0.2f
#define EXAMPLE_LENGTH_M (1.4f) //0.4f
#define EXAMPLE_PROFILE ACC_SERVICE_PROFILE_2 //2
#define EXAMPLE_HWAAS (63) //63
extern volatile distance_measure_cfg_t distance_cfg; //={1.0, 3.0, 4, 63, 1, 10, 0.5, 1.3, 0.5};
extern float sts_distance_rss_distance;
static void update_configuration(acc_detector_distance_configuration_t distance_configuration);
static void print_configuration(acc_detector_distance_configuration_t distance_configuration);
static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count);
int acc_example_detector_distance(uint16_t *rss_distance);
int acc_example_detector_distance(uint16_t *rss_distance)
{
//(void)argc;
//(void)argv;
//APP_LOG(TS_OFF, VLEVEL_M, "Acconeer software version %s\n", acc_version_get());
const acc_hal_t *hal = acc_hal_integration_get_implementation();
#if 1
if (!acc_rss_activate(hal))
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_rss_activate() failed\n");
return EXIT_FAILURE;
}
#endif
acc_rss_override_sensor_id_check_at_creation(true);
acc_detector_distance_configuration_t distance_configuration = acc_detector_distance_configuration_create();
if (distance_configuration == NULL)
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_configuration_create() failed\n");
acc_rss_deactivate();
return EXIT_FAILURE;
}
///
// acc_detector_distance_handle_t distance_handle = acc_detector_distance_create(distance_configuration);
/*
if (distance_handle == NULL)
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_create() failed\n");
acc_detector_distance_configuration_destroy(&distance_configuration);
acc_rss_deactivate();
return EXIT_FAILURE;
}
*/
///
print_configuration(distance_configuration);
update_configuration(distance_configuration);
acc_detector_distance_handle_t distance_handle = acc_detector_distance_create(distance_configuration);
print_configuration(distance_configuration);
if (distance_handle == NULL)
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_create() failed\n");
acc_detector_distance_configuration_destroy(&distance_configuration);
acc_rss_deactivate();
return EXIT_FAILURE;
}
acc_detector_distance_configuration_destroy(&distance_configuration);
if (!acc_detector_distance_activate(distance_handle))
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_activate() failed\n");
acc_detector_distance_destroy(&distance_handle);
acc_rss_deactivate();
return EXIT_FAILURE;
}
bool success = true;
const int iterations = 6; //5;
uint16_t number_of_peaks = 5;
acc_detector_distance_result_t result[number_of_peaks];
acc_detector_distance_result_info_t result_info;
float sts_distance = 0.0f;
for (int i = 0; i < iterations; i++)
{
success = acc_detector_distance_get_next(distance_handle, result, number_of_peaks, &result_info);
if (!success)
{
APP_LOG(TS_OFF, VLEVEL_M, "acc_detector_distance_get_next() failed\n");
break;
}
sts_distance += result->distance_m;
print_distances(result, result_info.number_of_peaks);
HAL_Delay(20);
}
*rss_distance = (sts_distance*1000.0f)/iterations;
bool deactivated = acc_detector_distance_deactivate(distance_handle);
acc_detector_distance_destroy(&distance_handle);
acc_rss_deactivate();
if (deactivated && success)
{
APP_LOG(TS_OFF, VLEVEL_M, "Application finished OK\n");
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}
static void update_configuration(acc_detector_distance_configuration_t distance_configuration)
{
acc_detector_distance_configuration_requested_start_set(distance_configuration, EXAMPLE_START_M);// distance_cfg.start_m); //EXAMPLE_START_M);
acc_detector_distance_configuration_requested_length_set(distance_configuration, 3.0); //distance_cfg.length_m); //EXAMPLE_LENGTH_M);
acc_detector_distance_configuration_service_profile_set(distance_configuration, 2); //distance_cfg.acc_profile); //EXAMPLE_PROFILE);
acc_detector_distance_configuration_hw_accelerated_average_samples_set(distance_configuration, EXAMPLE_HWAAS); //distance_cfg.hwaas);//EXAMPLE_HWAAS);
//acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16);
//acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, 1);
//acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, 0.2);
#if 1
acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold);
acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average);
acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain);
acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling);
acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR);
acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16);
#endif
}
static void print_configuration(acc_detector_distance_configuration_t distance_configuration)
{
float sts_start = acc_detector_distance_configuration_requested_start_get(distance_configuration);
float sts_length = acc_detector_distance_configuration_requested_length_get(distance_configuration);
float sts_profile = acc_detector_distance_configuration_service_profile_get(distance_configuration);
float sts_hwaas = acc_detector_distance_configuration_hw_accelerated_average_samples_get(distance_configuration);
float sts_gain = acc_detector_distance_configuration_receiver_gain_get(distance_configuration);
float sts_threshold = acc_detector_distance_configuration_threshold_sensitivity_get(distance_configuration);
APP_LOG(TS_OFF, VLEVEL_M, "\r\nDistance CFG: start:%4d length:%4d profile:%2d HWAAS:%2d gain:%3d threshold:%6d \r\n",
(int)(sts_start*1000.0f), (int)(sts_length*1000.0f), (int)(sts_profile), (int)(sts_hwaas), (int)(sts_gain*100.0f), (int)(sts_threshold*1000.0f));
#if 0
acc_detector_distance_configuration_threshold_sensitivity_set(distance_configuration, distance_cfg.threshold);
acc_detector_distance_configuration_sweep_averaging_set(distance_configuration,distance_cfg.sweep_average);
acc_detector_distance_configuration_receiver_gain_set(distance_configuration,distance_cfg.gain);
acc_detector_distance_configuration_downsampling_factor_set(distance_configuration, distance_cfg.downsampling);
acc_detector_distance_configuration_threshold_type_set(distance_configuration, ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR);
acc_detector_distance_configuration_record_background_sweeps_set(distance_configuration, 16);
#endif
}
static void print_distances(acc_detector_distance_result_t *result, uint16_t reflection_count)
{
APP_LOG(TS_OFF, VLEVEL_M, "Found %u peaks:\n", (unsigned int)reflection_count);
for (uint16_t i = 0; i < reflection_count; i++)
{
APP_LOG(TS_OFF, VLEVEL_M, "Amplitude %u at %u mm\n", (unsigned int)result[i].amplitude,
(unsigned int)(result[i].distance_m * 1000));
}
}