This commit is contained in:
@@ -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++) {
|
||||
|
Reference in New Issue
Block a user