Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[esp] Add status screen to all-clusters-app on M5Stack #14986

Merged
merged 7 commits into from
Feb 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 189 additions & 0 deletions examples/all-clusters-app/esp32/main/StatusScreen.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
/*
*
* Copyright (c) 2022 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.
*/

/**
* @file StatusScreen.cpp
*
* Screen which displays device state and status:
* - Fabric Index : none | #
* - Fabric ID : none | #
* - Node ID : none | #
* - UDP Port : #
* - IPv4 : none | addr
* - IPv6 LL : none | addr
* - IPv6 ULA : none | addr
*/

#include "StatusScreen.h"

#if CONFIG_HAVE_DISPLAY

#include "esp_log.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include <lib/support/CodeUtils.h>
#include <platform/CHIPDeviceLayer.h>

#include <app/server/Server.h>
#include <lib/core/DataModelTypes.h>

#define MAX_LENGTH_SMALL_FONT 30

using namespace chip;

class StatusListModel : public ListScreen::Model
{
public:
enum
{
kStatusItemFabricIndex,
kStatusItemFabricId,
kStatusItemNodeId,
kStatusItemPort,
kStatusItemIp4,
kStatusItemIp6LinkLocal,
kStatusItemIp6Ula,
};

StatusListModel()
{
options.emplace_back("FabricIndex : none");
options.emplace_back("FabricID : none");
options.emplace_back("NodeID : none");
options.emplace_back("UDP port : " + std::to_string(CHIP_PORT));
options.emplace_back("IPv4 : none");
options.emplace_back("IPv6 LL : none");
options.emplace_back("IPv6 ULA : none");
}

virtual std::string GetTitle() { return "Status"; }

virtual int GetItemCount() { return options.size(); }
virtual std::string GetItemText(int i)
{
std::string itemString = options.at(i);
switch (i)
{
case kStatusItemFabricIndex: {
for (const auto & fb : Server::GetInstance().GetFabricTable())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@turon For what it's worth, this has issues similar to #15065

We should probably really queue this stuff over to the Matter thread and then block until it runs or something....

{
FabricIndex fabricIndex = fb.GetFabricIndex();
itemString = "FabricIdx : " + std::to_string(fabricIndex);
break; // Only print first fabric for now
}
break;
}

case kStatusItemFabricId: {
for (const auto & fb : Server::GetInstance().GetFabricTable())
{
FabricId fabricId = fb.GetFabricId();
itemString = "FabricID : " + std::to_string(fabricId);
break; // Only print first fabric for now
}
break;
}

case kStatusItemNodeId: {
for (const auto & fb : Server::GetInstance().GetFabricTable())
{
NodeId nodeId = fb.GetNodeId();
itemString = "NodeID : " + std::to_string(nodeId);
break; // Only print first fabric for now
}
break;
}

case kStatusItemIp4: {
chip::Inet::IPAddress addr;
for (chip::Inet::InterfaceAddressIterator it; it.HasCurrent(); it.Next())
{
if ((it.GetAddress(addr) == CHIP_NO_ERROR) && addr.IsIPv4())
{
char buf[Inet::IPAddress::kMaxStringLength];
addr.ToString(buf);
itemString = std::string(buf);
break; // Only print first IPv4 address for now
}
}
break;
}

case kStatusItemIp6LinkLocal: {
chip::Inet::IPAddress addr;
for (chip::Inet::InterfaceAddressIterator it; it.HasCurrent(); it.Next())
{
if ((it.GetAddress(addr) == CHIP_NO_ERROR) && addr.IsIPv6LinkLocal())
{
char buf[Inet::IPAddress::kMaxStringLength];
addr.ToString(buf);
itemString = std::string(buf);
if (itemString.length() < MAX_LENGTH_SMALL_FONT)
{
TFT_setFont(SMALL_FONT, nullptr);
}
else
{
TFT_setFont(DEF_SMALL_FONT, nullptr);
}
break; // Only print first IPv6 LL for now
}
}
break;
}

case kStatusItemIp6Ula: {
chip::Inet::IPAddress addr;
for (chip::Inet::InterfaceAddressIterator it; it.HasCurrent(); it.Next())
{
if ((it.GetAddress(addr) == CHIP_NO_ERROR) && addr.IsIPv6ULA())
{
char buf[Inet::IPAddress::kMaxStringLength];
addr.ToString(buf);
itemString = std::string(buf);
if (itemString.length() < MAX_LENGTH_SMALL_FONT)
{
TFT_setFont(SMALL_FONT, nullptr);
}
else
{
TFT_setFont(DEF_SMALL_FONT, nullptr);
}
break; // Only print first IPv6 ULA for now
}
}
break;
}
}
ESP_LOGI("M5 UI", "Display status %d: %s", i, itemString.c_str());

return itemString;
}

virtual void ItemAction(int i) {}

private:
std::vector<std::string> options;
};

StatusScreen::StatusScreen() : ListScreen(chip::Platform::New<StatusListModel>()) {}

#endif // CONFIG_HAVE_DISPLAY
45 changes: 45 additions & 0 deletions examples/all-clusters-app/esp32/main/include/StatusScreen.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
*
* Copyright (c) 2022 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.
*/

/**
* @file StatusScreen.h
*
* Screen which displays a QR code.
*
*/

#pragma once

#include "ListScreen.h"
#include "ScreenManager.h"

#if CONFIG_HAVE_DISPLAY

#include <cstdint>
#include <vector>

class StatusScreen : public ListScreen
{

public:
StatusScreen();

virtual ~StatusScreen() {}
};

#endif // CONFIG_HAVE_DISPLAY
6 changes: 6 additions & 0 deletions examples/all-clusters-app/esp32/main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "QRCodeScreen.h"
#include "ScreenManager.h"
#include "ShellCommands.h"
#include "StatusScreen.h"
#include "WiFiWidget.h"
#include "esp_heap_caps_init.h"
#include "esp_log.h"
Expand Down Expand Up @@ -706,6 +707,11 @@ extern "C" void app_main()
ESP_LOGI(TAG, "Opening Setup list");
ScreenManager::PushScreen(chip::Platform::New<ListScreen>(chip::Platform::New<SetupListModel>()));
})
->Item("Status",
[=]() {
ESP_LOGI(TAG, "Opening Status screen");
ScreenManager::PushScreen(chip::Platform::New<StatusScreen>());
})
->Item("Custom",
[]() {
ESP_LOGI(TAG, "Opening custom screen");
Expand Down
2 changes: 2 additions & 0 deletions src/credentials/FabricTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ class DLL_EXPORT FabricInfo
ReleaseOperationalCerts();
}

NodeId GetNodeId() const { return mOperationalId.GetNodeId(); }
turon marked this conversation as resolved.
Show resolved Hide resolved
// TODO(#15049): Refactor/rename PeerId to OperationalId or OpId throughout source
PeerId GetPeerId() const { return mOperationalId; }
PeerId GetPeerIdForNode(const NodeId node) const
{
Expand Down