package com.example.metawear; import android.Manifest; import android.app.Activity; import android.content.*; import android.os.Bundle; import android.os.IBinder; import android.telephony.SmsManager; import android.util.Log; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.view.View; import android.widget.Button; import com.mbientlab.metawear.Data; import com.mbientlab.metawear.MetaWearBoard; import com.mbientlab.metawear.Subscriber; import com.mbientlab.metawear.android.BtleService; import com.mbientlab.metawear.UnsupportedModuleException; import com.mbientlab.metawear.builder.RouteBuilder; import com.mbientlab.metawear.builder.RouteComponent; import com.mbientlab.metawear.data.Acceleration; import com.mbientlab.metawear.data.EulerAngles; import com.mbientlab.metawear.module.AccelerometerBosch; import com.mbientlab.metawear.module.Led; import com.mbientlab.metawear.module.Accelerometer; import com.mbientlab.metawear.module.AccelerometerMma8452q; import com.mbientlab.metawear.module.AccelerometerMma8452q.Movement; import com.mbientlab.metawear.module.AccelerometerBosch.NoMotionDataProducer; import android.widget.Switch; import android.widget.CompoundButton; import androidx.core.app.ActivityCompat; import com.mbientlab.metawear.Route; import com.mbientlab.metawear.module.Logging; import com.mbientlab.metawear.data.CartesianAxis; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.InputStream; import android.os.Environment; import java.io.OutputStreamWriter; import java.util.Calendar; import bolts.Continuation; import bolts.Task; public class MainActivity extends Activity implements ServiceConnection { private BtleService.LocalBinder serviceBinder; private static final String TAG = "MetaWear"; private final String MW_MAC_ADDRESS= "EF:42:BE:CC:D9:6C"; private MetaWearBoard board; private Led ledModule; //Declare the ledModule private Button connect; private Button led_on; private Button led_off; private Switch accel_switch; private Logging acceleroLogging; private Accelerometer accelModule; private AccelerometerMma8452q accMma8452q; private AccelerometerBosch accBosch; private AccelerometerBosch.AnyMotionDataProducer anymotion; private Logging logging; private static final float ACC_RANGE = 8.f, ACC_FREQ = 50.f; private static final String STREAM_KEY = "accel_stream"; private static final int PERMISSION_SEND_SMS = 123; private FileOutputStream fos; private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; public void retrieveBoard() { final BluetoothManager btManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); final BluetoothDevice remoteDevice= btManager.getAdapter().getRemoteDevice(MW_MAC_ADDRESS); // Create a MetaWear board object for the Bluetooth Device board= serviceBinder.getMetaWearBoard(remoteDevice); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Bind the service when the activity is created getApplicationContext().bindService(new Intent(this, BtleService.class), this, Context.BIND_AUTO_CREATE); Log.i(TAG, "log test"); connect=(Button)findViewById(R.id.connect); connect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "Clicked connect"); board.connectAsync().continueWith(new Continuation() { @Override public Void then(Task task) throws Exception { if (task.isFaulted()) { Log.i("MainActivity", "Failed to connect"); } else { Log.i("MainActivity", "Connected"); ledModule = board.getModule(Led.class); // get LED module logging = board.getModule(Logging.class); //accMma8452q = board.getModule(AccelerometerMma8452q.class); accBosch = board.getModule(AccelerometerBosch.class); anymotion = accBosch.motion(AccelerometerBosch.AnyMotionDataProducer.class); ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); /* SmsManager smsManager = SmsManager.getDefault(); ArrayList msgArray = smsManager.divideMessage("Bluetooth Connected"); ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, PERMISSION_SEND_SMS); smsManager.sendMultipartTextMessage("+919865976905", null,msgArray, null, null);*/ } return null; } }); } }); led_on=(Button)findViewById(R.id.led_on); led_on.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "Turn on LED"); ledModule.editPattern(Led.Color.BLUE, Led.PatternPreset.BLINK) .repeatCount((byte) 10) .commit(); ledModule.play(); } }); led_off=(Button)findViewById(R.id.led_off); led_off.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "Turn off LED"); ledModule.stop(true);//Git test } }); Switch accel_switch = (Switch) findViewById(R.id.accel_switch); accel_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.i("Switch State=", "" + isChecked); if (isChecked) { //final String filename = "METAWEAR.csv"; //final File path = new File(Environment.getExternalStoragePublicDirectory( // Environment.DIRECTORY_DOWNLOADS), filename); anymotion.configure().threshold(0.5f).count(1).commit(); serializeBoard(); anymotion.addRouteAsync(new RouteBuilder() { @Override public void configure(RouteComponent source) { source.log(DATA_HANDLER); } }).continueWith(new Continuation() { @Override public Void then(Task task) throws Exception { // Pass the output stream to the first Subscriber (idx 0) // by seting its environment fos = openFileOutput("METAWEAR", MODE_PRIVATE); task.getResult().setEnvironment(0, fos); anymotion.start(); accBosch.start(); logging.start(true); return null; } }); } } }); Switch log_switch = (Switch) findViewById(R.id.log_switch); log_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.i("Log Switch State=", "" + isChecked); if (isChecked) { logging.stop(); DeserializeBoard(); // download log data and send 100 progress updates during the download logging.downloadAsync(new Logging.LogDownloadErrorHandler() { @Override public void receivedError(Logging.DownloadError errorType, byte logId, Calendar calendar, byte[] data) { //Log.i("MainActivity", "Progress Update = %s" + data[0] + data[1] + data[2] + data[3]); // android.util.Log.d(TAG, String.format("0 = %d. 1 = %d 2 = %d 3 = %d", data[0], data[1], data[2], data[3])); // String theDate = calendar.get(Calendar.SECOND) + " " + calendar.get(Calendar.MINUTE) + " " + calendar.get(Calendar.HOUR); //android.util.Log.i("MainActivity",theDate); //Log.d("MainActivity", "Current Timestamp: " + format); anymotion.stop(); accBosch.stop(); logging.clearEntries(); board.tearDown(); } }).continueWithTask(new Continuation>() { @Override public Task then(Task task) throws Exception { Log.i("MainActivity", "Download completed"); fos.close(); return null; } }); } } }); } @Override public void onDestroy() { super.onDestroy(); // Unbind the service when the activity is destroyed getApplicationContext().unbindService(this); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // Typecast the binder to the service's LocalBinder class serviceBinder = (BtleService.LocalBinder) service; retrieveBoard(); } @Override public void onServiceDisconnected(ComponentName componentName) { } public void serializeBoard() { try { File serializeFile = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), board.getMacAddress()); serializeFile.createNewFile(); OutputStream writer = new FileOutputStream(serializeFile, false); board.serialize(writer); writer.close(); Log.i(TAG,"serialized:" + board.getMacAddress()); } catch(IOException e) { Log.i(TAG,"Write failed for :" + board.getMacAddress() + " " + e.toString()); } } public void DeserializeBoard() { try { File serializeFile = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), board.getMacAddress()); if (serializeFile.exists()) { InputStream reader = new FileInputStream(serializeFile); board.deserialize(reader); reader.close(); if (!serializeFile.delete()) Log.i(TAG, "deserializeBoard: Failed to delete serializedFile..."); Log.i(TAG, "Deserialized: " + board.getMacAddress()); } } catch(IOException | ClassNotFoundException e) { Log.i(TAG,"Write failed for :" + board.getMacAddress() + " " + e.toString()); } } private static Subscriber DATA_HANDLER = new Subscriber() { @Override public void apply(Data data, Object... env) { try { FileOutputStream fos = (FileOutputStream) env[0]; String theDate = data.timestamp().get(Calendar.HOUR_OF_DAY) + ":" + data.timestamp().get(Calendar.MINUTE) + ":" + data.timestamp().get(Calendar.SECOND); //CSV CODE String csv_accel_entry = theDate + ","; fos.write(csv_accel_entry.getBytes()); fos.write("\n".getBytes()); android.util.Log.i("MainActivity",theDate); //fos.close(); } catch (Exception ex) { Log.e("MainActivity", "Error writing to file", ex); } } }; }