Pre-Final
- Removed all the TODO - Fixed some code - Added missing Docs
This commit is contained in:
@@ -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]: <https://github.com/Berack96>
|
||||
[Giulia]: <https://github.com/Giuliavago>
|
||||
[D]: <https://github.com/DawitG96>
|
||||
|
||||
@@ -51,7 +51,7 @@ public class Fitbit {
|
||||
private final Map<Class<?>, 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:<br>
|
||||
* - la data di quando si e' addormentato<br>
|
||||
* - la durata del sonno<br>
|
||||
* - la data di fine<br>
|
||||
* - la durata del sonno
|
||||
* @return una lista contenente ogni volta che l'utente ha dormito
|
||||
*/
|
||||
public synchronized List<Sleep.SleepData> getDetailedSleep() {
|
||||
|
||||
@@ -68,7 +68,7 @@ public class Hue {
|
||||
/**
|
||||
* Cerca le luci Philips Hue nell'indirizzo specificato e con l'utente specificato.<br>
|
||||
* Una volta trovate le luci le setta tutte alla stessa luminosita' e allo stesso colore<br>
|
||||
* (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<String, Object> state = (Map<String, Object>)allLights.get(name).get("state");
|
||||
bri += (Double) state.get("bri");
|
||||
hue += (Double) state.get("hue");
|
||||
}
|
||||
bri = bri/allLights.size();
|
||||
hue = hue/allLights.size();
|
||||
|
||||
Map<String, Object> 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");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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<String, Object> map) {
|
||||
private void setAverage(Map<String, Object> map) {
|
||||
List<Map> 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; }
|
||||
}
|
||||
|
||||
@@ -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<SleepData> datas;
|
||||
|
||||
public int getMinutesAsleep() {
|
||||
return minutesAsleep;
|
||||
}
|
||||
|
||||
public List<SleepData> getDatas() {
|
||||
return datas;
|
||||
}
|
||||
|
||||
@JsonProperty("summary")
|
||||
public void setMinutesAsleep(Map<String, Object> map) {
|
||||
minutesAsleep = (int) map.get("totalMinutesAsleep");
|
||||
private void setMinutesAsleep(Map<String, Object> map) {
|
||||
minutesAsleep = (long) map.get("totalMinutesAsleep");
|
||||
}
|
||||
|
||||
@JsonProperty("sleep")
|
||||
public void setSleepsList(Map<String, Object>[] array) {
|
||||
private void setSleepsList(Map<String, Object>[] array) {
|
||||
datas = new ArrayList<>();
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
for(Map<String, Object> 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<SleepData> 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) {
|
||||
|
||||
@@ -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<String, Object>>) 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<Map<String, Object>> getStepsData() { return stepsData; }
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
* <ul>
|
||||
* <li>hueAddress</li>
|
||||
* <li>hueUser</li>
|
||||
* <li>sensorAddress</li>
|
||||
* <li>autoBrightness</li>
|
||||
* <li>sensorNode</li>
|
||||
* <li>remoteDbUser</li>
|
||||
@@ -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<String, String> 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
|
||||
------------------------------------------------------------------------------------ */
|
||||
|
||||
@@ -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<Steps> 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");
|
||||
|
||||
@@ -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<String, File> files = getAllFiles(PATH_AUDIO);
|
||||
private final static Map<String, File> 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<String, List<File>> dirs = getAllDirs(PATH_AUDIO);
|
||||
private final static Map<String, List<File>> 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<String, File> getAllFiles(String path) {
|
||||
private static Map<String, File> getAllFiles(String path) {
|
||||
File folder = new File(path);
|
||||
File[] listOfFiles = folder.listFiles();
|
||||
Map<String, File> 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<String, List<File>> getAllDirs(String path) {
|
||||
private static Map<String, List<File>> getAllDirs(String path) {
|
||||
File folder = new File(path);
|
||||
File[] listOfFiles = folder.listFiles();
|
||||
List<File> list = new LinkedList<>();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,6 +11,9 @@ import java.util.List;
|
||||
|
||||
import static main.VariousThreads.*;
|
||||
|
||||
/**
|
||||
* Interfaccia per collegarsi al database
|
||||
*/
|
||||
public interface Database {
|
||||
|
||||
/**
|
||||
|
||||
BIN
src/main/resources/audio/relax/Marconi Union - Weightless.wav
Normal file
BIN
src/main/resources/audio/relax/Marconi Union - Weightless.wav
Normal file
Binary file not shown.
Binary file not shown.
BIN
src/main/resources/audio/relax/Slow down - Paul Collier.wav
Normal file
BIN
src/main/resources/audio/relax/Slow down - Paul Collier.wav
Normal file
Binary file not shown.
BIN
src/main/resources/audio/relax/the xx - Intro.wav
Normal file
BIN
src/main/resources/audio/relax/the xx - Intro.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user