/*******************************************************************************
* Function Name: sensor_hub_daq_task
*******************************************************************************
* Summary:
* FreeRTOS task that reads BMI270 sensor and displays magnitude
******************************************************************************/
static void sensor_hub_daq_task(void *pvParameters)
{
TickType_t xLastWakeTime = 0;
const TickType_t xDelay = 100 / portTICK_PERIOD_MS;
float acc_x = 0.0f;
float acc_y = 0.0f;
float acc_z = 0.0f;
float magnitude = 0.0f;
(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();
}
/* Clear screen */
printf("\x1b[2J\x1b[;H");
printf("************************************************************\r\n");
printf(" Lab 2-2: Acceleration Magnitude \r\n");
printf("************************************************************\r\n\r\n");
printf("Magnitude = sqrt(x^2 + y^2 + z^2)\r\n");
printf("Stationary: ~9.81 m/s^2 (1g)\r\n\r\n");
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);
/* Display results */
printf("Accelerometer:\r\n");
printf(" x: %9.6f m/s^2\r\n", (double)acc_x);
printf(" y: %9.6f m/s^2\r\n", (double)acc_y);
printf(" z: %9.6f m/s^2\r\n", (double)acc_z);
printf("\r\n");
printf("Magnitude: %9.6f m/s^2 (%.2f g)\r\n",
(double)magnitude,
(double)(magnitude / GRAVITY_EARTH));
/* Move cursor back for clean display */
printf("\x1b[6A");
/* Toggle LED to show activity */
Cy_GPIO_Inv(CYBSP_USER_LED1_PORT, CYBSP_USER_LED1_PIN);
/* Wait for UART */
while(!(Cy_SCB_UART_IsTxComplete(CYBSP_DEBUG_UART_HW))) {};
vTaskDelayUntil(&xLastWakeTime, xDelay);
}
}