1 package com.neuronrobotics.bowlerstudio.sequence;
4 import java.io.IOException;
5 import java.lang.reflect.Type;
6 import java.util.ArrayList;
7 import java.util.HashMap;
9 import com.google.gson.Gson;
10 import com.google.gson.GsonBuilder;
11 import com.google.gson.reflect.TypeToken;
12 import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine;
13 import com.neuronrobotics.sdk.addons.kinematics.AbstractKinematicsNR;
14 import com.neuronrobotics.sdk.addons.kinematics.DHParameterKinematics;
15 import com.neuronrobotics.sdk.addons.kinematics.MobileBase;
16 import com.neuronrobotics.sdk.common.DeviceManager;
17 import com.neuronrobotics.sdk.util.ThreadUtil;
19 import javax.sound.sampled.AudioInputStream;
20 import javax.sound.sampled.AudioSystem;
21 import javax.sound.sampled.Clip;
22 import javax.sound.sampled.FloatControl;
23 import javax.sound.sampled.LineEvent;
24 import javax.sound.sampled.LineUnavailableException;
25 import javax.sound.sampled.UnsupportedAudioFileException;
27 import org.eclipse.jgit.api.errors.GitAPIException;
28 import org.eclipse.jgit.api.errors.InvalidRemoteException;
29 import org.eclipse.jgit.api.errors.TransportException;
36 private static Type
TT_listString =
new TypeToken<ArrayList<String>>() {
40 private static Type
TT_mapSequence =
new TypeToken<HashMap<String, SequenceEvent>>() {
43 private Gson
gson =
new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
53 public static HashMap<String, AbstractKinematicsNR>
getDevices() {
54 HashMap<String, AbstractKinematicsNR> map =
new HashMap<>();
57 if (
MobileBase.class.isInstance(specificDevice)) {
67 map.put(
"MobileBase:" + specificDevice2.
getScriptingName() +
" " + depth, specificDevice2);
69 map.put(specificDevice2.
getScriptingName() +
" " +
"ParallelGroup:" + pg.getScriptingName() +
" " + depth,
74 map.put(specificDevice2.
getScriptingName() +
" " +
"Appendage:" + kin.getScriptingName() +
" " + depth,
76 for (
int i = 0; i < kin.getNumberOfLinks(); i++) {
77 MobileBase follower = kin.getSlaveMobileBase(i);
78 if (follower !=
null) {
85 public void execute(String content)
throws Exception {
93 System.out.println(
"Initialize Sequence");
96 HashMap<String, AbstractKinematicsNR> devices =
getDevices();
97 long start = System.currentTimeMillis();
98 ArrayList<Thread> threads =
new ArrayList<Thread>();
103 for (String mine : devices.keySet()) {
105 if (mine.contentEquals(key)) {
106 System.out.println(
"Found Device " + key);
107 HashMap<String, SequenceEvent> devSeq =
getSequence(key);
108 Thread t =
new Thread(() -> {
109 for (
int i = 0; i < finalDur && !Thread.interrupted(); i++) {
112 System.out.println(key +
" Execute @ " + i);
117 }
catch (InterruptedException e) {
125 System.out.println(
"Running sequence");
126 for (Thread t : threads) {
130 for (Thread t : threads) {
133 }
catch (java.lang.InterruptedException ex) {
134 for (Thread t : threads) {
139 "Running complete, took " + (System.currentTimeMillis() - start) +
" expcted " +
getDuration());
142 private void addWavFileRun(ArrayList<Thread> threads)
throws InvalidRemoteException, TransportException,
143 GitAPIException, IOException, UnsupportedAudioFileException, LineUnavailableException {
145 threads.add(
new Thread(() -> {
149 AudioInputStream audioStream = AudioSystem.getAudioInputStream(path);
150 Clip audioClip = AudioSystem.getClip();
151 audioClip.addLineListener(event -> {
152 if (LineEvent.Type.STOP.equals(event.getType())) {
156 audioClip.open(audioStream);
157 double len = (double) audioClip.getMicrosecondLength() / 1000.0;
163 while (audioClip.isRunning() && !Thread.interrupted()) {
164 double pos = (double) audioClip.getMicrosecondPosition() / 1000.0;
165 double percent = pos / len * 100.0;
169 }
catch (Throwable t) {
174 ((AudioInputStream) audioStream).close();
176 }
catch (Exception e) {
183 public void load(String content) {
187 throw new RuntimeException(
"Cant initialize!");
202 if (devSeq ==
null) {
203 devSeq =
new HashMap<>();
212 if (s.contentEquals(d))
static Object gitScriptRun(String gitURL, String Filename)
static File fileFromGit(String remoteURI, String fileInRepo)
void execute(DHParameterKinematics kin)
static void loadMobileBase(HashMap< String, AbstractKinematicsNR > map, MobileBase specificDevice2, int depth)
void setDevicesInSequence(ArrayList< String > devicesInSequence)
void execute(String content)
ArrayList< String > devicesInSequence
HashMap< String, Object > getDatabase()
HashMap< String, SequenceEvent > getSequence(String d)
String getDevice(String d)
void setWavurl(String wavurl)
void setDuration(long duration)
static Type TT_SequenceEvent
void addWavFileRun(ArrayList< Thread > threads)
static Type TT_mapSequence
HashMap< String, Object > initialize
void setFile(String file)
HashMap< String, Object > database
void load(String content)
void setWavfile(String wavfile)
HashMap< String, Object > getInitialize()
void setDatabase(HashMap< String, Object > database)
void setInitialize(HashMap< String, Object > initialize)
static Type TT_mapStringString
ArrayList< String > getDevicesInSequence()
static Type TT_listString
static HashMap< String, AbstractKinematicsNR > getDevices()
ArrayList< DHParameterKinematics > getAllDHChains()
ParallelGroup getParallelGroup(String name)
ArrayList< DHParameterKinematics > getAllParallelGroups()
String getScriptingName()
static Object getSpecificDevice(String name, IDeviceProvider provider)
static List< String > listConnectedDevice()
static void wait(int time)