22
33import ioio .lib .api .IOIO ;
44import ioio .lib .api .exception .ConnectionLostException ;
5+ import ioio .lib .api .exception .IncompatibilityException ;
56import ioio .lib .spi .Log ;
67import ioio .lib .util .IOIOLooper ;
78
89import java .util .concurrent .BlockingQueue ;
10+ import java .util .concurrent .CountDownLatch ;
11+ import java .util .concurrent .LinkedBlockingQueue ;
912
10- public class AnalogInput extends AbstractLooperProvider {
13+ public class AnalogInput extends AbstractLooperProvider implements ioio . lib . api . AnalogInput {
1114 private static final String TAG = "AnalogInput" ;
1215 private AnalogInputLooper looper ;
16+ static final protected BlockingQueue <FloatConsumer <ioio .lib .api .AnalogInput >> INPUT_QUEUE = new LinkedBlockingQueue <>();
1317
1418 public AnalogInput () {
1519 super ();
1620 Log .i (TAG , "created" );
1721 }
1822
23+ @ Override
24+ public int available () throws ConnectionLostException {
25+ return 0 ;
26+ }
27+
1928 @ Override
2029 public void close () {
2130 super .close ();
@@ -28,12 +37,79 @@ public IOIOLooper createIOIOLooper(String connectionType, Object extra) {
2837 return looper ;
2938 }
3039
40+ @ Override
41+ public int getOverflowCount () {
42+ return (int ) invokeFloat (ioio .lib .api .AnalogInput ::getOverflowCount );
43+ }
44+
45+ @ Override
46+ public float getReference () {
47+ return invokeFloat (ioio .lib .api .AnalogInput ::getReference );
48+ }
49+
50+ @ Override
51+ public float getSampleRate () {
52+ return invokeFloat (ioio .lib .api .AnalogInput ::getSampleRate );
53+ }
54+
55+ @ Override
56+ public float getVoltage () {
57+ return invokeFloat (ioio .lib .api .AnalogInput ::getVoltage );
58+ }
59+
60+ @ Override
61+ public float getVoltageBuffered () {
62+ return invokeFloat (ioio .lib .api .AnalogInput ::getVoltageBuffered );
63+ }
64+
65+ @ Override
66+ public float getVoltageSync () {
67+ return invokeFloat (ioio .lib .api .AnalogInput ::getVoltageSync );
68+ }
69+
3170 public void open (int pin ) {
3271 Log .i (TAG , "openInput" );
3372 looper = new AnalogInputLooper (QUEUE , pin );
3473 start ();
3574 }
3675
76+ @ Override
77+ public float read () throws InterruptedException , ConnectionLostException {
78+ return invokeFloat (ioio .lib .api .AnalogInput ::read );
79+ }
80+
81+ @ Override
82+ public float readBuffered () {
83+ return invokeFloat (ioio .lib .api .AnalogInput ::readBuffered );
84+ }
85+
86+ @ Override
87+ public float readSync () {
88+ return invokeFloat (ioio .lib .api .AnalogInput ::readSync );
89+ }
90+
91+ @ Override
92+ public void setBuffer (int capacity ) {
93+
94+ }
95+
96+ protected float invokeFloat (FloatConsumer <ioio .lib .api .AnalogInput > consumer ) {
97+ final CountDownLatch latch = new CountDownLatch (1 );
98+ final float [] result = new float [1 ];
99+ try {
100+ INPUT_QUEUE .put (e -> {
101+ result [0 ] = consumer .invoke (e );
102+ latch .countDown ();
103+ return result [0 ];
104+ });
105+ latch .await ();
106+ }
107+ catch (InterruptedException e ) {
108+ throw new RuntimeException (e );
109+ }
110+ return result [0 ];
111+ }
112+
37113 static class AnalogInputLooper extends AbstractLooper {
38114 private ioio .lib .api .AnalogInput analogInput ;
39115
@@ -47,6 +123,19 @@ public void close() {
47123 this .analogInput = null ;
48124 }
49125
126+ @ Override
127+ public void loop () throws InterruptedException , ConnectionLostException {
128+ super .loop ();
129+ if (!INPUT_QUEUE .isEmpty ()) {
130+ try {
131+ INPUT_QUEUE .take ().invoke (analogInput );
132+ }
133+ catch (ConnectionLostException | IncompatibilityException e ) {
134+ throw new RuntimeException (e );
135+ }
136+ }
137+ }
138+
50139 @ Override
51140 public void setup (IOIO ioio ) {
52141 Log .i (TAG , "setup entered" );
0 commit comments