/*
* 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_