UPM utilities library providing essential timing and delay functions for IoT sensor applications with cross-platform support for Linux and Zephyr operating systems. This utility library offers millisecond to nanosecond precision timing functions, monotonic clock-based duration measurements, and EPA-standard air quality index calculations.
#include <upm_utilities.h>The library automatically handles platform detection and uses appropriate timing mechanisms for Linux (POSIX clock functions) or Zephyr (kernel APIs).
#include <upm_utilities.h>
#include <stdio.h>
int main() {
// Basic delay operations
printf("Starting delays...\n");
upm_delay(1); // Wait 1 second
upm_delay_ms(500); // Wait 500 milliseconds
upm_delay_us(1000); // Wait 1000 microseconds
// Timing measurements
upm_clock_t start = upm_clock_init();
// Do some work...
upm_delay_ms(100);
// Measure elapsed time
uint64_t elapsed_ms = upm_elapsed_ms(&start);
uint64_t elapsed_us = upm_elapsed_us(&start);
printf("Elapsed: %llu ms, %llu us\n", elapsed_ms, elapsed_us);
// Air quality calculation
double pm25_concentration = 45.3; // μg/m³
int aqi = upm_ugm3_to_aqi(pm25_concentration);
printf("PM2.5: %.1f μg/m³ = %d AQI\n", pm25_concentration, aqi);
return 0;
}Cross-platform delay functions supporting multiple time resolutions from seconds to nanoseconds.
void upm_delay(uint32_t time);
void upm_delay_ms(uint32_t time);
void upm_delay_us(uint32_t time);
void upm_delay_ns(uint64_t time);upm_delay
time - Number of seconds to delayupm_delay_ms
time - Number of milliseconds to delayupm_delay_us
time - Number of microseconds to delayupm_delay_ns
time - Number of nanoseconds to delay// Sequential delays with different resolutions
upm_delay(2); // 2 seconds
upm_delay_ms(1500); // 1.5 seconds
upm_delay_us(500000); // 0.5 seconds
upm_delay_ns(100000000);// 0.1 secondsMonotonic clock-based timing functions for precise duration measurements unaffected by system time changes.
upm_clock_t upm_clock_init(void);
uint64_t upm_elapsed_ms(const upm_clock_t *clock);
uint64_t upm_elapsed_us(const upm_clock_t *clock);
uint64_t upm_elapsed_ns(const upm_clock_t *clock);upm_clock_init
upm_clock_t - Initialized clock structure for timing measurementsupm_elapsed_ms
clock - Pointer to upm_clock_t initialized by upm_clock_init()uint64_t - Number of milliseconds elapsed since clock initializationupm_elapsed_us
clock - Pointer to upm_clock_t initialized by upm_clock_init()uint64_t - Number of microseconds elapsed since clock initializationupm_elapsed_ns
clock - Pointer to upm_clock_t initialized by upm_clock_init()uint64_t - Number of nanoseconds elapsed since clock initialization// Measure execution time of operations
upm_clock_t timer = upm_clock_init();
// Perform some sensor operations
sensor_read_data();
process_sensor_data();
// Get timing measurements
uint64_t total_ms = upm_elapsed_ms(&timer);
uint64_t total_us = upm_elapsed_us(&timer);
uint64_t total_ns = upm_elapsed_ns(&timer);
printf("Operation took: %llu ms (%llu μs, %llu ns)\n",
total_ms, total_us, total_ns);EPA-standard air quality index calculation from PM2.5 concentration measurements.
int upm_ugm3_to_aqi(double ugm3);upm_ugm3_to_aqi
ugm3 - PM2.5 concentration in micrograms per cubic meterint - Calculated Air Quality Index (0-500 scale)The function implements the EPA formula: Ip = [(Ihi-Ilow)/(BPhi-BPlow)] × (Cp-BPlow) + Ilow
| AQI Range | Air Quality | PM2.5 (μg/m³) |
|---|---|---|
| 0-50 | Good | 0.0-12.0 |
| 51-100 | Moderate | 12.1-35.4 |
| 101-150 | Unhealthy for Sensitive Groups | 35.5-55.4 |
| 151-200 | Unhealthy | 55.5-150.4 |
| 201-300 | Very Unhealthy | 150.5-250.4 |
| 301-400 | Hazardous | 250.5-350.4 |
| 401-500 | Hazardous | 350.5-500.4 |
// Convert various PM2.5 readings to AQI
double readings[] = {10.5, 25.8, 45.2, 125.0, 275.3};
int num_readings = sizeof(readings) / sizeof(readings[0]);
for (int i = 0; i < num_readings; i++) {
int aqi = upm_ugm3_to_aqi(readings[i]);
printf("PM2.5: %.1f μg/m³ → AQI: %d\n", readings[i], aqi);
}
// Output:
// PM2.5: 10.5 μg/m³ → AQI: 44 (Good)
// PM2.5: 25.8 μg/m³ → AQI: 82 (Moderate)
// PM2.5: 45.2 μg/m³ → AQI: 124 (Unhealthy for Sensitive Groups)
// PM2.5: 125.0 μg/m³ → AQI: 190 (Unhealthy)
// PM2.5: 275.3 μg/m³ → AQI: 325 (Hazardous)typedef struct timespec upm_clock_t; // Linux platform
typedef uint64_t upm_clock_t; // Zephyr platformupm_clock_t
struct timespec with seconds and nanoseconds fieldsuint64_t hardware cycle counterupm_clock_init(), used with elapsed time functionsThe library provides unified APIs with platform-specific implementations:
Linux Platform:
clock_nanosleep() for signal-safe delaysCLOCK_MONOTONIC for reliable timing measurementsZephyr OS Platform:
k_timer or nano_timer)Language Bindings:
-lrt on some Linux systems for clock functions