Updated Android application, modified Arduino Sketch to stop in case of
loss of signal.
BIN
AndroidExplorerbotServer/bin/AndroidExplorerbotServer.apk
Normal file
BIN
AndroidExplorerbotServer/bin/classes.dex
Normal file
After Width: | Height: | Size: 378 B |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 291 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 453 B |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 614 B |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 8.5 KiB |
BIN
AndroidExplorerbotServer/bin/resources.ap_
Normal file
After Width: | Height: | Size: 324 B |
After Width: | Height: | Size: 237 B |
After Width: | Height: | Size: 437 B |
After Width: | Height: | Size: 655 B |
@ -22,4 +22,31 @@
|
||||
android:text="@string/srv"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/text"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_margin="10dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="@string/explain" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/killserverbutton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/textView1"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:text="@string/killserver" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/startvideo"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_margin="10dp"
|
||||
android:src="@drawable/ic_device_access_video" />
|
||||
|
||||
</RelativeLayout>
|
@ -3,5 +3,7 @@
|
||||
|
||||
<string name="app_name">AndroidExplorerbotServer</string>
|
||||
<string name="srv">Server started</string>
|
||||
<string name="explain">Exiting with HOME key will keep the server running. To exit completly press BACK or use the button below.</string>
|
||||
<string name="killserver">Kill server</string>
|
||||
|
||||
</resources>
|
||||
|
@ -21,4 +21,5 @@ package it.danieleverducci.explorerbotserver;
|
||||
public class AppConfiguration {
|
||||
public static final int PORT=6787; //The default server port
|
||||
public static final boolean LOG_ENABLED=false;
|
||||
public static final String DEFAULT_IPCAMERA_APP_PACKAGENAME="com.pas.webcam";
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with AndroidExplorerbotServer. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
*/
|
||||
|
||||
package it.danieleverducci.explorerbotserver;
|
||||
|
||||
@ -23,10 +23,15 @@ import it.danieleverducci.explorerbot.objects.GamepadPosition;
|
||||
import java.io.IOException;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
|
||||
public class MainActivity extends Activity implements OnControllerPolledListener {
|
||||
public class MainActivity extends Activity implements OnControllerPolledListener, OnClickListener {
|
||||
private SerialCommunication serial;
|
||||
private ServerNetworkCommunicationThread sct;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@ -37,10 +42,13 @@ public class MainActivity extends Activity implements OnControllerPolledListener
|
||||
serial = new SerialCommunication(this);
|
||||
|
||||
//Start network communication server
|
||||
ServerNetworkCommunicationThread sct = new ServerNetworkCommunicationThread();
|
||||
sct = new ServerNetworkCommunicationThread();
|
||||
sct.setOnControllerPolledListener(this);
|
||||
sct.start();
|
||||
|
||||
//Register interface buttons listener
|
||||
findViewById(R.id.killserverbutton).setOnClickListener(this);
|
||||
findViewById(R.id.startvideo).setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -56,6 +64,11 @@ public class MainActivity extends Activity implements OnControllerPolledListener
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
//Terminate network thread
|
||||
if(sct!=null && sct.isAlive()){
|
||||
sct.setMustExit(true);
|
||||
}
|
||||
//Terminate serial connection to Arduino
|
||||
if(serial!=null){
|
||||
try {
|
||||
serial.closeConnection();
|
||||
@ -66,4 +79,25 @@ public class MainActivity extends Activity implements OnControllerPolledListener
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switch(v.getId()){
|
||||
case R.id.killserverbutton:
|
||||
finish(); //Finishing the activity, onDestroy will be called
|
||||
break;
|
||||
case R.id.startvideo:
|
||||
launchStreamingApp();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the app is installed, start it. Otherwise, open the Android Market for download
|
||||
*/
|
||||
private void launchStreamingApp() {
|
||||
Intent launchIntent = getPackageManager().getLaunchIntentForPackage(AppConfiguration.DEFAULT_IPCAMERA_APP_PACKAGENAME);
|
||||
if(launchIntent==null) launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + AppConfiguration.DEFAULT_IPCAMERA_APP_PACKAGENAME));
|
||||
startActivity( launchIntent );
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ const int hBridge2pin = 10;
|
||||
#include <Servo.h>
|
||||
Servo steeringServo;
|
||||
byte gamepadPosition[2];
|
||||
byte missedUpdates=0;
|
||||
|
||||
void setup(){
|
||||
steeringServo.attach(servoPin); //steering servo to pin 7
|
||||
@ -48,8 +49,16 @@ void setup(){
|
||||
|
||||
void loop(){
|
||||
if(readGamepadPositionFromSerial()){
|
||||
missedUpdates=0;
|
||||
//If data ready, drive motors
|
||||
steerTo(gamepadPosition[0]);
|
||||
accelerateTo(gamepadPosition[1]);
|
||||
} else {
|
||||
//If data not ready for 5 times (500ms), stop the robot (for security reasons, e.g. the connection may be dropped)
|
||||
missedUpdates++;
|
||||
if(missedUpdates>5){
|
||||
accelerateTo(63);
|
||||
}
|
||||
}
|
||||
delay(100);
|
||||
}
|
||||
@ -80,6 +89,6 @@ void accelerateTo(byte speedByte){
|
||||
//speedByte = speedByte-64;
|
||||
}
|
||||
//analogWrite(hBridgeEnable, speedByte*2);
|
||||
if(speedByte<32 || speedByte>96) digitalWrite(hBridgeEnable, HIGH);
|
||||
if(speedByte<47 || speedByte>79) digitalWrite(hBridgeEnable, HIGH);
|
||||
else digitalWrite(hBridgeEnable, LOW);
|
||||
}
|