Hi,
I am sorry about that. I understand that debugging a lot of code is time
consuming. Here attached is a version that I debugged step by step. I found
that I had calls to functions which might call the twi.writeReadAsync
simultaneously, removing these calls made my app responsive to subsequent
calls of my stim_on and stim_off. Moreover, calling the twi.writeReadAsync
for the RB buffer at multiple places as you mentioned seemed to cause the
App to crash after a second call of my stim_on and stim_off. Removing all
calls to twi.writeReadAsync for RB buffer solved the problem for the
moment.
I figured that I need to keep the screen alive (as I used to do) so that
after my Timer is up my stim_off is executed, otherwise it is not executed.
I also have a problem that is persisting, I cannot call my stim_on with my
button on my screen more than 8 times precisely, is that related to some
buffer or something?
I would like to know how I can make sure that I can call
the twi.writeReadAsync in multiple functions, sequentially (one after the
other). For example, DSP_button1(); followed by DSPbutton2(); and
DSPbutton3(); each containing calls of twi.writeReadAsync .
Thanks again for your help!
Le samedi 14 mars 2015 00:11:28 UTC+1, Ytai a écrit :
>
> I think you misunderstood what I meant by "minimal code". What I meant is
> that you provide me with minimum code that actually does build and run and
> exhibits your problem and that is as small as possible. Reading through
> your 300 or so lines of code trying to figure out what's going on is a
> pretty time-consuming task. It is very likely that in the process of trying
> to strip down your code you'll find out the problem yourself. Otherwise,
> you'd be at least able to explain it more precisely.
>
> As for the asynchronous calls, if you actually care about what's in the
> buffer, you shouldn't share it across concurrent calls. Otherwise, why are
> you passing it in the first place?
>
> On Fri, Mar 13, 2015 at 5:04 AM, Vincent Nadon <[email protected]
> <javascript:>> wrote:
>
>> Hi,
>>
>> I trimmed it a bit more again, I haven't tested this code because I would
>> have to put some code back in... but it should show the problem. I have
>> shown where "response" is defined in this version. I am comfortable sharing
>> across asynchronous calls since these calls are supposed to be sequential
>> if I see it right and also it is simply a read data buffer.
>>
>> Thanks for further help :)
>>
>> Le jeudi 12 mars 2015 22:00:50 UTC+1, Ytai a écrit :
>>>
>>> Is that really the minimum required, in the sense that anything you'd
>>> remove would make the problem disappear? Also some things are missing, e.g.
>>> where the response buffer being defined and why are you comfortable sharing
>>> it across asynchronous calls.
>>> On Mar 12, 2015 7:06 AM, "Vincent Nadon" <[email protected]> wrote:
>>>
>>>> Hi,
>>>>
>>>> Here is the trimmed down file that should illustrate the problem. I
>>>> think it mainly comes from my threads (timers) and the IOIO management...
>>>>
>>>> Hope you guys can help me out :)
>>>>
>>>> See attached file!
>>>>
>>>> Le jeudi 12 mars 2015 05:28:13 UTC+1, Ytai a écrit :
>>>>>
>>>>> There's nothing special about the loop() method, it is mostly a
>>>>> convenience feature. You may call IOIO APIs from any thread including the
>>>>> UI thread (which includes all sorts of GUI listeners).
>>>>> The code you posted on stackoverflow doesn't have anything that's
>>>>> related to IOIO on it, so I don't think you'd get much help there. I
>>>>> recommend you to make a copy of your problematic app, trim it down to the
>>>>> bare minimum that illustrates the problem and then post it here.
>>>>>
>>>>> On Wed, Mar 11, 2015 at 11:48 AM, Vincent Nadon <[email protected]
>>>>> > wrote:
>>>>>
>>>>>> I am having the following problem : http://stackoverflow.com/que
>>>>>> stions/28989176/android-app-stops-i2c-bluetooth-communication-ioio
>>>>>> and I think it's because all my code to call the twi.WriteReadAsync
>>>>>> is outside the loop() function.
>>>>>>
>>>>>> Le mercredi 11 mars 2015 18:55:55 UTC+1, Vincent Nadon a écrit :
>>>>>>
>>>>>>> How does the Android IOIO App loop() function work? Is there a way
>>>>>>> to create functions in the Looper class which are called inside this
>>>>>>> loop()
>>>>>>> according to a listener on a Button or a Spinner? This way it would
>>>>>>> simplify my code since I need to send a lot of twi commands in the
>>>>>>> loop()
>>>>>>> based on the user input in my Android UI Menu.
>>>>>>>
>>>>>> --
>>>>>> 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] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> 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.
package net.mitchtech.ioio;
import java.nio.ByteBuffer;
import java.util.Calendar;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
//import com.example.graph.LineGraph;
import ioio.lib.api.AnalogInput;
import ioio.lib.api.TwiMaster;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.android.IOIOActivity;
import net.mitchtech.ioio.sensorgraph.R;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.widget.SeekBar.OnSeekBarChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.achartengine.GraphicalView;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class SensorGraphActivity extends IOIOActivity {
private Spinner spinner1, spinner2;
private Button button7;
private Button emergency_stop;
TwiMaster twi;
private dataRecCountDownTimer dataRecTimer;
TextView myOutputBox;
int addressDSP1 = 0x38;
byte[] stim_on = new byte[] { 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01 }; // Address
// ,
// 0x00
// +
// ON/OFF
byte[] stim_off = new byte[] { 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00 };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
myOutputBox = (TextView) findViewById(R.id.myOutputBox);
addListenerOnButton();
addListenerOnSpinnerItemSelection();
addListenerOnButton2();
dataRecTimer = new dataRecCountDownTimer(39600, 100);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
public void addListenerOnSpinnerItemSelection() {
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner1.setOnItemSelectedListener(new CustomOnItemSelectedListener());
}
public void addListenerOnButton() {
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner2 = (Spinner) findViewById(R.id.spinner2);
button7 = (Button) findViewById(R.id.button7);
button7.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (spinner1.getSelectedItem().toString().equals("DPOAE measurement"))
{
try {
twi.writeReadAsync(addressDSP1, false, stim_off,
stim_off.length, null, 0);
twi.writeReadAsync(addressDSP1, false, stim_on,
stim_on.length, null, 0);
} catch (ConnectionLostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dataRecTimer.start();
}
}
});
}
public void addListenerOnButton2() {
emergency_stop = (Button) findViewById(R.id.button8);
emergency_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
twi.writeReadAsync(addressDSP1, false, stim_off,
stim_off.length, null, 0);
} catch (ConnectionLostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public class dataRecCountDownTimer extends CountDownTimer {
public dataRecCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
try {
twi.writeReadAsync(addressDSP1, false, stim_off,
stim_off.length, null, 0);
} catch (ConnectionLostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Looper extends BaseIOIOLooper {
public void setup() throws ConnectionLostException {
try {
twi = ioio_.openTwiMaster(0, TwiMaster.Rate.RATE_1MHz, false);
} catch (ConnectionLostException e) {
throw e;
}
}
public void loop() throws ConnectionLostException {
} // END loop()
} // END IOIOThread
// ===============================================================================================================================================
@Override
protected IOIOLooper createIOIOLooper() {
return new Looper();
}
} // LAST BRACKET