Paso 7: La aplicación para Android
Para el siguiente paso, voy a asumir que usted está cómodo con la escritura una aplicación Android. Si no, por favor revisar los links del paso 2. El código fuente está a continuación.NOTAS:
* Estar seguro de cambiar el valor de DEVICE_ADDRESS. Esto puede encontrarse en la etiqueta su BlueSMiRF. También se puede encontrar mientras se ajusta la velocidad en baudios en el paso 4 (#9). Es la cadena de letras y números después de "BTA", que es un valor por encima de "BAUDRT".
* Estar seguro que el paquete de cambio nombre (primera línea de MyRemote.java) para que coincida con la estructura de directorios del proyecto
MyRemote.java
paquete 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;
importación android.view.View;
Import android.widget.Button;
Import android.widget.EditText;
Import at.abraxas.amarino.Amarino;
pública clase MyRemote amplía actividad {}
resultado de TextView público;
público int a, b;
público EditText inputField;
/ * cambiar la dirección a la dirección del módulo Bluetooth
* y el dispositivo se añade al Amarino * /
privado static final String DEVICE_ADDRESS = "00:06:66:07:AD:FE";
final int retardo = 150;
/ ** Cuando crea por primera vez la actividad. */
público void onCreate (Bundle savedInstanceState) {}
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Amarino.Connect (, DEVICE_ADDRESS);
último botón lClick = findViewById(R.id.leftClick) (botón);
lClick.setOnClickListener (new View.OnClickListener() {
público void onClick (View v) {}
Realizar la acción al hacer clic
onLeftClick();
}
});
último botón rClick = findViewById(R.id.rightClick) (botón);
rClick.setOnClickListener (new View.OnClickListener() {
público void onClick (View v) {}
Realizar la acción al hacer clic
onRightClick();
}
});
Botón final plus = findViewById(R.id.plusBtn) (botón);
plus.setOnClickListener (new View.OnClickListener() {
público void onClick (View v) {}
Realizar la acción al hacer clic
onPlus();
}
});
Botón final menos findViewById(R.id.minusBtn) = (botón);
minus.setOnClickListener (new View.OnClickListener() {
público void onClick (View v) {}
Realizar la acción al hacer clic
onMinus();
}
});
inputField = (EditText)findViewById(R.id.input);
TextWatcher fieldValidatorTextWatcher = new TextWatcher() {}
{público vacío beforeTextChanged (CharSequence s, int comienzo, int count, int después)
}
público vacío onTextChanged (CharSequence s, int comienzo, int antes, int count) {}
String str = inputField.getText().toString();
int len = str.length();
char c;
backspaced
Si (len < = Inicio) {}
onDelete();
}
Swyped
else if (len > (Inicio + 1)) {}
Temp de cadena = "";
para (int i = Inicio; i < len; i ++) {}
c = str.charAt(i);
Temp += Character.toString(c);
}
onSend(temp);
}
escribe normalmente
Else {}
c = str.charAt(len-1);
Str = Character.toString(c);
onSend(str);
}
}
público vacío afterTextChanged (Editable arg0) {}
}
};
inputField.addTextChangedListener(fieldValidatorTextWatcher);
}
protegido {} void onStart()
super.onStart();
}
protegido {} void onStop()
super.onStop();
Detener servicio de fondo de Amarino, que no necesitamos más
Amarino.disconnect (, DEVICE_ADDRESS);
}
público boolean onTouchEvent (MotionEvent event) {}
int x = (int)event.getX();
int y = (int)event.getY();
int diffX;
diffY int;
isUp booleano, isDown, isLeft isRight;
interruptor (event.getAction()) {}
caso MotionEvent.ACTION_DOWN:
un = x;
b = y;
rotura;
caso MotionEvent.ACTION_MOVE:
determinar izquierda o derecha
if(a > x) {}
isLeft = true;
isRight = false;
} else {}
isRight = true;
isLeft = false;
}
determinar hacia arriba o hacia abajo
if(b > y) {}
isUp = true;
isDown = false;
} else {}
isDown = true;
isUp = false;
}
calcular la diferencia
diffX = a - x;
Si diffX (diffX < 0) * = -1;
diffY = b - y;
Si diffY (diffY < 0) * = -1;
determinar la diferencia más grande
Si (isLeft & & isUp) {}
if(diffX > diffY) onLeft();
onUp() otra cosa;
}
else if (isLeft & & isDown) {}
if(diffX > diffY) onLeft();
onDown() otra cosa;
}
else if (isRight & & isDown) {}
if(diffX > diffY) onRight();
onDown() otra cosa;
}
else if (isRight & & isUp) {}
if(diffX > diffY) onRight();
onUp() otra cosa;
}
rotura;
caso MotionEvent.ACTION_UP:
rotura;
}
devuelven el valor false;
}
privado void onUp() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "U");
}
privado void onLeft() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "L");
}
privado void onRight() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "R");
}
privado void onDown() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "D");
}
privado void onLeftClick() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "Z");
}
privado void onRightClick() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "X");
}
privado void onPlus() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "P");
}
privado void onMinus() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "M");
}
{} privado void onSend (String str)
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ^', str);
}
privado void onDelete() {}
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ''', 'B');
}
}
===============================
Main.XML
<? xml version = "1,0" encoding = "utf-8"? >
< xmlns:android LinearLayout = "http://schemas.android.com/apk/res/android" android: orientación = "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" >
< botón android: id = "
Android: texto = "android: textSize ="32px"
Android: layout_width = "200px" android: layout_height = "100px" >< / botón >
< botón android: id = "
Android: texto = "android: textSize ="32px"
Android: layout_width = "200px" android: layout_height = "100px" >< / botón >
< / LinearLayout >
< LinearLayout android: layout_width = "200px" android: layout_height = "100px" android: layout_gravity = "center_horizontal"
Android: layout_marginTop = "20px" >
< botón android: id = "
Android: texto = "android: textSize ="48px"
Android: layout_width = "100px" android: layout_height = "100px" >< / botón >
< botón android: id = "
Android: texto = "android: textSize ="48px"
Android: layout_width = "100px" android: layout_height = "100px" >< / botón >
< / 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"? >
< recursos >
< nombre de cadena = "app_name" > MyRemote < / cuerdas >
< nombre de cadena = "clickLeft" > a la izquierda, haga clic en < / cuerdas >
< nombre de cadena = "botón" > Click derecho < / cuerdas >
< nombre de cadena = "más" > + < / cuerdas >
< nombre de cadena = "menos" >, < / cuerdas >
< nombre de cadena = 'Enviar' > / enviar < cadena >
< / recursos >
===============================
Me gustaría decir unas palabras acerca de las varias funciones en la parte inferior de "MyRemote.java". Llaman el mismo método con parámetros similares:
Amarino.sendDataToArduino (esto, DEVICE_ADDRESS, ' ~', "Z");
Este método realiza el comunicación real en el campo con el BlueSMiRF conectado al Arduino. Sabe qué dispositivo para enviarlo a la variable DEVICE_ADDRESS, que es el identificador único para el BlueSMiRF. Bastante directo. Pero al lado de parámetros puede necesitar un poco más de explicación, la ~ y la Z. El parámetro 3 (~) indica el bosquejo de procesamiento, que voy a escribir en el siguiente paso, qué modo estamos en:
~ = movimiento del ratón, clic de ratón y ratón sensibilidad
^ = entrada de teclado
' = retroceso
Elegí los personajes aleatorios útil para un par de razones. Sobre todo, necesitaba algunos caracteres reservados para denotar el "modo" por lo que opté por esos personajes que nunca utilizaría durante la ejecución de este proyecto. Esto puede parecer confuso, pero esperemos que esto resuelve lo: el cuarto parámetro ("Z" en el fragmento anterior) puede hacer una cosa si enviarlo con un ~ o puede hacer algo completamente diferente si lo envíe con un ^. Esto crece exponencialmente las posibilidades.
Observe el uso de estos caracteres en el siguiente paso, nuestro bosquejo de procesamiento.