mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2026-01-22 08:04:22 +01:00
Adding units settings to CSC, RSC, HTM.
This commit is contained in:
@@ -50,6 +50,7 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class FeaturesActivity extends ActionBarActivity {
|
||||
private static final String MCP_CATEGORY = "no.nordicsemi.android.nrftoolbox.LAUNCHER";
|
||||
private static final String UTILS_CATEGORY = "no.nordicsemi.android.nrftoolbox.UTILS";
|
||||
private static final String MCP_PACKAGE = "no.nordicsemi.android.mcp";
|
||||
private static final String MCP_CLASS = MCP_PACKAGE + ".DeviceListActivity";
|
||||
@@ -127,6 +128,7 @@ public class FeaturesActivity extends ActionBarActivity {
|
||||
|
||||
// look for Master Control Panel
|
||||
final Intent mcpIntent = new Intent(Intent.ACTION_MAIN);
|
||||
mcpIntent.addCategory(MCP_CATEGORY);
|
||||
mcpIntent.setClassName(MCP_PACKAGE, MCP_CLASS);
|
||||
final ResolveInfo mcpInfo = pm.resolveActivity(mcpIntent, 0);
|
||||
|
||||
@@ -136,7 +138,7 @@ public class FeaturesActivity extends ActionBarActivity {
|
||||
mcpItem.setTextColor(Color.GRAY);
|
||||
ColorMatrix grayscale = new ColorMatrix();
|
||||
grayscale.setSaturation(0.0f);
|
||||
mcpItem.getCompoundDrawables()[0].setColorFilter(new ColorMatrixColorFilter(grayscale));
|
||||
mcpItem.getCompoundDrawables()[0].mutate().setColorFilter(new ColorMatrixColorFilter(grayscale));
|
||||
}
|
||||
mcpItem.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
@@ -145,6 +147,7 @@ public class FeaturesActivity extends ActionBarActivity {
|
||||
if (mcpInfo == null)
|
||||
action = new Intent(Intent.ACTION_VIEW, Uri.parse(MCP_MARKET_URI));
|
||||
action.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||
action.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
startActivity(action);
|
||||
} catch (final ActivityNotFoundException e) {
|
||||
@@ -172,6 +175,7 @@ public class FeaturesActivity extends ActionBarActivity {
|
||||
final Intent intent = new Intent();
|
||||
intent.setComponent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
mDrawerLayout.closeDrawers();
|
||||
}
|
||||
|
||||
@@ -26,23 +26,28 @@ import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.nrftoolbox.R;
|
||||
import no.nordicsemi.android.nrftoolbox.csc.settings.SettingsActivity;
|
||||
import no.nordicsemi.android.nrftoolbox.csc.settings.SettingsFragment;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileService;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileServiceReadyActivity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.view.Menu;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class CSCActivity extends BleProfileServiceReadyActivity<CSCService.CSCBinder> {
|
||||
private TextView mSpeedView;
|
||||
private TextView mSpeedUnitView;
|
||||
private TextView mCadenceView;
|
||||
private TextView mDistanceView;
|
||||
private TextView mDistanceUnitView;
|
||||
private TextView mTotalDistanceView;
|
||||
private TextView mTotalDistanceUnitView;
|
||||
private TextView mGearRatioView;
|
||||
|
||||
@Override
|
||||
@@ -64,21 +69,53 @@ public class CSCActivity extends BleProfileServiceReadyActivity<CSCService.CSCBi
|
||||
|
||||
private void setGui() {
|
||||
mSpeedView = (TextView) findViewById(R.id.speed);
|
||||
mSpeedUnitView = (TextView) findViewById(R.id.speed_unit);
|
||||
mCadenceView = (TextView) findViewById(R.id.cadence);
|
||||
mDistanceView = (TextView) findViewById(R.id.distance);
|
||||
mDistanceUnitView = (TextView) findViewById(R.id.distance_unit);
|
||||
mTotalDistanceView = (TextView) findViewById(R.id.distance_total);
|
||||
mTotalDistanceUnitView = (TextView) findViewById(R.id.distance_total_unit);
|
||||
mGearRatioView = (TextView) findViewById(R.id.ratio);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
setDefaultUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setDefaultUI() {
|
||||
mSpeedView.setText(R.string.not_available_value);
|
||||
mCadenceView.setText(R.string.not_available_value);
|
||||
mDistanceView.setText(R.string.not_available_value);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
mTotalDistanceView.setText(R.string.not_available_value);
|
||||
mGearRatioView.setText(R.string.not_available_value);
|
||||
|
||||
setUnits();
|
||||
}
|
||||
|
||||
private void setUnits() {
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_M_S: // [m/s]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_m_s);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_KM_H: // [km/h]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_km_h);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_MPH: // [mph]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_mph);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_yd);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_mile);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -98,7 +135,7 @@ public class CSCActivity extends BleProfileServiceReadyActivity<CSCService.CSCBi
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(final Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.csc_menu, menu);
|
||||
getMenuInflater().inflate(R.menu.settings_and_about, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -138,17 +175,40 @@ public class CSCActivity extends BleProfileServiceReadyActivity<CSCService.CSCBi
|
||||
// not used
|
||||
}
|
||||
|
||||
private void onMeasurementReceived(final float speed, final float distance, final float totalDistance) {
|
||||
mSpeedView.setText(String.format("%.1f", speed));
|
||||
if (distance < 1000) { // 1 km in m
|
||||
mDistanceView.setText(String.format("%.0f", distance));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 1000.0f));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_km);
|
||||
private void onMeasurementReceived(float speed, float distance, float totalDistance) {
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_KM_H:
|
||||
speed = speed * 3.6f;
|
||||
// pass through intended
|
||||
case SettingsFragment.SETTINGS_UNIT_M_S:
|
||||
if (distance < 1000) { // 1 km in m
|
||||
mDistanceView.setText(String.format("%.0f", distance));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 1000.0f));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_km);
|
||||
}
|
||||
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 1000.0f));
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_MPH:
|
||||
speed = speed * 2.2369f;
|
||||
if (distance < 1760) { // 1 mile in yrs
|
||||
mDistanceView.setText(String.format("%.0f", distance));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_yd);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 1760.0f));
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_mile);
|
||||
}
|
||||
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 1609.31f));
|
||||
break;
|
||||
}
|
||||
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 1000.0f));
|
||||
mSpeedView.setText(String.format("%.1f", speed));
|
||||
}
|
||||
|
||||
private void onGearRatioUpdate(final float ratio, final int cadence) {
|
||||
@@ -162,7 +222,7 @@ public class CSCActivity extends BleProfileServiceReadyActivity<CSCService.CSCBi
|
||||
final String action = intent.getAction();
|
||||
|
||||
if (CSCService.BROADCAST_WHEEL_DATA.equals(action)) {
|
||||
final float speed = intent.getFloatExtra(CSCService.EXTRA_SPEED, 0.0f);
|
||||
final float speed = intent.getFloatExtra(CSCService.EXTRA_SPEED, 0.0f); // [m/s]
|
||||
final float distance = intent.getFloatExtra(CSCService.EXTRA_DISTANCE, CSCManagerCallbacks.NOT_AVAILABLE);
|
||||
final float totalDistance = intent.getFloatExtra(CSCService.EXTRA_TOTAL_DISTANCE, CSCManagerCallbacks.NOT_AVAILABLE);
|
||||
// Update GUI
|
||||
|
||||
@@ -31,6 +31,12 @@ import android.preference.PreferenceScreen;
|
||||
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
public static final String SETTINGS_WHEEL_SIZE = "settings_wheel_size";
|
||||
public static final int SETTINGS_WHEEL_SIZE_DEFAULT = 2340;
|
||||
public static final String SETTINGS_UNIT = "settings_csc_unit";
|
||||
public static final int SETTINGS_UNIT_M_S = 0; // [m/s]
|
||||
public static final int SETTINGS_UNIT_KM_H = 1; // [m/s]
|
||||
public static final int SETTINGS_UNIT_MPH = 2; // [m/s]
|
||||
public static final int SETTINGS_UNIT_DEFAULT = SETTINGS_UNIT_KM_H;
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate(final Bundle savedInstanceState) {
|
||||
|
||||
@@ -417,7 +417,7 @@ public class DfuActivity extends ActionBarActivity implements LoaderCallbacks<Cu
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(final Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.dfu_menu, menu);
|
||||
getMenuInflater().inflate(R.menu.settings_and_about, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,14 +25,20 @@ import java.text.DecimalFormat;
|
||||
import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.nrftoolbox.R;
|
||||
import no.nordicsemi.android.nrftoolbox.hts.settings.SettingsFragment;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileService;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileServiceReadyActivity;
|
||||
import no.nordicsemi.android.nrftoolbox.hts.settings.SettingsActivity;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.view.Menu;
|
||||
import android.widget.TextView;
|
||||
|
||||
/**
|
||||
@@ -43,17 +49,34 @@ public class HTSActivity extends BleProfileServiceReadyActivity<HTSService.RSCBi
|
||||
@SuppressWarnings("unused")
|
||||
private final String TAG = "HTSActivity";
|
||||
|
||||
private static final String VALUE = "value";
|
||||
private static final DecimalFormat mFormattedTemp = new DecimalFormat("#0.00");
|
||||
private TextView mHTSValue;
|
||||
private TextView mHTSUnit;
|
||||
private Double mValueC;
|
||||
|
||||
@Override
|
||||
protected void onCreateView(Bundle savedInstanceState) {
|
||||
protected void onCreateView(final Bundle savedInstanceState) {
|
||||
setContentView(R.layout.activity_feature_hts);
|
||||
setGUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(final Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
|
||||
if (mValueC != null)
|
||||
outState.putDouble(VALUE, mValueC);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onInitialize(final Bundle savedInstanceState) {
|
||||
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, makeIntentFilter());
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
if (savedInstanceState.containsKey(VALUE))
|
||||
mValueC = savedInstanceState.getDouble(VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,6 +87,43 @@ public class HTSActivity extends BleProfileServiceReadyActivity<HTSService.RSCBi
|
||||
|
||||
private void setGUI() {
|
||||
mHTSValue = (TextView) findViewById(R.id.text_hts_value);
|
||||
mHTSUnit = (TextView) findViewById(R.id.text_hts_unit);
|
||||
|
||||
if (mValueC != null)
|
||||
mHTSValue.setText(String.valueOf(mValueC));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
setUnits();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setDefaultUI() {
|
||||
mValueC = null;
|
||||
mHTSValue.setText(R.string.not_available_value);
|
||||
|
||||
setUnits();
|
||||
}
|
||||
|
||||
private void setUnits() {
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_C:
|
||||
mHTSUnit.setText(R.string.hts_unit_celsius);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_F:
|
||||
mHTSUnit.setText(R.string.hts_unit_fahrenheit);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_K:
|
||||
mHTSUnit.setText(R.string.hts_unit_kelvin);
|
||||
break;
|
||||
}
|
||||
if (mValueC != null)
|
||||
setHTSValueOnView(mValueC);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -81,6 +141,23 @@ public class HTSActivity extends BleProfileServiceReadyActivity<HTSService.RSCBi
|
||||
return R.string.hts_about_text;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(final Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.settings_and_about, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onOptionsItemSelected(final int itemId) {
|
||||
switch (itemId) {
|
||||
case R.id.action_settings:
|
||||
final Intent intent = new Intent(this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultDeviceName() {
|
||||
return R.string.hts_default_name;
|
||||
@@ -101,14 +178,22 @@ public class HTSActivity extends BleProfileServiceReadyActivity<HTSService.RSCBi
|
||||
// this may notify user or show some views
|
||||
}
|
||||
|
||||
private void setHTSValueOnView(final double value) {
|
||||
DecimalFormat formattedTemp = new DecimalFormat("#0.00");
|
||||
mHTSValue.setText(formattedTemp.format(value));
|
||||
}
|
||||
private void setHTSValueOnView(double value) {
|
||||
mValueC = value;
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
@Override
|
||||
protected void setDefaultUI() {
|
||||
mHTSValue.setText(R.string.not_available_value);
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_F:
|
||||
value = value * 1.8 + 32;
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_K:
|
||||
value += 273.15;
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_C:
|
||||
break;
|
||||
}
|
||||
mHTSValue.setText(mFormattedTemp.format(value));
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
|
||||
|
||||
@@ -169,11 +169,7 @@ public class HTSManager implements BleManager<HTSManagerCallbacks> {
|
||||
gatt.disconnect();
|
||||
return;
|
||||
}
|
||||
if (mBatteryCharacteristic != null) {
|
||||
readBatteryLevel();
|
||||
} else {
|
||||
enableHTIndication();
|
||||
}
|
||||
enableHTIndication();
|
||||
} else {
|
||||
mCallbacks.onError(ERROR_DISCOVERY_SERVICE, status);
|
||||
}
|
||||
@@ -185,8 +181,6 @@ public class HTSManager implements BleManager<HTSManagerCallbacks> {
|
||||
if (characteristic.getUuid().equals(BATTERY_LEVEL_CHARACTERISTIC)) {
|
||||
int batteryValue = characteristic.getValue()[0];
|
||||
mCallbacks.onBatteryValueReceived(batteryValue);
|
||||
|
||||
enableHTIndication();
|
||||
}
|
||||
} else if (status == BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION) {
|
||||
if (gatt.getDevice().getBondState() != BluetoothDevice.BOND_NONE) {
|
||||
@@ -213,7 +207,7 @@ public class HTSManager implements BleManager<HTSManagerCallbacks> {
|
||||
@Override
|
||||
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
// HT indications has been enabled
|
||||
readBatteryLevel();
|
||||
} else if (status == BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION) {
|
||||
if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_NONE) {
|
||||
mCallbacks.onBondingRequired();
|
||||
|
||||
@@ -66,7 +66,7 @@ public class HTSService extends BleProfileService implements HTSManagerCallbacks
|
||||
|
||||
@Override
|
||||
protected BleManager<HTSManagerCallbacks> initializeManager() {
|
||||
return mManager = new HTSManager();
|
||||
return mManager = HTSManager.getHTSManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Nordic Semiconductor
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package no.nordicsemi.android.nrftoolbox.hts.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.view.MenuItem;
|
||||
|
||||
public class SettingsActivity extends ActionBarActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
// Display the fragment as the main content.
|
||||
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Nordic Semiconductor
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package no.nordicsemi.android.nrftoolbox.hts.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceFragment;
|
||||
|
||||
import no.nordicsemi.android.nrftoolbox.R;
|
||||
|
||||
public class SettingsFragment extends PreferenceFragment {
|
||||
public static final String SETTINGS_UNIT = "settings_hts_unit";
|
||||
public static final int SETTINGS_UNIT_C = 0; // [C]
|
||||
public static final int SETTINGS_UNIT_F = 1; // [F]
|
||||
public static final int SETTINGS_UNIT_K = 2; // [K]
|
||||
public static final int SETTINGS_UNIT_DEFAULT = SETTINGS_UNIT_C;
|
||||
|
||||
@Override
|
||||
public void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.settings_hts);
|
||||
}
|
||||
}
|
||||
@@ -25,22 +25,29 @@ package no.nordicsemi.android.nrftoolbox.rsc;
|
||||
import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.nrftoolbox.R;
|
||||
import no.nordicsemi.android.nrftoolbox.rsc.settings.SettingsFragment;
|
||||
import no.nordicsemi.android.nrftoolbox.rsc.settings.SettingsActivity;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileService;
|
||||
import no.nordicsemi.android.nrftoolbox.profile.BleProfileServiceReadyActivity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.view.Menu;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class RSCActivity extends BleProfileServiceReadyActivity<RSCService.RSCBinder> {
|
||||
private TextView mSpeedView;
|
||||
private TextView mSpeedUnitView;
|
||||
private TextView mCadenceView;
|
||||
private TextView mDistanceView;
|
||||
private TextView mDistanceUnitView;
|
||||
private TextView mTotalDistanceView;
|
||||
private TextView mTotalDistanceUnitView;
|
||||
private TextView mStridesCountView;
|
||||
private TextView mActivityView;
|
||||
|
||||
@@ -63,23 +70,55 @@ public class RSCActivity extends BleProfileServiceReadyActivity<RSCService.RSCBi
|
||||
|
||||
private void setGui() {
|
||||
mSpeedView = (TextView) findViewById(R.id.speed);
|
||||
mSpeedUnitView = (TextView) findViewById(R.id.speed_unit);
|
||||
mCadenceView = (TextView) findViewById(R.id.cadence);
|
||||
mDistanceView = (TextView) findViewById(R.id.distance);
|
||||
mDistanceUnitView = (TextView) findViewById(R.id.distance_unit);
|
||||
mTotalDistanceView = (TextView) findViewById(R.id.total_distance);
|
||||
mTotalDistanceUnitView = (TextView) findViewById(R.id.total_distance_unit);
|
||||
mStridesCountView = (TextView) findViewById(R.id.strides);
|
||||
mActivityView = (TextView) findViewById(R.id.activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
setDefaultUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setDefaultUI() {
|
||||
mSpeedView.setText(R.string.not_available_value);
|
||||
mCadenceView.setText(R.string.not_available_value);
|
||||
mDistanceView.setText(R.string.not_available_value);
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
|
||||
mTotalDistanceView.setText(R.string.not_available_value);
|
||||
mStridesCountView.setText(R.string.not_available_value);
|
||||
mActivityView.setText(R.string.not_available);
|
||||
|
||||
setUnits();
|
||||
}
|
||||
|
||||
private void setUnits() {
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_M_S: // [m/s]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_m_s);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_KM_H: // [km/h]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_km_h);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_m);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_MPH: // [mph]
|
||||
mSpeedUnitView.setText(R.string.csc_speed_unit_mph);
|
||||
mDistanceUnitView.setText(R.string.csc_distance_unit_yd);
|
||||
mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_mile);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -97,6 +136,23 @@ public class RSCActivity extends BleProfileServiceReadyActivity<RSCService.RSCBi
|
||||
return R.string.rsc_about_text;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(final Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.settings_and_about, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onOptionsItemSelected(final int itemId) {
|
||||
switch (itemId) {
|
||||
case R.id.action_settings:
|
||||
final Intent intent = new Intent(this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<? extends BleProfileService> getServiceClass() {
|
||||
return RSCService.class;
|
||||
@@ -122,28 +178,69 @@ public class RSCActivity extends BleProfileServiceReadyActivity<RSCService.RSCBi
|
||||
// not used
|
||||
}
|
||||
|
||||
private void onMeasurementReceived(final float speed, final int cadence, final float totalDistance, final int activity) {
|
||||
mSpeedView.setText(String.format("%.1f", speed));
|
||||
mCadenceView.setText(String.format("%d", cadence));
|
||||
if (totalDistance == RSCManagerCallbacks.NOT_AVAILABLE) {
|
||||
mTotalDistanceView.setText(R.string.not_available);
|
||||
} else {
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 10000.0f)); // 1km in dm
|
||||
private void onMeasurementReceived(float speed, int cadence, float totalDistance, final int activity) {
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_KM_H:
|
||||
speed = speed * 3.6f;
|
||||
// pass through intended
|
||||
case SettingsFragment.SETTINGS_UNIT_M_S:
|
||||
if (totalDistance == RSCManagerCallbacks.NOT_AVAILABLE) {
|
||||
mTotalDistanceView.setText(R.string.not_available);
|
||||
mTotalDistanceUnitView.setText(null);
|
||||
} else {
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 1000.0f)); // 1 km in m
|
||||
mTotalDistanceUnitView.setText(R.string.rsc_total_distance_unit_km);
|
||||
}
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_MPH:
|
||||
speed = speed * 2.2369f;
|
||||
if (totalDistance == RSCManagerCallbacks.NOT_AVAILABLE) {
|
||||
mTotalDistanceView.setText(R.string.not_available);
|
||||
mTotalDistanceUnitView.setText(null);
|
||||
} else {
|
||||
mTotalDistanceView.setText(String.format("%.2f", totalDistance / 1609.31f)); // 1 mile in m
|
||||
mTotalDistanceUnitView.setText(R.string.rsc_total_distance_unit_mile);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
mSpeedView.setText(String.format("%.1f", speed));
|
||||
mCadenceView.setText(String.format("%d", cadence));
|
||||
mActivityView.setText(activity == RSCManagerCallbacks.ACTIVITY_RUNNING ? R.string.rsc_running : R.string.rsc_walking);
|
||||
}
|
||||
|
||||
private void onStripsesUpdate(final float distance, final int strides) {
|
||||
private void onStripesUpdate(final float distance, final int strides) {
|
||||
if (distance == RSCManagerCallbacks.NOT_AVAILABLE) {
|
||||
mDistanceView.setText(R.string.not_available);
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
|
||||
} else if (distance < 100000) { // 1 km in cm
|
||||
mDistanceView.setText(String.format("%.0f", distance / 100.0f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 100000.0f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_km);
|
||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
final int unit = Integer.parseInt(preferences.getString(SettingsFragment.SETTINGS_UNIT, String.valueOf(SettingsFragment.SETTINGS_UNIT_DEFAULT)));
|
||||
|
||||
switch (unit) {
|
||||
case SettingsFragment.SETTINGS_UNIT_KM_H:
|
||||
case SettingsFragment.SETTINGS_UNIT_M_S:
|
||||
if (distance < 100000) { // 1 km in cm
|
||||
mDistanceView.setText(String.format("%.0f", distance / 100.0f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 100000.0f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_km);
|
||||
}
|
||||
break;
|
||||
case SettingsFragment.SETTINGS_UNIT_MPH:
|
||||
if (distance < 160931) { // 1 mile in cm
|
||||
mDistanceView.setText(String.format("%.0f", distance / 91.4392f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_yd);
|
||||
} else {
|
||||
mDistanceView.setText(String.format("%.2f", distance / 160931.23f));
|
||||
mDistanceUnitView.setText(R.string.rsc_distance_unit_mile);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mStridesCountView.setText(String.valueOf(strides));
|
||||
@@ -165,7 +262,7 @@ public class RSCActivity extends BleProfileServiceReadyActivity<RSCService.RSCBi
|
||||
final int strides = intent.getIntExtra(RSCService.EXTRA_STRIDES, 0);
|
||||
final float distance = intent.getFloatExtra(RSCService.EXTRA_DISTANCE, 0);
|
||||
// Update GUI
|
||||
onStripsesUpdate(distance, strides);
|
||||
onStripesUpdate(distance, strides);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -190,22 +190,22 @@ public class RSCManager implements BleManager<RSCManagerCallbacks> {
|
||||
final boolean tdPreset = (flags & TOTAL_DISTANCE_PRESENT) > 0;
|
||||
final boolean running = (flags & WALKING_OR_RUNNING_STATUS_BITS) > 0;
|
||||
|
||||
final float instantaneousSpeed = (float) characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset) / 256.0f * 3.6f; // 1/256 m/s in km/h
|
||||
final float instantaneousSpeed = (float) characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset) / 256.0f; // 1/256 m/s in [m/s]
|
||||
offset += 2;
|
||||
|
||||
final int instantaneousCadence = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, offset);
|
||||
final int instantaneousCadence = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, offset); // [SPM]
|
||||
offset += 1;
|
||||
|
||||
float instantaneousStrideLength = RSCManagerCallbacks.NOT_AVAILABLE;
|
||||
if (islmPresent) {
|
||||
instantaneousStrideLength = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset);
|
||||
instantaneousStrideLength = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset); // [cm]
|
||||
offset += 2;
|
||||
}
|
||||
|
||||
float totalDistance = RSCManagerCallbacks.NOT_AVAILABLE;
|
||||
if (tdPreset) {
|
||||
totalDistance = (float) characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT32, offset) / 10.0f;
|
||||
offset += 4;
|
||||
totalDistance = (float) characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT32, offset) / 10.0f; // 1/10 m in [m]
|
||||
//offset += 4;
|
||||
}
|
||||
|
||||
// Notify listener about the new measurement
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Nordic Semiconductor
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package no.nordicsemi.android.nrftoolbox.rsc.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.view.MenuItem;
|
||||
|
||||
public class SettingsActivity extends ActionBarActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
// Display the fragment as the main content.
|
||||
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Nordic Semiconductor
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package no.nordicsemi.android.nrftoolbox.rsc.settings;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceScreen;
|
||||
|
||||
import no.nordicsemi.android.nrftoolbox.R;
|
||||
|
||||
public class SettingsFragment extends PreferenceFragment {
|
||||
public static final String SETTINGS_UNIT = "settings_rsc_unit";
|
||||
public static final int SETTINGS_UNIT_M_S = 0; // [m/s]
|
||||
public static final int SETTINGS_UNIT_KM_H = 1; // [m/s]
|
||||
public static final int SETTINGS_UNIT_MPH = 2; // [m/s]
|
||||
public static final int SETTINGS_UNIT_DEFAULT = SETTINGS_UNIT_KM_H;
|
||||
|
||||
@Override
|
||||
public void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.settings_rsc);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user