From 9a4979442808e6147f6621fa6de7b1b4f1aeb6cb Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Sat, 28 Nov 2015 22:54:06 +0000 Subject: [PATCH] Network data source now working, but needs testing still. --- .../org/openseizuredetector/PrefActivity.java | 2 +- .../uk/org/openseizuredetector/SdData.java | 11 +- .../org/openseizuredetector/SdDataSource.java | 11 ++ .../SdDataSourceNetwork.java | 185 ++++++++++++++++++ .../uk/org/openseizuredetector/SdServer.java | 57 ++++++ 5 files changed, 262 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/uk/org/openseizuredetector/PrefActivity.java b/app/src/main/java/uk/org/openseizuredetector/PrefActivity.java index 0832765..85ce764 100644 --- a/app/src/main/java/uk/org/openseizuredetector/PrefActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/PrefActivity.java @@ -71,7 +71,7 @@ public class PrefActivity extends PreferenceActivity { } if (h.title.toString().equals("Network Datasource")) { Log.v(TAG, "found Network Datasource Header"); - if (!dataSourceStr.equals("network")) { + if (!dataSourceStr.equals("Network")) { Log.v(TAG, "Removing network settings header"); target.remove(i); i = i -1; diff --git a/app/src/main/java/uk/org/openseizuredetector/SdData.java b/app/src/main/java/uk/org/openseizuredetector/SdData.java index bc7e5a8..f326f9f 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdData.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdData.java @@ -85,7 +85,7 @@ public class SdData implements Parcelable { //dataTime = cal.getTime(); // FIXME - this doesn't work!!! dataTime.setToNow(); - Log.v(TAG,"fromJSON(): dataTime = "+dataTime.toString()); + Log.v(TAG, "fromJSON(): dataTime = " + dataTime.toString()); maxVal = jo.optInt("maxVal"); maxFreq = jo.optInt("maxFreq"); specPower = jo.optInt("specPower"); @@ -95,6 +95,8 @@ public class SdData implements Parcelable { pebbleAppRunning = jo.optBoolean("pebbleAppRunning"); alarmState = jo.optInt("alarmState"); alarmPhrase = jo.optString("alarmPhrase"); + alarmThresh = jo.optInt("alarmThresh"); + alarmRatioThresh = jo.optInt("alarmRatioThresh"); JSONArray specArr = jo.optJSONArray("simpleSpec"); for (int i=0;i { + 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); + } + + + + } diff --git a/app/src/main/java/uk/org/openseizuredetector/SdServer.java b/app/src/main/java/uk/org/openseizuredetector/SdServer.java index 73b8a12..5dce3d6 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdServer.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdServer.java @@ -40,6 +40,7 @@ import android.content.res.AssetManager; import android.content.SharedPreferences; import android.media.AudioManager; import android.media.ToneGenerator; +import android.os.CountDownTimer; import android.os.Environment; import android.os.HandlerThread; import android.os.Binder; @@ -80,6 +81,9 @@ public class SdServer extends Service implements SdDataReceiver { private WebServer webServer = null; private final static String TAG = "SdServer"; 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 WakeLock mWakeLock = null; public SdDataSource mSdDataSource; @@ -351,6 +355,7 @@ public class SdServer extends Service implements SdDataReceiver { } mSdData = sdData; + Log.v(TAG,"onSdDataReceived() - setting mSdData to "+mSdData.toString()); } 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) */ @@ -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 * 8080.