mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-17 15:27:29 +00:00
* First try at multimessage storage and display * Nrf built issue fix * Message view mode * Add channel name instead of channel slot * trunk fix * Fix for DM threading * fix for message time * rename of view mode to Conversations * Reply in thread feature * rename Select View Mode to Select Conversation * dismiss all live fix * Messages from phone show on screen * Decoupled message packets from screen.cpp and cleaned up * Cannedmessage cleanup and emotes fixed * Ack on messages sent * Ack message cleanup * Dismiss feature fixed * removed legacy temporary messages * Emote picker fix * Memory size debug * Build error fix * Sanity checks are okay sometimes * Lengthen channel name and finalize cleanup removal of Broadcast * Change DM to @ in order to unify on a single method * Continue unifying display, also show message status on the "isMine" lines * Add context for incoming messages * Better to say "in" vs "on" * crash fix for confirmation nodes * Fix outbound labels based to avoid creating delays * Eink autoscroll dissabled * gating for message storage when not using a screen * revert * Build fail fix * Don't error out with unset MAC address in unit tests * Provide some extra spacing for low hanging characters in messages * Reorder menu options and reword Respond * Reword menus to better reflect actions * Go to thread from favorite screen * Reorder Favorite Action Menu with simple word modifications * Consolidate wording on "Chats" * Mute channel fix * trunk fix * Clean up how muting works along with when we wake the screen * Fix builds for HELTEC_MESH_SOLAR * Signal bars for message ack * fix for notification renderer * Remove duplicate code, fix more Chats, and fix C6L MessageRenderer * Fix to many warnings related to BaseUI * preset aware signal strength display * More C6L fixes and clean up header lines * Use text aligns for message layout where necessary * Attempt to fix memory usage of invalidLifetime * Update channel mute for adjusted protobuf * Missed a comma in merge conflicts * cleanup to get more space * Trunk fixes * Optimize Hi Rez Chirpy to save space * more fixes * More cleanup * Remove used getConversationWith * Remove unused dismissNewestMessage * Fix another build error on occassion * Dimiss key combo function deprecated * More cleanup * Fn symbol code removed * Waypoint cleanup * Trunk fix * Fixup Waypoint screen with BaseUI code * Implement Haruki's ClockRenderer and broadcast decomposeTime across various files. * Revert "Implement Haruki's ClockRenderer and broadcast decomposeTime across various files." This reverts commit2f65721774. * Implement Haruki's ClockRenderer and broadcast decomposeTime across various files. Attempt 2! * remove memory usage debug * Revert only RangeTestModule.cpp change * Switch from dynamic std::string storage to fixed-size char[] * Removing old left over code * More optimization * Free Heap when not on Message screen * build error fixes * Restore ellipsis to end of long names * Remove legacy function renderMessageContent * improved destination filtering * force PKI * cleanup * Shorten longNames to not exceed message popups * log messages sent from apps * Trunk fix * Improve layout of messages screen * Fix potential crash for undefined variable * Revert changes to RedirectablePrint.cpp * Apply shortening to longNames in Select Destination * Fix short name displays * Fix sprintfOverlappingData issue * Fix nullPointerRedundantCheck warning on ESP32 * Add "Delete All Chats" to all chat views * Improve getSafeNodeName / sanitizeString code. * Improve getSafeNodeName further * Restore auto favorite; but only if not CLIENT_BASE * Don't favorite if WE are CLIENT_BASE role * Don't run message persistent in MUI * Fix broken endifs * Unkwnown nodes no longer show as ??? on message thread * More delete options and cleanup of code * fix for delete this chat * Message menu cleanup * trunk fix * Clean up some menu options and remove some Unit C6L ifdefines * Rework Delete flow * Desperate times call for desperate measures * Create a background on the connected icon to reduce overlap impact * Optimize code for background image * Fix for Muzi_Base * Trunk Fixes * Remove the up/down shortcut to launch canned messages (#8370) * Remove the up/down shortcut to launch canned messages * Enabled MQTT and WEBSERVER by default (#8679) Signed-off-by: kur1k0 <zhuzirun@m5stack.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz> --------- Signed-off-by: kur1k0 <zhuzirun@m5stack.com> Co-authored-by: Riker <zhuzirun@m5stack.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> * Correct string length calculation for signal bars * Manual message scrolling * Fix * Restore CannedMessages on Home Frame * UpDown situational destination for textMessage * Correct up/down destinations on textMessage frame * Update Screen.h for handleTextMessage * Update Screen.cpp to repair a merge issue * Add nudge scroll on UpDownEncoder devices. * Set nodeName to maximum size * Revert "Set nodeName to maximum size" This reverts commite254f39925. * Reflow Node Lists and TLora Pager Views (#8942) * Add files via upload * Move files into the right place * Short or Long Names for everyone! * Add scrolling to Node list * Pagination fix for Latest to oldest per page * Page counters * Dynamic scaling of column counts based upon screen size, clean up box drawing * Reflow Node Lists and TLora Pager Views (#8942) * Add files via upload * Move files into the right place * Short or Long Names for everyone! * Add scrolling to Node list * Pagination fix for Latest to oldest per page * Page counters * Dynamic scaling of column counts based upon screen size, clean up box drawing * Update exempt labels for stale bot workflow Adds triaged and backlog to the list of exempt labels. * Update naming of Frame Visibility toggles * Fix to scrolling * Fix for content cutting off when from us * Fix for "delete this chat" now it does delete the current one * Rework isHighResolution to be an enum called ScreenResolution * Migrate Unit C6L macro guards into currentResolution UltraLow checks * Mistakes happen - restoring NodeList Renderer line --------- Signed-off-by: kur1k0 <zhuzirun@m5stack.com> Co-authored-by: Jason P <applewiz@mac.com> Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz> Co-authored-by: Riker <zhuzirun@m5stack.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: whywilson <m.tools@qq.com> Co-authored-by: Tom Fifield <tom@tomfifield.net>
179 lines
6.7 KiB
C++
179 lines
6.7 KiB
C++
#include "WaypointModule.h"
|
|
#include "NodeDB.h"
|
|
#include "PowerFSM.h"
|
|
#include "configuration.h"
|
|
#include "graphics/SharedUIDisplay.h"
|
|
#include "graphics/draw/CompassRenderer.h"
|
|
|
|
#if HAS_SCREEN
|
|
#include "gps/RTC.h"
|
|
#include "graphics/Screen.h"
|
|
#include "graphics/TimeFormatters.h"
|
|
#include "graphics/draw/NodeListRenderer.h"
|
|
#include "main.h"
|
|
#endif
|
|
|
|
WaypointModule *waypointModule;
|
|
|
|
static inline float degToRad(float deg)
|
|
{
|
|
return deg * PI / 180.0f;
|
|
}
|
|
static inline float radToDeg(float rad)
|
|
{
|
|
return rad * 180.0f / PI;
|
|
}
|
|
|
|
ProcessMessage WaypointModule::handleReceived(const meshtastic_MeshPacket &mp)
|
|
{
|
|
#if defined(DEBUG_PORT) && !defined(DEBUG_MUTE)
|
|
auto &p = mp.decoded;
|
|
LOG_INFO("Received waypoint msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
|
|
#endif
|
|
// We only store/display messages destined for us.
|
|
// Keep a copy of the most recent text message.
|
|
devicestate.rx_waypoint = mp;
|
|
devicestate.has_rx_waypoint = true;
|
|
|
|
powerFSM.trigger(EVENT_RECEIVED_MSG);
|
|
|
|
#if HAS_SCREEN
|
|
|
|
UIFrameEvent e;
|
|
|
|
// New or updated waypoint: focus on this frame next time Screen::setFrames runs
|
|
if (shouldDraw()) {
|
|
requestFocus();
|
|
e.action = UIFrameEvent::Action::REGENERATE_FRAMESET;
|
|
}
|
|
|
|
// Deleting an old waypoint: remove the frame quietly, don't change frame position if possible
|
|
else
|
|
e.action = UIFrameEvent::Action::REGENERATE_FRAMESET_BACKGROUND;
|
|
|
|
notifyObservers(&e);
|
|
|
|
#endif
|
|
|
|
return ProcessMessage::CONTINUE; // Let others look at this message also if they want
|
|
}
|
|
|
|
#if HAS_SCREEN
|
|
bool WaypointModule::shouldDraw()
|
|
{
|
|
#if !MESHTASTIC_EXCLUDE_WAYPOINT
|
|
if (!screen || !devicestate.has_rx_waypoint)
|
|
return false;
|
|
|
|
meshtastic_Waypoint wp{}; // <- replaces memset
|
|
if (pb_decode_from_bytes(devicestate.rx_waypoint.decoded.payload.bytes, devicestate.rx_waypoint.decoded.payload.size,
|
|
&meshtastic_Waypoint_msg, &wp)) {
|
|
return wp.expire > getTime();
|
|
}
|
|
return false; // no LOG_ERROR, no flag writes
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
/// Draw the last waypoint we received
|
|
void WaypointModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
|
{
|
|
if (!screen)
|
|
return;
|
|
display->clear();
|
|
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
|
display->setFont(FONT_SMALL);
|
|
int line = 1;
|
|
|
|
// === Set Title
|
|
const char *titleStr = "Waypoint";
|
|
|
|
// === Header ===
|
|
graphics::drawCommonHeader(display, x, y, titleStr);
|
|
|
|
const int w = display->getWidth();
|
|
const int h = display->getHeight();
|
|
|
|
// Decode the waypoint
|
|
const meshtastic_MeshPacket &mp = devicestate.rx_waypoint;
|
|
meshtastic_Waypoint wp{};
|
|
if (!pb_decode_from_bytes(mp.decoded.payload.bytes, mp.decoded.payload.size, &meshtastic_Waypoint_msg, &wp)) {
|
|
devicestate.has_rx_waypoint = false;
|
|
return;
|
|
}
|
|
|
|
// Get timestamp info. Will pass as a field to drawColumns
|
|
char lastStr[20];
|
|
getTimeAgoStr(sinceReceived(&mp), lastStr, sizeof(lastStr));
|
|
|
|
// Will contain distance information, passed as a field to drawColumns
|
|
char distStr[20];
|
|
|
|
// Get our node, to use our own position
|
|
meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum());
|
|
|
|
// Dimensions / co-ordinates for the compass/circle
|
|
const uint16_t compassDiam = graphics::CompassRenderer::getCompassDiam(w, h);
|
|
const int16_t compassX = x + w - (compassDiam / 2) - 5;
|
|
const int16_t compassY = (config.display.displaymode == meshtastic_Config_DisplayConfig_DisplayMode_DEFAULT)
|
|
? y + h / 2
|
|
: y + FONT_HEIGHT_SMALL + (h - FONT_HEIGHT_SMALL) / 2;
|
|
|
|
// If our node has a position:
|
|
if (ourNode && (nodeDB->hasValidPosition(ourNode) || screen->hasHeading())) {
|
|
const meshtastic_PositionLite &op = ourNode->position;
|
|
float myHeading;
|
|
if (uiconfig.compass_mode == meshtastic_CompassMode_FREEZE_HEADING) {
|
|
myHeading = 0;
|
|
} else {
|
|
if (screen->hasHeading())
|
|
myHeading = degToRad(screen->getHeading());
|
|
else
|
|
myHeading = screen->estimatedHeading(DegD(op.latitude_i), DegD(op.longitude_i));
|
|
}
|
|
graphics::CompassRenderer::drawCompassNorth(display, compassX, compassY, myHeading, (compassDiam / 2));
|
|
|
|
// Compass bearing to waypoint
|
|
float bearingToOther =
|
|
GeoCoord::bearing(DegD(op.latitude_i), DegD(op.longitude_i), DegD(wp.latitude_i), DegD(wp.longitude_i));
|
|
// If the top of the compass is a static north then bearingToOther can be drawn on the compass directly
|
|
// If the top of the compass is not a static north we need adjust bearingToOther based on heading
|
|
if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING)
|
|
bearingToOther -= myHeading;
|
|
graphics::CompassRenderer::drawNodeHeading(display, compassX, compassY, compassDiam, bearingToOther);
|
|
|
|
float bearingToOtherDegrees = (bearingToOther < 0) ? bearingToOther + 2 * PI : bearingToOther;
|
|
bearingToOtherDegrees = radToDeg(bearingToOtherDegrees);
|
|
|
|
// Distance to Waypoint
|
|
float d = GeoCoord::latLongToMeter(DegD(wp.latitude_i), DegD(wp.longitude_i), DegD(op.latitude_i), DegD(op.longitude_i));
|
|
if (config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) {
|
|
float feet = d * METERS_TO_FEET;
|
|
snprintf(distStr, sizeof(distStr), feet < (2 * MILES_TO_FEET) ? "%.0fft %.0f°" : "%.1fmi %.0f°",
|
|
feet < (2 * MILES_TO_FEET) ? feet : feet / MILES_TO_FEET, bearingToOtherDegrees);
|
|
} else {
|
|
snprintf(distStr, sizeof(distStr), d < 2000 ? "%.0fm %.0f°" : "%.1fkm %.0f°", d < 2000 ? d : d / 1000,
|
|
bearingToOtherDegrees);
|
|
}
|
|
}
|
|
|
|
else {
|
|
display->drawString(compassX - FONT_HEIGHT_SMALL / 4, compassY - FONT_HEIGHT_SMALL / 2, "?");
|
|
|
|
// ? in the distance field
|
|
snprintf(distStr, sizeof(distStr), "? %s ?°",
|
|
(config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) ? "mi" : "km");
|
|
}
|
|
|
|
// Draw compass circle
|
|
display->drawCircle(compassX, compassY, compassDiam / 2);
|
|
|
|
display->setTextAlignment(TEXT_ALIGN_LEFT); // Something above me changes to a different alignment, forcing a fix here!
|
|
display->drawString(0, graphics::getTextPositions(display)[line++], lastStr);
|
|
display->drawString(0, graphics::getTextPositions(display)[line++], wp.name);
|
|
display->drawString(0, graphics::getTextPositions(display)[line++], wp.description);
|
|
display->drawString(0, graphics::getTextPositions(display)[line++], distStr);
|
|
}
|
|
#endif
|