Add keymappings for several utility functions (#3536)

* - map fn+m to mute and unmute the external notification module
- map fn+t to be an alternative for the TAB key

* add whitelist to inputbroker

* (maybe) sweet-talking t-deck into tabbing...

* now for real - back in Kansas

* More fancy mappings

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
Thomas Göttgens 2024-04-07 02:12:57 +02:00 committed by GitHub
parent 0e9f1beb40
commit 1baad2875a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 50 additions and 5 deletions

View File

@ -217,7 +217,11 @@ int32_t KbI2cBase::runOnce()
e.kbchar = 0xb7; e.kbchar = 0xb7;
break; break;
case 0x90: // fn+r case 0x90: // fn+r
case 0x91: // fn+t
case 0x9b: // fn+s case 0x9b: // fn+s
case 0xac: // fn+m
case 0x9e: // fn+g
case 0xaf: // fn+space
// just pass those unmodified // just pass those unmodified
e.inputEvent = ANYKEY; e.inputEvent = ANYKEY;
e.kbchar = c; e.kbchar = c;

View File

@ -13,6 +13,10 @@
#include "mesh/generated/meshtastic/cannedmessages.pb.h" #include "mesh/generated/meshtastic/cannedmessages.pb.h"
#include "main.h" // for cardkb_found #include "main.h" // for cardkb_found
#include "modules/ExternalNotificationModule.h" // for buzzer control
#if !MESHTASTIC_EXCLUDE_GPS
#include "GPS.h"
#endif
#ifndef INPUTBROKER_MATRIX_TYPE #ifndef INPUTBROKER_MATRIX_TYPE
#define INPUTBROKER_MATRIX_TYPE 0 #define INPUTBROKER_MATRIX_TYPE 0
@ -397,6 +401,7 @@ int32_t CannedMessageModule::runOnce()
} }
break; break;
case 0x09: // tab case 0x09: // tab
case 0x91: // alt+t for T-Deck that doesn't have a tab key
if (this->destSelect == CANNED_MESSAGE_DESTINATION_TYPE_CHANNEL) { if (this->destSelect == CANNED_MESSAGE_DESTINATION_TYPE_CHANNEL) {
this->destSelect = CANNED_MESSAGE_DESTINATION_TYPE_NONE; this->destSelect = CANNED_MESSAGE_DESTINATION_TYPE_NONE;
} else if (this->destSelect == CANNED_MESSAGE_DESTINATION_TYPE_NODE) { } else if (this->destSelect == CANNED_MESSAGE_DESTINATION_TYPE_NODE) {
@ -411,13 +416,44 @@ int32_t CannedMessageModule::runOnce()
break; break;
// handle fn+s for shutdown // handle fn+s for shutdown
case 0x9b: case 0x9b:
if (screen)
screen->startShutdownScreen(); screen->startShutdownScreen();
shutdownAtMsec = millis() + DEFAULT_SHUTDOWN_SECONDS * 1000; shutdownAtMsec = millis() + DEFAULT_SHUTDOWN_SECONDS * 1000;
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
break; break;
// and fn+r for reboot // and fn+r for reboot
case 0x90: case 0x90:
if (screen)
screen->startRebootScreen(); screen->startRebootScreen();
rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000;
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
break;
case 0x9e: // toggle GPS like triple press does
if (gps != nullptr) {
gps->toggleGpsMode();
}
if (screen)
screen->forceDisplay();
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
break;
// mute (switch off/toggle) external notifications on fn+m
case 0xac:
if (moduleConfig.external_notification.enabled == true) {
if (externalNotificationModule->getMute()) {
externalNotificationModule->setMute(false);
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
} else {
externalNotificationModule->stopNow(); // this will turn off all GPIO and sounds and idle the loop
externalNotificationModule->setMute(true);
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
}
}
break;
case 0xaf: // fn+space send network ping like double press does
service.refreshLocalMeshNode();
service.sendNetworkPing(NODENUM_BROADCAST, true);
runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
break; break;
default: default:
if (this->cursor == this->freetext.length()) { if (this->cursor == this->freetext.length()) {

View File

@ -336,7 +336,7 @@ ExternalNotificationModule::ExternalNotificationModule()
ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshPacket &mp) ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshPacket &mp)
{ {
if (moduleConfig.external_notification.enabled) { if (moduleConfig.external_notification.enabled && !isMuted) {
#ifdef T_WATCH_S3 #ifdef T_WATCH_S3
drv.setWaveform(0, 75); drv.setWaveform(0, 75);
drv.setWaveform(1, 56); drv.setWaveform(1, 56);
@ -445,7 +445,7 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP
setIntervalFromNow(0); // run once so we know if we should do something setIntervalFromNow(0); // run once so we know if we should do something
} }
} else { } else {
LOG_INFO("External Notification Module Disabled\n"); LOG_INFO("External Notification Module Disabled or muted\n");
} }
return ProcessMessage::CONTINUE; // Let others look at this message also if they want return ProcessMessage::CONTINUE; // Let others look at this message also if they want

View File

@ -38,6 +38,9 @@ class ExternalNotificationModule : public SinglePortModule, private concurrency:
void setExternalOff(uint8_t index = 0); void setExternalOff(uint8_t index = 0);
bool getExternal(uint8_t index = 0); bool getExternal(uint8_t index = 0);
void setMute(bool mute) { isMuted = mute; }
bool getMute() { return isMuted; }
void stopNow(); void stopNow();
void handleGetRingtone(const meshtastic_MeshPacket &req, meshtastic_AdminMessage *response); void handleGetRingtone(const meshtastic_MeshPacket &req, meshtastic_AdminMessage *response);
@ -56,6 +59,8 @@ class ExternalNotificationModule : public SinglePortModule, private concurrency:
bool isNagging = false; bool isNagging = false;
bool isMuted = false;
virtual AdminMessageHandleResult handleAdminMessageForModule(const meshtastic_MeshPacket &mp, virtual AdminMessageHandleResult handleAdminMessageForModule(const meshtastic_MeshPacket &mp,
meshtastic_AdminMessage *request, meshtastic_AdminMessage *request,
meshtastic_AdminMessage *response) override; meshtastic_AdminMessage *response) override;