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