mirror of
https://github.com/google/pebble
synced 2026-10-16 00:04:12 +02:00
102 lines
4.5 KiB
C
102 lines
4.5 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/app_smartstrap.h"
|
|
#include "kernel/events.h"
|
|
#include "services/normal/accessory/smartstrap_profiles.h"
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
/*
|
|
* This module creates kernel-space structs to represent SmartstrapAttributes for the app. Because
|
|
* it is dealing with app buffers, the kernel-space structs are kept within smartstrap_attribute.c
|
|
* and they are referenced via the APIs using the user-space SmartstrapAttribute pointer. This
|
|
* SmartstrapAttribute pointer is actually just the user-space buffer pointer, but this fact is
|
|
* hidden from apps (and not particularly useful for them to know).
|
|
*/
|
|
|
|
/*
|
|
* FSM state transitions:
|
|
* +-------------------+-------------------+----------+---------------------------+
|
|
* | From State | To State | Task | Event |
|
|
* +-------------------+-------------------+----------+---------------------------+
|
|
* | Idle | RequestPending | App | *_read() |
|
|
* | Idle | WritePending | App | *_begin_write() |
|
|
* | WritePending | RequestPending | App | *_end_write() |
|
|
* | WritePending | Idle | App | *_end_write() failed |
|
|
* | RequestPending | Idle | KernelBG | Failed to send request |
|
|
* | RequestPending | RequestInProgress | KernelBG | Request sent successfully |
|
|
* | RequestInProgress | Idle | KernelBG | Got response to request |
|
|
* +-------------------+-------------------+----------+---------------------------+
|
|
* Notes:
|
|
* - Only the App task can move out of the Idle and WritePending states
|
|
* - Only KernelBG can move out of the RequestPending and RequestInProgress state
|
|
* - The lower-level smartstrap sending APIs are called only from KernelBG so we don't block the App
|
|
*/
|
|
typedef enum {
|
|
SmartstrapAttributeStateIdle = 0,
|
|
SmartstrapAttributeStateWritePending,
|
|
SmartstrapAttributeStateRequestPending,
|
|
SmartstrapAttributeStateRequestInProgress,
|
|
NumSmartstrapAttributeStates
|
|
} SmartstrapAttributeState;
|
|
|
|
typedef enum {
|
|
SmartstrapRequestTypeRead,
|
|
SmartstrapRequestTypeBeginWrite,
|
|
SmartstrapRequestTypeWrite,
|
|
SmartstrapRequestTypeWriteRead
|
|
} SmartstrapRequestType;
|
|
|
|
|
|
//! Initializes the smartstrap attribute code
|
|
void smartstrap_attribute_init(void);
|
|
|
|
//! Sends the next pending attribute request
|
|
bool smartstrap_attribute_send_pending(void);
|
|
|
|
//! Called by one of the profiles to send an event for an attribute.
|
|
void smartstrap_attribute_send_event(SmartstrapEventType type, SmartstrapProfile profile,
|
|
SmartstrapResult result, uint16_t service_id,
|
|
uint16_t attribute_id, uint16_t read_length);
|
|
|
|
//! Unregisters all attributes which the app has registered
|
|
void smartstrap_attribute_unregister_all(void);
|
|
|
|
// syscalls
|
|
|
|
//! Registers a new attribute by creating a kernel-space struct to represent it
|
|
bool sys_smartstrap_attribute_register(uint16_t service_id, uint16_t attribute_id, uint8_t *buffer,
|
|
size_t buffer_length);
|
|
|
|
//! Unregisters an attribute
|
|
void sys_smartstrap_attribute_unregister(SmartstrapAttribute *app_attr);
|
|
|
|
//! Gets information on the specified attribute which has previously been created
|
|
void sys_smartstrap_attribute_get_info(SmartstrapAttribute *app_attr, uint16_t *service_id,
|
|
uint16_t *attribute_id, size_t *length);
|
|
|
|
//! Queues up a request for the specified attribute
|
|
SmartstrapResult sys_smartstrap_attribute_do_request(SmartstrapAttribute *app_attr,
|
|
SmartstrapRequestType type,
|
|
uint16_t timeout_ms, uint32_t write_length);
|
|
|
|
//! Called by app_smartstrap.c after the app's event callback is called for an attribute
|
|
void sys_smartstrap_attribute_event_processed(SmartstrapAttribute *app_attr);
|