Skip to content

Commit

Permalink
TV Matter Media: Add logic to message cluster (#31943)
Browse files Browse the repository at this point in the history
* Adding basic logic

* Updates

* Update message cluster

* Update copyright

* Restyled by whitespace

* Restyled by clang-format

---------

Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
2 people authored and pull[bot] committed Aug 1, 2024
1 parent d4064c3 commit 2656449
Show file tree
Hide file tree
Showing 10 changed files with 510 additions and 14 deletions.
54 changes: 54 additions & 0 deletions examples/tv-app/android/include/messages/MessagesManager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/**
*
* Copyright (c) 2024 Project CHIP Authors
*
* 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.
*/

#include "MessagesManager.h"

using namespace std;
using namespace chip::app;
using namespace chip::app::Clusters::Messages;

// Commands
void MessagesManager::HandlePresentMessagesRequest(
const chip::ByteSpan & messageId, const MessagePriorityEnum & priority,
const chip::BitMask<MessageControlBitmap> & messageControl, const chip::app::DataModel::Nullable<uint32_t> & startTime,
const chip::app::DataModel::Nullable<uint16_t> & duration, const chip::CharSpan & messageText,
const chip::Optional<chip::app::DataModel::DecodableList<MessageResponseOption>> & responses)
{
// TODO: Present Message
}

void MessagesManager::HandleCancelMessagesRequest(const chip::app::DataModel::DecodableList<chip::ByteSpan> & messageIds)
{
// TODO: Cancel Message
}

// Attributes
CHIP_ERROR MessagesManager::HandleGetMessages(chip::app::AttributeValueEncoder & aEncoder)
{
return aEncoder.EncodeEmptyList();
}

CHIP_ERROR MessagesManager::HandleGetActiveMessageIds(chip::app::AttributeValueEncoder & aEncoder)
{
return aEncoder.EncodeEmptyList();
}

// Global Attributes
uint32_t MessagesManager::GetFeatureMap(chip::EndpointId endpoint)
{
return 1;
}
45 changes: 45 additions & 0 deletions examples/tv-app/android/include/messages/MessagesManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
*
* Copyright (c) 2024 Project CHIP Authors
*
* 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.
*/

#pragma once

#include <app/clusters/messages-server/messages-server.h>
#include <list>

class MessagesManager : public chip::app::Clusters::Messages::Delegate
{
public:
// Commands
void HandlePresentMessagesRequest(
const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint16_t> & duration,
const chip::CharSpan & messageText,
const chip::Optional<chip::app::DataModel::DecodableList<
chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::DecodableType>> & responses) override;
void HandleCancelMessagesRequest(const chip::app::DataModel::DecodableList<chip::ByteSpan> & messageIds) override;

// Attributes
CHIP_ERROR HandleGetMessages(chip::app::AttributeValueEncoder & aEncoder) override;
CHIP_ERROR HandleGetActiveMessageIds(chip::app::AttributeValueEncoder & aEncoder) override;

// Global Attributes
uint32_t GetFeatureMap(chip::EndpointId endpoint) override;

protected:
std::list<std::string> mMessages;
};
2 changes: 2 additions & 0 deletions examples/tv-app/tv-common/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ source_set("tv-common-sources") {
"clusters/media-input/MediaInputManager.h",
"clusters/media-playback/MediaPlaybackManager.cpp",
"clusters/media-playback/MediaPlaybackManager.h",
"clusters/messages/MessagesManager.cpp",
"clusters/messages/MessagesManager.h",
"clusters/target-navigator/TargetNavigatorManager.cpp",
"clusters/target-navigator/TargetNavigatorManager.h",
"clusters/wake-on-lan/WakeOnLanManager.cpp",
Expand Down
81 changes: 81 additions & 0 deletions examples/tv-app/tv-common/clusters/messages/MessagesManager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/**
*
* Copyright (c) 2024 Project CHIP Authors
*
* 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.
*/

#include "MessagesManager.h"

#include <app-common/zap-generated/attributes/Accessors.h>

using namespace std;
using namespace chip::app;
using namespace chip::app::Clusters::Messages;
using Message = chip::app::Clusters::Messages::Structs::MessageStruct::Type;

// Commands
void MessagesManager::HandlePresentMessagesRequest(
const chip::ByteSpan & messageId, const MessagePriorityEnum & priority,
const chip::BitMask<MessageControlBitmap> & messageControl, const chip::app::DataModel::Nullable<uint32_t> & startTime,
const chip::app::DataModel::Nullable<uint16_t> & duration, const chip::CharSpan & messageText,
const chip::Optional<chip::app::DataModel::DecodableList<MessageResponseOption>> & responses)
{
Message message{
// TODO: Enable id
chip::ByteSpan(), priority, messageControl, startTime, duration,
// TODO: Enable text
chip::CharSpan()
// TODO: Convert responses to Optional<chip::app::DataModel::List<const
// chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> message.responses = responses;
};

mMessages.push_back(message);
// Add your code to present Message
}

void MessagesManager::HandleCancelMessagesRequest(const chip::app::DataModel::DecodableList<chip::ByteSpan> & messageIds)
{
// TODO: Cancel Message
}

// Attributes
CHIP_ERROR MessagesManager::HandleGetMessages(chip::app::AttributeValueEncoder & aEncoder)
{
return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
for (Message & entry : mMessages)
{
ReturnErrorOnFailure(encoder.Encode(entry));
}
return CHIP_NO_ERROR;
});
}

CHIP_ERROR MessagesManager::HandleGetActiveMessageIds(chip::app::AttributeValueEncoder & aEncoder)
{
return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
for (Message & entry : mMessages)
{
ReturnErrorOnFailure(encoder.Encode(entry.messageID));
}
return CHIP_NO_ERROR;
});
}

// Global Attributes
uint32_t MessagesManager::GetFeatureMap(chip::EndpointId endpoint)
{
uint32_t featureMap = 0;
Attributes::FeatureMap::Get(endpoint, &featureMap);
return featureMap;
}
48 changes: 48 additions & 0 deletions examples/tv-app/tv-common/clusters/messages/MessagesManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
*
* Copyright (c) 2024 Project CHIP Authors
*
* 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.
*/

#pragma once

#include <app/clusters/messages-server/messages-server.h>

#include <iostream>
#include <list>

class MessagesManager : public chip::app::Clusters::Messages::Delegate
{
public:
// Commands
void HandlePresentMessagesRequest(
const chip::ByteSpan & messageId, const chip::app::Clusters::Messages::MessagePriorityEnum & priority,
const chip::BitMask<chip::app::Clusters::Messages::MessageControlBitmap> & messageControl,
const chip::app::DataModel::Nullable<uint32_t> & startTime, const chip::app::DataModel::Nullable<uint16_t> & duration,
const chip::CharSpan & messageText,
const chip::Optional<
chip::app::DataModel::DecodableList<chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> &
responses) override;
void HandleCancelMessagesRequest(const chip::app::DataModel::DecodableList<chip::ByteSpan> & messageIds) override;

// Attributes
CHIP_ERROR HandleGetMessages(chip::app::AttributeValueEncoder & aEncoder) override;
CHIP_ERROR HandleGetActiveMessageIds(chip::app::AttributeValueEncoder & aEncoder) override;

// Global Attributes
uint32_t GetFeatureMap(chip::EndpointId endpoint) override;

protected:
std::list<chip::app::Clusters::Messages::Structs::MessageStruct::Type> mMessages;
};
8 changes: 8 additions & 0 deletions examples/tv-app/tv-common/src/ZCLCallbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "low-power/LowPowerManager.h"
#include "media-input/MediaInputManager.h"
#include "media-playback/MediaPlaybackManager.h"
#include "messages/MessagesManager.h"
#include "target-navigator/TargetNavigatorManager.h"
#include "wake-on-lan/WakeOnLanManager.h"

Expand All @@ -56,6 +57,7 @@ static KeypadInputManager keypadInputManager;
static LowPowerManager lowPowerManager;
static MediaInputManager mediaInputManager;
static MediaPlaybackManager mediaPlaybackManager;
static MessagesManager messagesManager;
static TargetNavigatorManager targetNavigatorManager;
static WakeOnLanManager wakeOnLanManager;
} // namespace
Expand Down Expand Up @@ -170,6 +172,12 @@ void emberAfMediaPlaybackClusterInitCallback(EndpointId endpoint)
MediaPlayback::SetDefaultDelegate(endpoint, &mediaPlaybackManager);
}

void emberAfMessagesClusterInitCallback(EndpointId endpoint)
{
ChipLogProgress(Zcl, "TV Linux App: Messages::SetDefaultDelegate");
Messages::SetDefaultDelegate(endpoint, &messagesManager);
}

void emberAfTargetNavigatorClusterInitCallback(EndpointId endpoint)
{
ChipLogProgress(Zcl, "TV Linux App: TargetNavigator::SetDefaultDelegate");
Expand Down
1 change: 1 addition & 0 deletions examples/tv-app/tv-common/tv-app.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ macro(chip_add_tv_app_common target)
${CHIP_TV_COMMON_BASE_DIR}/clusters/low-power/LowPowerManager.cpp
${CHIP_TV_COMMON_BASE_DIR}/clusters/media-input/MediaInputManager.cpp
${CHIP_TV_COMMON_BASE_DIR}/clusters/media-playback/MediaPlaybackManager.cpp
${CHIP_TV_COMMON_BASE_DIR}/clusters/messages/MessagesManager.cpp
${CHIP_TV_COMMON_BASE_DIR}/clusters/target-navigator/TargetNavigatorManager.cpp
${CHIP_TV_COMMON_BASE_DIR}/clusters/wake-on-lan/WakeOnLanManager.cpp

Expand Down
60 changes: 60 additions & 0 deletions src/app/clusters/messages-server/messages-delegate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
*
* Copyright (c) 2024 Project CHIP Authors
* All rights reserved.
*
* 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.
*/

#pragma once

#include <app-common/zap-generated/cluster-objects.h>

#include <app/AttributeAccessInterface.h>
#include <app/CommandResponseHelper.h>
#include <app/util/af.h>

namespace chip {
namespace app {
namespace Clusters {
namespace Messages {

using MessageResponseOption = chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type;

class Delegate
{
public:
// Commands
virtual void
HandlePresentMessagesRequest(const ByteSpan & messageId, const MessagePriorityEnum & priority,
const chip::BitMask<MessageControlBitmap> & messageControl,
const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint16_t> & duration,
const CharSpan & messageText,
const chip::Optional<DataModel::DecodableList<MessageResponseOption>> & responses) = 0;
virtual void HandleCancelMessagesRequest(const DataModel::DecodableList<chip::ByteSpan> & messageIds) = 0;

// Attributes
virtual CHIP_ERROR HandleGetMessages(app::AttributeValueEncoder & aEncoder) = 0;
virtual CHIP_ERROR HandleGetActiveMessageIds(app::AttributeValueEncoder & aEncoder) = 0;

// Global Attributes
bool HasFeature(chip::EndpointId endpoint, Feature feature);
virtual uint32_t GetFeatureMap(chip::EndpointId endpoint) = 0;

virtual ~Delegate() = default;
};

} // namespace Messages
} // namespace Clusters
} // namespace app
} // namespace chip
Loading

0 comments on commit 2656449

Please sign in to comment.