#!/usr/bin/env python3 """Hook sending into the interface: a Reply button on an incoming message, and a working New msg entry. For this first step the text is a fixed quick reply, so the whole transmit path can be exercised on air before the keypad editor is written. """ W = "/home/viktor/ogd77rel/uv_src/OpenGD77_MDUV380_DM1701_20260130/MDUV380_firmware/application" # ---- Reply button on the incoming message popup ------------------------- p = W + "/source/applicationMain.c" s = open(p).read() if "smsReplyValidator" in s: print("applicationMain.c: reply already wired") else: # remember who to answer, and send the quick reply when the user confirms anchor = "\t\tif (smsHasUnread())\n" assert anchor in s, "unread block not found" helper = """static uint32_t smsReplyToId = 0; static bool smsReplyIsPrivate = true; // Called when the user confirms the Reply prompt on an incoming message. static bool smsReplyValidator(void) { smsSendText(smsReplyToId, (smsReplyIsPrivate == false), "OK"); return true; } """ # place the helper just before the function that contains the unread block fn_start = s.rindex("\nvoid ", 0, s.index(anchor)) s = s[:fn_start + 1] + helper + s[fn_start + 1:] old_show = """ uiDataGlobal.MessageBox.buttons = MESSAGEBOX_BUTTONS_OK; uiDataGlobal.MessageBox.validatorCallback = NULL;""" assert old_show in s, "message box setup not found" s = s.replace(old_show, """ // Yes replies to the sender, No just dismisses the message. uiDataGlobal.MessageBox.buttons = MESSAGEBOX_BUTTONS_YESNO; uiDataGlobal.MessageBox.validatorCallback = smsReplyValidator; smsReplyToId = msg->srcId; smsReplyIsPrivate = msg->isPrivate;""", 1) open(p, "w").write(s) print("applicationMain.c: Reply wired into the incoming message popup") # ---- New msg actually sends -------------------------------------------- p = W + "/source/user_interface/menuMessages.c" s = open(p).read() if "smsSendText" in s: print("menuMessages.c: already sends") else: old = """ case MESSAGES_ITEM_NEW: // Sending is not implemented yet; say so rather than opening a dead screen. uiNotificationShow(NOTIFICATION_TYPE_MESSAGE, NOTIFICATION_ID_MESSAGE, 2000, "Not yet", true); break;""" assert old in s, "New msg handler not found" s = s.replace(old, """ case MESSAGES_ITEM_NEW: // First step: send a fixed text to the current talkgroup, so the transmit // path can be exercised on air. The keypad editor comes next. if (smsSendText((trxTalkGroupOrPcId & 0x00FFFFFF), ((trxTalkGroupOrPcId >> 24) == TG_CALL_FLAG), "TEST FROM RADIO")) { uiNotificationShow(NOTIFICATION_TYPE_MESSAGE, NOTIFICATION_ID_MESSAGE, 2000, "Sending...", true); } else { uiNotificationShow(NOTIFICATION_TYPE_MESSAGE, NOTIFICATION_ID_MESSAGE, 2000, "Busy", true); } break;""", 1) s = s.replace('#include "functions/sound.h"', '#include "functions/sound.h"\n#include "functions/trx.h"\n#include "user_interface/uiUtilities.h"', 1) open(p, "w").write(s) print("menuMessages.c: New msg now transmits")