diff --git a/client/package-lock.json b/client/package-lock.json index 6d3dfbd..364665c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -18,6 +18,7 @@ "deg2rad": "^1.0.0", "expo": "^52.0.7", "expo-location": "^18.0.2", + "expo-speech": "~13.0.1", "expo-status-bar": "~2.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -9191,6 +9192,15 @@ "invariant": "^2.2.4" } }, + "node_modules/expo-speech": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/expo-speech/-/expo-speech-13.0.1.tgz", + "integrity": "sha512-J7tvFzORsFpIKihMnayeY5lCPc15giDrlN+ws2uUNo0MvLv1HCYEu/5p3+aMmZXXsY5I1QlconD4CwRWw3JFig==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-status-bar": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.0.0.tgz", diff --git a/client/package.json b/client/package.json index 3cb41ad..f4fb30d 100644 --- a/client/package.json +++ b/client/package.json @@ -39,7 +39,8 @@ "react-native-safe-area-context": "4.12.0", "react-native-screens": "~4.0.0", "react-native-svg": "15.8.0", - "react-native-websocket": "^1.0.2" + "react-native-websocket": "^1.0.2", + "expo-speech": "~13.0.1" }, "devDependencies": { "@babel/core": "^7.26.9", diff --git a/client/src/DisplayRoute.js b/client/src/DisplayRoute.js index ce9d897..f6c34fc 100644 --- a/client/src/DisplayRoute.js +++ b/client/src/DisplayRoute.js @@ -3,6 +3,7 @@ import React, { useEffect, useState, useCallback } from 'react'; import { View, Text, Alert, TouchableOpacity, Switch } from 'react-native'; import MapView, { Polyline, Marker } from 'react-native-maps'; +import * as Speech from 'expo-speech'; import { haversine, startLocationTracking } from './utils/mapUtils'; import displayRouteStyles from './components/styles/DisplayRoute.styles'; @@ -53,6 +54,10 @@ export default function DisplayRouteScreen({ navigation, route }) { }; }, [devMode, checkProximityAndUpdate]); + useEffect(() => { + Speech.speak(currentInstruction); + }, [currentInstruction]); + function removeHtmlTags(instruction) { return instruction.replace(/<\/?[^>]+(>|$)/g, ''); } diff --git a/server/src/main.py b/server/src/main.py index 51858d3..ba22958 100644 --- a/server/src/main.py +++ b/server/src/main.py @@ -30,8 +30,9 @@ def __init__(self): self.weather_api = weatherAPI() self.networking = Networking(self.app, self.logger) self.preferences_logic = Preferences(self.app, self.logger) - self.signup_logic = Signup(self.app, self.logger, - self.preferences_logic) + self.signup_logic = Signup( + self.app, self.logger, self.preferences_logic + ) wayfinding_router = wayfinding_router_setup( preferences_logic=self.preferences_logic, diff --git a/server/src/preferences.py b/server/src/preferences.py index ce91ce9..b2a33a6 100644 --- a/server/src/preferences.py +++ b/server/src/preferences.py @@ -25,22 +25,28 @@ async def set_Preferences(request: userPersonalizedSettings): self.db_handle_preferences(request) return {"message": "Successfully saved user preferences"} + return {"message": "Successfully saved user preferences"} + def db_handle_preferences(self, request): db = DataBase() db.connect_db() dict = request.request_into_dictionary() + for key, val in dict.items(): db.update_entry( "user_personalized_settings", dict["username"], key, val + "user_personalized_settings", dict["username"], key, val ) self.logger.info("User preferences updated in the database") db.close_con() + def db_initialise_preferences(self, username): db = DataBase() db.connect_db() + dict = { "username": username, "bike": False, @@ -71,9 +77,16 @@ def db_get_preferences(self, username): tollsPref = db.search_entry( "user_personalized_settings", username, "tolls" ) + motorwayPref = db.search_entry( + "user_personalized_settings", username, "motorways" + ) + tollsPref = db.search_entry( + "user_personalized_settings", username, "tolls" + ) self.logger.info("User preferences retrieved from database") print("preferences retrieved from db", motorwayPref, tollsPref) db.close_con() + return { return { "motorways": motorwayPref, "tolls": tollsPref, @@ -96,6 +109,7 @@ class userPersonalizedSettings(BaseModel): def request_into_dictionary(self): return { + "username": self.username, "username": self.username, "bike": self.bike, "private_vehicle": self.privateVehicle, diff --git a/server/src/signup.py b/server/src/signup.py index a8fc474..9edce33 100644 --- a/server/src/signup.py +++ b/server/src/signup.py @@ -9,8 +9,9 @@ class Signup: - def __init__(self, api, logger: logging.Logger, - preferences_logic: Preferences): + def __init__( + self, api, logger: logging.Logger, preferences_logic: Preferences + ): self.app = api self.logger = logger self.preferences = preferences_logic diff --git a/server/src/wayfinding.py b/server/src/wayfinding.py index 72ed471..34feba7 100644 --- a/server/src/wayfinding.py +++ b/server/src/wayfinding.py @@ -11,6 +11,7 @@ router = APIRouter() logger = logging.getLogger("test_logger") +preferences = Preferences(api=app, logger=logger) @router.post("/wayfinding/get_routes") @@ -74,9 +75,10 @@ def get_routes_with_preferences( "alternatives": str(alternatives).lower(), "key": GOOGLE_MAPS_API_KEY, "username": username, - "avoid": toAvoid + "avoid": toAvoid, } response = requests.get(url, params=parameters) return response.json() + return router