From cdf62a624c945f49771fc4e64f5b9d692299305a Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 21:13:16 -0500 Subject: [PATCH 01/48] test scripts for gps --- hardware/gpsPi/gps-serial.bash | 2 ++ hardware/gpsPi/setup.bash | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 hardware/gpsPi/gps-serial.bash create mode 100644 hardware/gpsPi/setup.bash diff --git a/hardware/gpsPi/gps-serial.bash b/hardware/gpsPi/gps-serial.bash new file mode 100644 index 00000000..66c453e0 --- /dev/null +++ b/hardware/gpsPi/gps-serial.bash @@ -0,0 +1,2 @@ +stty -F /dev/serial0 raw 9600 cs8 clocal -cstopb +cat /dev/serial0 \ No newline at end of file diff --git a/hardware/gpsPi/setup.bash b/hardware/gpsPi/setup.bash new file mode 100644 index 00000000..b4fdfe7b --- /dev/null +++ b/hardware/gpsPi/setup.bash @@ -0,0 +1,11 @@ +# get gpsd +sudo apt-get update +sudo apt-get install gpsd gpsd-clients python-gps + +# disable the gpsd systemd service +sudo systemctl stop gpsd.socket +sudo systemctl disable gpsd.socket + +# enable the gpsd systemd service +# sudo systemctl enable gpsd.socket +# sudo systemctl start gpsd.socket \ No newline at end of file From a54d8d9b40887a87d0c83781037395a552db1cf9 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 21:15:30 -0500 Subject: [PATCH 02/48] test scripts for gps --- hardware/gpsPi/{gps-serial.bash => gps-serial.sh} | 0 hardware/gpsPi/{setup.bash => setup.sh} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename hardware/gpsPi/{gps-serial.bash => gps-serial.sh} (100%) rename hardware/gpsPi/{setup.bash => setup.sh} (100%) diff --git a/hardware/gpsPi/gps-serial.bash b/hardware/gpsPi/gps-serial.sh similarity index 100% rename from hardware/gpsPi/gps-serial.bash rename to hardware/gpsPi/gps-serial.sh diff --git a/hardware/gpsPi/setup.bash b/hardware/gpsPi/setup.sh similarity index 100% rename from hardware/gpsPi/setup.bash rename to hardware/gpsPi/setup.sh From 0d32f5569c90b2ee5584b7513a21c91af2c9218f Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 22:30:16 -0500 Subject: [PATCH 03/48] add gpsmon functionality --- hardware/gpsPi/gpsmon.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 hardware/gpsPi/gpsmon.sh diff --git a/hardware/gpsPi/gpsmon.sh b/hardware/gpsPi/gpsmon.sh new file mode 100644 index 00000000..aa18dbc3 --- /dev/null +++ b/hardware/gpsPi/gpsmon.sh @@ -0,0 +1,3 @@ +# run gpsmon +sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock +gpsmon /dev/seri0l0 \ No newline at end of file From a27538b8812db8351819edbb6c7555c745f41990 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 22:32:18 -0500 Subject: [PATCH 04/48] typo fixed --- hardware/gpsPi/gpsmon.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/gpsPi/gpsmon.sh b/hardware/gpsPi/gpsmon.sh index aa18dbc3..ed45b268 100644 --- a/hardware/gpsPi/gpsmon.sh +++ b/hardware/gpsPi/gpsmon.sh @@ -1,3 +1,3 @@ # run gpsmon sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock -gpsmon /dev/seri0l0 \ No newline at end of file +gpsmon /dev/serial0 \ No newline at end of file From 0e1f6db92caa31dad51e8e0ff350f494dda766e7 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 23:36:26 -0500 Subject: [PATCH 05/48] attempting to print raw GPS NMEA sentences --- hardware/gpsPi/gps-reader.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 hardware/gpsPi/gps-reader.py diff --git a/hardware/gpsPi/gps-reader.py b/hardware/gpsPi/gps-reader.py new file mode 100644 index 00000000..611eafc4 --- /dev/null +++ b/hardware/gpsPi/gps-reader.py @@ -0,0 +1,10 @@ +import serial + +GPS = serial.Serial('/dev/serial0', 9600) + +while True: + while GPS.inWaiting() == 0: + pass + + NMEA = GPS.readline() + print(NMEA) From 836525d0ca954e77b6541b14bf0b85fa3e0e96cd Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 18 Apr 2020 23:53:48 -0500 Subject: [PATCH 06/48] iterative change --- hardware/gpsPi/gps-reader.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hardware/gpsPi/gps-reader.py b/hardware/gpsPi/gps-reader.py index 611eafc4..ecc6c132 100644 --- a/hardware/gpsPi/gps-reader.py +++ b/hardware/gpsPi/gps-reader.py @@ -1,10 +1,14 @@ import serial -GPS = serial.Serial('/dev/serial0', 9600) +# want GPRMC and GPGGA +# GPRMC universal coordinated time + + +gps = serial.Serial('/dev/serial0', 9600) while True: - while GPS.inWaiting() == 0: + while gps.inWaiting() == 0: pass - NMEA = GPS.readline() - print(NMEA) + nmeaSentence = gps.readline().split(",") + print(nmeaSentence) From 34b26fc0bf0f6cdfdf07a62ca67243a5d0f3770b Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sun, 19 Apr 2020 00:10:32 -0500 Subject: [PATCH 07/48] iterative change --- hardware/gpsPi/gps-reader.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/hardware/gpsPi/gps-reader.py b/hardware/gpsPi/gps-reader.py index ecc6c132..b493ffb5 100644 --- a/hardware/gpsPi/gps-reader.py +++ b/hardware/gpsPi/gps-reader.py @@ -11,4 +11,28 @@ pass nmeaSentence = gps.readline().split(",") - print(nmeaSentence) + nmeaType = nmeaSentence[0] + + if nmeaType == "$GPRMC": + latitude_hours = float(nmeaSentence[3].split(".")[0]) + latitude_minutes = float(nmeaSentence[3].split(".")[1]) + longitude_hours = float(nmeaSentence[5].split(".")[0]) + longitude_minutes = float(nmeaSentence[5].split(".")[1]) + + latitude_decimal = latitude_hours + latitude_minutes / 60 + longitude_decimal = longitude_hours + longitude_minutes / 60 + + latitude_dir = nmeaSentence[4] + longitude_dir = nmeaSentence[6] + + if latitude_dir == "S": + latitude_decimal = latitude_decimal * -1 + if longitude_dir == "W": + longitude_decimal = longitude_decimal * -1 + + print(latitude_decimal) + print(longitude_decimal) + print("") + + + # print(nmeaSentence) From 3e8f8a525aaf039f186ed4da198ba6da58af2963 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sun, 19 Apr 2020 00:14:36 -0500 Subject: [PATCH 08/48] iterative change --- hardware/gpsPi/gps-reader.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hardware/gpsPi/gps-reader.py b/hardware/gpsPi/gps-reader.py index b493ffb5..9b5a49e4 100644 --- a/hardware/gpsPi/gps-reader.py +++ b/hardware/gpsPi/gps-reader.py @@ -14,10 +14,10 @@ nmeaType = nmeaSentence[0] if nmeaType == "$GPRMC": - latitude_hours = float(nmeaSentence[3].split(".")[0]) - latitude_minutes = float(nmeaSentence[3].split(".")[1]) - longitude_hours = float(nmeaSentence[5].split(".")[0]) - longitude_minutes = float(nmeaSentence[5].split(".")[1]) + latitude_hours = float(nmeaSentence[3][0:2]) + latitude_minutes = float(nmeaSentence[3][2:]) + longitude_hours = float(nmeaSentence[5][0:3]) + longitude_minutes = float(nmeaSentence[5][3:]) latitude_decimal = latitude_hours + latitude_minutes / 60 longitude_decimal = longitude_hours + longitude_minutes / 60 From 90e0c5c5e93b49070220153438cafe610c5b5264 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Sun, 19 Apr 2020 19:25:04 -0400 Subject: [PATCH 09/48] added missing transceiver test --- hardware/tests/test_radio_transceiver.py | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/hardware/tests/test_radio_transceiver.py b/hardware/tests/test_radio_transceiver.py index 397f1a12..95af8b6e 100644 --- a/hardware/tests/test_radio_transceiver.py +++ b/hardware/tests/test_radio_transceiver.py @@ -6,6 +6,7 @@ from serial.tools.list_ports_common import ListPortInfo import os +import json import serial from hardware.CommunicationsPi.radio_transceiver import Transceiver @@ -687,3 +688,49 @@ def test_listen_invalid(self, mock_port_list, mock_serial): ("LOG_FILE", "INFO", "Opening serial on: usb"), ("LOG_FILE", "ERROR", ""), ) + + @patch.object(json, "loads") + @patch("serial.Serial") + @patch("serial.tools.list_ports.comports") + def test_listen_exception(self, mock_port_list, mock_serial, mock_json): + """ + tests the listen method with invalid input + """ + port = ListPortInfo() + port.vid = "vid" + port.pid = "pid" + port.manufacturer = "Microsoft" + port.serial_number = "456" + port.interface = "usb" + port.device = "usb" + + mock_json.side_effect = Exception("ex") + + mock_port_list.return_value = [port] + + test_input = "{'value': 'value'}" + with patch.dict( + os.environ, + { + "LOG_DIRECTORY": self.temp_dir.path, + "RADIO_TRANSMITTER_PORT": "usb", + "LOG_FILE": "logger.txt", + "TRANSCEIVER_BAUDRATE": "9600", + "TRANSCEIVER_TIMEOUT": "1", + }, + ): + with LogCapture() as capture: + transceiver = Transceiver(log_file_name="LOG_FILE") + + mock_receiver = MagicMock() + mock_receiver.readline.return_value.decode.return_value = test_input + transceiver.serial = mock_receiver + + with self.assertRaises(Exception): + transceiver.listen() + + capture.check( + ("LOG_FILE", "INFO", "Port device found: usb"), + ("LOG_FILE", "INFO", "Opening serial on: usb"), + ("LOG_FILE", "ERROR", "error occurred: ex"), + ) From 1bd1ca3bc2019eb7fc578bfe166460d01dd1080c Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Mon, 20 Apr 2020 18:06:34 -0400 Subject: [PATCH 10/48] Send timezone-aware date string --- hardware/SensorPi/sense_pi.py | 4 ++-- hardware/SensorPi/sensehat_reader.py | 13 +++++++------ hardware/SensorPi/tests.py | 12 ++++++++++++ hardware/SensorPi/utils.py | 5 +++++ 4 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 hardware/SensorPi/tests.py create mode 100644 hardware/SensorPi/utils.py diff --git a/hardware/SensorPi/sense_pi.py b/hardware/SensorPi/sense_pi.py index d3c3a23c..df42fd89 100644 --- a/hardware/SensorPi/sense_pi.py +++ b/hardware/SensorPi/sense_pi.py @@ -1,6 +1,6 @@ import os -from datetime import datetime from hardware.Utils.utils import get_logger, get_sensor_keys +from utils import date_str_with_current_timezone # Conditional import for sense hat and emulator try: @@ -57,7 +57,7 @@ def factory(self, type): data["values"] = {} data["values"][key] = sensor_data[key] - data["date"] = str(datetime.now()) + data["date"] = date_str_with_current_timezone() return data def get_all(self): diff --git a/hardware/SensorPi/sensehat_reader.py b/hardware/SensorPi/sensehat_reader.py index 5376c3e8..d4063eba 100644 --- a/hardware/SensorPi/sensehat_reader.py +++ b/hardware/SensorPi/sensehat_reader.py @@ -1,6 +1,7 @@ from sense_hat import SenseHat import json -from datetime import datetime +from utils import date_str_with_current_timezone + TEMPERATURE_ID = 6 PRESSURE_ID = 7 @@ -12,7 +13,7 @@ def temperature(): sense = SenseHat() temperature = sense.get_temperature() - date = str(datetime.now()) + date = date_str_with_current_timezone() data = {} data["sensor_id"] = TEMPERATURE_ID data["values"] = {"temperature": temperature} @@ -24,7 +25,7 @@ def temperature(): def pressure(): sense = SenseHat() pressure = sense.get_pressure() - date = str(datetime.now()) + date = date_str_with_current_timezone() data = {} data["sensor_id"] = PRESSURE_ID data["values"] = {"pressure": pressure} @@ -36,7 +37,7 @@ def pressure(): def humidity(): sense = SenseHat() humidity = sense.get_humidity() - date = str(datetime.now()) + date = date_str_with_current_timezone() data = {} data["sensor_id"] = HUMIDITY_ID data["values"] = {"humidity": humidity} @@ -48,7 +49,7 @@ def humidity(): def acceleration(): sense = SenseHat() acceleration = sense.get_accelerometer_raw() - date = str(datetime.now()) + date = date_str_with_current_timezone() data = {} data["sensor_id"] = ACCELERATION_ID data["values"] = { @@ -64,7 +65,7 @@ def acceleration(): def orientation(): sense = SenseHat() orientation = sense.get_orientation() - date = str(datetime.now()) + date = date_str_with_current_timezone() data = {} data["sensor_id"] = ORIENTATION_ID data["values"] = { diff --git a/hardware/SensorPi/tests.py b/hardware/SensorPi/tests.py new file mode 100644 index 00000000..8d722360 --- /dev/null +++ b/hardware/SensorPi/tests.py @@ -0,0 +1,12 @@ +import unittest +from .utils import date_str_with_current_timezone +from datetime import datetime +import dateutil.parser + + +class TestUtil(unittest.TestCase): + def test_date_str_with_current_timezone(self): + s = date_str_with_current_timezone() + date = dateutil.parser.isoparse(s) + self.assertTrue("T" in s) + self.assertAlmostEqual(date.timestamp(), datetime.now().timestamp(), places=1) diff --git a/hardware/SensorPi/utils.py b/hardware/SensorPi/utils.py new file mode 100644 index 00000000..1c4d3b0b --- /dev/null +++ b/hardware/SensorPi/utils.py @@ -0,0 +1,5 @@ +from datetime import datetime, timezone + + +def date_str_with_current_timezone(): + return datetime.now(timezone.utc).astimezone().isoformat() From 929ba2c125044be35aa90beb8edc73cfbe3ff175 Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Mon, 20 Apr 2020 20:17:25 -0400 Subject: [PATCH 11/48] Move data_str_with_current_timezone to Utils module --- hardware/SensorPi/sense_pi.py | 7 +++++-- hardware/SensorPi/sensehat_reader.py | 2 +- hardware/{SensorPi => Utils}/tests.py | 0 hardware/Utils/utils.py | 6 ++++++ 4 files changed, 12 insertions(+), 3 deletions(-) rename hardware/{SensorPi => Utils}/tests.py (100%) diff --git a/hardware/SensorPi/sense_pi.py b/hardware/SensorPi/sense_pi.py index df42fd89..a77a7a00 100644 --- a/hardware/SensorPi/sense_pi.py +++ b/hardware/SensorPi/sense_pi.py @@ -1,6 +1,9 @@ import os -from hardware.Utils.utils import get_logger, get_sensor_keys -from utils import date_str_with_current_timezone +from hardware.Utils.utils import ( + get_logger, + get_sensor_keys, + date_str_with_current_timezone, +) # Conditional import for sense hat and emulator try: diff --git a/hardware/SensorPi/sensehat_reader.py b/hardware/SensorPi/sensehat_reader.py index d4063eba..a4a690f9 100644 --- a/hardware/SensorPi/sensehat_reader.py +++ b/hardware/SensorPi/sensehat_reader.py @@ -1,6 +1,6 @@ from sense_hat import SenseHat import json -from utils import date_str_with_current_timezone +from hardware.Utils.utils import date_str_with_current_timezone TEMPERATURE_ID = 6 diff --git a/hardware/SensorPi/tests.py b/hardware/Utils/tests.py similarity index 100% rename from hardware/SensorPi/tests.py rename to hardware/Utils/tests.py diff --git a/hardware/Utils/utils.py b/hardware/Utils/utils.py index 18af3909..7fe53ee8 100644 --- a/hardware/Utils/utils.py +++ b/hardware/Utils/utils.py @@ -1,5 +1,7 @@ import os import json +from datetime import datetime, timezone + from .logger import Logger SENSOR_KEYS = { @@ -25,3 +27,7 @@ def get_logger(key, file_name=None): file_name = key logger = Logger(name=key, filename=os.environ[file_name]) return logger + + +def date_str_with_current_timezone(): + return datetime.now(timezone.utc).astimezone().isoformat() From 50648d4380d8bfe0ab41e1d303f874461e4d5591 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Mon, 20 Apr 2020 22:26:39 -0400 Subject: [PATCH 12/48] added comm_pi tests --- hardware/CommunicationsPi/comm_pi.py | 8 +++-- hardware/tests/test_comm_pi.py | 48 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 hardware/tests/test_comm_pi.py diff --git a/hardware/CommunicationsPi/comm_pi.py b/hardware/CommunicationsPi/comm_pi.py index 36968e0b..17e00aaf 100644 --- a/hardware/CommunicationsPi/comm_pi.py +++ b/hardware/CommunicationsPi/comm_pi.py @@ -1,10 +1,12 @@ from http.server import BaseHTTPRequestHandler from hardware.CommunicationsPi.radio_transceiver import Transceiver -transceiver = Transceiver() - class CommPi(BaseHTTPRequestHandler): + def __init__(self, *args, **kwargs): + self.transceiver = Transceiver() + super().__init__(*args, **kwargs) + def _set_response(self): self.send_response(200) self.send_header("Content-type", "text/html") @@ -23,5 +25,5 @@ def do_POST(self): self.wfile.write("POST request for {}".format(self.path).encode("utf-8")) def send_data(self, payload): - transceiver.send(payload) + self.transceiver.send(payload) return diff --git a/hardware/tests/test_comm_pi.py b/hardware/tests/test_comm_pi.py new file mode 100644 index 00000000..ee531e3e --- /dev/null +++ b/hardware/tests/test_comm_pi.py @@ -0,0 +1,48 @@ +from django.test import SimpleTestCase + +# from json.decoder import JSONDecodeError +from http.server import HTTPServer + +from unittest import mock + +import threading +import socket +import requests + +from hardware.CommunicationsPi.comm_pi import CommPi + + +def get_free_port(): + s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM) + s.bind(("localhost", 0)) + address, port = s.getsockname() + s.close() + return port + + +class CommPiTests(SimpleTestCase): + def setUp(self): + self.mock_server_port = get_free_port() + self.mock_server = HTTPServer(("localhost", self.mock_server_port), CommPi) + + self.mock_server_thread = threading.Thread( + target=self.mock_server.serve_forever + ) + self.mock_server_thread.setDaemon(True) + self.mock_server_thread.start() + + @mock.patch("hardware.CommunicationsPi.comm_pi.Transceiver") + def test_get(self, mock_transceiver=mock.MagicMock()): + url = f"http://localhost:{self.mock_server_port}/" + response = requests.get(url) + + self.assertTrue(response.ok) + self.assertTrue(response.headers.get("Content-Type") == "text/html") + + @mock.patch("hardware.CommunicationsPi.comm_pi.Transceiver") + def test_post(self, mock_transceiver=mock.MagicMock()): + + mock_transceiver.return_value.send = mock.MagicMock() + url = f"http://localhost:{self.mock_server_port}/" + requests.post(url, data={"key": "value"}, headers={"Content-Length": "15"}) + mock_transceiver.return_value.send.assert_called() From 3b448a32921bd62109a78156a91987d58242e5b5 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Tue, 21 Apr 2020 00:37:17 -0400 Subject: [PATCH 13/48] added lan server tests --- hardware/CommunicationsPi/lan_server.py | 23 +++-- hardware/tests/test_lan_server.py | 123 ++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 hardware/tests/test_lan_server.py diff --git a/hardware/CommunicationsPi/lan_server.py b/hardware/CommunicationsPi/lan_server.py index 6877c17a..fba0ee1e 100644 --- a/hardware/CommunicationsPi/lan_server.py +++ b/hardware/CommunicationsPi/lan_server.py @@ -3,19 +3,21 @@ from http.server import BaseHTTPRequestHandler, HTTPServer from hardware.Utils.utils import get_logger -log = get_logger("LAN_SERVER_LOG_FILE") - class Server(BaseHTTPRequestHandler): + def __init__(self, *args, **kwargs): + self.log = get_logger("LAN_SERVER_LOG_FILE") + super().__init__(*args, **kwargs) + def _set_response(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() def do_GET(self): - global log + # global log - log.info( + self.log.info( "GET request,\nPath: %s\nHeaders:\n%s\n" + str(self.path) + str(self.headers) @@ -24,19 +26,19 @@ def do_GET(self): self.wfile.write("GET request for {}".format(self.path).encode("utf-8")) def do_POST(self): - global log + # global log content_length = int( self.headers["Content-Length"] ) # <--- Gets the size of data post_data = self.rfile.read(content_length) # <--- Gets the data itself - log.info( + self.log.info( "POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n" + str(self.path) + str(self.headers) + post_data.decode("utf-8") ) - log.info("data: " + str(post_data)) + self.log.info("data: " + str(post_data)) self._set_response() self.wfile.write("POST request for {}".format(self.path).encode("utf-8")) @@ -45,7 +47,12 @@ def do_POST(self): def runServer( server_class=HTTPServer, handler_class=Server, log_file_name=None, port=None ): - global log + # global log + log = ( + get_logger("LAN_SERVER_LOG_FILE") + if log_file_name is None + else get_logger(log_file_name) + ) log = ( get_logger("LAN_SERVER_LOG_FILE") if log_file_name is None diff --git a/hardware/tests/test_lan_server.py b/hardware/tests/test_lan_server.py new file mode 100644 index 00000000..6c77163c --- /dev/null +++ b/hardware/tests/test_lan_server.py @@ -0,0 +1,123 @@ +from django.test import SimpleTestCase +from http.server import HTTPServer +from testfixtures import LogCapture, TempDirectory + +from unittest import mock + +import threading +import socket +import requests +import os + +from hardware.CommunicationsPi.lan_server import Server # , runServer + + +def get_free_port(): + s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM) + s.bind(("localhost", 0)) + address, port = s.getsockname() + s.close() + return port + + +class LanServerTests(SimpleTestCase): + def setUp(self): + self.temp_dir = TempDirectory() + self.mock_server_port = get_free_port() + self.mock_server = HTTPServer(("localhost", self.mock_server_port), Server) + + self.mock_server_thread = threading.Thread( + target=self.mock_server.serve_forever + ) + self.mock_server_thread.setDaemon(True) + self.mock_server_thread.start() + + def tearDown(self): + self.temp_dir.cleanup() + + def test_get(self, mock_transceiver=mock.MagicMock()): + with mock.patch.dict( + os.environ, + {"LAN_SERVER_LOG_FILE": "logger.txt", "LOG_DIRECTORY": self.temp_dir.path}, + ): + with LogCapture() as capture: + url = f"http://localhost:{self.mock_server_port}/" + response = requests.get(url) + + self.assertTrue(response.ok) + self.assertTrue(response.headers.get("Content-Type") == "text/html") + + capture.check( + ( + "urllib3.connectionpool", + "DEBUG", + f"Starting new HTTP connection (1): localhost:{self.mock_server_port}", + ), + ( + "LAN_SERVER_LOG_FILE", + "INFO", + "GET request,\n" + "Path: %s\n" + "Headers:\n" + "%s\n" + f"/Host: localhost:{self.mock_server_port}\n" + "User-Agent: python-requests/2.23.0\n" + "Accept-Encoding: gzip, deflate\n" + "Accept: */*\n" + "Connection: keep-alive\n" + "\n", + ), + ( + "urllib3.connectionpool", + "DEBUG", + f'http://localhost:{self.mock_server_port} "GET / HTTP/1.1" 200 None', + ), + ) + + def test_post(self, mock_transceiver=mock.MagicMock()): + with mock.patch.dict( + os.environ, + {"LAN_SERVER_LOG_FILE": "logger.txt", "LOG_DIRECTORY": self.temp_dir.path}, + ): + with LogCapture() as capture: + url = f"http://localhost:{self.mock_server_port}/" + response = requests.post( + url, data={"key": "value"}, headers={"Content-Length": "15"} + ) + + self.assertTrue(response.ok) + self.assertTrue(response.headers.get("Content-Type") == "text/html") + + capture.check( + ( + "urllib3.connectionpool", + "DEBUG", + f"Starting new HTTP connection (1): localhost:{self.mock_server_port}", + ), + ( + "LAN_SERVER_LOG_FILE", + "INFO", + "POST request,\n" + "Path: %s\n" + "Headers:\n" + "%s\n" + "\n" + "Body:\n" + "%s\n" + f"/Host: localhost:{self.mock_server_port}\n" + "User-Agent: python-requests/2.23.0\n" + "Accept-Encoding: gzip, deflate\n" + "Accept: */*\n" + "Connection: keep-alive\n" + "Content-Length: 9\n" + "Content-Type: application/x-www-form-urlencoded\n" + "\n" + "key=value", + ), + ("LAN_SERVER_LOG_FILE", "INFO", "data: b'key=value'"), + ( + "urllib3.connectionpool", + "DEBUG", + f'http://localhost:{self.mock_server_port} "POST / HTTP/1.1" 200 None', + ), + ) From 908633534c9e723d7234d3e3c041c1a9bfba98f0 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Tue, 21 Apr 2020 00:56:03 -0400 Subject: [PATCH 14/48] added runServer method tests --- hardware/CommunicationsPi/lan_server.py | 5 --- hardware/tests/test_lan_server.py | 49 ++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/hardware/CommunicationsPi/lan_server.py b/hardware/CommunicationsPi/lan_server.py index fba0ee1e..6fe9a91f 100644 --- a/hardware/CommunicationsPi/lan_server.py +++ b/hardware/CommunicationsPi/lan_server.py @@ -53,11 +53,6 @@ def runServer( if log_file_name is None else get_logger(log_file_name) ) - log = ( - get_logger("LAN_SERVER_LOG_FILE") - if log_file_name is None - else get_logger(log_file_name, log_file_name) - ) port = int(os.environ["LAN_PORT"]) if port is None else port diff --git a/hardware/tests/test_lan_server.py b/hardware/tests/test_lan_server.py index 6c77163c..4c41d4fd 100644 --- a/hardware/tests/test_lan_server.py +++ b/hardware/tests/test_lan_server.py @@ -9,7 +9,7 @@ import requests import os -from hardware.CommunicationsPi.lan_server import Server # , runServer +from hardware.CommunicationsPi.lan_server import Server, runServer def get_free_port(): @@ -121,3 +121,50 @@ def test_post(self, mock_transceiver=mock.MagicMock()): f'http://localhost:{self.mock_server_port} "POST / HTTP/1.1" 200 None', ), ) + + +class RunServerTests(SimpleTestCase): + def setUp(self): + self.temp_dir = TempDirectory() + + def tearDown(self): + self.temp_dir.cleanup() + + def test_run_server(self): + with mock.patch.dict( + os.environ, + { + "LAN_SERVER_LOG_FILE": "logger.txt", + "LOG_DIRECTORY": self.temp_dir.path, + "LAN_PORT": "0000", + }, + ): + with LogCapture() as capture: + mock_server = mock.MagicMock() + mock_server.return_value.server_forever = mock.MagicMock() + mock_handler = mock.MagicMock() + + runServer(mock_server, mock_handler) + + capture.check( + ("LAN_SERVER_LOG_FILE", "INFO", "Starting server on port: 0"), + ("LAN_SERVER_LOG_FILE", "INFO", "Stopping\n"), + ) + + +# def test_interrupt(self): +# with mock.patch.dict(os.environ, { +# "LAN_SERVER_LOG_FILE": "logger.txt", +# "LOG_DIRECTORY": self.temp_dir.path, +# "LAN_PORT": "0000" +# }): +# with LogCapture() as capture: +# mock_server = mock.MagicMock() +# mock_server.return_value.server_forever.side_effect = KeyboardInterrupt +# mock_handler = mock.MagicMock() + +# with self.assertRaises(KeyboardInterrupt): +# runServer(mock_server, mock_handler) + +# capture.check(('LAN_SERVER_LOG_FILE', 'INFO', 'Starting server on port: 0'), +# ('LAN_SERVER_LOG_FILE', 'INFO', 'Stopping\n')) From a6b1826dc9bd7d150781cc71d8ec92267cb5d56e Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Tue, 21 Apr 2020 00:59:23 -0400 Subject: [PATCH 15/48] removed dead code --- hardware/CommunicationsPi/lan_server.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/hardware/CommunicationsPi/lan_server.py b/hardware/CommunicationsPi/lan_server.py index 6fe9a91f..8d1ed695 100644 --- a/hardware/CommunicationsPi/lan_server.py +++ b/hardware/CommunicationsPi/lan_server.py @@ -15,7 +15,6 @@ def _set_response(self): self.end_headers() def do_GET(self): - # global log self.log.info( "GET request,\nPath: %s\nHeaders:\n%s\n" @@ -26,7 +25,6 @@ def do_GET(self): self.wfile.write("GET request for {}".format(self.path).encode("utf-8")) def do_POST(self): - # global log content_length = int( self.headers["Content-Length"] @@ -47,7 +45,6 @@ def do_POST(self): def runServer( server_class=HTTPServer, handler_class=Server, log_file_name=None, port=None ): - # global log log = ( get_logger("LAN_SERVER_LOG_FILE") if log_file_name is None From 39488fc8fec37f08a3f65e6b374827c2bb411223 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Mon, 20 Apr 2020 23:48:01 -0400 Subject: [PATCH 16/48] added lan_client tests --- hardware/CommunicationsPi/lan_client.py | 6 +- hardware/tests/test_lan_client.py | 194 ++++++++++++++++++++++++ 2 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 hardware/tests/test_lan_client.py diff --git a/hardware/CommunicationsPi/lan_client.py b/hardware/CommunicationsPi/lan_client.py index 5e5b9476..79e65663 100644 --- a/hardware/CommunicationsPi/lan_client.py +++ b/hardware/CommunicationsPi/lan_client.py @@ -18,7 +18,7 @@ def __init__(self, log_file_name=None, lan_server_url=None): self.url = lan_server_url def get_server_url_from_env(self): - protocol = "https" if os.environ["LAN_SERVER_HTTPS"] else "http" + protocol = "https" if os.environ.get("LAN_SERVER_HTTPS") else "http" ip = os.environ["LAN_SERVER_IP"] port = os.environ["LAN_PORT"] @@ -34,7 +34,7 @@ def ping_lan_server(self, payload): try: self.logging.info("data: " + json.dumps(payload)) - response = requests.post(self.url, data=json.dumps(payload)) + response = requests.post(self.url, data=payload) response.raise_for_status() return response @@ -46,4 +46,4 @@ def ping_lan_server(self, payload): except Exception as err: self.logging.error("error occurred: {}".format(str(err))) raise - return + # return unreachable return diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py new file mode 100644 index 00000000..7b7fea09 --- /dev/null +++ b/hardware/tests/test_lan_client.py @@ -0,0 +1,194 @@ +from django.test import SimpleTestCase +from unittest.mock import patch, MagicMock +from testfixtures import TempDirectory, LogCapture +from requests.exceptions import HTTPError + +import os +import json + +from hardware.CommunicationsPi.lan_client import LANClient +from hardware.Utils.logger import Logger + + +class LanClientTests(SimpleTestCase): + def setUp(self): + self.temp_dir = TempDirectory() + + def tearDown(self): + self.temp_dir.cleanup() + + def test_init_no_log_no_server(self): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + l_client = LANClient() + + self.assertTrue(l_client.logging is not None) + self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertIsInstance(l_client.logging, Logger) + + self.assertEqual(l_client.url, "https://0.0.0.0:0") + + def test_init_no_log_no_server_http(self): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + l_client = LANClient() + + self.assertTrue(l_client.logging is not None) + self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertIsInstance(l_client.logging, Logger) + + self.assertEqual(l_client.url, "http://0.0.0.0:0") + + def test_init_no_log_server(self): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + l_client = LANClient(lan_server_url="/url") + + self.assertTrue(l_client.logging is not None) + self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertIsInstance(l_client.logging, Logger) + + self.assertEqual(l_client.url, "/url") + + def test_init_log_no_server(self): + with patch.dict( + os.environ, + { + "NEW_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + l_client = LANClient(log_file_name="NEW_LOG_FILE") + + self.assertTrue(l_client.logging is not None) + self.assertTrue(l_client.logging.name == "NEW_LOG_FILE") + self.assertIsInstance(l_client.logging, Logger) + + self.assertEqual(l_client.url, "https://0.0.0.0:0") + + def test_init_log_server(self): + with patch.dict( + os.environ, + { + "NEW_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + l_client = LANClient(log_file_name="NEW_LOG_FILE", lan_server_url="/url") + + self.assertTrue(l_client.logging is not None) + self.assertTrue(l_client.logging.name == "NEW_LOG_FILE") + self.assertIsInstance(l_client.logging, Logger) + + self.assertEqual(l_client.url, "/url") + + @patch("hardware.CommunicationsPi.lan_client.requests") + def test_ping_server(self, mock_requests): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + with LogCapture() as capture: + l_client = LANClient() + mock_requests.post = MagicMock() + + payload = "{'key':'value'}" + + l_client.ping_lan_server(payload) + + mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) + capture.check( + ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ) + + @patch("hardware.CommunicationsPi.lan_client.requests") + def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + with LogCapture() as capture: + l_client = LANClient() + mock_requests.post.side_effect = HTTPError("HTTPError") + + payload = "{'key':'value'}" + + with self.assertRaises(HTTPError): + l_client.ping_lan_server(payload) + + mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) + capture.check( + ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ("LAN_CLIENT_LOG_FILE", "ERROR", "HTTP error occurred: HTTPError"), + ) + + @patch("hardware.CommunicationsPi.lan_client.requests") + def test_ping_server_raise_ex(self, mock_requests=MagicMock()): + with patch.dict( + os.environ, + { + "LAN_CLIENT_LOG_FILE": "lan_client.log", + "LOG_DIRECTORY": "logs", + "LAN_SERVER_HTTPS": "True", + "LAN_SERVER_IP": "0.0.0.0", + "LAN_PORT": "0", + }, + ): + with LogCapture() as capture: + l_client = LANClient() + mock_requests.post.side_effect = Exception("Exception") + + payload = "{'key':'value'}" + + with self.assertRaises(Exception): + l_client.ping_lan_server(payload) + + mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) + capture.check( + ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ("LAN_CLIENT_LOG_FILE", "ERROR", "error occurred: Exception"), + ) From b5b3e1f2fad8e5556d3a355a3dbfae60099174e3 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Mon, 20 Apr 2020 23:52:01 -0400 Subject: [PATCH 17/48] minor touch ups --- hardware/tests/test_lan_client.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py index 7b7fea09..9fef3eab 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_lan_client.py @@ -112,7 +112,7 @@ def test_init_log_server(self): self.assertEqual(l_client.url, "/url") @patch("hardware.CommunicationsPi.lan_client.requests") - def test_ping_server(self, mock_requests): + def test_ping_server(self, mock_requests=MagicMock()): with patch.dict( os.environ, { @@ -125,7 +125,6 @@ def test_ping_server(self, mock_requests): ): with LogCapture() as capture: l_client = LANClient() - mock_requests.post = MagicMock() payload = "{'key':'value'}" From 710e8c877a04db2ba813f2b4b5222ca22f09a964 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Tue, 21 Apr 2020 00:39:53 -0400 Subject: [PATCH 18/48] added lan_client tests --- hardware/tests/test_lan_client.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py index 9fef3eab..14b8061f 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_lan_client.py @@ -22,7 +22,7 @@ def test_init_no_log_no_server(self): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -41,7 +41,7 @@ def test_init_no_log_no_server_http(self): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, @@ -59,7 +59,7 @@ def test_init_no_log_server(self): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -78,7 +78,7 @@ def test_init_log_no_server(self): os.environ, { "NEW_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -97,7 +97,7 @@ def test_init_log_server(self): os.environ, { "NEW_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -117,7 +117,7 @@ def test_ping_server(self, mock_requests=MagicMock()): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -142,7 +142,7 @@ def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", @@ -170,7 +170,7 @@ def test_ping_server_raise_ex(self, mock_requests=MagicMock()): os.environ, { "LAN_CLIENT_LOG_FILE": "lan_client.log", - "LOG_DIRECTORY": "logs", + "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", From cdc64c8d812bf6cab72d5f9601b005b9c851c968 Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Tue, 21 Apr 2020 14:13:25 -0400 Subject: [PATCH 19/48] Delete an unused file --- hardware/SensorPi/utils.py | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 hardware/SensorPi/utils.py diff --git a/hardware/SensorPi/utils.py b/hardware/SensorPi/utils.py deleted file mode 100644 index 1c4d3b0b..00000000 --- a/hardware/SensorPi/utils.py +++ /dev/null @@ -1,5 +0,0 @@ -from datetime import datetime, timezone - - -def date_str_with_current_timezone(): - return datetime.now(timezone.utc).astimezone().isoformat() From 97f0bd604ed8643c31ed9c7efce3fa85b04688f9 Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Tue, 21 Apr 2020 14:17:38 -0400 Subject: [PATCH 20/48] Move tests to hardware/tests/tests_utils.py --- hardware/Utils/tests.py | 12 ------------ hardware/tests/test_utils.py | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 hardware/Utils/tests.py diff --git a/hardware/Utils/tests.py b/hardware/Utils/tests.py deleted file mode 100644 index 8d722360..00000000 --- a/hardware/Utils/tests.py +++ /dev/null @@ -1,12 +0,0 @@ -import unittest -from .utils import date_str_with_current_timezone -from datetime import datetime -import dateutil.parser - - -class TestUtil(unittest.TestCase): - def test_date_str_with_current_timezone(self): - s = date_str_with_current_timezone() - date = dateutil.parser.isoparse(s) - self.assertTrue("T" in s) - self.assertAlmostEqual(date.timestamp(), datetime.now().timestamp(), places=1) diff --git a/hardware/tests/test_utils.py b/hardware/tests/test_utils.py index 316a2b85..0be4692d 100644 --- a/hardware/tests/test_utils.py +++ b/hardware/tests/test_utils.py @@ -4,8 +4,14 @@ from testfixtures import TempDirectory from logging import INFO import os - -from hardware.Utils.utils import get_logger, get_serial_stream +from datetime import datetime +import dateutil.parser + +from hardware.Utils.utils import ( + get_logger, + get_serial_stream, + date_str_with_current_timezone, +) from hardware.Utils.logger import Logger @@ -36,3 +42,9 @@ def test_serial_stream(self): stream, b'{"id": 5, "value": {"value_a_name": 15.0, "value_b_name": 26.5, "value_c_name": 13.3}}\n', ) + + def test_date_str_with_current_timezone(self): + s = date_str_with_current_timezone() + date = dateutil.parser.isoparse(s) + self.assertTrue("T" in s) + self.assertAlmostEqual(date.timestamp(), datetime.now().timestamp(), places=1) From f680be1eb9769d2259799fb55d4f44e0781e7877 Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Tue, 21 Apr 2020 14:30:01 -0400 Subject: [PATCH 21/48] Add stringtype=unspecified to the template --- symmetricds/template/engine0.properties | 6 ++++-- symmetricds/template/engine1.properties | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/symmetricds/template/engine0.properties b/symmetricds/template/engine0.properties index 7f20093b..19f01cc5 100644 --- a/symmetricds/template/engine0.properties +++ b/symmetricds/template/engine0.properties @@ -11,8 +11,10 @@ db.user=postgres db.password= # https://jdbc.postgresql.org/documentation/80/connect.html -# db.url=jdbc:postgresql://localhost:5432/mercury -db.url=jdbc:postgresql://localhost:5432/mercury +# db.url=jdbc:postgresql://localhost:5432/mercury?stringtype=unspecified +# +# Set stringtype=unspecified to synchronize json fields. Otherwise postgres assumes varchar by default. +db.url=jdbc:postgresql://localhost:5432/mercury?stringtype=unspecified diff --git a/symmetricds/template/engine1.properties b/symmetricds/template/engine1.properties index a92885d2..b8f57bca 100644 --- a/symmetricds/template/engine1.properties +++ b/symmetricds/template/engine1.properties @@ -13,9 +13,10 @@ registration.url= # 3. Your configuration would be: # db.user= # db.password= -# db.url=jdbc:postgresql://?sslmode=require - -# Please make sure your db.url starts with "jdbc:postgresql://" and you appended "?sslmode=require" at the end. +# db.url=jdbc:postgresql://?sslmode=require&stringtype=unspecified +# +# Please make sure your db.url starts with "jdbc:postgresql://" and you appended "?sslmode=require&stringtype=unspecified" at the end. +# Set stringtype=unspecified to synchronize json fields. Otherwise postgres assumes varchar by default. db.user= db.password= From fa263e8ffeeeb3878f0406c29fcea4d21bc64256 Mon Sep 17 00:00:00 2001 From: Yonguk Jeong Date: Tue, 21 Apr 2020 14:58:17 -0400 Subject: [PATCH 22/48] Update README.md --- symmetricds/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/symmetricds/README.md b/symmetricds/README.md index 0dd03abc..1c79b496 100644 --- a/symmetricds/README.md +++ b/symmetricds/README.md @@ -60,10 +60,11 @@ postgres://:@ ``` db.user= db.password= -db.url=jdbc:postgresql://?sslmode=require +db.url=jdbc:postgresql://?sslmode=require&stringtype=unspecified ``` -Please make sure your db.url starts with `jdbc:postgresql://` and you appended `?sslmode=require` at the end. +Please make sure your db.url starts with `jdbc:postgresql://` and you appended `?sslmode=require&stringtype=unspecified` at the end. +To synchronize json fields, you should set `stringtype=unspecified`. Otherwise postgres assumes `varchar` by default. [Link](https://jdbc.postgresql.org/documentation/head/connect.html) For example, given the following output, ``` @@ -77,7 +78,7 @@ Your `engine1.properties` should be like: ``` db.user=abcdeabcdefghi db.password=11d804e1c01111a9c111114fcc528753829a314c30cc51938f4192979102c12 -db.url=jdbc:postgresql://ec2-1-000-00-000.compute-2.amazonaws.com:5432/948f928kjfjv827?sslmode=require +db.url=jdbc:postgresql://ec2-1-000-00-000.compute-2.amazonaws.com:5432/948f928kjfjv827?sslmode=require&stringtype=unspecified ``` ### Step 3 From 28fbdeaab61cb4d5f1de4ae53636392f078b9f53 Mon Sep 17 00:00:00 2001 From: Yashasvi Dadhe Date: Tue, 21 Apr 2020 16:22:23 -0400 Subject: [PATCH 23/48] Created module for gps reader --- hardware/env | 3 +++ hardware/gpsPi/__init__.py | 0 hardware/gpsPi/gps_reader.py | 45 ++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 hardware/gpsPi/__init__.py create mode 100644 hardware/gpsPi/gps_reader.py diff --git a/hardware/env b/hardware/env index 5b260057..69a4eaa9 100644 --- a/hardware/env +++ b/hardware/env @@ -10,3 +10,6 @@ LAN_SERVER_LOG_FILE=lan_server.log LAN_CLIENT_LOG_FILE=lan_client.log PORT_LOG_FILE=port.log SENSE_HAT_LOG_FILE=sense_hat.log +GPS_BAUDRATE=9600 +GPS_PORT=/dev/serial0 +GPS_LOG_FILE=gps_reader.log diff --git a/hardware/gpsPi/__init__.py b/hardware/gpsPi/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hardware/gpsPi/gps_reader.py b/hardware/gpsPi/gps_reader.py new file mode 100644 index 00000000..0a36dcf5 --- /dev/null +++ b/hardware/gpsPi/gps_reader.py @@ -0,0 +1,45 @@ +import os +import serial +from ..Utils.utils import get_logger + + +class GPSReader: + def __init__(self, log_file_name=None): + self.gps = serial.Serial(os.environ["GPS_PORT"], os.environ["GPS_BAUDRATE"]) + + if log_file_name is None: + self.logging = get_logger("GPS_LOG_FILE") + else: + self.logging = get_logger(log_file_name, log_file_name) + + def get_geolocation(self): + while self.gps.inWaiting() == 0: + pass + + nmeaSentence = self.gps.readline().split(",") + nmeaType = nmeaSentence[0] + + # Added additional check to verify if nmeaSentence has valid data + if nmeaType == "$GPRMC" and nmeaSentence[2] == "A": + latitude_hours = float(nmeaSentence[3][0:2]) + latitude_minutes = float(nmeaSentence[3][2:]) + longitude_hours = float(nmeaSentence[5][0:3]) + longitude_minutes = float(nmeaSentence[5][3:]) + + latitude_decimal = latitude_hours + latitude_minutes / 60 + longitude_decimal = longitude_hours + longitude_minutes / 60 + + latitude_dir = nmeaSentence[4] + longitude_dir = nmeaSentence[6] + + if latitude_dir == "S": + latitude_decimal = latitude_decimal * -1 + if longitude_dir == "W": + longitude_decimal = longitude_decimal * -1 + + self.logging.info("latitude_decimal: " + latitude_decimal) + self.logging.info("longitude_decimal: " + longitude_decimal) + + # print(latitude_decimal) + # print(longitude_decimal) + # print("") From d7508ad9d8507eb2750681c5a94844349632473c Mon Sep 17 00:00:00 2001 From: Yashasvi Dadhe Date: Tue, 21 Apr 2020 16:59:06 -0400 Subject: [PATCH 24/48] Resolved black and flake8 errors --- hardware/gpsPi/gps-reader.py | 38 ------------------------------------ 1 file changed, 38 deletions(-) delete mode 100644 hardware/gpsPi/gps-reader.py diff --git a/hardware/gpsPi/gps-reader.py b/hardware/gpsPi/gps-reader.py deleted file mode 100644 index 9b5a49e4..00000000 --- a/hardware/gpsPi/gps-reader.py +++ /dev/null @@ -1,38 +0,0 @@ -import serial - -# want GPRMC and GPGGA -# GPRMC universal coordinated time - - -gps = serial.Serial('/dev/serial0', 9600) - -while True: - while gps.inWaiting() == 0: - pass - - nmeaSentence = gps.readline().split(",") - nmeaType = nmeaSentence[0] - - if nmeaType == "$GPRMC": - latitude_hours = float(nmeaSentence[3][0:2]) - latitude_minutes = float(nmeaSentence[3][2:]) - longitude_hours = float(nmeaSentence[5][0:3]) - longitude_minutes = float(nmeaSentence[5][3:]) - - latitude_decimal = latitude_hours + latitude_minutes / 60 - longitude_decimal = longitude_hours + longitude_minutes / 60 - - latitude_dir = nmeaSentence[4] - longitude_dir = nmeaSentence[6] - - if latitude_dir == "S": - latitude_decimal = latitude_decimal * -1 - if longitude_dir == "W": - longitude_decimal = longitude_decimal * -1 - - print(latitude_decimal) - print(longitude_decimal) - print("") - - - # print(nmeaSentence) From 51600e3191f4772dec378eb69214b03c284b3189 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Tue, 21 Apr 2020 19:02:43 -0400 Subject: [PATCH 25/48] Fixed radio transceiver bug --- hardware/CommunicationsPi/radio_transceiver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/CommunicationsPi/radio_transceiver.py b/hardware/CommunicationsPi/radio_transceiver.py index 5c17baa9..3e791b56 100644 --- a/hardware/CommunicationsPi/radio_transceiver.py +++ b/hardware/CommunicationsPi/radio_transceiver.py @@ -42,7 +42,7 @@ def __init__(self, log_file_name=None, port=None): parity = serial.PARITY_NONE stopbits = serial.STOPBITS_ONE bytesize = serial.EIGHTBITS - timeout = os.environ["TRANSCEIVER_TIMEOUT"] + timeout = int(os.environ["TRANSCEIVER_TIMEOUT"]) self.logging.info("Opening serial on: " + str(self.port)) self.serial = serial.Serial( From fc6f35dadd2bc053374f246a52c25e630643a8e8 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Tue, 21 Apr 2020 19:28:01 -0400 Subject: [PATCH 26/48] Added env vars and fixes --- hardware/CommunicationsPi/radio_transceiver.py | 10 +++++----- hardware/env | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/hardware/CommunicationsPi/radio_transceiver.py b/hardware/CommunicationsPi/radio_transceiver.py index 3e791b56..42c484c6 100644 --- a/hardware/CommunicationsPi/radio_transceiver.py +++ b/hardware/CommunicationsPi/radio_transceiver.py @@ -31,11 +31,11 @@ def __init__(self, log_file_name=None, port=None): ), {}, ) - self.port_vid = port_info.vid - self.port_pid = port_info.pid - self.port_vendor = port_info.manufacturer - self.port_intf = port_info.interface - self.port_serial_number = port_info.serial_number + self.port_vid = port_info.vid if 'vid' in port_info else None + self.port_pid = port_info.pid if 'pid' in port_info else None + self.port_vendor = port_info.manufacturer if 'manufacturer' in port_info else None + self.port_intf = port_info.interface if 'interface' in port_info else None + self.port_serial_number = port_info.serial_number if 'serial_number' in port_info else None self.find_port() baudrate = os.environ["TRANSCEIVER_BAUDRATE"] diff --git a/hardware/env b/hardware/env index c090a32e..2ec2057c 100644 --- a/hardware/env +++ b/hardware/env @@ -1,7 +1,9 @@ PI_TYPE=commPi RADIO_TRANSMITTER_PORT=/dev/ttyUSB0 RADIO_RECEIVER_PORT=/dev/ttyUSB0 -LAN_SERVER_HTTPS=False +ENABLE_INTERNET_TRANSMISSION=False +ENABLE_RADIO_TRANSMISSION=True +LAN_SERVER_HTTPS= LAN_SERVER_IP=169.254.187.204 LAN_PORT=3322 EMULATE_SENSE_HAT=True From b083283502dc2d074cb4e64ca363e96d03c5c129 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Tue, 21 Apr 2020 19:30:15 -0500 Subject: [PATCH 27/48] added GPSReader functionality to main control file --- hardware/gpsPi/gps_reader.py | 18 ++++++++++++++++-- hardware/main.py | 9 ++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/hardware/gpsPi/gps_reader.py b/hardware/gpsPi/gps_reader.py index 0a36dcf5..e884f6bc 100644 --- a/hardware/gpsPi/gps_reader.py +++ b/hardware/gpsPi/gps_reader.py @@ -1,6 +1,9 @@ import os import serial from ..Utils.utils import get_logger +from hardware.Utils.utils import date_str_with_current_timezone + +GPS_ID = 10 class GPSReader: @@ -37,8 +40,19 @@ def get_geolocation(self): if longitude_dir == "W": longitude_decimal = longitude_decimal * -1 - self.logging.info("latitude_decimal: " + latitude_decimal) - self.logging.info("longitude_decimal: " + longitude_decimal) + self.logging.info("latitude_decimal: " + str(latitude_decimal)) + self.logging.info("longitude_decimal: " + str(longitude_decimal)) + + data = {} + data["sensor_id"] = GPS_ID + data["values"] = { + "latitude": latitude_decimal, + "longitude": longitude_decimal, + } + data["date"] = date_str_with_current_timezone() + return data + else: + return None # print(latitude_decimal) # print(longitude_decimal) diff --git a/hardware/main.py b/hardware/main.py index 4aec3c0c..8c1c756d 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -5,6 +5,7 @@ from hardware.CommunicationsPi.lan_server import runServer from hardware.CommunicationsPi.lan_client import LANClient from hardware.SensorPi.sense_pi import SensePi +from hardware.gpsPi.gps_reader import GPSReader if os.environ["PI_TYPE"] == "commPi": print("CommunicationsPi") @@ -12,6 +13,7 @@ else: print("SensePi") sensePi = SensePi() + gpsPi = GPSReader() client = LANClient() while True: @@ -21,8 +23,13 @@ acc = sensePi.get_acceleration() orie = sensePi.get_orientation() all = sensePi.get_all() + coords = gpsPi.get_geolocation() - data = [temp, pres, hum, acc, orie, all] + if coords is not None: + data = [temp, pres, hum, acc, orie, coords, all] + else: + data = [temp, pres, hum, acc, orie, all] + for i in data: print(i) try: From 3bd8091ffb624bca493c082be1b9d14bb4dcd790 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Tue, 21 Apr 2020 19:30:56 -0500 Subject: [PATCH 28/48] added GPSReader functionality to main control file --- hardware/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/main.py b/hardware/main.py index 8c1c756d..96ff2732 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -29,7 +29,7 @@ data = [temp, pres, hum, acc, orie, coords, all] else: data = [temp, pres, hum, acc, orie, all] - + for i in data: print(i) try: From de7b5dcb09d8a42bb51e43aa290f776a2ddd0fcb Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Wed, 22 Apr 2020 10:13:59 -0400 Subject: [PATCH 29/48] removed unused code --- hardware/CommunicationsPi/find_port.py | 143 --------------- hardware/tests/test_find_port.py | 238 ------------------------- 2 files changed, 381 deletions(-) delete mode 100644 hardware/CommunicationsPi/find_port.py delete mode 100644 hardware/tests/test_find_port.py diff --git a/hardware/CommunicationsPi/find_port.py b/hardware/CommunicationsPi/find_port.py deleted file mode 100644 index 92ceb2e0..00000000 --- a/hardware/CommunicationsPi/find_port.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python3 -import sys -import argparse -import serial -import serial.tools.list_ports - -from hardware.Utils.utils import get_logger - - -def is_usb_serial(port, args): - if port.vid is None: - return False - if hasattr(args, "vid") and args.vid is not None: - if port.vid is not args.vid: - return False - if hasattr(args, "pid") and args.pid is not None: - if port.pid is not args.pid: - return False - if hasattr(args, "vendor") and args.vendor is not None: - if not port.manufacturer.startswith(args.vendor): - return False - if hasattr(args, "serial") and args.serial is not None: - if not port.serial_number.startswith(args.serial): - return False - if hasattr(args, "intf") and args.intf is not None: - if port.interface is None or args.intf not in port.interface: - return False - return True - - -def extra_info(port): - extra_items = [] - if port.manufacturer: - extra_items.append("vendor '{}'".format(port.manufacturer)) - if port.serial_number: - extra_items.append("serial '{}'".format(port.serial_number)) - if port.interface: - extra_items.append("intf '{}'".format(port.interface)) - if extra_items: - return " with " + " ".join(extra_items) - return "" - - -def get_port(): - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, None): - return "port found" - return - - -def main(): - """The main program.""" - parser = argparse.ArgumentParser( - prog="find-port.py", - usage="%(prog)s [options] [command]", - description="Find the /dev/tty port for a USB Serial devices", - ) - parser.add_argument( - "-l", - "--list", - dest="list", - action="store_true", - help="List USB Serial devices currently connected", - ) - parser.add_argument( - "-s", - "--serial", - dest="serial", - help="Only show devices with the indicated serial number", - default=None, - ) - parser.add_argument( - "-n", - "--vendor", - dest="vendor", - help="Only show devices with the indicated vendor name", - default=None, - ) - parser.add_argument( - "--pid", - dest="pid", - action="store", - help="Only show device with indicated PID", - default=None, - ) - parser.add_argument( - "-v", - "--verbose", - dest="verbose", - action="store_true", - help="Turn on verbose messages", - default=False, - ) - parser.add_argument( - "--vid", - dest="vid", - action="store", - help="Only show device with indicated VID", - default=None, - ) - parser.add_argument( - "-i", - "--intf", - dest="intf", - action="store", - help="Shows devices which conatin the indicated interface string", - default=None, - ) - args = parser.parse_args(sys.argv[1:]) - - logger = get_logger("PORT_LOGGER", file_name="PORT_LOG_FILE") - - if args.verbose: - logger.info("pyserial version = {}".format(serial.__version__)) - logger.info(f" vid = {args.vid}") - logger.info(f" pid = {args.pid}") - logger.info(f"serial = {args.serial}") - logger.info(f"vendor = {args.vendor}") - - if args.list: - detected = False - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, args): - logger.info( - "USB Serial Device {:04x}:{:04x}{} found @{}\r".format( - port.vid, port.pid, extra_info(port), port.device - ) - ) - detected = True - if not detected: - logger.warn("No USB Serial devices detected.\r") - return - - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, args): - logger.info(port) - logger.info(port.device) - return - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/hardware/tests/test_find_port.py b/hardware/tests/test_find_port.py deleted file mode 100644 index 4e6fca90..00000000 --- a/hardware/tests/test_find_port.py +++ /dev/null @@ -1,238 +0,0 @@ -from django.test import SimpleTestCase - -from unittest import mock -from serial.tools.list_ports_common import ListPortInfo -from argparse import Namespace - -from hardware.CommunicationsPi.find_port import is_usb_serial, extra_info, get_port - - -class IsUsbSerialTests(SimpleTestCase): - """ - Tests for the is_usb_serial function - """ - - def test_port_vid_empty(self): - """ - insures that the is_serial_usb function retunrs false - if the port.vid param is empty - """ - port = ListPortInfo() - port.vid = None - args = Namespace() - args.vid = None - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_vid_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["vid"] is not empty - and port["vid"] doesn't equal args["vid"] - """ - port = ListPortInfo() - port.vid = "foo" - args = Namespace() - args.vid = "bar" - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_pid_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["pid"] is not empty - and port["[id"] doesn't equal args["vid"] - """ - port = ListPortInfo() - args = Namespace() - port.vid = "bar" - port.pid = "foo" - - args.vid = None - args.pid = "bar" - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_vendor_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["vendor"] is not empty - and port["manufacturer"] doesn't start with args["vendor"] - """ - port, args = ListPortInfo(), Namespace() - port.vid = "bar" - port.pid = "foo" - port.manufacturer = "Apple" - - args.vid = None - args.pid = None - args.vendor = "Microsoft" - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_serial_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["serial"] is not empty - and port["serial_number"] doesn't start with args["serial"] - """ - port, args = ListPortInfo(), Namespace() - - port.vid = "bar" - port.pid = "foo" - port.manufacturer = "Apple" - port.serial_number = "456" - - args.vid = None - args.pid = None - args.vendor = None - args.serial = "123" - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_intf_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["serial"] is not empty - and port["interface"] is none - """ - port, args = ListPortInfo(), Namespace() - - port.vid = "bar" - port.pid = "foo" - port.manufacturer = "Apple" - port.serial_number = "456" - port.interface = None - - args.vid = None - args.pid = None - args.vendor = None - args.serial = None - args.intf = "foo" - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_args_intf_not_empty_interface_not_empty(self): - """ - checks to make sure that the is_serial_usb function - exists correctly when the args["serial"] is not empty - and port["interface"] is different than args["serial"] - """ - port, args = ListPortInfo(), Namespace() - - port.vid = "bar" - port.pid = "foo" - port.manufacturer = "Apple" - port.serial_number = "456" - port.interface = "bar" - - args.vid = None - args.pid = None - args.vendor = None - args.serial = None - args.intf = "foo" - - response = is_usb_serial(port, args) - self.assertFalse(response) - - def test_pass(self): - """ - insure that is_serial_usb returns true if all test cases haven't - failed - """ - port, args = ListPortInfo(), Namespace() - - port.vid = "bar" - port.pid = "foo" - port.manufacturer = "Apple" - port.serial_number = "456" - port.interface = "bar" - - args.vid = None - args.pid = None - args.vendor = None - args.serial = None - args.intf = None - - response = is_usb_serial(port, args) - self.assertTrue(response) - - -class ExtraInfoTests(SimpleTestCase): - def test_manufacturer(self): - """ - insure that the manufacturer is added to the - extra_items list if it is present in port - """ - port = ListPortInfo() - port.manufacturer = "Microsoft" - - response = extra_info(port) - self.assertTrue(port.manufacturer in response) - - def test_no_matches(self): - """ - insure that extra_info returns the empty string if - none of the keys match - """ - port = ListPortInfo() - port.foo = "bar" - - self.assertTrue(extra_info(port) == "") - - def test_serial_number(self): - """ - insure that the serial_number is added to the - extra_items list if it is present in port - """ - port = ListPortInfo() - port.serial_number = "123" - - response = extra_info(port) - self.assertTrue(port.serial_number in response) - - def test_interface(self): - """ - insure that the interface is added to the - extra_items list if it is present in port - """ - port = ListPortInfo() - port.interface = "123interface" - - response = extra_info(port) - self.assertTrue(port.interface in response) - - -class GetPortTests(SimpleTestCase): - @mock.patch("serial.tools.list_ports.comports") - def test_get_port_match(self, port_mocks): - - port = ListPortInfo() - port.vid = "vid" - port.pid = None - port.manufacturer = None - port.serial_number = None - port.interface = None - port.device = "usb" - - port_mocks.return_value = [port] - self.assertTrue("port found" in get_port()) - - @mock.patch("serial.tools.list_ports.comports") - def test_get_port_empty(self, port_mocks): - - port = ListPortInfo() - port.vid = None - port.pid = None - port.manufacturer = None - port.serial_number = None - port.interface = None - port.device = "usb" - - port_mocks.return_value = [port] - self.assertIsNone(get_port()) From af47affba5cbd49e8582bbd5a9c1936ebf9306e7 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Thu, 23 Apr 2020 23:26:11 -0400 Subject: [PATCH 30/48] fixed lan client issue and add show logs to env --- hardware/CommunicationsPi/lan_client.py | 3 +-- hardware/Utils/logger.py | 2 +- hardware/env | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hardware/CommunicationsPi/lan_client.py b/hardware/CommunicationsPi/lan_client.py index 79e65663..1df6c15c 100644 --- a/hardware/CommunicationsPi/lan_client.py +++ b/hardware/CommunicationsPi/lan_client.py @@ -33,7 +33,7 @@ def ping_lan_server(self, payload): self.logging.info("Pinging") try: - self.logging.info("data: " + json.dumps(payload)) + self.logging.info("data: " + payload) response = requests.post(self.url, data=payload) response.raise_for_status() return response @@ -46,4 +46,3 @@ def ping_lan_server(self, payload): except Exception as err: self.logging.error("error occurred: {}".format(str(err))) raise - # return unreachable return diff --git a/hardware/Utils/logger.py b/hardware/Utils/logger.py index 00dec5e9..af28ee9d 100644 --- a/hardware/Utils/logger.py +++ b/hardware/Utils/logger.py @@ -30,7 +30,7 @@ def __init__( self.logger.addHandler(self.console_logger) # show logs on screen - self.showLogsOnScreen = show_logs + self.showLogsOnScreen = show_logs or os.environ.get('SHOW_LOGS') def get_logger_file(self, file_name): d = os.environ["LOG_DIRECTORY"] diff --git a/hardware/env b/hardware/env index 2ec2057c..0ce0e69c 100644 --- a/hardware/env +++ b/hardware/env @@ -1,4 +1,5 @@ PI_TYPE=commPi +SHOW_LOGS=True RADIO_TRANSMITTER_PORT=/dev/ttyUSB0 RADIO_RECEIVER_PORT=/dev/ttyUSB0 ENABLE_INTERNET_TRANSMISSION=False From 5ae2753885098923cde225969c69ce1fb8e18928 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Thu, 23 Apr 2020 23:50:02 -0400 Subject: [PATCH 31/48] Added sensor keys and commpi transmission env vars --- hardware/CommunicationsPi/comm_pi.py | 8 +++++++- hardware/main.py | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/hardware/CommunicationsPi/comm_pi.py b/hardware/CommunicationsPi/comm_pi.py index 17e00aaf..0c7cfff6 100644 --- a/hardware/CommunicationsPi/comm_pi.py +++ b/hardware/CommunicationsPi/comm_pi.py @@ -1,3 +1,5 @@ +import os +import json from http.server import BaseHTTPRequestHandler from hardware.CommunicationsPi.radio_transceiver import Transceiver @@ -25,5 +27,9 @@ def do_POST(self): self.wfile.write("POST request for {}".format(self.path).encode("utf-8")) def send_data(self, payload): - self.transceiver.send(payload) + if os.environ.get('ENABLE_INTERNET_TRANSMISSION'): + print('transmit via internet') + if os.environ.get('ENABLE_RADIO_TRANSMISSION'): + print('transmit via radio') + self.transceiver.send(payload) return diff --git a/hardware/main.py b/hardware/main.py index 4aec3c0c..0c225a0d 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -5,13 +5,24 @@ from hardware.CommunicationsPi.lan_server import runServer from hardware.CommunicationsPi.lan_client import LANClient from hardware.SensorPi.sense_pi import SensePi +from hardware.Utils.utils import ( + get_sensor_keys, +) + if os.environ["PI_TYPE"] == "commPi": print("CommunicationsPi") runServer(handler_class=CommPi) else: print("SensePi") - sensePi = SensePi() + sensor_keys = get_sensor_keys() + sensor_ids = {} + sensor_ids[sensor_keys["TEMPERATURE"]] = 2 + sensor_ids[sensor_keys["PRESSURE"]] = 3 + sensor_ids[sensor_keys["HUMIDITY"]] = 4 + sensor_ids[sensor_keys["ACCELERATION"]] = 5 + sensor_ids[sensor_keys["ORIENTATION"]] = 6 + sensePi = SensePi(sensor_ids=sensor_ids) client = LANClient() while True: @@ -24,9 +35,10 @@ data = [temp, pres, hum, acc, orie, all] for i in data: - print(i) + payload = json.dumps(i) + print(payload) try: - client.ping_lan_server(i) + client.ping_lan_server(payload) except Exception as err: print("error occurred: {}".format(str(err))) raise From 4bec3cbc6312a4cb0c031e7a96c3e02231360504 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:01:15 -0400 Subject: [PATCH 32/48] deleted unnecessary code and env rearranged --- hardware/SensorPi/main.py | 27 ---------- hardware/SensorPi/sensehat_reader.py | 78 ---------------------------- hardware/env | 13 ++--- 3 files changed, 5 insertions(+), 113 deletions(-) delete mode 100644 hardware/SensorPi/main.py delete mode 100644 hardware/SensorPi/sensehat_reader.py diff --git a/hardware/SensorPi/main.py b/hardware/SensorPi/main.py deleted file mode 100644 index 1620cf3e..00000000 --- a/hardware/SensorPi/main.py +++ /dev/null @@ -1,27 +0,0 @@ -from sense_hat import SenseHat -import requests -import os -from sensehat_reader import temperature, pressure, humidity, acceleration, orientation - -# import json - -TEST_ENDPOINT = os.environ["TEST_ENDPOINT"] -API_ENDPOINT = os.environ["API_ENDPOINT"] - -sense = SenseHat() -nyu_purple = (87, 46, 140) -sense.show_message("MERCURY", text_colour=nyu_purple, scroll_speed=0.04) -sense.clear() - -while 1: - json_temperature = temperature() - json_pressure = pressure() - json_humidity = humidity() - json_acceleration = acceleration() - json_orientation = orientation() - - response_temperature = requests.post(url=API_ENDPOINT, data=json_temperature) - response_pressure = requests.post(url=API_ENDPOINT, data=json_pressure) - response_humidity = requests.post(url=API_ENDPOINT, data=json_humidity) - response_acceleration = requests.post(url=API_ENDPOINT, data=json_acceleration) - response_orientation = requests.post(url=API_ENDPOINT, data=json_orientation) diff --git a/hardware/SensorPi/sensehat_reader.py b/hardware/SensorPi/sensehat_reader.py deleted file mode 100644 index a4a690f9..00000000 --- a/hardware/SensorPi/sensehat_reader.py +++ /dev/null @@ -1,78 +0,0 @@ -from sense_hat import SenseHat -import json -from hardware.Utils.utils import date_str_with_current_timezone - - -TEMPERATURE_ID = 6 -PRESSURE_ID = 7 -HUMIDITY_ID = 10 -ACCELERATION_ID = 8 -ORIENTATION_ID = 9 - - -def temperature(): - sense = SenseHat() - temperature = sense.get_temperature() - date = date_str_with_current_timezone() - data = {} - data["sensor_id"] = TEMPERATURE_ID - data["values"] = {"temperature": temperature} - data["values"] = json.dumps(data["values"]) - data["date"] = date - return data - - -def pressure(): - sense = SenseHat() - pressure = sense.get_pressure() - date = date_str_with_current_timezone() - data = {} - data["sensor_id"] = PRESSURE_ID - data["values"] = {"pressure": pressure} - data["values"] = json.dumps(data["values"]) - data["date"] = date - return data - - -def humidity(): - sense = SenseHat() - humidity = sense.get_humidity() - date = date_str_with_current_timezone() - data = {} - data["sensor_id"] = HUMIDITY_ID - data["values"] = {"humidity": humidity} - data["values"] = json.dumps(data["values"]) - data["date"] = date - return data - - -def acceleration(): - sense = SenseHat() - acceleration = sense.get_accelerometer_raw() - date = date_str_with_current_timezone() - data = {} - data["sensor_id"] = ACCELERATION_ID - data["values"] = { - "x": acceleration["x"], - "y": acceleration["y"], - "z": acceleration["z"], - } - data["values"] = json.dumps(data["values"]) - data["date"] = date - return data - - -def orientation(): - sense = SenseHat() - orientation = sense.get_orientation() - date = date_str_with_current_timezone() - data = {} - data["sensor_id"] = ORIENTATION_ID - data["values"] = { - "roll": orientation["roll"], - "pitch": orientation["pitch"], - "yaw": orientation["yaw"], - } - data["values"] = json.dumps(data["values"]) - data["date"] = date - return data diff --git a/hardware/env b/hardware/env index 0ce0e69c..b6b4139e 100644 --- a/hardware/env +++ b/hardware/env @@ -1,13 +1,14 @@ PI_TYPE=commPi -SHOW_LOGS=True -RADIO_TRANSMITTER_PORT=/dev/ttyUSB0 -RADIO_RECEIVER_PORT=/dev/ttyUSB0 + ENABLE_INTERNET_TRANSMISSION=False -ENABLE_RADIO_TRANSMISSION=True LAN_SERVER_HTTPS= LAN_SERVER_IP=169.254.187.204 LAN_PORT=3322 +ENABLE_RADIO_TRANSMISSION=True +RADIO_TRANSMITTER_PORT=/dev/ttyUSB0 +RADIO_RECEIVER_PORT=/dev/ttyUSB0 EMULATE_SENSE_HAT=True +SHOW_LOGS=True LOG_DIRECTORY=logs TRANSMITTER_LOG_FILE=transmitter.log RECEIVER_LOG_FILE=receiver.log @@ -15,9 +16,5 @@ LAN_SERVER_LOG_FILE=lan_server.log LAN_CLIENT_LOG_FILE=lan_client.log PORT_LOG_FILE=port.log SENSE_HAT_LOG_FILE=sense_hat.log - -TEST_ENDPOINT=http://pastebin.com/api/api_post.php -API_ENDPOINT=http://mecury-backend-prod.herokuapp.com/measurement/ - TRANSCEIVER_BAUDRATE=9600 TRANSCEIVER_TIMEOUT=1 From dfa2ac614a4631cd341588a1fa22d210272e3395 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:04:04 -0400 Subject: [PATCH 33/48] added entry point for each hardware --- hardware/env | 2 +- hardware/main.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hardware/env b/hardware/env index b6b4139e..849ee3c4 100644 --- a/hardware/env +++ b/hardware/env @@ -1,4 +1,4 @@ -PI_TYPE=commPi +HARDWARE_TYPE=commPi ENABLE_INTERNET_TRANSMISSION=False LAN_SERVER_HTTPS= diff --git a/hardware/main.py b/hardware/main.py index 0c225a0d..dea4f9cb 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -10,10 +10,10 @@ ) -if os.environ["PI_TYPE"] == "commPi": +if os.environ["HARDWARE_TYPE"] == "commPi": print("CommunicationsPi") runServer(handler_class=CommPi) -else: +elif os.environ['HARDWARE_TYPE'] == "sensePi": print("SensePi") sensor_keys = get_sensor_keys() sensor_ids = {} @@ -43,3 +43,5 @@ print("error occurred: {}".format(str(err))) raise time.sleep(1) +else: + print("Local Django Server") From b58a44ddaf868784d171a0238a9bb609f4e2c280 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:11:53 -0400 Subject: [PATCH 34/48] deleted unnecessary code and fixes --- hardware/CommunicationsPi/comm_pi.py | 8 +- hardware/CommunicationsPi/find_port.py | 143 ------------------ hardware/CommunicationsPi/port.py | 50 ------ .../CommunicationsPi/radio_transceiver.py | 14 +- hardware/Utils/logger.py | 2 +- hardware/main.py | 6 +- 6 files changed, 16 insertions(+), 207 deletions(-) delete mode 100644 hardware/CommunicationsPi/find_port.py delete mode 100644 hardware/CommunicationsPi/port.py diff --git a/hardware/CommunicationsPi/comm_pi.py b/hardware/CommunicationsPi/comm_pi.py index 0c7cfff6..50f5995f 100644 --- a/hardware/CommunicationsPi/comm_pi.py +++ b/hardware/CommunicationsPi/comm_pi.py @@ -27,9 +27,9 @@ def do_POST(self): self.wfile.write("POST request for {}".format(self.path).encode("utf-8")) def send_data(self, payload): - if os.environ.get('ENABLE_INTERNET_TRANSMISSION'): - print('transmit via internet') - if os.environ.get('ENABLE_RADIO_TRANSMISSION'): - print('transmit via radio') + if os.environ.get("ENABLE_INTERNET_TRANSMISSION"): + print("transmit via internet") + if os.environ.get("ENABLE_RADIO_TRANSMISSION"): + print("transmit via radio") self.transceiver.send(payload) return diff --git a/hardware/CommunicationsPi/find_port.py b/hardware/CommunicationsPi/find_port.py deleted file mode 100644 index 92ceb2e0..00000000 --- a/hardware/CommunicationsPi/find_port.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python3 -import sys -import argparse -import serial -import serial.tools.list_ports - -from hardware.Utils.utils import get_logger - - -def is_usb_serial(port, args): - if port.vid is None: - return False - if hasattr(args, "vid") and args.vid is not None: - if port.vid is not args.vid: - return False - if hasattr(args, "pid") and args.pid is not None: - if port.pid is not args.pid: - return False - if hasattr(args, "vendor") and args.vendor is not None: - if not port.manufacturer.startswith(args.vendor): - return False - if hasattr(args, "serial") and args.serial is not None: - if not port.serial_number.startswith(args.serial): - return False - if hasattr(args, "intf") and args.intf is not None: - if port.interface is None or args.intf not in port.interface: - return False - return True - - -def extra_info(port): - extra_items = [] - if port.manufacturer: - extra_items.append("vendor '{}'".format(port.manufacturer)) - if port.serial_number: - extra_items.append("serial '{}'".format(port.serial_number)) - if port.interface: - extra_items.append("intf '{}'".format(port.interface)) - if extra_items: - return " with " + " ".join(extra_items) - return "" - - -def get_port(): - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, None): - return "port found" - return - - -def main(): - """The main program.""" - parser = argparse.ArgumentParser( - prog="find-port.py", - usage="%(prog)s [options] [command]", - description="Find the /dev/tty port for a USB Serial devices", - ) - parser.add_argument( - "-l", - "--list", - dest="list", - action="store_true", - help="List USB Serial devices currently connected", - ) - parser.add_argument( - "-s", - "--serial", - dest="serial", - help="Only show devices with the indicated serial number", - default=None, - ) - parser.add_argument( - "-n", - "--vendor", - dest="vendor", - help="Only show devices with the indicated vendor name", - default=None, - ) - parser.add_argument( - "--pid", - dest="pid", - action="store", - help="Only show device with indicated PID", - default=None, - ) - parser.add_argument( - "-v", - "--verbose", - dest="verbose", - action="store_true", - help="Turn on verbose messages", - default=False, - ) - parser.add_argument( - "--vid", - dest="vid", - action="store", - help="Only show device with indicated VID", - default=None, - ) - parser.add_argument( - "-i", - "--intf", - dest="intf", - action="store", - help="Shows devices which conatin the indicated interface string", - default=None, - ) - args = parser.parse_args(sys.argv[1:]) - - logger = get_logger("PORT_LOGGER", file_name="PORT_LOG_FILE") - - if args.verbose: - logger.info("pyserial version = {}".format(serial.__version__)) - logger.info(f" vid = {args.vid}") - logger.info(f" pid = {args.pid}") - logger.info(f"serial = {args.serial}") - logger.info(f"vendor = {args.vendor}") - - if args.list: - detected = False - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, args): - logger.info( - "USB Serial Device {:04x}:{:04x}{} found @{}\r".format( - port.vid, port.pid, extra_info(port), port.device - ) - ) - detected = True - if not detected: - logger.warn("No USB Serial devices detected.\r") - return - - for port in serial.tools.list_ports.comports(): - if is_usb_serial(port, args): - logger.info(port) - logger.info(port.device) - return - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/hardware/CommunicationsPi/port.py b/hardware/CommunicationsPi/port.py deleted file mode 100644 index 49f3d17a..00000000 --- a/hardware/CommunicationsPi/port.py +++ /dev/null @@ -1,50 +0,0 @@ -# Test code written by Xiaofeng Xu to read serial messages from port - -import asyncio -import glob -import sys -import json -import serial -import serial_asyncio - - -class AsyncSerialProtocol(asyncio.Protocol): - def connection_made(self, transport): - self.transport = transport - print("port opened", transport) - transport.serial.rts = False - transport.write(b"hello world\n") - - def data_received(self, data): - m = data.decode("utf-8") - print(m) - # print("data received", repr(data)) - try: - message = json.loads(data.decode("utf-8")) - print(message) - except json.JSONDecodeError: - print() - - self.transport.close() - - def connection_lost(self, exc): - print("port closed") - asyncio.get_event_loop().stop() - - -ser = serial.Serial() -ports = glob.glob("/dev/tty.u*") -print(ports[0]) -ser.port = ports[0] -ser.timeout = 1 -ser.open() - -loop = asyncio.new_event_loop() -coro = serial_asyncio.create_serial_connection(loop, AsyncSerialProtocol, ports[0]) -try: - loop.run_until_complete(coro) - loop.run_forever() -except KeyboardInterrupt: - sys.stdout.write("\n") -finally: - loop.close() diff --git a/hardware/CommunicationsPi/radio_transceiver.py b/hardware/CommunicationsPi/radio_transceiver.py index 42c484c6..014ff113 100644 --- a/hardware/CommunicationsPi/radio_transceiver.py +++ b/hardware/CommunicationsPi/radio_transceiver.py @@ -31,11 +31,15 @@ def __init__(self, log_file_name=None, port=None): ), {}, ) - self.port_vid = port_info.vid if 'vid' in port_info else None - self.port_pid = port_info.pid if 'pid' in port_info else None - self.port_vendor = port_info.manufacturer if 'manufacturer' in port_info else None - self.port_intf = port_info.interface if 'interface' in port_info else None - self.port_serial_number = port_info.serial_number if 'serial_number' in port_info else None + self.port_vid = port_info.vid if "vid" in port_info else None + self.port_pid = port_info.pid if "pid" in port_info else None + self.port_vendor = ( + port_info.manufacturer if "manufacturer" in port_info else None + ) + self.port_intf = port_info.interface if "interface" in port_info else None + self.port_serial_number = ( + port_info.serial_number if "serial_number" in port_info else None + ) self.find_port() baudrate = os.environ["TRANSCEIVER_BAUDRATE"] diff --git a/hardware/Utils/logger.py b/hardware/Utils/logger.py index af28ee9d..f5c7bbf6 100644 --- a/hardware/Utils/logger.py +++ b/hardware/Utils/logger.py @@ -30,7 +30,7 @@ def __init__( self.logger.addHandler(self.console_logger) # show logs on screen - self.showLogsOnScreen = show_logs or os.environ.get('SHOW_LOGS') + self.showLogsOnScreen = show_logs or os.environ.get("SHOW_LOGS") def get_logger_file(self, file_name): d = os.environ["LOG_DIRECTORY"] diff --git a/hardware/main.py b/hardware/main.py index dea4f9cb..42e1e3dd 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -5,15 +5,13 @@ from hardware.CommunicationsPi.lan_server import runServer from hardware.CommunicationsPi.lan_client import LANClient from hardware.SensorPi.sense_pi import SensePi -from hardware.Utils.utils import ( - get_sensor_keys, -) +from hardware.Utils.utils import get_sensor_keys if os.environ["HARDWARE_TYPE"] == "commPi": print("CommunicationsPi") runServer(handler_class=CommPi) -elif os.environ['HARDWARE_TYPE'] == "sensePi": +elif os.environ["HARDWARE_TYPE"] == "sensePi": print("SensePi") sensor_keys = get_sensor_keys() sensor_ids = {} From 4b33529ad942cc561808ff9ced856dd95cc2621e Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:12:51 -0400 Subject: [PATCH 35/48] style fixes and clean up --- hardware/CommunicationsPi/comm_pi.py | 1 - hardware/CommunicationsPi/lan_client.py | 1 - hardware/main.py | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/hardware/CommunicationsPi/comm_pi.py b/hardware/CommunicationsPi/comm_pi.py index 50f5995f..a4f5da00 100644 --- a/hardware/CommunicationsPi/comm_pi.py +++ b/hardware/CommunicationsPi/comm_pi.py @@ -1,5 +1,4 @@ import os -import json from http.server import BaseHTTPRequestHandler from hardware.CommunicationsPi.radio_transceiver import Transceiver diff --git a/hardware/CommunicationsPi/lan_client.py b/hardware/CommunicationsPi/lan_client.py index 1df6c15c..c17bf9c2 100644 --- a/hardware/CommunicationsPi/lan_client.py +++ b/hardware/CommunicationsPi/lan_client.py @@ -1,5 +1,4 @@ import os -import json import requests from requests.exceptions import HTTPError from hardware.Utils.utils import get_logger diff --git a/hardware/main.py b/hardware/main.py index 42e1e3dd..c2189464 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -1,5 +1,6 @@ import os import time +import json from hardware.CommunicationsPi.comm_pi import CommPi from hardware.CommunicationsPi.lan_server import runServer From 497272a36039549472c200ec6e376887ecdcecae Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:36:49 -0400 Subject: [PATCH 36/48] Added code for local django app --- hardware/env | 11 +++++++---- hardware/main.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/hardware/env b/hardware/env index fcc9a4eb..0c91e9eb 100644 --- a/hardware/env +++ b/hardware/env @@ -8,6 +8,13 @@ ENABLE_RADIO_TRANSMISSION=True RADIO_TRANSMITTER_PORT=/dev/ttyUSB0 RADIO_RECEIVER_PORT=/dev/ttyUSB0 EMULATE_SENSE_HAT=True +GPS_BAUDRATE=9600 +GPS_PORT=/dev/serial0 +TRANSCEIVER_BAUDRATE=9600 +TRANSCEIVER_TIMEOUT=1 + +DJANGO_SERVER_API_ENDPOINT=http://127.0.0.1:8080/measurement/ + SHOW_LOGS=True LOG_DIRECTORY=logs TRANSMITTER_LOG_FILE=transmitter.log @@ -16,8 +23,4 @@ LAN_SERVER_LOG_FILE=lan_server.log LAN_CLIENT_LOG_FILE=lan_client.log PORT_LOG_FILE=port.log SENSE_HAT_LOG_FILE=sense_hat.log -GPS_BAUDRATE=9600 -GPS_PORT=/dev/serial0 GPS_LOG_FILE=gps_reader.log -TRANSCEIVER_BAUDRATE=9600 -TRANSCEIVER_TIMEOUT=1 diff --git a/hardware/main.py b/hardware/main.py index ebfc32e5..355a3f1a 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -2,6 +2,7 @@ import time import json +from hardware.CommunicationsPi.radio_transceiver import Transceiver from hardware.CommunicationsPi.comm_pi import CommPi from hardware.CommunicationsPi.lan_server import runServer from hardware.CommunicationsPi.lan_client import LANClient @@ -51,3 +52,14 @@ time.sleep(1) else: print("Local Django Server") + transceiver = Transceiver() + url = os.environ.get('DJANGO_SERVER_API_ENDPOINT') + if url: + client = LANClient(lan_server_url=url) + while True: + data = transceiver.listen() + if data: + print(data) + client.ping_lan_server(json.loads(data)) + else: + print('DJANGO_SERVER_API_ENDPOINT not set') From 670e24526257b2a448d63553305bfc2482e7edba Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:43:50 -0400 Subject: [PATCH 37/48] fixed formatting issues --- hardware/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hardware/main.py b/hardware/main.py index 355a3f1a..23a8b24f 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -53,7 +53,7 @@ else: print("Local Django Server") transceiver = Transceiver() - url = os.environ.get('DJANGO_SERVER_API_ENDPOINT') + url = os.environ.get("DJANGO_SERVER_API_ENDPOINT") if url: client = LANClient(lan_server_url=url) while True: @@ -62,4 +62,4 @@ print(data) client.ping_lan_server(json.loads(data)) else: - print('DJANGO_SERVER_API_ENDPOINT not set') + print("DJANGO_SERVER_API_ENDPOINT not set") From d74383d9b56743d903225a7bdbdcc7810bc41ece Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 00:57:02 -0400 Subject: [PATCH 38/48] Fixing tests --- hardware/tests/test_lan_client.py | 2 +- hardware/tests/test_radio_transceiver.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py index 14b8061f..ac2d2e0d 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_lan_client.py @@ -133,7 +133,7 @@ def test_ping_server(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), ) @patch("hardware.CommunicationsPi.lan_client.requests") diff --git a/hardware/tests/test_radio_transceiver.py b/hardware/tests/test_radio_transceiver.py index 95af8b6e..fc5dab06 100644 --- a/hardware/tests/test_radio_transceiver.py +++ b/hardware/tests/test_radio_transceiver.py @@ -100,7 +100,7 @@ def test_init_dir(self, mock_port_list, mock_serial): "RADIO_TRANSMITTER_PORT": "", "LOG_FILE": "logger.txt", "TRANSCEIVER_BAUDRATE": "9600", - "TRANSCEIVER_TIMEOUT": "1", + "TRANSCEIVER_TIMEOUT": 1, }, ): transciever = Transceiver(log_file_name="LOG_FILE") From 87c35e17867da97fb5f0d886d09c41b1f933d1c1 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 01:35:33 -0400 Subject: [PATCH 39/48] Fixing tests --- hardware/tests/test_lan_client.py | 4 ++-- hardware/tests/test_radio_transceiver.py | 5 ++--- requirements.txt | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py index ac2d2e0d..3c03c8de 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_lan_client.py @@ -160,7 +160,7 @@ def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), ("LAN_CLIENT_LOG_FILE", "ERROR", "HTTP error occurred: HTTPError"), ) @@ -188,6 +188,6 @@ def test_ping_server_raise_ex(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: {json.dumps(payload)}"), + ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), ("LAN_CLIENT_LOG_FILE", "ERROR", "error occurred: Exception"), ) diff --git a/hardware/tests/test_radio_transceiver.py b/hardware/tests/test_radio_transceiver.py index fc5dab06..8df5db04 100644 --- a/hardware/tests/test_radio_transceiver.py +++ b/hardware/tests/test_radio_transceiver.py @@ -22,7 +22,7 @@ def setUp(self): self.parity = serial.PARITY_NONE self.stopbits = serial.STOPBITS_ONE self.bytesize = serial.EIGHTBITS - self.timeout = "1" + self.timeout = 1 def tearDown(self): self.temp_dir.cleanup() @@ -100,7 +100,7 @@ def test_init_dir(self, mock_port_list, mock_serial): "RADIO_TRANSMITTER_PORT": "", "LOG_FILE": "logger.txt", "TRANSCEIVER_BAUDRATE": "9600", - "TRANSCEIVER_TIMEOUT": 1, + "TRANSCEIVER_TIMEOUT": "1", }, ): transciever = Transceiver(log_file_name="LOG_FILE") @@ -314,7 +314,6 @@ def test_is_serial_usb_vid_no_match(self, mock_port_list, mock_serial): self.assertTrue(transciever.logging is not None) self.assertTrue(transciever.logging.name == "LOG_FILE") self.assertIsInstance(transciever.logging, Logger) - self.assertTrue(transciever.port == "usb2") self.assertTrue(transciever.port_vid == "foo2") self.assertTrue(transciever.port_pid == "baz") diff --git a/requirements.txt b/requirements.txt index 46126f78..33b7cc01 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,8 +14,8 @@ drf-yasg selenium==3.141.0 django-annoying mock -requests +requests==2.23.0 matplotlib attr django-bootstrap4 -django-js-reverse \ No newline at end of file +django-js-reverse From ba9aa6965d9c8335eaec8c033917e3c12f99f6bb Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Fri, 24 Apr 2020 21:52:21 -0400 Subject: [PATCH 40/48] slimmed down the docker build and updated the docker test to better insure that it builds correctly --- .dockerignore | 29 +++++++++++++++++++++++++++++ .flake8 | 3 ++- .travis.yml | 14 +++++++------- Dockerfile | 23 ++++++++++++++++++++--- hardware/env | 2 +- hardware/main.py | 20 +++++++++++++++----- hardware/pi_requirements.txt | 10 ++++++++++ 7 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 .dockerignore create mode 100644 hardware/pi_requirements.txt diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..4ac85996 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +# ignore everything +* + +# except the hardware directory +!hardware + +# things we want to ignore in the file directory +**/__pycache__ +**/*.pyc +**/*.pyo +**/*.pyd +**/.Python +**/.env +**/pip-log.txt +**/pip-delete-this-directory.txt +**/.tox +**/.coverage +**/.coveragerc +**/.coverage.* +**/.cache +**/nosetests.xml +**/coverage.xml +**/*,cover +**/*.log + +# things we want to specifically include +!pi_requirements.txt +!Dockerfile + diff --git a/.flake8 b/.flake8 index a79ff2cb..da23d555 100644 --- a/.flake8 +++ b/.flake8 @@ -3,5 +3,6 @@ max-line-length = 119 exclude = .git, __pycache__, - venv + venv, + pi_venv **/migrations diff --git a/.travis.yml b/.travis.yml index 47156af2..4742aca4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,18 +62,18 @@ jobs: services: - docker - before_script: + install: - docker pull nyumotorsportstelemetryorg/mercury || true - - script: # prepare qemu for arm emulation on x64 hardware - docker run --rm --privileged multiarch/qemu-user-static:register --reset # build image - # - docker build -t gcivil-nyu-org/spring2020-cs-gy-9223-class . - docker build --pull --cache-from nyumotorsportstelemetryorg/mercury --tag nyumotorsportstelemetryorg/mercury . - # basic help world test to see if it's working - - docker run nyumotorsportstelemetryorg/mercury grep -q "Hello, Docker!" hello.txt - # - black --check --exclude "migrations/" hardware + - docker run -d --name test_pi nyumotorsportstelemetryorg/mercury + + script: + # insure that the server started up as expected + - docker ps -a + - docker ps | grep -q test_pi after_script: - docker images diff --git a/Dockerfile b/Dockerfile index cb76b1cb..cf399559 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,31 @@ FROM raspbian/stretch +ENV PYTHONUNBUFFERED 1 + # install common build dependencies and clean up afterwards RUN apt-get update && apt-get install -y --no-install-recommends \ raspi-config \ + python3-pip \ + python3-sense-emu \ + sense-emu-tools \ && rm -rf /var/lib/apt/lists/* +RUN mkdir ~/Downloads +RUN mkdir hardware + # copy setup scripts -COPY ./hardware . +# COPY ./hardware hardware/ +COPY ./hardware/setup/raspberrypi-common.sh . # run setup -RUN bash ./setup/raspberrypi-common.sh +# RUN bash ./hardware/setup/raspberrypi-common.sh +RUN bash ./raspberrypi-common.sh + +COPY ./hardware/pi_requirements.txt . +RUN sudo python3 -m pip install pip --upgrade --force +RUN sudo pip3 install -r pi_requirements.txt + +COPY ./hardware hardware/ -RUN echo "Hello, Docker!" > hello.txt \ No newline at end of file +# RUN echo "Hello, Docker!" > hello.txt +CMD [ "python3", "-m", "hardware.main" ] \ No newline at end of file diff --git a/hardware/env b/hardware/env index f1bef78f..0ca93c58 100644 --- a/hardware/env +++ b/hardware/env @@ -4,7 +4,7 @@ RADIO_RECEIVER_PORT=/dev/ttyUSB0 LAN_SERVER_HTTPS=False LAN_SERVER_IP=169.254.187.204 LAN_PORT=3322 -EMULATE_SENSE_HAT=True +EMULATE_SENSE_HAT=False LOG_DIRECTORY=logs TRANSMITTER_LOG_FILE=transmitter.log RECEIVER_LOG_FILE=receiver.log diff --git a/hardware/main.py b/hardware/main.py index 96ff2732..1e5d08b3 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -1,11 +1,20 @@ import os import time -from hardware.CommunicationsPi.comm_pi import CommPi -from hardware.CommunicationsPi.lan_server import runServer -from hardware.CommunicationsPi.lan_client import LANClient -from hardware.SensorPi.sense_pi import SensePi -from hardware.gpsPi.gps_reader import GPSReader +from dotenv import load_dotenv + +PI_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +dotenv_file = os.path.join(PI_DIR, "hardware/env") +if os.path.isfile(dotenv_file): # pragma: no cover + load_dotenv(dotenv_path=dotenv_file) +else: + print("dotenv_file was not a file") + +from hardware.CommunicationsPi.comm_pi import CommPi # noqa: E402 +from hardware.CommunicationsPi.lan_server import runServer # noqa: E402 +from hardware.CommunicationsPi.lan_client import LANClient # noqa: E402 +from hardware.SensorPi.sense_pi import SensePi # noqa: E402 +from hardware.gpsPi.gps_reader import GPSReader # noqa: E402 if os.environ["PI_TYPE"] == "commPi": print("CommunicationsPi") @@ -17,6 +26,7 @@ client = LANClient() while True: + print("while true") temp = sensePi.get_temperature() pres = sensePi.get_pressure() hum = sensePi.get_humidity() diff --git a/hardware/pi_requirements.txt b/hardware/pi_requirements.txt new file mode 100644 index 00000000..01a8252e --- /dev/null +++ b/hardware/pi_requirements.txt @@ -0,0 +1,10 @@ +certifi==2020.4.5.1 +chardet==3.0.4 +future==0.18.2 +idna==2.9 +iso8601==0.1.12 +pyserial==3.4 +python-dotenv==0.13.0 +PyYAML==5.3.1 +requests==2.23.0 +urllib3==1.25.9 From 41382629c525424dbaaed21f0950b5afb0f4616e Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Fri, 24 Apr 2020 22:11:10 -0400 Subject: [PATCH 41/48] removed some comments --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index cf399559..12a7359f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,11 +14,9 @@ RUN mkdir ~/Downloads RUN mkdir hardware # copy setup scripts -# COPY ./hardware hardware/ COPY ./hardware/setup/raspberrypi-common.sh . # run setup -# RUN bash ./hardware/setup/raspberrypi-common.sh RUN bash ./raspberrypi-common.sh COPY ./hardware/pi_requirements.txt . @@ -27,5 +25,4 @@ RUN sudo pip3 install -r pi_requirements.txt COPY ./hardware hardware/ -# RUN echo "Hello, Docker!" > hello.txt CMD [ "python3", "-m", "hardware.main" ] \ No newline at end of file From 3a186824ccf1b6c0c0178de173c2425ac2813b21 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 23:41:05 -0400 Subject: [PATCH 42/48] Fixed tests --- hardware/CommunicationsPi/radio_transceiver.py | 12 +++++++----- hardware/tests/test_comm_pi.py | 17 ++++++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/hardware/CommunicationsPi/radio_transceiver.py b/hardware/CommunicationsPi/radio_transceiver.py index 014ff113..2ec4c67c 100644 --- a/hardware/CommunicationsPi/radio_transceiver.py +++ b/hardware/CommunicationsPi/radio_transceiver.py @@ -31,14 +31,16 @@ def __init__(self, log_file_name=None, port=None): ), {}, ) - self.port_vid = port_info.vid if "vid" in port_info else None - self.port_pid = port_info.pid if "pid" in port_info else None + self.port_vid = port_info.vid if hasattr(port_info, "vid") else None + self.port_pid = port_info.pid if hasattr(port_info, "pid") else None self.port_vendor = ( - port_info.manufacturer if "manufacturer" in port_info else None + port_info.manufacturer if hasattr(port_info, "manufacturer") else None + ) + self.port_intf = ( + port_info.interface if hasattr(port_info, "interface") else None ) - self.port_intf = port_info.interface if "interface" in port_info else None self.port_serial_number = ( - port_info.serial_number if "serial_number" in port_info else None + port_info.serial_number if hasattr(port_info, "serial_number") else None ) self.find_port() diff --git a/hardware/tests/test_comm_pi.py b/hardware/tests/test_comm_pi.py index ee531e3e..8a593eae 100644 --- a/hardware/tests/test_comm_pi.py +++ b/hardware/tests/test_comm_pi.py @@ -1,9 +1,10 @@ from django.test import SimpleTestCase - +import os # from json.decoder import JSONDecodeError from http.server import HTTPServer from unittest import mock +from unittest.mock import patch import threading import socket @@ -40,9 +41,11 @@ def test_get(self, mock_transceiver=mock.MagicMock()): self.assertTrue(response.headers.get("Content-Type") == "text/html") @mock.patch("hardware.CommunicationsPi.comm_pi.Transceiver") - def test_post(self, mock_transceiver=mock.MagicMock()): - - mock_transceiver.return_value.send = mock.MagicMock() - url = f"http://localhost:{self.mock_server_port}/" - requests.post(url, data={"key": "value"}, headers={"Content-Length": "15"}) - mock_transceiver.return_value.send.assert_called() + def test_post_radio(self, mock_transceiver=mock.MagicMock()): + with patch.dict( + os.environ, {"ENABLE_RADIO_TRANSMISSION": "True"}, + ): + mock_transceiver.return_value.send = mock.MagicMock() + url = f"http://localhost:{self.mock_server_port}/" + requests.post(url, data={"key": "value"}, headers={"Content-Length": "15"}) + mock_transceiver.return_value.send.assert_called() From 7d9593892370ce9d49214b2e993b6876918cdc38 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 24 Apr 2020 23:48:34 -0400 Subject: [PATCH 43/48] fixed flake8 issue --- hardware/tests/test_comm_pi.py | 3 ++- hardware/tests/test_lan_client.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hardware/tests/test_comm_pi.py b/hardware/tests/test_comm_pi.py index 8a593eae..e982e589 100644 --- a/hardware/tests/test_comm_pi.py +++ b/hardware/tests/test_comm_pi.py @@ -1,5 +1,6 @@ from django.test import SimpleTestCase -import os +import os + # from json.decoder import JSONDecodeError from http.server import HTTPServer diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_lan_client.py index 3c03c8de..57e58912 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_lan_client.py @@ -4,7 +4,6 @@ from requests.exceptions import HTTPError import os -import json from hardware.CommunicationsPi.lan_client import LANClient from hardware.Utils.logger import Logger From dcd193c5d3ba9fee3b4cd428f52ccdfd0c97ae42 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Sat, 25 Apr 2020 00:02:44 -0400 Subject: [PATCH 44/48] Renamed LAN Server to Web Server --- .../{lan_client.py => web_client.py} | 8 +-- hardware/env | 2 +- hardware/main.py | 6 +- ...{test_lan_client.py => test_web_client.py} | 62 +++++++++---------- 4 files changed, 39 insertions(+), 39 deletions(-) rename hardware/CommunicationsPi/{lan_client.py => web_client.py} (89%) rename hardware/tests/{test_lan_client.py => test_web_client.py} (74%) diff --git a/hardware/CommunicationsPi/lan_client.py b/hardware/CommunicationsPi/web_client.py similarity index 89% rename from hardware/CommunicationsPi/lan_client.py rename to hardware/CommunicationsPi/web_client.py index c17bf9c2..17e37ff3 100644 --- a/hardware/CommunicationsPi/lan_client.py +++ b/hardware/CommunicationsPi/web_client.py @@ -4,17 +4,17 @@ from hardware.Utils.utils import get_logger -class LANClient: - def __init__(self, log_file_name=None, lan_server_url=None): +class WebClient: + def __init__(self, log_file_name=None, server_url=None): if log_file_name is None: self.logging = get_logger("LAN_CLIENT_LOG_FILE") else: self.logging = get_logger(log_file_name, log_file_name) - if lan_server_url is None: + if server_url is None: self.url = self.get_server_url_from_env() else: - self.url = lan_server_url + self.url = server_url def get_server_url_from_env(self): protocol = "https" if os.environ.get("LAN_SERVER_HTTPS") else "http" diff --git a/hardware/env b/hardware/env index 0c91e9eb..38a317fc 100644 --- a/hardware/env +++ b/hardware/env @@ -20,7 +20,7 @@ LOG_DIRECTORY=logs TRANSMITTER_LOG_FILE=transmitter.log RECEIVER_LOG_FILE=receiver.log LAN_SERVER_LOG_FILE=lan_server.log -LAN_CLIENT_LOG_FILE=lan_client.log +WEB_CLIENT_LOG_FILE=web_client.log PORT_LOG_FILE=port.log SENSE_HAT_LOG_FILE=sense_hat.log GPS_LOG_FILE=gps_reader.log diff --git a/hardware/main.py b/hardware/main.py index 23a8b24f..006589ef 100644 --- a/hardware/main.py +++ b/hardware/main.py @@ -5,7 +5,7 @@ from hardware.CommunicationsPi.radio_transceiver import Transceiver from hardware.CommunicationsPi.comm_pi import CommPi from hardware.CommunicationsPi.lan_server import runServer -from hardware.CommunicationsPi.lan_client import LANClient +from hardware.CommunicationsPi.web_client import WebClient from hardware.SensorPi.sense_pi import SensePi from hardware.Utils.utils import get_sensor_keys from hardware.gpsPi.gps_reader import GPSReader @@ -25,7 +25,7 @@ sensor_ids[sensor_keys["ORIENTATION"]] = 6 sensePi = SensePi(sensor_ids=sensor_ids) gpsPi = GPSReader() - client = LANClient() + client = WebClient() while True: temp = sensePi.get_temperature() @@ -55,7 +55,7 @@ transceiver = Transceiver() url = os.environ.get("DJANGO_SERVER_API_ENDPOINT") if url: - client = LANClient(lan_server_url=url) + client = WebClient(server_url=url) while True: data = transceiver.listen() if data: diff --git a/hardware/tests/test_lan_client.py b/hardware/tests/test_web_client.py similarity index 74% rename from hardware/tests/test_lan_client.py rename to hardware/tests/test_web_client.py index 57e58912..18121cdc 100644 --- a/hardware/tests/test_lan_client.py +++ b/hardware/tests/test_web_client.py @@ -5,7 +5,7 @@ import os -from hardware.CommunicationsPi.lan_client import LANClient +from hardware.CommunicationsPi.web_client import WebClient from hardware.Utils.logger import Logger @@ -20,17 +20,17 @@ def test_init_no_log_no_server(self): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, ): - l_client = LANClient() + l_client = WebClient() self.assertTrue(l_client.logging is not None) - self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertTrue(l_client.logging.name == "WEB_CLIENT_LOG_FILE") self.assertIsInstance(l_client.logging, Logger) self.assertEqual(l_client.url, "https://0.0.0.0:0") @@ -39,16 +39,16 @@ def test_init_no_log_no_server_http(self): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, ): - l_client = LANClient() + l_client = WebClient() self.assertTrue(l_client.logging is not None) - self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertTrue(l_client.logging.name == "WEB_CLIENT_LOG_FILE") self.assertIsInstance(l_client.logging, Logger) self.assertEqual(l_client.url, "http://0.0.0.0:0") @@ -57,17 +57,17 @@ def test_init_no_log_server(self): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, ): - l_client = LANClient(lan_server_url="/url") + l_client = WebClient(server_url="/url") self.assertTrue(l_client.logging is not None) - self.assertTrue(l_client.logging.name == "LAN_CLIENT_LOG_FILE") + self.assertTrue(l_client.logging.name == "WEB_CLIENT_LOG_FILE") self.assertIsInstance(l_client.logging, Logger) self.assertEqual(l_client.url, "/url") @@ -76,14 +76,14 @@ def test_init_log_no_server(self): with patch.dict( os.environ, { - "NEW_LOG_FILE": "lan_client.log", + "NEW_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, ): - l_client = LANClient(log_file_name="NEW_LOG_FILE") + l_client = WebClient(log_file_name="NEW_LOG_FILE") self.assertTrue(l_client.logging is not None) self.assertTrue(l_client.logging.name == "NEW_LOG_FILE") @@ -95,14 +95,14 @@ def test_init_log_server(self): with patch.dict( os.environ, { - "NEW_LOG_FILE": "lan_client.log", + "NEW_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", "LAN_PORT": "0", }, ): - l_client = LANClient(log_file_name="NEW_LOG_FILE", lan_server_url="/url") + l_client = WebClient(log_file_name="NEW_LOG_FILE", server_url="/url") self.assertTrue(l_client.logging is not None) self.assertTrue(l_client.logging.name == "NEW_LOG_FILE") @@ -110,12 +110,12 @@ def test_init_log_server(self): self.assertEqual(l_client.url, "/url") - @patch("hardware.CommunicationsPi.lan_client.requests") + @patch("hardware.CommunicationsPi.web_client.requests") def test_ping_server(self, mock_requests=MagicMock()): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", @@ -123,7 +123,7 @@ def test_ping_server(self, mock_requests=MagicMock()): }, ): with LogCapture() as capture: - l_client = LANClient() + l_client = WebClient() payload = "{'key':'value'}" @@ -131,16 +131,16 @@ def test_ping_server(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( - ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), + ("WEB_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("WEB_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), ) - @patch("hardware.CommunicationsPi.lan_client.requests") + @patch("hardware.CommunicationsPi.web_client.requests") def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", @@ -148,7 +148,7 @@ def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): }, ): with LogCapture() as capture: - l_client = LANClient() + l_client = WebClient() mock_requests.post.side_effect = HTTPError("HTTPError") payload = "{'key':'value'}" @@ -158,17 +158,17 @@ def test_ping_server_raise_http_ex(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( - ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), - ("LAN_CLIENT_LOG_FILE", "ERROR", "HTTP error occurred: HTTPError"), + ("WEB_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("WEB_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), + ("WEB_CLIENT_LOG_FILE", "ERROR", "HTTP error occurred: HTTPError"), ) - @patch("hardware.CommunicationsPi.lan_client.requests") + @patch("hardware.CommunicationsPi.web_client.requests") def test_ping_server_raise_ex(self, mock_requests=MagicMock()): with patch.dict( os.environ, { - "LAN_CLIENT_LOG_FILE": "lan_client.log", + "WEB_CLIENT_LOG_FILE": "web_client.log", "LOG_DIRECTORY": self.temp_dir.path, "LAN_SERVER_HTTPS": "True", "LAN_SERVER_IP": "0.0.0.0", @@ -176,7 +176,7 @@ def test_ping_server_raise_ex(self, mock_requests=MagicMock()): }, ): with LogCapture() as capture: - l_client = LANClient() + l_client = WebClient() mock_requests.post.side_effect = Exception("Exception") payload = "{'key':'value'}" @@ -186,7 +186,7 @@ def test_ping_server_raise_ex(self, mock_requests=MagicMock()): mock_requests.post.assert_called_with("https://0.0.0.0:0", data=payload) capture.check( - ("LAN_CLIENT_LOG_FILE", "INFO", "Pinging"), - ("LAN_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), - ("LAN_CLIENT_LOG_FILE", "ERROR", "error occurred: Exception"), + ("WEB_CLIENT_LOG_FILE", "INFO", "Pinging"), + ("WEB_CLIENT_LOG_FILE", "INFO", f"data: { payload }"), + ("WEB_CLIENT_LOG_FILE", "ERROR", "error occurred: Exception"), ) From f44a6509aaf6a44cae58b298aee18beef083dcd0 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Sat, 25 Apr 2020 00:04:37 -0400 Subject: [PATCH 45/48] Added env fix --- hardware/CommunicationsPi/web_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/CommunicationsPi/web_client.py b/hardware/CommunicationsPi/web_client.py index 17e37ff3..a2ca01f1 100644 --- a/hardware/CommunicationsPi/web_client.py +++ b/hardware/CommunicationsPi/web_client.py @@ -7,7 +7,7 @@ class WebClient: def __init__(self, log_file_name=None, server_url=None): if log_file_name is None: - self.logging = get_logger("LAN_CLIENT_LOG_FILE") + self.logging = get_logger("WEB_CLIENT_LOG_FILE") else: self.logging = get_logger(log_file_name, log_file_name) From 2564591791c0b55833b5fc8c87bf1dacf43aaf77 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 25 Apr 2020 13:15:52 -0500 Subject: [PATCH 46/48] new PR template --- .github/PULL_REQUEST_TEMPLATE.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..06f435c5 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +## Title +_give a self-explanatory title_ + +## Description +_give a detailed description that answers:_ +- _what is the purpose of this PR?_ +- _what is the original vs the new behaviour?_ +- _what bug does this PR attempt to fix?_ +- _what is documented in the new documentation?_ +_If this fixes a bug or resolves an issue, provide a link to that issue_ + +## Types of Changes +_Put an `x` in the boxes that apply_ + +- [ ] Feature (non-breaking change which adds functionality) +- [ ] Bug Fix (non-breaking change that fixes an issue) +- [ ] Breaking Change (feature/fix that causes existing features to not work as expected) +- [ ] Documentation + +## Checklist + +- [ ] I have read the [contribute]contributing doc +- [ ] Classes, scripts, and environment variables follow existing naming convention +- [ ] Lint and Unit tests pass locally +- [ ] New features on hardware have been tested on a local Raspberry Pi +- [ ] Mention new programs/binaries if any must be installed along with this change +- [ ] Mention new environment variables if any have been added to hardware/env file +- [ ] Test coverage should not drop more than 3% \ No newline at end of file From b6743db7ab7c317db496294c758a9715cb19f760 Mon Sep 17 00:00:00 2001 From: MichaelLally Date: Sat, 25 Apr 2020 13:17:47 -0500 Subject: [PATCH 47/48] new PR template --- .github/PULL_REQUEST_TEMPLATE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 06f435c5..53ef182b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,13 +1,12 @@ ## Title -_give a self-explanatory title_ +_Give a self-explanatory title_ ## Description -_give a detailed description that answers:_ +_If this fixes a bug or resolves an issue, provide a link to that issue. Give a detailed description that answers:_ - _what is the purpose of this PR?_ - _what is the original vs the new behaviour?_ - _what bug does this PR attempt to fix?_ - _what is documented in the new documentation?_ -_If this fixes a bug or resolves an issue, provide a link to that issue_ ## Types of Changes _Put an `x` in the boxes that apply_ From b70574dded7db9e314e068ebcfba3164932fbdfb Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Sat, 25 Apr 2020 14:53:36 -0400 Subject: [PATCH 48/48] renamed lan client test class --- hardware/tests/test_web_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/tests/test_web_client.py b/hardware/tests/test_web_client.py index 18121cdc..cf564db0 100644 --- a/hardware/tests/test_web_client.py +++ b/hardware/tests/test_web_client.py @@ -9,7 +9,7 @@ from hardware.Utils.logger import Logger -class LanClientTests(SimpleTestCase): +class WebClientTests(SimpleTestCase): def setUp(self): self.temp_dir = TempDirectory()