// // Created by bruno on 3/30/25. // #include "messages.h" #include "ui/ui.h" #include "driver/uart.h" #define T9Count 9 const char T9Table[10][T9Count] = { {'#', '(', ')', ';', ':', '<', '>', '/', '0'}, {',', '.', '?', '&', '!', ' ', '-', '_', '1'}, {'a', 'b', 'c', 'A', 'B', 'C', '[', ']', '2'}, {'d', 'e', 'f', 'D', 'E', 'F', '@', '%', '3'}, {'g', 'h', 'i', 'G', 'H', 'I', '~', '$', '4'}, {'j', 'k', 'l', 'J', 'K', 'L', '|', '*', '5'}, {'m', 'n', 'o', 'M', 'N', 'O', '{', '}', '6'}, {'p', 'q', 'r', 's', 'P', 'Q', 'R', 'S', '7'}, {'t', 'u', 'v', 'T', 'U', 'V', '"', '\'', '8'}, {'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9'} }; uint8_t gActiveMessage = 0; StoredPacket loadedPacket; void MESSAGES_SAVE() { uint8_t Data[8]; EEPROM_ReadBuffer(SEQParameterEEPROM, Data, 8); uint8_t msgIndex = Data[1]; if (msgIndex >= MESSAGES_COUNT) { msgIndex = 0; } Data[1]++; EEPROM_WriteBuffer(SEQParameterEEPROM, Data); EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 0, (uint8_t *) &inBoundPacket + 4); // metadata EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 8, (uint8_t *) &inBoundPacket + 12); // message part 1 EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 16, (uint8_t *) &inBoundPacket + 20); // message part 2 EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 24, (uint8_t *) &inBoundPacket + 28); // message part 3 EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 32, (uint8_t *) &inBoundPacket + 36); // message part 4 } void MESSAGES_GET() { EEPROM_ReadBuffer(MESSAGES_START + (gActiveMessage * sizeof(StoredPacket)), &loadedPacket, sizeof(StoredPacket)); } void MESSAGES_DELETE() { } void updatePrevChar(KEY_Code_t Key) { if (Key != prevKey) { prevKey = Key; } } void MESSAGES_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (gEnteringSMS != SMS_NOT_ENTERING && !bKeyHeld && Key <= KEY_9) { if (!dataPTR || dataPTR < dataPacket.data) { dataPTR = dataPacket.data; } if (gEnteringSMS == SMS_ENTERING_MESSAGE) { if (bKeyPressed) { if (prevKey != Key) { dataPTR++; if (dataPTR - dataPacket.data >= DataPacketDataSize) { dataPTR = dataPacket.data; } prevLetter = 0; } *(dataPTR - 1) = T9Table[Key][(prevLetter++) % T9Count]; updatePrevChar(Key); } return; } else if (gEnteringSMS == SMS_ENTERING_DEST) { if (bKeyPressed) { dataPacket.dest *= 10; dataPacket.dest += Key; prevLetter = 0; } return; } } switch (Key) { case KEY_PTT: case KEY_MENU: if (gEnteringSMS == SMS_NOT_ENTERING) { if (bKeyPressed) { gEnteringSMS = SMS_ENTERING_DEST; updatePrevChar(Key); } } else if (gEnteringSMS == SMS_ENTERING_DEST) { if (bKeyPressed) { memset(dataPacket.data, 0, DataPacketDataSize); prepareDataPacket(); dataPacket.flags = 126; gEnteringSMS = SMS_ENTERING_MESSAGE; } return; } else if (gEnteringSMS == SMS_ENTERING_MESSAGE) { if (bKeyPressed) { if (strlen((char *) dataPacket.data)) { const unsigned int vfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; if (VfoState[vfo] == VFO_STATE_NORMAL && !TX_freq_check(gCurrentVfo->freq_config_TX.Frequency)) { RADIO_PrepareTX(); BK4819_SetScramble(gCurrentVfo->SCRAMBLING_TYPE); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true); MSG_FSKSendData(&dataPacket); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false); MSG_EnableRX(true); gVfoConfigureMode = VFO_CONFIGURE; dataPTR = dataPacket.data; memset(dataPacket.data, 0, DataPacketDataSize); } gEnteringSMS = SMS_NOT_ENTERING; } } return; } break; case KEY_UP: if (bKeyPressed) { gActiveMessage++; if (gActiveMessage >= MESSAGES_COUNT) { gActiveMessage = 0; } MESSAGES_GET(); } break; case KEY_DOWN: if (bKeyPressed) { gActiveMessage--; if (gActiveMessage >= MESSAGES_COUNT) { gActiveMessage = MESSAGES_COUNT - 1; } MESSAGES_GET(); } break; case KEY_EXIT: if (gEnteringSMS != SMS_NOT_ENTERING) { if (bKeyHeld) { if (bKeyPressed) { gEnteringSMS = SMS_NOT_ENTERING; dataPTR = dataPacket.data; memset(dataPacket.data, 0, DataPacketDataSize); } } else { if (bKeyPressed) { if (gEnteringSMS == SMS_ENTERING_MESSAGE) { if (dataPacket.data <= dataPTR) { *dataPTR = '\0'; if (dataPacket.data < dataPTR) { dataPTR--; } *dataPTR = '\0'; } } else if (gEnteringSMS == SMS_ENTERING_DEST) { dataPacket.dest /= 10; } } } } else { if (bKeyPressed) { updatePrevChar(Key); gRequestDisplayScreen = DISPLAY_MAIN; } } break; default: if (!bKeyHeld && bKeyPressed) gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; break; } }