mirror of https://github.com/google/pebble
134 lines
4.0 KiB
C
134 lines
4.0 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 <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "applib/accel_service.h"
|
|
#include "applib/compass_service.h"
|
|
#include "applib/preferred_content_size.h"
|
|
#include "drivers/button_id.h"
|
|
#include "util/attributes.h"
|
|
|
|
// The QEMU protocols implemented
|
|
typedef enum {
|
|
QemuProtocol_SPP = 1,
|
|
QemuProtocol_Tap = 2,
|
|
QemuProtocol_BluetoothConnection = 3,
|
|
QemuProtocol_Compass = 4,
|
|
QemuProtocol_Battery = 5,
|
|
QemuProtocol_Accel = 6,
|
|
QemuProtocol_Vibration = 7,
|
|
QemuProtocol_Button = 8,
|
|
QemuProtocol_TimeFormat = 9,
|
|
QemuProtocol_TimelinePeek = 10,
|
|
QemuProtocol_ContentSize = 11,
|
|
} QemuProtocol;
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Structure of the data for various protocols
|
|
|
|
// For QemuProtocol_SPP, the data is raw Pebble Protocol
|
|
|
|
// QemuProtocol_Tap
|
|
typedef struct PACKED {
|
|
uint8_t axis; // 0: x-axis, 1: y-axis, 2: z-axis
|
|
int8_t direction; // either +1 or -1
|
|
} QemuProtocolTapHeader;
|
|
|
|
|
|
// QemuProtocol_BluetoothConnection
|
|
typedef struct PACKED {
|
|
uint8_t connected; // true if connected
|
|
} QemuProtocolBluetoothConnectionHeader;
|
|
|
|
|
|
// QemuProtocol_Compass
|
|
typedef struct PACKED {
|
|
uint32_t magnetic_heading; // 0x10000 represents 360 degrees
|
|
CompassStatus calib_status:8; // CompassStatus enum
|
|
} QemuProtocolCompassHeader;
|
|
|
|
|
|
// QemuProtocol_Battery
|
|
typedef struct PACKED {
|
|
uint8_t battery_pct; // from 0 to 100
|
|
uint8_t charger_connected;
|
|
} QemuProtocolBatteryHeader;
|
|
|
|
|
|
// QemuProtocol_Accel request (to Pebble)
|
|
typedef struct PACKED {
|
|
uint8_t num_samples;
|
|
AccelRawData samples[0];
|
|
} QemuProtocolAccelHeader;
|
|
|
|
// QemuProtocol_Accel response (back to host)
|
|
typedef struct PACKED {
|
|
uint16_t avail_space; // Number of samples we can accept
|
|
} QemuProtocolAccelResponseHeader;
|
|
|
|
|
|
// QemuProtocol_Vibration notification (sent from Pebble to host)
|
|
typedef struct PACKED {
|
|
uint8_t on; // non-zero if vibe is on, 0 if off
|
|
} QemuProtocolVibrationNotificationHeader;
|
|
|
|
|
|
// QemuProtocol_Button
|
|
typedef struct PACKED {
|
|
// New button state. Bit x specifies the state of button x, where x is one of the
|
|
// ButtonId enum values.
|
|
uint8_t button_state;
|
|
} QemuProtocolButtonHeader;
|
|
|
|
|
|
// QemuProtocol_TimeFormat
|
|
typedef struct PACKED {
|
|
uint8_t is_24_hour; // non-zero if 24h format, 0 if 12h format
|
|
} QemuProtocolTimeFormatHeader;
|
|
|
|
|
|
// QemuProtocol_TimelinePeek
|
|
typedef struct PACKED {
|
|
//! Decides whether the Timeline Peek will show. Timeline Peek will animate only when this state
|
|
//! toggles, and subsequent interactions that manipulate Timeline Peek outside of this
|
|
//! QemuProtocol packet apply without an animation. The state received by this packet is also
|
|
//! persisted, for example if enabled is true, exiting the watchface will instantly hide the
|
|
//! peek, but returning to the watchface will instantly show the peek since this state persists.
|
|
bool enabled;
|
|
} QemuProtocolTimelinePeekHeader;
|
|
|
|
|
|
// QemuProtocol_ContentSize
|
|
typedef struct PACKED {
|
|
//! New system content size.
|
|
uint8_t size;
|
|
} QemuProtocolContentSizeHeader;
|
|
#if !UNITTEST
|
|
_Static_assert(sizeof(PreferredContentSize) == sizeof(((QemuProtocolContentSizeHeader *)0)->size),
|
|
"sizeof(PreferredContentSize) grew, need to update QemuContentSize in libpebble2 !");
|
|
#endif
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// API
|
|
void qemu_serial_init(void);
|
|
|
|
void qemu_serial_send(QemuProtocol protocol, const uint8_t *data, uint32_t len);
|