Skip to content

Commit 307ad8b

Browse files
add support for GRBBETA
1 parent 1a8ebec commit 307ad8b

File tree

6 files changed

+347
-0
lines changed

6 files changed

+347
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,11 @@ jradio has lots of built-in satellite decoders. Some of them have non standard d
599599
<td>52191, 52192, 52188</td>
600600
<td>ru.r2cloud.jradio.suchai2.Suchai2Beacon</td>
601601
</tr>
602+
<tr>
603+
<td>GRBBETA</td>
604+
<td>60237</td>
605+
<td>ru.r2cloud.jradio.grbbeta.GRBBetaBeacon</td>
606+
</tr>
602607
</tbody>
603608
</table>
604609

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package ru.r2cloud.jradio.grbbeta;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.DataInputStream;
5+
import java.io.IOException;
6+
import java.nio.charset.StandardCharsets;
7+
8+
import ru.r2cloud.jradio.Beacon;
9+
import ru.r2cloud.jradio.csp.Header;
10+
import ru.r2cloud.jradio.fec.ccsds.UncorrectableException;
11+
12+
public class GRBBetaBeacon extends Beacon {
13+
14+
private ru.r2cloud.jradio.ax25.Header ax25Header;
15+
private Header cspHeader;
16+
private TrxBeacon trx;
17+
18+
private byte[] unknownPayload;
19+
private String unknownMessage;
20+
21+
@Override
22+
public void readBeacon(byte[] data) throws IOException, UncorrectableException {
23+
try {
24+
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
25+
ax25Header = new ru.r2cloud.jradio.ax25.Header(dis);
26+
byte[] bodyBytes = new byte[dis.available()];
27+
dis.readFully(bodyBytes);
28+
String body = new String(bodyBytes, StandardCharsets.US_ASCII);
29+
if (body.startsWith("U,")) {
30+
trx = new TrxBeacon(body);
31+
} else {
32+
unknownMessage = body;
33+
}
34+
} catch (Exception e) {
35+
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
36+
cspHeader = new Header(dis);
37+
unknownPayload = new byte[dis.available()];
38+
dis.readFully(unknownPayload);
39+
}
40+
}
41+
42+
public ru.r2cloud.jradio.ax25.Header getAx25Header() {
43+
return ax25Header;
44+
}
45+
46+
public void setAx25Header(ru.r2cloud.jradio.ax25.Header ax25Header) {
47+
this.ax25Header = ax25Header;
48+
}
49+
50+
public Header getCspHeader() {
51+
return cspHeader;
52+
}
53+
54+
public void setCspHeader(Header cspHeader) {
55+
this.cspHeader = cspHeader;
56+
}
57+
58+
public TrxBeacon getTrx() {
59+
return trx;
60+
}
61+
62+
public void setTrx(TrxBeacon trx) {
63+
this.trx = trx;
64+
}
65+
66+
public byte[] getUnknownPayload() {
67+
return unknownPayload;
68+
}
69+
70+
public void setUnknownPayload(byte[] unknownPayload) {
71+
this.unknownPayload = unknownPayload;
72+
}
73+
74+
public String getUnknownMessage() {
75+
return unknownMessage;
76+
}
77+
78+
public void setUnknownMessage(String unknownMessage) {
79+
this.unknownMessage = unknownMessage;
80+
}
81+
82+
}
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package ru.r2cloud.jradio.grbbeta;
2+
3+
import java.util.regex.Pattern;
4+
5+
public class TrxBeacon {
6+
private static final Pattern COMMA = Pattern.compile(",");
7+
8+
private long uptimeSinceReset;
9+
private long uptime;
10+
private long radioBootCount;
11+
private long rfSegmentResetCount;
12+
private float radioMcuTemperature;
13+
private float rfChipTemperature;
14+
private float rfPowerAmplifierTemperature;
15+
private long digipeaterMessageCount;
16+
private String lastDigipeaterCallsign;
17+
private long rxDataPackets;
18+
private long txDataPackets;
19+
private float actualRssi;
20+
private float rssiPreamble;
21+
22+
public TrxBeacon() {
23+
// do nothing
24+
}
25+
26+
public TrxBeacon(String message) {
27+
String[] parts = COMMA.split(message.trim());
28+
int i = 1;
29+
uptimeSinceReset = Long.valueOf(parts[i++]);
30+
uptime = Long.valueOf(parts[i++]);
31+
radioBootCount = Long.valueOf(parts[i++]);
32+
rfSegmentResetCount = Long.valueOf(parts[i++]);
33+
radioMcuTemperature = Long.valueOf(parts[i++]) * 0.01f;
34+
rfChipTemperature = Long.valueOf(parts[i++]) * 0.01f;
35+
rfPowerAmplifierTemperature = Long.valueOf(parts[i++]) * 0.01f;
36+
digipeaterMessageCount = Long.valueOf(parts[i++]);
37+
lastDigipeaterCallsign = parts[i++].trim();
38+
if (lastDigipeaterCallsign.length() == 0) {
39+
lastDigipeaterCallsign = null;
40+
}
41+
rxDataPackets = Long.valueOf(parts[i++]);
42+
txDataPackets = Long.valueOf(parts[i++]);
43+
actualRssi = Long.valueOf(parts[i++]) / 2.0f - 134;
44+
rssiPreamble = Long.valueOf(parts[i++]) / 2.0f - 134;
45+
}
46+
47+
public long getUptimeSinceReset() {
48+
return uptimeSinceReset;
49+
}
50+
51+
public void setUptimeSinceReset(long uptimeSinceReset) {
52+
this.uptimeSinceReset = uptimeSinceReset;
53+
}
54+
55+
public long getUptime() {
56+
return uptime;
57+
}
58+
59+
public void setUptime(long uptime) {
60+
this.uptime = uptime;
61+
}
62+
63+
public long getRadioBootCount() {
64+
return radioBootCount;
65+
}
66+
67+
public void setRadioBootCount(long radioBootCount) {
68+
this.radioBootCount = radioBootCount;
69+
}
70+
71+
public long getRfSegmentResetCount() {
72+
return rfSegmentResetCount;
73+
}
74+
75+
public void setRfSegmentResetCount(long rfSegmentResetCount) {
76+
this.rfSegmentResetCount = rfSegmentResetCount;
77+
}
78+
79+
public float getRadioMcuTemperature() {
80+
return radioMcuTemperature;
81+
}
82+
83+
public void setRadioMcuTemperature(float radioMcuTemperature) {
84+
this.radioMcuTemperature = radioMcuTemperature;
85+
}
86+
87+
public float getRfChipTemperature() {
88+
return rfChipTemperature;
89+
}
90+
91+
public void setRfChipTemperature(float rfChipTemperature) {
92+
this.rfChipTemperature = rfChipTemperature;
93+
}
94+
95+
public float getRfPowerAmplifierTemperature() {
96+
return rfPowerAmplifierTemperature;
97+
}
98+
99+
public void setRfPowerAmplifierTemperature(float rfPowerAmplifierTemperature) {
100+
this.rfPowerAmplifierTemperature = rfPowerAmplifierTemperature;
101+
}
102+
103+
public long getDigipeaterMessageCount() {
104+
return digipeaterMessageCount;
105+
}
106+
107+
public void setDigipeaterMessageCount(long digipeaterMessageCount) {
108+
this.digipeaterMessageCount = digipeaterMessageCount;
109+
}
110+
111+
public String getLastDigipeaterCallsign() {
112+
return lastDigipeaterCallsign;
113+
}
114+
115+
public void setLastDigipeaterCallsign(String lastDigipeaterCallsign) {
116+
this.lastDigipeaterCallsign = lastDigipeaterCallsign;
117+
}
118+
119+
public long getRxDataPackets() {
120+
return rxDataPackets;
121+
}
122+
123+
public void setRxDataPackets(long rxDataPackets) {
124+
this.rxDataPackets = rxDataPackets;
125+
}
126+
127+
public long getTxDataPackets() {
128+
return txDataPackets;
129+
}
130+
131+
public void setTxDataPackets(long txDataPackets) {
132+
this.txDataPackets = txDataPackets;
133+
}
134+
135+
public float getActualRssi() {
136+
return actualRssi;
137+
}
138+
139+
public void setActualRssi(float actualRssi) {
140+
this.actualRssi = actualRssi;
141+
}
142+
143+
public float getRssiPreamble() {
144+
return rssiPreamble;
145+
}
146+
147+
public void setRssiPreamble(float rssiPreamble) {
148+
this.rssiPreamble = rssiPreamble;
149+
}
150+
151+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ru.r2cloud.jradio.grbbeta;
2+
3+
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanConstructor;
4+
import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
5+
import static org.hamcrest.CoreMatchers.allOf;
6+
import static org.hamcrest.MatcherAssert.assertThat;
7+
8+
import org.junit.Test;
9+
10+
import ru.r2cloud.jradio.AssertJson;
11+
import ru.r2cloud.jradio.fec.ViterbiTest;
12+
13+
public class GRBBetaBeaconTest {
14+
15+
@Test
16+
public void testBeacon() throws Exception {
17+
byte[] data = ViterbiTest.hexStringToByteArray("86A240404040609082648EA4846103F0552C323633373233312C323635393030372C322C302C313237352C313237342C313231382C302C2C313830382C3237393833322C37352C393200");
18+
GRBBetaBeacon result = new GRBBetaBeacon();
19+
result.readBeacon(data);
20+
AssertJson.assertObjectsEqual("GRBBetaBeaconTrx.json", result);
21+
}
22+
23+
@Test
24+
public void testCspBeacon() throws Exception {
25+
byte[] data = ViterbiTest.hexStringToByteArray("4050EA3EB97297B4EAEC190B3621EE6447C69D532D");
26+
GRBBetaBeacon result = new GRBBetaBeacon();
27+
result.readBeacon(data);
28+
AssertJson.assertObjectsEqual("GRBBetaBeaconCsp.json", result);
29+
}
30+
31+
@Test
32+
public void testPojo() {
33+
assertThat(GRBBetaBeacon.class, allOf(hasValidBeanConstructor(), hasValidGettersAndSetters()));
34+
assertThat(TrxBeacon.class, allOf(hasValidBeanConstructor(), hasValidGettersAndSetters()));
35+
}
36+
37+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"cspHeader": {
3+
"priority": "CSP_PRIO_HIGH",
4+
"source": 0,
5+
"destination": 5,
6+
"sourcePort": 42,
7+
"destinationPort": 3,
8+
"ffrag": true,
9+
"fhmac": true,
10+
"fxtea": true,
11+
"frdp": true,
12+
"fcrc32": false
13+
},
14+
"unknownPayload": [
15+
-71,
16+
114,
17+
-105,
18+
-76,
19+
-22,
20+
-20,
21+
25,
22+
11,
23+
54,
24+
33,
25+
-18,
26+
100,
27+
71,
28+
-58,
29+
-99,
30+
83,
31+
45
32+
],
33+
"beginSample": 0,
34+
"beginMillis": 0,
35+
"endSample": 0
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"ax25Header": {
3+
"destinationAddress": {
4+
"callsign": "CQ",
5+
"ssid": 0,
6+
"extensionBit": 0
7+
},
8+
"sourceAddress": {
9+
"callsign": "HA2GRB",
10+
"ssid": 0,
11+
"extensionBit": 1
12+
},
13+
"frameType": "U",
14+
"sendSequenceNumber": 0,
15+
"receiveSequenceNumber": 0,
16+
"uControlType": "UI",
17+
"pid": 240
18+
},
19+
"trx": {
20+
"uptimeSinceReset": 2637231,
21+
"uptime": 2659007,
22+
"radioBootCount": 2,
23+
"rfSegmentResetCount": 0,
24+
"radioMcuTemperature": 12.75,
25+
"rfChipTemperature": 12.74,
26+
"rfPowerAmplifierTemperature": 12.179999,
27+
"digipeaterMessageCount": 0,
28+
"rxDataPackets": 1808,
29+
"txDataPackets": 279832,
30+
"actualRssi": -96.5,
31+
"rssiPreamble": -88.0
32+
},
33+
"beginSample": 0,
34+
"beginMillis": 0,
35+
"endSample": 0
36+
}

0 commit comments

Comments
 (0)