shake detector rpts on change, ActivityClassifer enable bugfix, removed
circle detector
This commit is contained in:
parent
fe9c1922ad
commit
1f48d4602a
|
|
@ -92,7 +92,6 @@ class BNO08x
|
|||
BNO08xRptStabilityClassifier stability_classifier;
|
||||
BNO08xRptShakeDetector shake_detector;
|
||||
BNO08xRptTapDetector tap_detector;
|
||||
BNO08xRptCircleDetector circle_detector;
|
||||
|
||||
bno08x_reports_t(BNO08xPrivateTypes::bno08x_sync_ctx_t* sync_ctx)
|
||||
: accelerometer(SH2_ACCELEROMETER, BNO08xPrivateTypes::EVT_GRP_RPT_ACCELEROMETER_BIT, sync_ctx)
|
||||
|
|
@ -122,7 +121,6 @@ class BNO08x
|
|||
SH2_STABILITY_CLASSIFIER, BNO08xPrivateTypes::EVT_GRP_RPT_STABILITY_CLASSIFIER_BIT, sync_ctx)
|
||||
, shake_detector(SH2_SHAKE_DETECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_SHAKE_DETECTOR_BIT, sync_ctx)
|
||||
, tap_detector(SH2_TAP_DETECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_TAP_DETECTOR_BIT, sync_ctx)
|
||||
, circle_detector(SH2_CIRCLE_DETECTOR, BNO08xPrivateTypes::EVT_GRP_RPT_CIRCLE_DETECTOR_BIT, sync_ctx)
|
||||
{
|
||||
}
|
||||
} bno08x_reports_t;
|
||||
|
|
@ -226,7 +224,6 @@ class BNO08x
|
|||
{SH2_STABILITY_CLASSIFIER, &rpt.stability_classifier},
|
||||
{SH2_SHAKE_DETECTOR, &rpt.shake_detector},
|
||||
{SH2_TAP_DETECTOR, &rpt.tap_detector},
|
||||
{SH2_CIRCLE_DETECTOR, &rpt.circle_detector},
|
||||
|
||||
// not implemented, see include/report for existing implementations to add your own
|
||||
{SH2_PRESSURE, nullptr}, // requires auxilary i2c sensor
|
||||
|
|
@ -243,6 +240,7 @@ class BNO08x
|
|||
{SH2_SLEEP_DETECTOR, nullptr},
|
||||
{SH2_TILT_DETECTOR, nullptr},
|
||||
{SH2_POCKET_DETECTOR, nullptr},
|
||||
{SH2_CIRCLE_DETECTOR, nullptr},
|
||||
{SH2_IZRO_MOTION_REQUEST, nullptr}
|
||||
};
|
||||
// clang-format on
|
||||
|
|
|
|||
|
|
@ -21,4 +21,3 @@
|
|||
#include "BNO08xRptStabilityClassifier.hpp"
|
||||
#include "BNO08xRptShakeDetector.hpp"
|
||||
#include "BNO08xRptTapDetector.hpp"
|
||||
#include "BNO08xRptCircleDetector.hpp"
|
||||
|
|
@ -21,7 +21,7 @@ class BNO08xRptActivityClassifier : public BNO08xRpt
|
|||
}
|
||||
|
||||
bool enable(
|
||||
uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg) override;
|
||||
uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg) override;
|
||||
bno08x_activity_classifier_t get();
|
||||
BNO08xActivity get_most_likely_activity();
|
||||
void set_activities_to_enable(BNO08xActivityEnable activities_to_enable);
|
||||
|
|
|
|||
|
|
@ -1,31 +0,0 @@
|
|||
/**
|
||||
* @file BNO08xRptCircleDetector.hpp
|
||||
* @author Myles Parfeniuk
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "BNO08xRpt.hpp"
|
||||
|
||||
/**
|
||||
* @class BNO08xRptCircleDetector
|
||||
*
|
||||
* @brief Class to represent circle detector reports. (See Ref. Manual 6.40.2)
|
||||
*/
|
||||
class BNO08xRptCircleDetector : public BNO08xRpt
|
||||
{
|
||||
public:
|
||||
BNO08xRptCircleDetector(uint8_t ID, EventBits_t rpt_bit, BNO08xPrivateTypes::bno08x_sync_ctx_t* sync_ctx)
|
||||
: BNO08xRpt(ID, rpt_bit, sync_ctx)
|
||||
{
|
||||
}
|
||||
|
||||
bool enable(
|
||||
uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg = BNO08xPrivateTypes::default_sensor_cfg) override;
|
||||
uint16_t get();
|
||||
|
||||
private:
|
||||
void update_data(sh2_SensorValue_t* sensor_val) override;
|
||||
uint16_t data; ///< Total amount of circles detected.
|
||||
static const constexpr char* TAG = "BNO08xRptCircleDetector";
|
||||
};
|
||||
|
|
@ -1178,7 +1178,10 @@ bool BNO08x::disable_all_reports()
|
|||
attempts++;
|
||||
}
|
||||
|
||||
return true;
|
||||
if (attempts < TOTAL_RPT_COUNT)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1552,8 +1555,6 @@ esp_err_t BNO08x::re_enable_reports()
|
|||
continue;
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG, "Re-enabling. %d", rpt->ID);
|
||||
|
||||
if (rpt->rpt_bit & report_en_bits)
|
||||
{
|
||||
if (!rpt->enable(rpt->period_us))
|
||||
|
|
|
|||
|
|
@ -48,10 +48,8 @@ bool BNO08xRpt::rpt_enable(uint32_t time_between_reports, sh2_SensorConfig_t sen
|
|||
|
||||
// if not already enabled (ie user called this, not re_enable_reports())
|
||||
if (idx == -1)
|
||||
{
|
||||
ESP_LOGI(TAG, "ADDED: %d", ID);
|
||||
sync_ctx->en_report_ids.push_back(ID); // add report ID to enabled report IDs
|
||||
}
|
||||
|
||||
unlock_user_data();
|
||||
|
||||
return true;
|
||||
|
|
@ -102,10 +100,8 @@ bool BNO08xRpt::disable(sh2_SensorConfig_t sensor_cfg)
|
|||
period_us = 0UL; // update the period
|
||||
|
||||
if (idx != -1)
|
||||
{
|
||||
ESP_LOGW(TAG, "ERASED: %d", ID);
|
||||
sync_ctx->en_report_ids.erase(sync_ctx->en_report_ids.begin() + idx);
|
||||
}
|
||||
|
||||
unlock_user_data();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,94 +0,0 @@
|
|||
/**
|
||||
* @file BNO08xRptCircleDetector.cpp
|
||||
* @author Myles Parfeniuk
|
||||
*/
|
||||
|
||||
#define SCALE_Q(n) (1.0f / (1 << n))
|
||||
|
||||
#include "BNO08xRptCircleDetector.hpp"
|
||||
#include "esp_log.h"
|
||||
#include "math.h"
|
||||
|
||||
/**
|
||||
* @brief Enables circle detector reports such that the BNO08x begins sending them (only sends reports
|
||||
* when a circle gesture is detected).
|
||||
*
|
||||
* @param time_between_reports The period/interval of the report in microseconds.
|
||||
* @param sensor_cfg Sensor special configuration (optional, see
|
||||
* BNO08xPrivateTypes::default_sensor_cfg for defaults).
|
||||
*
|
||||
* @return True if report was successfully enabled.
|
||||
*/
|
||||
bool BNO08xRptCircleDetector::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg)
|
||||
{
|
||||
static bool configured = false;
|
||||
|
||||
sensor_cfg.changeSensitivity = 0U;
|
||||
sensor_cfg.changeSensitivityRelative = true;
|
||||
sensor_cfg.changeSensitivityEnabled = true;
|
||||
int op_success = SH2_ERR;
|
||||
|
||||
uint32_t settings[3] = {static_cast<uint32_t>(4.0f / SCALE_Q(24)), static_cast<uint32_t>(0.1f / SCALE_Q(30)),
|
||||
static_cast<uint32_t>((3.0f * M_PI) / SCALE_Q(25))};
|
||||
|
||||
if (!configured)
|
||||
{
|
||||
lock_sh2_HAL();
|
||||
op_success = sh2_setFrs(CIRCLE_DETECTOR_CONFIG, settings, 0U);
|
||||
unlock_sh2_HAL();
|
||||
|
||||
if (op_success != SH2_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "%d", op_success);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGE(TAG, "erased");
|
||||
}
|
||||
|
||||
lock_sh2_HAL();
|
||||
op_success = sh2_setFrs(CIRCLE_DETECTOR_CONFIG, settings, 3U);
|
||||
unlock_sh2_HAL();
|
||||
|
||||
if (op_success != SH2_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "%d", op_success);
|
||||
return false;
|
||||
}
|
||||
|
||||
configured = true;
|
||||
}
|
||||
|
||||
return BNO08xRpt::rpt_enable(time_between_reports, sensor_cfg);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Updates circle detector data from decoded sensor event.
|
||||
*
|
||||
* @param sensor_val The sh2_SensorValue_t struct used in sh2_decodeSensorEvent() call.
|
||||
*
|
||||
* @return void, nothing to return
|
||||
*/
|
||||
void BNO08xRptCircleDetector::update_data(sh2_SensorValue_t* sensor_val)
|
||||
{
|
||||
lock_user_data();
|
||||
data += sensor_val->un.circleDetector.circle;
|
||||
unlock_user_data();
|
||||
|
||||
if (rpt_bit & xEventGroupGetBits(sync_ctx->evt_grp_rpt_en))
|
||||
signal_data_available();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Grabs most recent circle detector detector data.
|
||||
*
|
||||
* @return Struct containing requested data;
|
||||
*/
|
||||
uint16_t BNO08xRptCircleDetector::get()
|
||||
{
|
||||
lock_user_data();
|
||||
uint16_t rqdata = data;
|
||||
unlock_user_data();
|
||||
return rqdata;
|
||||
}
|
||||
|
|
@ -24,7 +24,8 @@ void BNO08xRptShakeDetector::update_data(sh2_SensorValue_t* sensor_val)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Enables shake detector reports such that the BNO08x begins sending them.
|
||||
* @brief Enables shake detector reports such that the BNO08x begins sending them (only sends reports
|
||||
* when a shake is detected).
|
||||
*
|
||||
* @param report_period_us The period/interval of the report in microseconds.
|
||||
* @param sensor_cfg Sensor special configuration (optional, see
|
||||
|
|
@ -32,9 +33,11 @@ void BNO08xRptShakeDetector::update_data(sh2_SensorValue_t* sensor_val)
|
|||
*
|
||||
* @return True if report was successfully enabled.
|
||||
*/
|
||||
bool BNO08xRptShakeDetector::enable(
|
||||
uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg)
|
||||
bool BNO08xRptShakeDetector::enable(uint32_t time_between_reports, sh2_SensorConfig_t sensor_cfg)
|
||||
{
|
||||
sensor_cfg.changeSensitivityEnabled = true; // this must be set regardless of user cfg or no reports will be received
|
||||
sensor_cfg.changeSensitivity = 0U; // this must be set regardless of user cfg or no reports will be received
|
||||
|
||||
return BNO08xRpt::rpt_enable(time_between_reports, sensor_cfg);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue