2014-07-23 7 views
0

Je travaille sur le contrôle à distance. Il y a une voiture, il a servo + esc, et ils sont connectés à arduino, qui est connecté au bouclier wifi. De l'autre côté j'ai tablette Android, qui envoie des données à arduino pour contrôler une voiture. Il y a un code source pour Android app:Android Listener interrompt Listener

package rccardriver.app; 

import android.widget.Button; 
import android.widget.SeekBar; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.io.IOException; 
import android.os.AsyncTask; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import java.io.DataOutputStream; 



public class MainActivity extends Activity { 

    private Socket socket=null; 
    private SeekBar steeringControl = null; 
    private SeekBar speedControl = null; 
    private Button btn=null; 
    DataOutputStream DOS = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn=(Button)findViewById(R.id.button); 
     btn.setOnClickListener(buttonConnectOnClickListener); 
     steeringControl =(SeekBar)findViewById(R.id.steering_bar); 
     speedControl =(SeekBar)findViewById(R.id.speed_bar); 
     steeringControl.setMax(75); 
     speedControl.setMax(180); 
     speedControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       try { 
        DOS.write(0x01); 
        DOS.write((byte)(speedControl.getProgress()+3)); 
       } catch (IOException e) { 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       speedControl.setProgress(84); 
      } 
     }); 
     steeringControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       try { 
        DOS.write(0x00); 
        DOS.write((byte)(steeringControl.getProgress()+3)); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
     //    e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       steeringControl.setProgress(35); 
      } 
     }); 

     MyClientTask myClientTask = new MyClientTask("192.168.12.101", 8899); 
     myClientTask.execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    View.OnClickListener buttonConnectOnClickListener = 
      new View.OnClickListener(){ 

       @Override 
       public void onClick(View arg0) { 
        try { 
         DOS.write(0x02); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
      //    e.printStackTrace(); 
        } 
       }}; 

    public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 
     MyClientTask(String addr, int port){ 
      dstAddress = addr; 
      dstPort = port; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      try { 
       socket = new Socket(dstAddress, dstPort); 
       DOS = new DataOutputStream(socket.getOutputStream()); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
    //    e.printStackTrace(); 
    //   response = "UnknownHostException: " + e.toString(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
    //   e.printStackTrace(); 
    //   response = "IOException: " + e.toString(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
    //  textResponse.setText(response); 
      super.onPostExecute(result); 
     } 

    } 
} 

App a deux seekbars et 1 bouton. Seekbars contrôle la direction et la vitesse. Les boutons de contrôle se brisent. Quand Chacun de ces objets a son propre écouteur. Et quand je touche l'un de ces objets, l'écouteur est appelé, ce qui envoie deux octets: le premier octet représente nr de commande, le second est pour la valeur. Le problème est que lorsque je touche continuellement des objets, l'écouteur récemment appelé est interrompu par l'écouteur appelé suivant. Alors que Arduino reçoit des octets aléatoires. Quelqu'un a une idée pour résoudre ce problème? Comment faire en sorte que l'auditeur soit complètement fait?

+0

Essayez d'encapsuler DOS.write en méthode synchronisée. – kujeensiti

+0

pourriez-vous s'il vous plaît me pointer où je dois coller "synchronisé". Je ne peux avoir – Qeeet

Répondre

0

Excuses de vous demander de prendre du recul. Vous pouvez procéder de la manière suivante.

Assurez-vous d'abord que la fonction de rappel est réellement interrompue. Vérifiez cela en capturant les données écrites au DOS. Vous pouvez le faire en construisant DOS avec FileOutputStream au lieu de socket.getOutputStream. Maintenant, tous vos appels d'écriture DOS vont écrire des données dans un fichier.

Exécutez votre application - faites des activités d'interface utilisateur rapides - tirez le fichier - vérifiez que les écritures sont vraiment dans un ordre aléatoire. Pour simplifier le problème de vérification, n'écrivez que des valeurs de progression de curseur connues fixes au lieu de réelles. Cela rendra votre vie facile à identifier les commandes et les valeurs.

Veuillez publier le résultat. Si le problème persiste (il ne devrait pas :)), nous allons synchroniser les appels d'écriture DOS.