You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.5 KiB
208 lines
5.5 KiB
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef NANOMESSAGE_H_
|
|
#define NANOMESSAGE_H_
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "noncopyable.h"
|
|
|
|
namespace android {
|
|
|
|
/*
|
|
* Events types that can be pushed back and forth between the ContextHub and
|
|
* host software.
|
|
*/
|
|
enum class EventType {
|
|
AppFromHostEvent = 0x000000F8,
|
|
FirstSensorEvent = 0x00000200,
|
|
LastSensorEvent = 0x000002FF,
|
|
ConfigureSensor = 0x00000300,
|
|
AppToHostEvent = 0x00000401,
|
|
ResetReasonEvent = 0x00000403,
|
|
LogEvent = 0x474F4C41,
|
|
};
|
|
|
|
/*
|
|
* An interface for all messages passed to and from the ContextHub.
|
|
*/
|
|
class NanoMessage : public NonCopyable {
|
|
public:
|
|
virtual ~NanoMessage() {};
|
|
|
|
// Generates a string intended to be printed to a console or saved to logs.
|
|
// This interface requires that the string be terminated with a newline.
|
|
virtual std::string ToString() const = 0;
|
|
};
|
|
|
|
/*
|
|
* An interface for requests sent to the ContextHub.
|
|
*/
|
|
class NanoRequest : public NanoMessage {
|
|
public:
|
|
// Returns a payload of bytes to be packaged into a NanoPacket.
|
|
virtual std::vector<uint8_t> GetBytes() const = 0;
|
|
};
|
|
|
|
/*
|
|
* An interface for responses from the ContextHub.
|
|
*/
|
|
class NanoResponse : public NanoMessage {
|
|
public:
|
|
// Populates the fields of the NanoMessage given a NanoPacket. Returns
|
|
// false if the packet is incomplete or incorrect message.
|
|
virtual bool Populate(const std::vector<uint8_t>& buffer) = 0;
|
|
};
|
|
|
|
/*
|
|
* Version information for a ContextHub.
|
|
*/
|
|
class HardwareVersionInfo : public NanoResponse {
|
|
public:
|
|
bool Populate(const std::vector<uint8_t>& buffer) override;
|
|
std::string ToString() const override;
|
|
|
|
struct VersionInfo {
|
|
uint16_t hardware_type;
|
|
uint16_t hardware_version;
|
|
uint16_t bootloader_version;
|
|
uint16_t operating_system_version;
|
|
uint32_t variant_version;
|
|
} __attribute__((packed)) info;
|
|
};
|
|
|
|
/*
|
|
* The base event for all event data.
|
|
*/
|
|
struct Event {
|
|
uint32_t event_type;
|
|
} __attribute__((packed));
|
|
|
|
/*
|
|
* A request to write an event to the ContextHub.
|
|
*/
|
|
class WriteEventRequest : public NanoRequest {
|
|
public:
|
|
virtual EventType GetEventType() const = 0;
|
|
};
|
|
|
|
/*
|
|
* A response to writing an event to the ContextHub.
|
|
*/
|
|
class WriteEventResponse : public NanoResponse {
|
|
public:
|
|
std::string ToString() const override;
|
|
bool Populate(const std::vector<uint8_t>& buffer) override;
|
|
|
|
struct Response {
|
|
bool accepted;
|
|
} __attribute__((packed)) response;
|
|
};
|
|
|
|
/*
|
|
* A response to reading an event from the ContextHub.
|
|
*/
|
|
class ReadEventRequest : public NanoRequest {
|
|
public:
|
|
std::vector<uint8_t> GetBytes() const override;
|
|
std::string ToString() const override;
|
|
|
|
struct Request {
|
|
uint64_t boot_time;
|
|
} __attribute__((packed)) request;
|
|
};
|
|
|
|
class ReadEventResponse : public NanoResponse {
|
|
public:
|
|
virtual std::string ToString() const override;
|
|
|
|
// Construct and populate a concrete ReadEventResponse from the given buffer
|
|
static std::unique_ptr<ReadEventResponse> FromBytes(
|
|
const std::vector<uint8_t>& buffer);
|
|
|
|
bool Populate(const std::vector<uint8_t>& buffer) override;
|
|
|
|
bool IsAppToHostEvent() const;
|
|
bool IsSensorEvent() const;
|
|
bool IsResetReasonEvent() const;
|
|
bool IsLogEvent() const;
|
|
uint32_t GetEventType() const;
|
|
|
|
// Event data associated with this response.
|
|
std::vector<uint8_t> event_data;
|
|
|
|
protected:
|
|
static uint32_t EventTypeFromBuffer(const std::vector<uint8_t>& buffer);
|
|
static bool IsAppToHostEvent(uint32_t event_type);
|
|
static bool IsSensorEvent(uint32_t event_type);
|
|
static bool IsResetReasonEvent(uint32_t event_type);
|
|
static bool IsLogEvent(uint32_t event_type);
|
|
};
|
|
|
|
/*
|
|
* An event used to configure a sensor with specific attributes.
|
|
*/
|
|
class ConfigureSensorRequest : public WriteEventRequest {
|
|
public:
|
|
enum class CommandType {
|
|
Disable,
|
|
Enable,
|
|
Flush,
|
|
ConfigData,
|
|
Calibrate,
|
|
SelfTest
|
|
};
|
|
|
|
ConfigureSensorRequest();
|
|
|
|
static uint32_t FloatRateToFixedPoint(float rate);
|
|
static float FixedPointRateToFloat(uint32_t rate);
|
|
|
|
std::vector<uint8_t> GetBytes() const override;
|
|
std::string ToString() const override;
|
|
EventType GetEventType() const override;
|
|
|
|
// Appends some data to the configuration request, e.g. for the ConfigData
|
|
// command
|
|
void SetAdditionalData(const std::vector<uint8_t>& data);
|
|
|
|
struct Configuration : public Event {
|
|
uint64_t latency;
|
|
uint32_t rate;
|
|
uint8_t sensor_type;
|
|
uint8_t command;
|
|
uint16_t flags;
|
|
} __attribute__((packed)) config = {};
|
|
|
|
private:
|
|
std::vector<uint8_t> extra_data_;
|
|
};
|
|
|
|
class BridgeVersionInfoRequest : public WriteEventRequest {
|
|
public:
|
|
//BridgeVersionInfoRequest() {};
|
|
std::vector<uint8_t> GetBytes() const override;
|
|
EventType GetEventType() const override;
|
|
std::string ToString() const override;
|
|
};
|
|
|
|
} // namespace android
|
|
|
|
#endif // NANOMESSAGE_H_
|