Home | History | Annotate | Download | only in nanotool
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "nanomessage.h"
     18 
     19 #include <inttypes.h>
     20 #include <stdio.h>
     21 
     22 #include "apptohostevent.h"
     23 #include "log.h"
     24 #include "logevent.h"
     25 #include "resetreasonevent.h"
     26 #include "sensorevent.h"
     27 
     28 namespace android {
     29 
     30 /* HardwareVersionInfo ********************************************************/
     31 
     32 bool HardwareVersionInfo::Populate(const std::vector<uint8_t>& buffer) {
     33     if (buffer.size() != sizeof(VersionInfo)) {
     34         return false;
     35     }
     36 
     37     const uint8_t *data = buffer.data();
     38     const VersionInfo *source = reinterpret_cast<const VersionInfo *>(data);
     39     info = *source;
     40     return true;
     41 }
     42 
     43 std::string HardwareVersionInfo::ToString() const {
     44     const char format_string[] = "Hardware version info:\n"
     45         "    Hardware type: %04x\n"
     46         "    Hardware version: %04x\n"
     47         "    Bootloader version: %04x\n"
     48         "    Operating system version: %04x\n"
     49         "    Variant version: %08x\n";
     50 
     51     char buffer[1024];
     52     snprintf(buffer, sizeof(buffer), format_string,
     53         info.hardware_type,
     54         info.hardware_version,
     55         info.bootloader_version,
     56         info.operating_system_version,
     57         info.variant_version);
     58     return std::string(buffer);
     59 }
     60 
     61 /* WriteEventResponse *********************************************************/
     62 
     63 std::string WriteEventResponse::ToString() const {
     64     const char format_string[] = "Write event accepted: %s\n";
     65 
     66     char buffer[128];
     67     snprintf(buffer, sizeof(buffer), format_string,
     68         response.accepted ? "true" : "false");
     69     return std::string(buffer);
     70 }
     71 
     72 bool WriteEventResponse::Populate(const std::vector<uint8_t>& buffer) {
     73     if (buffer.size() != sizeof(Response)) {
     74         return false;
     75     }
     76 
     77     const uint8_t *data = buffer.data();
     78     const Response *source = reinterpret_cast<const Response *>(data);
     79     response = *source;
     80     return true;
     81 
     82 }
     83 
     84 /* ReadEventRequest ***********************************************************/
     85 
     86 std::vector<uint8_t> ReadEventRequest::GetBytes() const {
     87     std::vector<uint8_t> buffer(sizeof(Request));
     88 
     89     uint8_t *data = buffer.data();
     90     Request *req = reinterpret_cast<Request *>(data);
     91     *req = request;
     92     return buffer;
     93 }
     94 
     95 std::string ReadEventRequest::ToString() const {
     96     const char format_string[] = "Read event at time: %" PRIx64 "\n";
     97 
     98     char buffer[128];
     99     snprintf(buffer, sizeof(buffer), format_string,
    100         request.boot_time);
    101     return std::string(buffer);
    102 }
    103 
    104 /* ReadEventResponse **********************************************************/
    105 
    106 std::string ReadEventResponse::ToString() const {
    107     char buffer[32];
    108     snprintf(buffer, sizeof(buffer), "ReadEventResponse %u\n", GetEventType());
    109     return std::string(buffer);
    110 }
    111 
    112 std::unique_ptr<ReadEventResponse> ReadEventResponse::FromBytes(
    113         const std::vector<uint8_t>& buffer) {
    114     // The first 4 bytes of any event must be the event type - use it to figure
    115     // out which class to construct
    116     uint32_t event_type = ReadEventResponse::EventTypeFromBuffer(buffer);
    117     if (ReadEventResponse::IsSensorEvent(event_type)) {
    118         return SensorEvent::FromBytes(buffer);
    119     } else if (ReadEventResponse::IsAppToHostEvent(event_type)) {
    120         return AppToHostEvent::FromBytes(buffer);
    121     } else if (ReadEventResponse::IsResetReasonEvent(event_type)) {
    122         return ResetReasonEvent::FromBytes(buffer);
    123     } else if (ReadEventResponse::IsLogEvent(event_type)) {
    124         return LogEvent::FromBytes(buffer);
    125     } else {
    126         LOGW("Received unexpected/unsupported event type %u", event_type);
    127         return nullptr;
    128     }
    129 }
    130 
    131 bool ReadEventResponse::Populate(const std::vector<uint8_t>& buffer) {
    132     if (buffer.size() < sizeof(Event)) {
    133         return false;
    134     }
    135 
    136     event_data.resize(buffer.size());
    137     std::copy(buffer.begin(), buffer.end(), event_data.begin());
    138     return true;
    139 }
    140 
    141 bool ReadEventResponse::IsAppToHostEvent() const {
    142     return ReadEventResponse::IsAppToHostEvent(GetEventType());
    143 }
    144 
    145 bool ReadEventResponse::IsSensorEvent() const {
    146     return ReadEventResponse::IsSensorEvent(GetEventType());
    147 }
    148 
    149 bool ReadEventResponse::IsResetReasonEvent() const {
    150     return ReadEventResponse::IsResetReasonEvent(GetEventType());
    151 }
    152 
    153 bool ReadEventResponse::IsLogEvent() const {
    154     return ReadEventResponse::IsLogEvent(GetEventType());
    155 }
    156 
    157 uint32_t ReadEventResponse::GetEventType() const {
    158     return ReadEventResponse::EventTypeFromBuffer(event_data);
    159 }
    160 
    161 bool ReadEventResponse::IsSensorEvent(uint32_t event_type) {
    162     return (event_type >= static_cast<uint32_t>(EventType::FirstSensorEvent) &&
    163             event_type <= static_cast<uint32_t>(EventType::LastSensorEvent));
    164 }
    165 
    166 bool ReadEventResponse::IsAppToHostEvent(uint32_t event_type) {
    167     return (event_type == static_cast<uint32_t>(EventType::AppToHostEvent));
    168 }
    169 
    170 bool ReadEventResponse::IsResetReasonEvent(uint32_t event_type) {
    171     return (event_type == static_cast<uint32_t>(EventType::ResetReasonEvent));
    172 }
    173 
    174 bool ReadEventResponse::IsLogEvent(uint32_t event_type) {
    175     return (event_type == static_cast<uint32_t>(EventType::LogEvent));
    176 }
    177 
    178 uint32_t ReadEventResponse::EventTypeFromBuffer(const std::vector<uint8_t>& buffer) {
    179     if (buffer.size() < sizeof(uint32_t)) {
    180         LOGW("Invalid/short event of size %zu", buffer.size());
    181         return 0;
    182     }
    183     return *reinterpret_cast<const uint32_t *>(buffer.data());
    184 }
    185 
    186 /* ConfigureSensorRequest *****************************************************/
    187 
    188 ConfigureSensorRequest::ConfigureSensorRequest() {
    189     config.event_type = static_cast<uint32_t>(EventType::ConfigureSensor);
    190 }
    191 
    192 uint32_t ConfigureSensorRequest::FloatRateToFixedPoint(float rate) {
    193     return rate * 1024.0f;
    194 }
    195 
    196 float ConfigureSensorRequest::FixedPointRateToFloat(uint32_t rate) {
    197     return rate / 1024.0f;
    198 }
    199 
    200 // TODO(aarossig): Consider writing a template function for this.
    201 std::vector<uint8_t> ConfigureSensorRequest::GetBytes() const {
    202     std::vector<uint8_t> buffer(sizeof(Configuration));
    203 
    204     uint8_t *data = buffer.data();
    205     Configuration *configuration = reinterpret_cast<Configuration *>(data);
    206     *configuration = config;
    207     buffer.insert(buffer.end(), extra_data_.begin(), extra_data_.end());
    208 
    209     return buffer;
    210 }
    211 
    212 void ConfigureSensorRequest::SetAdditionalData(const std::vector<uint8_t>& data) {
    213     extra_data_ = data;
    214 }
    215 
    216 std::string ConfigureSensorRequest::ToString() const {
    217     const char format_string[] = "Sensor configuration:\n"
    218         "    latency: %" PRIx64 "\n"
    219         "    rate (fixed point): %08x\n"
    220         "    sensor_type: %02x\n"
    221         "    command: %02x\n"
    222         "    flags: %04x\n";
    223 
    224     char buffer[1024];
    225     snprintf(buffer, sizeof(buffer), format_string,
    226             config.latency,
    227             config.rate,
    228             config.sensor_type,
    229             config.command,
    230             config.flags);
    231     return std::string(buffer);
    232 }
    233 
    234 EventType ConfigureSensorRequest::GetEventType() const {
    235     return static_cast<EventType>(config.event_type);
    236 }
    237 
    238 /* BridgeVersionInfoRequest ***************************************************/
    239 
    240 std::vector<uint8_t> BridgeVersionInfoRequest::GetBytes() const {
    241     struct VersionInfoRequestEvent : public Event {
    242         struct BrHostEventTx event_data;
    243     } __attribute__((packed));
    244 
    245     std::vector<uint8_t> buffer(sizeof(VersionInfoRequestEvent));
    246 
    247     std::fill(buffer.begin(), buffer.end(), 0);
    248     auto event = reinterpret_cast<VersionInfoRequestEvent *>(buffer.data());
    249     event->event_type = static_cast<uint32_t>(EventType::AppFromHostEvent);
    250     event->event_data.hdr.appId   = kAppIdBridge;
    251     event->event_data.hdr.dataLen = sizeof(BrHostEventData);
    252     event->event_data.data.msgId  = BRIDGE_HOST_EVENT_MSG_VERSION_INFO;
    253 
    254     return buffer;
    255 }
    256 
    257 EventType BridgeVersionInfoRequest::GetEventType() const {
    258     return EventType::AppFromHostEvent;
    259 }
    260 
    261 std::string BridgeVersionInfoRequest::ToString() const {
    262     return std::string("Bridge version info request\n");
    263 }
    264 
    265 }  // namespace android
    266