10c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker/*
20c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * Copyright 2018 The Android Open Source Project
30c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker *
40c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * Licensed under the Apache License, Version 2.0 (the "License");
50c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * you may not use this file except in compliance with the License.
60c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * You may obtain a copy of the License at
70c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker *
80c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker *      http://www.apache.org/licenses/LICENSE-2.0
90c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker *
100c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * Unless required by applicable law or agreed to in writing, software
110c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * distributed under the License is distributed on an "AS IS" BASIS,
120c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * See the License for the specific language governing permissions and
140c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker * limitations under the License.
150c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker */
160c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
170c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker#include "set_absolute_volume.h"
180c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
190c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickernamespace bluetooth {
200c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickernamespace avrcp {
210c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
220c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickerstd::unique_ptr<SetAbsoluteVolumeRequestBuilder>
230c348413fb8d0a579acb8178c7e006d751508a3eAjay PanickerSetAbsoluteVolumeRequestBuilder::MakeBuilder(uint8_t volume) {
240c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  std::unique_ptr<SetAbsoluteVolumeRequestBuilder> builder(
250c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker      new SetAbsoluteVolumeRequestBuilder(volume & 0x7F));
260c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
270c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return builder;
280c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
290c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
300c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickersize_t SetAbsoluteVolumeRequestBuilder::size() const {
310c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return VendorPacket::kMinSize() + 1;
320c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
330c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
340c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickerbool SetAbsoluteVolumeRequestBuilder::Serialize(
350c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker    const std::shared_ptr<::bluetooth::Packet>& pkt) {
360c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ReserveSpace(pkt, size());
370c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
380c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  PacketBuilder::PushHeader(pkt);
390c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
400c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  VendorPacketBuilder::PushHeader(pkt, size() - VendorPacket::kMinSize());
410c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
420c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  AddPayloadOctets1(pkt, volume_);
430c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
440c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return true;
450c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
460c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
470c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickeruint8_t SetAbsoluteVolumeResponse::GetVolume() const {
480c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  auto it = begin() + VendorPacket::kMinSize();
490c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return *it;
500c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
510c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
520c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickerbool SetAbsoluteVolumeResponse::IsValid() const {
530c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  if (!VendorPacket::IsValid()) return false;
540c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  if (GetCType() != CType::ACCEPTED) return false;
550c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return size() == kMinSize();
560c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
570c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
580c348413fb8d0a579acb8178c7e006d751508a3eAjay Panickerstd::string SetAbsoluteVolumeResponse::ToString() const {
590c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  std::stringstream ss;
600c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "SetAbsoluteVolumeResponse: " << std::endl;
610c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ cType = " << GetCType() << std::endl;
620c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Subunit Type = " << loghex(GetSubunitType()) << std::endl;
630c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Subunit ID = " << loghex(GetSubunitId()) << std::endl;
640c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ OpCode = " << GetOpcode() << std::endl;
650c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Company ID = " << loghex(GetCompanyId()) << std::endl;
660c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Command PDU = " << GetCommandPdu() << std::endl;
670c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ PacketType = " << GetPacketType() << std::endl;
680c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Parameter Length = " << loghex(GetParameterLength()) << std::endl;
690c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << "  └ Volume = " << GetVolume() << std::endl;
700c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  ss << std::endl;
710c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
720c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker  return ss.str();
730c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}
740c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker
750c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}  // namespace avrcp
760c348413fb8d0a579acb8178c7e006d751508a3eAjay Panicker}  // namespace bluetooth