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?