firmware/src/modules/CannedMessageModule.h

109 lines
3.8 KiB
C
Raw Normal View History

2022-01-04 18:42:28 +00:00
#pragma once
2022-10-13 13:44:27 +00:00
#if HAS_SCREEN
#include "ProtobufModule.h"
2022-01-12 08:26:42 +00:00
#include "input/InputBroker.h"
2022-01-04 18:42:28 +00:00
2023-01-21 13:34:29 +00:00
enum cannedMessageModuleRunState {
CANNED_MESSAGE_RUN_STATE_DISABLED,
2022-01-19 08:55:06 +00:00
CANNED_MESSAGE_RUN_STATE_INACTIVE,
CANNED_MESSAGE_RUN_STATE_ACTIVE,
CANNED_MESSAGE_RUN_STATE_FREETEXT,
2022-01-19 08:55:06 +00:00
CANNED_MESSAGE_RUN_STATE_SENDING_ACTIVE,
CANNED_MESSAGE_RUN_STATE_ACK_RECEIVED,
2022-01-19 08:55:06 +00:00
CANNED_MESSAGE_RUN_STATE_ACTION_SELECT,
CANNED_MESSAGE_RUN_STATE_ACTION_UP,
CANNED_MESSAGE_RUN_STATE_ACTION_DOWN,
2022-01-04 21:02:16 +00:00
};
2022-02-27 09:49:24 +00:00
#define CANNED_MESSAGE_MODULE_MESSAGE_MAX_COUNT 50
/**
2022-02-27 09:20:23 +00:00
* Sum of CannedMessageModuleConfig part sizes.
*/
2022-02-27 09:49:24 +00:00
#define CANNED_MESSAGE_MODULE_MESSAGES_SIZE 800
2022-01-04 18:43:06 +00:00
#ifndef CANNED_MESSAGE_MODULE_ENABLE
#define CANNED_MESSAGE_MODULE_ENABLE 0
#endif
2023-01-21 13:34:29 +00:00
class CannedMessageModule : public SinglePortModule, public Observable<const UIFrameEvent *>, private concurrency::OSThread
2022-01-04 18:42:28 +00:00
{
2022-02-27 09:20:23 +00:00
CallbackObserver<CannedMessageModule, const InputEvent *> inputObserver =
2023-01-21 13:34:29 +00:00
CallbackObserver<CannedMessageModule, const InputEvent *>(this, &CannedMessageModule::handleInputEvent);
2022-01-04 18:42:28 +00:00
public:
2022-02-27 09:20:23 +00:00
CannedMessageModule();
2023-01-21 13:34:29 +00:00
const char *getCurrentMessage();
const char *getPrevMessage();
const char *getNextMessage();
const char *getMessageByIndex(int index);
2023-01-21 13:34:29 +00:00
const char *getNodeName(NodeNum node);
2022-01-09 09:08:31 +00:00
bool shouldDraw();
// void eventUp();
// void eventDown();
// void eventSelect();
2022-01-04 18:42:28 +00:00
void handleGetCannedMessageModuleMessages(const meshtastic_MeshPacket &req, meshtastic_AdminMessage *response);
void handleSetCannedMessageModuleMessages(const char *from_msg);
2022-09-20 14:21:32 +00:00
String drawWithCursor(String text, int cursor);
/*
-Override the wantPacket method. We need the Routing Messages to look for ACKs.
*/
virtual bool wantPacket(const meshtastic_MeshPacket *p) override
{
switch (p->decoded.portnum) {
case meshtastic_PortNum_TEXT_MESSAGE_APP:
case meshtastic_PortNum_ROUTING_APP:
return true;
default:
return false;
}
}
2022-01-04 18:42:28 +00:00
protected:
2022-01-24 17:24:40 +00:00
virtual int32_t runOnce() override;
2022-01-04 18:42:28 +00:00
2023-01-21 13:34:29 +00:00
void sendText(NodeNum dest, const char *message, bool wantReplies);
2022-01-04 18:42:28 +00:00
2022-01-12 08:26:42 +00:00
int splitConfiguredMessages();
2022-01-09 09:08:31 +00:00
int getNextIndex();
int getPrevIndex();
2022-01-09 09:08:31 +00:00
int handleInputEvent(const InputEvent *event);
2022-01-24 17:24:40 +00:00
virtual bool wantUIFrame() override { return this->shouldDraw(); }
2023-01-21 13:34:29 +00:00
virtual Observable<const UIFrameEvent *> *getUIFrameObservable() override { return this; }
virtual void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) override;
2023-01-21 17:39:58 +00:00
virtual AdminMessageHandleResult handleAdminMessageForModule(const meshtastic_MeshPacket &mp,
meshtastic_AdminMessage *request,
meshtastic_AdminMessage *response) override;
/** Called to handle a particular incoming message
* @return ProcessMessage::STOP if you've guaranteed you've handled this message and no other handlers should be considered
* for it
*/
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;
2022-02-27 10:21:02 +00:00
void loadProtoForModule();
bool saveProtoForModule();
2022-02-27 09:20:23 +00:00
void installDefaultCannedMessageModuleConfig();
2022-01-04 18:42:28 +00:00
2022-01-04 18:43:06 +00:00
int currentMessageIndex = -1;
2022-02-27 09:20:23 +00:00
cannedMessageModuleRunState runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
char payload = 0x00;
unsigned int cursor = 0;
2023-01-21 13:34:29 +00:00
String freetext = ""; // Text Buffer for Freetext Editor
bool destSelect = false; // Freetext Editor Mode
NodeNum dest = NODENUM_BROADCAST;
NodeNum incoming = NODENUM_BROADCAST;
2022-01-12 08:26:42 +00:00
2023-01-21 13:34:29 +00:00
char messageStore[CANNED_MESSAGE_MODULE_MESSAGES_SIZE + 1];
2022-02-27 09:49:24 +00:00
char *messages[CANNED_MESSAGE_MODULE_MESSAGE_MAX_COUNT];
2022-01-12 08:26:42 +00:00
int messagesCount = 0;
2022-01-13 11:51:36 +00:00
unsigned long lastTouchMillis = 0;
2022-01-04 18:42:28 +00:00
};
2022-02-27 09:20:23 +00:00
extern CannedMessageModule *cannedMessageModule;
2022-10-13 13:44:27 +00:00
#endif