mirror of https://github.com/SQ9MDD/ESP32IGate.git
Add RF Module and Edit IGate APRSC Supoort
This commit is contained in:
parent
9865aea668
commit
222e352c3d
|
|
@ -124,3 +124,6 @@ for Handheld
|
||||||
|
|
||||||
## ESP32 Flash Download Tools
|
## ESP32 Flash Download Tools
|
||||||
https://www.espressif.com/en/support/download/other-tools
|
https://www.espressif.com/en/support/download/other-tools
|
||||||
|
|
||||||
|
## HITH
|
||||||
|
This project implement by APRS text (TNC2 Raw) only,It not support null string(0x00) in the package.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef DIGIREPEATER_H
|
||||||
|
#define DIGIREPEATER_H
|
||||||
|
|
||||||
|
#include <AX25.h>
|
||||||
|
|
||||||
|
int digiProcess(AX25Msg &Packet);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef IGATE_H
|
||||||
|
#define IGATE_H
|
||||||
|
|
||||||
|
#include <LibAPRSesp.h>
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <AX25.h>
|
||||||
|
|
||||||
|
int igateProcess(AX25Msg &Packet);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -10,13 +10,20 @@
|
||||||
#ifndef MAIN_H
|
#ifndef MAIN_H
|
||||||
#define MAIN_H
|
#define MAIN_H
|
||||||
|
|
||||||
#define VERSION "0.5a"
|
#define VERSION "0.6"
|
||||||
|
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
//#define DEBUG_IS
|
//#define DEBUG_IS
|
||||||
|
|
||||||
//#define SDCARD
|
//#define SDCARD
|
||||||
//#define SA818
|
//#define SA818
|
||||||
|
//#define SR_FRS
|
||||||
|
|
||||||
|
#ifdef SR_FRS
|
||||||
|
#ifndef SA818
|
||||||
|
#define SA818
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define WIFI_OFF_FIX 0
|
#define WIFI_OFF_FIX 0
|
||||||
#define WIFI_AP_FIX 1
|
#define WIFI_AP_FIX 1
|
||||||
|
|
@ -59,7 +66,8 @@ enum M17Flags
|
||||||
CONNECTED_RO = 1 << 6
|
CONNECTED_RO = 1 << 6
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Config_Struct {
|
typedef struct Config_Struct
|
||||||
|
{
|
||||||
bool synctime;
|
bool synctime;
|
||||||
bool aprs;
|
bool aprs;
|
||||||
bool wifi_client;
|
bool wifi_client;
|
||||||
|
|
@ -119,7 +127,8 @@ typedef struct Config_Struct {
|
||||||
#endif
|
#endif
|
||||||
} Configuration;
|
} Configuration;
|
||||||
|
|
||||||
typedef struct igateTLM_struct {
|
typedef struct igateTLM_struct
|
||||||
|
{
|
||||||
uint16_t Sequence;
|
uint16_t Sequence;
|
||||||
unsigned long ParmTimeout;
|
unsigned long ParmTimeout;
|
||||||
unsigned long TeleTimeout;
|
unsigned long TeleTimeout;
|
||||||
|
|
@ -130,7 +139,8 @@ typedef struct igateTLM_struct {
|
||||||
uint8_t DROP;
|
uint8_t DROP;
|
||||||
} igateTLMType;
|
} igateTLMType;
|
||||||
|
|
||||||
typedef struct pkgListStruct {
|
typedef struct pkgListStruct
|
||||||
|
{
|
||||||
time_t time;
|
time_t time;
|
||||||
char calsign[11];
|
char calsign[11];
|
||||||
char ssid[5];
|
char ssid[5];
|
||||||
|
|
@ -139,7 +149,8 @@ typedef struct pkgListStruct {
|
||||||
uint8_t symbol;
|
uint8_t symbol;
|
||||||
} pkgListType;
|
} pkgListType;
|
||||||
|
|
||||||
typedef struct statisticStruct {
|
typedef struct statisticStruct
|
||||||
|
{
|
||||||
uint32_t allCount;
|
uint32_t allCount;
|
||||||
uint32_t tncCount;
|
uint32_t tncCount;
|
||||||
uint32_t isCount;
|
uint32_t isCount;
|
||||||
|
|
@ -152,7 +163,8 @@ typedef struct statisticStruct {
|
||||||
uint32_t inet2rf;
|
uint32_t inet2rf;
|
||||||
} statusType;
|
} statusType;
|
||||||
|
|
||||||
typedef struct digiTLM_struct{
|
typedef struct digiTLM_struct
|
||||||
|
{
|
||||||
unsigned int Sequence;
|
unsigned int Sequence;
|
||||||
unsigned int ParmTimeout;
|
unsigned int ParmTimeout;
|
||||||
unsigned int TeleTimeout;
|
unsigned int TeleTimeout;
|
||||||
|
|
@ -162,7 +174,8 @@ typedef struct digiTLM_struct{
|
||||||
unsigned char ErPkts;
|
unsigned char ErPkts;
|
||||||
} digiTLMType;
|
} digiTLMType;
|
||||||
|
|
||||||
typedef struct txQueue_struct{
|
typedef struct txQueue_struct
|
||||||
|
{
|
||||||
bool Active;
|
bool Active;
|
||||||
long timeStamp;
|
long timeStamp;
|
||||||
int Delay;
|
int Delay;
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,6 @@ void listDir(fs::FS& fs, const char* dirname, uint8_t levels);
|
||||||
void webService();
|
void webService();
|
||||||
#ifdef SA818
|
#ifdef SA818
|
||||||
void handle_radio();
|
void handle_radio();
|
||||||
extern void SA818_INIT(uint8_t HL);
|
extern void SA818_INIT(bool boot);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef PROTOCOL_AX25_H
|
#ifndef PROTOCOL_AX25_H
|
||||||
#define PROTOCOL_AX25_H
|
#define PROTOCOL_AX25_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,281 @@
|
||||||
|
#include "digirepeater.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
RTC_DATA_ATTR digiTLMType digiLog;
|
||||||
|
RTC_DATA_ATTR uint8_t digiCount = 0;
|
||||||
|
|
||||||
|
extern Configuration config;
|
||||||
|
|
||||||
|
int digiProcess(AX25Msg &Packet)
|
||||||
|
{
|
||||||
|
int idx, j;
|
||||||
|
uint8_t ctmp;
|
||||||
|
// if(!DIGI) return;
|
||||||
|
// if(rx_data) return;
|
||||||
|
// if(digi_timeout<aprs_delay) return;
|
||||||
|
// digi_timeout = 65530;
|
||||||
|
// aprs_delay = 65535;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
if (Packet.len < 5)
|
||||||
|
{
|
||||||
|
digiLog.ErPkts++;
|
||||||
|
return 0; // NO DST
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(&Packet.src.call[0], "NOCALL", 6))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strncmp(&Packet.src.call[0], "MYCALL", 6))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destination SSID Trace
|
||||||
|
if (Packet.dst.ssid > 0)
|
||||||
|
{
|
||||||
|
uint8_t ctmp = Packet.dst.ssid & 0x1E; // Check DSSID
|
||||||
|
|
||||||
|
if (ctmp > 15)
|
||||||
|
ctmp = 0;
|
||||||
|
if (ctmp < 8)
|
||||||
|
{ // Edit PATH Change to TRACEn-N
|
||||||
|
if (ctmp > 0)
|
||||||
|
ctmp--;
|
||||||
|
Packet.dst.ssid = ctmp;
|
||||||
|
if (Packet.rpt_count > 0)
|
||||||
|
{
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (!strcmp(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0])) // Is path same callsign
|
||||||
|
{
|
||||||
|
if (Packet.rpt_list[idx].ssid == config.aprs_ssid) // IS path same SSID
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0; // bypass flag *
|
||||||
|
}
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
continue;
|
||||||
|
for (j = idx; j < Packet.rpt_count; j++)
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << j))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Move current part to next part
|
||||||
|
for (; j >= idx; j--)
|
||||||
|
{
|
||||||
|
int n = j + 1;
|
||||||
|
strcpy(&Packet.rpt_list[n].call[0], &Packet.rpt_list[j].call[0]);
|
||||||
|
Packet.rpt_list[n].ssid = Packet.rpt_list[j].ssid;
|
||||||
|
if (Packet.rpt_flags & (1 << j))
|
||||||
|
Packet.rpt_flags |= (1 << n);
|
||||||
|
else
|
||||||
|
Packet.rpt_flags &= ~(1 << n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new part
|
||||||
|
Packet.rpt_count += 1;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
return 2;
|
||||||
|
// j = 1;
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idx = 0;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
Packet.rpt_count += 1;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0; // NO PATH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (!strncmp(&Packet.rpt_list[idx].call[0], "qA", 2))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (!strncmp(&Packet.rpt_list[idx].call[0], "TCP", 3))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
{
|
||||||
|
if (idx == (Packet.rpt_count - 1))
|
||||||
|
digiCount++;
|
||||||
|
continue; // bypass flag *
|
||||||
|
}
|
||||||
|
if (!strncmp(&Packet.rpt_list[idx].call[0], "WIDE", 4))
|
||||||
|
{
|
||||||
|
// Check WIDEn-N
|
||||||
|
if (Packet.rpt_list[idx].ssid > 0)
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
continue; // bypass flag *
|
||||||
|
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
||||||
|
if (ctmp > 0)
|
||||||
|
ctmp--;
|
||||||
|
if (ctmp > 15)
|
||||||
|
ctmp = 0;
|
||||||
|
if (ctmp == 0)
|
||||||
|
{
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
j = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Packet.rpt_list[idx].ssid = ctmp;
|
||||||
|
Packet.rpt_flags &= ~(1 << idx);
|
||||||
|
j = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(&Packet.rpt_list[idx].call[0], "TRACE", 5))
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
continue; // bypass flag *
|
||||||
|
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
||||||
|
if (ctmp > 0)
|
||||||
|
ctmp--;
|
||||||
|
if (ctmp > 15)
|
||||||
|
ctmp = 0;
|
||||||
|
if (ctmp == 0)
|
||||||
|
{
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
j = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (j = idx; j < Packet.rpt_count; j++)
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << j))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Move current part to next part
|
||||||
|
for (; j >= idx; j--)
|
||||||
|
{
|
||||||
|
int n = j + 1;
|
||||||
|
strcpy(&Packet.rpt_list[n].call[0], &Packet.rpt_list[j].call[0]);
|
||||||
|
Packet.rpt_list[n].ssid = Packet.rpt_list[j].ssid;
|
||||||
|
if (Packet.rpt_flags & (1 << j))
|
||||||
|
Packet.rpt_flags |= (1 << n);
|
||||||
|
else
|
||||||
|
Packet.rpt_flags &= ~(1 << n);
|
||||||
|
}
|
||||||
|
// Reduce N part of TRACEn-N
|
||||||
|
Packet.rpt_list[idx + 1].ssid = ctmp;
|
||||||
|
|
||||||
|
// Add new part
|
||||||
|
Packet.rpt_count += 1;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
j = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(&Packet.rpt_list[idx].call[0], "RFONLY", 6))
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
// strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
// Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!strncmp(&Packet.rpt_list[idx].call[0], "RELAY", 5))
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!strncmp(&Packet.rpt_list[idx].call[0], "GATE", 4))
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!strncmp(&Packet.rpt_list[idx].call[0], "ECHO", 4))
|
||||||
|
{
|
||||||
|
j = 2;
|
||||||
|
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
||||||
|
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!strcmp(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0])) // Is path same callsign
|
||||||
|
{
|
||||||
|
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
||||||
|
if (ctmp == config.aprs_ssid) // IS path same SSID
|
||||||
|
{
|
||||||
|
if (Packet.rpt_flags & (1 << idx))
|
||||||
|
{
|
||||||
|
digiLog.DropRx++;
|
||||||
|
break; // bypass flag *
|
||||||
|
}
|
||||||
|
Packet.rpt_flags |= (1 << idx);
|
||||||
|
j = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
#include "igate.h"
|
||||||
|
|
||||||
|
extern WiFiClient aprsClient;
|
||||||
|
|
||||||
|
int igateProcess(AX25Msg &Packet)
|
||||||
|
{
|
||||||
|
int idx, j;
|
||||||
|
uint8_t ctmp;
|
||||||
|
String header;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
if (Packet.len < 2)
|
||||||
|
{
|
||||||
|
// digiLog.ErPkts++;
|
||||||
|
return 0; // NO INFO DATA
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (!strncmp(&Packet.rpt_list[idx].call[0], "RFONLY", 6))
|
||||||
|
{
|
||||||
|
// digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < Packet.rpt_count; idx++)
|
||||||
|
{
|
||||||
|
if (!strncmp(&Packet.rpt_list[idx].call[0], "TCPIP", 5))
|
||||||
|
{
|
||||||
|
// digiLog.DropRx++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header = String(Packet.src.call);
|
||||||
|
if (Packet.src.ssid > 0)
|
||||||
|
{
|
||||||
|
header += String(F("-"));
|
||||||
|
header += String(Packet.src.ssid);
|
||||||
|
}
|
||||||
|
header += String(F(">"));
|
||||||
|
header += String(Packet.dst.call);
|
||||||
|
if (Packet.dst.ssid > 0)
|
||||||
|
{
|
||||||
|
header += String(F("-"));
|
||||||
|
header += String(Packet.dst.ssid);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < Packet.rpt_count; i++)
|
||||||
|
{
|
||||||
|
header += String(",");
|
||||||
|
header += String(Packet.rpt_list[i].call);
|
||||||
|
if (Packet.rpt_list[i].ssid > 0)
|
||||||
|
{
|
||||||
|
header += String("-");
|
||||||
|
header += String(Packet.rpt_list[i].ssid);
|
||||||
|
}
|
||||||
|
if (Packet.rpt_flags & (1 << i))
|
||||||
|
header += "*";
|
||||||
|
}
|
||||||
|
header += String(F(":"));
|
||||||
|
aprsClient.print(header);
|
||||||
|
aprsClient.write(&Packet.info[0], Packet.len); // info binary write aprsc support
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
484
src/main.cpp
484
src/main.cpp
|
|
@ -19,6 +19,8 @@
|
||||||
#include <WiFiClient.h>
|
#include <WiFiClient.h>
|
||||||
#include "cppQueue.h"
|
#include "cppQueue.h"
|
||||||
#include "BluetoothSerial.h"
|
#include "BluetoothSerial.h"
|
||||||
|
#include "digirepeater.h"
|
||||||
|
#include "igate.h"
|
||||||
|
|
||||||
#include <WiFiClientSecure.h>
|
#include <WiFiClientSecure.h>
|
||||||
|
|
||||||
|
|
@ -66,9 +68,9 @@ cppQueue PacketBuffer(sizeof(AX25Msg), 5, IMPLEMENTATION); // Instantiate queue
|
||||||
|
|
||||||
statusType status;
|
statusType status;
|
||||||
RTC_DATA_ATTR igateTLMType igateTLM;
|
RTC_DATA_ATTR igateTLMType igateTLM;
|
||||||
RTC_DATA_ATTR digiTLMType digiLog;
|
|
||||||
RTC_DATA_ATTR txQueueType txQueue[PKGTXSIZE];
|
RTC_DATA_ATTR txQueueType txQueue[PKGTXSIZE];
|
||||||
RTC_DATA_ATTR uint8_t digiCount = 0;
|
|
||||||
|
extern RTC_DATA_ATTR uint8_t digiCount;
|
||||||
|
|
||||||
Configuration config;
|
Configuration config;
|
||||||
|
|
||||||
|
|
@ -186,7 +188,7 @@ void defaultConfig()
|
||||||
sprintf(config.tnc_comment, "ESP32 Build in TNC");
|
sprintf(config.tnc_comment, "ESP32 Build in TNC");
|
||||||
sprintf(config.aprs_filter, "g/HS*/E2*");
|
sprintf(config.aprs_filter, "g/HS*/E2*");
|
||||||
sprintf(config.tnc_path, "WIDE1-1");
|
sprintf(config.tnc_path, "WIDE1-1");
|
||||||
config.wifi_power = -4;
|
config.wifi_power = 44;
|
||||||
config.input_hpf = true;
|
config.input_hpf = true;
|
||||||
#ifdef SA818
|
#ifdef SA818
|
||||||
config.freq_rx = 144.3900;
|
config.freq_rx = 144.3900;
|
||||||
|
|
@ -424,51 +426,56 @@ uint8_t popGwRaw(uint8_t *raw)
|
||||||
|
|
||||||
#ifdef SA818
|
#ifdef SA818
|
||||||
unsigned long SA818_Timeout = 0;
|
unsigned long SA818_Timeout = 0;
|
||||||
void SA818_INIT(uint8_t HL)
|
void SA818_INIT(bool boot)
|
||||||
{
|
{
|
||||||
Serial.println("SA868 Init");
|
#ifdef SR_FRS
|
||||||
pinMode(0, INPUT);
|
Serial.println("Radio Module SR_FRS Init");
|
||||||
|
#else
|
||||||
|
Serial.println("Radio Module SA868 Init");
|
||||||
|
#endif
|
||||||
|
if (boot)
|
||||||
|
{
|
||||||
|
SerialRF.begin(9600, SERIAL_8N1, 14, 13);
|
||||||
pinMode(POWER_PIN, OUTPUT);
|
pinMode(POWER_PIN, OUTPUT);
|
||||||
pinMode(PULLDOWN_PIN, OUTPUT);
|
pinMode(PULLDOWN_PIN, OUTPUT);
|
||||||
pinMode(SQL_PIN, INPUT_PULLUP);
|
pinMode(SQL_PIN, INPUT_PULLUP);
|
||||||
|
|
||||||
SerialRF.begin(9600, SERIAL_8N1, 14, 13);
|
|
||||||
|
|
||||||
digitalWrite(PULLDOWN_PIN, HIGH);
|
|
||||||
digitalWrite(POWER_PIN, LOW);
|
digitalWrite(POWER_PIN, LOW);
|
||||||
|
digitalWrite(PULLDOWN_PIN, LOW);
|
||||||
delay(500);
|
delay(500);
|
||||||
// SerialRF.println("AT+DMOSETVOLUME=2");
|
digitalWrite(PULLDOWN_PIN, HIGH);
|
||||||
|
delay(1500);
|
||||||
SerialRF.println();
|
SerialRF.println();
|
||||||
delay(1000);
|
delay(500);
|
||||||
// AT+DMOSETGROUP=1,144.3900,144.3900,0,1,0,0
|
}
|
||||||
// SerialRF.println("AT+DMOSETGROUP=0,145.7625,145.7625,0,1,0,0");
|
SerialRF.println();
|
||||||
|
delay(500);
|
||||||
char str[100];
|
char str[100];
|
||||||
if (config.sql_level > 8)
|
if (config.sql_level > 8)
|
||||||
config.sql_level = 8;
|
config.sql_level = 8;
|
||||||
sprintf(str, "AT+DMOSETGROUP=%01d,%0.4f,%0.4f,%04d,%01d,%04d", config.band, config.freq_tx + ((float)config.offset_tx / 1000000), config.freq_rx + ((float)config.offset_rx / 1000000), config.tone_tx, config.sql_level, config.tone_rx);
|
#ifdef SR_FRS
|
||||||
Serial.println(str);
|
sprintf(str, "AT+DMOSETGROUP=%01d,%0.4f,%0.4f,%d,%01d,%d,4", config.band, config.freq_tx + ((float)config.offset_tx / 1000000), config.freq_rx + ((float)config.offset_rx / 1000000), config.tone_rx, config.sql_level, config.tone_tx);
|
||||||
SerialRF.println(str);
|
SerialRF.println(str);
|
||||||
delay(500);
|
delay(500);
|
||||||
// SerialRF.println("AT+DMOAUTOPOWCONTR=1");
|
// Module auto power save setting
|
||||||
// delay(500);
|
SerialRF.println("AT+DMOAUTOPOWCONTR=1");
|
||||||
|
delay(500);
|
||||||
|
SerialRF.println("AT+DMOSETVOX=0");
|
||||||
|
delay(500);
|
||||||
|
SerialRF.println("AT+DMOSETMIC=1,0,0");
|
||||||
|
#else
|
||||||
|
sprintf(str, "AT+DMOSETGROUP=%01d,%0.4f,%0.4f,%04d,%01d,%04d", config.band, config.freq_tx + ((float)config.offset_tx / 1000000), config.freq_rx + ((float)config.offset_rx / 1000000), config.tone_tx, config.sql_level, config.tone_rx);
|
||||||
|
SerialRF.println(str);
|
||||||
|
delay(500);
|
||||||
|
SerialRF.println("AT+SETTAIL=0");
|
||||||
|
delay(500);
|
||||||
|
SerialRF.println("AT+SETFILTER=1,1,1");
|
||||||
|
#endif
|
||||||
|
// SerialRF.println(str);
|
||||||
|
delay(500);
|
||||||
if (config.volume > 8)
|
if (config.volume > 8)
|
||||||
config.volume = 8;
|
config.volume = 8;
|
||||||
SerialRF.printf("AT+DMOSETVOLUME=%d\r\n", config.volume);
|
SerialRF.printf("AT+DMOSETVOLUME=%d\r\n", config.volume);
|
||||||
delay(500);
|
|
||||||
// SerialRF.println("AT+DMOSETVOX=0");
|
|
||||||
// delay(500);
|
|
||||||
// SerialRF.println("AT+DMOSETMIC=1,0,0");
|
|
||||||
// delay(500);
|
|
||||||
SerialRF.println("AT+SETTAIL=0");
|
|
||||||
delay(500);
|
|
||||||
// APRS,4FSK
|
|
||||||
SerialRF.println("AT+SETFILTER=1,1,1");
|
|
||||||
// delay(500);
|
|
||||||
// M17
|
|
||||||
// SerialRF.println("AT+SETFILTER=0,0,0");
|
|
||||||
// delay(100);
|
|
||||||
// AFSK_TimerEnable(true);
|
|
||||||
// digitalWrite(POWER_PIN, LOW);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SA818_SLEEP()
|
void SA818_SLEEP()
|
||||||
|
|
@ -493,17 +500,17 @@ void SA818_CHECK()
|
||||||
SA818_Timeout = millis();
|
SA818_Timeout = millis();
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Serial.println(SerialRF.readString());
|
// Serial.println(SerialRF.readString());
|
||||||
Serial.println("SA818 Activated");
|
Serial.println("Radio SA818/SR_FRS Activated");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Serial.println("SA818 deActive");
|
Serial.println("Radio SA818/SR_FRS deActive");
|
||||||
digitalWrite(POWER_PIN, LOW);
|
digitalWrite(POWER_PIN, LOW);
|
||||||
digitalWrite(PULLDOWN_PIN, LOW);
|
digitalWrite(PULLDOWN_PIN, LOW);
|
||||||
delay(500);
|
delay(500);
|
||||||
SA818_INIT(LOW);
|
SA818_INIT(true);
|
||||||
}
|
}
|
||||||
// SerialGPS.print("$PMTK161,0*28\r\n");
|
// SerialGPS.print("$PMTK161,0*28\r\n");
|
||||||
// AFSK_TimerEnable(false);
|
// AFSK_TimerEnable(false);
|
||||||
|
|
@ -651,7 +658,7 @@ void setup()
|
||||||
input_HPF = config.input_hpf;
|
input_HPF = config.input_hpf;
|
||||||
|
|
||||||
#ifdef SA818
|
#ifdef SA818
|
||||||
SA818_INIT(LOW);
|
SA818_INIT(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enableLoopWDT();
|
enableLoopWDT();
|
||||||
|
|
@ -726,37 +733,37 @@ String send_fix_location()
|
||||||
return tnc2Raw;
|
return tnc2Raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
int processPacket(String &tnc2)
|
int packet2Raw(String &tnc2, AX25Msg &Packet)
|
||||||
{
|
{
|
||||||
if (incomingPacket.len < 5)
|
if (Packet.len < 5)
|
||||||
return 0;
|
return 0;
|
||||||
tnc2 = String(incomingPacket.src.call);
|
tnc2 = String(Packet.src.call);
|
||||||
if (incomingPacket.src.ssid > 0)
|
if (Packet.src.ssid > 0)
|
||||||
{
|
{
|
||||||
tnc2 += String(F("-"));
|
tnc2 += String(F("-"));
|
||||||
tnc2 += String(incomingPacket.src.ssid);
|
tnc2 += String(Packet.src.ssid);
|
||||||
}
|
}
|
||||||
tnc2 += String(F(">"));
|
tnc2 += String(F(">"));
|
||||||
tnc2 += String(incomingPacket.dst.call);
|
tnc2 += String(Packet.dst.call);
|
||||||
if (incomingPacket.dst.ssid > 0)
|
if (Packet.dst.ssid > 0)
|
||||||
{
|
{
|
||||||
tnc2 += String(F("-"));
|
tnc2 += String(F("-"));
|
||||||
tnc2 += String(incomingPacket.dst.ssid);
|
tnc2 += String(Packet.dst.ssid);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < incomingPacket.rpt_count; i++)
|
for (int i = 0; i < Packet.rpt_count; i++)
|
||||||
{
|
{
|
||||||
tnc2 += String(",");
|
tnc2 += String(",");
|
||||||
tnc2 += String(incomingPacket.rpt_list[i].call);
|
tnc2 += String(Packet.rpt_list[i].call);
|
||||||
if (incomingPacket.rpt_list[i].ssid > 0)
|
if (Packet.rpt_list[i].ssid > 0)
|
||||||
{
|
{
|
||||||
tnc2 += String("-");
|
tnc2 += String("-");
|
||||||
tnc2 += String(incomingPacket.rpt_list[i].ssid);
|
tnc2 += String(Packet.rpt_list[i].ssid);
|
||||||
}
|
}
|
||||||
if (incomingPacket.rpt_flags & (1 << i))
|
if (Packet.rpt_flags & (1 << i))
|
||||||
tnc2 += "*";
|
tnc2 += "*";
|
||||||
}
|
}
|
||||||
tnc2 += String(F(":"));
|
tnc2 += String(F(":"));
|
||||||
tnc2 += String((const char *)incomingPacket.info);
|
tnc2 += String((const char *)Packet.info);
|
||||||
tnc2 += String("\n");
|
tnc2 += String("\n");
|
||||||
|
|
||||||
// #ifdef DEBUG_TNC
|
// #ifdef DEBUG_TNC
|
||||||
|
|
@ -914,7 +921,7 @@ void taskAPRS(void *pvParameters)
|
||||||
if (digiCount > 0)
|
if (digiCount > 0)
|
||||||
digiCount--;
|
digiCount--;
|
||||||
#ifdef SA818
|
#ifdef SA818
|
||||||
//SA818_CHECK();
|
SA818_CHECK();
|
||||||
#endif
|
#endif
|
||||||
if (AFSKInitAct == true)
|
if (AFSKInitAct == true)
|
||||||
{
|
{
|
||||||
|
|
@ -980,8 +987,38 @@ void taskAPRS(void *pvParameters)
|
||||||
String tnc2;
|
String tnc2;
|
||||||
//นำข้อมูลแพ็จเกจจาก TNC ออกจากคิว
|
//นำข้อมูลแพ็จเกจจาก TNC ออกจากคิว
|
||||||
PacketBuffer.pop(&incomingPacket);
|
PacketBuffer.pop(&incomingPacket);
|
||||||
processPacket(tnc2);
|
// igateProcess(incomingPacket);
|
||||||
|
packet2Raw(tnc2, incomingPacket);
|
||||||
|
|
||||||
|
// IGate Process
|
||||||
|
if (config.rf2inet && aprsClient.connected())
|
||||||
|
{
|
||||||
|
int ret = igateProcess(incomingPacket);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
status.dropCount++;
|
||||||
|
igateTLM.DROP++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status.rf2inet++;
|
||||||
|
igateTLM.RF2INET++;
|
||||||
|
igateTLM.TX++;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printTime();
|
||||||
|
Serial.print("RF->INET: ");
|
||||||
|
Serial.println(tnc2);
|
||||||
|
#endif
|
||||||
|
char call[11];
|
||||||
|
if (incomingPacket.src.ssid > 0)
|
||||||
|
sprintf(call, "%s-%d", incomingPacket.src.call, incomingPacket.src.ssid);
|
||||||
|
else
|
||||||
|
sprintf(call, "%s", incomingPacket.src.call);
|
||||||
|
pkgListUpdate(call, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Digi Repeater Process
|
||||||
if (config.tnc_digi)
|
if (config.tnc_digi)
|
||||||
{
|
{
|
||||||
int dlyFlag = digiProcess(incomingPacket);
|
int dlyFlag = digiProcess(incomingPacket);
|
||||||
|
|
@ -1011,7 +1048,7 @@ void taskAPRS(void *pvParameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String digiPkg;
|
String digiPkg;
|
||||||
processPacket(digiPkg);
|
packet2Raw(digiPkg, incomingPacket);
|
||||||
pkgTxUpdate(digiPkg.c_str(), digiDelay);
|
pkgTxUpdate(digiPkg.c_str(), digiDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1020,73 +1057,6 @@ void taskAPRS(void *pvParameters)
|
||||||
lastPkgRaw = tnc2;
|
lastPkgRaw = tnc2;
|
||||||
// ESP_BT.println(tnc2);
|
// ESP_BT.println(tnc2);
|
||||||
status.allCount++;
|
status.allCount++;
|
||||||
|
|
||||||
// String tnc2 = SerialTNC.readStringUntil('\n');
|
|
||||||
if (config.rf2inet && aprsClient.connected())
|
|
||||||
{
|
|
||||||
int start_val = tnc2.indexOf(">", 0); // หาตำแหน่งแรกของ >
|
|
||||||
if (start_val > 3)
|
|
||||||
{
|
|
||||||
raw = (char *)malloc(tnc2.length() + 20);
|
|
||||||
status.tncCount++;
|
|
||||||
if (tnc2.indexOf("RFONLY", 10) > 0) //NOGATE PATH RFONLY จะไม่ส่งเข้า APRS-IS
|
|
||||||
{
|
|
||||||
status.dropCount++;
|
|
||||||
igateTLM.DROP++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
str = (char *)malloc(tnc2.length());
|
|
||||||
tnc2.toCharArray(&str[0], tnc2.length());
|
|
||||||
int i = tnc2.indexOf(":");
|
|
||||||
int t = tnc2.indexOf("TCPIP*", 5);
|
|
||||||
|
|
||||||
if (i > 10)
|
|
||||||
{
|
|
||||||
if (t > 0)
|
|
||||||
str[t - 1] = 0;
|
|
||||||
else
|
|
||||||
str[i] = 0;
|
|
||||||
if (config.aprs_ssid == 0)
|
|
||||||
sprintf(raw, "%s,qAR,%s:%s", &str[0], config.aprs_mycall, &str[i + 1]);
|
|
||||||
else
|
|
||||||
sprintf(raw, "%s,qAR,%s-%d:%s", &str[0], config.aprs_mycall, config.aprs_ssid, &str[i + 1]);
|
|
||||||
// sprintf(raw, "%s", &str[0]);
|
|
||||||
tnc2 = String(raw);
|
|
||||||
aprsClient.println(tnc2);
|
|
||||||
status.rf2inet++;
|
|
||||||
igateTLM.RF2INET++;
|
|
||||||
igateTLM.TX++;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printTime();
|
|
||||||
Serial.print("RF->INET: ");
|
|
||||||
Serial.println(tnc2);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status.errorCount++;
|
|
||||||
igateTLM.DROP++;
|
|
||||||
}
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
// memset(&raw[0], 0, sizeof(raw));
|
|
||||||
tnc2.toCharArray(&raw[0], start_val + 1);
|
|
||||||
raw[start_val + 1] = 0;
|
|
||||||
pkgListUpdate(&raw[0], 1);
|
|
||||||
free(raw);
|
|
||||||
// #ifdef DEBUG
|
|
||||||
// printTime();
|
|
||||||
// Serial.print("TNC ");
|
|
||||||
// Serial.println(tnc2);
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status.errorCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1294,277 +1264,3 @@ void taskNetwork(void *pvParameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int digiProcess(AX25Msg &Packet)
|
|
||||||
{
|
|
||||||
int idx, j;
|
|
||||||
uint8_t ctmp;
|
|
||||||
// if(!DIGI) return;
|
|
||||||
// if(rx_data) return;
|
|
||||||
// if(digi_timeout<aprs_delay) return;
|
|
||||||
// digi_timeout = 65530;
|
|
||||||
// aprs_delay = 65535;
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
if (Packet.len < 5)
|
|
||||||
{
|
|
||||||
digiLog.ErPkts++;
|
|
||||||
return 0; // NO DST
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strncmp(&Packet.src.call[0], "NOCALL", 6))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!strncmp(&Packet.src.call[0], "MYCALL", 6))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destination SSID Trace
|
|
||||||
if (Packet.dst.ssid > 0)
|
|
||||||
{
|
|
||||||
uint8_t ctmp = Packet.dst.ssid & 0x1E; // Check DSSID
|
|
||||||
|
|
||||||
if (ctmp > 15)
|
|
||||||
ctmp = 0;
|
|
||||||
if (ctmp < 8)
|
|
||||||
{ // Edit PATH Change to TRACEn-N
|
|
||||||
if (ctmp > 0)
|
|
||||||
ctmp--;
|
|
||||||
Packet.dst.ssid = ctmp;
|
|
||||||
if (Packet.rpt_count > 0)
|
|
||||||
{
|
|
||||||
for (idx = 0; idx < Packet.rpt_count; idx++)
|
|
||||||
{
|
|
||||||
if (!strcmp(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0])) // Is path same callsign
|
|
||||||
{
|
|
||||||
if (Packet.rpt_list[idx].ssid == config.aprs_ssid) // IS path same SSID
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0; // bypass flag *
|
|
||||||
}
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
continue;
|
|
||||||
for (j = idx; j < Packet.rpt_count; j++)
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << j))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Move current part to next part
|
|
||||||
for (; j >= idx; j--)
|
|
||||||
{
|
|
||||||
int n = j + 1;
|
|
||||||
strcpy(&Packet.rpt_list[n].call[0], &Packet.rpt_list[j].call[0]);
|
|
||||||
Packet.rpt_list[n].ssid = Packet.rpt_list[j].ssid;
|
|
||||||
if (Packet.rpt_flags & (1 << j))
|
|
||||||
Packet.rpt_flags |= (1 << n);
|
|
||||||
else
|
|
||||||
Packet.rpt_flags &= ~(1 << n);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new part
|
|
||||||
Packet.rpt_count += 1;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
return 2;
|
|
||||||
// j = 1;
|
|
||||||
// break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
idx = 0;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
Packet.rpt_count += 1;
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0; // NO PATH
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (idx = 0; idx < Packet.rpt_count; idx++)
|
|
||||||
{
|
|
||||||
if (!strncmp(&Packet.rpt_list[idx].call[0], "qA", 2))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (idx = 0; idx < Packet.rpt_count; idx++)
|
|
||||||
{
|
|
||||||
if (!strncmp(&Packet.rpt_list[idx].call[0], "TCP", 3))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (idx = 0; idx < Packet.rpt_count; idx++)
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
{
|
|
||||||
if (idx == (Packet.rpt_count - 1))
|
|
||||||
digiCount++;
|
|
||||||
continue; // bypass flag *
|
|
||||||
}
|
|
||||||
if (!strncmp(&Packet.rpt_list[idx].call[0], "WIDE", 4))
|
|
||||||
{
|
|
||||||
// Check WIDEn-N
|
|
||||||
if (Packet.rpt_list[idx].ssid > 0)
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
continue; // bypass flag *
|
|
||||||
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
|
||||||
if (ctmp > 0)
|
|
||||||
ctmp--;
|
|
||||||
if (ctmp > 15)
|
|
||||||
ctmp = 0;
|
|
||||||
if (ctmp == 0)
|
|
||||||
{
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
j = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Packet.rpt_list[idx].ssid = ctmp;
|
|
||||||
Packet.rpt_flags &= ~(1 << idx);
|
|
||||||
j = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
j = 2;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!strncmp(&Packet.rpt_list[idx].call[0], "TRACE", 5))
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
continue; // bypass flag *
|
|
||||||
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
|
||||||
if (ctmp > 0)
|
|
||||||
ctmp--;
|
|
||||||
if (ctmp > 15)
|
|
||||||
ctmp = 0;
|
|
||||||
if (ctmp == 0)
|
|
||||||
{
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
j = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (j = idx; j < Packet.rpt_count; j++)
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << j))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Move current part to next part
|
|
||||||
for (; j >= idx; j--)
|
|
||||||
{
|
|
||||||
int n = j + 1;
|
|
||||||
strcpy(&Packet.rpt_list[n].call[0], &Packet.rpt_list[j].call[0]);
|
|
||||||
Packet.rpt_list[n].ssid = Packet.rpt_list[j].ssid;
|
|
||||||
if (Packet.rpt_flags & (1 << j))
|
|
||||||
Packet.rpt_flags |= (1 << n);
|
|
||||||
else
|
|
||||||
Packet.rpt_flags &= ~(1 << n);
|
|
||||||
}
|
|
||||||
// Reduce N part of TRACEn-N
|
|
||||||
Packet.rpt_list[idx + 1].ssid = ctmp;
|
|
||||||
|
|
||||||
// Add new part
|
|
||||||
Packet.rpt_count += 1;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
j = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!strncmp(&Packet.rpt_list[idx].call[0], "RFONLY", 6))
|
|
||||||
{
|
|
||||||
j = 2;
|
|
||||||
// strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
// Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!strncmp(&Packet.rpt_list[idx].call[0], "RELAY", 5))
|
|
||||||
{
|
|
||||||
j = 2;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!strncmp(&Packet.rpt_list[idx].call[0], "GATE", 4))
|
|
||||||
{
|
|
||||||
j = 2;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!strncmp(&Packet.rpt_list[idx].call[0], "ECHO", 4))
|
|
||||||
{
|
|
||||||
j = 2;
|
|
||||||
strcpy(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0]);
|
|
||||||
Packet.rpt_list[idx].ssid = config.aprs_ssid;
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!strcmp(&Packet.rpt_list[idx].call[0], &config.aprs_mycall[0])) // Is path same callsign
|
|
||||||
{
|
|
||||||
ctmp = Packet.rpt_list[idx].ssid & 0x1F;
|
|
||||||
if (ctmp == config.aprs_ssid) // IS path same SSID
|
|
||||||
{
|
|
||||||
if (Packet.rpt_flags & (1 << idx))
|
|
||||||
{
|
|
||||||
digiLog.DropRx++;
|
|
||||||
break; // bypass flag *
|
|
||||||
}
|
|
||||||
Packet.rpt_flags |= (1 << idx);
|
|
||||||
j = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
j = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
j = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return j;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1110,7 +1110,7 @@ void handle_radio()
|
||||||
// config.agc=agcEn;
|
// config.agc=agcEn;
|
||||||
saveEEPROM();
|
saveEEPROM();
|
||||||
// delay(100);
|
// delay(100);
|
||||||
SA818_INIT(LOW);
|
SA818_INIT(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
setHTML(7);
|
setHTML(7);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue