Implement led notifications

This commit is contained in:
BernardoGiordano 2019-05-04 14:35:16 +02:00
parent 72d23d5bdb
commit dc37a8b07d
6 changed files with 65 additions and 3 deletions

View file

@ -35,5 +35,6 @@
#include "pksmbridge.hpp" #include "pksmbridge.hpp"
extern u128 g_currentUId; extern u128 g_currentUId;
extern bool g_notificationLedAvailable;
#endif #endif

View file

@ -42,6 +42,8 @@
void servicesExit(void); void servicesExit(void);
Result servicesInit(void); Result servicesInit(void);
HidsysNotificationLedPattern blinkLedPattern(u8 times);
void blinkLed(u8 times);
namespace StringUtils namespace StringUtils
{ {

View file

@ -33,6 +33,9 @@ static const char *s_http_port = "8000";
static void handle_populate(struct mg_connection *nc, struct http_message *hm) static void handle_populate(struct mg_connection *nc, struct http_message *hm)
{ {
// populate gets called at startup, assume a new connection has been started
blinkLed(2);
auto json = Configuration::getInstance().getJson(); auto json = Configuration::getInstance().getJson();
auto map = getCompleteTitleList(); auto map = getCompleteTitleList();
json["title_list"] = map; json["title_list"] = map;

View file

@ -387,9 +387,12 @@ void Gui::draw(void)
SDLH_DrawText(24, 100, 360, theme().c6, "\ue000 to enter the selected title"); SDLH_DrawText(24, 100, 360, theme().c6, "\ue000 to enter the selected title");
SDLH_DrawText(24, 100, 390, theme().c6, "\ue001 to exit the selected title"); SDLH_DrawText(24, 100, 390, theme().c6, "\ue001 to exit the selected title");
SDLH_DrawText(24, 616, 450, theme().c6, "\ue002 to delete a backup"); SDLH_DrawText(24, 616, 450, theme().c6, "\ue002 to delete a backup");
SDLH_DrawText(24, 16*6 + checkpoint_w + 8 + ver_w + inst_w, 672 + (40 - checkpoint_h) / 2 + checkpoint_h - inst_h, COLOR_GOLD, if (gethostid() != INADDR_LOOPBACK)
StringUtils::format("Configuration server running on %s:8000", getConsoleIP()).c_str()); {
} SDLH_DrawText(24, 16*6 + checkpoint_w + 8 + ver_w + inst_w, 672 + (40 - checkpoint_h) / 2 + checkpoint_h - inst_h, COLOR_GOLD,
StringUtils::format("Configuration server running on %s:8000", getConsoleIP()).c_str());
}
}
SDLH_DrawRect(0, 672, checkpoint_w + ver_w + 2*16 + 8, 40, lightBlack); SDLH_DrawRect(0, 672, checkpoint_w + ver_w + 2*16 + 8, 40, lightBlack);
SDLH_DrawText(26, 16, 672 + (40 - checkpoint_h) / 2 + 2, theme().c6, "checkpoint"); SDLH_DrawText(26, 16, 672 + (40 - checkpoint_h) / 2 + 2, theme().c6, "checkpoint");

View file

@ -247,6 +247,7 @@ void io::backup(size_t index, u128 uid)
FileSystem::unmount(); FileSystem::unmount();
if (!MS::multipleSelectionEnabled()) if (!MS::multipleSelectionEnabled())
{ {
blinkLed(4);
Gui::showInfo("Progress correctly saved to disk."); Gui::showInfo("Progress correctly saved to disk.");
} }
auto systemKeyboardAvailable = KeyboardManager::get().isSystemKeyboardAvailable(); auto systemKeyboardAvailable = KeyboardManager::get().isSystemKeyboardAvailable();

View file

@ -26,12 +26,20 @@
#include "util.hpp" #include "util.hpp"
bool g_notificationLedAvailable = false;
void servicesExit(void) void servicesExit(void)
{ {
CheatManager::exit(); CheatManager::exit();
// debug // debug
socketExit(); socketExit();
freeIcons(); freeIcons();
if (g_notificationLedAvailable)
{
hidsysExit();
}
nsExit(); nsExit();
Account::exit(); Account::exit();
Gui::exit(); Gui::exit();
@ -74,6 +82,11 @@ Result servicesInit(void)
return -1; return -1;
} }
if (R_SUCCEEDED(res = hidsysInitialize()))
{
g_notificationLedAvailable = true;
}
CheatManager::init(); CheatManager::init();
Configuration::getInstance(); Configuration::getInstance();
@ -117,4 +130,43 @@ std::string StringUtils::removeNotAscii(std::string str)
} }
} }
return str; return str;
}
HidsysNotificationLedPattern blinkLedPattern(u8 times)
{
HidsysNotificationLedPattern pattern;
memset(&pattern, 0, sizeof(pattern));
pattern.baseMiniCycleDuration = 0x1; // 12.5ms.
pattern.totalMiniCycles = 0x2; // 2 mini cycles.
pattern.totalFullCycles = times; // Repeat n times.
pattern.startIntensity = 0x0; // 0%.
pattern.miniCycles[0].ledIntensity = 0xF; // 100%.
pattern.miniCycles[0].transitionSteps = 0xF; // 15 steps. Total 187.5ms.
pattern.miniCycles[0].finalStepDuration = 0x0; // Forced 12.5ms.
pattern.miniCycles[1].ledIntensity = 0x0; // 0%.
pattern.miniCycles[1].transitionSteps = 0xF; // 15 steps. Total 187.5ms.
pattern.miniCycles[1].finalStepDuration = 0x0; // Forced 12.5ms.
return pattern;
}
void blinkLed(u8 times)
{
if (g_notificationLedAvailable)
{
size_t n;
u64 uniquePadIds[2];
HidsysNotificationLedPattern pattern = blinkLedPattern(times);
memset(uniquePadIds, 0, sizeof(uniquePadIds));
Result res = hidsysGetUniquePadsFromNpad(hidGetHandheldMode() ? CONTROLLER_HANDHELD : CONTROLLER_PLAYER_1, uniquePadIds, 2, &n);
if (R_SUCCEEDED(res))
{
for (size_t i = 0; i < n; i++)
{
hidsysSetNotificationLedPattern(&pattern, uniquePadIds[i]);
}
}
}
} }