#include "SystemCommandsModule.h" #include "meshUtils.h" #if HAS_SCREEN #include "graphics/Screen.h" #include "graphics/SharedUIDisplay.h" #endif #include "GPS.h" #include "MeshService.h" #include "Module.h" #include "NodeDB.h" #include "main.h" #include "modules/AdminModule.h" #include "modules/ExternalNotificationModule.h" SystemCommandsModule *systemCommandsModule; SystemCommandsModule::SystemCommandsModule() { if (inputBroker) inputObserver.observe(inputBroker); } int SystemCommandsModule::handleInputEvent(const InputEvent *event) { LOG_INFO("Input event %u! kb %u", event->inputEvent, event->kbchar); // System commands (all others fall through) switch (event->kbchar) { // Fn key symbols case INPUT_BROKER_MSG_FN_SYMBOL_ON: IF_SCREEN(screen->setFunctionSymbol("Fn")); return 0; case INPUT_BROKER_MSG_FN_SYMBOL_OFF: IF_SCREEN(screen->removeFunctionSymbol("Fn")); return 0; // Brightness case INPUT_BROKER_MSG_BRIGHTNESS_UP: IF_SCREEN(screen->increaseBrightness()); LOG_DEBUG("Increase Screen Brightness"); return 0; case INPUT_BROKER_MSG_BRIGHTNESS_DOWN: IF_SCREEN(screen->decreaseBrightness()); LOG_DEBUG("Decrease Screen Brightness"); return 0; // Mute case INPUT_BROKER_MSG_MUTE_TOGGLE: if (moduleConfig.external_notification.enabled && externalNotificationModule) { bool isMuted = externalNotificationModule->getMute(); externalNotificationModule->setMute(!isMuted); IF_SCREEN(graphics::isMuted = !isMuted; if (!isMuted) externalNotificationModule->stopNow(); screen->showSimpleBanner(isMuted ? "Notifications\nEnabled" : "Notifications\nDisabled", 3000);) } return 0; // Bluetooth case INPUT_BROKER_MSG_BLUETOOTH_TOGGLE: config.bluetooth.enabled = !config.bluetooth.enabled; LOG_INFO("User toggled Bluetooth"); nodeDB->saveToDisk(); #if defined(ARDUINO_ARCH_NRF52) if (!config.bluetooth.enabled) { disableBluetooth(); IF_SCREEN(screen->showSimpleBanner("Bluetooth OFF\nRebooting", 3000)); rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 2000; } else { IF_SCREEN(screen->showSimpleBanner("Bluetooth ON\nRebooting", 3000)); rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; } #else if (!config.bluetooth.enabled) { disableBluetooth(); IF_SCREEN(screen->showSimpleBanner("Bluetooth OFF", 3000)); } else { IF_SCREEN(screen->showSimpleBanner("Bluetooth ON\nRebooting", 3000)); rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; } #endif return 0; case INPUT_BROKER_LOST_TOGGLE: LOG_WARN("Lost Toggle"); #if !MESHTASTIC_EXCLUDE_GPS if (gps) { LOG_WARN("GPS present"); if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT) { LOG_WARN("Changing mode to LOST_AND_FOUND"); config.device.role = meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND; IF_SCREEN(screen->forceDisplay(); screen->showSimpleBanner("Switching to LOST!", 3000);) nodeDB->saveToDisk(SEGMENT_CONFIG); } else { LOG_WARN("Changing mode to Client"); config.device.role = meshtastic_Config_DeviceConfig_Role_CLIENT; IF_SCREEN(screen->forceDisplay(); screen->showSimpleBanner("Switching to Client!", 3000);) nodeDB->saveToDisk(SEGMENT_CONFIG); } rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; } #endif return true; case INPUT_BROKER_MSG_REBOOT: IF_SCREEN(screen->showSimpleBanner("Rebooting...", 0)); nodeDB->saveToDisk(); rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; // runState = CANNED_MESSAGE_RUN_STATE_INACTIVE; return true; } switch (event->inputEvent) { // GPS case INPUT_BROKER_GPS_TOGGLE: LOG_WARN("GPS Toggle"); #if !MESHTASTIC_EXCLUDE_GPS if (gps) { LOG_WARN("GPS Toggle2"); gps->toggleGpsMode(); const char *msg = (config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) ? "GPS Enabled" : "GPS Disabled"; IF_SCREEN(screen->forceDisplay(); screen->showSimpleBanner(msg, 3000);) } #endif return true; // Mesh ping case INPUT_BROKER_SEND_PING: service->refreshLocalMeshNode(); if (service->trySendPosition(NODENUM_BROADCAST, true)) { IF_SCREEN(screen->showSimpleBanner("Position\nSent", 3000)); } else { IF_SCREEN(screen->showSimpleBanner("Node Info\nSent", 3000)); } return true; // Power control case INPUT_BROKER_SHUTDOWN: shutdownAtMsec = millis(); return true; default: // No other input events handled here break; } return false; }