static-supported-modes-manager.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <app/util/config.h>
  2. #include <static-supported-modes-manager.h>
  3. using namespace std;
  4. using namespace chip;
  5. using namespace chip::app::Clusters;
  6. using namespace chip::app::Clusters::ModeSelect;
  7. using chip::Protocols::InteractionModel::Status;
  8. using ModeOptionStructType = Structs::ModeOptionStruct::Type;
  9. using SemanticTag = Structs::SemanticTagStruct::Type;
  10. template <typename T>
  11. using List = app::DataModel::List<T>;
  12. using storage_value_type = const ModeOptionStructType;
  13. namespace {
  14. Structs::ModeOptionStruct::Type buildModeOptionStruct(const char * label, uint8_t mode,
  15. const List<const SemanticTag> & semanticTags)
  16. {
  17. Structs::ModeOptionStruct::Type option;
  18. option.label = CharSpan::fromCharString(label);
  19. option.mode = mode;
  20. option.semanticTags = semanticTags;
  21. return option;
  22. }
  23. } // namespace
  24. constexpr SemanticTag semanticTagsBlack[] = { { .value = 0 } };
  25. constexpr SemanticTag semanticTagsCappucino[] = { { .value = 0 } };
  26. constexpr SemanticTag semanticTagsEspresso[] = { { .value = 0 } };
  27. // TODO: Configure your options for each endpoint
  28. storage_value_type StaticSupportedModesManager::coffeeOptions[] = {
  29. buildModeOptionStruct("Black", 0, List<const SemanticTag>(semanticTagsBlack)),
  30. buildModeOptionStruct("Cappuccino", 4, List<const SemanticTag>(semanticTagsCappucino)),
  31. buildModeOptionStruct("Espresso", 7, List<const SemanticTag>(semanticTagsEspresso))
  32. };
  33. const StaticSupportedModesManager::EndpointSpanPair
  34. StaticSupportedModesManager::supportedOptionsByEndpoints[EMBER_AF_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT] = {
  35. EndpointSpanPair(1, Span<storage_value_type>(StaticSupportedModesManager::coffeeOptions)) // Options for Endpoint 1
  36. };
  37. const StaticSupportedModesManager StaticSupportedModesManager::instance = StaticSupportedModesManager();
  38. SupportedModesManager::ModeOptionsProvider StaticSupportedModesManager::getModeOptionsProvider(EndpointId endpointId) const
  39. {
  40. for (auto & endpointSpanPair : supportedOptionsByEndpoints)
  41. {
  42. if (endpointSpanPair.mEndpointId == endpointId)
  43. {
  44. return ModeOptionsProvider(endpointSpanPair.mSpan.data(), endpointSpanPair.mSpan.end());
  45. }
  46. }
  47. return ModeOptionsProvider(nullptr, nullptr);
  48. }
  49. Status StaticSupportedModesManager::getModeOptionByMode(unsigned short endpointId, unsigned char mode,
  50. const ModeOptionStructType ** dataPtr) const
  51. {
  52. auto modeOptionsProvider = this->getModeOptionsProvider(endpointId);
  53. if (modeOptionsProvider.begin() == nullptr)
  54. {
  55. return Status::UnsupportedCluster;
  56. }
  57. auto * begin = this->getModeOptionsProvider(endpointId).begin();
  58. auto * end = this->getModeOptionsProvider(endpointId).end();
  59. for (auto * it = begin; it != end; ++it)
  60. {
  61. auto & modeOption = *it;
  62. if (modeOption.mode == mode)
  63. {
  64. *dataPtr = &modeOption;
  65. return Status::Success;
  66. }
  67. }
  68. ChipLogProgress(Zcl, "Cannot find the mode %u", mode);
  69. return Status::InvalidCommand;
  70. }
  71. const ModeSelect::SupportedModesManager * ModeSelect::getSupportedModesManager()
  72. {
  73. return &StaticSupportedModesManager::instance;
  74. }