@@ -104,7 +104,7 @@ public class SpacecraftModel implements IVirtualChannelReceiverOutput, IServiceI
104104 public static final String PUS_SUBTYPE_FIELD_NAME = "I-PUS-SUBTYPE" ;
105105 public static final int TM_FRAME_LENGTH = 1115 ;
106106 public static final int PACKET_GENERATION_PERIOD_MS = 1 ;
107- public static final int CYCLE_MODULE_SLEEP = 1 ; // 10
107+ public static final int CYCLE_MODULE_SLEEP = 10000 ; // 10
108108 public static final int SETTER_APID = 10 ;
109109 public static final int SETTER_PUS = 69 ;
110110
@@ -125,7 +125,7 @@ public class SpacecraftModel implements IVirtualChannelReceiverOutput, IServiceI
125125 private final FarmEngine farm ;
126126
127127 // TM processing part
128- private final BlockingQueue <SpacePacket > packetsToSend = new ArrayBlockingQueue <>(1000 );
128+ private final BlockingQueue <SpacePacket > packetsToSend = new ArrayBlockingQueue <>(2000 );
129129 private final TmMasterChannelMuxer tmMux ;
130130 private final Map <Integer , TmSenderVirtualChannel > id2tmvc = new TreeMap <>();
131131 private IPacketEncoder encoder ;
@@ -134,7 +134,6 @@ public class SpacecraftModel implements IVirtualChannelReceiverOutput, IServiceI
134134 private List <TmPacketTemplate > pus1Packets = new LinkedList <>();
135135 private Map <Integer , AtomicInteger > apid2counter = new HashMap <>();
136136 private final ProcessingModelBasedResolver resolver ;
137- private final ExecutorService frameSender = Executors .newFixedThreadPool (1 ); // OK, test tool
138137
139138 private final Timer performanceSampler = new Timer ("Spacecraft Sampler" , true );
140139 private Instant lastSampleGenerationTime ;
@@ -317,7 +316,7 @@ private void generatePackets() {
317316 try {
318317 SpacePacket sp = pkt .generate ();
319318 if (sp != null ) {
320- packetsToSend . put (sp );
319+ addPacketToQueue (sp , false );
321320 synchronized (performanceSampler ) {
322321 ++packetsPerSecond ;
323322 }
@@ -332,7 +331,7 @@ private void generatePackets() {
332331 try {
333332 SpacePacket spev = evpkt .generate ();
334333 if (spev != null ) {
335- packetsToSend . put (spev );
334+ addPacketToQueue (spev , false );
336335 synchronized (performanceSampler ) {
337336 ++packetsPerSecond ;
338337 }
@@ -344,10 +343,27 @@ private void generatePackets() {
344343 }
345344 }
346345
346+ private void addPacketToQueue (SpacePacket sp , boolean withPriority ) throws InterruptedException {
347+ synchronized (packetsToSend ) {
348+ while (!withPriority && packetsToSend .size () >= 1000 ) {
349+ packetsToSend .wait ();
350+ }
351+ packetsToSend .put (sp );
352+ packetsToSend .notifyAll ();
353+ }
354+ }
355+
347356 private void sendPackets () {
348357 while (running ) {
349358 try {
350- SpacePacket sp = this .packetsToSend .take ();
359+ SpacePacket sp = null ;
360+ synchronized (packetsToSend ) {
361+ while (packetsToSend .isEmpty ()) {
362+ packetsToSend .wait ();
363+ }
364+ sp = packetsToSend .take ();
365+ packetsToSend .notifyAll ();
366+ }
351367 // Get the TM VC to use: 0 if configured, otherwise the first
352368 TmSenderVirtualChannel vcToUse = this .id2tmvc .get (0 );
353369 if (vcToUse == null ) {
@@ -395,19 +411,21 @@ private void processCltu(long cltuId, byte[] cltu) {
395411 }
396412
397413 private void sendTmFrame (TmTransferFrame tmTransferFrame ) {
398- this . frameSender . execute (() -> {
399- // Send the transfer frame
400- // if vcId == 0 and vcc == 0, generate time packet: generation rate is 256
401- if ( tmTransferFrame . getVirtualChannelId () == 0 && tmTransferFrame . getVirtualChannelFrameCount () == 0 ) {
402- generateTimePacket ( Instant . now ());
403- }
404- if ( rafProvider . getCurrentBindingState () == ServiceInstanceBindingStateEnum . ACTIVE ) {
414+ // Send the transfer frame
415+ // if vcId == 0 and vcc == 0, generate time packet: generation rate is 256
416+ if ( tmTransferFrame . getVirtualChannelId () == 0 && tmTransferFrame . getVirtualChannelFrameCount () == 0 ) {
417+ generateTimePacket ( Instant . now ());
418+ }
419+ if ( rafProvider . getCurrentBindingState () == ServiceInstanceBindingStateEnum . ACTIVE ) {
420+ try {
405421 boolean result = rafProvider .transferData (tmTransferFrame .getFrame (), 0 , 1 , Instant .now (), false , StringUtil .toHexDump ("ANTENNA-TEST" .getBytes (StandardCharsets .ISO_8859_1 )), false , new byte [0 ]);
406422 if (!result ) {
407423 System .out .println ("Error transferring TF" );
408424 }
425+ } catch (Exception e ) {
426+ e .printStackTrace ();
409427 }
410- });
428+ }
411429 }
412430
413431 private void generateTimePacket (Instant now ) {
@@ -422,7 +440,7 @@ private void generateTimePacket(Instant now) {
422440 builder .addData (obt );
423441 SpacePacket sp = builder .build ();
424442 try {
425- this . packetsToSend . put (sp );
443+ addPacketToQueue (sp , true );
426444 synchronized (performanceSampler ) {
427445 ++packetsPerSecond ;
428446 }
@@ -548,7 +566,7 @@ private void queuePus1(SpacePacket packet, int subtype) {
548566 SpacePacket sp = pt .generate (Arrays .copyOfRange (packet .getPacket (), 0 , 4 ));
549567 System .out .println ("Queueing PUS 1 packet: " + StringUtil .toHexDump (sp .getPacket ()));
550568 try {
551- this . packetsToSend . put (sp );
569+ addPacketToQueue (sp , false );
552570 synchronized (performanceSampler ) {
553571 ++packetsPerSecond ;
554572 }
@@ -565,7 +583,7 @@ private void queuePus1(SpacePacket packet, int subtype) {
565583 SpacePacket sp = pt .generate (Arrays .copyOfRange (packet .getPacket (), 0 , 4 ));
566584 System .out .println ("Queueing PUS 1 packet (def): " + StringUtil .toHexDump (sp .getPacket ()));
567585 try {
568- this . packetsToSend . put (sp );
586+ addPacketToQueue (sp , false );
569587 synchronized (performanceSampler ) {
570588 ++packetsPerSecond ;
571589 }
0 commit comments