mirror of
https://github.com/google/pebble.git
synced 2025-05-28 14:03:12 +00:00
852 lines
24 KiB
C
852 lines
24 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 "applib/accel_service.h"
|
|
#include "applib/app_launch_button.h"
|
|
#include "applib/app_launch_reason.h"
|
|
#include "applib/app_outbox.h"
|
|
#include "applib/app_smartstrap.h"
|
|
#include "applib/bluetooth/ble_client.h"
|
|
#include "applib/health_service.h"
|
|
#include "applib/plugin_service.h"
|
|
#include "applib/tick_timer_service.h"
|
|
#include "applib/voice/dictation_session.h"
|
|
#include "applib/ui/click.h"
|
|
#include "apps/system_apps/app_fetch_ui.h"
|
|
#include "drivers/battery.h"
|
|
#include "drivers/button_id.h"
|
|
#include "process_management/app_install_types.h"
|
|
#include "services/common/battery/battery_monitor.h"
|
|
#include "services/common/bluetooth/bluetooth_ctl.h"
|
|
#include "services/common/comm_session/session_remote_os.h"
|
|
#include "services/common/comm_session/session_remote_version.h"
|
|
#include "services/common/hrm/hrm_manager.h"
|
|
#include "services/common/put_bytes/put_bytes.h"
|
|
#include "services/common/touch/touch_event.h"
|
|
#include "services/imu/units.h"
|
|
#include "services/normal/accessory/smartstrap_profiles.h"
|
|
#include "services/normal/blob_db/api.h"
|
|
#include "services/normal/music.h"
|
|
#include "services/normal/notifications/notifications.h"
|
|
#include "services/normal/voice/voice.h"
|
|
#include "services/normal/wakeup.h"
|
|
#include "services/normal/timeline/peek.h"
|
|
#include "services/normal/timeline/reminders.h"
|
|
#include "kernel/pebble_tasks.h"
|
|
#include "util/attributes.h"
|
|
|
|
#include "freertos_types.h"
|
|
#include "portmacro.h"
|
|
|
|
#include <bluetooth/bluetooth_types.h>
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <time.h>
|
|
|
|
typedef struct PebblePhoneCaller PebblePhoneCaller;
|
|
|
|
typedef enum {
|
|
PEBBLE_NULL_EVENT = 0,
|
|
PEBBLE_ACCEL_SHAKE_EVENT,
|
|
PEBBLE_ACCEL_DOUBLE_TAP_EVENT,
|
|
PEBBLE_BT_CONNECTION_EVENT,
|
|
PEBBLE_BT_CONNECTION_DEBOUNCED_EVENT,
|
|
PEBBLE_BUTTON_DOWN_EVENT,
|
|
PEBBLE_BUTTON_UP_EVENT,
|
|
//! From kernel to app, ask the app to render itself
|
|
PEBBLE_RENDER_REQUEST_EVENT,
|
|
//! From app to kernel, ask the compositor to render the app
|
|
PEBBLE_RENDER_READY_EVENT,
|
|
//! From kernel to app, notification that render was completed
|
|
PEBBLE_RENDER_FINISHED_EVENT,
|
|
PEBBLE_BATTERY_CONNECTION_EVENT, // TODO: this has a poor name
|
|
PEBBLE_PUT_BYTES_EVENT,
|
|
PEBBLE_BT_PAIRING_EVENT,
|
|
// Emitted when the Pebble mobile app or third party app is (dis)connected
|
|
PEBBLE_COMM_SESSION_EVENT,
|
|
PEBBLE_MEDIA_EVENT,
|
|
PEBBLE_TICK_EVENT,
|
|
PEBBLE_SET_TIME_EVENT,
|
|
PEBBLE_SYS_NOTIFICATION_EVENT,
|
|
PEBBLE_PROCESS_DEINIT_EVENT,
|
|
PEBBLE_PROCESS_KILL_EVENT,
|
|
PEBBLE_PHONE_EVENT,
|
|
PEBBLE_APP_LAUNCH_EVENT,
|
|
PEBBLE_ALARM_CLOCK_EVENT,
|
|
PEBBLE_SYSTEM_MESSAGE_EVENT,
|
|
PEBBLE_FIRMWARE_UPDATE_EVENT,
|
|
PEBBLE_BT_STATE_EVENT,
|
|
PEBBLE_BATTERY_STATE_CHANGE_EVENT,
|
|
PEBBLE_CALLBACK_EVENT,
|
|
PEBBLE_NEW_APP_MESSAGE_EVENT,
|
|
PEBBLE_SUBSCRIPTION_EVENT,
|
|
PEBBLE_APP_WILL_CHANGE_FOCUS_EVENT,
|
|
PEBBLE_APP_DID_CHANGE_FOCUS_EVENT,
|
|
PEBBLE_DO_NOT_DISTURB_EVENT,
|
|
PEBBLE_REMOTE_APP_INFO_EVENT,
|
|
PEBBLE_ECOMPASS_SERVICE_EVENT,
|
|
PEBBLE_COMPASS_DATA_EVENT,
|
|
PEBBLE_PLUGIN_SERVICE_EVENT,
|
|
PEBBLE_WORKER_LAUNCH_EVENT,
|
|
PEBBLE_BLE_SCAN_EVENT,
|
|
PEBBLE_BLE_CONNECTION_EVENT,
|
|
PEBBLE_BLE_GATT_CLIENT_EVENT,
|
|
PEBBLE_BLE_DEVICE_NAME_UPDATED_EVENT,
|
|
PEBBLE_BLE_HRM_SHARING_STATE_UPDATED_EVENT,
|
|
PEBBLE_WAKEUP_EVENT,
|
|
PEBBLE_BLOBDB_EVENT,
|
|
PEBBLE_VOICE_SERVICE_EVENT,
|
|
PEBBLE_DICTATION_EVENT,
|
|
PEBBLE_APP_FETCH_EVENT,
|
|
PEBBLE_APP_FETCH_REQUEST_EVENT,
|
|
PEBBLE_GATHER_DEBUG_INFO_EVENT,
|
|
PEBBLE_REMINDER_EVENT,
|
|
PEBBLE_CALENDAR_EVENT,
|
|
PEBBLE_PANIC_EVENT,
|
|
PEBBLE_SMARTSTRAP_EVENT,
|
|
//! Event sent back to the app to let them know the result of their sent message.
|
|
PEBBLE_APP_OUTBOX_SENT_EVENT,
|
|
//! A request from the app to the outbox service to handle a message.
|
|
//! @note The consuming service must call app_outbox_service_consume_message() to clean up.
|
|
//! In case the event is dropped because the queue is reset, cleanup happens by events.c in
|
|
//! event_queue_cleanup_and_reset().
|
|
PEBBLE_APP_OUTBOX_MSG_EVENT,
|
|
PEBBLE_HEALTH_SERVICE_EVENT,
|
|
PEBBLE_TOUCH_EVENT,
|
|
PEBBLE_CAPABILITIES_CHANGED_EVENT,
|
|
// Emitted when ANCS disconnects or is invalidated
|
|
PEBBLE_ANCS_DISCONNECTED_EVENT,
|
|
PEBBLE_WEATHER_EVENT,
|
|
PEBBLE_HRM_EVENT,
|
|
PEBBLE_UNOBSTRUCTED_AREA_EVENT,
|
|
PEBBLE_APP_GLANCE_EVENT,
|
|
PEBBLE_TIMELINE_PEEK_EVENT,
|
|
PEBBLE_APP_CACHE_EVENT,
|
|
PEBBLE_ACTIVITY_EVENT,
|
|
PEBBLE_WORKOUT_EVENT,
|
|
|
|
PEBBLE_NUM_EVENTS
|
|
} PebbleEventType;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
AppOutboxSentHandler sent_handler;
|
|
void *cb_ctx;
|
|
AppOutboxStatus status:8;
|
|
} PebbleAppOutboxSentEvent;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
bool is_active; //<! ANCS has become active or has become inactive
|
|
} PebbleAncsChangedEvent;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
bool is_active; //<! do not disturb has become active or has become inactive
|
|
} PebbleDoNotDisturbEvent;
|
|
|
|
typedef struct PACKED { // 1 byte?
|
|
ButtonId button_id;
|
|
} PebbleButtonEvent;
|
|
|
|
typedef enum PhoneEventType {
|
|
PhoneEventType_Invalid = 0,
|
|
PhoneEventType_Incoming,
|
|
PhoneEventType_Outgoing,
|
|
PhoneEventType_Missed,
|
|
PhoneEventType_Ring,
|
|
PhoneEventType_Start,
|
|
PhoneEventType_End,
|
|
PhoneEventType_CallerID,
|
|
PhoneEventType_Disconnect,
|
|
PhoneEventType_Hide,
|
|
} PhoneEventType;
|
|
|
|
typedef enum PhoneCallSource {
|
|
PhoneCallSource_PP,
|
|
PhoneCallSource_ANCS_Legacy,
|
|
PhoneCallSource_ANCS,
|
|
} PhoneCallSource;
|
|
|
|
typedef struct PACKED PebblePhoneEvent { // 9 bytes
|
|
PhoneEventType type:6;
|
|
PhoneCallSource source:2;
|
|
uint32_t call_identifier;
|
|
PebblePhoneCaller* caller;
|
|
} PebblePhoneEvent;
|
|
|
|
typedef enum {
|
|
NotificationAdded,
|
|
NotificationActedUpon,
|
|
NotificationRemoved,
|
|
NotificationActionResult
|
|
} PebbleSysNotificationType;
|
|
|
|
typedef struct PACKED { // 6 bytes
|
|
PebbleSysNotificationType type:8;
|
|
union {
|
|
Uuid *notification_id;
|
|
PebbleSysNotificationActionResult *action_result;
|
|
// it won't exceed the 9 bytes
|
|
};
|
|
} PebbleSysNotificationEvent;
|
|
|
|
typedef struct PACKED { // 4 bytes
|
|
time_t tick_time; //!< Needs to be converted to 'struct tm' in the event service handler
|
|
} PebbleTickEvent;
|
|
|
|
typedef struct PACKED { // 4 bytes
|
|
uint32_t error_code;
|
|
} PebblePanicEvent;
|
|
|
|
typedef enum {
|
|
PebbleMediaEventTypeNowPlayingChanged,
|
|
PebbleMediaEventTypePlaybackStateChanged,
|
|
PebbleMediaEventTypeVolumeChanged,
|
|
PebbleMediaEventTypeServerConnected,
|
|
PebbleMediaEventTypeServerDisconnected,
|
|
PebbleMediaEventTypeTrackPosChanged,
|
|
} PebbleMediaEventType;
|
|
|
|
typedef struct PACKED { // 2 bytes
|
|
PebbleMediaEventType type;
|
|
union {
|
|
MusicPlayState playback_state;
|
|
uint8_t volume_percent;
|
|
};
|
|
} PebbleMediaEvent;
|
|
|
|
typedef enum {
|
|
PebbleBluetoothPairEventTypePairingUserConfirmation,
|
|
PebbleBluetoothPairEventTypePairingComplete,
|
|
} PebbleBluetoothPairEventType;
|
|
|
|
typedef struct PairingUserConfirmationCtx PairingUserConfirmationCtx;
|
|
|
|
typedef struct {
|
|
char *device_name;
|
|
char *confirmation_token;
|
|
} PebbleBluetoothPairingConfirmationInfo;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
const PairingUserConfirmationCtx *ctx;
|
|
union {
|
|
//! Valid if type is PebbleBluetoothPairEventTypePairingUserConfirmation
|
|
PebbleBluetoothPairingConfirmationInfo *confirmation_info;
|
|
//! Valid if type is PebbleBluetoothPairEventTypePairingComplete
|
|
bool success;
|
|
};
|
|
PebbleBluetoothPairEventType type:1;
|
|
} PebbleBluetoothPairEvent;
|
|
|
|
typedef enum {
|
|
PebbleBluetoothConnectionEventStateConnected,
|
|
PebbleBluetoothConnectionEventStateDisconnected,
|
|
} PebbleBluetoothConnectionEventState;
|
|
|
|
// FIXME: This event muddles classic + LE connection events for the phone.
|
|
typedef struct PACKED { // 9 bytes
|
|
PebbleBluetoothConnectionEventState state:1;
|
|
bool is_ble:1;
|
|
BTDeviceInternal device;
|
|
} PebbleBluetoothConnectionEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
uint8_t hci_reason;
|
|
BTBondingID bonding_id;
|
|
uint64_t bt_device_bits:50;
|
|
bool connected:1;
|
|
} PebbleBLEConnectionEvent;
|
|
|
|
typedef struct PACKED { // 4 bytes
|
|
int subscription_count;
|
|
} PebbleBLEHRMSharingStateUpdatedEvent;
|
|
|
|
typedef enum {
|
|
PebbleBLEGATTClientEventTypeServiceChange,
|
|
PebbleBLEGATTClientEventTypeCharacteristicRead,
|
|
PebbleBLEGATTClientEventTypeCharacteristicWrite,
|
|
PebbleBLEGATTClientEventTypeCharacteristicSubscribe,
|
|
PebbleBLEGATTClientEventTypeDescriptorRead,
|
|
PebbleBLEGATTClientEventTypeDescriptorWrite,
|
|
PebbleBLEGATTClientEventTypeNotification,
|
|
PebbleBLEGATTClientEventTypeBufferEmpty,
|
|
PebbleBLEGATTClientEventTypeNum,
|
|
} PebbleBLEGATTClientEventType;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
uintptr_t object_ref;
|
|
union {
|
|
uint16_t value_length;
|
|
BLESubscription subscription_type:2;
|
|
};
|
|
BLEGATTError gatt_error:16;
|
|
|
|
//! This is here to make sure we don't accidentally add more fields here without thinking:
|
|
uint16_t zero:2;
|
|
PebbleBLEGATTClientEventType subtype:6;
|
|
} PebbleBLEGATTClientEvent;
|
|
|
|
#define BLE_GATT_MAX_SERVICES_CHANGED_BITS (5) // max. 31
|
|
#define BLE_GATT_MAX_SERVICES_CHANGED ((1 << BLE_GATT_MAX_SERVICES_CHANGED_BITS) - 1)
|
|
|
|
#define BLE_GATT_CLIENT_EVENT_SUBTYPE_BITS (3)
|
|
|
|
typedef enum {
|
|
PebbleServicesRemoved,
|
|
PebbleServicesAdded,
|
|
PebbleServicesInvalidateAll
|
|
} PebbleServiceNotificationType;
|
|
|
|
typedef struct {
|
|
uint8_t num_services_added;
|
|
BLEService services[];
|
|
} PebbleBLEGATTClientServicesAdded;
|
|
|
|
typedef struct {
|
|
BLEService service;
|
|
Uuid uuid;
|
|
uint8_t num_characteristics;
|
|
uint8_t num_descriptors;
|
|
uintptr_t char_and_desc_handles[];
|
|
} PebbleBLEGATTClientServiceHandles;
|
|
|
|
typedef struct {
|
|
uint8_t num_services_removed;
|
|
PebbleBLEGATTClientServiceHandles handles[];
|
|
} PebbleBLEGATTClientServicesRemoved;
|
|
|
|
typedef struct {
|
|
PebbleServiceNotificationType type;
|
|
BTDeviceInternal device;
|
|
BTErrno status;
|
|
union {
|
|
PebbleBLEGATTClientServicesAdded services_added_data;
|
|
PebbleBLEGATTClientServicesRemoved services_removed_data;
|
|
};
|
|
} PebbleBLEGATTClientServiceEventInfo;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
PebbleBLEGATTClientServiceEventInfo *info;
|
|
uint64_t rsvd:34;
|
|
|
|
uint8_t subtype:BLE_GATT_CLIENT_EVENT_SUBTYPE_BITS;
|
|
} PebbleBLEGATTClientServiceEvent;
|
|
|
|
_Static_assert((1 << BLE_GATT_CLIENT_EVENT_SUBTYPE_BITS) >= PebbleBLEGATTClientEventTypeNum,
|
|
"Not enough bits to represent all PebbleBLEGATTClientEventTypes");
|
|
|
|
#ifdef __arm__
|
|
_Static_assert(sizeof(PebbleBLEGATTClientServiceEvent) == sizeof(PebbleBLEGATTClientServiceEvent),
|
|
"PebbleBLEGATTClientEvent and PebbleBLEGATTClientServiceEvent must be the same size");
|
|
#endif
|
|
|
|
#define PebbleEventToBTDeviceInternal(e) ((const BTDeviceInternal) { \
|
|
.opaque = { \
|
|
.opaque_64 = (e)->bt_device_bits \
|
|
} \
|
|
})
|
|
|
|
typedef struct PACKED { // 3 byte?
|
|
bool airplane;
|
|
bool enabled;
|
|
BtCtlModeOverride override;
|
|
} PebbleBluetoothStateEvent;
|
|
|
|
|
|
typedef enum {
|
|
PebblePutBytesEventTypeStart,
|
|
PebblePutBytesEventTypeCleanup,
|
|
PebblePutBytesEventTypeProgress,
|
|
PebblePutBytesEventTypeInitTimeout,
|
|
} PebblePutBytesEventType;
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
PebblePutBytesEventType type:8;
|
|
uint8_t progress_percent; // the percent complete for the current PB transfer
|
|
PutBytesObjectType object_type:7;
|
|
bool has_cookie:1;
|
|
bool failed;
|
|
union {
|
|
// if type != PebblePutBytesEventTypeCleanup, populated with:
|
|
uint32_t bytes_transferred; // the number of bytes transferred since the last event
|
|
// else populated with:
|
|
uint32_t total_size;
|
|
};
|
|
} PebblePutBytesEvent;
|
|
|
|
typedef struct PACKED { // 1 bytes
|
|
PreciseBatteryChargeState new_state;
|
|
} PebbleBatteryStateChangeEvent;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
bool is_connected;
|
|
} PebbleBatteryConnectionEvent;
|
|
|
|
typedef struct PACKED { // 5 bytes
|
|
int32_t magnetic_heading;
|
|
uint8_t calib_status;
|
|
} PebbleCompassDataEvent;
|
|
|
|
typedef struct PACKED { // 5 bytes
|
|
IMUCoordinateAxis axis;
|
|
int32_t direction;
|
|
} PebbleAccelTapEvent;
|
|
|
|
//! This is fired when a PP comm session is opened or closed
|
|
typedef struct PACKED PebbleCommSessionEvent { // 1 byte
|
|
//! indicates whether the we are connecting or disconnecting
|
|
bool is_open:1;
|
|
//! True if the pebble app has connected & false if a third-party app has connected
|
|
bool is_system:1;
|
|
} PebbleCommSessionEvent;
|
|
|
|
typedef struct PACKED { // 1 bytes
|
|
RemoteOS os;
|
|
} PebbleRemoteAppInfoEvent;
|
|
|
|
typedef enum {
|
|
PebbleSystemMessageFirmwareUpdateStartLegacy,
|
|
PebbleSystemMessageFirmwareUpdateStart,
|
|
PebbleSystemMessageFirmwareUpdateComplete,
|
|
PebbleSystemMessageFirmwareUpdateFailed,
|
|
PebbleSystemMessageFirmwareUpToDate,
|
|
PebbleSystemMessageFirmwareOutOfDate,
|
|
} PebbleSystemMessageEventType;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
PebbleSystemMessageEventType type;
|
|
uint32_t bytes_transferred;
|
|
uint32_t total_transfer_size;
|
|
} PebbleSystemMessageEvent;
|
|
|
|
//! We need to pass a lot of data to launch an app, more than what would normally fit in a
|
|
//! PebbleEvent. This structure is heap allocated whenever we need to launch an app.
|
|
typedef struct {
|
|
LaunchConfigCommon common;
|
|
WakeupInfo wakeup;
|
|
} PebbleLaunchAppEventExtended;
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
AppInstallId id;
|
|
PebbleLaunchAppEventExtended *data;
|
|
} PebbleLaunchAppEvent;
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
time_t alarm_time; //!< Needs to be converted to 'struct tm' in the event service handler
|
|
const char *alarm_label;
|
|
} PebbleAlarmClockEvent;
|
|
|
|
typedef void (*CallbackEventCallback)(void *data);
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
CallbackEventCallback callback;
|
|
void *data;
|
|
} PebbleCallbackEvent;
|
|
|
|
typedef struct PACKED { // 4 bytes
|
|
void* data;
|
|
} PebbleNewAppMessageEvent;
|
|
|
|
typedef struct PACKED { // 7 bytes
|
|
bool subscribe;
|
|
PebbleTask task:8;
|
|
PebbleEventType event_type;
|
|
void *event_queue;
|
|
} PebbleSubscriptionEvent;
|
|
|
|
typedef struct PACKED { // 2 bytes
|
|
bool gracefully;
|
|
PebbleTask task;
|
|
} PebbleKillEvent;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
bool in_focus;
|
|
} PebbleAppFocusEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
uint8_t type; // service event type
|
|
uint16_t service_index; // service index
|
|
PluginEventData data;
|
|
} PebblePluginServiceEvent;
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
WakeupInfo wakeup_info;
|
|
} PebbleWakeupEvent;
|
|
|
|
typedef struct PACKED { // 7 bytes
|
|
BlobDBId db_id;
|
|
BlobDBEventType type;
|
|
uint8_t *key;
|
|
uint8_t key_len;
|
|
} PebbleBlobDBEvent;
|
|
|
|
typedef enum {
|
|
VoiceEventTypeSessionSetup,
|
|
VoiceEventTypeSessionResult,
|
|
VoiceEventTypeSilenceDetected,
|
|
VoiceEventTypeSpeechDetected
|
|
} VoiceEventType;
|
|
|
|
typedef struct {
|
|
uint32_t timestamp;
|
|
char sentence[];
|
|
} PebbleVoiceServiceEventData;
|
|
|
|
typedef struct PACKED { // 6 bytes
|
|
VoiceEventType type:8;
|
|
VoiceStatus status:8;
|
|
PebbleVoiceServiceEventData *data;
|
|
} PebbleVoiceServiceEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
DictationSessionStatus result;
|
|
time_t timestamp;
|
|
char *text;
|
|
} PebbleDictationEvent;
|
|
|
|
//! Possible results that come back from the INSTALL_COMMAND
|
|
typedef enum {
|
|
AppFetchEventTypeStart,
|
|
AppFetchEventTypeProgress,
|
|
AppFetchEventTypeFinish,
|
|
AppFetchEventTypeError,
|
|
} AppFetchEventType;
|
|
|
|
typedef struct PACKED { // 6 bytes
|
|
AppFetchEventType type;
|
|
AppInstallId id;
|
|
union {
|
|
uint8_t progress_percent;
|
|
uint8_t error_code;
|
|
};
|
|
} PebbleAppFetchEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
AppInstallId id;
|
|
bool with_ui;
|
|
AppFetchUIArgs *fetch_args; //! NULL when with_ui is false, required otherwise
|
|
} PebbleAppFetchRequestEvent;
|
|
|
|
typedef enum {
|
|
DebugInfoSourceGetBytes,
|
|
DebugInfoSourceFWLogs,
|
|
} DebugInfoEventSource;
|
|
|
|
typedef enum {
|
|
DebugInfoStateStarted,
|
|
DebugInfoStateFinished,
|
|
} DebugInfoEventState;
|
|
|
|
typedef struct PACKED { // 2 bytes
|
|
DebugInfoEventSource source;
|
|
DebugInfoEventState state;
|
|
} PebbleGatherDebugInfoEvent;
|
|
|
|
typedef enum {
|
|
ReminderTriggered,
|
|
ReminderRemoved,
|
|
ReminderUpdated,
|
|
} ReminderEventType;
|
|
|
|
typedef struct PACKED { // 4 bytes
|
|
ReminderEventType type;
|
|
ReminderId *reminder_id;
|
|
} PebbleReminderEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
HealthEventData data;
|
|
HealthEventType type:8; // At the end so that data is word aligned.
|
|
} PebbleHealthEvent;
|
|
|
|
typedef struct PACKED { // 1 byte
|
|
bool is_event_ongoing;
|
|
} PebbleCalendarEvent;
|
|
|
|
typedef enum {
|
|
SmartstrapConnectionEvent,
|
|
SmartstrapDataSentEvent,
|
|
SmartstrapDataReceivedEvent,
|
|
SmartstrapNotifyEvent
|
|
} SmartstrapEventType;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
SmartstrapEventType type:4;
|
|
SmartstrapProfile profile:4;
|
|
SmartstrapResult result:8;
|
|
uint16_t read_length;
|
|
union {
|
|
SmartstrapServiceId service_id;
|
|
SmartstrapAttribute *attribute;
|
|
};
|
|
} PebbleSmartstrapEvent;
|
|
|
|
typedef struct PACKED { // 9 bytes
|
|
int utc_time_delta;
|
|
int gmt_offset_delta;
|
|
bool dst_changed;
|
|
} PebbleSetTimeEvent;
|
|
|
|
typedef enum PebbleTouchEventType {
|
|
PebbleTouchEvent_TouchesAvailable,
|
|
PebbleTouchEvent_TouchesCancelled,
|
|
PebbleTouchEvent_PalmDetected
|
|
} PebbleTouchEventType;
|
|
|
|
typedef struct PACKED { // 2 bytes
|
|
PebbleTouchEventType type:8;
|
|
TouchIdx touch_idx;
|
|
} PebbleTouchEvent;
|
|
|
|
typedef struct PACKED { // 8 bytes
|
|
PebbleProtocolCapabilities flags_diff;
|
|
} PebbleCapabilitiesChangedEvent;
|
|
|
|
typedef enum WeatherEventType {
|
|
WeatherEventType_WeatherDataAdded,
|
|
WeatherEventType_WeatherDataRemoved,
|
|
WeatherEventType_WeatherOrderChanged,
|
|
} WeatherEventType;
|
|
|
|
typedef struct PACKED PebbleWeatherEvent {
|
|
WeatherEventType type:8;
|
|
} PebbleWeatherEvent;
|
|
|
|
typedef struct HRMBPMData { // 2 bytes
|
|
uint8_t bpm;
|
|
HRMQuality quality:8;
|
|
} HRMBPMData;
|
|
|
|
typedef struct HRMHRVData { // 3 bytes
|
|
uint16_t ppi_ms; //!< Peak-to-peak interval (ms)
|
|
HRMQuality quality:8;
|
|
} HRMHRVData;
|
|
|
|
typedef struct HRMLEDData { // 4 bytes
|
|
uint16_t current_ua;
|
|
uint16_t tia; //!< Transimpendance Amplifier value.
|
|
//!< This is used with thresholds (provided by AMS) to verify the part is
|
|
//!< functioning within specification.
|
|
|
|
} HRMLEDData;
|
|
|
|
typedef struct HRMDiagnosticsData {
|
|
HRMPPGData ppg_data;
|
|
HRMAccelData accel_data;
|
|
} HRMDiagnosticsData;
|
|
|
|
typedef struct HRMSubscriptionExpiringData { // 4 bytes
|
|
HRMSessionRef session_ref;
|
|
} HRMSubscriptionExpiringData;
|
|
|
|
typedef enum HRMEventType {
|
|
HRMEvent_BPM = 0,
|
|
HRMEvent_HRV,
|
|
HRMEvent_LEDCurrent,
|
|
HRMEvent_Diagnostics,
|
|
HRMEvent_SubscriptionExpiring
|
|
} HRMEventType;
|
|
|
|
typedef struct PACKED PebbleHRMEvent { // 5 bytes
|
|
HRMEventType event_type;
|
|
union {
|
|
HRMBPMData bpm;
|
|
HRMHRVData hrv;
|
|
HRMLEDData led;
|
|
HRMDiagnosticsData *debug;
|
|
HRMSubscriptionExpiringData expiring;
|
|
};
|
|
} PebbleHRMEvent;
|
|
|
|
typedef enum UnobstructedAreaEventType {
|
|
UnobstructedAreaEventType_WillChange,
|
|
UnobstructedAreaEventType_Change,
|
|
UnobstructedAreaEventType_DidChange,
|
|
} UnobstructedAreaEventType;
|
|
|
|
typedef struct UnobstructedAreaEventData {
|
|
GRect area;
|
|
GRect final_area; //!< The final unobstructed area. Empty for events other than will-change.
|
|
AnimationProgress progress;
|
|
} UnobstructedAreaEventData;
|
|
|
|
typedef struct PACKED {
|
|
int16_t current_y;
|
|
int16_t final_y;
|
|
AnimationProgress progress;
|
|
UnobstructedAreaEventType type:8; //!< At the end for alignment.
|
|
} PebbleUnobstructedAreaEvent;
|
|
|
|
#if !__clang__
|
|
_Static_assert(sizeof(PebbleUnobstructedAreaEvent) == 9,
|
|
"PebbleUnobstructedAreaEvent size mismatch.");
|
|
#endif
|
|
|
|
typedef struct PACKED PebbleAppGlanceEvent {
|
|
Uuid *app_uuid;
|
|
} PebbleAppGlanceEvent;
|
|
|
|
typedef struct PACKED {
|
|
TimelineItemId *item_id;
|
|
TimelinePeekTimeType time_type:8;
|
|
uint8_t num_concurrent;
|
|
bool is_first_event;
|
|
bool is_future_empty;
|
|
} PebbleTimelinePeekEvent;
|
|
|
|
#if !__clang__
|
|
_Static_assert(sizeof(PebbleTimelinePeekEvent) == 8,
|
|
"PebbleTimelinePeekEvent size mismatch.");
|
|
#endif
|
|
|
|
typedef enum PebbleAppCacheEventType {
|
|
PebbleAppCacheEvent_Removed,
|
|
|
|
PebbleAppCacehEventNum
|
|
} PebbleAppCacheEventType;
|
|
|
|
typedef struct PACKED PebbleAppCacheEvent {
|
|
PebbleAppCacheEventType cache_event_type:8;
|
|
AppInstallId install_id;
|
|
} PebbleAppCacheEvent;
|
|
|
|
#if !__clang__
|
|
_Static_assert(sizeof(PebbleAppCacheEvent) == 5,
|
|
"PebbleTimelinePeekEvent size mismatch.");
|
|
#endif
|
|
|
|
typedef enum PebbleActivityEventType {
|
|
PebbleActivityEvent_TrackingStarted,
|
|
PebbleActivityEvent_TrackingStopped,
|
|
|
|
PebbleActivityEventNum
|
|
} PebbleActivityEventType;
|
|
|
|
typedef struct PACKED PebbleActivityEvent {
|
|
PebbleActivityEventType type:8;
|
|
} PebbleActivityEvent;
|
|
|
|
typedef enum PebbleWorkoutEventType {
|
|
PebbleWorkoutEvent_Started,
|
|
PebbleWorkoutEvent_Stopped,
|
|
PebbleWorkoutEvent_Paused,
|
|
PebbleWorkoutEvent_FrontendOpened,
|
|
PebbleWorkoutEvent_FrontendClosed,
|
|
} PebbleWorkoutEventType;
|
|
|
|
typedef struct PebbleWorkoutEvent {
|
|
PebbleWorkoutEventType type;
|
|
} PebbleWorkoutEvent;
|
|
|
|
|
|
typedef struct PACKED {
|
|
union PACKED {
|
|
PebblePanicEvent panic;
|
|
PebbleButtonEvent button;
|
|
PebbleSysNotificationEvent sys_notification;
|
|
// TODO: kill these old events
|
|
PebbleBatteryStateChangeEvent battery_state;
|
|
PebbleBatteryConnectionEvent battery_connection;
|
|
PebbleSetTimeEvent set_time_info;
|
|
PebbleTickEvent clock_tick;
|
|
PebbleAccelTapEvent accel_tap;
|
|
PebbleCompassDataEvent compass_data;
|
|
PebbleMediaEvent media;
|
|
PebblePutBytesEvent put_bytes;
|
|
PebblePhoneEvent phone;
|
|
PebbleLaunchAppEvent launch_app;
|
|
PebbleSystemMessageEvent firmware_update;
|
|
PebbleAlarmClockEvent alarm_clock;
|
|
PebbleAppOutboxSentEvent app_outbox_sent;
|
|
PebbleCallbackEvent app_outbox_msg;
|
|
union {
|
|
PebbleBluetoothPairEvent pair;
|
|
PebbleBluetoothConnectionEvent connection;
|
|
PebbleCommSessionEvent comm_session_event;
|
|
PebbleBluetoothStateEvent state;
|
|
PebbleRemoteAppInfoEvent app_info_event;
|
|
union {
|
|
PebbleBLEConnectionEvent connection;
|
|
PebbleBLEGATTClientEvent gatt_client;
|
|
PebbleBLEGATTClientServiceEvent gatt_client_service;
|
|
PebbleBLEHRMSharingStateUpdatedEvent hrm_sharing_state;
|
|
} le;
|
|
} bluetooth;
|
|
PebbleAncsChangedEvent ancs_changed;
|
|
PebbleDoNotDisturbEvent do_not_disturb;
|
|
PebbleCallbackEvent callback;
|
|
PebbleNewAppMessageEvent new_app_message;
|
|
PebbleSubscriptionEvent subscription;
|
|
PebbleKillEvent kill;
|
|
PebbleAppFocusEvent app_focus;
|
|
PebbleWakeupEvent wakeup;
|
|
PebblePluginServiceEvent plugin_service;
|
|
PebbleBlobDBEvent blob_db;
|
|
PebbleVoiceServiceEvent voice_service;
|
|
PebbleDictationEvent dictation;
|
|
PebbleAppFetchEvent app_fetch;
|
|
PebbleAppFetchRequestEvent app_fetch_request;
|
|
PebbleGatherDebugInfoEvent debug_info;
|
|
PebbleReminderEvent reminder;
|
|
PebbleCalendarEvent calendar;
|
|
PebbleHealthEvent health_event;
|
|
PebbleSmartstrapEvent smartstrap;
|
|
PebbleTouchEvent touch;
|
|
PebbleCapabilitiesChangedEvent capabilities;
|
|
PebbleWeatherEvent weather;
|
|
PebbleHRMEvent hrm;
|
|
PebbleUnobstructedAreaEvent unobstructed_area;
|
|
PebbleAppGlanceEvent app_glance;
|
|
PebbleTimelinePeekEvent timeline_peek;
|
|
PebbleAppCacheEvent app_cache_event;
|
|
PebbleActivityEvent activity_event;
|
|
PebbleWorkoutEvent workout;
|
|
};
|
|
PebbleTaskBitset task_mask; // 1 == filter out, 0 == leave in
|
|
// NOTE: we put this 8 bit field at the end so that we can pack this structure and still keep the
|
|
// event data unions word aligned (and avoid unaligned access exceptions).
|
|
PebbleEventType type:8;
|
|
} PebbleEvent;
|
|
|
|
void events_init(void);
|
|
|
|
void event_put(PebbleEvent* event);
|
|
bool event_put_isr(PebbleEvent* event);
|
|
void event_put_from_process(PebbleTask task, PebbleEvent* event);
|
|
|
|
//! Like event_put_from_app but it's allowed to fail.
|
|
bool event_try_put_from_process(PebbleTask task, PebbleEvent* event);
|
|
|
|
bool event_take_timeout(PebbleEvent* event, int timeout_ms);
|
|
|
|
//! Return a reference to the allocated buffer within an event, if applicable
|
|
void **event_get_buffer(PebbleEvent *event);
|
|
|
|
//! De-initialize an event, freeing the allocated buffer if necessary
|
|
void event_deinit(PebbleEvent *event);
|
|
|
|
//! Call to clean up after an event that has been dequeued using event_take.
|
|
void event_cleanup(PebbleEvent* event);
|
|
|
|
void event_reset_from_process_queue(PebbleTask task);
|
|
|
|
//! Get the queue for messaging to the kernel from the given task
|
|
QueueHandle_t event_get_to_kernel_queue(PebbleTask task);
|
|
|
|
QueueHandle_t event_kernel_to_kernel_event_queue(void);
|
|
|
|
//! Call to reset a queue and free all memory associated w/ the events it contains
|
|
BaseType_t event_queue_cleanup_and_reset(QueueHandle_t queue);
|