|
18 | 18 | #include "MessagesManager.h"
|
19 | 19 |
|
20 | 20 | #include <app-common/zap-generated/attributes/Accessors.h>
|
| 21 | +#include <vector> |
21 | 22 |
|
22 | 23 | using namespace std;
|
| 24 | +using namespace chip; |
23 | 25 | using namespace chip::app;
|
24 | 26 | using namespace chip::app::Clusters::Messages;
|
25 |
| -using Message = chip::app::Clusters::Messages::Structs::MessageStruct::Type; |
| 27 | +using Message = chip::app::Clusters::Messages::Structs::MessageStruct::Type; |
| 28 | +using MessageResponseOption = chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type; |
26 | 29 |
|
27 | 30 | // Commands
|
28 |
| -void MessagesManager::HandlePresentMessagesRequest( |
29 |
| - const chip::ByteSpan & messageId, const MessagePriorityEnum & priority, |
30 |
| - const chip::BitMask<MessageControlBitmap> & messageControl, const chip::app::DataModel::Nullable<uint32_t> & startTime, |
31 |
| - const chip::app::DataModel::Nullable<uint16_t> & duration, const chip::CharSpan & messageText, |
32 |
| - const chip::Optional<chip::app::DataModel::DecodableList<MessageResponseOption>> & responses) |
| 31 | +CHIP_ERROR MessagesManager::HandlePresentMessagesRequest( |
| 32 | + const ByteSpan & messageId, const MessagePriorityEnum & priority, const BitMask<MessageControlBitmap> & messageControl, |
| 33 | + const DataModel::Nullable<uint32_t> & startTime, const DataModel::Nullable<uint16_t> & duration, const CharSpan & messageText, |
| 34 | + const Optional<DataModel::DecodableList<MessageResponseOption>> & responses) |
33 | 35 | {
|
34 |
| - Message message{ |
35 |
| - // TODO: Enable id |
36 |
| - chip::ByteSpan(), priority, messageControl, startTime, duration, |
37 |
| - // TODO: Enable text |
38 |
| - chip::CharSpan() |
39 |
| - // TODO: Convert responses to Optional<chip::app::DataModel::List<const |
40 |
| - // chip::app::Clusters::Messages::Structs::MessageResponseOptionStruct::Type>> message.responses = responses; |
41 |
| - }; |
| 36 | + ChipLogProgress(Zcl, "HandlePresentMessagesRequest message:%s", std::string(messageText.data(), messageText.size()).c_str()); |
| 37 | + |
| 38 | + auto cachedMessage = CachedMessage(messageId, priority, messageControl, startTime, duration, |
| 39 | + std::string(messageText.data(), messageText.size())); |
| 40 | + if (responses.HasValue()) |
| 41 | + { |
| 42 | + auto iter = responses.Value().begin(); |
| 43 | + while (iter.Next()) |
| 44 | + { |
| 45 | + auto & response = iter.GetValue(); |
| 46 | + |
| 47 | + CachedMessageOption option(response.messageResponseID.Value(), |
| 48 | + std::string(response.label.Value().data(), response.label.Value().size())); |
| 49 | + |
| 50 | + cachedMessage.AddOption(option); |
| 51 | + } |
| 52 | + } |
| 53 | + |
| 54 | + mCachedMessages.push_back(cachedMessage); |
42 | 55 |
|
43 |
| - mMessages.push_back(message); |
44 | 56 | // Add your code to present Message
|
| 57 | + ChipLogProgress(Zcl, "HandlePresentMessagesRequest complete"); |
| 58 | + return CHIP_NO_ERROR; |
45 | 59 | }
|
46 | 60 |
|
47 |
| -void MessagesManager::HandleCancelMessagesRequest(const chip::app::DataModel::DecodableList<chip::ByteSpan> & messageIds) |
| 61 | +CHIP_ERROR MessagesManager::HandleCancelMessagesRequest(const DataModel::DecodableList<ByteSpan> & messageIds) |
48 | 62 | {
|
49 |
| - // TODO: Cancel Message |
| 63 | + auto iter = messageIds.begin(); |
| 64 | + while (iter.Next()) |
| 65 | + { |
| 66 | + auto & id = iter.GetValue(); |
| 67 | + |
| 68 | + mCachedMessages.remove_if([id](CachedMessage & entry) { return entry.MessageIdMatches(id); }); |
| 69 | + // per spec, the command succeeds even when the message id does not match an existing message |
| 70 | + } |
| 71 | + return CHIP_NO_ERROR; |
50 | 72 | }
|
51 | 73 |
|
52 | 74 | // Attributes
|
53 |
| -CHIP_ERROR MessagesManager::HandleGetMessages(chip::app::AttributeValueEncoder & aEncoder) |
| 75 | +CHIP_ERROR MessagesManager::HandleGetMessages(AttributeValueEncoder & aEncoder) |
54 | 76 | {
|
55 | 77 | return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
|
56 |
| - for (Message & entry : mMessages) |
| 78 | + for (CachedMessage & entry : mCachedMessages) |
57 | 79 | {
|
58 |
| - ReturnErrorOnFailure(encoder.Encode(entry)); |
| 80 | + ReturnErrorOnFailure(encoder.Encode(entry.GetMessage())); |
59 | 81 | }
|
60 | 82 | return CHIP_NO_ERROR;
|
61 | 83 | });
|
62 | 84 | }
|
63 | 85 |
|
64 |
| -CHIP_ERROR MessagesManager::HandleGetActiveMessageIds(chip::app::AttributeValueEncoder & aEncoder) |
| 86 | +CHIP_ERROR MessagesManager::HandleGetActiveMessageIds(AttributeValueEncoder & aEncoder) |
65 | 87 | {
|
66 | 88 | return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
|
67 |
| - for (Message & entry : mMessages) |
| 89 | + for (CachedMessage & entry : mCachedMessages) |
68 | 90 | {
|
69 |
| - ReturnErrorOnFailure(encoder.Encode(entry.messageID)); |
| 91 | + ReturnErrorOnFailure(encoder.Encode(entry.GetMessage().messageID)); |
70 | 92 | }
|
71 | 93 | return CHIP_NO_ERROR;
|
72 | 94 | });
|
73 | 95 | }
|
74 | 96 |
|
75 | 97 | // Global Attributes
|
76 |
| -uint32_t MessagesManager::GetFeatureMap(chip::EndpointId endpoint) |
| 98 | +uint32_t MessagesManager::GetFeatureMap(EndpointId endpoint) |
77 | 99 | {
|
78 |
| - uint32_t featureMap = 0; |
79 |
| - Attributes::FeatureMap::Get(endpoint, &featureMap); |
| 100 | + BitMask<Feature> FeatureMap; |
| 101 | + FeatureMap.Set(Feature::kReceivedConfirmation); |
| 102 | + FeatureMap.Set(Feature::kConfirmationResponse); |
| 103 | + FeatureMap.Set(Feature::kConfirmationReply); |
| 104 | + FeatureMap.Set(Feature::kProtectedMessages); |
| 105 | + |
| 106 | + uint32_t featureMap = FeatureMap.Raw(); |
| 107 | + ChipLogProgress(Zcl, "GetFeatureMap featureMap=%d", featureMap); |
| 108 | + // forcing to all features since this implementation supports all |
| 109 | + // Attributes::FeatureMap::Get(endpoint, &featureMap); |
80 | 110 | return featureMap;
|
81 | 111 | }
|
0 commit comments