diff --git a/README.md b/README.md index 90e67d8..f761d3a 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,6 @@ ## Descrizione Il nostro progetto nasce per aiutare nella quotidianità persone anziane che non possono essere seguite da assistenti e che quindi possono trarre vantaggio da un sistema automatizzato che interagisca attraverso un assistente vocale in modo da permettere al soggetto di controllare i dispositivi collegati alla Home Station. In caso di stress (rilevato attraverso battito cardiaco), le luci vengono soffuse così da creare un ambiente più rilassante e nel caso in cui la situazione non migliori contatti medico o familiari; inoltre viene consigliata in questo caso musica rilassante che il soggetto può avviare con comando vocale. Inoltre il soggetto viene sollecitato vocalmente in caso di sedentarietà. Si mantiene anche il contatto con persone esterne, medico e familiari, i quali possono controllare le attività del soggetto poiché verranno mantenute statistiche su di esse. -# TODO -- Documentazione per capire meglio -- Main da iniziare e finire - - [Jack]: [Giulia]: [D]: diff --git a/src/main/java/device/Fitbit.java b/src/main/java/device/Fitbit.java index d9efc76..7c9e9d3 100644 --- a/src/main/java/device/Fitbit.java +++ b/src/main/java/device/Fitbit.java @@ -51,7 +51,7 @@ public class Fitbit { private final Map, Long> latestRequest = new HashMap<>(); /** - * Un calendario in modo da sapere la data per i dati + * Un calendario in modo da sapere la data per prendere i dati */ private final Calendar calendar = Calendar.getInstance(); @@ -156,8 +156,7 @@ public class Fitbit { * Ricevi tutti i dati presenti per il sonno di questo giorno. * La lista contiene per ogni volta che l'utente ha dormito:
* - la data di quando si e' addormentato
- * - la durata del sonno
- * - la data di fine
+ * - la durata del sonno * @return una lista contenente ogni volta che l'utente ha dormito */ public synchronized List getDetailedSleep() { diff --git a/src/main/java/device/Hue.java b/src/main/java/device/Hue.java index d30641a..0205aed 100644 --- a/src/main/java/device/Hue.java +++ b/src/main/java/device/Hue.java @@ -68,7 +68,7 @@ public class Hue { /** * Cerca le luci Philips Hue nell'indirizzo specificato e con l'utente specificato.
* Una volta trovate le luci le setta tutte alla stessa luminosita' e allo stesso colore
- * (per ora fa una media e poi assegna il valore risultante a tutte) + * (luminosità massima e colore bianco) * @param ip l'indirizzo IP (seguito dalla porta se e' diversa dalla solita 8000) * @param user l'utente * @throws NullPointerException se non trova nessun bridge @@ -80,23 +80,8 @@ public class Hue { if(allLights.isEmpty()) throw new NullPointerException("Non e' stato possibile connettersi alle luci"); - // TODO GIOVEDI impostare una luminosita' e un colore di default - double bri = 0; - double hue = 0; - for (String name: allLights.keySet()) { - Map state = (Map)allLights.get(name).get("state"); - bri += (Double) state.get("bri"); - hue += (Double) state.get("hue"); - } - bri = bri/allLights.size(); - hue = hue/allLights.size(); - - Map map = new HashMap<>(); - map.put("bri", (int)bri); - map.put("hue", (int)hue); - setState(map); - - brightness.set((bri*MAX_BRIGHTNESS)/100); + setBrightness(100); + changeColor("bianco"); } /** diff --git a/src/main/java/device/Sensor.java b/src/main/java/device/Sensor.java index e78b257..c82f0c1 100644 --- a/src/main/java/device/Sensor.java +++ b/src/main/java/device/Sensor.java @@ -6,7 +6,6 @@ import de.fh_zwickau.informatik.sensor.model.devices.Device; import de.fh_zwickau.informatik.sensor.model.devices.DeviceList; import support.ZWaySimpleCallback; -// TODO GIOVEDI da mettere a posto secondo me, dato che da un po di problemi IRL /** * Sensore che permette di registrare vari dati dell'ambiente */ @@ -99,13 +98,4 @@ public class Sensor { device.update(); } catch (Exception e) { } } - /* - public boolean IsLowLuminescence(int Luminescence) { - if (dev.getProbeType().equalsIgnoreCase("Luminescence")) - if (Integer.parseInt(dev.getMetrics().getLevel()) < Luminescence) - return true; - else - return false; - return false; - }*/ } diff --git a/src/main/java/device/fitbitdata/FitbitData.java b/src/main/java/device/fitbitdata/FitbitData.java index cef5864..701f4eb 100644 --- a/src/main/java/device/fitbitdata/FitbitData.java +++ b/src/main/java/device/fitbitdata/FitbitData.java @@ -1,8 +1,20 @@ package device.fitbitdata; +/** + * Calsse che serve ad avere una data collegata al dato preso dal fitbit + */ public abstract class FitbitData { private long millisec = 0; + /** + * Setta la data collegato al dato preso dal fitbit + * @param millisec la data in millisecondi + */ public void setDate(long millisec) { this.millisec = millisec; } + + /** + * Ricevi la data collegata al dato richiesto dal fitbit + * @return la data in millisec + */ public long getDate() { return this.millisec; } } diff --git a/src/main/java/device/fitbitdata/HeartRate.java b/src/main/java/device/fitbitdata/HeartRate.java index 36e3b46..5c46851 100644 --- a/src/main/java/device/fitbitdata/HeartRate.java +++ b/src/main/java/device/fitbitdata/HeartRate.java @@ -6,13 +6,16 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.List; import java.util.Map; +/** + * Classe per vedere il dato del battito cardiaco + */ @JsonIgnoreProperties(ignoreUnknown = true) public class HeartRate extends FitbitData { private double average; @JsonProperty("activities-heart-intraday") - public void setAverage(Map map) { + private void setAverage(Map map) { List data = (List) map.get("dataset"); int sum = 0; @@ -24,6 +27,15 @@ public class HeartRate extends FitbitData { average = 0; } + /** + * Setta il vaore medio del battito cardiaco + * @param average il valore medio del battito + */ public void setAverage(double average) { this.average = average; } + + /** + * Ricevi il valore medio del battito cardiaco + * @return il valore medio + */ public double getAverage() { return average; } } diff --git a/src/main/java/device/fitbitdata/Sleep.java b/src/main/java/device/fitbitdata/Sleep.java index 2307041..1924e4c 100644 --- a/src/main/java/device/fitbitdata/Sleep.java +++ b/src/main/java/device/fitbitdata/Sleep.java @@ -10,28 +10,23 @@ import java.util.Date; import java.util.List; import java.util.Map; +/** + * Classe per i dati del sonno dell'utente + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Sleep { - private int minutesAsleep; + private long minutesAsleep; private List datas; - public int getMinutesAsleep() { - return minutesAsleep; - } - - public List getDatas() { - return datas; - } - @JsonProperty("summary") - public void setMinutesAsleep(Map map) { - minutesAsleep = (int) map.get("totalMinutesAsleep"); + private void setMinutesAsleep(Map map) { + minutesAsleep = (long) map.get("totalMinutesAsleep"); } @JsonProperty("sleep") - public void setSleepsList(Map[] array) { + private void setSleepsList(Map[] array) { datas = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat(); for(Map map : array) { @@ -47,8 +42,33 @@ public class Sleep { } } + /** + * I minuti totali che l'utente ha avuto di sonno durante il giorno + * @return i minuti totali + */ + public long getMinutesAsleep() { + return minutesAsleep; + } + + /** + * Ricevi i dati più specifici riguardo al sonno + * @return una lista con i dati specifici del sonno + */ + public List getDatas() { + return datas; + } + + /** + * Classe utilizzata per avere i dati più specifici del sonno + */ public class SleepData { + /** + * La data d'inizio del sonno in millisec + */ public final long start_date; + /** + * La durata del sonno in millisec + */ public final long duration; SleepData(Date start_date, long duration) { diff --git a/src/main/java/device/fitbitdata/Steps.java b/src/main/java/device/fitbitdata/Steps.java index edcfd9a..766a07a 100644 --- a/src/main/java/device/fitbitdata/Steps.java +++ b/src/main/java/device/fitbitdata/Steps.java @@ -9,6 +9,9 @@ import java.util.Date; import java.util.List; import java.util.Map; +/** + * Classe che serve a vedere i passi fatti secondo il fitbit + */ @JsonIgnoreProperties(ignoreUnknown = true) public class Steps extends FitbitData { @@ -31,7 +34,21 @@ public class Steps extends FitbitData { stepsData = new ArrayList<>((List>) map.get("dataset")); } + /** + * Assegna il valore dei passi + * @param steps i passi + */ public void setSteps(int steps) { this.steps = steps; } + + /** + * I passi totali fatti durante il giorno + * @return i passi totali + */ public int getSteps() { return steps; } + + /** + * Prendi i dati specifici dei passi + * @return una lista contenente una mappa con delle ore e minuti ad un valore del + */ public List> getStepsData() { return stepsData; } } diff --git a/src/main/java/main/SeniorAssistant.java b/src/main/java/main/SeniorAssistant.java index 0b593c8..ab6947c 100644 --- a/src/main/java/main/SeniorAssistant.java +++ b/src/main/java/main/SeniorAssistant.java @@ -15,7 +15,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /** - * Created by 20015159 on 28/08/2018. * Ci si puo' interfacciare con l'assistente tramite Telegram o dal sito di ngrok. */ public class SeniorAssistant { @@ -33,7 +32,6 @@ public class SeniorAssistant { *
    *
  • hueAddress
  • *
  • hueUser
  • - *
  • sensorAddress
  • *
  • autoBrightness
  • *
  • sensorNode
  • *
  • remoteDbUser
  • @@ -41,14 +39,12 @@ public class SeniorAssistant { * @param args i possibili argomenti da passare al programma */ public static void main(String[] args) { - //TODO magari aggiungere un arg con la path per la musica in modo che si possa ampliare in futuro VariousThreads threads = new VariousThreads(); // this should be the first action of the main Map arguments = getArgsMap(args); // list of arguments to use in the classes String hueAddress = arguments.get("hueaddress"); String hueUser = arguments.get("hueuser"); - //TODO GIOVEDI String sensorAddress = arguments.get("sensorAddress"); Integer sensorNode = getInt(arguments.get("sensornode")); String remoteDbUser = arguments.get("remotedbuser"); boolean autoBrightness = arguments.containsKey("autobrightness"); @@ -90,23 +86,6 @@ public class SeniorAssistant { LOG.info("FINE MAIN"); } - /* - AUTOMATIC: - - XXX Gestione DB in modo che si aggiorni ogni ora - XXX Gestione luci in modo che la luminosità sia sempre la stessa - XXX Gestione luci a seconda del battito cardiaco - XXX Ogni X ore/minuti guarda i passi e se sono pochi dillo - XXX Se i battiti sono troppo bassi/alti avvisare il tizio - - USER-INTERACTION: - - XXX Dati del sonno/battito/passi che l'utente puo' richiedere - XXX Gestione luci secondo le esigenze dell'utente ( settare Dialogflow e server + risolvere bug ) - XXX Gestione musica tramite comando vocale //TODO inserire qualche canzone - - */ - /* ------------------------------------------------------------------------------------ Le funzioni qui sotto servono solamente per gli argomenti passati al main ------------------------------------------------------------------------------------ */ diff --git a/src/main/java/main/VariousThreads.java b/src/main/java/main/VariousThreads.java index ac321f2..91c2fb2 100644 --- a/src/main/java/main/VariousThreads.java +++ b/src/main/java/main/VariousThreads.java @@ -45,8 +45,8 @@ public class VariousThreads { * Costruttore */ public VariousThreads() { - // audio = new AudioFile(); se si vuole solamente questo e non YT - audio = System.getProperty("os.name").startsWith("Windows")? new Musich():new AudioFile(); + audio = new AudioFile(); // se si vuole solamente questo e non YT + // audio = System.getProperty("os.name").startsWith("Windows")? new Musich():new AudioFile(); } /** @@ -89,8 +89,6 @@ public class VariousThreads { return null; }); df.addOnAction("StopMusic", (params) -> { audio.stop(); return null; }); - - // TODO GIOVEDI aggiungere un orario magari? se no va bene cosi df.addOnAction("ReqHearthbeat", (params) -> { double rate = fitbit.getHeartRate(60); return "Il battito medio dell'ultima ora e' di "+rate; @@ -196,15 +194,15 @@ public class VariousThreads { } average = count!=0? sum/count:0; - //TODO avvisare con una voce registrata? far partire musica rilassante? double rateNow = fitbit.getHeartRate(minutes); - if (Math.abs(rateNow-average) > delta ) { + if (Math.abs(rateNow-average) > delta ) { // ALTO lights.decreaseBrightness(); - audio.play("Tullio.wav"); + audio.playRandom("relax"); + new AudioFile().play("molti battiti.wav"); } - else if (Math.abs(rateNow-average) < delta) { + else if (Math.abs(rateNow-average) < delta) { // BASSO avvisa ma niente musica lights.increaseBrightness(); - audio.play("Tullio.wav"); + audio.play("pochi battiti.wav"); } } }, minutes, "lights-with-heartbeat"); @@ -219,13 +217,10 @@ public class VariousThreads { * @param database da dove vediamo se si sono fatti abbastanza passi */ public void startCheckSteps(final Database database) { - final int minute = 24 * 60; // ogni ventiquattro ore circa final int norm = 4500; final int delta = 1500; // average steps for 60 year old -> 3.500-5.500 or so they say final Audio audio = new AudioFile(); - // ma la domanda e': ad una certa ora o ad ogni X ore? - // AD UNA DETERMINATA ORA Thread thread = getThreadStartingAt(new Runnable() { @Override public synchronized void run() { @@ -237,20 +232,10 @@ public class VariousThreads { sum += steps.getSteps(); final long average = size!=0? (long)(sum/size):0; - /* Con normale dettata dal tizio e average e' il primo risultato della lista - List list = database.getStepDataOfLast(15); - - //for - - final long norm = size!=0? (long)(sum/size):0; - final long average = size!=0? list.get(0).getSteps():0; - */ - - //TODO avvisare con una voce registrata? if (Math.abs(norm-average) > delta ) - audio.play("Tullio.wav"); + audio.play("molti passi.wav"); else if (Math.abs(norm-average) < delta) - audio.play("Tullio.wav"); + audio.play("pochi passi.wav"); } }, 20, "checking-steps"); diff --git a/src/main/java/support/audio/AudioFile.java b/src/main/java/support/audio/AudioFile.java index 2b78a6d..888ca78 100644 --- a/src/main/java/support/audio/AudioFile.java +++ b/src/main/java/support/audio/AudioFile.java @@ -24,17 +24,17 @@ public class AudioFile implements Audio { /** * L'ultimo audio fatto partire */ - private static AudioStream lastIn = null; + private AudioStream lastIn = null; /** * Serve per crearsi una mapp di tutte le canzoni */ - private Map files = getAllFiles(PATH_AUDIO); + private final static Map files = getAllFiles(PATH_AUDIO); /** * Mappa che serve ad avere per ogni sotto-dir di audio una lista di ogni file audio che c'e' */ - private Map> dirs = getAllDirs(PATH_AUDIO); + private final static Map> dirs = getAllDirs(PATH_AUDIO); /** * Fa partire una canzone che si trova nella cartella audio o in una delle sue sottocartelle @@ -79,7 +79,7 @@ public class AudioFile implements Audio { * @param path la path iniziale * @return una mappa di NomeFile -> File */ - private Map getAllFiles(String path) { + private static Map getAllFiles(String path) { File folder = new File(path); File[] listOfFiles = folder.listFiles(); Map map = new HashMap<>(); @@ -99,7 +99,7 @@ public class AudioFile implements Audio { * @param path la path iniziale * @return una mappa di directory con i loro file */ - private Map> getAllDirs(String path) { + private static Map> getAllDirs(String path) { File folder = new File(path); File[] listOfFiles = folder.listFiles(); List list = new LinkedList<>(); diff --git a/src/main/java/support/audio/Musich.java b/src/main/java/support/audio/Musich.java index bde1791..59fb869 100644 --- a/src/main/java/support/audio/Musich.java +++ b/src/main/java/support/audio/Musich.java @@ -2,6 +2,7 @@ package support.audio; import chrriis.dj.nativeswing.swtimpl.NativeInterface; import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser; +import org.apache.http.annotation.Obsolete; import support.Rest; import javax.swing.*; @@ -16,6 +17,7 @@ import java.util.Map; /** * Classe che serve a far partire un video di youtube in una frame */ +@Deprecated public class Musich implements Audio { /** diff --git a/src/main/java/support/database/Database.java b/src/main/java/support/database/Database.java index 79b2043..945f5b4 100644 --- a/src/main/java/support/database/Database.java +++ b/src/main/java/support/database/Database.java @@ -11,6 +11,9 @@ import java.util.List; import static main.VariousThreads.*; +/** + * Interfaccia per collegarsi al database + */ public interface Database { /** diff --git a/src/main/resources/audio/relax/Marconi Union - Weightless.wav b/src/main/resources/audio/relax/Marconi Union - Weightless.wav new file mode 100644 index 0000000..367b36c Binary files /dev/null and b/src/main/resources/audio/relax/Marconi Union - Weightless.wav differ diff --git a/src/main/resources/audio/relax/Relax Music - Relaxing Sounds of Nature White Noise for Mindfulness Meditation Relaxation Music.wav b/src/main/resources/audio/relax/Relax Music - Relaxing Sounds of Nature White Noise for Mindfulness Meditation Relaxation Music.wav new file mode 100644 index 0000000..9a7d776 Binary files /dev/null and b/src/main/resources/audio/relax/Relax Music - Relaxing Sounds of Nature White Noise for Mindfulness Meditation Relaxation Music.wav differ diff --git a/src/main/resources/audio/relax/Slow down - Paul Collier.wav b/src/main/resources/audio/relax/Slow down - Paul Collier.wav new file mode 100644 index 0000000..4870a67 Binary files /dev/null and b/src/main/resources/audio/relax/Slow down - Paul Collier.wav differ diff --git a/src/main/resources/audio/relax/the xx - Intro.wav b/src/main/resources/audio/relax/the xx - Intro.wav new file mode 100644 index 0000000..bdf126f Binary files /dev/null and b/src/main/resources/audio/relax/the xx - Intro.wav differ