kopia lustrzana https://github.com/SP8EBC/ParaTNC
fixes in aprsis igate code after ut
rodzic
007f086d7c
commit
3f51027c60
|
@ -10,7 +10,8 @@
|
|||
|
||||
#include "drivers/serial.h"
|
||||
#include "gsm/sim800c_tcpip.h"
|
||||
|
||||
#include "ax25.h"
|
||||
#include "config_data.h"
|
||||
|
||||
|
||||
typedef enum aprsis_return {
|
||||
|
@ -35,15 +36,41 @@ extern uint8_t aprsis_connected;
|
|||
* @param reset_on_timeout Set to one to reset GSM module in case of APRS-IS
|
||||
* instead of only reconnecting
|
||||
*/
|
||||
void aprsis_init(srl_context_t * context, gsm_sim800_state_t * gsm_modem_state, char * callsign, uint8_t ssid, uint32_t passcode, char * default_server, uint16_t default_port, uint8_t reset_on_timeout);
|
||||
void aprsis_init(
|
||||
srl_context_t * context,
|
||||
gsm_sim800_state_t * gsm_modem_state,
|
||||
const char * callsign,
|
||||
uint8_t ssid,
|
||||
uint32_t passcode,
|
||||
const char * default_server,
|
||||
const uint16_t default_port,
|
||||
uint8_t reset_on_timeout,
|
||||
const char * callsign_with_ssid);
|
||||
aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_ln, uint16_t port, uint8_t auto_send_beacon);
|
||||
aprsis_return_t aprsis_connect_and_login_default(uint8_t auto_send_beacon);
|
||||
void aprsis_disconnect(void);
|
||||
void aprsis_receive_callback(srl_context_t* srl_context);
|
||||
void aprsis_check_alive(void);
|
||||
|
||||
void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity);
|
||||
void aprsis_send_beacon(uint8_t async);
|
||||
void aprsis_igate_to_aprsis(struct AX25Msg *msg);
|
||||
void aprsis_send_wx_frame(uint16_t windspeed,
|
||||
uint16_t windgusts,
|
||||
uint16_t winddirection,
|
||||
float temperatura,
|
||||
float cisnienie,
|
||||
uint8_t humidity,
|
||||
const char * callsign_with_ssid,
|
||||
const char * string_latitude,
|
||||
const char * string_longitude,
|
||||
const config_data_basic_t * config_data_basic);
|
||||
void aprsis_send_beacon(uint8_t async,
|
||||
const char * callsign_with_ssid,
|
||||
const char * string_latitude,
|
||||
char symbol_f,
|
||||
const char * string_longitude,
|
||||
char symbol_s,
|
||||
const config_data_basic_t * config_data_basic);
|
||||
void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid);
|
||||
|
||||
char * aprsis_get_tx_buffer(void);
|
||||
|
||||
#endif /* APRSIS_H_ */
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "gsm/sim800_state_t.h"
|
||||
|
||||
#define SW_VER "EA22"
|
||||
#define SW_DATE "10062023"
|
||||
#define SW_DATE "15062023"
|
||||
#define SW_KISS_PROTO "A"
|
||||
|
||||
#define SYSTICK_TICKS_PER_SECONDS 100
|
||||
|
@ -76,6 +76,7 @@ extern char main_own_aprs_msg[OWN_APRS_MSG_LN];
|
|||
|
||||
extern char main_string_latitude[9];
|
||||
extern char main_string_longitude[9];
|
||||
extern char main_callsign_with_ssid[10];
|
||||
|
||||
extern char main_symbol_f;
|
||||
extern char main_symbol_s;
|
||||
|
|
152
src/aprsis.c
152
src/aprsis.c
|
@ -18,11 +18,6 @@ srl_context_t * aprsis_serial_port;
|
|||
|
||||
gsm_sim800_state_t * aprsis_gsm_modem_state;
|
||||
|
||||
/**
|
||||
* Buffer to store string representation of callsign with SSID
|
||||
*/
|
||||
char aprsis_callsign_with_ssid[10];
|
||||
|
||||
/**
|
||||
* Size of transmit buffer
|
||||
*/
|
||||
|
@ -53,6 +48,8 @@ char aprsis_login_string[64];
|
|||
*/
|
||||
const char * aprsis_default_server_address;
|
||||
|
||||
const char * aprsis_callsign_with_ssid;
|
||||
|
||||
uint16_t aprsis_default_server_address_ln = 0;
|
||||
|
||||
uint16_t aprsis_default_server_port;
|
||||
|
@ -78,25 +75,32 @@ uint32_t aprsis_reset_on_timeout = 0;
|
|||
|
||||
#define APRSIS_TIMEOUT_MS 123000//123000
|
||||
|
||||
#define MAXIMUM_CALL_SSID_LN 9
|
||||
/**
|
||||
* Lenght of 6 letter callsign + two digit SSID + end character like '>' or ","
|
||||
*/
|
||||
#define MAXIMUM_CALL_SSID_DASH_LN 10
|
||||
|
||||
void aprsis_init(srl_context_t * context, gsm_sim800_state_t * gsm_modem_state, char * callsign, uint8_t ssid, uint32_t passcode, char * default_server, uint16_t default_port, uint8_t reset_on_timeout) {
|
||||
void aprsis_init(
|
||||
srl_context_t * context,
|
||||
gsm_sim800_state_t * gsm_modem_state,
|
||||
const char * callsign,
|
||||
uint8_t ssid,
|
||||
uint32_t passcode,
|
||||
const char * default_server,
|
||||
const uint16_t default_port,
|
||||
uint8_t reset_on_timeout,
|
||||
const char * callsign_with_ssid) {
|
||||
aprsis_serial_port = context;
|
||||
|
||||
aprsis_gsm_modem_state = gsm_modem_state;
|
||||
|
||||
aprsis_passcode = (int32_t)passcode;
|
||||
|
||||
if (ssid != 0) {
|
||||
sprintf(aprsis_callsign_with_ssid, "%s-%d", callsign, ssid);
|
||||
}
|
||||
else {
|
||||
sprintf(aprsis_callsign_with_ssid, "%s", callsign);
|
||||
}
|
||||
aprsis_callsign_with_ssid = callsign_with_ssid;
|
||||
|
||||
memset(aprsis_login_string, 0x00, 0x40);
|
||||
|
||||
sprintf(aprsis_login_string, "user %s pass %ld vers ParaMETEO %s \r\n", aprsis_callsign_with_ssid, aprsis_passcode, SW_VER);
|
||||
sprintf(aprsis_login_string, "user %s pass %ld vers ParaMETEO %s \r\n", callsign_with_ssid, aprsis_passcode, SW_VER);
|
||||
|
||||
aprsis_logged = 0;
|
||||
|
||||
|
@ -187,7 +191,7 @@ aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_l
|
|||
aprsis_last_keepalive_ts = master_time;
|
||||
|
||||
if (auto_send_beacon != 0) {
|
||||
aprsis_send_beacon(0);
|
||||
aprsis_send_beacon(0, aprsis_callsign_with_ssid, main_string_latitude, main_symbol_f, main_string_longitude, main_symbol_s, main_config_data_basic);
|
||||
}
|
||||
|
||||
// set timeout for aprs-is server
|
||||
|
@ -286,7 +290,30 @@ void aprsis_check_alive(void) {
|
|||
}
|
||||
}
|
||||
|
||||
void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity) {
|
||||
/**
|
||||
*
|
||||
* @param windspeed
|
||||
* @param windgusts
|
||||
* @param winddirection
|
||||
* @param temperatura
|
||||
* @param cisnienie
|
||||
* @param humidity
|
||||
* @param callsign_with_ssid
|
||||
* @param string_latitude
|
||||
* @param string_longitude
|
||||
* @param config_data_basic
|
||||
*/
|
||||
void aprsis_send_wx_frame(
|
||||
uint16_t windspeed,
|
||||
uint16_t windgusts,
|
||||
uint16_t winddirection,
|
||||
float temperatura,
|
||||
float cisnienie,
|
||||
uint8_t humidity,
|
||||
const char * callsign_with_ssid,
|
||||
const char * string_latitude,
|
||||
const char * string_longitude,
|
||||
const config_data_basic_t * config_data_basic) {
|
||||
|
||||
if (aprsis_logged == 0) {
|
||||
return;
|
||||
|
@ -322,7 +349,23 @@ void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t windd
|
|||
|
||||
memset(aprsis_packet_tx_buffer, 0x00, sizeof(aprsis_packet_tx_buffer));
|
||||
// main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "=%s%c%c%s%c%c %s", main_string_latitude, main_config_data_basic->n_or_s, main_symbol_f, main_string_longitude, main_config_data_basic->e_or_w, main_symbol_s, main_config_data_basic->comment);
|
||||
aprsis_packet_tx_message_size = sprintf(aprsis_packet_tx_buffer, "%s>AKLPRZ,qAR,%s:!%s%c%c%s%c%c%03d/%03dg%03dt%03dr...p...P...b%05ldh%02d\r\n", aprsis_callsign_with_ssid, aprsis_callsign_with_ssid, main_string_latitude, main_config_data_basic->n_or_s, '/', main_string_longitude, main_config_data_basic->e_or_w, '_', /* kierunek */direction, /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), pressure, humidity);
|
||||
aprsis_packet_tx_message_size = sprintf(
|
||||
aprsis_packet_tx_buffer,
|
||||
"%s>AKLPRZ,qAR,%s:!%s%c%c%s%c%c%03d/%03dg%03dt%03dr...p...P...b%05ldh%02d\r\n",
|
||||
callsign_with_ssid,
|
||||
callsign_with_ssid,
|
||||
string_latitude,
|
||||
config_data_basic->n_or_s,
|
||||
'/',
|
||||
string_longitude,
|
||||
config_data_basic->e_or_w,
|
||||
'_',
|
||||
/* kierunek */direction,
|
||||
/* predkosc*/(int)wind_speed_mph,
|
||||
/* porywy */(short)(wind_gusts_mph),
|
||||
/*temperatura */(short)(temperatura*1.8+32),
|
||||
pressure,
|
||||
humidity);
|
||||
aprsis_packet_tx_buffer[aprsis_packet_tx_message_size] = 0;
|
||||
|
||||
gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state);
|
||||
|
@ -333,13 +376,32 @@ void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t windd
|
|||
* @param async zero for blocking io, which lock this function during transmission.
|
||||
* non zero for non blocking io, function will return immediately and sending will be done in background
|
||||
*/
|
||||
void aprsis_send_beacon(uint8_t async) {
|
||||
void aprsis_send_beacon(
|
||||
uint8_t async,
|
||||
const char * callsign_with_ssid,
|
||||
const char * string_latitude,
|
||||
char symbol_f,
|
||||
const char * string_longitude,
|
||||
char symbol_s,
|
||||
const config_data_basic_t * config_data_basic
|
||||
) {
|
||||
|
||||
if (aprsis_logged == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
aprsis_packet_tx_message_size = sprintf(aprsis_packet_tx_buffer, "%s>AKLPRZ,qAR,%s:=%s%c%c%s%c%c %s\r\n", aprsis_callsign_with_ssid, aprsis_callsign_with_ssid, main_string_latitude, main_config_data_basic->n_or_s, main_symbol_f, main_string_longitude, main_config_data_basic->e_or_w, main_symbol_s, main_config_data_basic->comment);
|
||||
aprsis_packet_tx_message_size = sprintf(
|
||||
aprsis_packet_tx_buffer,
|
||||
"%s>AKLPRZ,qAR,%s:=%s%c%c%s%c%c %s\r\n",
|
||||
callsign_with_ssid,
|
||||
callsign_with_ssid,
|
||||
string_latitude,
|
||||
config_data_basic->n_or_s,
|
||||
symbol_f,
|
||||
string_longitude,
|
||||
config_data_basic->e_or_w,
|
||||
symbol_s,
|
||||
config_data_basic->comment);
|
||||
aprsis_packet_tx_buffer[aprsis_packet_tx_message_size] = 0;
|
||||
|
||||
if (async > 0) {
|
||||
|
@ -350,10 +412,12 @@ void aprsis_send_beacon(uint8_t async) {
|
|||
}
|
||||
}
|
||||
|
||||
void aprsis_igate_to_aprsis(struct AX25Msg *msg) {
|
||||
void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) {
|
||||
|
||||
// iterator to move across tx buffer
|
||||
uint8_t tx_buffer_it = 0;
|
||||
uint16_t tx_buffer_it = 0;
|
||||
|
||||
uint16_t payload_ln = 0;
|
||||
|
||||
// string lenght returned by snprintf
|
||||
int snprintf_size = 0;
|
||||
|
@ -366,29 +430,23 @@ void aprsis_igate_to_aprsis(struct AX25Msg *msg) {
|
|||
// prepare buffer for message
|
||||
memset(aprsis_packet_tx_buffer, 0x00, APRSIS_TX_BUFFER_LN);
|
||||
|
||||
// lenght of a source call
|
||||
const size_t source_call_ln = strlen(msg->src.call);
|
||||
|
||||
// lenght of destination call
|
||||
const size_t dest_call_ln = strlen(msg->dst.call);
|
||||
|
||||
// put callsign
|
||||
strncat(aprsis_packet_tx_buffer, msg->src.call, 6);
|
||||
|
||||
// put source call
|
||||
if ((msg->src.ssid & 0xF) == 0) {
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_LN, "%.6s-%d>", msg->src.call, msg->src.ssid & 0xF);
|
||||
if ((msg->src.ssid & 0xF) != 0) {
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_DASH_LN, "%.6s-%d>", msg->src.call, msg->src.ssid & 0xF);
|
||||
}
|
||||
else {
|
||||
// callsign without SSID
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_LN, "%.6s>", msg->src.call);
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_DASH_LN, "%.6s>", msg->src.call);
|
||||
}
|
||||
|
||||
// move iterator forward
|
||||
tx_buffer_it = (uint8_t) snprintf_size & 0xFFU;
|
||||
|
||||
// put destination call - for sake of simplicity ignore SSID
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_LN, "%.6s,", msg->dst.call);
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_DASH_LN, "%.6s,", msg->dst.call);
|
||||
|
||||
// move iterator
|
||||
tx_buffer_it += (uint8_t) snprintf_size & 0xFFU;
|
||||
|
@ -397,15 +455,39 @@ void aprsis_igate_to_aprsis(struct AX25Msg *msg) {
|
|||
for (int i = 0; i < msg->rpt_cnt; i++) {
|
||||
if ((msg->rpt_lst[i].ssid & 0x0F) == 0) {
|
||||
if ((msg->rpt_lst[i].ssid & 0x40) == 0x40)
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s*,", cIn->tDigi[i].call);
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s*,", msg->rpt_lst[i].call);
|
||||
else
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s,", cIn->tDigi[i].call);
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s,", msg->rpt_lst[i].call);
|
||||
}
|
||||
else {
|
||||
if ((msg->rpt_lst[i].ssid & 0x40) == 0x40)
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d*," cIn->tDigi[i].call, (msg->rpt_lst[i].ssid & 0x0F));
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d*,", msg->rpt_lst[i].call, (msg->rpt_lst[i].ssid & 0x0F));
|
||||
else
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d", cIn->tDigi[i].call, (msg->rpt_lst[i].ssid & 0x0F));
|
||||
snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d,", msg->rpt_lst[i].call, (msg->rpt_lst[i].ssid & 0x0F));
|
||||
}
|
||||
|
||||
// move iterator
|
||||
tx_buffer_it += (uint8_t) snprintf_size & 0xFFU;
|
||||
}
|
||||
|
||||
snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_DASH_LN + 5, "qAR,%s:", callsign_with_ssid);
|
||||
|
||||
// move iterator
|
||||
tx_buffer_it += (uint8_t) snprintf_size & 0xFFU;
|
||||
|
||||
// cut the data field if it is too long to fit in transmission buffer
|
||||
if (msg->len + tx_buffer_it >= APRSIS_TX_BUFFER_LN) {
|
||||
payload_ln = APRSIS_TX_BUFFER_LN - tx_buffer_it - 1; // keep one byte for null terminator
|
||||
}
|
||||
else {
|
||||
payload_ln = msg->len;
|
||||
}
|
||||
|
||||
memcpy(aprsis_packet_tx_buffer + tx_buffer_it, msg->info, payload_ln);
|
||||
|
||||
|
||||
}
|
||||
|
||||
char * aprsis_get_tx_buffer(void) {
|
||||
return aprsis_packet_tx_buffer;
|
||||
}
|
||||
|
|
12
src/main.c
12
src/main.c
|
@ -253,6 +253,7 @@ char main_own_aprs_msg[OWN_APRS_MSG_LN];
|
|||
|
||||
char main_string_latitude[9];
|
||||
char main_string_longitude[9];
|
||||
char main_callsign_with_ssid[10];
|
||||
|
||||
#define MAIN_SMALL_BUFFER_LN 20
|
||||
uint8_t main_small_buffer[MAIN_SMALL_BUFFER_LN];
|
||||
|
@ -521,6 +522,14 @@ int main(int argc, char* argv[]){
|
|||
memset(main_string_longitude, 0x00, sizeof(main_string_longitude));
|
||||
float_to_string(main_config_data_basic->longitude, main_string_longitude, sizeof(main_string_longitude), 2, 5);
|
||||
|
||||
// make a string with callsign and ssid
|
||||
if (main_config_data_basic->ssid != 0) {
|
||||
sprintf(main_callsign_with_ssid, "%s-%d", main_config_data_basic->callsign, main_config_data_basic->ssid);
|
||||
}
|
||||
else {
|
||||
sprintf(main_callsign_with_ssid, "%s", main_config_data_basic->callsign);
|
||||
}
|
||||
|
||||
switch(main_config_data_basic->symbol) {
|
||||
case 0: // _SYMBOL_DIGI
|
||||
main_symbol_f = '/';
|
||||
|
@ -1068,7 +1077,8 @@ int main(int argc, char* argv[]){
|
|||
main_config_data_gsm->aprsis_passcode,
|
||||
(const char *)main_config_data_gsm->aprsis_server_address,
|
||||
main_config_data_gsm->aprsis_server_port,
|
||||
configuration_get_power_cycle_gsmradio_on_no_communications());
|
||||
configuration_get_power_cycle_gsmradio_on_no_communications(),
|
||||
main_callsign_with_ssid);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,8 +110,6 @@ inline void packet_tx_multi_per_call_handler(void) {
|
|||
void packet_tx_tcp_handler(void) {
|
||||
#ifdef STM32L471xx
|
||||
|
||||
uint8_t result = 0;
|
||||
|
||||
aprsis_return_t aprsis_result = APRSIS_UNKNOWN;
|
||||
|
||||
if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) {
|
||||
|
@ -121,12 +119,32 @@ void packet_tx_tcp_handler(void) {
|
|||
|
||||
if (aprsis_result == APRSIS_OK) {
|
||||
// send APRS-IS frame, if APRS-IS is not connected this function will return immediately
|
||||
aprsis_send_wx_frame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid);
|
||||
aprsis_send_wx_frame(
|
||||
rte_wx_average_windspeed,
|
||||
rte_wx_max_windspeed,
|
||||
rte_wx_average_winddirection,
|
||||
rte_wx_temperature_average_external_valid,
|
||||
rte_wx_pressure_valid,
|
||||
rte_wx_humidity_valid,
|
||||
main_callsign_with_ssid,
|
||||
main_string_latitude,
|
||||
main_string_longitude,
|
||||
main_config_data_basic);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// send APRS-IS frame, if APRS-IS is not connected this function will return immediately
|
||||
aprsis_send_wx_frame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid);
|
||||
aprsis_send_wx_frame(
|
||||
rte_wx_average_windspeed,
|
||||
rte_wx_max_windspeed,
|
||||
rte_wx_average_winddirection,
|
||||
rte_wx_temperature_average_external_valid,
|
||||
rte_wx_pressure_valid,
|
||||
rte_wx_humidity_valid,
|
||||
main_callsign_with_ssid,
|
||||
main_string_latitude,
|
||||
main_string_longitude,
|
||||
main_config_data_basic);
|
||||
}
|
||||
// TODO: fixme
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue