Commit fc1e9e22 authored by Guillaume Blanchy's avatar Guillaume Blanchy
Browse files

add threading for TCP listening

Showing with 72 additions and 17 deletions
+72 -17
...@@ -24,7 +24,7 @@ CONTROL_CONFIG = { ...@@ -24,7 +24,7 @@ CONTROL_CONFIG = {
# Execution logging configuration # Execution logging configuration
EXEC_LOGGING_CONFIG = { EXEC_LOGGING_CONFIG = {
'logging_level': logging.DEBUG, 'logging_level': logging.DEBUG,
'logging_to_console': False, 'logging_to_console': True,
'file_name': 'ohmpi_log', 'file_name': 'ohmpi_log',
'max_bytes': 262144, 'max_bytes': 262144,
'backup_count': 30, 'backup_count': 30,
...@@ -35,9 +35,8 @@ EXEC_LOGGING_CONFIG = { ...@@ -35,9 +35,8 @@ EXEC_LOGGING_CONFIG = {
# Data logging configuration # Data logging configuration
DATA_LOGGING_CONFIG = { DATA_LOGGING_CONFIG = {
'logging_level': logging.INFO, 'logging_level': logging.INFO,
'logging_to_console': True,
'file_name': 'data_log',
'logging_to_console': False, 'logging_to_console': False,
'file_name': 'data_log',
'max_bytes': 16777216, 'max_bytes': 16777216,
'backup_count': 1024, 'backup_count': 1024,
'when': 'd', 'when': 'd',
......
In this folder will be logged all measurements done with the OhmPi as .csv.
...@@ -116,8 +116,9 @@ class OhmPi(object): ...@@ -116,8 +116,9 @@ class OhmPi(object):
self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=0x49) self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=0x49)
# Starts the command processing thread # Starts the command processing thread
#self.cmd_thread.start() self.cmd_thread = threading.Thread(target=self.process_commands)
self.process_commands() self.cmd_thread.start()
#self.process_commands()
def _update_acquisition_settings(self, config): def _update_acquisition_settings(self, config):
"""Update acquisition settings from a json file or dictionary. """Update acquisition settings from a json file or dictionary.
...@@ -681,6 +682,7 @@ class OhmPi(object): ...@@ -681,6 +682,7 @@ class OhmPi(object):
self.rs_check() self.rs_check()
status = True status = True
except Exception as e: except Exception as e:
print('error====', e)
self.exec_logger.warning(f'Unable to run rs-check: {e}') self.exec_logger.warning(f'Unable to run rs-check: {e}')
else: else:
self.exec_logger.warning(f'Unkown command {cmd} - cmd_id: {cmd_id}') self.exec_logger.warning(f'Unkown command {cmd} - cmd_id: {cmd_id}')
...@@ -770,6 +772,7 @@ class OhmPi(object): ...@@ -770,6 +772,7 @@ class OhmPi(object):
if self.thread is not None: if self.thread is not None:
self.thread.join() self.thread.join()
self.exec_logger.debug(f'Status: {self.status}') self.exec_logger.debug(f'Status: {self.status}')
VERSION = '2.1.0' VERSION = '2.1.0'
......
run.sh 100644 → 100755
File mode changed from 100644 to 100755
...@@ -2,10 +2,14 @@ from http.server import SimpleHTTPRequestHandler, HTTPServer ...@@ -2,10 +2,14 @@ from http.server import SimpleHTTPRequestHandler, HTTPServer
import time import time
import os import os
import json import json
from ohmpi import OhmPi import uuid
#from ohmpi import OhmPi
from config import CONTROL_CONFIG
from termcolor import colored
import threading import threading
import pandas as pd import pandas as pd
import shutil import shutil
import zmq # to write on TCP
#hostName = "raspberrypi.local" # works for AP-STA #hostName = "raspberrypi.local" # works for AP-STA
#hostName = "192.168.50.1" # fixed IP in AP-STA mode #hostName = "192.168.50.1" # fixed IP in AP-STA mode
...@@ -17,11 +21,16 @@ serverPort = 8080 ...@@ -17,11 +21,16 @@ serverPort = 8080
with open('ohmpi_param.json') as json_file: with open('ohmpi_param.json') as json_file:
pardict = json.load(json_file) pardict = json.load(json_file)
ohmpi = OhmPi(pardict, sequence='dd.txt') #ohmpi = OhmPi(pardict, sequence='dd.txt')
#ohmpi = OhmPi(pardict, sequence='dd16s0no8.txt') #ohmpi = OhmPi(pardict, sequence='dd16s0no8.txt')
tcp_port = CONTROL_CONFIG['tcp_port']
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(f'tcp://localhost:{CONTROL_CONFIG["tcp_port"]}')
print(colored(f'Sending commands and listenning on tcp port {tcp_port}.'))
class MyServer(SimpleHTTPRequestHandler): class MyServer(SimpleHTTPRequestHandler):
# because we use SimpleHTTPRequestHandler, we do not need to implement # because we use SimpleHTTPRequestHandler, we do not need to implement
# the do_GET() method (if we use the BaseHTTPRequestHandler, we would need to) # the do_GET() method (if we use the BaseHTTPRequestHandler, we would need to)
...@@ -37,13 +46,24 @@ class MyServer(SimpleHTTPRequestHandler): ...@@ -37,13 +46,24 @@ class MyServer(SimpleHTTPRequestHandler):
# self.wfile.write(bytes(f.read(), "utf-8")) # self.wfile.write(bytes(f.read(), "utf-8"))
def do_POST(self): def do_POST(self):
global ohmpiThread, status, run cmd_id = uuid.uuid4().hex
global socket
#global ohmpiThread, status, run
dic = json.loads(self.rfile.read(int(self.headers['Content-Length']))) dic = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
rdic = {} rdic = {} # response dictionnary
if dic['command'] == 'start': if dic['command'] == 'start':
ohmpi.measure() #ohmpi.measure()
socket.send_string(json.dumps({
'cmd_id': cmd_id,
'command': 'start'
}))
elif dic['command'] == 'stop': elif dic['command'] == 'stop':
ohmpi.stop() #ohmpi.stop()
socket.send_string(json.dumps({
'cmd_id': cmd_id,
'command': 'stop'
}))
elif dic['command'] == 'getData': elif dic['command'] == 'getData':
# get all .csv file in data folder # get all .csv file in data folder
fnames = [fname for fname in os.listdir('data/') if fname[-4:] == '.csv'] fnames = [fname for fname in os.listdir('data/') if fname[-4:] == '.csv']
...@@ -64,9 +84,16 @@ class MyServer(SimpleHTTPRequestHandler): ...@@ -64,9 +84,16 @@ class MyServer(SimpleHTTPRequestHandler):
elif dic['command'] == 'removeData': elif dic['command'] == 'removeData':
shutil.rmtree('data') shutil.rmtree('data')
os.mkdir('data') os.mkdir('data')
elif dic['command'] == 'setConfig': elif dic['command'] == 'update_settings':
ohmpi.stop() #ohmpi.stop()
socket.send_string(json.dumps({
'cmd_id': cmd_id,
'cmd': 'update_settings',
'args': dic['config']
}))
cdic = dic['config'] cdic = dic['config']
"""
ohmpi.pardict['nb_electrodes'] = int(cdic['nbElectrodes']) ohmpi.pardict['nb_electrodes'] = int(cdic['nbElectrodes'])
ohmpi.pardict['injection_duration'] = float(cdic['injectionDuration']) ohmpi.pardict['injection_duration'] = float(cdic['injectionDuration'])
ohmpi.pardict['nbr_meas'] = int(cdic['nbMeasurements']) ohmpi.pardict['nbr_meas'] = int(cdic['nbMeasurements'])
...@@ -78,12 +105,17 @@ class MyServer(SimpleHTTPRequestHandler): ...@@ -78,12 +105,17 @@ class MyServer(SimpleHTTPRequestHandler):
ohmpi.read_quad('sequence.txt') ohmpi.read_quad('sequence.txt')
print('new sequence set.') print('new sequence set.')
print('setConfig', ohmpi.pardict) print('setConfig', ohmpi.pardict)
"""
elif dic['command'] == 'invert': elif dic['command'] == 'invert':
pass pass
elif dic['command'] == 'getResults': elif dic['command'] == 'getResults':
pass pass
elif dic['command'] == 'rsCheck': elif dic['command'] == 'rsCheck':
ohmpi.rs_check() #ohmpi.rs_check()
socket.send_string(json.dumps({
'cmd_id': cmd_id,
'cmd': 'rs_check'
}))
fnames = sorted([fname for fname in os.listdir('data/') if fname[-7:] == '_rs.csv']) fnames = sorted([fname for fname in os.listdir('data/') if fname[-7:] == '_rs.csv'])
df = pd.read_csv('data/' + fnames[-1]) df = pd.read_csv('data/' + fnames[-1])
ddic = { ddic = {
...@@ -103,7 +135,29 @@ class MyServer(SimpleHTTPRequestHandler): ...@@ -103,7 +135,29 @@ class MyServer(SimpleHTTPRequestHandler):
# command not found # command not found
rdic['response'] = 'command not found' rdic['response'] = 'command not found'
rdic['status'] = ohmpi.status #rdic['status'] = ohmpi.status
rdic['status'] = 'unknown' # socket_out.
# wait for reply
message = socket.recv()
print('+++////', message)
rdic['data'] = message
"""
while False:
message = socket.recv()
print(f'Received command: {message}')
e = None
try:
decoded_message = json.loads(message.decode('utf-8'))
cmd = decoded_message.pop('cmd', None)
args = decoded_message.pop('args', None)
status = False
e = None
if cmd is not None and cmd_id is decoded_message.pop('cmd_id', None):
print('reply=', decoded_message)
except Exception as e:
print(f'Unable to decode command {message}: {e}')
"""
self.send_response(200) self.send_response(200)
self.send_header('Content-Type', 'text/json') self.send_header('Content-Type', 'text/json')
self.end_headers() self.end_headers()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment