diff --git a/.env b/.env deleted file mode 100644 index 4fdd5cc..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -PYTHONPATH = "C:\Users\mante\Documents\GitHub\SAE\Formula-SAE-2.0\Separated" \ No newline at end of file diff --git a/.gitignore b/.gitignore index b69cbbb..19f1946 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +# Old Project *.pyc RealTime/__pycache__/SerialHandler.cpython-36.pyc *.env @@ -13,3 +14,30 @@ secondProc.py *.xml .vscode/settings.json settings.xml + +# New Project +*.pyc +*.sh +setup.cfg +pywebview.egg-info +MANIFEST +build +dist +.cache +.idea +.vs +bin +obj +node_modules +dist +gui +.DS_Store +*venv* +*env* +.vscode +.pytest_cache +__pycache__ +src/__pycache__ +.eggs +yarn-error.log +yarn.lock diff --git a/.project b/.project deleted file mode 100644 index 73a50c4..0000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Formula-SAE-2.0 - - - - - - org.python.pydev.PyDevBuilder - - - - - - org.python.pydev.pythonNature - - diff --git a/.pydevproject b/.pydevproject deleted file mode 100644 index d001f0a..0000000 --- a/.pydevproject +++ /dev/null @@ -1,5 +0,0 @@ - - -Default -python interpreter - diff --git a/GRIFFIN/.vscode/arduino.json b/GRIFFIN/.vscode/arduino.json deleted file mode 100644 index 57851b0..0000000 --- a/GRIFFIN/.vscode/arduino.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "board": "esp8266:esp8266:d1", - "configuration": "xtal=80,vt=flash,exception=legacy,ssl=all,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=921600", - "port": "COM4" -} \ No newline at end of file diff --git a/GRIFFIN/.vscode/c_cpp_properties.json b/GRIFFIN/.vscode/c_cpp_properties.json deleted file mode 100644 index a3776cd..0000000 --- a/GRIFFIN/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "configurations": [ - { - "name": "Win32", - "includePath": [ - "C:\\Users\\Ciocca\\AppData\\Local\\Arduino15\\packages\\esp8266\\tools\\**", - "C:\\Users\\Ciocca\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.1\\**" - ], - "forcedInclude": [], - "intelliSenseMode": "msvc-x64", - "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe", - "cStandard": "c11", - "cppStandard": "c++17" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/GRIFFIN/.vscode/settings.json b/GRIFFIN/.vscode/settings.json deleted file mode 100644 index 541f95f..0000000 --- a/GRIFFIN/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "python.pythonPath": "C:\\Users\\Ciocca\\griffin\\Scripts\\python.exe", - "python.autoComplete.extraPaths": ["C:\\Users\\Ciocca\\griffin\\Lib\\site-packages"], - "python.linting.pylintPath": "C:\\Users\\Ciocca\\griffin\\Scripts\\pylint.exe", - "python.linting.pylintEnabled": false, - "python.linting.enabled": true, - "python.linting.flake8Enabled": true -} \ No newline at end of file diff --git a/GRIFFIN/serialdata/PRE-MERGE/FormatData.py b/GRIFFIN/serialdata/PRE-MERGE/FormatData.py deleted file mode 100644 index bc9be1d..0000000 --- a/GRIFFIN/serialdata/PRE-MERGE/FormatData.py +++ /dev/null @@ -1,134 +0,0 @@ -from serialdata import FileHandler - -class FormatData: - - __doc__='''Documentation for FormatData.py functions: - - @classmethod - formatData(encodedMessage): - it decodes the encodedMessage given as attribute to the function - if the encodedMessage had been received without errors (the pattern is: every four bytes only three are data bytes): - returns: a list composed by the headerIndex (to know which block (100Hz, 10Hz, 4Hz) the message belongs to) and the data bytes - - else: - returns: ['E', 'R', 'R', 'O', 'R'] to emphasize that an error has occured - - @classmethod - setData(dataFrame, encodedMessage, fileHandler): - using formatData() function, it decodes the message and updates the dictionaries inside the dataFrame object. - if (decodedMessage[0]==0x3F): checks if the transmitted block is the 100Hz one - elif (decodedMessage[0]==0x0A): checks if the transmitted block is the 10Hz one - elif(decodedMessage[0]==0x04): checks if the transmitted block is the 4Hz one - - Once the update is completed, the function uses the fileHandler object to save data to .csv file - ''' - - @classmethod - def formatData(cls, encodedMessage): - if encodedMessage in [bytes([0x3F]) + b'ReadError', bytes([0x0A]) + b'ReadError', bytes([0x0A]) + b'ReadError']: - return ['E', 'R', 'R', 'O', 'R', encodedMessage[0] & 0x3F] - - elif len(encodedMessage) % 4 != 1 or (encodedMessage == b'ReadError'): #We receive a number of bytes multiple of 4, plus the byte which gives us the headerIndex of the block received - return ['E', 'R', 'R', 'O', 'R'] #if it is False (it includes also the case of receiving 'ReadError') returns ['E', 'R', 'R', 'O', 'R'] to emphasize that an error has occured - - else: - encodedMessage = list(encodedMessage) - decodedMessage = [] - headerIndex=encodedMessage[0] & 0x3F - decodedMessage.append(headerIndex) - for i in range(0, len(encodedMessage)//4): - firstByte = ((encodedMessage[4*i+1] & 0x3F)<<2 | (encodedMessage[4*i+2] & 0x3F)>>4) & 0xFF - secondByte = ((encodedMessage[4*i+2] & 0x3F) << 4 | (encodedMessage[4*i+3] & 0x3F)>>2) & 0xFF - thirdByte = ((encodedMessage[4*i+3] & 0x3F) << 6 | (encodedMessage[4*i+4] & 0x3F)) & 0xFF - decodedMessage.append(firstByte) - decodedMessage.append(secondByte) - decodedMessage.append(thirdByte) - return decodedMessage - - @classmethod - def setData(cls, dataFrame, encodedMessage, fileHandler): - decodedMessage = FormatData.formatData(encodedMessage) - if (decodedMessage[0]==0x3F): - dataFrame.setEngineFrame("rpm", int(decodedMessage[1]) << 8 | int(decodedMessage[2])) - dataFrame.setEngineFrame("tps", (float(int(decodedMessage[3]) << 8 | int (decodedMessage[4]))) / 10) - - dataFrame.setGyroscopeFrame("accel_x", (float(int(decodedMessage[5]) << 8 | int (decodedMessage[6]))) / 8192) - dataFrame.setGyroscopeFrame("accel_y", (float(int(decodedMessage[7]) << 8 | int (decodedMessage[8]))) / 8192) - dataFrame.setGyroscopeFrame("accel_z", (float(int(decodedMessage[9]) << 8 | int (decodedMessage[10]))) / 8192) - - dataFrame.setGyroscopeFrame("gyro_x", (float(int(decodedMessage[11]) << 8 | int (decodedMessage[12]))) / 8192) - dataFrame.setGyroscopeFrame("gyro_y", (float(int(decodedMessage[13]) << 8 | int (decodedMessage[14]))) / 8192) - dataFrame.setGyroscopeFrame("gyro_z", (float(int(decodedMessage[15]) << 8 | int (decodedMessage[16]))) / 8192) - - #POTENTIOMETER'S OFFSET (THE NUMBER SUBTRACTED AT THE END OF THE LINE) MUST BE CALCULATED AT EVERY CAR'S TEST - dataFrame.setWheelSensorsFrame("pot_fsx", (int(decodedMessage[17]) | ((int(decodedMessage[19]&0x0F))<<8))-610) - dataFrame.setWheelSensorsFrame("pot_fdx", (int(decodedMessage[18]) | ((int(decodedMessage[19]&0xF0))<<4))-410) - dataFrame.setWheelSensorsFrame("potFAccuracy", int(decodedMessage[20])) - dataFrame.setWheelSensorsFrame("pot_rsx", (int(decodedMessage[21]) | ((int(decodedMessage[23]&0x0F))<<8))-300) - dataFrame.setWheelSensorsFrame("pot_rdx", (int(decodedMessage[22]) | ((int(decodedMessage[23]&0xF0))<<4))-310) - dataFrame.setWheelSensorsFrame("potRAccuracy", int(decodedMessage[24])) - - dataFrame.setWheelSensorsFrame("countFSx", (int(decodedMessage[27] & 0x0F) << 8) | int(decodedMessage[25])) - dataFrame.setWheelSensorsFrame("countFDx", (int(decodedMessage[27] & 0xF0) << 4) | int(decodedMessage[26])) - dataFrame.setWheelSensorsFrame("dtF", int(decodedMessage[28])) - - # dataFrame.setWheelSensorsFrame("vel_fsx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) - # dataFrame.setWheelSensorsFrame("vel_fdx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) - - dataFrame.setWheelSensorsFrame("countRSx", (int(decodedMessage[32] & 0x0F) << 8) | int(decodedMessage[30])) - dataFrame.setWheelSensorsFrame("countRDx", (int(decodedMessage[32] & 0xF0) << 4) | int(decodedMessage[31])) - dataFrame.setWheelSensorsFrame("dtR", int(decodedMessage[33])) - - # dataFrame.setWheelSensorsFrame("vel_rsx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) - # dataFrame.setWheelSensorsFrame("vel_rdx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) - - dataFrame.setEngineFrame("gear", int(decodedMessage[34])) - - fileHandler.write100Hz() - - elif (decodedMessage[0]==0x0A): - dataFrame.setEngineFrame("t_h20", int(decodedMessage[1]) -40) - dataFrame.setEngineFrame("t_air", int(decodedMessage[2]) -40) - dataFrame.setEngineFrame("t_oil", int(decodedMessage[3]) -40) - dataFrame.setEngineFrame("vbb", (float(int(decodedMessage[4])))*0.0705) - dataFrame.setEngineFrame("lambda1_avg", (float(int(decodedMessage[5])))/100) - dataFrame.setEngineFrame("lambda1_raw", (float(int(decodedMessage[6])))/100) - dataFrame.setEngineFrame("k_lambda1", (float(int(decodedMessage[7]) << 8 | int (decodedMessage[8])))/656) - dataFrame.setEngineFrame("inj_low", (float(int(decodedMessage[9]) << 8 | int (decodedMessage[10])))/2) - dataFrame.setEngineFrame("inj_high", (float(int(decodedMessage[11]) << 8 | int (decodedMessage[12])))/2) - - fileHandler.write10Hz() - - elif(decodedMessage[0]==0x04): - dataFrame.setGPSFrame("hour", int(decodedMessage[1])) - dataFrame.setGPSFrame("minutes", int(decodedMessage[2])) - dataFrame.setGPSFrame("seconds", int(decodedMessage[3])) - dataFrame.setGPSFrame("micro_seconds", (int(decodedMessage[4]) << 8) | (int(decodedMessage[5]))) - dataFrame.setGPSFrame("n_sats", int(decodedMessage[6] & 0x0F)) - dataFrame.setGPSFrame("fixQuality", int((decodedMessage[6] & 0x30) >> 4)) - e_w = int((decodedMessage[6] >> 6) & 0x01) - if (e_w == 1): - dataFrame.setGPSFrame("e_w", "E") - else: - dataFrame.setGPSFrame("e_w", "W") - - n_s = int(decodedMessage[6] >> 7) - if (n_s == 1): - dataFrame.setGPSFrame("n_s", "N") - else: - dataFrame.setGPSFrame("n_s", "S") - - dataFrame.setGPSFrame("hdop", int(decodedMessage[7] << 8) | int(decodedMessage[8])) - dataFrame.setGPSFrame("latitude", ((int(decodedMessage[9]) << 8) | int(decodedMessage[10])) + ((float((int(decodedMessage[11]) << 24) | (int(decodedMessage[12]) << 16) | (int(decodedMessage[13]) << 8) | int(decodedMessage[14]))) / 100000)) - dataFrame.setGPSFrame("longitude", ((int(decodedMessage[15]) << 24) | (int(decodedMessage[16]) << 16) | (int(decodedMessage[17]) << 8) | int(decodedMessage[18])) + ((float((int(decodedMessage[19]) << 24) | (int(decodedMessage[20]) << 16) | (int(decodedMessage[21]) << 8) | int(decodedMessage[22]))) / 100000)) - dataFrame.setGPSFrame("velGPS", float(decodedMessage[23]) + ((float(decodedMessage[23])) / 10)) - - fileHandler.write4Hz() - - elif decodedMessage[0:5] == ['E', 'R', 'R', 'O', 'R'] : - if len(decodedMessage) == 6: - fileHandler.writeReadError(decodedMessage[5]) - else: - fileHandler.writeReadError() - - diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c8fa6b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2020, Roman +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 93458bf..eda3338 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,66 @@ -# Formula-SAE -Progetto formula sae 2019/2020 +# GUI + +TODO ! + +Thanks to https://github.com/r0x0r/pywebview-react-boilerplate + +## Requirements +- Python 3 +- Node +- virtualenv + +## Installation + +``` bash +yarn run init +``` + +This will create a virtual environment, install pip and Node dependencies. Alternatively you can perform these steps manually. + +``` bash +yarn install +pip install -r requirements.txt +``` + +On Linux systems installation system makes educated guesses. If you run KDE, QT dependencies are installed, otherwise GTK is chosen. `apt` is used for installing GTK dependencies. In case you are running a non apt-based system, you will have to install GTK dependencies manually. See [installation](https://pywebview.flowrl.com/guide/installation.html) for details. + +## Usage + +To launch the application. + +``` bash +yarn run start +``` + +To build an executable. The output binary will be produced in the `dist` directory. + +``` bash +yarn run build +``` + +To start a development server (only for testing frontend code). + +``` bash +yarn run dev +``` + +To clean the developement environment, this will delete `gui`, `dist`, `build` directories. + +``` bash +yarn run clean +``` + + +To eject create-react-app and tweak the configuration as you may wish. + +``` bash +yarn run eject +``` + +To test the frontend code if you have written tests. + +``` bash +yarn run frontend:test +``` + + diff --git a/build-linux.spec b/build-linux.spec new file mode 100644 index 0000000..50e03f4 --- /dev/null +++ b/build-linux.spec @@ -0,0 +1,56 @@ +# -*- mode: python ; coding: utf-8 -*- +import json + +def load_configs(): + json_data = '' + with open('package.json', 'r') as f: + json_data = json.loads(f.read()) + + return json_data + +block_cipher = None + +added_files = [ + ('./gui', 'gui'), +] + +configs = load_configs() + +a = Analysis( + ['./src/index.py'], + pathex=['./dist'], + binaries=[], + datas=added_files, + hiddenimports=['clr'], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name=configs['name'], + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/build-macos.py b/build-macos.py new file mode 100644 index 0000000..5f646c0 --- /dev/null +++ b/build-macos.py @@ -0,0 +1,33 @@ +import os +import py2app +import shutil + +from distutils.core import setup + +def tree(src): + return [(root, map(lambda f: os.path.join(root, f), files)) + for (root, dirs, files) in os.walk(os.path.normpath(src))] + + +if os.path.exists('build'): + shutil.rmtree('build') + +if os.path.exists('dist/index.app'): + shutil.rmtree('dist/index.app') + +ENTRY_POINT = ['src/index.py'] + +DATA_FILES = tree('dist') +OPTIONS = { + 'argv_emulation': False, + 'strip': True, + 'iconfile': 'src/assets/logo.icns', + 'includes': ['WebKit', 'Foundation', 'webview', 'pkg_resources.py2_warn'] +} + +setup( + app=ENTRY_POINT, + data_files=DATA_FILES, + options={'py2app': OPTIONS}, + setup_requires=['py2app'], +) diff --git a/build-windows.spec b/build-windows.spec new file mode 100644 index 0000000..8ab2940 --- /dev/null +++ b/build-windows.spec @@ -0,0 +1,44 @@ +# -*- mode: python -*- +import json + +def load_configs(): + json_data = '' + with open('package.json', 'r') as f: + json_data = json.loads(f.read()) + + return json_data + +block_cipher = None + +added_files = [ + ('.\\gui', 'gui'), +] + +configs = load_configs() + +a = Analysis(['.\\src\\index.py'], + pathex=['.\\dist'], + binaries=None, + datas=added_files, + hiddenimports=['clr'], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + exclude_binaries=True, + name=configs['name'], + debug=False, + strip=True, + icon='.\\src\\assets\\logo.ico', + upx=True, + console=False ) # set this to see error output of the executable +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=False, + name=configs['name']) diff --git a/Arduino/Testa_dati_telemetria/Testa_dati_telemetria.ino b/oldtmp/Arduino/Testa_dati_telemetria/Testa_dati_telemetria.ino similarity index 100% rename from Arduino/Testa_dati_telemetria/Testa_dati_telemetria.ino rename to oldtmp/Arduino/Testa_dati_telemetria/Testa_dati_telemetria.ino diff --git a/Arduino/mockSignal/mockSignal.ino b/oldtmp/Arduino/mockSignal/mockSignal.ino similarity index 100% rename from Arduino/mockSignal/mockSignal.ino rename to oldtmp/Arduino/mockSignal/mockSignal.ino diff --git a/Arduino/randomNumber/randomNumber.ino b/oldtmp/Arduino/randomNumber/randomNumber.ino similarity index 100% rename from Arduino/randomNumber/randomNumber.ino rename to oldtmp/Arduino/randomNumber/randomNumber.ino diff --git a/Documentation/map.pdf b/oldtmp/Documentation/map.pdf similarity index 100% rename from Documentation/map.pdf rename to oldtmp/Documentation/map.pdf diff --git a/Documentation/map.pub b/oldtmp/Documentation/map.pub similarity index 100% rename from Documentation/map.pub rename to oldtmp/Documentation/map.pub diff --git a/GRIFFIN/Controller Loop.txt b/oldtmp/GRIFFIN/Controller Loop.txt similarity index 100% rename from GRIFFIN/Controller Loop.txt rename to oldtmp/GRIFFIN/Controller Loop.txt diff --git a/GRIFFIN/Readme.txt b/oldtmp/GRIFFIN/Readme.txt similarity index 100% rename from GRIFFIN/Readme.txt rename to oldtmp/GRIFFIN/Readme.txt diff --git a/GRIFFIN/__init__.py b/oldtmp/GRIFFIN/__init__.py similarity index 100% rename from GRIFFIN/__init__.py rename to oldtmp/GRIFFIN/__init__.py diff --git a/GRIFFIN/griffin_qt.py b/oldtmp/GRIFFIN/griffin_qt.py similarity index 100% rename from GRIFFIN/griffin_qt.py rename to oldtmp/GRIFFIN/griffin_qt.py diff --git a/GRIFFIN/gui_connectiontab.py b/oldtmp/GRIFFIN/gui_connectiontab.py similarity index 100% rename from GRIFFIN/gui_connectiontab.py rename to oldtmp/GRIFFIN/gui_connectiontab.py diff --git a/GRIFFIN/gui_griffin.py b/oldtmp/GRIFFIN/gui_griffin.py similarity index 100% rename from GRIFFIN/gui_griffin.py rename to oldtmp/GRIFFIN/gui_griffin.py diff --git a/GRIFFIN/gui_logic.py b/oldtmp/GRIFFIN/gui_logic.py similarity index 100% rename from GRIFFIN/gui_logic.py rename to oldtmp/GRIFFIN/gui_logic.py diff --git a/GRIFFIN/gui_textviewtab.py b/oldtmp/GRIFFIN/gui_textviewtab.py similarity index 100% rename from GRIFFIN/gui_textviewtab.py rename to oldtmp/GRIFFIN/gui_textviewtab.py diff --git a/GRIFFIN/interfaces/__init__.py b/oldtmp/GRIFFIN/interfaces/__init__.py similarity index 100% rename from GRIFFIN/interfaces/__init__.py rename to oldtmp/GRIFFIN/interfaces/__init__.py diff --git a/GRIFFIN/pyserial.txt b/oldtmp/GRIFFIN/pyserial.txt similarity index 100% rename from GRIFFIN/pyserial.txt rename to oldtmp/GRIFFIN/pyserial.txt diff --git a/GRIFFIN/python gli import e te.txt b/oldtmp/GRIFFIN/python gli import e te.txt similarity index 100% rename from GRIFFIN/python gli import e te.txt rename to oldtmp/GRIFFIN/python gli import e te.txt diff --git a/GRIFFIN/res/griffin_base.ico b/oldtmp/GRIFFIN/res/griffin_base.ico similarity index 100% rename from GRIFFIN/res/griffin_base.ico rename to oldtmp/GRIFFIN/res/griffin_base.ico diff --git a/GRIFFIN/res/refresh_icon.gif b/oldtmp/GRIFFIN/res/refresh_icon.gif similarity index 100% rename from GRIFFIN/res/refresh_icon.gif rename to oldtmp/GRIFFIN/res/refresh_icon.gif diff --git a/GRIFFIN/res/serial.gif b/oldtmp/GRIFFIN/res/serial.gif similarity index 100% rename from GRIFFIN/res/serial.gif rename to oldtmp/GRIFFIN/res/serial.gif diff --git a/GRIFFIN/run_test.py b/oldtmp/GRIFFIN/run_test.py similarity index 100% rename from GRIFFIN/run_test.py rename to oldtmp/GRIFFIN/run_test.py diff --git a/GRIFFIN/serialdata/Controller.py b/oldtmp/GRIFFIN/serialdata/Controller.py similarity index 100% rename from GRIFFIN/serialdata/Controller.py rename to oldtmp/GRIFFIN/serialdata/Controller.py diff --git a/GRIFFIN/serialdata/DataFrame.py b/oldtmp/GRIFFIN/serialdata/DataFrame.py similarity index 100% rename from GRIFFIN/serialdata/DataFrame.py rename to oldtmp/GRIFFIN/serialdata/DataFrame.py diff --git a/GRIFFIN/serialdata/FileHandler.py b/oldtmp/GRIFFIN/serialdata/FileHandler.py similarity index 100% rename from GRIFFIN/serialdata/FileHandler.py rename to oldtmp/GRIFFIN/serialdata/FileHandler.py diff --git a/GRIFFIN/serialdata/FormatData.py b/oldtmp/GRIFFIN/serialdata/FormatData.py similarity index 100% rename from GRIFFIN/serialdata/FormatData.py rename to oldtmp/GRIFFIN/serialdata/FormatData.py diff --git a/GUI/RealTime/DataFrame.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/DataFrame.py similarity index 55% rename from GUI/RealTime/DataFrame.py rename to oldtmp/GRIFFIN/serialdata/PRE-MERGE/DataFrame.py index a916543..6d16ee4 100644 --- a/GUI/RealTime/DataFrame.py +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/DataFrame.py @@ -1,6 +1,6 @@ class DataFrame: - __doc__='''Documentation for DataFrame.py instance functions: + __doc__ = '''Documentation for DataFrame.py instance functions: -getEngineFrame(): returns the dictionary with engine sensors values @@ -38,14 +38,64 @@ class DataFrame: Since all the data structures are dictionaries, to see the list of keys, call the keys() function on the dictionary''' def __init__(self): - #DEFINITION OF DICTIONARIES' FIELDS - self.__engineFrame = {"rpm": 0, "tps": 0.0, "t_h20": 0, "t_air": 0, "t_oil": 0, "vbb": 0.0, "lambda1_avg": 0.0, "lambda1_raw": 0.0, "k_lambda1": 0.0, "inj_low": 0.0, "inj_high": 0.0, "gear": 0} - self.__GPSFrame = {"hour": 0, "minutes": 0, "seconds": 0, "micro_seconds": 0.0, "n_s": "", "e_w": "", "fixQuality": 0, "n_sats": 0, "hdop": 0.0, "latitude": 0.0, "longitude": 0.0, "velGPS": 0.0} - self.__wheelSensorsFrame = {"countFSx": 0, "countFDx": 0, "dtF": 0, "countRSx": 0, "countRDx": 0, "dtR": 0, "vel_fsx": 0.0, "vel_fdx": 0.0, "vel_rdx": 0.0, "vel_rsx": 0.0, "pot_fsx": 0.0, "pot_fdx": 0.0, "pot_rdx": 0.0, "pot_rsx": 0.0, "potRAccuracy": 0.0, "potFAccuracy": 0.0, "steeringEncoder": 0.0} - self.__gyroscopeFrame = {"gyro_x": 0.0, "gyro_y": 0.0, "gyro_z": 0.0, "accel_x": 0.0, "accel_y": 0.0, "accel_z": 0.0, } - - - #GETTING DICTIONARIES FUNCTIONS + # DEFINITION OF DICTIONARIES' FIELDS + self.__engineFrame = { + "rpm": 0, + "tps": 0.0, + "t_h20": 0, + "t_air": 0, + "t_oil": 0, + "vbb": 0.0, + "lambda1_avg": 0.0, + "lambda1_raw": 0.0, + "k_lambda1": 0.0, + "inj_low": 0.0, + "inj_high": 0.0, + "gear": 0 + } + self.__GPSFrame = { + "hour": 0, + "minutes": 0, + "seconds": 0, + "micro_seconds": 0.0, + "n_s": "", + "e_w": "", + "fixQuality": 0, + "n_sats": 0, + "hdop": 0.0, + "latitude": 0.0, + "longitude": 0.0, + "velGPS": 0.0 + } + self.__wheelSensorsFrame = { + "countFSx": 0, + "countFDx": 0, + "dtF": 0, + "countRSx": 0, + "countRDx": 0, + "dtR": 0, + "vel_fsx": 0.0, + "vel_fdx": 0.0, + "vel_rdx": 0.0, + "vel_rsx": 0.0, + "pot_fsx": 0.0, + "pot_fdx": 0.0, + "pot_rdx": 0.0, + "pot_rsx": 0.0, + "potRAccuracy": 0.0, + "potFAccuracy": 0.0, + "steeringEncoder": 0.0 + } + self.__gyroscopeFrame = { + "gyro_x": 0.0, + "gyro_y": 0.0, + "gyro_z": 0.0, + "accel_x": 0.0, + "accel_y": 0.0, + "accel_z": 0.0, + } + + # GETTING DICTIONARIES FUNCTIONS def getEngineFrame(self): return (self.__engineFrame) @@ -58,8 +108,7 @@ def getWheelSensorsFrame(self): def getGyroscopeFrame(self): return (self.__gyroscopeFrame) - - #SETTING DICTIONARIES FUNCTIONS + # SETTING DICTIONARIES FUNCTIONS def setEngineFrame(self, key, value): if key in self.__engineFrame.keys(): self.__engineFrame[key] = value @@ -74,7 +123,7 @@ def setGPSFrame(self, key, value): else: return False - def setWheelSensorsFrame(self, key, value): + def setWheelSensorsFrame(self, key, value): if key in self.__wheelSensorsFrame.keys(): self.__wheelSensorsFrame[key] = value return True @@ -87,3 +136,6 @@ def setGyroscopeFrame(self, key, value): return True else: return False + + def __repr__(self): + return f"engine: {self.__engineFrame} - gyro: {self.__gyroscopeFrame} - wheel: {self.__wheelSensorsFrame} - GPS: {self.__GPSFrame}" diff --git a/GRIFFIN/serialdata/PRE-MERGE/FileHandler.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/FileHandler.py similarity index 51% rename from GRIFFIN/serialdata/PRE-MERGE/FileHandler.py rename to oldtmp/GRIFFIN/serialdata/PRE-MERGE/FileHandler.py index 96fb7ff..30e1ee0 100644 --- a/GRIFFIN/serialdata/PRE-MERGE/FileHandler.py +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/FileHandler.py @@ -1,9 +1,11 @@ -import csv, time -from serialdata import DataFrame +import csv +import time +# from serialdata import DataFrame + class FileHandler: - __doc__='''Documentation for FormatData.py functions: + __doc__ = '''Documentation for FormatData.py functions: __init__(self, dataFrame): creates a fileHandler object to save data in a CSV file called "dd_mm_yyyy hh_mm__ss.csv" @@ -27,7 +29,7 @@ class FileHandler: Since we do not know which block is transmitting, a line full of 'ReadError' will be added to every file (100Hz, 10Hz, 4Hz) ''' -#Creates a FileHandler object to save data in a CSV file called "dd_mm_yyyy_hh_mm_ss.csv" + # Creates a FileHandler object to save data in a CSV file called "dd_mm_yyyy_hh_mm_ss.csv" def __init__(self, dataFrame): self.__dataFrame = dataFrame @@ -35,47 +37,98 @@ def __init__(self, dataFrame): self.__name100Hz = nome + "100Hz.csv" self.__name10Hz = nome + "10Hz.csv" self.__name4Hz = nome + "4Hz.csv" - - #Getting dictionaries from a dataFrame object + + # Getting dictionaries from a dataFrame object self.__engineFrame = self.__dataFrame.getEngineFrame() self.__wheelFrame = self.__dataFrame.getWheelSensorsFrame() self.__gyroscopeFrame = self.__dataFrame.getGyroscopeFrame() self.__GPSFrame = self.__dataFrame.getGPSFrame() - - #Dictionaries used to write data inside the .csv file (sorted by frequency) - self.__FrameValues100Hz = {'rpm': 0, 'tps': 0.0, 'accel_x': 0.0, 'accel_y': 0.0, 'accel_z': 0.0, 'gyro_x': 0.0, 'gyro_y': 0.0, 'gyro_z': 0.0, 'pot_fsx': 0.0, 'pot_fdx': 0.0, 'pot_FAccuracy': 0.0, 'pot_rsx': 0.0, 'pot_rdx': 0.0, 'pot_RAccuracy': 0.0,'steeringEncoder': 0.0, 'vel_fsx': 0.0, 'vel_fdx': 0.0, 'vel_rsx': 0.0, 'vel_rdx': 0.0, 'gear': 0} - self.__FrameValues10Hz = {'t_h20': 0, 't_air': 0, 't_oil': 0, 'vbb': 0.0, 'lambda1_avg': 0.0, 'lambda1_raw': 0.0, 'k_lambda1': 0.0, 'inj_low': 0.0, 'inj_high': 0.0} - self.__FrameValues4Hz = {'hour': 0, 'minutes': 0, 'seconds': 0, 'micro_seconds': 0.0, 'n_sats': 0, 'fixQuality': 0, 'e_w': "", 'n_s': "", 'hdop': 0.0, 'latitude': 0.0, 'longitude': 0.0, 'velGPS': 0.0} - - #LINES WRITTEN (USED TO KNOW THE FILE HAS TO BE CLOSED AND REOPENED) + + # Dictionaries used to write data inside the .csv file (sorted by frequency) + self.__FrameValues100Hz = { + 'rpm': 0, + 'tps': 0.0, + 'accel_x': 0.0, + 'accel_y': 0.0, + 'accel_z': 0.0, + 'gyro_x': 0.0, + 'gyro_y': 0.0, + 'gyro_z': 0.0, + 'pot_fsx': 0.0, + 'pot_fdx': 0.0, + 'pot_FAccuracy': 0.0, + 'pot_rsx': 0.0, + 'pot_rdx': 0.0, + 'pot_RAccuracy': 0.0, + 'steeringEncoder': 0.0, + 'vel_fsx': 0.0, + 'vel_fdx': 0.0, + 'vel_rsx': 0.0, + 'vel_rdx': 0.0, + 'gear': 0 + } + self.__FrameValues10Hz = { + 't_h20': 0, + 't_air': 0, + 't_oil': 0, + 'vbb': 0.0, + 'lambda1_avg': 0.0, + 'lambda1_raw': 0.0, + 'k_lambda1': 0.0, + 'inj_low': 0.0, + 'inj_high': 0.0 + } + self.__FrameValues4Hz = { + 'hour': 0, + 'minutes': 0, + 'seconds': 0, + 'micro_seconds': 0.0, + 'n_sats': 0, + 'fixQuality': 0, + 'e_w': "", + 'n_s': "", + 'hdop': 0.0, + 'latitude': 0.0, + 'longitude': 0.0, + 'velGPS': 0.0 + } + + # LINES WRITTEN (USED TO KNOW THE FILE HAS TO BE CLOSED AND REOPENED) self.__lineNumber100Hz = 0 self.__lineNumber10Hz = 0 self.__lineNumber4Hz = 0 - #CREATION OF THE dd_mm_yyyy_hh_mm_ss_100Hz.csv FILE + # CREATION OF THE dd_mm_yyyy_hh_mm_ss_100Hz.csv FILE self.__file100Hz = open(self.__name100Hz, 'w', newline='') - self.__writerFile100Hz = csv.writer(self.__file100Hz, delimiter=';', dialect='excel') + self.__writerFile100Hz = csv.writer(self.__file100Hz, + delimiter=';', + dialect='excel') self.__writerFile100Hz.writerow(list(self.__FrameValues100Hz.keys())) - - #CREATION OF THE dd_mm_yyyy_hh_mm_ss_10Hz.csv FILE + + # CREATION OF THE dd_mm_yyyy_hh_mm_ss_10Hz.csv FILE self.__file10Hz = open(self.__name10Hz, 'w', newline='') - self.__writerFile10Hz = csv.writer(self.__file10Hz, delimiter=';', dialect='excel') + self.__writerFile10Hz = csv.writer(self.__file10Hz, + delimiter=';', + dialect='excel') self.__writerFile10Hz.writerow(list(self.__FrameValues10Hz.keys())) - - #CREATION OF THE dd_mm_yyyy_hh_mm_ss_4Hz.csv FILE + + # CREATION OF THE dd_mm_yyyy_hh_mm_ss_4Hz.csv FILE self.__file4Hz = open(self.__name4Hz, 'w', newline='') - self.__writerFile4Hz = csv.writer(self.__file4Hz, delimiter=';', dialect='excel') + self.__writerFile4Hz = csv.writer(self.__file4Hz, + delimiter=';', + dialect='excel') self.__writerFile4Hz.writerow(list(self.__FrameValues4Hz.keys())) - -#Appends data to the file created before + +# Appends data to the file created before + def write100Hz(self): - #getting the updated dictionaries from the dataFrame object + # getting the updated dictionaries from the dataFrame object self.__engineFrame = self.__dataFrame.getEngineFrame() self.__wheelFrame = self.__dataFrame.getWheelSensorsFrame() self.__gyroscopeFrame = self.__dataFrame.getGyroscopeFrame() - #Updating the "writing" dictionary with new values (a loop isn't used because three different frames are needed) + # Updating the "writing" dictionary with new values (a loop isn't used because three different frames are needed) self.__FrameValues100Hz["rpm"] = self.__engineFrame["rpm"] self.__FrameValues100Hz["tps"] = self.__engineFrame["tps"] self.__FrameValues100Hz['accel_x'] = self.__gyroscopeFrame['accel_x'] @@ -86,74 +139,89 @@ def write100Hz(self): self.__FrameValues100Hz['gyro_z'] = self.__gyroscopeFrame['gyro_z'] self.__FrameValues100Hz['pot_fsx'] = self.__wheelFrame['pot_fsx'] self.__FrameValues100Hz['pot_fdx'] = self.__wheelFrame['pot_fdx'] - self.__FrameValues100Hz['potFAccuracy'] = self.__wheelFrame['potFAccuracy'] + self.__FrameValues100Hz['potFAccuracy'] = self.__wheelFrame[ + 'potFAccuracy'] self.__FrameValues100Hz['pot_rsx'] = self.__wheelFrame['pot_rsx'] self.__FrameValues100Hz['pot_rdx'] = self.__wheelFrame['pot_rdx'] - self.__FrameValues100Hz['potRAccuracy'] = self.__wheelFrame['potRAccuracy'] - self.__FrameValues100Hz['steeringEncoder'] = self.__wheelFrame['steeringEncoder'] + self.__FrameValues100Hz['potRAccuracy'] = self.__wheelFrame[ + 'potRAccuracy'] + self.__FrameValues100Hz['steeringEncoder'] = self.__wheelFrame[ + 'steeringEncoder'] self.__FrameValues100Hz['vel_fsx'] = self.__wheelFrame['vel_fsx'] self.__FrameValues100Hz['vel_fdx'] = self.__wheelFrame['vel_fdx'] self.__FrameValues100Hz['vel_rsx'] = self.__wheelFrame['vel_rsx'] self.__FrameValues100Hz['vel_rdx'] = self.__wheelFrame['vel_rdx'] - self.__FrameValues100Hz['gear'] = self.__wheelFrame['gear'] + # self.__FrameValues100Hz['gear'] = self.__wheelFrame['gear'] - #Writing the whole line in dd_mm_yyyy_hh_mm_ss_100Hz.csv file + # Writing the whole line in dd_mm_yyyy_hh_mm_ss_100Hz.csv file self.__writerFile100Hz.writerow(list(self.__FrameValues100Hz.values())) # CLOSES THE FILE EVERY 500 WRITINGS self.__lineNumber100Hz = (self.__lineNumber100Hz + 1) % 500 - if (self.__lineNumber100Hz==0): + if (self.__lineNumber100Hz == 0): self.__file100Hz.close() self.__file100Hz = open(self.__name100Hz, 'a', newline='') - self.__writerFile100Hz = csv.writer(self.__file100Hz, delimiter=';', dialect='excel') + self.__writerFile100Hz = csv.writer(self.__file100Hz, + delimiter=';', + dialect='excel') def write10Hz(self): - #getting the updated dictionariy from the dataFrame object (only engineFrame is needed) + # getting the updated dictionariy from the dataFrame object (only engineFrame is needed) self.__engineFrame = self.__dataFrame.getEngineFrame() - - #Updating the "writing" dictionary + + # Updating the "writing" dictionary for key in self.__FrameValues10Hz.keys(): self.__FrameValues10Hz[key] = self.__engineFrame[key] - #Writing the whole line in dd_mm_yyyy_hh_mm_ss_10Hz.csv + # Writing the whole line in dd_mm_yyyy_hh_mm_ss_10Hz.csv self.__writerFile10Hz.writerow(list(self.__FrameValues10Hz.values())) - + # CLOSES THE FILE EVERY 50 WRITINGS self.__lineNumber10Hz = (self.__lineNumber10Hz + 1) % 50 - if (self.__lineNumber10Hz==0): + if (self.__lineNumber10Hz == 0): self.__file10Hz.close() self.__file10Hz = open(self.__name10Hz, 'a', newline='') - self.__writerFile10Hz = csv.writer(self.__file10Hz, delimiter=';', dialect='excel') - + self.__writerFile10Hz = csv.writer(self.__file10Hz, + delimiter=';', + dialect='excel') + def write4Hz(self): - #getting the updated dictionariy from the dataFrame object (only GPSFrame is needed) + # getting the updated dictionariy from the dataFrame object (only GPSFrame is needed) self.__GPSFrame = self.__dataFrame.getGPSFrame() - - #Updating the "writing" dictionary + + # Updating the "writing" dictionary for key in self.__FrameValues4Hz.keys(): self.__FrameValues4Hz[key] = self.__GPSFrame[key] - #Writing the whole line in dd_mm_yyyy_hh_mm_ss_4Hz.csv + # Writing the whole line in dd_mm_yyyy_hh_mm_ss_4Hz.csv self.__writerFile4Hz.writerow(list(self.__FrameValues4Hz.values())) # CLOSES THE FILE EVERY 20 WRITINGS self.__lineNumber4Hz = (self.__lineNumber4Hz + 1) % 20 - if (self.__lineNumber4Hz==0): + if (self.__lineNumber4Hz == 0): self.__file4Hz.close() self.__file4Hz = open(self.__name4Hz, 'a', newline='') - self.__writerFile4Hz = csv.writer(self.__file4Hz, delimiter=';', dialect='excel') - - #if the headerIndex has been received writes "ReadError" in the whole line of the file. If not received, "ReadError" will be written in the last line of each file + self.__writerFile4Hz = csv.writer(self.__file4Hz, + delimiter=';', + dialect='excel') + + # if the headerIndex has been received writes "ReadError" in the whole line of the file. If not received, "ReadError" will be written in the last line of each file def writeReadError(self, *args): if len(args) > 0: if args[0] == 0x3F: - self.__writerFile100Hz.writerow(['ReadError'] * len(self.__FrameValues100Hz.keys())) + self.__writerFile100Hz.writerow( + ['ReadError'] * len(self.__FrameValues100Hz.keys())) elif args[0] == 0x0A: - self.__writerFile10Hz.writerow(['ReadError'] * len(self.__FrameValues10Hz.keys())) + self.__writerFile10Hz.writerow( + ['ReadError'] * len(self.__FrameValues10Hz.keys())) elif args[0] == 0x04: - self.__writerFile4Hz.writerow(['ReadError'] * len(self.__FrameValues4Hz.keys())) - - else: - self.__writerFile100Hz.writerow(['ReadError'] * len(self.__FrameValues100Hz.keys())) - self.__writerFile10Hz.writerow(['ReadError'] * len(self.__FrameValues10Hz.keys())) - self.__writerFile4Hz.writerow(['ReadError'] * len(self.__FrameValues4Hz.keys())) \ No newline at end of file + self.__writerFile4Hz.writerow( + ['ReadError'] * len(self.__FrameValues4Hz.keys())) + + else: + self.__writerFile100Hz.writerow( + ['ReadError'] * len(self.__FrameValues100Hz.keys())) + self.__writerFile10Hz.writerow(['ReadError'] * + len(self.__FrameValues10Hz.keys())) + self.__writerFile4Hz.writerow(['ReadError'] * + len(self.__FrameValues4Hz.keys())) diff --git a/oldtmp/GRIFFIN/serialdata/PRE-MERGE/FormatData.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/FormatData.py new file mode 100644 index 0000000..88fd3f4 --- /dev/null +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/FormatData.py @@ -0,0 +1,218 @@ +# from serialdata import FileHandler + + +class FormatData: + + __doc__ = '''Documentation for FormatData.py functions: + + @classmethod + formatData(encodedMessage): + it decodes the encodedMessage given as attribute to the function + if the encodedMessage had been received without errors (the pattern is: every four bytes only three are data bytes): + returns: a list composed by the headerIndex (to know which block (100Hz, 10Hz, 4Hz) the message belongs to) and the data bytes + + else: + returns: ['E', 'R', 'R', 'O', 'R'] to emphasize that an error has occured + + @classmethod + setData(dataFrame, encodedMessage, fileHandler): + using formatData() function, it decodes the message and updates the dictionaries inside the dataFrame object. + if (decodedMessage[0]==0x3F): checks if the transmitted block is the 100Hz one + elif (decodedMessage[0]==0x0A): checks if the transmitted block is the 10Hz one + elif(decodedMessage[0]==0x04): checks if the transmitted block is the 4Hz one + + Once the update is completed, the function uses the fileHandler object to save data to .csv file + ''' + + @classmethod + def formatData(cls, encodedMessage): + if encodedMessage in [ + bytes([0x3F]) + b'ReadError', + bytes([0x0A]) + b'ReadError', + bytes([0x0A]) + b'ReadError' + ]: + return ['E', 'R', 'R', 'O', 'R', encodedMessage[0] & 0x3F] + + elif len(encodedMessage) % 4 != 1 or ( + encodedMessage == b'ReadError' + ): # We receive a number of bytes multiple of 4, plus the byte which gives us the headerIndex of the block received + return [ + 'E', 'R', 'R', 'O', 'R' + ] # if it is False (it includes also the case of receiving 'ReadError') returns ['E', 'R', 'R', 'O', 'R'] to emphasize that an error has occured + + else: + encodedMessage = list(encodedMessage) + decodedMessage = [] + headerIndex = encodedMessage[0] & 0x3F + decodedMessage.append(headerIndex) + for i in range(0, len(encodedMessage) // 4): + firstByte = ((encodedMessage[4 * i + 1] & 0x3F) << 2 | + (encodedMessage[4 * i + 2] & 0x3F) >> 4) & 0xFF + secondByte = ((encodedMessage[4 * i + 2] & 0x3F) << 4 | + (encodedMessage[4 * i + 3] & 0x3F) >> 2) & 0xFF + thirdByte = ((encodedMessage[4 * i + 3] & 0x3F) << 6 | + (encodedMessage[4 * i + 4] & 0x3F)) & 0xFF + decodedMessage.append(firstByte) + decodedMessage.append(secondByte) + decodedMessage.append(thirdByte) + return decodedMessage + + @classmethod + def setData(cls, dataFrame, encodedMessage, fileHandler): + decodedMessage = FormatData.formatData(encodedMessage) + if (decodedMessage[0] == 0x3F): + dataFrame.setEngineFrame( + "rpm", + int(decodedMessage[1]) << 8 | int(decodedMessage[2])) + dataFrame.setEngineFrame( + "tps", + (float(int(decodedMessage[3]) << 8 | int(decodedMessage[4]))) / + 10) + + dataFrame.setGyroscopeFrame( + "accel_x", + (float(int(decodedMessage[5]) << 8 | int(decodedMessage[6]))) / + 8192) + dataFrame.setGyroscopeFrame( + "accel_y", + (float(int(decodedMessage[7]) << 8 | int(decodedMessage[8]))) / + 8192) + dataFrame.setGyroscopeFrame( + "accel_z", + (float(int(decodedMessage[9]) << 8 | int(decodedMessage[10]))) + / 8192) + + dataFrame.setGyroscopeFrame( + "gyro_x", + (float(int(decodedMessage[11]) << 8 | int(decodedMessage[12]))) + / 8192) + dataFrame.setGyroscopeFrame( + "gyro_y", + (float(int(decodedMessage[13]) << 8 | int(decodedMessage[14]))) + / 8192) + dataFrame.setGyroscopeFrame( + "gyro_z", + (float(int(decodedMessage[15]) << 8 | int(decodedMessage[16]))) + / 8192) + + # POTENTIOMETER'S OFFSET (THE NUMBER SUBTRACTED AT THE END OF THE LINE) MUST BE CALCULATED AT EVERY CAR'S TEST + dataFrame.setWheelSensorsFrame( + "pot_fsx", (int(decodedMessage[17]) | + ((int(decodedMessage[19] & 0x0F)) << 8)) - 610) + dataFrame.setWheelSensorsFrame( + "pot_fdx", (int(decodedMessage[18]) | + ((int(decodedMessage[19] & 0xF0)) << 4)) - 410) + dataFrame.setWheelSensorsFrame("potFAccuracy", + int(decodedMessage[20])) + dataFrame.setWheelSensorsFrame( + "pot_rsx", (int(decodedMessage[21]) | + ((int(decodedMessage[23] & 0x0F)) << 8)) - 300) + dataFrame.setWheelSensorsFrame( + "pot_rdx", (int(decodedMessage[22]) | + ((int(decodedMessage[23] & 0xF0)) << 4)) - 310) + dataFrame.setWheelSensorsFrame("potRAccuracy", + int(decodedMessage[24])) + + dataFrame.setWheelSensorsFrame( + "countFSx", (int(decodedMessage[27] & 0x0F) << 8) + | int(decodedMessage[25])) + dataFrame.setWheelSensorsFrame( + "countFDx", (int(decodedMessage[27] & 0xF0) << 4) + | int(decodedMessage[26])) + dataFrame.setWheelSensorsFrame("dtF", int(decodedMessage[28])) + + # dataFrame.setWheelSensorsFrame("vel_fsx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) + # dataFrame.setWheelSensorsFrame("vel_fdx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) + + dataFrame.setWheelSensorsFrame( + "countRSx", (int(decodedMessage[32] & 0x0F) << 8) + | int(decodedMessage[30])) + dataFrame.setWheelSensorsFrame( + "countRDx", (int(decodedMessage[32] & 0xF0) << 4) + | int(decodedMessage[31])) + dataFrame.setWheelSensorsFrame("dtR", int(decodedMessage[33])) + + # dataFrame.setWheelSensorsFrame("vel_rsx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) + # dataFrame.setWheelSensorsFrame("vel_rdx", SPEED_VALUE) # NOT IN USE (PHONIC WHEEL'S SPECS NOT AVAILABLE) + + dataFrame.setEngineFrame("gear", int(decodedMessage[34])) + + fileHandler.write100Hz() + + elif (decodedMessage[0] == 0x0A): + dataFrame.setEngineFrame("t_h20", int(decodedMessage[1]) - 40) + dataFrame.setEngineFrame("t_air", int(decodedMessage[2]) - 40) + dataFrame.setEngineFrame("t_oil", int(decodedMessage[3]) - 40) + dataFrame.setEngineFrame("vbb", + (float(int(decodedMessage[4]))) * 0.0705) + dataFrame.setEngineFrame("lambda1_avg", + (float(int(decodedMessage[5]))) / 100) + dataFrame.setEngineFrame("lambda1_raw", + (float(int(decodedMessage[6]))) / 100) + dataFrame.setEngineFrame( + "k_lambda1", + (float(int(decodedMessage[7]) << 8 | int(decodedMessage[8]))) / + 656) + dataFrame.setEngineFrame( + "inj_low", + (float(int(decodedMessage[9]) << 8 | int(decodedMessage[10]))) + / 2) + dataFrame.setEngineFrame( + "inj_high", + (float(int(decodedMessage[11]) << 8 | int(decodedMessage[12]))) + / 2) + + fileHandler.write10Hz() + + elif (decodedMessage[0] == 0x04): + dataFrame.setGPSFrame("hour", int(decodedMessage[1])) + dataFrame.setGPSFrame("minutes", int(decodedMessage[2])) + dataFrame.setGPSFrame("seconds", int(decodedMessage[3])) + dataFrame.setGPSFrame("micro_seconds", + (int(decodedMessage[4]) << 8) | + (int(decodedMessage[5]))) + dataFrame.setGPSFrame("n_sats", int(decodedMessage[6] & 0x0F)) + dataFrame.setGPSFrame("fixQuality", + int((decodedMessage[6] & 0x30) >> 4)) + e_w = int((decodedMessage[6] >> 6) & 0x01) + if (e_w == 1): + dataFrame.setGPSFrame("e_w", "E") + else: + dataFrame.setGPSFrame("e_w", "W") + + n_s = int(decodedMessage[6] >> 7) + if (n_s == 1): + dataFrame.setGPSFrame("n_s", "N") + else: + dataFrame.setGPSFrame("n_s", "S") + + dataFrame.setGPSFrame( + "hdop", + int(decodedMessage[7] << 8) | int(decodedMessage[8])) + dataFrame.setGPSFrame( + "latitude", + ((int(decodedMessage[9]) << 8) | int(decodedMessage[10])) + + ((float((int(decodedMessage[11]) << 24) | + (int(decodedMessage[12]) << 16) | + (int(decodedMessage[13]) << 8) + | int(decodedMessage[14]))) / 100000)) + dataFrame.setGPSFrame( + "longitude", + ((int(decodedMessage[15]) << 24) | + (int(decodedMessage[16]) << 16) | + (int(decodedMessage[17]) << 8) | int(decodedMessage[18])) + + ((float((int(decodedMessage[19]) << 24) | + (int(decodedMessage[20]) << 16) | + (int(decodedMessage[21]) << 8) + | int(decodedMessage[22]))) / 100000)) + dataFrame.setGPSFrame( + "velGPS", + float(decodedMessage[23]) + ((float(decodedMessage[23])) / 10)) + + fileHandler.write4Hz() + + elif decodedMessage[0:5] == ['E', 'R', 'R', 'O', 'R']: + if len(decodedMessage) == 6: + fileHandler.writeReadError(decodedMessage[5]) + else: + fileHandler.writeReadError() diff --git a/GUI/RealTime/OldFileHandler.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/OldFileHandler.py similarity index 68% rename from GUI/RealTime/OldFileHandler.py rename to oldtmp/GRIFFIN/serialdata/PRE-MERGE/OldFileHandler.py index ab16c52..8c12e7d 100644 --- a/GUI/RealTime/OldFileHandler.py +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/OldFileHandler.py @@ -1,11 +1,11 @@ +import csv +import time +# from GUI.RealTime import DataFrame -import csv, time -from GUI.RealTime import DataFrame - class FileHandler: -#Creates a FileHandler object to save data in CSV file called "dd_mm_yyyy hh_mm__ss.csv" + # Creates a FileHandler object to save data in CSV file called "dd_mm_yyyy hh_mm__ss.csv" def __init__(self, dataFrame): self.__dataFrame = dataFrame @@ -13,9 +13,16 @@ def __init__(self, dataFrame): self.__name100Hz = nome + "100Hz.csv" self.__name10Hz = nome + "10Hz.csv" self.__name4Hz = nome + "4Hz.csv" - self.__fieldnames100Hz = ['rpm', 'tps', 'accel_x', 'accel_y', 'accel_z', 'gyro_x', 'gyro_y', 'gyro_z', 'pot_fsx', 'pot_fdx', 'pot_FAccuracy', 'pot_rsx', 'pot_rdx', 'pot_RAccuracy','steeringEncoder'] - self.__fieldnames10Hz = ['t_h20', 't_air', 't_oil', 'vbb', 'lambda1_avg', 'lambda1_raw', 'k_lambda1', 'inj_low', 'inj_high'] - self.__fieldnames4Hz = [''] #DA FARE + self.__fieldnames100Hz = [ + 'rpm', 'tps', 'accel_x', 'accel_y', 'accel_z', 'gyro_x', 'gyro_y', + 'gyro_z', 'pot_fsx', 'pot_fdx', 'pot_FAccuracy', 'pot_rsx', + 'pot_rdx', 'pot_RAccuracy', 'steeringEncoder' + ] + self.__fieldnames10Hz = [ + 't_h20', 't_air', 't_oil', 'vbb', 'lambda1_avg', 'lambda1_raw', + 'k_lambda1', 'inj_low', 'inj_high' + ] + self.__fieldnames4Hz = [''] # DA FARE with open(self.__name100Hz, 'w', newline='') as file100Hz: writer = csv.writer(file100Hz, delimiter=';', dialect='excel') writer.writerow(self.__fieldnames100Hz) @@ -26,7 +33,9 @@ def __init__(self, dataFrame): writer = csv.writer(file4Hz, delimiter=';', dialect='excel') writer.writerow(self.__fieldnames4Hz) -#Appends data to the file created before + +# Appends data to the file created before + def write100Hz(self): engineFrame100Hz = self.__dataFrame.getEngineFrame() wheelFrame100Hz = self.__dataFrame.getWheelSensorsFrame() @@ -46,15 +55,21 @@ def write100Hz(self): FrameValues100Hz.append(wheelFrame100Hz['potRAccuracy']) FrameValues100Hz.append(wheelFrame100Hz['steeringEncoder']) # gpsFrameValues = list(self.__dataFrame.getGPSFrame().values()) - # wheelSensorsFrameValues = list(self.__dataFrame.getWheelSensorsFrame().values()) + + # wheelSensorsFrameValues = list(self.__dataFrame.getWheelSensorsFrame().values()) + # gyroscopeFrameValues = list(self.__dataFrame.getGyroscopeFrame().values()) - with open (self.__name100Hz, 'a', newline='') as csvfile100Hz: + with open(self.__name100Hz, 'a', newline='') as csvfile100Hz: writer = csv.writer(csvfile100Hz, delimiter=';', dialect='excel') writer.writerow(FrameValues100Hz) - + def write10Hz(self): engineFrame10Hz = self.__dataFrame.getEngineFrame() - FrameValues10Hz = [engineFrame10Hz["t_h20"], engineFrame10Hz["t_air"], engineFrame10Hz["t_oil"], engineFrame10Hz["vbb"], engineFrame10Hz["lambda1_avg"], engineFrame10Hz["lambda1_raw"], engineFrame10Hz["k_lambda1"], engineFrame10Hz["inj_low"], engineFrame10Hz["inj_high"]] - with open (self.__name10Hz, 'a', newline='') as csvfile10Hz: + FrameValues10Hz = [ + engineFrame10Hz["t_h20"], engineFrame10Hz["t_air"], + engineFrame10Hz["t_oil"], engineFrame10Hz["vbb"], + engineFrame10Hz["lambda1_avg"], engineFrame10Hz["lambda1_raw"], + engineFrame10Hz["k_lambda1"], engineFrame10Hz["inj_low"], + engineFrame10Hz["inj_high"] + ] + with open(self.__name10Hz, 'a', newline='') as csvfile10Hz: writer = csv.writer(csvfile10Hz, delimiter=';', dialect='excel') writer.writerow(FrameValues10Hz) diff --git a/GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py similarity index 68% rename from GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py rename to oldtmp/GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py index 1f962ca..4abf9e5 100644 --- a/GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/SerialHandler.py @@ -1,9 +1,10 @@ import serial from time import sleep + class SerialHandler: - __doc__='''Documentation for SerialHandler.py functions: + __doc__ = '''Documentation for SerialHandler.py functions: -__init__(name, baudrate, **kwargs): -stopBit @@ -35,83 +36,88 @@ class SerialHandler: return a list that contains the available ports (WORKS ONLY WITH WINDOWS O.S.)''' def __init__(self, name, baudrate, **kwargs): - self.__portName=name - self.__baudRate=baudrate + self.__portName = name + self.__baudRate = baudrate if "stopBit" in kwargs.keys(): self.__stopBit = kwargs["stopBit"] else: - self.__stopBit=1 + self.__stopBit = 1 if "length" in kwargs.keys(): - self.__wordLength=kwargs["length"] + self.__wordLength = kwargs["length"] else: - self.__wordLength=8 - + self.__wordLength = 8 + if "parity" in kwargs.keys(): - self.__wordParity=kwargs["parity"] + self.__wordParity = kwargs["parity"] else: - self.__wordParity='N' + self.__wordParity = 'N' if "timeout" in kwargs.keys(): - self.__timeout=kwargs["timeout"] + self.__timeout = kwargs["timeout"] else: - self.__timeout=600/self.__baudRate - + self.__timeout = 600 / self.__baudRate + if "bytesToRead" in kwargs.keys(): - self.__bytesToRead=kwargs["bytesToRead"] + self.__bytesToRead = kwargs["bytesToRead"] else: - self.__bytesToRead=1 - - self.__serialInstance = serial.Serial(port=self.__portName, baudrate=self.__baudRate, bytesize=self.__wordLength, parity=self.__wordParity, stopbits=self.__stopBit, timeout=self.__timeout) + self.__bytesToRead = 1 + + self.__serialInstance = serial.Serial(port=self.__portName, + baudrate=self.__baudRate, + bytesize=self.__wordLength, + parity=self.__wordParity, + stopbits=self.__stopBit, + timeout=self.__timeout) self.__serialInstance.close() - + def readData(self, **kwargs): messageRead = bytes() if "size" in kwargs.keys(): bytesToRead = kwargs["size"] else: bytesToRead = self.__bytesToRead - + if "startChar" in kwargs.keys() and not "endChar" in kwargs.keys(): - attempt=0 + attempt = 0 startChar = kwargs["startChar"] while True: charReceived = self.__serialInstance.read(size=1) if charReceived == startChar: for i in range(0, bytesToRead): - messageRead+=(self.__serialInstance.read(1)) + messageRead += (self.__serialInstance.read(1)) break - elif attempt>=bytesToRead: - return b'ReadError' + elif attempt >= bytesToRead: + return b'ReadError' else: - attempt+=1 + attempt += 1 elif "startChar" in kwargs.keys() and "endChar" in kwargs.keys(): - attempt=0 + attempt = 0 startChar = kwargs["startChar"] while True: charReceived = self.__serialInstance.read(size=1) if charReceived == startChar: charReceived = self.__serialInstance.read(size=1) while charReceived != kwargs["endChar"]: - messageRead+=charReceived - charReceived=self.__serialInstance.read(size=1) - if charReceived==kwargs["endChar"]: + messageRead += charReceived + charReceived = self.__serialInstance.read(size=1) + if charReceived == kwargs["endChar"]: break - elif attempt>=200: + elif attempt >= 200: if len(messageRead) > 0: return messageRead[0] + b'ReadError' else: return b'ReadError' else: - attempt+=1 + attempt += 1 else: for i in range(0, bytesToRead): - messageRead+=(self.__serialInstance.read(1)) - + messageRead += (self.__serialInstance.read(1)) + return messageRead - + def writeData(self, **kwargs): if "byte" in kwargs.keys(): self.__serialInstance.write(kwargs["byte"]) @@ -129,9 +135,8 @@ def openPort(self): def closePort(self): self.__serialInstance.close() - - #TO-DO: scanCOMs works also for Linux O.S. - #Method to list ALL the Serial ports (ONLY FOR WINDOWS) + # TO-DO: scanCOMs works also for Linux O.S. + # Method to list ALL the Serial ports (ONLY FOR WINDOWS) @classmethod def scanCOMs(cls): portList = [] @@ -143,4 +148,4 @@ def scanCOMs(cls): portList.append(portToCheck) except serial.SerialException: pass - return portList \ No newline at end of file + return portList diff --git a/oldtmp/GRIFFIN/serialdata/PRE-MERGE/test.py b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/test.py new file mode 100644 index 0000000..bda8bc6 --- /dev/null +++ b/oldtmp/GRIFFIN/serialdata/PRE-MERGE/test.py @@ -0,0 +1,23 @@ +from DataFrame import DataFrame +from SerialHandler import SerialHandler +from FormatData import FormatData +from FileHandler import FileHandler +from time import sleep + +df = DataFrame() +fh = FileHandler(df) +sh = SerialHandler("/dev/ttyACM0", 115200) +sh.openPort() + +try: + while True: + data = sh.readData(startChar=b'\x02', endChar=b'\x03') + + FormatData.setData(df, data, fh) + print(df) + sleep(.01) + +except KeyboardInterrupt: + sh.closePort() + +print("FINE") diff --git a/GRIFFIN/serialdata/SerialHandler.py b/oldtmp/GRIFFIN/serialdata/SerialHandler.py similarity index 100% rename from GRIFFIN/serialdata/SerialHandler.py rename to oldtmp/GRIFFIN/serialdata/SerialHandler.py diff --git a/GRIFFIN/serialdata/__init__.py b/oldtmp/GRIFFIN/serialdata/__init__.py similarity index 100% rename from GRIFFIN/serialdata/__init__.py rename to oldtmp/GRIFFIN/serialdata/__init__.py diff --git a/GRIFFIN/tkinter tips.txt b/oldtmp/GRIFFIN/tkinter tips.txt similarity index 100% rename from GRIFFIN/tkinter tips.txt rename to oldtmp/GRIFFIN/tkinter tips.txt diff --git a/GRIFFIN/todo.txt b/oldtmp/GRIFFIN/todo.txt similarity index 100% rename from GRIFFIN/todo.txt rename to oldtmp/GRIFFIN/todo.txt diff --git a/GUI/ErrorHandler.py b/oldtmp/GUI/ErrorHandler.py similarity index 100% rename from GUI/ErrorHandler.py rename to oldtmp/GUI/ErrorHandler.py diff --git a/GUI/Launcher/settings.py b/oldtmp/GUI/Launcher/settings.py similarity index 100% rename from GUI/Launcher/settings.py rename to oldtmp/GUI/Launcher/settings.py diff --git a/GUI/PostGara/TODO.py b/oldtmp/GUI/PostGara/TODO.py similarity index 100% rename from GUI/PostGara/TODO.py rename to oldtmp/GUI/PostGara/TODO.py diff --git a/GRIFFIN/serialdata/PRE-MERGE/DataFrame.py b/oldtmp/GUI/RealTime/DataFrame.py similarity index 100% rename from GRIFFIN/serialdata/PRE-MERGE/DataFrame.py rename to oldtmp/GUI/RealTime/DataFrame.py diff --git a/GUI/RealTime/FileHandler.py b/oldtmp/GUI/RealTime/FileHandler.py similarity index 100% rename from GUI/RealTime/FileHandler.py rename to oldtmp/GUI/RealTime/FileHandler.py diff --git a/GUI/RealTime/FormatData.py b/oldtmp/GUI/RealTime/FormatData.py similarity index 100% rename from GUI/RealTime/FormatData.py rename to oldtmp/GUI/RealTime/FormatData.py diff --git a/GRIFFIN/serialdata/PRE-MERGE/OldFileHandler.py b/oldtmp/GUI/RealTime/OldFileHandler.py similarity index 100% rename from GRIFFIN/serialdata/PRE-MERGE/OldFileHandler.py rename to oldtmp/GUI/RealTime/OldFileHandler.py diff --git a/GUI/RealTime/README.txt b/oldtmp/GUI/RealTime/README.txt similarity index 100% rename from GUI/RealTime/README.txt rename to oldtmp/GUI/RealTime/README.txt diff --git a/GUI/RealTime/SerialHandler.py b/oldtmp/GUI/RealTime/SerialHandler.py similarity index 100% rename from GUI/RealTime/SerialHandler.py rename to oldtmp/GUI/RealTime/SerialHandler.py diff --git a/GUI/RealTime/Utils/helperTools.py b/oldtmp/GUI/RealTime/Utils/helperTools.py similarity index 100% rename from GUI/RealTime/Utils/helperTools.py rename to oldtmp/GUI/RealTime/Utils/helperTools.py diff --git a/GUI/RealTime/testMain.py b/oldtmp/GUI/RealTime/testMain.py similarity index 100% rename from GUI/RealTime/testMain.py rename to oldtmp/GUI/RealTime/testMain.py diff --git a/GUI/VirtualCockpit.py b/oldtmp/GUI/VirtualCockpit.py similarity index 100% rename from GUI/VirtualCockpit.py rename to oldtmp/GUI/VirtualCockpit.py diff --git a/GUI/globalstuff.py b/oldtmp/GUI/globalstuff.py similarity index 100% rename from GUI/globalstuff.py rename to oldtmp/GUI/globalstuff.py diff --git a/GUI/tableview.py b/oldtmp/GUI/tableview.py similarity index 100% rename from GUI/tableview.py rename to oldtmp/GUI/tableview.py diff --git a/Joe-Test/fh.py b/oldtmp/Joe-Test/fh.py similarity index 100% rename from Joe-Test/fh.py rename to oldtmp/Joe-Test/fh.py diff --git a/Joe-Test/gui.py b/oldtmp/Joe-Test/gui.py similarity index 100% rename from Joe-Test/gui.py rename to oldtmp/Joe-Test/gui.py diff --git a/Joe-Test/sh.py b/oldtmp/Joe-Test/sh.py similarity index 100% rename from Joe-Test/sh.py rename to oldtmp/Joe-Test/sh.py diff --git a/Joe-Test/test_pipe.py b/oldtmp/Joe-Test/test_pipe.py similarity index 100% rename from Joe-Test/test_pipe.py rename to oldtmp/Joe-Test/test_pipe.py diff --git a/Launcher.py b/oldtmp/Launcher.py similarity index 100% rename from Launcher.py rename to oldtmp/Launcher.py diff --git a/Pipfile b/oldtmp/Pipfile similarity index 100% rename from Pipfile rename to oldtmp/Pipfile diff --git a/Pipfile.lock b/oldtmp/Pipfile.lock similarity index 100% rename from Pipfile.lock rename to oldtmp/Pipfile.lock diff --git a/oldtmp/README.md b/oldtmp/README.md new file mode 100644 index 0000000..93458bf --- /dev/null +++ b/oldtmp/README.md @@ -0,0 +1,2 @@ +# Formula-SAE +Progetto formula sae 2019/2020 diff --git a/RealTimeMode.py b/oldtmp/RealTimeMode.py similarity index 100% rename from RealTimeMode.py rename to oldtmp/RealTimeMode.py diff --git a/installer.cfg b/oldtmp/installer.cfg similarity index 100% rename from installer.cfg rename to oldtmp/installer.cfg diff --git a/res/background.png b/oldtmp/res/background.png similarity index 100% rename from res/background.png rename to oldtmp/res/background.png diff --git a/res/icon.ico b/oldtmp/res/icon.ico similarity index 100% rename from res/icon.ico rename to oldtmp/res/icon.ico diff --git a/res/long_pointer.png b/oldtmp/res/long_pointer.png similarity index 100% rename from res/long_pointer.png rename to oldtmp/res/long_pointer.png diff --git a/res/postgara.gif b/oldtmp/res/postgara.gif similarity index 100% rename from res/postgara.gif rename to oldtmp/res/postgara.gif diff --git a/res/refresh_icon.gif b/oldtmp/res/refresh_icon.gif similarity index 100% rename from res/refresh_icon.gif rename to oldtmp/res/refresh_icon.gif diff --git a/res/serial.gif b/oldtmp/res/serial.gif similarity index 100% rename from res/serial.gif rename to oldtmp/res/serial.gif diff --git a/res/short_pointer2.png b/oldtmp/res/short_pointer2.png similarity index 100% rename from res/short_pointer2.png rename to oldtmp/res/short_pointer2.png diff --git a/res/textmodeicon.gif b/oldtmp/res/textmodeicon.gif similarity index 100% rename from res/textmodeicon.gif rename to oldtmp/res/textmodeicon.gif diff --git a/testLabelUpdate.py b/oldtmp/testLabelUpdate.py similarity index 100% rename from testLabelUpdate.py rename to oldtmp/testLabelUpdate.py diff --git a/testWriter.txt b/oldtmp/testWriter.txt similarity index 100% rename from testWriter.txt rename to oldtmp/testWriter.txt diff --git a/package.json b/package.json new file mode 100644 index 0000000..2bd7403 --- /dev/null +++ b/package.json @@ -0,0 +1,74 @@ +{ + "name": "react-pywebview-boilerplate", + "version": "0.1.0", + "private": true, + "homepage": "./", + "dependencies": { + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "@types/jest": "^26.0.15", + "@types/node": "^12.0.0", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-scripts": "4.0.3", + "sass": "^1.43.4", + "typescript": "^4.1.2", + "web-vitals": "^1.0.1" + }, + "scripts": { + "dev": "react-scripts start", + "frontend:dev": "BUILD_PATH='./gui' react-scripts build", + "frontend:prod": "BUILD_PATH='./gui' react-scripts build", + "frontend:test": "react-scripts test", + "frontend:eject": "react-scripts eject", + "build": "export NODE_OPTIONS='--openssl-legacy-provider' && yarn run clean && yarn run frontend:prod && run-script-os", + "build:macos": "./venv-pywebview/bin/python build-macos.py py2app", + "build:windows": ".\\venv-pywebview\\Scripts\\pyinstaller build-windows.spec", + "build:linux": "./venv-pywebview/bin/pyinstaller build-linux.spec", + "clean": "run-script-os", + "clean:default": "rm -rf gui 2>/dev/null; rm -rf build 2>/dev/null; rm -rf dist 2>/dev/null; ", + "clean:windows": "if exist gui rd /S /Q gui & if exist build rd /S /Q build & if exist dist rd /S /Q dist", + "cleanall": "yarn run clean && run-script-os", + "cleanall:default": "rm -rf node_modules 2>/dev/null; rm -rf venv-pywebview 2>/dev/null; ", + "cleanall:windows": "if exist node_modules rd /S /Q node_modules & if exist venv-pywebview rd /S /Q venv-pywebview", + "init": "yarn install && run-script-os", + "init:windows": "virtualenv -p python venv-pywebview && .\\venv-pywebview\\Scripts\\pip install -r requirements.txt", + "init:linux": "virtualenv -p python3 venv-pywebview && if [[ -z \"${KDE_FULL_SESSION}\" ]]; then yarn run init:qt5; else yarn run init:gtk; fi", + "init:default": "virtualenv -p python3 venv-pywebview && ./venv-pywebview/bin/pip install -r requirements.txt", + "init:qt5": "./venv-pywebview/bin/pip install pyqt5 pyqtwebengine -r requirements.txt", + "init:gtk": "./venv-pywebview/bin/pip install pycairo PyGObject -r requirements.txt", + "//init:gtk": "sudo apt install libgirepository1.0-dev gcc libcairo2-dev pkg-config python3-dev gir1.2-gtk-3.0 && ./venv-pywebview/bin/pip install pycairo pygobject -r requirements.txt", + "init:docs": "./venv-pywebview/bin/pip install pylama yapf", + "start": "export NODE_OPTIONS='--openssl-legacy-provider' && yarn run frontend:dev && run-script-os", + "start:windows": ".\\venv-pywebview\\Scripts\\python src\\index.py", + "start:default": "./venv-pywebview/bin/python src/index.py", + + "pylintcheck": "pylama -f pylint ./src/", + "pylint":"yapf --recursive -i ./src/" + + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "run-script-os": "^1.1.6" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..9906569 --- /dev/null +++ b/public/index.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + React App + + + + +
+ + + + \ No newline at end of file diff --git a/public/logo192.png b/public/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/public/logo512.png differ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ec7dbb6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +setuptools +pywebview +pyinstaller; sys_platform != 'darwin' +py2app; sys_platform == 'darwin' +pyserial diff --git a/src/App.test.tsx b/src/App.test.tsx new file mode 100644 index 0000000..2a68616 --- /dev/null +++ b/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/assets/logo.icns b/src/assets/logo.icns new file mode 100644 index 0000000..556e3e6 Binary files /dev/null and b/src/assets/logo.icns differ diff --git a/src/assets/logo.ico b/src/assets/logo.ico new file mode 100644 index 0000000..42fe414 Binary files /dev/null and b/src/assets/logo.ico differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..500b845 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/open-sans-v17-latin_cyrillic-italic.woff b/src/assets/open-sans-v17-latin_cyrillic-italic.woff new file mode 100644 index 0000000..fb61293 Binary files /dev/null and b/src/assets/open-sans-v17-latin_cyrillic-italic.woff differ diff --git a/src/assets/open-sans-v17-latin_cyrillic-regular.woff b/src/assets/open-sans-v17-latin_cyrillic-regular.woff new file mode 100644 index 0000000..da74969 Binary files /dev/null and b/src/assets/open-sans-v17-latin_cyrillic-regular.woff differ diff --git a/src/assets/roboto-condensed-v18-latin_cyrillic-regular.woff b/src/assets/roboto-condensed-v18-latin_cyrillic-regular.woff new file mode 100644 index 0000000..37da48b Binary files /dev/null and b/src/assets/roboto-condensed-v18-latin_cyrillic-regular.woff differ diff --git a/src/components/Editor/Editor.sass b/src/components/Editor/Editor.sass new file mode 100644 index 0000000..7289bd9 --- /dev/null +++ b/src/components/Editor/Editor.sass @@ -0,0 +1,20 @@ +.editor-container + padding: 0 3rem + text-align: center + .textarea + width: 30rem + height: 10rem + margin: 2rem + color: #2c3e50 +.button + display: inline-block + font-size: 1.2rem + color: #fff + background-color: #3eaf7c + padding: .8rem 1.6rem + border-radius: 4px + transition: background-color .1s ease + box-sizing: border-box + border-bottom: 1px solid #389d70 + &:hover + background-color: #4abf8a diff --git a/src/components/Editor/Editor.tsx b/src/components/Editor/Editor.tsx new file mode 100644 index 0000000..637372d --- /dev/null +++ b/src/components/Editor/Editor.tsx @@ -0,0 +1,21 @@ +import * as React from 'react' + +import './Editor.sass' + + +export default function Header() { + const [content, saveContent] = + React.useState('Using Python as backend, you can perform operations that are not allowed in Javascript, for example disk access. Click button below to save this content to hard drive.') + + return ( +
+