1 /* 2 * Copyright 2018 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 #pragma once 18 19 #include "vendor_packet.h" 20 21 namespace bluetooth { 22 namespace avrcp { 23 24 class RegisterNotificationResponse : public VendorPacket { 25 public: 26 virtual ~RegisterNotificationResponse() = default; 27 28 /** 29 * Register Notificaiton Request Packet Layout 30 * AvrcpPacket: 31 * CType c_type_; 32 * uint8_t subunit_type_ : 5; 33 * uint8_t subunit_id_ : 3; 34 * Opcode opcode_; 35 * VendorPacket: 36 * uint8_t company_id[3]; 37 * uint8_t command_pdu; 38 * uint8_t packet_type; 39 * uint16_t param_length; 40 * RegisterNotificationRequestPacket: 41 * uint8_t event_id; 42 * uint8_t[] data; // Length changes based on the event_id 43 */ kMinSize()44 static constexpr size_t kMinSize() { return VendorPacket::kMinSize() + 1; } 45 46 // TODO (apanicke): Add other getters when implementing AVRCP Controller 47 bool IsInterim() const; 48 Event GetEvent() const; 49 uint8_t GetVolume() const; 50 51 virtual bool IsValid() const override; 52 virtual std::string ToString() const override; 53 54 protected: 55 using VendorPacket::VendorPacket; 56 }; 57 58 class RegisterNotificationResponseBuilder : public VendorPacketBuilder { 59 public: 60 virtual ~RegisterNotificationResponseBuilder() = default; 61 62 static std::unique_ptr<RegisterNotificationResponseBuilder> 63 MakePlaybackStatusBuilder(bool interim, uint8_t play_status); 64 65 static std::unique_ptr<RegisterNotificationResponseBuilder> 66 MakeTrackChangedBuilder(bool interim, uint64_t track_uid); 67 68 static std::unique_ptr<RegisterNotificationResponseBuilder> 69 MakePlaybackPositionBuilder(bool interim, uint32_t playback_pos); 70 71 static std::unique_ptr<RegisterNotificationResponseBuilder> 72 MakeNowPlayingBuilder(bool interim); 73 74 static std::unique_ptr<RegisterNotificationResponseBuilder> 75 MakeAvailablePlayersBuilder(bool interim); 76 77 static std::unique_ptr<RegisterNotificationResponseBuilder> 78 MakeAddressedPlayerBuilder(bool interim, uint16_t player_id, 79 uint16_t uid_counter); 80 81 static std::unique_ptr<RegisterNotificationResponseBuilder> 82 MakeUidsChangedBuilder(bool interim, uint16_t uid_counter); 83 84 virtual size_t size() const override; 85 virtual bool Serialize( 86 const std::shared_ptr<::bluetooth::Packet>& pkt) override; 87 88 protected: 89 Event event_; 90 uint64_t data_; 91 RegisterNotificationResponseBuilder(bool interim,Event event)92 RegisterNotificationResponseBuilder(bool interim, Event event) 93 : VendorPacketBuilder(interim ? CType::INTERIM : CType::CHANGED, 94 CommandPdu::REGISTER_NOTIFICATION, 95 PacketType::SINGLE), 96 event_(event){}; 97 }; 98 99 class RegisterNotificationRequest : public VendorPacket { 100 public: 101 virtual ~RegisterNotificationRequest() = default; 102 103 /** 104 * Register Notificaiton Request Packet Layout 105 * AvrcpPacket: 106 * CType c_type_; 107 * uint8_t subunit_type_ : 5; 108 * uint8_t subunit_id_ : 3; 109 * Opcode opcode_; 110 * VendorPacket: 111 * uint8_t company_id[3]; 112 * uint8_t command_pdu; 113 * uint8_t packet_type; 114 * uint16_t param_length; 115 * RegisterNotificationRequestPacket: 116 * uint8_t event_id; 117 * uint32_t interval; // Only used for PLAYBACK_POS_CHANGED 118 */ kMinSize()119 static constexpr size_t kMinSize() { return VendorPacket::kMinSize() + 5; } 120 121 // Getter Functions 122 Event GetEventRegistered() const; 123 uint32_t GetInterval() const; 124 125 // Overloaded Functions 126 virtual bool IsValid() const override; 127 virtual std::string ToString() const override; 128 129 protected: 130 using VendorPacket::VendorPacket; 131 }; 132 133 class RegisterNotificationRequestBuilder : public VendorPacketBuilder { 134 public: 135 virtual ~RegisterNotificationRequestBuilder() = default; 136 137 static std::unique_ptr<RegisterNotificationRequestBuilder> MakeBuilder( 138 Event event, uint32_t interval); 139 140 virtual size_t size() const override; 141 virtual bool Serialize( 142 const std::shared_ptr<::bluetooth::Packet>& pkt) override; 143 144 protected: 145 Event event_; 146 uint32_t interval_; 147 RegisterNotificationRequestBuilder(Event event,uint32_t interval)148 RegisterNotificationRequestBuilder(Event event, uint32_t interval) 149 : VendorPacketBuilder(CType::NOTIFY, CommandPdu::REGISTER_NOTIFICATION, 150 PacketType::SINGLE), 151 event_(event), 152 interval_(interval){}; 153 }; 154 155 } // namespace avrcp 156 } // namespace bluetooth