/*******************************************************************************
* Function Name: sensor_hub_daq_task
*******************************************************************************
* Summary:
* Complete motion detection system with filter and statistics
******************************************************************************/
static void sensor_hub_daq_task(void *pvParameters)
{
TickType_t xLastWakeTime = 0;
const TickType_t xDelay = 100 / portTICK_PERIOD_MS; /* 10Hz */
float acc_x = 0.0f;
float acc_y = 0.0f;
float acc_z = 0.0f;
float magnitude = 0.0f;
float filtered_magnitude = 0.0f;
motion_state_t motion_state = MOTION_STATIONARY;
uint32_t print_counter = 0;
(void)pvParameters;
/* Initialize I2C */
initStatus = Cy_SCB_I2C_Init(CYBSP_I2C_CONTROLLER_HW,
&CYBSP_I2C_CONTROLLER_config,
&CYBSP_I2C_CONTROLLER_context);
if (CY_SCB_I2C_SUCCESS != initStatus)
{
handle_app_error();
}
Cy_SCB_I2C_Enable(CYBSP_I2C_CONTROLLER_HW);
result = mtb_hal_i2c_setup(&CYBSP_I2C_CONTROLLER_hal_obj,
&CYBSP_I2C_CONTROLLER_hal_config,
&CYBSP_I2C_CONTROLLER_context,
NULL);
if (CY_RSLT_SUCCESS != result)
{
handle_app_error();
}
/* Initialize BMI270 */
result = mtb_bmi270_init_i2c(&bmi270,
&CYBSP_I2C_CONTROLLER_hal_obj,
MTB_BMI270_ADDRESS_DEFAULT);
if (CY_RSLT_SUCCESS != result)
{
handle_app_error();
}
result = mtb_bmi270_config_default(&bmi270);
if (CY_RSLT_SUCCESS != result)
{
handle_app_error();
}
/* Initialize filter and statistics */
filter_init(&mag_filter);
stats_init(&g_stats);
/* Clear screen */
printf("\x1b[2J\x1b[;H");
printf("************************************************************\r\n");
printf(" PSOC Edge MCU: Complete Motion Detection System \r\n");
printf("************************************************************\r\n\r\n");
/* Initialize LED to OFF */
LED_OFF();
xLastWakeTime = xTaskGetTickCount();
for (;;)
{
/* Read sensor */
result = mtb_bmi270_read(&bmi270, &bmi270_data);
if (CY_RSLT_SUCCESS != result)
{
handle_app_error();
}
/* Convert to m/s² */
acc_x = lsb_to_mps2(bmi270_data.sensor_data.acc.x,
ACC_RANGE_2G,
bmi270.sensor.resolution);
acc_y = lsb_to_mps2(bmi270_data.sensor_data.acc.y,
ACC_RANGE_2G,
bmi270.sensor.resolution);
acc_z = lsb_to_mps2(bmi270_data.sensor_data.acc.z,
ACC_RANGE_2G,
bmi270.sensor.resolution);
/* Calculate magnitude */
magnitude = calculate_magnitude(acc_x, acc_y, acc_z);
/* Apply filter */
filtered_magnitude = filter_update(&mag_filter, magnitude);
/* Detect motion (use filtered value) */
motion_state = detect_motion(filtered_magnitude);
/* Update statistics */
stats_update(&g_stats, motion_state, magnitude);
/* Display current values */
printf("Acc: [%7.3f, %7.3f, %7.3f] m/s^2\r\n",
(double)acc_x, (double)acc_y, (double)acc_z);
printf("Mag: Raw=%6.3f, Flt=%6.3f m/s^2 | %s\r\n",
(double)magnitude,
(double)filtered_magnitude,
get_motion_string(motion_state));
/* LED feedback - Active LOW (PSoC Edge E84) */
switch (motion_state)
{
case MOTION_STATIONARY:
LED_OFF(); /* Set = OFF for Active LOW */
break;
case MOTION_LIGHT:
Cy_GPIO_Inv(CYBSP_USER_LED1_PORT, CYBSP_USER_LED1_PIN); /* Blink */
break;
case MOTION_MODERATE:
case MOTION_INTENSE:
LED_ON(); /* Clr = ON for Active LOW */
break;
}
/* Print statistics every STATS_REPORT_INTERVAL samples */
print_counter++;
if (print_counter >= STATS_REPORT_INTERVAL)
{
stats_print(&g_stats);
print_counter = 0;
}
/* Move cursor back for clean display */
printf("\x1b[2A");
/* Wait for UART */
while(!(Cy_SCB_UART_IsTxComplete(CYBSP_DEBUG_UART_HW))) {};
vTaskDelayUntil(&xLastWakeTime, xDelay);
}
}