diff --git a/app/lib/main.dart b/app/lib/main.dart index bff144024437ae2f42b7df9fecce02ce0b1142c9..06166efbafb957925fd35e6152f243b5dab59cc9 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,8 +1,11 @@ +import 'dart:js_interop'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; // Import LatLng class from the latlong package import 'dart:async'; import 'dart:io'; +import 'dart:convert'; const String port = "8443"; @@ -27,23 +30,6 @@ class App extends StatelessWidget { } } -// fetchData requests data from the update_map endpoint -Future<void> fetchData() async { - try { - // Custom HTTP client - HttpClient client = HttpClient() - ..badCertificateCallback = // NB: temporary disable SSL certificate validation - (X509Certificate cert, String host, int port) => true; - - var request = await client.getUrl(Uri.parse(serverURI+mapEndpoint)); - var response = await request.close(); - - print('Response status: ${response.statusCode}'); - } catch (e) { - print('Failed to connect to the server: $e'); - } -} - class DefaultPage extends StatefulWidget { const DefaultPage({Key? key}) : super(key: key); @@ -59,26 +45,68 @@ class MarkerData { MarkerData({required this.location, required this.size, required this.color}); } +// parseMarkerData parses jsonData into an object of type MakerData +List<MarkerData> parseMarkerData(String jsonString) { + final parsed = json.decode(jsonString); + return List<MarkerData>.from(parsed.map((data) => MarkerData( + location: LatLng(data['latitude'], data['longitude']), + size: data['size'].toDouble(), + color: parseColor(data['color']), + ))); +} + +Color parseColor(String colorString) { + switch (colorString) { + case 'blue': + return Colors.blue; + case 'red': + return Colors.red; + case 'green': + return Colors.green; + default: + return Colors.black; // Default color if unrecognized + } +} + class _DefaultPageState extends State<DefaultPage> { late Timer _timer; - final List<MarkerData> markerList = [ - MarkerData(location: LatLng(60.7266, 10.9771), size: 50.0, color: Colors.blue), - MarkerData(location: LatLng(60.8366, 10.8171), size: 70.0, color: Colors.red), - MarkerData(location: LatLng(60.7366, 10.8471), size: 60.0, color: Colors.green), - ]; + List<MarkerData> markerList = []; + + // fetchMarkerData requests data from the update_map endpoint + Future<void> fetchMarkerData() async { + try { + // Custom HTTP client + HttpClient client = HttpClient() + ..badCertificateCallback = // NB: temporary disable SSL certificate validation + (X509Certificate cert, String host, int port) => true; + + var request = await client.getUrl(Uri.parse(serverURI+mapEndpoint)); + var response = await request.close(); + + // Parse json response to list of MarkerData objects if request is ok + if (response.statusCode == 200) { + var responseBody = await response.transform(utf8.decoder).join(); + markerList = parseMarkerData(responseBody); + } else { + print('Request failed with status: ${response.statusCode}'); + } + } catch (e) { + print('Failed to connect to the server: $e'); + } + } // Timer initializer @override void initState() { super.initState(); - // Call fetchData when the widget is first created - fetchData(); + // Call fetchMarkerData when the widget is first created + fetchMarkerData(); - // Schedule fetchData to run periodically based on fetchInterval const + // Schedule fetchMarkerData to run periodically based on fetchInterval const const Duration fiveMinutes = Duration(minutes: fetchInterval); _timer = Timer.periodic(fiveMinutes, (timer) { - fetchData(); + fetchMarkerData(); }); } diff --git a/server/__pycache__/consts.cpython-311.pyc b/server/__pycache__/consts.cpython-311.pyc index 3de30302111c2cd3d3561aa908cd47ab136cdbed..9ff52d124944e7e6b5fd6348a75357356a3572d9 100644 Binary files a/server/__pycache__/consts.cpython-311.pyc and b/server/__pycache__/consts.cpython-311.pyc differ diff --git a/server/__pycache__/data_structs.cpython-311.pyc b/server/__pycache__/data_structs.cpython-311.pyc index 637f0e2f98054a92e7adcb5e251233a6d0ad1dbd..8dea98bcfe20ac3a6dcfb4290cc498c0b28974ca 100644 Binary files a/server/__pycache__/data_structs.cpython-311.pyc and b/server/__pycache__/data_structs.cpython-311.pyc differ diff --git a/server/data_structs.py b/server/data_structs.py index b9b8358993b94c6244e9e31560665e23ac38c074..6e289e54101abe911d73f9c6175ba2f1ea87ef0b 100644 --- a/server/data_structs.py +++ b/server/data_structs.py @@ -21,9 +21,17 @@ class DataPoint: self.accuracy = accuracy +# Template for map marker data class MarkerTemplate: - def __init__(self, longitude, latitude, size, color): - self.longitude = longitude + def __init__(self, latitude, longitude, size, color): self.latitude = latitude + self.longitude = longitude self.size = size - self.color = color \ No newline at end of file + self.color = color + def to_dict(self): + return { + 'latitude': self.latitude, + 'longitude': self.longitude, + 'size': self.size, + 'color': self.color + } \ No newline at end of file diff --git a/server/main.py b/server/main.py index 06f19b3298012852308a642eb0f2313e2ab3c06b..97253949bb348a70b72262b5eb0e1c6a663edd7c 100644 --- a/server/main.py +++ b/server/main.py @@ -3,8 +3,7 @@ from http.server import HTTPServer, BaseHTTPRequestHandler from pymongo import MongoClient from pymongo.server_api import ServerApi from consts import DB_NAME, COLLECTION, MONGO_URI, MONGO_CERT_PATH, SSL_CERT_PATH, SSL_KEY_PATH, HOST, PORT -from map.extract_coordinates import extract_coordinates -from data_structs import DataPoint +from map.get_markers import get_markers import atexit import ssl @@ -32,16 +31,14 @@ class IceHTTP(BaseHTTPRequestHandler): self.end_headers() self.wfile.write(b"Root path hit!") elif self.path == '/update_map': - # Get response from process_data_point - response, status_code = extract_coordinates() - - # Send the response - self.send_response(status_code) + # Send the response with a status code (e.g., 200 for success) + self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() - # Write response data to the response - self.wfile.write(response.get_data()) + # Write the JSON data directly to the response + markers_data = get_markers() + self.wfile.write(markers_data.encode('utf-8')) elif self.path == '/test_endpoint': self.send_response(200) diff --git a/server/map/__pycache__/get_markers.cpython-311.pyc b/server/map/__pycache__/get_markers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b2fcc46f8cf164508bc3de6dd6af98c1ca63601 Binary files /dev/null and b/server/map/__pycache__/get_markers.cpython-311.pyc differ diff --git a/server/map/get_markers.py b/server/map/get_markers.py index dc632c004204d9b15aac9c6fbc18ae8ce1cc239e..f59ca2b4941c28df79d0450d713596da3c95e208 100644 --- a/server/map/get_markers.py +++ b/server/map/get_markers.py @@ -1,4 +1,10 @@ +import os +import sys +current_dir = os.path.dirname(__file__) +parent_dir = os.path.abspath(os.path.join(current_dir, '..')) +sys.path.append(parent_dir) from data_structs import MarkerTemplate +from flask import json def get_markers(): testData = [