Hi Ytai,

I managed to use Mode.POSITIVE without scaling, and it seems working fine 
for now.

I think I'll use it for now, since I'm not really sure how to "remove the 
mode check"

Would you mind to take a look on my other issue?
I posted it here:
https://groups.google.com/forum/#!topic/ioio-users/38OThc8IJq0

Thanks Ytai
I really owe you a beer

On Wednesday, September 6, 2017 at 12:42:01 AM UTC+7, Ytai wrote:
>
> Yeah, I see. Well, since you're going to be ignoring the value anyway, you 
> can simply remove the mode check.
>
> On Thu, Aug 31, 2017 at 6:32 PM, Maximillian <[email protected] 
> <javascript:>> wrote:
>
>> Hi Ytai,
>>
>> Sorry I think the logic is ok.
>>
>> It's just we cannot use *getDurationBuffered()* along with 
>> *PulseMode.FREQ_SCALE_16*,
>> We can only use *getDurationBuffered()* when in *PulseMode.POSITIVE* or 
>> *PulseMode.NEGATIVE*.
>>
>> Then the question is, how to apply the scaling as you mentioned earlier?
>>
>> 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)
>>>
>>
>>
>> On Friday, September 1, 2017 at 8:07:51 AM UTC+7, Maximillian wrote:
>>
>>> 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:
>>>>>>>>>>>>>>>>>>> <blockquote class="gmail_quote" style="margin
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> -- 
>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/ioio-users.
>> For more options, visit <a href="https://group
>>
>

-- 
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