public static MicrostrainUDPPacketListener createRealtimeListener(PriorityParameters priority, long serialNumber) throws IOException { MicrostrainUDPPacketListener listener = create(serialNumber); new RealtimeThread(priority, listener).start(); return listener; }
@Override public final void run() { while(running) { super.waitForNextPeriod(); if(running && runnable != null) { runnable.run(); } } }
public void join() { joinWithReturn(); }
public ThreadInterface createThread(Runnable runnable, String name) { RealtimeThread realtimeThread = new RealtimeThread(priorityParameters, periodicParameters, runnable, name); if(processors != null && processors.length > 0) { realtimeThread.setAffinity(processors); } return realtimeThread; }
@Override public void read() { long timestamp = RealtimeThread.getCurrentMonotonicClockTime(); sensorReader.read(timestamp); sensorReader.run(); // Magic jitter fix // monotonicTime.set(0, timestamp + 500000); // RealtimeThread.getCurrentRealtimeThread().waitUntil(monotonicTime); sensorReader.write(RealtimeThread.getCurrentMonotonicClockTime()); }
periodicRealtimeThread.setAffinity(testProcessor); periodicRealtimeThread.start(); periodicRealtimeThread.join();
private static void setAffinity(RealtimeThread thread, int... cpuID) { long threadId = thread.getThreadID(); setAffinity(threadId, cpuID); }
/** * Instead of calling start() on the Java object, this method is * intended to be called from the JNI by a native POSIX thread. * * Don't forget to change the native library if modified. * IHMCRealtime/csrc/RealtimeNative.cpp:164 */ void runFromNative() { realtimeThreads.set(this); Thread.currentThread().setName(name); run(); }
public void read() { long timestamp = RealtimeThread.getCurrentMonotonicClockTime(); sensorReader.read(timestamp); sensorReader.run(); // Magic jitter fix // monotonicTime.set(0, timestamp + 500000); // RealtimeThread.getCurrentRealtimeThread().waitUntil(monotonicTime); sensorReader.write(RealtimeThread.getCurrentMonotonicClockTime()); }
periodicRealtimeThread.setAffinity(testProcessor); periodicRealtimeThread.start(); periodicRealtimeThread.join();
public ThreadInterface createThread(Runnable runnable, String name) { RealtimeThread realtimeThread = new RealtimeThread(priorityParameters, periodicParameters, runnable, name); if(processors != null && processors.length > 0) { realtimeThread.setAffinity(processors); } return realtimeThread; }
private static void setAffinity(RealtimeThread thread, int... cpuID) { long threadId = thread.getThreadID(); setAffinity(threadId, cpuID); }
/** * Instead of calling start() on the Java object, this method is * intended to be called from the JNI by a native POSIX thread. * * Don't forget to change the native library if modified. * IHMCRealtime/csrc/RealtimeNative.cpp:164 */ void runFromNative() { realtimeThreads.set(this); Thread.currentThread().setName(name); run(); }
/** * Receive data from steppr * @return Current time or -1 if invalid * @throws IOException */ public long receive() throws IOException { receiveBuffer.clear(); try { receiveChannel.receive(receiveBuffer); } catch (SocketTimeoutException e) { throw new RuntimeException(e); } receiveBuffer.flip(); if (receiveBuffer.remaining() != 1048) { throw new IOException("RegistryReceiveBuffer is not the correct size"); } long currentTime = RealtimeThread.getCurrentMonotonicClockTime(); state.update(receiveBuffer, currentTime); return currentTime; }
@Override public final void run() { while(running) { super.waitForNextPeriod(); if(running && runnable != null) { runnable.run(); } } }
public void join() { joinWithReturn(); }
data.setFilterType(MicrostrainFilterType.COMPLIMENTARY_FILTER); long time = RealtimeThread.getCurrentMonotonicClockTime(); data.setReceiveTime(time);
private void perform(int run) { long previousTime = 0; long avgJitter = 0; long maxJitter = 0; for(int i = -1; i < iterations; i++) { super.waitForNextPeriod(); if(i < 0) { previousTime = System.nanoTime(); continue; } long newTime = System.nanoTime(); long jitter = Math.abs(newTime - previousTime - periodInNS); if(jitter > maxJitter) { maxJitter = jitter; } avgJitter += jitter; previousTime = newTime; } final double usAvgJitter = (double) avgJitter / (double) iterations / 1e3; final double usMaxJitter = (double) maxJitter / 1e3; System.out.format("[%d] Jitter: avg = %.4f us, max = %.4f us%n", run, usAvgJitter, usMaxJitter); }
data.setFilterType(MicrostrainFilterType.ADAPTIVE_EKF); long time = RealtimeThread.getCurrentMonotonicClockTime(); data.setReceiveTime(time);
private void perform(int run) { long previousTime = 0; long avgJitter = 0; long maxJitter = 0; for(int i = -1; i < iterations; i++) { super.waitForNextPeriod(); if(i < 0) { previousTime = System.nanoTime(); continue; } long newTime = System.nanoTime(); long jitter = Math.abs(newTime - previousTime - periodInNS); if(jitter > maxJitter) { maxJitter = jitter; } avgJitter += jitter; previousTime = newTime; } final double usAvgJitter = (double) avgJitter / (double) iterations / 1e3; final double usMaxJitter = (double) maxJitter / 1e3; System.out.format("[%d] Jitter: avg = %.4f us, max = %.4f us%n", run, usAvgJitter, usMaxJitter); }