Network data source now working, but needs testing still.
This commit is contained in:
@@ -71,7 +71,7 @@ public class PrefActivity extends PreferenceActivity {
|
|||||||
}
|
}
|
||||||
if (h.title.toString().equals("Network Datasource")) {
|
if (h.title.toString().equals("Network Datasource")) {
|
||||||
Log.v(TAG, "found Network Datasource Header");
|
Log.v(TAG, "found Network Datasource Header");
|
||||||
if (!dataSourceStr.equals("network")) {
|
if (!dataSourceStr.equals("Network")) {
|
||||||
Log.v(TAG, "Removing network settings header");
|
Log.v(TAG, "Removing network settings header");
|
||||||
target.remove(i);
|
target.remove(i);
|
||||||
i = i -1;
|
i = i -1;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class SdData implements Parcelable {
|
|||||||
//dataTime = cal.getTime();
|
//dataTime = cal.getTime();
|
||||||
// FIXME - this doesn't work!!!
|
// FIXME - this doesn't work!!!
|
||||||
dataTime.setToNow();
|
dataTime.setToNow();
|
||||||
Log.v(TAG,"fromJSON(): dataTime = "+dataTime.toString());
|
Log.v(TAG, "fromJSON(): dataTime = " + dataTime.toString());
|
||||||
maxVal = jo.optInt("maxVal");
|
maxVal = jo.optInt("maxVal");
|
||||||
maxFreq = jo.optInt("maxFreq");
|
maxFreq = jo.optInt("maxFreq");
|
||||||
specPower = jo.optInt("specPower");
|
specPower = jo.optInt("specPower");
|
||||||
@@ -95,6 +95,8 @@ public class SdData implements Parcelable {
|
|||||||
pebbleAppRunning = jo.optBoolean("pebbleAppRunning");
|
pebbleAppRunning = jo.optBoolean("pebbleAppRunning");
|
||||||
alarmState = jo.optInt("alarmState");
|
alarmState = jo.optInt("alarmState");
|
||||||
alarmPhrase = jo.optString("alarmPhrase");
|
alarmPhrase = jo.optString("alarmPhrase");
|
||||||
|
alarmThresh = jo.optInt("alarmThresh");
|
||||||
|
alarmRatioThresh = jo.optInt("alarmRatioThresh");
|
||||||
JSONArray specArr = jo.optJSONArray("simpleSpec");
|
JSONArray specArr = jo.optJSONArray("simpleSpec");
|
||||||
for (int i=0;i<specArr.length();i++) {
|
for (int i=0;i<specArr.length();i++) {
|
||||||
simpleSpec[i] = specArr.optInt(i);
|
simpleSpec[i] = specArr.optInt(i);
|
||||||
@@ -125,16 +127,19 @@ public class SdData implements Parcelable {
|
|||||||
jsonObj.put("dataTimeStr","00000000T000000");
|
jsonObj.put("dataTimeStr","00000000T000000");
|
||||||
jsonObj.put("dataTime","00-00-00 00:00:00");
|
jsonObj.put("dataTime","00-00-00 00:00:00");
|
||||||
}
|
}
|
||||||
Log.v(TAG,"mSdData.dataTime = "+dataTime);
|
Log.v(TAG,"mSdData.dataTime = " + dataTime);
|
||||||
jsonObj.put("maxVal",maxVal);
|
jsonObj.put("maxVal", maxVal);
|
||||||
jsonObj.put("maxFreq",maxFreq);
|
jsonObj.put("maxFreq",maxFreq);
|
||||||
jsonObj.put("specPower",specPower);
|
jsonObj.put("specPower",specPower);
|
||||||
jsonObj.put("roiPower",roiPower);
|
jsonObj.put("roiPower",roiPower);
|
||||||
jsonObj.put("batteryPc",batteryPc);
|
jsonObj.put("batteryPc",batteryPc);
|
||||||
jsonObj.put("pebbleConnected",pebbleConnected);
|
jsonObj.put("pebbleConnected",pebbleConnected);
|
||||||
jsonObj.put("pebbleAppRunning",pebbleAppRunning);
|
jsonObj.put("pebbleAppRunning",pebbleAppRunning);
|
||||||
|
jsonObj.put("haveSettings",haveSettings);
|
||||||
jsonObj.put("alarmState",alarmState);
|
jsonObj.put("alarmState",alarmState);
|
||||||
jsonObj.put("alarmPhrase",alarmPhrase);
|
jsonObj.put("alarmPhrase",alarmPhrase);
|
||||||
|
jsonObj.put("alarmThresh",alarmThresh);
|
||||||
|
jsonObj.put("alarmRatioThresh",alarmRatioThresh);
|
||||||
JSONArray arr = new JSONArray();
|
JSONArray arr = new JSONArray();
|
||||||
for (int i=0;i<simpleSpec.length;i++) {
|
for (int i=0;i<simpleSpec.length;i++) {
|
||||||
arr.put(simpleSpec[i]);
|
arr.put(simpleSpec[i]);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ package uk.org.openseizuredetector;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
interface SdDataReceiver {
|
interface SdDataReceiver {
|
||||||
public void onSdDataReceived(SdData sdData);
|
public void onSdDataReceived(SdData sdData);
|
||||||
@@ -72,4 +73,14 @@ public abstract class SdDataSource {
|
|||||||
Log.v(TAG, "stop()");
|
Log.v(TAG, "stop()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a Toast message on screen.
|
||||||
|
* @param msg - message to display.
|
||||||
|
*/
|
||||||
|
public void showToast(String msg) {
|
||||||
|
Toast.makeText(mContext, msg,
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,199 @@
|
|||||||
package uk.org.openseizuredetector;
|
package uk.org.openseizuredetector;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.text.format.Time;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by graham on 22/11/15.
|
* Created by graham on 22/11/15.
|
||||||
*/
|
*/
|
||||||
public class SdDataSourceNetwork extends SdDataSource {
|
public class SdDataSourceNetwork extends SdDataSource {
|
||||||
|
private String TAG = "SdDataSourceNetwork";
|
||||||
|
private Time mStatusTime;
|
||||||
|
private Timer mDataUpdateTimer;
|
||||||
|
private int mDataUpdatePeriod = 2000;
|
||||||
|
private String mServerIP = "unknown";
|
||||||
|
|
||||||
|
|
||||||
public SdDataSourceNetwork(Context context, SdDataReceiver sdDataReceiver) {
|
public SdDataSourceNetwork(Context context, SdDataReceiver sdDataReceiver) {
|
||||||
super(context,sdDataReceiver);
|
super(context,sdDataReceiver);
|
||||||
mName = "Network";
|
mName = "Network";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public void start() {
|
||||||
|
// Update preferences.
|
||||||
|
Log.v(TAG,"start(): calling updatePrefs()");
|
||||||
|
updatePrefs();
|
||||||
|
|
||||||
|
// Start timer to retrieve seizure detector data regularly.
|
||||||
|
mStatusTime = new Time(Time.getCurrentTimezone());
|
||||||
|
mStatusTime.setToNow();
|
||||||
|
if (mDataUpdateTimer ==null) {
|
||||||
|
Log.v(TAG,"start(): starting data update timer");
|
||||||
|
mDataUpdateTimer = new Timer();
|
||||||
|
mDataUpdateTimer.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
downloadSdData();
|
||||||
|
}
|
||||||
|
}, 0, mDataUpdatePeriod);
|
||||||
|
} else {
|
||||||
|
Log.v(TAG,"start(): data update timer already running.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void stop() {
|
||||||
|
// Stop the data update timer
|
||||||
|
if (mDataUpdateTimer !=null) {
|
||||||
|
Log.v(TAG,"stop(): cancelling status timer");
|
||||||
|
mDataUpdateTimer.cancel();
|
||||||
|
mDataUpdateTimer.purge();
|
||||||
|
mDataUpdateTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* updatePrefs() - update basic settings from the SharedPreferences
|
||||||
|
* - defined in res/xml/prefs.xml
|
||||||
|
*/
|
||||||
|
public void updatePrefs() {
|
||||||
|
Log.v(TAG, "updatePrefs()");
|
||||||
|
SharedPreferences SP = PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(mContext);
|
||||||
|
mServerIP = SP.getString("ServerIP","192.168.1.175");
|
||||||
|
Log.v(TAG,"updatePrefs() - mServerIP = "+mServerIP);
|
||||||
|
try {
|
||||||
|
String dataUpdatePeriodStr = SP.getString("DataUpdatePeriod","2000");
|
||||||
|
mDataUpdatePeriod = Integer.parseInt(dataUpdatePeriodStr);
|
||||||
|
Log.v(TAG,"updatePrefs() - mDataUpdatePeriod = "+mDataUpdatePeriod);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.v(TAG,"updatePrefs() - Problem parsing preferences!");
|
||||||
|
showToast("Problem Parsing Preferences - Something won't work");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrive the current Seizure Detector Data from the server.
|
||||||
|
* Uses teh DownloadSdDataTask class to download the data in the
|
||||||
|
* background. The data is processed in DownloadSdDataTask.onPostExecute().
|
||||||
|
*/
|
||||||
|
public void downloadSdData() {
|
||||||
|
Log.v(TAG, "downloadSdData()");
|
||||||
|
new DownloadSdDataTask().execute("http://" + mServerIP + ":8080/data");
|
||||||
|
}
|
||||||
|
|
||||||
|
private class DownloadSdDataTask extends AsyncTask<String, Void, SdData> {
|
||||||
|
private SdData sdData;
|
||||||
|
@Override
|
||||||
|
protected SdData doInBackground(String... urls) {
|
||||||
|
// params comes from the execute() call: params[0] is the url.
|
||||||
|
sdData = new SdData();
|
||||||
|
try {
|
||||||
|
String result = downloadUrl(urls[0]);
|
||||||
|
if (result.startsWith("Unable to retrieve web page")) {
|
||||||
|
Log.v(TAG,"doInBackground() - Unable to retrieve data");
|
||||||
|
sdData.serverOK = false;
|
||||||
|
sdData.pebbleConnected = false;
|
||||||
|
sdData.pebbleAppRunning = false;
|
||||||
|
sdData.alarmState = 0;
|
||||||
|
sdData.alarmPhrase = "Warning - No Connection to Server";
|
||||||
|
Log.v(TAG,"doInBackground(): No Connection to Server - sdData = "+sdData.toString());
|
||||||
|
} else {
|
||||||
|
sdData.fromJSON(result);
|
||||||
|
// Populate mSdData using the received data.
|
||||||
|
sdData.serverOK = true;
|
||||||
|
if (sdData.batteryPc>0) {
|
||||||
|
sdData.haveSettings = true;
|
||||||
|
}
|
||||||
|
mStatusTime.setToNow();
|
||||||
|
Log.v(TAG,"doInBackground(): sdData = "+sdData.toString());
|
||||||
|
}
|
||||||
|
return (sdData);
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
sdData.serverOK = false;
|
||||||
|
sdData.pebbleConnected = false;
|
||||||
|
sdData.pebbleAppRunning = false;
|
||||||
|
sdData.alarmState = 0;
|
||||||
|
sdData.alarmPhrase = "Warning - No Connection to Server";
|
||||||
|
Log.v(TAG,"doInBackground(): IOException - "+e.toString());
|
||||||
|
return sdData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// onPostExecute displays the results of the AsyncTask.
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(SdData sdData) {
|
||||||
|
Log.v(TAG,"onPostExecute() - sdData = "+sdData.toString());
|
||||||
|
mSdDataReceiver.onSdDataReceived(sdData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Given a URL, establishes an HttpUrlConnection and retrieves
|
||||||
|
// the web page content as a InputStream, which it returns as
|
||||||
|
// a string.
|
||||||
|
private String downloadUrl(String myurl) throws IOException {
|
||||||
|
InputStream is = null;
|
||||||
|
// Only display the first 500 characters of the retrieved
|
||||||
|
// web page content.
|
||||||
|
int len = 500;
|
||||||
|
|
||||||
|
try {
|
||||||
|
URL url = new URL(myurl);
|
||||||
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||||
|
conn.setReadTimeout(5000 /* milliseconds */);
|
||||||
|
conn.setConnectTimeout(5000 /* milliseconds */);
|
||||||
|
conn.setRequestMethod("GET");
|
||||||
|
conn.setDoInput(true);
|
||||||
|
// Starts the query
|
||||||
|
conn.connect();
|
||||||
|
int response = conn.getResponseCode();
|
||||||
|
Log.d(TAG, "The response is: " + response);
|
||||||
|
is = conn.getInputStream();
|
||||||
|
|
||||||
|
// Convert the InputStream into a string
|
||||||
|
String contentAsString = readInputStream(is, len);
|
||||||
|
return contentAsString;
|
||||||
|
|
||||||
|
// Makes sure that the InputStream is closed after the app is
|
||||||
|
// finished using it.
|
||||||
|
} finally {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads an InputStream and converts it to a String.
|
||||||
|
public String readInputStream(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
|
||||||
|
Reader reader = null;
|
||||||
|
reader = new InputStreamReader(stream, "UTF-8");
|
||||||
|
char[] buffer = new char[len];
|
||||||
|
reader.read(buffer);
|
||||||
|
return new String(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import android.content.res.AssetManager;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.ToneGenerator;
|
import android.media.ToneGenerator;
|
||||||
|
import android.os.CountDownTimer;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
@@ -80,6 +81,9 @@ public class SdServer extends Service implements SdDataReceiver {
|
|||||||
private WebServer webServer = null;
|
private WebServer webServer = null;
|
||||||
private final static String TAG = "SdServer";
|
private final static String TAG = "SdServer";
|
||||||
private Timer dataLogTimer = null;
|
private Timer dataLogTimer = null;
|
||||||
|
private CancelAudibleTimer mCancelAudibleTimer = null;
|
||||||
|
private int mCancelAudiblePeriod = 10; // Cancel Audible Period in minutes
|
||||||
|
private long mCancelAudibleTimeRemaining = 0;
|
||||||
private HandlerThread thread;
|
private HandlerThread thread;
|
||||||
private WakeLock mWakeLock = null;
|
private WakeLock mWakeLock = null;
|
||||||
public SdDataSource mSdDataSource;
|
public SdDataSource mSdDataSource;
|
||||||
@@ -351,6 +355,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
|||||||
|
|
||||||
}
|
}
|
||||||
mSdData = sdData;
|
mSdData = sdData;
|
||||||
|
Log.v(TAG,"onSdDataReceived() - setting mSdData to "+mSdData.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSdDataFault(SdData sdData) {
|
public void onSdDataFault(SdData sdData) {
|
||||||
@@ -455,6 +460,34 @@ public class SdServer extends Service implements SdDataReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void cancelAudible() {
|
||||||
|
// Start timer to remove the cancel audible flag
|
||||||
|
// after the required period.
|
||||||
|
if (mCancelAudibleTimer!=null) {
|
||||||
|
Log.v(TAG,"onCreate(): cancel audible timer already running - cancelling it.");
|
||||||
|
mCancelAudibleTimer.cancel();
|
||||||
|
mCancelAudibleTimer = null;
|
||||||
|
mCancelAudible = false;
|
||||||
|
} else {
|
||||||
|
Log.v(TAG,"cancelAudible(): starting cancel audible timer");
|
||||||
|
mCancelAudible = true;
|
||||||
|
mCancelAudibleTimer =
|
||||||
|
// conver to ms.
|
||||||
|
new CancelAudibleTimer(mCancelAudiblePeriod*60*1000,1000);
|
||||||
|
mCancelAudibleTimer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAudibleCancelled() {
|
||||||
|
return mCancelAudible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long cancelAudibleTimeRemaining() {
|
||||||
|
return mCancelAudibleTimeRemaining;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start the web server (on port 8080)
|
* Start the web server (on port 8080)
|
||||||
*/
|
*/
|
||||||
@@ -609,6 +642,30 @@ public class SdServer extends Service implements SdDataReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Temporary cancel audible alarms, for the period specified by the
|
||||||
|
* CancelAudiblePeriod setting.
|
||||||
|
*/
|
||||||
|
private class CancelAudibleTimer extends CountDownTimer {
|
||||||
|
public CancelAudibleTimer(long startTime, long interval) {
|
||||||
|
super(startTime, interval);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFinish() {
|
||||||
|
mCancelAudible = false;
|
||||||
|
Log.v(TAG,"mCancelAudibleTimer - removing cancelAudible flag");
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onTick(long msRemaining) {
|
||||||
|
mCancelAudibleTimeRemaining = msRemaining/1000;
|
||||||
|
Log.v(TAG,"mCancelAudibleTimer - onTick() - Time Remaining = "
|
||||||
|
+ mCancelAudibleTimeRemaining);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class describing the seizure detector web server - appears on port
|
* Class describing the seizure detector web server - appears on port
|
||||||
* 8080.
|
* 8080.
|
||||||
|
|||||||
Reference in New Issue
Block a user