Hi Ytai,
Maybe the logic checking is wrong?
IncapImpl.java line 108
@Override
public synchronized float getDurationBuffered() throws InterruptedException,
ConnectionLostException {
if (mode_ != PulseMode.POSITIVE && mode_ != PulseMode.NEGATIVE) {
throw new IllegalStateException(
"Cannot wait for pulse when module was not opened in pulse mode.");
}
checkState();
while (pulseQueue_.isEmpty()) {
safeWait();
}
return timeBase_ * pulseQueue_.remove();
}
Maybe we should change it to
if (mode_ == PulseMode.POSITIVE || mode_ == PulseMode.NEGATIVE) {
throw new IllegalStateException(
"Cannot wait for pulse when module was not opened in pulse mode.");
}
if the mode is *PulseMode.POSITIVE* or *PulseMode.NEGATIVE* then we cannot
wait for pulse.
We need the PulseMode is either in *PulseMode.FREQ, **PulseMode.FREQ_SCALE_4,
OR **PulseMode.FREQ_SCALE_16* mode to use *getDurationBuffered()*
Or maybe I miss something here?
On Friday, September 1, 2017 at 7:46:31 AM UTC+7, Maximillian wrote:
>
> Hi Ytai,
>
> I got this exception
>
> E/IOIOBaseApplicationHelper: Unexpected exception
> caught:java.lang.IllegalStateException:
> Cannot wait for pulse when module was not opened in pulse mode.
> at ioio.lib.impl.IncapImpl.getDurationBuffered(IncapImpl.java:112)
> at ioio.test.activities.FillActivity$1.loop(FillActivity.java:328)
> at
> ioio.lib.util.IOIOBaseApplicationHelper$IOIOThread.run(IOIOBaseApplicationHelper.java:67)
>
> I have initialized the flowmeter like this:
>
> PulseInput flowMeter;
>
> //in the setup()
>
> flowMeter = ioio_.openPulseInput(FLOW_METER_PIN,
> PulseInput.PulseMode.FREQ_SCALE_16);
>
> //in the loop()
> float durationBuffered = flowMeter.getDurationBuffered();
> totalPulse += 16
>
>
> I don't get the exception when I use getFrequencySync(), but I'd like to
> you getDurationBuffered() as you suggested for more detailed count.
>
> Any suggestion?
>
> On Wednesday, August 30, 2017 at 2:02:57 PM UTC+7, Maximillian wrote:
>>
>> I guess I'll just have to use getVoltage() then..
>>
>> Big thanks Ytai!
>>
>> You are a lifesaver! :)
>>
>> On Tuesday, August 29, 2017 at 11:31:16 PM UTC+7, Ytai wrote:
>>>
>>> Analog samples get pushed from the IOIO to the Android at 1kHz (one
>>> sample every 1ms). So if you use getVoltage(), whatever sample you're
>>> getting is only a few milliseconds old (since there's some latency too).
>>> I'm guessing that for pH measurements this is completely insignificant. The
>>> *Sync version is only interesting for example in case where you want to set
>>> some output which affects the voltage you're measuring and then make sure
>>> that the reading you're getting is one that was captured after the output
>>> has been set. Doesn't seem relevant for your case.
>>>
>>> On Tue, Aug 29, 2017 at 12:17 AM, Maximillian <[email protected]>
>>> wrote:
>>>
>>>> Hi Ytai,
>>>>
>>>> I'd like to have the pulse counting to be as accurrate as possible.
>>>>
>>>> I'm not really sure about the difference of getVoltageSync() and
>>>> getVoltage().
>>>>
>>>> But when I use the *sync method, the method block until new sample
>>>> arrive right?
>>>>
>>>> I don't mind if i lost a few pH input.
>>>>
>>>> So in order to achieve that goal, would it be better if I use
>>>> getVoltage() rather than getVoltageSync()?
>>>> Or maybe I should try another method?
>>>>
>>>> Many thanks
>>>>
>>>>
>>>> On Tuesday, August 29, 2017 at 1:17:37 PM UTC+7, Ytai wrote:
>>>>>
>>>>> I don't think there's a lot of value in using the *Sync version.
>>>>> Otherwise it's fine, as long as you don't mind that the sample rate
>>>>> varies
>>>>> with the flow rate. Otherwise, create a separate thread for one or the
>>>>> other.
>>>>>
>>>>> On Aug 28, 2017 18:21, "Maximillian" <[email protected]> wrote:
>>>>>
>>>>>> Thanks a lot Ytai.
>>>>>>
>>>>>> One more thing.
>>>>>>
>>>>>> I plan to use pH sensor along with this flow sensor.
>>>>>>
>>>>>> more or less it will be like this:
>>>>>>
>>>>>> PulseInput flowMeter = ioio_.openPulseInput(FLOW_METER_PIN,
>>>>>> PulseInput.PulseMode.FREQ_SCALE_16); //using frequency measurement
>>>>>> with 16x scaling
>>>>>> AnalogInput phMeter = ioio_.openAnalogInput(PH_METER_PIN);
>>>>>>
>>>>>>
>>>>>> float phVolt;
>>>>>>
>>>>>> int totalPulse = 0; //set initial value of totalPulse
>>>>>>
>>>>>> (this is inside the loop)
>>>>>>
>>>>>> {
>>>>>>
>>>>>> duration = flowMeter.getDurationBuffered(); //the loop will wait
>>>>>> here for 16 pulse then continue to next line
>>>>>>
>>>>>> totalPulse += 16; //add total pulse by 16 because we use
>>>>>> FREQ_SCALE_16
>>>>>>
>>>>>> ....
>>>>>> phVolt = phMeter.getVoltageSync();
>>>>>> phValue = calculatePhFromVolt(phVolt);
>>>>>>
>>>>>> ....
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> I think the phMeter will always has a value to return and will not
>>>>>> block the UI.
>>>>>>
>>>>>> Would it be an issue if combined with the
>>>>>> PulseInput.getDurationBuffered()?
>>>>>>
>>>>>> Thanks.
>>>>>>
>>>>>> On Monday, August 28, 2017 at 9:03:16 PM UTC+7, Ytai wrote:
>>>>>>>
>>>>>>> Yup, that's what I meant. And you don't need the sleep.
>>>>>>>
>>>>>>> On Aug 28, 2017 1:21 AM, "Maximillian" <[email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Ytai, thanks for the reply,
>>>>>>>>
>>>>>>>> Based from your suggestion,
>>>>>>>>
>>>>>>>> PulseInput flowMeter = ioio_.openPulseInput(FLOW_METER_PIN,
>>>>>>>> PulseInput.PulseMode.FREQ_SCALE_16); //using frequency measurement
>>>>>>>> with 16x scaling
>>>>>>>>
>>>>>>>>
>>>>>>>> int totalPulse = 0; //set initial value of totalPulse
>>>>>>>>
>>>>>>>> (this is inside the loop)
>>>>>>>>
>>>>>>>> {
>>>>>>>>
>>>>>>>> duration = flowMeter.getDurationBuffered(); //the loop will wait
>>>>>>>> here for 16 pulse then continue to next line
>>>>>>>>
>>>>>>>> totalPulse += 16; //add total pulse by 16 because we use
>>>>>>>> FREQ_SCALE_16
>>>>>>>>
>>>>>>>> ....
>>>>>>>>
>>>>>>>> ....
>>>>>>>>
>>>>>>>> Thread.sleep(100);
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> Do you mean like this?
>>>>>>>>
>>>>>>>> And also, do I still need the Thread.sleep(100)? As the
>>>>>>>> getDurationBuffered() will do pause the loop while waiting for 16
>>>>>>>> pulse to come.
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>>
>>>>>>>> do I still need to use Thread.sleep(100) when using this
>>>>>>>> implementation? Since getDurationBuffered will do pausing the loop
>>>>>>>> waiting for 16 pulse to come.
>>>>>>>>
>>>>>>>> On Monday, August 28, 2017 at 11:15:05 AM UTC+7, Ytai wrote:
>>>>>>>>>
>>>>>>>>> You can use getDurationBuffered() and apply scaling (to reduce the
>>>>>>>>> pulse rate). This will ensure you don't miss any pulses. You can even
>>>>>>>>> ignore the actual value returned, since you don't seem to care about
>>>>>>>>> the
>>>>>>>>> rate, but rather about the count. Each time getDurationBuffered()
>>>>>>>>> returns,
>>>>>>>>> it would mean that 16 pulses (or whatever your scaling is) were
>>>>>>>>> observed.
>>>>>>>>> So you'll end up with a somewhat cumbersome, yet accurate way to
>>>>>>>>> count your
>>>>>>>>> pulses.
>>>>>>>>>
>>>>>>>>> On Wed, Aug 23, 2017 at 7:39 PM, Maximillian <[email protected]
>>>>>>>>> > wrote:
>>>>>>>>>
>>>>>>>>>> Fyi, I use this sensor.
>>>>>>>>>> https://www.seeedstudio.com/Water-Flow-Sensor-YF-B1-p-2878.html
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thursday, August 24, 2017 at 9:38:08 AM UTC+7, Maximillian
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> I think I could get around ~40 pulse per each call of flowMeter.
>>>>>>>>>>> getFrequencySync() in a Thread.sleep(100) loop.
>>>>>>>>>>>
>>>>>>>>>>> Is it still unsafe to just use the getFrequencySync() method
>>>>>>>>>>> for that amount of pulse?
>>>>>>>>>>>
>>>>>>>>>>> Or maybe I can just lower the sleep time to maybe Thread.sleep(
>>>>>>>>>>> 50) for better accuracy?
>>>>>>>>>>>
>>>>>>>>>>> Thanks for the hint, I'll try to look into that.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Thursday, August 24, 2017 at 6:18:52 AM UTC+7, Ytai wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> What's the maximum pulse rate for your application?
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, Aug 23, 2017 at 3:36 PM, Maximillian <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Can you give more hint about how to count?
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'm not really sure how to do it.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Big thanks
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wednesday, August 23, 2017 at 11:56:20 PM UTC+7, Ytai wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Sampling the frequency and integrating will give you an
>>>>>>>>>>>>>> estimate of the total. If it's not accurate enough, you'll need
>>>>>>>>>>>>>> to count.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Aug 22, 2017 2:51 PM, "Maximillian" <[email protected]>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hi Ytai,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> This is my current code (trimmed for this post)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> int FLOW_METER_PIN = 14;
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> volatile float pulseFreq, totalPulse;
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> PulseInput flowMeter = ioio_.openPulseInput(FLOW_METER_PIN,
>>>>>>>>>>>>>>> PulseInput.PulseMode.FREQ);
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> totalPulse = 0;
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> public void loop() throws ConnectionLostException,
>>>>>>>>>>>>>>> InterruptedException
>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> pulseFreq = flowMeter.getFrequencySync();
>>>>>>>>>>>>>>> totalPulse += pulseFreq;
>>>>>>>>>>>>>>> //display totalPulse value to a textView;
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thread.sleep(100);
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Current behavior is already as I expected, the totalPulse
>>>>>>>>>>>>>>> textView will updated only when the hall sensor is spinning
>>>>>>>>>>>>>>> (flow detected)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If I use the getFrequencySync() method, I think the loop is
>>>>>>>>>>>>>>> paused, waiting the flowMeter to receive input.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If it received input, the totalPulse will increase by the
>>>>>>>>>>>>>>> amount of pulseFreq from getFrequencySync().
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I haven't tested with real water yet (I just blow the flow
>>>>>>>>>>>>>>> sensor to make the hall spin for early development test)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> My question, is it correct to use this approach with the
>>>>>>>>>>>>>>> getFrequencySync() method?
>>>>>>>>>>>>>>> Or I still need to hack the DigitalInputImpl to count the
>>>>>>>>>>>>>>> pulses?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Wednesday, August 23, 2017 at 4:18:28 AM UTC+7, Ytai
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> It is known, but there isn't currently a plan to add it. If
>>>>>>>>>>>>>>>> anyone wants to contribute a patch, I will happily consider
>>>>>>>>>>>>>>>> adopting it.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Aug 13, 2017 8:21 PM, "Maximillian" <
>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Is this still a known missing feature? As this post is
>>>>>>>>>>>>>>>>> from 2013.. I need to use flow sensor as well..
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Monday, September 9, 2013 at 10:31:46 AM UTC+7, Ytai
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> This is known missing feature. You can work around this
>>>>>>>>>>>>>>>>>> by hacking DigitalInputImpl to count the pulses: its
>>>>>>>>>>>>>>>>>> setValue() method will
>>>>>>>>>>>>>>>>>> get called on every edge.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Fri, Sep 6, 2013 at 11:21 AM, jorge sb <
>>>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Hi. I want to connect a hall sensor flow meter to ioio.
>>>>>>>>>>>>>>>>>>> Perhaps, I could use "PulseInput" but after reading
>>>>>>>>>>>>>>>>>>> ioio-wiki, I see that I can't do it with it.
>>>>>>>>>>>>>>>>>>> Really, I need a simple pulse counter but without
>>>>>>>>>>>>>>>>>>> loosing any pulse.
>>>>>>>>>>>>>>>>>>> With flow meter I will like to get:
>>>>>>>>>>>>>>>>>>> - Total liquid flow (accumulated countered pulses)
>>>>>>>>>>>>>>>>>>> - Instant flow (reading difference between two counts in
>>>>>>>>>>>>>>>>>>> a measured time).
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> With this sensor I could get a pulse every 50 msec or
>>>>>>>>>>>>>>>>>>> less at max rate.
>>>>>>>>>>>>>>>>>>> I think I could loose pulses doing periodic read of
>>>>>>>>>>>>>>>>>>> digital input.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Some suggestion.
>>>>>>>>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>> 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/groups/opt_out.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>> 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
>>>>>>>>>>>>>>>>> https://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
>>>>>>>>>>>>>>> https://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 https://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 https://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 https://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 https://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 https://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 https://groups.google.com/group/ioio-users.
For more options, visit https://groups.google.com/d/optout.