blob: 2aaee9fad0d43d6fc17ef7abcfdce1eacdc3607d [file] [log] [blame]
/*
* Copyright (c) 2023 Benjamin Cabé <benjamin@zephyrproject.org>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/display.h>
#include <zephyr/drivers/sensor.h>
#include <lvgl.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(app, CONFIG_LOG_DEFAULT_LEVEL);
static lv_obj_t *chart1;
static lv_chart_series_t *ser_x;
static lv_chart_series_t *ser_y;
static lv_chart_series_t *ser_z;
static lv_timer_t *sensor_timer;
const struct device *accel_sensor;
/* Timer handler: fetches sensor data and appends it to the chart */
static void sensor_timer_cb(lv_timer_t *timer)
{
struct sensor_value accel[3];
int rc = sensor_sample_fetch(accel_sensor);
if (rc == 0) {
rc = sensor_channel_get(accel_sensor, SENSOR_CHAN_ACCEL_XYZ, accel);
}
if (rc < 0) {
LOG_ERR("ERROR: Update failed: %d\n", rc);
return;
}
lv_chart_set_next_value(chart1, ser_x, sensor_value_to_double(&accel[0]));
lv_chart_set_next_value(chart1, ser_y, sensor_value_to_double(&accel[1]));
lv_chart_set_next_value(chart1, ser_z, sensor_value_to_double(&accel[2]));
}
static void create_accelerometer_chart(lv_obj_t *parent)
{
chart1 = lv_chart_create(parent);
lv_obj_set_size(chart1, LV_HOR_RES, LV_VER_RES);
lv_chart_set_type(chart1, LV_CHART_TYPE_LINE);
lv_chart_set_div_line_count(chart1, 5, 8);
lv_chart_set_range(chart1, LV_CHART_AXIS_PRIMARY_Y, -20, 20); /* roughly -/+ 2G */
lv_chart_set_update_mode(chart1, LV_CHART_UPDATE_MODE_SHIFT);
ser_x = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_RED),
LV_CHART_AXIS_PRIMARY_Y);
ser_y = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_BLUE),
LV_CHART_AXIS_PRIMARY_Y);
ser_z = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_GREEN),
LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_point_count(chart1, CONFIG_SAMPLE_CHART_POINTS_PER_SERIES);
/* Do not display point markers on the data */
lv_obj_set_style_size(chart1, 0, LV_PART_INDICATOR);
}
int main(void)
{
const struct device *display_dev;
display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display_dev)) {
LOG_ERR("Device not ready, aborting test");
return -ENODEV;
}
accel_sensor = DEVICE_DT_GET(DT_ALIAS(accel0));
if (!device_is_ready(accel_sensor)) {
LOG_ERR("Device %s is not ready\n", accel_sensor->name);
return -ENODEV;
}
create_accelerometer_chart(lv_scr_act());
sensor_timer = lv_timer_create(sensor_timer_cb,
1000 / CONFIG_SAMPLE_ACCEL_SAMPLING_RATE,
NULL);
lv_task_handler();
display_blanking_off(display_dev);
while (1) {
k_msleep(lv_task_handler());
}
return 0;
}