1 package org.ocera.orte.demo;
3 import java.util.concurrent.locks.ReentrantLock;
4 import java.util.concurrent.locks.ReentrantReadWriteLock;
5 import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
6 import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
8 import org.ocera.orte.DomainApp;
9 import org.ocera.orte.Publication;
10 import org.ocera.orte.types.NtpTime;
11 import org.ocera.orte.types.PublProp;
13 public class MotionSpeedPublish implements Runnable {
15 public static final int VMAX = 16000;
16 public static final double r = 0.15;
18 private short[] speed = new short[2];
19 private boolean isCancelled = true;
20 private float maxRange;
21 private float[] accelData = new float[2];
22 private SpeedMotionType speedmsg;
23 private Publication pub;
24 private Thread thread = null;
25 private PublProp publProp;
26 private DomainApp appDomain;
28 private final ReentrantLock dataLock = new ReentrantLock();
29 private final ReentrantReadWriteLock controlRrwl = new ReentrantReadWriteLock(true);
30 private final ReadLock rcLock = controlRrwl.readLock();
31 private final WriteLock wcLock = controlRrwl.writeLock();
33 public MotionSpeedPublish(float maxRange, DomainApp appDomain) {
34 this.maxRange = maxRange;
35 this.appDomain = appDomain;
37 NtpTime persistence = new NtpTime(3);
40 speedmsg = new SpeedMotionType(appDomain,"motion_speed");
42 publProp = new PublProp(speedmsg.getTopic(),
48 private void calculateSpeed(float[] mAccel) {
50 double angle = 0, length, v, omega;
52 v = (double)mAccel[1]/maxRange;
53 omega = (double)mAccel[0]/maxRange;
54 length = Math.sqrt(Math.pow(v,2) + Math.pow(omega,2));
56 angle = Math.atan2(mAccel[1], mAccel[0]);
58 omega = Math.cos(angle);
62 speed[0] = (short)(-(v + (v>0 ? -r*omega : r*omega))*VMAX);
63 speed[1] = (short)(-(v - (v>0 ? -r*omega : r*omega))*VMAX);
70 pub = appDomain.createPublication(publProp, speedmsg);
71 thread = new Thread(this);
79 public void cancel() {
90 } catch (InterruptedException e) {
97 public boolean isCancelled() {
114 calculateSpeed(accelData);
119 speedmsg.speed = this.speed;
129 } catch (InterruptedException e) {
135 public void setSpeed(float accelX, float accelY) {
136 if (dataLock.tryLock()) {
138 this.accelData[0] = accelX;
139 this.accelData[1] = accelY;