Skip to content

Commit bb4e07e

Browse files
support fractional baud rates for satdump
1 parent 9f5ab66 commit bb4e07e

File tree

3 files changed

+70
-40
lines changed

3 files changed

+70
-40
lines changed

src/main/java/ru/r2cloud/satellite/SdrServerTransmitterFilter.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ public boolean accept(Transmitter satellite) {
1818
if (satellite.getFraming().equals(Framing.APT)) {
1919
return false;
2020
}
21-
if (satellite.getFraming().equals(Framing.SATDUMP)) {
22-
return false;
23-
}
2421
return true;
2522
}
2623

src/main/java/ru/r2cloud/satellite/reader/SpyServerReader.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import ru.r2cloud.model.DeviceConfiguration;
1717
import ru.r2cloud.model.DeviceConnectionStatus;
18+
import ru.r2cloud.model.Framing;
1819
import ru.r2cloud.model.IQData;
1920
import ru.r2cloud.model.ObservationRequest;
2021
import ru.r2cloud.model.Transmitter;
@@ -57,10 +58,6 @@ public IQData start() throws InterruptedException {
5758
}
5859

5960
private IQData startInternally() throws InterruptedException {
60-
Integer maxBaudRate = Collections.max(transmitter.getBaudRates());
61-
if (maxBaudRate == null) {
62-
return null;
63-
}
6461
client = new SpyClient(deviceConfiguraiton.getHost(), deviceConfiguraiton.getPort(), deviceConfiguraiton.getTimeout());
6562
client.start();
6663
SpyServerStatus status = client.getStatus();
@@ -69,15 +66,13 @@ private IQData startInternally() throws InterruptedException {
6966
client.stop();
7067
return null;
7168
}
69+
Long sampleRate = getSampleRate(client, req.getId(), transmitter);
70+
if (sampleRate == null) {
71+
return null;
72+
}
7273
File rawFile = new File(config.getTempDirectory(), req.getSatelliteId() + "-" + req.getId() + "." + status.getFormat().getExtension());
73-
Long sampleRate = null;
7474
Long endTimeMillis = null;
7575
try (OutputStream os = new BufferedOutputStream(new FileOutputStream(rawFile))) {
76-
sampleRate = Util.getSmallestGoodDeviceSampleRate(maxBaudRate, status.getSupportedSampleRates());
77-
if (sampleRate == null) {
78-
LOG.error("[{}] cannot find sample rate for: {}", req.getId(), maxBaudRate);
79-
return null;
80-
}
8176

8277
LOG.info("[{}] starting observation on {} with sample rate {} gain {}", req.getId(), req.getFrequency(), sampleRate, deviceConfiguraiton.getGain());
8378

@@ -149,4 +144,27 @@ public void complete() {
149144
latch.countDown();
150145
}
151146

147+
private static Long getSampleRate(SpyClient client, String id, Transmitter transmitter) {
148+
if (transmitter.getFraming() != null && transmitter.getFraming().equals(Framing.SATDUMP)) {
149+
// assume sorted asc
150+
for (Long cur : client.getStatus().getSupportedSampleRates()) {
151+
if (cur >= transmitter.getBandwidth()) {
152+
return cur;
153+
}
154+
}
155+
return null;
156+
}
157+
Integer maxBaudRate = Collections.max(transmitter.getBaudRates());
158+
if (maxBaudRate == null) {
159+
LOG.error("[{}] no configured baud raters", id);
160+
return null;
161+
}
162+
Long sampleRate = Util.getSmallestGoodDeviceSampleRate(maxBaudRate, client.getStatus().getSupportedSampleRates());
163+
if (sampleRate == null) {
164+
LOG.error("[{}] cannot find sample rate for: {}", id, maxBaudRate);
165+
return null;
166+
}
167+
return sampleRate;
168+
}
169+
152170
}

src/test/java/ru/r2cloud/satellite/reader/SpyServerReaderTest.java

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import ru.r2cloud.TestConfiguration;
1919
import ru.r2cloud.model.DataFormat;
2020
import ru.r2cloud.model.DeviceConfiguration;
21+
import ru.r2cloud.model.Framing;
2122
import ru.r2cloud.model.IQData;
2223
import ru.r2cloud.model.ObservationRequest;
2324
import ru.r2cloud.model.Transmitter;
@@ -38,42 +39,30 @@ public class SpyServerReaderTest {
3839

3940
@Test
4041
public void testDeviceNotConnected() throws Exception {
41-
mock = new SpyServerMock(deviceConfiguration.getHost());
42-
mock.start();
43-
44-
deviceConfiguration.setPort(mock.getPort());
42+
mock.setDeviceInfo(null);
4543
SpyServerReader reader = new SpyServerReader(config, createValidRequest(), deviceConfiguration, createValidTransmitter(), new ReentrantLock());
4644
reader.complete();
4745
assertNull(reader.start());
4846
}
4947

5048
@Test
51-
public void testSuccess() throws Exception {
52-
mock = new SpyServerMock(deviceConfiguration.getHost());
53-
mock.start();
54-
55-
mock.setDeviceInfo(createAirSpy());
56-
mock.setSync(createValidSync());
57-
mock.setData(createSample(), SpyClient.SPYSERVER_MSG_TYPE_INT16_IQ);
49+
public void testSatdump() throws Exception {
50+
ObservationRequest req = createValidRequest();
51+
Transmitter transmitter = createValidTransmitter();
52+
// some generic satdump-based satellite info
53+
transmitter.setBandwidth(2_400_000L);
54+
transmitter.setFraming(Framing.SATDUMP);
55+
SpyServerReader reader = new SpyServerReader(config, req, deviceConfiguration, transmitter, new ReentrantLock());
56+
IQData result = syncRead(reader);
57+
assertNotNull(result);
58+
assertNotNull(result.getIq());
59+
}
5860

59-
deviceConfiguration.setPort(mock.getPort());
61+
@Test
62+
public void testSuccess() throws Exception {
6063
ObservationRequest req = createValidRequest();
6164
SpyServerReader reader = new SpyServerReader(config, req, deviceConfiguration, createValidTransmitter(), new ReentrantLock());
62-
new Thread(new Runnable() {
63-
64-
@Override
65-
public void run() {
66-
try {
67-
// make sure all config parameters are sent/read
68-
mock.waitForDataSent();
69-
} catch (InterruptedException e) {
70-
Thread.currentThread().interrupt();
71-
return;
72-
}
73-
reader.complete();
74-
}
75-
}).start();
76-
IQData result = reader.start();
65+
IQData result = syncRead(reader);
7766
assertNotNull(result);
7867
assertEquals(DataFormat.COMPLEX_SIGNED_SHORT, result.getDataFormat());
7968
assertEquals(46875, result.getSampleRate());
@@ -84,10 +73,17 @@ public void run() {
8473

8574
@Before
8675
public void start() throws Exception {
76+
mock = new SpyServerMock("localhost");
77+
mock.start();
78+
mock.setDeviceInfo(createAirSpy());
79+
mock.setSync(createValidSync());
80+
mock.setData(createSample(), SpyClient.SPYSERVER_MSG_TYPE_INT16_IQ);
81+
8782
deviceConfiguration = new DeviceConfiguration();
8883
deviceConfiguration.setHost("localhost");
8984
deviceConfiguration.setTimeout(1000);
9085
deviceConfiguration.setGain(10.0f);
86+
deviceConfiguration.setPort(mock.getPort());
9187

9288
config = new TestConfiguration(tempFolder);
9389
config.setProperty("server.tmp.directory", tempFolder.getRoot().getAbsolutePath());
@@ -138,6 +134,25 @@ public static SpyClientSync createValidSync() {
138134
return result;
139135
}
140136

137+
private IQData syncRead(SpyServerReader reader) throws InterruptedException {
138+
new Thread(new Runnable() {
139+
140+
@Override
141+
public void run() {
142+
try {
143+
// make sure all config parameters are sent/read
144+
mock.waitForDataSent();
145+
} catch (InterruptedException e) {
146+
Thread.currentThread().interrupt();
147+
return;
148+
}
149+
reader.complete();
150+
}
151+
}).start();
152+
IQData result = reader.start();
153+
return result;
154+
}
155+
141156
@After
142157
public void stop() {
143158
if (mock != null) {

0 commit comments

Comments
 (0)