summaryrefslogtreecommitdiff
path: root/electicAndroid/src/com/futureproof/adaptics/electic/Electic.java
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2011-12-19 18:20:33 +0000
committerTim Redfern <tim@eclectronics.org>2011-12-19 18:20:33 +0000
commite9a73bbb3c14af340999f70146747787785f4fee (patch)
treea125452f7d641673286542497da051b810427880 /electicAndroid/src/com/futureproof/adaptics/electic/Electic.java
initial commit
Diffstat (limited to 'electicAndroid/src/com/futureproof/adaptics/electic/Electic.java')
-rw-r--r--electicAndroid/src/com/futureproof/adaptics/electic/Electic.java393
1 files changed, 393 insertions, 0 deletions
diff --git a/electicAndroid/src/com/futureproof/adaptics/electic/Electic.java b/electicAndroid/src/com/futureproof/adaptics/electic/Electic.java
new file mode 100644
index 0000000..7de9104
--- /dev/null
+++ b/electicAndroid/src/com/futureproof/adaptics/electic/Electic.java
@@ -0,0 +1,393 @@
+/*
+ * Tim Redfern 2011
+ *
+ *
+ * number view display
+ * decision: decipher in mcu?
+ * ie - need to range quickly based on this?
+ * decide protocol for setting commands
+ * make a couple of buttons and use these to change
+ */
+
+package com.futureproof.adaptics.electic;
+
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.Menu;
+import android.view.Window;
+import android.widget.CheckBox;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This is the main Activity that displays the current chat session.
+ */
+public class Electic extends Activity {
+ // Debugging
+ private static final String TAG = "Electic";
+ private static final boolean D = true;
+
+ // Message types sent from the BluetoothChatService Handler
+ public static final int MESSAGE_STATE_CHANGE = 1;
+ public static final int MESSAGE_READ = 2;
+ public static final int MESSAGE_WRITE = 3;
+ public static final int MESSAGE_DEVICE_NAME = 4;
+ public static final int MESSAGE_TOAST = 5;
+
+ // Key names received from the BluetoothChatService Handler
+ public static final String DEVICE_NAME = "device_name";
+ public static final String TOAST = "toast";
+
+ // Intent request codes
+ private static final int REQUEST_CONNECT_DEVICE = 1;
+ private static final int REQUEST_ENABLE_BT = 2;
+
+ // Layout Views
+ private TextView mTitle;
+
+ // Name of the connected device
+ private String mConnectedDeviceName = null;
+ // Local Bluetooth adapter
+ private BluetoothAdapter mBluetoothAdapter = null;
+ // Member object for the chat services
+ private AdapticsBluetooth adapBT = null;
+
+ //electic UI elements
+ TextView sadcReadout;
+ TextView fadcReadout;
+
+ TextView sadcReadout1;
+ TextView fadcReadout1;
+
+ CheckBox PMINbox;
+ CheckBox PMAXbox;
+ CheckBox alarmBox;
+ RadioGroup sampleSpeedGroup;
+
+ int SAMPLESPEED2 = R.id.rb_2;
+ int SAMPLESPEED05 = R.id.rb_05;
+ int SAMPLESPEED01 = R.id.rb_01;
+
+ int sampleSpeed = SAMPLESPEED2;
+
+ short ASIGNbit = (short) Integer.parseInt("10000000", 2);
+ short BSIGNbit = (short) Integer.parseInt("1000000", 2);
+ short PMAXbit = (short) Integer.parseInt("100000", 2);
+ short PMINbit = (short) Integer.parseInt("10000", 2);
+ short ALARMbit = (short) Integer.parseInt("1", 2);
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if(D) Log.e(TAG, "+++ ON CREATE +++");
+
+ // Set up the window layout
+ requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
+ setContentView(R.layout.main);
+ getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
+
+ // Set up the custom title
+ mTitle = (TextView) findViewById(R.id.title_left_text);
+ mTitle.setText(R.string.app_name);
+ mTitle = (TextView) findViewById(R.id.title_right_text);
+
+ // Get local Bluetooth adapter
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+
+ // If the adapter is null, then Bluetooth is not supported
+ if (mBluetoothAdapter == null) {
+ Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if(D) Log.e(TAG, "++ ON START ++");
+
+ // If BT is not on, request that it be enabled.
+ // setupChat() will then be called during onActivityResult
+ if (!mBluetoothAdapter.isEnabled()) {
+ Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+ startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
+ // Otherwise, setup the chat session
+ } else {
+ if (adapBT == null) setupUI();
+ }
+ }
+
+ @Override
+ public synchronized void onResume() {
+ super.onResume();
+ if(D) Log.e(TAG, "+ ON RESUME +");
+
+ // Performing this check in onResume() covers the case in which BT was
+ // not enabled during onStart(), so we were paused to enable it...
+ // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
+ if (adapBT != null) {
+ // Only if the state is STATE_NONE, do we know that we haven't started already
+ if (adapBT.getState() == AdapticsBluetooth.STATE_NONE) {
+ // Start the Bluetooth chat services
+ adapBT.start();
+ }
+ }
+ }
+
+ private void setupUI() {
+ Log.d(TAG, "setupUI()");
+
+ //initialise electic UI elements
+ sadcReadout=(TextView) findViewById(R.id.sadcText);
+ fadcReadout=(TextView) findViewById(R.id.fadcText);
+
+ sadcReadout1=(TextView) findViewById(R.id.sadcText1);
+ fadcReadout1=(TextView) findViewById(R.id.fadcText1);
+
+ PMAXbox=(CheckBox) findViewById(R.id.pmaxBox);
+ PMINbox=(CheckBox) findViewById(R.id.pminBox);
+ alarmBox=(CheckBox) findViewById(R.id.alarmBox);
+
+ sampleSpeedGroup = (RadioGroup) findViewById(R.id.samplespeed_group);
+ sampleSpeedGroup.check(sampleSpeed);
+
+ sadcReadout.setText("0".toCharArray(), 0, 1);
+ fadcReadout.setText("0".toCharArray(), 0, 1);
+
+ sadcReadout1.setText("0".toCharArray(), 0, 1);
+ fadcReadout1.setText("0".toCharArray(), 0, 1);
+ PMAXbox.setChecked(false);
+ PMINbox.setChecked(false);
+ alarmBox.setChecked(false);
+
+ sampleSpeedGroup.setOnCheckedChangeListener(
+ new RadioGroup.OnCheckedChangeListener() {
+ public void onCheckedChanged(RadioGroup group,
+ int checkedId) {
+ setSampleSpeed(checkedId==SAMPLESPEED2?1:checkedId==SAMPLESPEED05?2:3);
+ }
+ });
+
+ // Initialize the service to perform bluetooth connections
+ adapBT = new AdapticsBluetooth(this, mHandler);
+
+
+ }
+
+ @Override
+ public synchronized void onPause() {
+ super.onPause();
+ if(D) Log.e(TAG, "- ON PAUSE -");
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if(D) Log.e(TAG, "-- ON STOP --");
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ // Stop the Bluetooth chat services
+ if (adapBT != null) adapBT.stop();
+ if(D) Log.e(TAG, "--- ON DESTROY ---");
+ }
+/*
+ private void ensureDiscoverable() {
+ if(D) Log.d(TAG, "ensure discoverable");
+ if (mBluetoothAdapter.getScanMode() !=
+ BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
+ Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+ discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
+ startActivity(discoverableIntent);
+ }
+ }
+ */
+
+
+
+
+ // The Handler that gets information back from the BluetoothChatService
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_STATE_CHANGE:
+ if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
+ switch (msg.arg1) {
+ case AdapticsBluetooth.STATE_CONNECTED:
+ mTitle.setText(R.string.title_connected_to);
+ mTitle.append(mConnectedDeviceName);
+ break;
+ case AdapticsBluetooth.STATE_CONNECTING:
+ mTitle.setText(R.string.title_connecting);
+ break;
+ // case AdapticsBluetooth.STATE_LISTEN:
+ case AdapticsBluetooth.STATE_NONE:
+ mTitle.setText(R.string.title_not_connected);
+ break;
+ }
+ break;
+ case MESSAGE_READ:
+ byte[] readBuf = (byte[]) msg.obj;
+ // construct a string from the valid bytes in the buffer
+ /*
+ * figure out how to decode data
+ * data has been checked at this point - message constructed
+ *
+ */
+ long sadc = (ubyte64(readBuf[4]))+(ubyte64(readBuf[3])<<8)+(ubyte64(readBuf[2])<<16)+(ubyte64(readBuf[1])<<24);
+ int fadc = ubyte32(readBuf[6])+(ubyte32(readBuf[5])<<8);
+
+ //reverse byte order
+ long sadc1=0;
+ for (int i=0;i<18;i++){
+ sadc1+=((sadc&(((long)0x01)<<i))>>i)<<(17-i);
+ }
+ int fadc1=0;
+ for (int i=0;i<10;i++){
+ fadc1+=((fadc&(((long)0x01)<<i))>>i)<<(9-i);
+ }
+
+ if (((short)readBuf[0]&ASIGNbit)>0) {
+ sadc*=-1;
+ sadc1*=-1;
+ }
+ if (((short)readBuf[0]&BSIGNbit)>0) {
+ fadc*=-1;
+ fadc1*=-1;
+ }
+ short status=(short)readBuf[0];
+
+ String sadcS=Float.toString(((float)sadc)/6000.0f);
+ String fadcS=Float.toString(((float)fadc)/600.0f);
+
+ String sadc1S=Float.toString(((float)sadc1)/6000.0f);
+ String fadc1S=Float.toString(((float)fadc1)/600.0f);
+
+ sadcReadout.setText(sadcS.toCharArray(), 0, sadcS.length());
+ fadcReadout.setText(fadcS.toCharArray(), 0, fadcS.length());
+
+ sadcReadout1.setText(sadc1S.toCharArray(), 0, sadc1S.length());
+ fadcReadout1.setText(fadc1S.toCharArray(), 0, fadc1S.length());
+
+ PMAXbox.setChecked(((short)readBuf[0]&PMAXbit)>0);
+ PMINbox.setChecked(((short)readBuf[0]&PMINbit)>0);
+ alarmBox.setChecked(((short)readBuf[0]&ALARMbit)>0);
+ Log.i(TAG, "++++RECEIVED: "+readBuf[0]+" "+readBuf[1]+" "+readBuf[2]+" "+readBuf[3]+" "+readBuf[4]+" "+readBuf[5]+" "+readBuf[6]+" AS: "+status+" "+sadc+" "+fadc);
+ //String readMessage = new String(readBuf, 0, msg.arg1);
+ break;
+ case MESSAGE_DEVICE_NAME:
+ // save the connected device's name
+ mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);
+ Toast.makeText(getApplicationContext(), "Connected to "
+ + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
+ break;
+ case MESSAGE_TOAST:
+ Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST),
+ Toast.LENGTH_SHORT).show();
+ break;
+ }
+ }
+ };
+
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if(D) Log.d(TAG, "onActivityResult " + resultCode);
+ switch (requestCode) {
+ case REQUEST_CONNECT_DEVICE:
+ // When DeviceListActivity returns with a device to connect
+ if (resultCode == Activity.RESULT_OK) {
+ connectDevice(data);
+ }
+ break;
+ case REQUEST_ENABLE_BT:
+ // When the request to enable Bluetooth returns
+ if (resultCode == Activity.RESULT_OK) {
+ // Bluetooth is now enabled, so set up a chat session
+ setupUI();
+ } else {
+ // User did not enable Bluetooth or an error occured
+ Log.d(TAG, "BT not enabled");
+ Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();
+ finish();
+ }
+ }
+ }
+
+ private void connectDevice(Intent data) {
+ // Get the device MAC address
+ String address = data.getExtras()
+ .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
+ // Get the BLuetoothDevice object
+ BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
+ // Attempt to connect to the device
+ adapBT.connect(device);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ /*
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.option_menu, menu);
+ return true;
+ */
+ Intent serverIntent = new Intent(this, DeviceListActivity.class);
+ startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);
+ return true;
+ }
+/*
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ Intent serverIntent = null;
+ switch (item.getItemId()) {
+ case R.id.connect_scan:
+ // Launch the DeviceListActivity to see devices and do scan
+ serverIntent = new Intent(this, DeviceListActivity.class);
+ startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);
+ return true;
+ case R.id.insecure_connect_scan:
+ // Launch the DeviceListActivity to see devices and do scan
+ serverIntent = new Intent(this, DeviceListActivity.class);
+ startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);
+ return true;
+ case R.id.discoverable:
+ // Ensure this device is discoverable by others
+ ensureDiscoverable();
+ return true;
+ }
+ return false;
+ }
+ */
+ private void setSampleSpeed(int speedCode) {
+ // Check that we're actually connected before trying anything
+ if (adapBT.getState() != AdapticsBluetooth.STATE_CONNECTED) {
+ Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
+ return;
+ }
+ byte[] message=new byte[1];
+ message[0]=(byte) speedCode;
+ adapBT.write(message);
+
+ }
+ private int ubyte32(byte b){
+ int i=(int) b;
+ if (i<0) i+=128;
+ return i;
+ }
+ private long ubyte64(byte b){
+ long l=(long) b;
+ if (l<0) l+=128;
+ return l;
+ }
+
+}