]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.simulation/src/org/simantics/simulation/data/PseudoSolver.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / data / PseudoSolver.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * which accompanies this distribution, and is available at\r
6  * http://www.eclipse.org/legal/epl-v10.html\r
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.simulation.data;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.Collection;\r
15 import java.util.Collections;\r
16 import java.util.List;\r
17 import java.util.Random;\r
18 \r
19 import org.simantics.databoard.Datatypes;\r
20 import org.simantics.databoard.binding.Binding;\r
21 import org.simantics.databoard.binding.NumberBinding;\r
22 import org.simantics.databoard.binding.error.BindingException;\r
23 import org.simantics.databoard.type.Datatype;\r
24 import org.simantics.databoard.util.Bean;\r
25 \r
26 /**\r
27  * Pseudo solver has three variables: Sine, Ramp and Random\r
28  * \r
29  * Values are sampled in real time until the solver is disposed.\r
30  *\r
31  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>\r
32  */\r
33 public class PseudoSolver extends AbstractDatasource {\r
34         \r
35         public static String SINE = "Sine";\r
36         public static String RAMP = "Ramp";\r
37         public static String RANDOM = "Random";\r
38         public static List<String> KEYS;\r
39         \r
40         Thread thread;\r
41         long startTime;\r
42         double time;\r
43         Random random;\r
44         int cycle = 0;\r
45                 \r
46         public PseudoSolver() {\r
47                 super();                \r
48                 random = new Random();\r
49         }\r
50         \r
51         @Override\r
52         public Collection<String> getVariables() {\r
53                 return KEYS;\r
54         }\r
55         \r
56         public void start() {\r
57                 thread = new Thread() {\r
58                         @Override\r
59                         public void run() {\r
60                                 startTime = System.nanoTime();\r
61                                 notifyStep();\r
62                                 while (Thread.currentThread() == thread) {\r
63                                         writeLock.lock();\r
64                                         try {\r
65                                                 if (Thread.currentThread() != thread) return;\r
66                                                 for (int i=0; i<10; i++) {\r
67                                                         cycle++;\r
68                                                         time = cycle * 0.01;\r
69                                                         notifyStep();\r
70                                                 }\r
71                                         } finally {\r
72                                                 writeLock.unlock();\r
73                                         }\r
74                                         try {Thread.sleep(15); } catch (InterruptedException e) {}\r
75                                 }\r
76                         }\r
77                 };\r
78                 thread.start();\r
79         }\r
80         \r
81         public void stop() {\r
82                 writeLock.lock();\r
83                 try {\r
84                         thread = null;\r
85                 } finally {\r
86                         writeLock.unlock();\r
87                 }\r
88         }\r
89         \r
90         @Override\r
91         public Datatype getType(String key) {\r
92                 //if (key.equals("Ramp")) return Datatypes.BOOLEAN;\r
93                 return Datatypes.DOUBLE;\r
94         }\r
95         \r
96         @Override\r
97         public Object getTime(NumberBinding binding) {\r
98                 try {\r
99                         return binding.create(time);\r
100                 } catch (BindingException e) {\r
101                         throw new RuntimeException(e);\r
102                 }\r
103         }\r
104 \r
105         @Override\r
106         public VariableHandle openHandle(Bean item, String key, Binding valueBinding) {\r
107                 getValue(key, valueBinding);\r
108                 return new MyVariableHandle(key, valueBinding);\r
109         }\r
110         \r
111         public Object getValue(String key, Binding binding) {\r
112                 if (binding instanceof NumberBinding == false) throw new IllegalArgumentException("binding must be NumberBinding");\r
113                 NumberBinding nb = (NumberBinding) binding;\r
114                 try {\r
115                         if (key.equals(SINE)) {\r
116                                 double value = Math.sin(time);\r
117                                 return nb.create(value);\r
118                         } else if (key.equals(RAMP)) {\r
119                                 boolean up = time - Math.floor(time) >= 0.5;\r
120                                 double value = up ? 1.0 : 0.0; \r
121                                 return value;                           \r
122                         } else if (key.equals(RANDOM)) {\r
123                                 return random.nextDouble()*10;\r
124                         }\r
125                 } catch (BindingException e) {\r
126                         throw new RuntimeException(e);\r
127                 }\r
128                 throw new RuntimeException("Unknown variable "+key);\r
129         }       \r
130         \r
131         static {\r
132                 List<String> keys = new ArrayList<String>();\r
133                 keys.add(SINE);\r
134                 keys.add(RAMP);\r
135                 keys.add(RANDOM);\r
136                 KEYS = Collections.unmodifiableList( keys );\r
137         }\r
138         \r
139         class MyVariableHandle implements VariableHandle {\r
140 \r
141                 String key;             \r
142                 Binding b;\r
143                 \r
144                 public MyVariableHandle(String key, Binding b) {\r
145                         this.b = b;\r
146                         this.key = key;\r
147                 }\r
148 \r
149                 @Override\r
150                 public String key() {\r
151                         return key;\r
152                 }\r
153                 \r
154                 @Override\r
155                 public Binding binding() {\r
156                         return b;\r
157                 }\r
158 \r
159                 @Override\r
160                 public Object getValue() {\r
161                         return PseudoSolver.this.getValue(key, b);\r
162                 }\r
163 \r
164                 @Override\r
165                 public void dispose() {\r
166                 }\r
167                 \r
168         }\r
169 }\r
170 \r