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.

Reply via email to