From 0f012cbc0f103d627f86749ea9709eb268b65bbb Mon Sep 17 00:00:00 2001 From: Guillaume <sagitta1618@gmail.com> Date: Mon, 7 Feb 2022 20:28:07 +0100 Subject: [PATCH] add an onpi variable to test the dashboard on computer first --- .gitignore | 1 + Ohmpi.py | 377 +++++++++--------- env.sh | 7 + index.html | 6 +- ohmpi_param.json | 2 +- old-requirements.txt | 20 + requirements.txt | 30 +- run.sh | 2 + .../step_n_3/a/MUX_board_list_2_xx.xlsx | Bin 12387 -> 12398 bytes webserver.py | 98 +++++ 10 files changed, 336 insertions(+), 207 deletions(-) create mode 100644 env.sh create mode 100644 old-requirements.txt create mode 100644 run.sh create mode 100644 webserver.py diff --git a/.gitignore b/.gitignore index 09fd4bd1..8c469515 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ data/*.csv **/.ipynb_notebooks/** data.zip +__pycache__ diff --git a/Ohmpi.py b/Ohmpi.py index df36b926..c0fe2fda 100644 --- a/Ohmpi.py +++ b/Ohmpi.py @@ -24,19 +24,23 @@ import pandas as pd import time from datetime import datetime from termcolor import colored +import threading -""" -import board, busio,adafruit_tca9548a -import adafruit_ads1x15.ads1115 as ADS -from adafruit_ads1x15.analog_in import AnalogIn -from adafruit_mcp230xx.mcp23008 import MCP23008 -from adafruit_mcp230xx.mcp23017 import MCP23017 -import digitalio -from digitalio import Direction -from gpiozero import CPUTemperature -""" current_time = datetime.now() print(current_time.strftime("%Y-%m-%d %H:%M:%S")) + +onpi = False # set to True if running on raspberrypi + +if onpi: + import board, busio,adafruit_tca9548a + import adafruit_ads1x15.ads1115 as ADS + from adafruit_ads1x15.analog_in import AnalogIn + from adafruit_mcp230xx.mcp23008 import MCP23008 + from adafruit_mcp230xx.mcp23017 import MCP23017 + import digitalio + from digitalio import Direction + from gpiozero import CPUTemperature + """ Hardware parameters """ @@ -58,181 +62,181 @@ Import parameters #with open('ohmpi_param.json') as json_file: # pardict = json.load(json_file) -""" -i2c = busio.I2C(board.SCL, board.SDA) #activation du protocle I2C -mcp = MCP23008(i2c, address=0x20) #connexion I2C MCP23008, injection de courant -ads_current = ADS.ADS1115(i2c, gain=16,data_rate=860, address=0X48)# connexion ADS1115, pour la mesure de courant -ads_voltage = ADS.ADS1115(i2c, gain=2/3,data_rate=860, address=0X49)# connexion ADS1115, pour la mesure de courant -#initialisation desvoie pour la polarité -pin0 = mcp.get_pin(0) -pin0.direction = Direction.OUTPUT -pin1 = mcp.get_pin(1) -pin1.direction = Direction.OUTPUT -pin0.value = False -pin1.value = False - - -# Initialisation MUX -Elec_A= adafruit_tca9548a.TCA9548A(i2c, 0X76) -Elec_B= adafruit_tca9548a.TCA9548A(i2c, 0X71) -Elec_M= adafruit_tca9548a.TCA9548A(i2c, 0X74) -Elec_N= adafruit_tca9548a.TCA9548A(i2c, 0X70) -""" +if onpi: + i2c = busio.I2C(board.SCL, board.SDA) #activation du protocle I2C + mcp = MCP23008(i2c, address=0x20) #connexion I2C MCP23008, injection de courant + ads_current = ADS.ADS1115(i2c, gain=16,data_rate=860, address=0X48)# connexion ADS1115, pour la mesure de courant + ads_voltage = ADS.ADS1115(i2c, gain=2/3,data_rate=860, address=0X49)# connexion ADS1115, pour la mesure de courant + #initialisation desvoie pour la polarité + pin0 = mcp.get_pin(0) + pin0.direction = Direction.OUTPUT + pin1 = mcp.get_pin(1) + pin1.direction = Direction.OUTPUT + pin0.value = False + pin1.value = False -""" -functions -""" -""" -# function swtich_mux select the right channels for the multiplexer cascade for electrodes A, B, M and N. -def switch_mux_on(quadripole): - elec_adress=[0x76,0X71,0x74,0x70] - - for i in range(0,4): - tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N + # Initialisation MUX + Elec_A= adafruit_tca9548a.TCA9548A(i2c, 0X76) + Elec_B= adafruit_tca9548a.TCA9548A(i2c, 0X71) + Elec_M= adafruit_tca9548a.TCA9548A(i2c, 0X74) + Elec_N= adafruit_tca9548a.TCA9548A(i2c, 0X70) + + + + """ + functions + """ + + # function swtich_mux select the right channels for the multiplexer cascade for electrodes A, B, M and N. + def switch_mux_on(quadripole): + elec_adress=[0x76,0X71,0x74,0x70] - if quadripole[i] < 17: - nb_i2C=7 - a=quadripole[i] - elif quadripole[i] > 16 and quadripole[i] < 33: - nb_i2C=6 - a=quadripole[i]-16 - elif quadripole[i] > 32 and quadripole[i] < 49: - nb_i2C=5 - a=quadripole[i]-32 - elif quadripole[i] > 48 and quadripole[i] < 65: - nb_i2C=4 - a=quadripole[i]-48 - - mcp2 = MCP23017(tca[nb_i2C]) - mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT - mcp2.get_pin(a-1).value=True - -def switch_mux_off(quadripole): - elec_adress=[0x76,0X71,0x74,0x70] - - for i in range(0,4): - tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N + for i in range(0,4): + tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N + + if quadripole[i] < 17: + nb_i2C=7 + a=quadripole[i] + elif quadripole[i] > 16 and quadripole[i] < 33: + nb_i2C=6 + a=quadripole[i]-16 + elif quadripole[i] > 32 and quadripole[i] < 49: + nb_i2C=5 + a=quadripole[i]-32 + elif quadripole[i] > 48 and quadripole[i] < 65: + nb_i2C=4 + a=quadripole[i]-48 + + mcp2 = MCP23017(tca[nb_i2C]) + mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT + mcp2.get_pin(a-1).value=True + + def switch_mux_off(quadripole): + elec_adress=[0x76,0X71,0x74,0x70] - if quadripole[i] < 17: - nb_i2C=7 - a=quadripole[i] - elif quadripole[i] > 16 and quadripole[i] < 33: - nb_i2C=6 - a=quadripole[i]-16 - elif quadripole[i] > 32 and quadripole[i] < 49: - nb_i2C=5 - a=quadripole[i]-32 - elif quadripole[i] > 48 and quadripole[i] < 65: - nb_i2C=4 - a=quadripole[i]-48 - - mcp2 = MCP23017(tca[nb_i2C]) - mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT - mcp2.get_pin(a-1).value=False - + for i in range(0,4): + tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N + + if quadripole[i] < 17: + nb_i2C=7 + a=quadripole[i] + elif quadripole[i] > 16 and quadripole[i] < 33: + nb_i2C=6 + a=quadripole[i]-16 + elif quadripole[i] > 32 and quadripole[i] < 49: + nb_i2C=5 + a=quadripole[i]-32 + elif quadripole[i] > 48 and quadripole[i] < 65: + nb_i2C=4 + a=quadripole[i]-48 + + mcp2 = MCP23017(tca[nb_i2C]) + mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT + mcp2.get_pin(a-1).value=False + + + #function to switch off mux + def ZERO_mux(nb_elec): + elec_adress=[0x76,0X71,0x74,0x70] + for i in range(0,4): + tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N + for y in range(0,nb_elec): + qd=y+1 + if qd < 17: + nb_i2C=7 + a=qd + elif qd > 16 and qd < 33: + nb_i2C=6 + a=qd-16 + elif qd > 32 and qd < 49: + nb_i2C=5 + a=qd-32 + elif qd > 48 and qd < 65: + nb_i2C=4 + a=qd-48 + + mcp2 = MCP23017(tca[nb_i2C]) + mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT + mcp2.get_pin(a-1).value= False -#function to switch off mux -def ZERO_mux(nb_elec): - elec_adress=[0x76,0X71,0x74,0x70] - for i in range(0,4): - tca= adafruit_tca9548a.TCA9548A(i2c, elec_adress[i]) #choose MUX A B M or N - for y in range(0,nb_elec): - qd=y+1 - if qd < 17: - nb_i2C=7 - a=qd - elif qd > 16 and qd < 33: - nb_i2C=6 - a=qd-16 - elif qd > 32 and qd < 49: - nb_i2C=5 - a=qd-32 - elif qd > 48 and qd < 65: - nb_i2C=4 - a=qd-48 - - mcp2 = MCP23017(tca[nb_i2C]) - mcp2.get_pin(a-1).direction=digitalio.Direction.OUTPUT - mcp2.get_pin(a-1).value= False - - -def run_measurement(nb_stack, injection_deltat, R_shunt, coefp2, coefp3, elec_array): - start_time=time.time() - # inner variable initialization - sum_I=0 - sum_Vmn=0 - sum_Ps=0 - # injection courant and measure - mcp = MCP23008(i2c, address=0x20) - pin0 = mcp.get_pin(0) - pin0.direction = Direction.OUTPUT - pin1 = mcp.get_pin(1) - pin1.direction = Direction.OUTPUT - pin0.value = False - pin1.value = False - for n in range(0,3+2*nb_stack-1) : - # current injection - - if (n % 2) == 0: - - pin1.value = True - pin0.value = False # current injection polarity n°1 - else: - pin0.value = True - pin1.value = False# injection de courant polarity n°2 - start_delay=time.time() - time.sleep(injection_deltat) # delay depending on current injection duration + def run_measurement(nb_stack, injection_deltat, R_shunt, coefp2, coefp3, elec_array): + start_time=time.time() + # inner variable initialization + sum_I=0 + sum_Vmn=0 + sum_Ps=0 + # injection courant and measure + mcp = MCP23008(i2c, address=0x20) + pin0 = mcp.get_pin(0) + pin0.direction = Direction.OUTPUT + pin1 = mcp.get_pin(1) + pin1.direction = Direction.OUTPUT + pin0.value = False + pin1.value = False + for n in range(0,3+2*nb_stack-1) : + # current injection + + if (n % 2) == 0: + + pin1.value = True + pin0.value = False # current injection polarity n°1 + else: + pin0.value = True + pin1.value = False# injection de courant polarity n°2 + start_delay=time.time() + time.sleep(injection_deltat) # delay depending on current injection duration + + + for k in range(0,integer): + meas[0,k] = ((AnalogIn(ads_current,ADS.P0).voltage/50)/R_shunt)*1000 # reading current value on ADS channel A0 + meas[1,k] = AnalogIn(ads_voltage,ADS.P0).voltage * coefp2*1000 + meas[2,k] = AnalogIn(ads_voltage,ADS.P1).voltage * coefp3*1000 # reading voltage value on ADS channel A2 + pin1.value = False; pin0.value = False# stop current injection + end_delay=time.time() + sum_I=sum_I+(np.mean(meas[0,:])) + Vmn1=((np.mean(meas[1,:]))-(np.mean(meas[2,:]))) + if (n % 2) == 0: + sum_Vmn=sum_Vmn-Vmn1 + sum_Ps=sum_Ps+Vmn1 + else: + sum_Vmn=sum_Vmn+Vmn1 + sum_Ps=sum_Ps+Vmn1 + end_calc=time.time() + cpu = CPUTemperature() + time.sleep((end_delay-start_delay)-(end_calc-end_delay)) + # return averaged values + # cpu= CPUTemperature() + output = pd.DataFrame({ + "time":[datetime.now()], + "A":elec_array[0], + "B":elec_array[1], + "M":elec_array[2], + "N":elec_array[3], + "Vmn [mV]":[(sum_Vmn/(3+2*nb_stack-1))], + "I [mA]":[(sum_I/(3+2*nb_stack-1))], + "R [ohm]":[( (sum_Vmn/(3+2*nb_stack-1)/(sum_I/(3+2*nb_stack-1))))], + # "Rab [KOhm]":[(Tab*2.47)/(sum_I/(3+2*nb_stack-1))/1000], + # "Tx [V]":[Tx*2.47], + "Ps [mV]":[(sum_Ps/(3+2*nb_stack-1))], + "nbStack":[nb_stack], + "CPU temp [°C]":[cpu.temperature], + # "Hardware temp [°C]":[read_temp()-8], + "Time [S]":[(-start_time+time.time())] + # "Rcontact[ohm]":[Rc], + # "Rsoil[ohm]":[Rsoil], + # "Rab_theory [Ohm]":[(Rc*2+Rsoil)] - for k in range(0,integer): - meas[0,k] = ((AnalogIn(ads_current,ADS.P0).voltage/50)/R_shunt)*1000 # reading current value on ADS channel A0 - meas[1,k] = AnalogIn(ads_voltage,ADS.P0).voltage * coefp2*1000 - meas[2,k] = AnalogIn(ads_voltage,ADS.P1).voltage * coefp3*1000 # reading voltage value on ADS channel A2 - pin1.value = False; pin0.value = False# stop current injection - end_delay=time.time() - sum_I=sum_I+(np.mean(meas[0,:])) - Vmn1=((np.mean(meas[1,:]))-(np.mean(meas[2,:]))) - if (n % 2) == 0: - sum_Vmn=sum_Vmn-Vmn1 - sum_Ps=sum_Ps+Vmn1 - else: - sum_Vmn=sum_Vmn+Vmn1 - sum_Ps=sum_Ps+Vmn1 - end_calc=time.time() - cpu = CPUTemperature() - time.sleep((end_delay-start_delay)-(end_calc-end_delay)) - # return averaged values -# cpu= CPUTemperature() - output = pd.DataFrame({ - "time":[datetime.now()], - "A":elec_array[0], - "B":elec_array[1], - "M":elec_array[2], - "N":elec_array[3], - "Vmn [mV]":[(sum_Vmn/(3+2*nb_stack-1))], - "I [mA]":[(sum_I/(3+2*nb_stack-1))], - "R [ohm]":[( (sum_Vmn/(3+2*nb_stack-1)/(sum_I/(3+2*nb_stack-1))))], -# "Rab [KOhm]":[(Tab*2.47)/(sum_I/(3+2*nb_stack-1))/1000], -# "Tx [V]":[Tx*2.47], - "Ps [mV]":[(sum_Ps/(3+2*nb_stack-1))], - "nbStack":[nb_stack], - "CPU temp [°C]":[cpu.temperature], -# "Hardware temp [°C]":[read_temp()-8], - "Time [S]":[(-start_time+time.time())] -# "Rcontact[ohm]":[Rc], -# "Rsoil[ohm]":[Rsoil], -# "Rab_theory [Ohm]":[(Rc*2+Rsoil)] - - - # Dead time equivalent to the duration of the current injection pulse - }) - output=output.round(2) - print(output.to_string()) - time.sleep(1) - return output + + # Dead time equivalent to the duration of the current injection pulse + }) + output=output.round(2) + print(output.to_string()) + time.sleep(1) + return output + -""" # function to find rows with identical values in different columns def find_identical_in_line(array_object): @@ -287,7 +291,7 @@ def append_and_save(path, last_measurement): """ Main loop """ -import threading + class OhmPi(object): def __init__(self, pardict): @@ -322,11 +326,14 @@ class OhmPi(object): #switch_mux_on(N[i,]) # run a measurement - #current_measurement = run_measurement(self.pardict.get("stack"), pardict.get("injection_duration"), R_shunt, coef_p2, coef_p3, N[i,]) + if onpi: + current_measurement = run_measurement(self.pardict.get("stack"), self.pardict.get("injection_duration"), R_shunt, coef_p2, coef_p3, N[i,]) + else: + current_measurement = pd.DataFrame({ + 'A': [N[i, 0]], 'B': [N[i, 1]], 'M': [N[i, 2]], 'N': [N[i, 3]], 'R [ohm]': np.abs(np.random.randn(1)) + }) + #switch_mux_off(N[i,]) - current_measurement = pd.DataFrame({ - 'a': [N[i, 0]], 'b': [N[i, 1]], 'm': [N[i, 2]], 'n': [N[i, 3]], 'rho': np.abs(np.random.randn(1)) - }) time.sleep(np.abs(np.random.randn(1))[0]) # save data and print in a text file @@ -352,3 +359,9 @@ class OhmPi(object): if self.t is not None: self.t.join() print('self.status', self.status) + +# test +#with open('ohmpi_param.json') as json_file: +# pardict = json.load(json_file) +#ohmpi = OhmPi(pardict) +#ohmpi.measure() diff --git a/env.sh b/env.sh new file mode 100644 index 00000000..21e3ecaa --- /dev/null +++ b/env.sh @@ -0,0 +1,7 @@ +#!/bin/bash +sudo apt-get install -y libatlas-base-dev +python3 -m venv ohmpy +source ohmpy/bin/activate +export CFLAGS=-fcommon +pip install -r requirements.txt + diff --git a/index.html b/index.html index 88385928..8db1d579 100644 --- a/index.html +++ b/index.html @@ -103,8 +103,8 @@ <script type="text/javascript"> //let serverUrl = 'http://10.3.141.1:8080' - //let serverUrl = 'http://0.0.0.0:8080' - let serverUrl = 'http://localhost:8080' + let serverUrl = 'http://0.0.0.0:8080' + //let serverUrl = 'http://localhost:8080' let output = document.getElementById('output') let data = {} // hold data of all surveys let interv = null // hold interval for automatic data retrieval @@ -256,7 +256,7 @@ } // dropdown with number of surveys and +++ - let surveyNames = Object.keys(data) + let surveyNames = Object.keys(data).sort() // callback function to draw the plot function surveySelectFunc(el) { diff --git a/ohmpi_param.json b/ohmpi_param.json index 018dd93f..7071487a 100644 --- a/ohmpi_param.json +++ b/ohmpi_param.json @@ -4,5 +4,5 @@ "nbr_meas": 100, "sequence_delay": 1, "stack": 1, - "export_path": "/home/pi/Documents/OhmPi/measurement.csv" + "export_path": "data/measurement.csv" } diff --git a/old-requirements.txt b/old-requirements.txt new file mode 100644 index 00000000..4935e38a --- /dev/null +++ b/old-requirements.txt @@ -0,0 +1,20 @@ +libraries to install using the package manager : libatlas-base-dev + sudo apt-get install libatlas-base-dev +python libraries dependencies : +Adafruit-Blinka==3.2.0 +adafruit-circuitpython-ads1x15==2.1.1 +adafruit-circuitpython-mcp230xx==2.5.1 +adafruit-circuitpython-busdevice==4.0.1 +Adafruit-PlatformDetect==1.3.8 +adafruit-circuitpython-tca9548a==0.5.1 +Adafruit-PureIO==1.0.4 +numpy==1.17.4 +pandas==0.25.3 +pkg-resources==0.0.0 +python-dateutil==2.8.1 +pytz==2019.3 +rpi-ws281x==4.2.2 +RPi.GPIO==0.7.0 +six==1.13.0 +spidev==3.4 +sysv-ipc==1.0.1 diff --git a/requirements.txt b/requirements.txt index a7f7edc2..cbb65fcd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,21 +1,9 @@ -libraries to install using the package manager : libatlas-base-dev - sudo apt-get install libatlas-base-dev -python libraries dependencies : -Adafruit-Blinka==3.2.0 -adafruit-circuitpython-ads1x15==2.1.1 -adafruit-circuitpython-mcp230xx==2.5.1 -adafruit-circuitpython-busdevice==4.0.1 -Adafruit-PlatformDetect==1.3.8 -adafruit-circuitpython-tca9548a==0.5.1 -Adafruit-PureIO==1.0.4 -numpy==1.17.4 -pandas==0.25.3 -pkg-resources==0.0.0 -python-dateutil==2.8.1 -pytz==2019.3 -rpi-ws281x==4.2.2 -RPi.GPIO==0.7.0 -six==1.13.0 -spidev==3.4 -sysv-ipc==1.0.1 -termcolor==1.1.0 +RPi.GPIO +adafruit-blinka +numpy +pandas +adafruit-circuitpython-ads1x15 +adafruit-circuitpython-tca9548a +adafruit-circuitpython-mcp230xx +gpiozero +termcolor diff --git a/run.sh b/run.sh new file mode 100644 index 00000000..30e98988 --- /dev/null +++ b/run.sh @@ -0,0 +1,2 @@ +source ../ohmpy/bin/activate +python3 webserver.py diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_board_list_2_xx.xlsx b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_board_list_2_xx.xlsx index f792edfc2404cb044298340c545452849aa6d42b..9187d01c2690038431eb56c43b5fcc48447bc4f3 100644 GIT binary patch delta 4385 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 bD+T<b*FzDL5ik`2^^+$sHU>v600000qlQdt delta 4407 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 diff --git a/webserver.py b/webserver.py new file mode 100644 index 00000000..24414188 --- /dev/null +++ b/webserver.py @@ -0,0 +1,98 @@ +from http.server import SimpleHTTPRequestHandler, HTTPServer +import time +import os +import json +from Ohmpi import OhmPi +import threading +import pandas as pd +import shutil + +hostName = "0.0.0.0" +#hostName = 'localhost' +serverPort = 8080 + +# https://gist.github.com/MichaelCurrie/19394abc19abd0de4473b595c0e37a3a + +with open('ohmpi_param.json') as json_file: + pardict = json.load(json_file) + +ohmpi = OhmPi(pardict) + +class MyServer(SimpleHTTPRequestHandler): + # because we use SimpleHTTPRequestHandler, we do not need to implement + # the do_GET() method (if we use the BaseHTTPRequestHandler, we would need to) + + # def do_GET(self): + # # normal get for wepages (not so secure!) + # print(self.command) + # print(self.headers) + # print(self.request) + # self.send_response(200) + # self.send_header("Content-type", "text/html") + # self.end_headers() + # with open(os.path.join('.', self.path[1:]), 'r') as f: + # self.wfile.write(bytes(f.read(), "utf-8")) + + def do_POST(self): + global ohmpiThread, status, run + dic = json.loads(self.rfile.read(int(self.headers['Content-Length']))) + rdic = {} + if dic['command'] == 'start': + ohmpi.measure() + elif dic['command'] == 'stop': + ohmpi.stop() + elif dic['command'] == 'getData': + # get all .csv file in data folder + fnames = os.listdir('data/') + ddic = {} + for fname in fnames: + if fname.replace('.csv', '') not in dic['surveyNames'] and fname != 'readme.txt': + df = pd.read_csv('data/' + fname) + ddic[fname.replace('.csv', '')] = { + 'a': df['A'].tolist(), + 'b': df['B'].tolist(), + 'm': df['M'].tolist(), + 'n': df['N'].tolist(), + 'rho': df['R [ohm]'].tolist(), + } + rdic['data'] = ddic + elif dic['command'] == 'removeData': + shutil.rmtree('data') + os.mkdir('data') + elif dic['command'] == 'setConfig': + ohmpi.stop() + cdic = dic['config'] + ohmpi.pardict['nb_electrodes'] = int(cdic['nbElectrodes']) + ohmpi.pardict['injection_duration'] = float(cdic['injectionDuration']) + ohmpi.pardict['nbr_meas'] = int(cdic['nbMeasurements']) + ohmpi.pardict['stack'] = int(cdic['nbStack']) + ohmpi.pardict['sequence_delay'] = int(cdic['sequenceDelay']) + print('setConfig', ohmpi.pardict) + elif dic['command'] == 'invert': + pass + elif dic['command'] == 'getResults': + pass + elif dic['command'] == 'download': + shutil.make_archive('data', 'zip', 'data') + else: + # command not found + rdic['response'] = 'command not found' + + rdic['status'] = ohmpi.status + self.send_response(200) + self.send_header('Content-Type', 'text/json') + self.end_headers() + self.wfile.write(bytes(json.dumps(rdic), 'utf8')) + + +if __name__ == "__main__": + webServer = HTTPServer((hostName, serverPort), MyServer) + print("Server started http://%s:%s" % (hostName, serverPort)) + + try: + webServer.serve_forever() + except KeyboardInterrupt: + pass + + webServer.server_close() + print("Server stopped.") -- GitLab