Full Motion Detection
Lab 5: ระบบ Motion Detection สมบูรณ์
วัตถุประสงค์
รวมทุกฟังก์ชันเข้าด้วยกัน
เพิ่ม Event Counting และ Statistics
สร้างระบบ Motion Detection ที่ใช้งานได้จริง
5.1 เพิ่ม Statistics Structure
/* Motion Statistics */
typedef struct {
uint32_t stationary_count;
uint32_t light_count;
uint32_t moderate_count;
uint32_t intense_count;
float max_magnitude;
float min_magnitude;
uint32_t total_samples;
} motion_stats_t;
static motion_stats_t g_stats = {0};
/*******************************************************************************
* Function Name: stats_init
******************************************************************************/
static void stats_init(motion_stats_t *stats)
{
memset(stats, 0, sizeof(motion_stats_t));
stats->min_magnitude = 100.0f; /* Start high */
stats->max_magnitude = 0.0f;
}
/*******************************************************************************
* Function Name: stats_update
*******************************************************************************
* Summary:
* อัพเดท statistics จากการอ่านค่า sensor
******************************************************************************/
static void stats_update(motion_stats_t *stats,
motion_state_t state,
float magnitude)
{
stats->total_samples++;
/* Count by state */
switch (state)
{
case MOTION_STATIONARY: stats->stationary_count++; break;
case MOTION_LIGHT: stats->light_count++; break;
case MOTION_MODERATE: stats->moderate_count++; break;
case MOTION_INTENSE: stats->intense_count++; break;
}
/* Track min/max */
if (magnitude > stats->max_magnitude)
{
stats->max_magnitude = magnitude;
}
if (magnitude < stats->min_magnitude)
{
stats->min_magnitude = magnitude;
}
}
/*******************************************************************************
* Function Name: stats_print
*******************************************************************************
* Summary:
* แสดงสรุปสถิติทุก N samples
******************************************************************************/
static void stats_print(const motion_stats_t *stats)
{
if (stats->total_samples == 0) return;
printf("\n========== Motion Statistics ==========\n");
printf("Total Samples: %lu\n", stats->total_samples);
printf("Stationary: %lu (%.1f%%)\n",
stats->stationary_count,
(100.0f * stats->stationary_count / stats->total_samples));
printf("Light: %lu (%.1f%%)\n",
stats->light_count,
(100.0f * stats->light_count / stats->total_samples));
printf("Moderate: %lu (%.1f%%)\n",
stats->moderate_count,
(100.0f * stats->moderate_count / stats->total_samples));
printf("Intense: %lu (%.1f%%)\n",
stats->intense_count,
(100.0f * stats->intense_count / stats->total_samples));
printf("Min Magnitude: %.3f m/s² (%.2f g)\n",
(double)stats->min_magnitude,
(double)(stats->min_magnitude / GRAVITY_EARTH));
printf("Max Magnitude: %.3f m/s² (%.2f g)\n",
(double)stats->max_magnitude,
(double)(stats->max_magnitude / GRAVITY_EARTH));
printf("========================================\n\n");
}5.2 Main Loop สมบูรณ์
5.3 Output ที่คาดหวัง
จบ Session 2 | ต่อไป: Session 3: LVGL Display
Last updated
Was this helpful?