Étape 7: L’application Android
Pour l’étape suivante, je vais supposer que vous êtes à l’aise avec l’écriture d’une application Android. Si ce n’est pas le cas, s’il vous plaît revenir sur les liens de l’étape 2. Le code source est ci-dessous.NOTES :
* Être sûr changer la valeur de DEVICE_ADDRESS. Cela peut être consultée sur l’autocollant sur votre BlueSMiRF. Il se retrouve tout en fixant le taux de baud à l’étape 4 (#9). C’est la chaîne de lettres et de chiffres après « BTA », qui est une valeur supérieure à « BAUDRT ».
* Être sûr de modifier le package nom (première ligne de MyRemote.java) pour correspondre à la structure de répertoire de votre projet
MyRemote.java
package edu.mit.media.amarino.myremote ;
Import android.app.Activity ;
Import android.os.Bundle ;
Import android.text.Editable ;
Import android.text.TextWatcher ;
Import android.view.MotionEvent ;
Import android.view.View ;
Import android.widget.Button ;
Import android.widget.EditText ;
Import at.abraxas.amarino.Amarino ;
public class MyRemote s’étend l’activité {}
public TextView résultat ;
public int a, b ;
public EditText inputField ;
/ * changer l’adresse à l’adresse de votre module Bluetooth
* et s’assurer que votre périphérique est ajouté au Amarino * /
private static final String DEVICE_ADDRESS = "00:06:66:07:AD:FE" ;
final int DELAY = 150 ;
/ ** Appelée lorsque l’activité est d’abord créée. */
{} public void onCreate (Bundle savedInstanceState)
super.onCreate(savedInstanceState) ;
setContentView(R.layout.main) ;
Amarino.Connect (this, DEVICE_ADDRESS) ;
dernière touche lClick = findViewById(R.id.leftClick) (bouton) ;
lClick.setOnClickListener (new View.OnClickListener() {}
{} public void onClick (View v)
Exécuter l’action lors du clic sur
onLeftClick() ;
}
});
dernière touche rClick = findViewById(R.id.rightClick) (bouton) ;
rClick.setOnClickListener (new View.OnClickListener() {}
{} public void onClick (View v)
Exécuter l’action lors du clic sur
onRightClick() ;
}
});
Touche final positif = findViewById(R.id.plusBtn) (bouton) ;
plus.setOnClickListener (new View.OnClickListener() {}
{} public void onClick (View v)
Exécuter l’action lors du clic sur
onPlus() ;
}
});
Touche finale moins findViewById(R.id.minusBtn) = (Button) ;
minus.setOnClickListener (new View.OnClickListener() {}
{} public void onClick (View v)
Exécuter l’action lors du clic sur
onMinus() ;
}
});
inputField = (EditText)findViewById(R.id.input) ;
TextWatcher fieldValidatorTextWatcher = new TextWatcher() {}
' public void beforeTextChanged (int début, int count, CharSequence s, int après) {}
}
{} public onTextChanged Sub (CharSequence s, int start, int, int compteur antérieur)
Dim str As String = inputField.getText().toString() ;
int len = str.length() ;
char c ;
backspaced
Si (len < = start) {}
onDelete() ;
}
Swyped
ElseIf (len > (start + 1)) {}
Temp de chaîne = "" ;
pour (int i = start ; j’ai < len; i ++) {}
c = str.charAt(i) ;
Temp += Character.toString(c) ;
}
onSend(temp) ;
}
tapé normalement
else {}
c = str.charAt(len-1) ;
Str = Character.toString(c) ;
onSend(str) ;
}
}
{} public void afterTextChanged (modifiable arg0)
}
};
inputField.addTextChangedListener(fieldValidatorTextWatcher) ;
}
Protected Sub onStart() {}
super.onStart() ;
}
Protected Sub onStop() {}
super.onStop() ;
arrêter le service de Amarino en arrière-plan, nous n’avez pas besoin plus
Amarino.Disconnect (this, DEVICE_ADDRESS) ;
}
public boolean onTouchEvent (MotionEvent event) {}
int x = (int)event.getX() ;
int y = (int)event.getY() ;
int diffX ;
diffY int ;
isUp booléenne, isDown, isLeft, isRight ;
commutateur (event.getAction()) {}
affaire MotionEvent.ACTION_DOWN :
a = x ;
b = y ;
rupture ;
affaire MotionEvent.ACTION_MOVE :
déterminer la gauche ou vers la droite
if(a > x) {}
isLeft = true ;
isRight = false ;
} else {}
isRight = true ;
isLeft = false ;
}
déterminer vers le haut ou vers le bas
if(b > y) {}
isUp = true ;
isDown = false ;
} else {}
isDown = true ;
isUp = false ;
}
calculer la différence
diffX = a - x ;
Si diffX (diffX < 0) * = -1 ;
diffY = b - y ;
Si diffY (diffY < 0) * = -1 ;
déterminer la plus grande différence
Si (isLeft & & isUp) {}
if(diffX > diffY) onLeft() ;
d’autre onUp() ;
}
ElseIf (isLeft & & isDown) {}
if(diffX > diffY) onLeft() ;
d’autre onDown() ;
}
ElseIf (isRight & & isDown) {}
if(diffX > diffY) onRight() ;
d’autre onDown() ;
}
ElseIf (isRight & & isUp) {}
if(diffX > diffY) onRight() ;
d’autre onUp() ;
}
rupture ;
affaire MotionEvent.ACTION_UP :
rupture ;
}
retourne la valeur false ;
}
private void onUp() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « U ») ;
}
private void onLeft() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « L ») ;
}
private void onRight() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « R ») ;
}
private void onDown() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « D ») ;
}
private void onLeftClick() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « Z ») ;
}
private void onRightClick() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « X ») ;
}
private void onPlus() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « P ») ;
}
private void onMinus() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « M ») ;
}
{} private void onSend (String str)
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ^', str) ;
}
private void onDelete() {}
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ''', « B ») ;
}
}
===============================
main.Xml
<? xml version = « 1,0 » encoding = « utf-8 »? >
< xmlns:android LinearLayout = "http://schemas.android.com/apk/res/android" android : orientation = "vertical"
Android : layout_width = « fill_parent » android : layout_height = « fill_parent » >
< LinearLayout android : layout_width = « 400px » android : layout_height = « 100px » android : layout_gravity = « center_horizontal »
Android : layout_marginTop = « 20px » >
< bouton android : id = "
Android : text = "android : textSize ="32px"
Android : layout_width = « 200px » android : layout_height = « 100px » >< / bouton >
< bouton android : id = "
Android : text = "android : textSize ="32px"
Android : layout_width = « 200px » android : layout_height = « 100px » >< / bouton >
< / LinearLayout >
< LinearLayout android : layout_width = « 200px » android : layout_height = « 100px » android : layout_gravity = « center_horizontal »
Android : layout_marginTop = « 20px » >
< bouton android : id = "
Android : text = "android : textSize ="48px"
Android : layout_width = « 100px » android : layout_height = « 100px » >< / bouton >
< bouton android : id = "
Android : text = "android : textSize ="48px"
Android : layout_width = « 100px » android : layout_height = « 100px » >< / bouton >
< / LinearLayout >
< LinearLayout android : layout_width = « 450px » android : layout_height = « 100px » android : layout_gravity = « center_horizontal »
Android : layout_marginTop = « 20px » >
< EditText android : id = "android : textSize ="32px"
Android : layout_width = « fill_parent » android : layout_height = « 100px » / >
< / LinearLayout >
< / LinearLayout >
===============================
Strings.Xml
<? xml version = « 1,0 » encoding = « utf-8 »? >
< resources >
< string nom = « app_name » > MyRemote < / string >
< string nom = « clickLeft » > clic gauche < / string >
< string nom = « bouton » > clic droit < / string >
< string nom = « plus » > + < / string >
< string nom = « moins » >, < / string >
< string nom = « Envoyer » > Envoyer < / string >
< / ressources >
===============================
Je voudrais dire un mot sur les plusieurs fonctions au bas de la « MyRemote.java ». Ils appellent la même méthode avec des paramètres similaires :
Amarino.sendDataToArduino (ce, DEVICE_ADDRESS, ' ~', « Z ») ;
Cette méthode effectue la commucation réelle avec le BlueSMiRF câblé à l’Arduino. Il sait quel dispositif pour l’envoyer à la variable DEVICE_ADDRESS, qui est l’identificateur unique pour le BlueSMiRF. Assez simple. Mais la prochaine aux paramètres peut-être besoin d’un peu plus d’explications, le ~ et Z. Le 3ème paramètre (~) indique à l’esquisse de traitement, dont nous allons écrire à l’étape suivante, quel mode nous sommes en :
~ = mouvement de la souris, clic de souris et la sensibilité de la souris
^ = entrée au clavier
' = ret.
J’ai choisi délibérément ces caractères aléatoires pour quelques raisons. Surtout, j’ai eu besoin de quelques caractères réservés pour désigner le « mode » donc j’ai choisi ces personnages que j’utiliserais jamais pendant l’exécution de ce projet. Cela peut paraître déroutant, mais j’espère que cela va s’éclaircir il : le quatrième paramètre (« Z » dans l’extrait ci-dessus) peut faire une chose si l’envoyer avec une ~ ou il peut faire tout autre chose, si je l’envoie avec un ^. Il croît de façon exponentielle les possibilités.
Notez l’utilisation de ces personnages sur la prochaine étape, notre schéma de traitement.