mirror of
https://github.com/google/pebble
synced 2026-10-18 01:04:12 +02:00
Import of the watch repository from Pebble
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* 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);
|
||||
Reference in New Issue
Block a user