You can add a TimerTask to interrupt the thread after some timeout. Search
the forum for examples if you need them. If you don't want to delay all the
other 5 if one is stuck you can easily run 6 sensors on 6 different threads.

On Wed, Apr 22, 2015 at 2:42 PM, Daniel Brown <[email protected]> wrote:

> if one PulseInput pin is open or has not received a pulse and you call
> getDuration() it will block you from reading all other PulseInput pins
> until it has received at least one pulse. We have found that one bad sensor
> will stop you from reading any other sensor.
>
>
> On Friday, April 10, 2015 at 6:59:52 PM UTC-6, Daniel Brown wrote:
>>
>> We have a project that uses 6 distance finders,  when we try to call
>> .getDuration() on more then one all further reading freezes.
>>
>> protected void setup() throws ConnectionLostException {
>>
>> // front left pulse and echo
>> echoPinfl_ = ioio_.openPulseInput(6, PulseMode.POSITIVE);
>> triggerPinfl_ = ioio_.openDigitalOutput(7);
>>  // front middle pulse and echo
>> echoPinfm_ = ioio_.openPulseInput(2, PulseMode.POSITIVE);
>> triggerPinfm_ = ioio_.openDigitalOutput(4);
>>
>> ...
>>
>> public void loop() throws ConnectionLostException, InterruptedException {
>>  // updates front left sensor
>> try{
>> triggerPinfl_.write(false);
>> Thread.sleep(5);
>> triggerPinfl_.write(true);
>> Thread.sleep(1);
>> triggerPinfl_.write(false);
>> echosecondsfl_ = (int)(echoPinfl_.getDuration() * 1000 * 1000);
>> echoDistanceCmfl_ = echosecondsfl_ / 29 / 2;
>> }catch (ConnectionLostException e) { throw e;}
>>  // updates front middle sensor
>> try{
>> triggerPinfm_.write(false);
>> Thread.sleep(5);
>> triggerPinfm_.write(true);
>> Thread.sleep(1);
>> triggerPinfm_.write(false);
>> // echosecondsfm_ = (int)(echoPinfm_.getDuration() * 1000 * 1000);  //if
>> this line is commented in all further input stops
>> // echoDistanceCmfm_ = echosecondsfm_ / 29 / 2;
>> }catch (ConnectionLostException e) { throw e;}
>>
>> ...
>>
>> On Friday, May 16, 2014 at 11:03:20 AM UTC-6, Ytai wrote:
>>>
>>> Thanks for sharing!
>>>
>>>
>>> On Thu, May 15, 2014 at 9:25 PM, <[email protected]> wrote:
>>>
>>>> Here is some code that works great with the Parallax Ping))) with the
>>>> circuit in the file attached (thanks to Ytai):
>>>>
>>>> private int read(DigitalOutput strobe, PulseInput input, int inputPin) 
>>>> throws ConnectionLostException, InterruptedException // Order of following 
>>>> statements is very important...do not change
>>>>
>>>>    {
>>>>            int distance = 0;
>>>>
>>>>            ioio.beginBatch();
>>>>
>>>>
>>>>            strobe.write(true);
>>>>
>>>>            input = ioio.openPulseInput(inputPin, PulseMode.POSITIVE);
>>>>
>>>>            ioio.endBatch();
>>>>
>>>>
>>>>            SystemClock.sleep(40);
>>>>
>>>>            strobe.write(false);
>>>>
>>>>            distance += (int) (input.getDuration() * CONVERSION_FACTOR);
>>>>
>>>>            input.close();
>>>>
>>>>
>>>>            return distance;
>>>>    }
>>>>
>>>>
>>>> On Wednesday, April 30, 2014 10:25:27 AM UTC-7, [email protected]
>>>> wrote:
>>>>>
>>>>> I'll clean up the class and post it.  Hope other people can use it.
>>>>> Works very solidly with the Parallax Ping))) ultrasonic module.
>>>>> Great suggestion to use only one pin for both input and output.  It
>>>>> would even have saved me a part on the pc boards.
>>>>>
>>>>> On Sunday, April 27, 2014 8:24:19 PM UTC-7, Ytai wrote:
>>>>>>
>>>>>> Cool. If you can create a nice class for using the PING (where the
>>>>>> ctor gets a IOIO and two pin numbers, and there's a getDistance() method)
>>>>>> and share it on this forum, it would be a decent return for our efforts 
>>>>>> :)
>>>>>> As a side note, since you're doing the open-close trick, you might as 
>>>>>> well
>>>>>> use a single pin and open-close the digital output as well and not need 
>>>>>> the
>>>>>> driver chip, so you can even further simplify both your code and your
>>>>>> circuit.
>>>>>>
>>>>>>
>>>>>> On Sun, Apr 27, 2014 at 8:19 PM, Vic Wintriss <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> I finally got it to work using your last suggestion.  This code
>>>>>>> works that you recommended works perfectly.  Thanks so much for sticking
>>>>>>> with us.  We've got 30 or 40 kids using this code at the International
>>>>>>> Autonomous Robot Competition (iARoC 2014) coming up at the end of June.
>>>>>>> Check out iaroc.org.
>>>>>>>
>>>>>>> triggerHigh();
>>>>>>> in = openPulseInput();
>>>>>>> sleep(20ms);  // wait until the pulse input module is ready for a
>>>>>>> pulse.
>>>>>>> triggerLow();  // kick off a measurement (falling edge does not
>>>>>>> trigger the pulse input)
>>>>>>> duration = in.getDuration();
>>>>>>> in.close();
>>>>>>> return duration;
>>>>>>>
>>>>>>> On Sunday, April 27, 2014 11:36:53 AM UTC-7, Ytai wrote:
>>>>>>>
>>>>>>>> Let me shed some light on the internals of PulseInput:
>>>>>>>>
>>>>>>>>    - A timer is running on the IOIO set to 200Hz (5ms).
>>>>>>>>    - As soon as the pulse input module is opened, and every time
>>>>>>>>    after a pulse is captured the module will be put in the "ready" 
>>>>>>>> state.
>>>>>>>>    - Every time the 200Hz timer triggers, each "ready" module will
>>>>>>>>    be activated, i.e. put in a state where it is waiting for a new 
>>>>>>>> pulse.
>>>>>>>>    - Once activated, the module will wait forever (or until
>>>>>>>>    closed) for a pulse, then measure its duration, then sends the 
>>>>>>>> result to
>>>>>>>>    the Android.
>>>>>>>>    - So this means that effectively no matter what the actual
>>>>>>>>    pulse rate is, you will never get more than 200 reports per second. 
>>>>>>>> This
>>>>>>>>    has been done on purpose to prevent a high frequency pulse train 
>>>>>>>> from
>>>>>>>>    saturating the connection between the IOIO and the Android. This 
>>>>>>>> also means
>>>>>>>>    that there is a potential "dead time" of up to 5ms after opening or 
>>>>>>>> between
>>>>>>>>    pulses, during which a pulse would not be detected.
>>>>>>>>    - On the Android side, every pulse report finds its way to your
>>>>>>>>    PulseInput object. You can then read it in one of three ways:
>>>>>>>>       - getDuration() will return the last report. It will
>>>>>>>>       generally not block, then only exception is until the first 
>>>>>>>> report arrives.
>>>>>>>>       - getDurationSync() will always block until a new report
>>>>>>>>       comes in, then return it. So you can be sure that the report is 
>>>>>>>> new.
>>>>>>>>       - getDurationBuffered() pulls pulses one by one from a
>>>>>>>>       queue. When the queue becomes empty it behave like 
>>>>>>>> getDurationSync(), i.e.
>>>>>>>>       waits until a new report comes in.
>>>>>>>>
>>>>>>>> The Arduino approach cannot be directly applied to the IOIO API,
>>>>>>>> since you have to take into account that because of the communication
>>>>>>>> between the Android and the IOIO, much of the IOIO API has been 
>>>>>>>> designed to
>>>>>>>> be asynchronous in nature. If you were to bake the PING driver directly
>>>>>>>> into the IOIO firmware, you can use a similar approach to Arduino's
>>>>>>>> (although you'd probably want to implement it in a non-blocking way, 
>>>>>>>> since
>>>>>>>> the IOIO allows everything to be used concurrently). The reason why I 
>>>>>>>> have
>>>>>>>> not done that is because I tried to focus on generic use-cases rather 
>>>>>>>> than
>>>>>>>> on one peculiar sensor interface.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sun, Apr 27, 2014 at 10:57 AM, Duane DeSieno <[email protected]
>>>>>>>> > wrote:
>>>>>>>>
>>>>>>>>> My confusion is maybe over the way getDuration works.
>>>>>>>>> Does it delay 5ms before looking for the pulse or does it look
>>>>>>>>> immediately?
>>>>>>>>> I put 555 timer on the input pin and set it up for 3.15hz and
>>>>>>>>> 25.4% duty cycle or an 80.6ms pulse every 317.4ms.
>>>>>>>>> I called getDuration roughly every 100ms.  It did not block and
>>>>>>>>> returned the same value several times before the next pulse 
>>>>>>>>> occurred(not
>>>>>>>>> what I expected).
>>>>>>>>>
>>>>>>>>> Looked at the Arduino approach to using the PING and they use just
>>>>>>>>> one pin, changing from output after sending a pulse to ping to an 
>>>>>>>>> input for
>>>>>>>>> their get duration call.
>>>>>>>>> Since they don't impose a 5ms delay, they get the duration of the
>>>>>>>>> return pulse.
>>>>>>>>>
>>>>>>>>> Thanks for you help on this.
>>>>>>>>>
>>>>>>>>> Duane
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>  --
>>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>>> Groups "ioio-users" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>> send an email to [email protected].
>>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>>>
>>>>>>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>
>>>>>>>>
>>>>>>>>  --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "ioio-users" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> To post to this group, send email to [email protected].
>>>>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>  --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "ioio-users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at http://groups.google.com/group/ioio-users.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  --
> You received this message because you are subscribed to the Google Groups
> "ioio-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/ioio-users.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"ioio-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/ioio-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to