mirror of
https://github.com/google/pebble.git
synced 2025-05-04 00:41:40 -04:00
150 lines
6.6 KiB
C
150 lines
6.6 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "health_service.h"
|
|
#include "event_service_client.h"
|
|
#include "services/normal/activity/activity.h"
|
|
|
|
typedef struct {
|
|
HealthValue totals[ACTIVITY_HISTORY_DAYS];
|
|
} HealthServiceDailyHistory;
|
|
|
|
typedef struct {
|
|
int32_t sum;
|
|
int32_t avg;
|
|
int32_t min;
|
|
int32_t max;
|
|
int32_t count;
|
|
} HealthServiceStats;
|
|
|
|
typedef struct {
|
|
HealthServiceStats weekday; // weekday stats
|
|
HealthServiceStats weekend; // weekend stats
|
|
HealthServiceStats weekly; // weekly stats
|
|
HealthServiceStats daily; // daily stats
|
|
} HealthServiceMetricStats;
|
|
|
|
// The number of session we choose to store is arbitrary and taken from other examples
|
|
// today. Typically, there should be less than 10 or so.
|
|
#define HEALTH_SERVICE_MAX_ACTIVITY_SESSIONS 16
|
|
|
|
// Information required to support health metric alerts
|
|
typedef struct {
|
|
HealthValue threshold; // the threshold
|
|
HealthValue prior_reading; // the prior reading
|
|
} HealthServiceMetricAlertInfo;
|
|
|
|
typedef struct {
|
|
uint32_t cur_day_id; // Current day ID, used for cache validation
|
|
|
|
// These are intraday step averages
|
|
DayInWeek step_averages_day; // which day in the week the step averages are for
|
|
ActivityMetricAverages step_averages; // intraday step averages
|
|
|
|
// We cache the daily step totals since that metric is very likely to be requested by a
|
|
// client. The other metrics we fetch only on an as-needed basis
|
|
HealthServiceDailyHistory steps_daily;
|
|
|
|
// Storage for fetched activity sessions
|
|
ActivitySession sessions[HEALTH_SERVICE_MAX_ACTIVITY_SESSIONS];
|
|
|
|
// Storage for fetching minute history
|
|
HealthMinuteData minute_data[MINUTES_PER_HOUR];
|
|
|
|
// Metric alert thresholds. 0 if not set.
|
|
HealthServiceMetricAlertInfo alert_threshold_heart_rate;
|
|
|
|
union {
|
|
struct {
|
|
uint16_t step_averages_valid:1;
|
|
uint16_t step_daily_valid:1;
|
|
uint16_t reserved:14;
|
|
};
|
|
uint16_t valid_flags;
|
|
};
|
|
} HealthServiceCache;
|
|
|
|
typedef struct HealthServiceState {
|
|
HealthEventHandler event_handler;
|
|
void *context;
|
|
HealthServiceCache *cache;
|
|
EventServiceInfo health_event_service_info;
|
|
} HealthServiceState;
|
|
|
|
// initializes all static data, does not allocate a cache
|
|
void health_service_state_init(HealthServiceState *state);
|
|
|
|
// deallocates the cache (if it was allocated)
|
|
void health_service_state_deinit(HealthServiceState *state);
|
|
|
|
// helper struct for representing utc-based ranges on a per-day granularity including fractions
|
|
typedef struct {
|
|
uint32_t last_day_idx; // last intersected day of this range (0=today, 1=yesterday, ...)
|
|
uint32_t num_days; // number of intersected days for this range
|
|
uint32_t seconds_first_day; // number of seconds on the oldest intersected day for this range
|
|
uint32_t seconds_last_day; // number of seconds on the youngest intersected day for this range
|
|
uint32_t seconds_total_last_day; // total number of seconds available on the youngest i. day
|
|
} HealthServiceTimeRange;
|
|
|
|
|
|
// since we expect clients to allocate this struct on the stack we make sure its size is limited
|
|
_Static_assert(sizeof(HealthServiceTimeRange) <= 160, "Helper struct too large for stack");
|
|
|
|
// Return the daily history of the given metric
|
|
bool health_service_private_get_metric_history(HealthMetric metric, uint32_t history_len,
|
|
int32_t *history);
|
|
|
|
// wrapper around sys_activity_get_metric() to simplify migration of FW apps by indirectly
|
|
// giving access to ActivityMetricSleepEnterAtSeconds and ActivityMetricSleepExitAtSeconds
|
|
bool health_service_private_get_yesterdays_sleep_activity(HealthValue *enter_sec,
|
|
HealthValue *exit_sec);
|
|
|
|
// Utility callback function that can be used for the stats_calculate_basic() call. This
|
|
// particular callback returns true for all non-zero items.
|
|
// @param index the index of the daily total we are processing (0 = today, 1 = yesterday, etc.)
|
|
// @param value the value of the given daily total
|
|
// @tm_weekday_ref the context argument passed to the stats_calculate_basic() call, which
|
|
// in this case is ignored
|
|
bool health_service_private_non_zero_filter(int index, int32_t value, void *tm_weekday_ref);
|
|
|
|
// Utility callback function that can be used for the stats_calculate_basic() call. This
|
|
// particular callback returns true for weekdays (Mon-Fri).
|
|
// @param index the index of the daily total we are processing (0 = today, 1 = yesterday, etc.)
|
|
// @param value the value of the given daily total
|
|
// @tm_weekday_ref the context argument passed to the stats_calculate_basic() call, which
|
|
// in this case is the day of the week (Sunday, Monday, etc.) of index 0 in the daily totals,
|
|
// typecast to a ptr.
|
|
bool health_service_private_weekday_filter(int index, int32_t value, void *tm_weekday_ref);
|
|
|
|
// Utility callback function that can be used for the stats_calculate_basic() call. This
|
|
// particular callback returns true for weekend days (Sat-Sun).
|
|
// @param index the index of the daily total we are processing (0 = today, 1 = yesterday, etc.)
|
|
// @param value the value of the given daily total
|
|
// @tm_weekday_ref the context argument passed to the stats_calculate_basic() call, which
|
|
// in this case is the day of the week (Sunday, Monday, etc.) of index 0 in the daily totals,
|
|
// typecast to a ptr.
|
|
bool health_service_private_weekend_filter(int index, int32_t value, void *tm_weekday_ref);
|
|
|
|
// Utility callback function that can be used for the stats_calculate_basic() call. This
|
|
// particular callback returns true for only days of the week that match tm_weekday_ref
|
|
// @param index the index of the daily total we are processing (0 = today, 1 = yesterday, etc.)
|
|
// @param value the value of the given daily total
|
|
// @tm_weekday_ref the context argument passed to the stats_calculate_basic() call, which
|
|
// in this case is the day of the week (Sunday, Monday, etc.) of index 0 in the daily totals,
|
|
// typecast to a ptr.
|
|
bool health_service_private_weekly_filter(int index, int32_t value, void *tm_weekday_ref);
|