Start implementing ack
All checks were successful
Build Firmware / build (push) Successful in 1m1s

This commit is contained in:
2025-04-01 14:47:18 +02:00
parent 0ea8767a8b
commit 7b1d31fdef
7 changed files with 110 additions and 47 deletions

View File

@@ -17,6 +17,12 @@ uint8_t *dataPTR = dataPacket.data;
SMSEnteringState gEnteringSMS = SMS_NOT_ENTERING;
SMSResponseState gSMSResponseState = SMS_RESPONSE_IDLE;
bool gGotACK = false;
uint8_t SMSResponseCounter = 0;
typedef enum {
Receiving,
Ready
@@ -24,6 +30,28 @@ typedef enum {
RXState rxState = Ready;
void FSKModem_TimeSlice500ms(void) {
if (SMSResponseCounter && SMSResponseCounter++ > 3) {
switch (gSMSResponseState) {
case SMS_RESPONSE_ACK:
inBoundPacket.flags |= 0x64;
inBoundPacket.dest = inBoundPacket.src;
inBoundPacket.src = gEeprom.FSKSRCAddress;
SYSTEM_DelayMs(200);
MSG_FSKSendData(&inBoundPacket);
break;
case SMS_RESPONSE_RETRANSMIT:
SYSTEM_DelayMs(200);
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true);
MSG_FSKSendData(packet);
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);
break;
default:
break;
}
}
}
void MSG_ConfigureFSK(bool rx) {
BK4819_WriteRegister(BK4819_REG_70, TONE2_ENABLE_BIT | (96U << 0));
@@ -130,13 +158,23 @@ void processReceivedPacket(DataPacket *packet) {
: gEeprom.TX_VFO;
if (packet->dest == gEeprom.FSKSRCAddress) {
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
BK4819_PlaySingleTone(1000, 250, 127, true);
strcpy(String, "SMS by ");
itoa(packet->src, numBuf); // Convert number to string
strcat(String, numBuf);
MESSAGES_SAVE();
UI_DisplayPopup(String);
if ((packet->flags & 0x128)) {
if (packet->flags & 0x64) {
if (memcmp(inBoundPacket.data, dataPacket.data, DataPacketDataSize) == 0) {
gGotACK = true;
}
} else {
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
BK4819_PlaySingleTone(1000, 250, 127, true);
strcpy(String, "SMS by ");
itoa(packet->src, numBuf); // Convert number to string
strcat(String, numBuf);
MESSAGES_SAVE();
UI_DisplayPopup(String);
SMSResponseCounter = 1;
gSMSResponseState = SMS_RESPONSE_ACK;
}
}
#ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) {
UI_PrintStringSmallNormal(String, 2, 0, 5);
@@ -150,9 +188,8 @@ void processReceivedPacket(DataPacket *packet) {
} else if (VfoState[vfo] == VFO_STATE_NORMAL && !TX_freq_check(gCurrentVfo->freq_config_TX.Frequency)) {
if (packet->ttl--) {
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true);
MSG_FSKSendData(packet);
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);
SMSResponseCounter = 1;
gSMSResponseState = SMS_RESPONSE_RETRANSMIT;
}
}
@@ -166,7 +203,7 @@ bool MSG_FSKReceiveData() {
}
// Read the received data from FIFO
uint16_t *ptr = (uint16_t *) &inBoundPacket;
uint16_t *ptr = (uint16_t * ) & inBoundPacket;
size_t wordCount = sizeof(inBoundPacket) / sizeof(uint16_t);
for (size_t i = 0; i < wordCount; i++) {
@@ -314,6 +351,10 @@ void MSG_FSKSendData(DataPacket *dataPacketIn) {
BK4819_ExitTxMute();
}
if (!(dataPacketIn->flags & 0x64)) {
gGotACK = false;
}
}
void prepareDataPacket() {
@@ -348,7 +389,7 @@ void FSK_HANDLE_IRQ(unsigned short irq) {
if (rx_fifo_almost_full && rxState == Receiving) {
const uint16_t count = BK4819_ReadRegister(BK4819_REG_5E) & (7u << 0); // Almost full threshold
uint16_t *ptr = (uint16_t *) &inBoundPacket;
uint16_t *ptr = (uint16_t * ) & inBoundPacket;
size_t wordCount = sizeof(inBoundPacket) / sizeof(uint16_t);
for (uint16_t i = 0; i < count && gFSKWriteIndex < wordCount; i++) {