forked from darksidelemm/RS41HUP
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaprs.cpp
More file actions
156 lines (137 loc) · 4.13 KB
/
Copy pathaprs.cpp
File metadata and controls
156 lines (137 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//
// Created by Admin on 2017-01-09.
//
#include "math.h"
#include "aprs.h"
#include "QAPRSBase.h"
#include "stdio.h"
#include "ublox.h"
#include "config.h"
//#include <cmath>
#if !defined(__OPTIMIZE__)
#error "APRS Works only when optimization enabled at level at least -O2"
#endif
QAPRSBase qaprs;
void aprs_init(){
// fill up the callsign to at least 6 characters by blanks
char aprs_callsign[15] = {APRS_CALLSIGN};
uint8_t laenge = strlen(aprs_callsign);
while (laenge < 6) {
strcat (aprs_callsign," ");
laenge = strlen(aprs_callsign);
}
qaprs.init(0, 0, (char *) aprs_callsign, (const uint8_t) APRS_SSID, (char *) "APZQAP", '0', (char *) "WIDE1-1");
}
void aprs_timer_handler() {
qaprs.timerInterruptHandler();
}
uint8_t aprs_is_active() {
return qaprs.enabled;
}
void calcDMH(long x, int8_t* degrees, uint8_t* minutes, uint8_t* h_minutes) {
uint8_t sign = (uint8_t) (x > 0 ? 1 : 0);
if (!sign) {
x = -(x);
}
*degrees = (int8_t) (x / 1000000);
x = x - (*degrees * 1000000);
x = (x) * 60 / 10000;
*minutes = (uint8_t) (x / 100);
*h_minutes = (uint8_t) (x - (*minutes * 100));
if (!sign) {
*degrees = -*degrees;
}
}
void aprs_test(){
char packet_buffer[128];
sprintf(packet_buffer,
(":TEST1234567890")
);
qaprs.sendData(packet_buffer);
}
#ifdef APRS_DAO
//--- only for DAO Extension nessesary
//DAO? see http://www.aprs.org/aprs12/datum.txt
//Code from Hansi DL9RDZ
static uint32_t truncc(double r)
{
if (r<=0.0L) {
return 0UL;
} else if (r>=2.E+9) {
return 2000000000UL;
} else {
return (uint32_t)r;
}
return 0;
} /* end truncc() */
static uint32_t dao91(double x)
/* radix91(xx/1.1) of dddmm.mmxx */
{
double a;
a = fabs(x);
return ((truncc((a-(double)(float)truncc(a))*6.E+5)%100UL)
*20UL+11UL)/22UL;
} /* end dao91() */
#endif
void aprs_send_position(GPSEntry gpsData, int8_t temperature, uint16_t voltage) {
char packet_buffer[228];
char extension_packet_buffer[128];
int8_t la_degrees, lo_degrees;
uint8_t la_minutes, la_h_minutes, lo_minutes, lo_h_minutes;
// uint8_t j;
calcDMH(gpsData.lat_raw/10, &la_degrees, &la_minutes, &la_h_minutes);
calcDMH(gpsData.lon_raw/10, &lo_degrees, &lo_minutes, &lo_h_minutes);
static uint16_t aprs_packet_counter = 0;
aprs_packet_counter ++;
#ifdef APRS_DAO
if (APRS_DAO == 1) {
//________________________________________________
// DAO Extention for better positioning
float lat = gpsData.lat_raw / 10000000.0f;
float lon = gpsData.lon_raw / 10000000.0f;
//________________________________________________
uint8_t j = sprintf(extension_packet_buffer," %s",APRS_COMMENT);
sprintf(extension_packet_buffer + j, " !w%c%c!", (char)(33+dao91(lat)), (char)(33+dao91(lon)));
} else {
sprintf(extension_packet_buffer," %s",APRS_COMMENT);
}
#else
sprintf(extension_packet_buffer," %s",APRS_COMMENT);
#endif
sprintf(packet_buffer,
("!%02d%02d.%02u%c/%03d%02u.%02u%cO/A=%06ld/P%dS%dT%dV%d%s"),
abs(la_degrees), la_minutes, la_h_minutes,
la_degrees > 0 ? 'N' : 'S',
abs(lo_degrees), lo_minutes, lo_h_minutes,
lo_degrees > 0 ? 'E' : 'W',
(gpsData.alt_raw/1000) * 3280 / 1000,
aprs_packet_counter,
gpsData.sats_raw,
temperature,
voltage,
extension_packet_buffer
);
qaprs.sendData(packet_buffer);
}
void aprs_change_tone_time(uint16_t x) {
qaprs._toneSendTime = x;
}
void t(){
// // Übermittlung eines Pakets des Typs Kommentar
// packet_buffer = ":TEST TEST TEST de SQ5RWU";
// // Änderung von Quelladresse und ssid
// QAPRS.setFromAddress("SQ5R", '1');
// QAPRS.sendData(packet_buffer);
// // Übermittlung eines Pakets mit der Position und dem Symbol des Objekts
// packet_buffer = "!5000.68N/00858.48ES#";
// // Änderung von Quelladresse, ssid und Pfad
// QAPRS.setFromAddress("SQ5RWU", '2');
// QAPRS.setRelays("WIDE2-2");
// QAPRS.sendData(packet_buffer);
// // Übermittlung von Wetterdaten ohne Position
// packet_buffer = "_07071805c025s009g008t030r000p000P000h00b10218";
// // Pfadwechsel
// QAPRS.setRelays("WIDE1-1");
// QAPRS.sendData(packet_buffer);
// delay(5000);
}