From af24c570b3169a220e2a7ae93edd157807e83800 Mon Sep 17 00:00:00 2001 From: Lukas Droste Date: Tue, 10 Aug 2021 00:03:55 +0200 Subject: [PATCH] Working UI and WSonly Python script --- PointCloudWeb.Scanner/server.py | 136 +++++++++++++------ PointCloudWeb.Scanner/test/serverWSonly.py | 151 +++++++++++++++++++++ PointCloudWeb.Web/src/views/Scanner.vue | 150 ++++++++++++++++---- 3 files changed, 368 insertions(+), 69 deletions(-) create mode 100644 PointCloudWeb.Scanner/test/serverWSonly.py diff --git a/PointCloudWeb.Scanner/server.py b/PointCloudWeb.Scanner/server.py index 6bdc9cd..77448cc 100644 --- a/PointCloudWeb.Scanner/server.py +++ b/PointCloudWeb.Scanner/server.py @@ -4,35 +4,62 @@ import time import PyLidar3 import asyncio import websockets - -#arduino = serial.Serial(port='COM5', baudrate=9600) -#lidar = PyLidar3.YdLidarX4(port='COM6',chunk_size=20000) #PyLidar3.your_version_of_lidar(port,chunk_size) +from concurrent.futures import ThreadPoolExecutor f = open("PointCloudWeb.Scanner\datafile.txt","wt") f.write("y, x, z\n") -progress = 0 +arduino_status = False +arduino_port = "COM9" +arduino_baud = 9600 +arduino = None +lidar_status = False +lidar_port = "COM6" +lidar_chunk_size = 20000 +lidar = None +scan_progress = 0 +_executor = ThreadPoolExecutor(1) +newMessage = "" +lastMessage = "" -print("Start ...") -time.sleep(2) -print("Ready:") +async def init(websocket): + global arduino + arduino = serial.Serial(port=arduino_port, baudrate=arduino_baud) + try: + await websocket.send("arduino connected " + arduino_port) + global arduino_status + arduino_status = True + except: + await websocket.send("can not connect to arduino! " + arduino_port) + try: + global lidar + lidar = PyLidar3.YdLidarX4(port=lidar_port,chunk_size=lidar_chunk_size) #PyLidar3.your_version_of_lidar(port,chunk_size) + if(lidar.Connect()): + global lidar_status + lidar_status = True + await websocket.send("lidar connected " + lidar_port) + else: + raise ValueError + except: + await websocket.send("can not connect to lidar! " + lidar_port) def arduino_write_read(x): arduino.write(bytes(x, 'utf-8')) - data = arduino.readline() - return filterY(str(data)) + data1 = arduino.readline() + return filterY(str(data1)) def setY(y): - print(arduino_write_read("<"+str(y)+">")) + tmp = arduino_write_read("<"+str(y)+">") + print(tmp) -def getY(): - print(arduino_write_read("")) +# def getY(): +# print(arduino_write_read("")) -def resetY(): - print(arduino_write_read("")) +# def resetY(): +# print(arduino_write_read("")) -def zerotY(): - print(arduino_write_read("")) +# def zerotY(): +# print(arduino_write_read("")) def filterY(data): temp = data[data.find("<"):data.find(">")] @@ -40,44 +67,58 @@ def filterY(data): def senddata(data,posy): for x,y in data.items(): - f.write(str(posy) + ", " + str(x) + ", " + str(y) + "\n") + f.write(str(posy) + ", " + str(x) + ", " + str(y) + "\n") -def startScaner(mode): - if(lidar.Connect()): +def startScaner(websocket, mode): + global scan_progress + global lidar + if lidar_status == True: print(lidar.GetDeviceInfo()) gen = lidar.StartScanning() - t = time.time() # start time - if(mode == "0"): + if mode == "0": print("Mode 0") for y in range(18): senddata(next(gen),y*10) time.sleep(2) - setY(y*10) + setY( y*10) time.sleep(2) + scan_progress = y/18*100 + print(str(scan_progress) + " %") setY(0) - elif(mode == "1"): + lidar.StopScanning() + lidar.Disconnect() + elif mode == "1": print("Mode 1") for y in range(90): senddata(next(gen),y*2) time.sleep(1) setY(y*2) time.sleep(1) + scan_progress = y/90*100 + print(str(scan_progress) + " %") setY(0) - elif(mode == "2"): + lidar.StopScanning() + lidar.Disconnect() + elif mode == "2": print("Mode 2") for y in range(360): senddata(next(gen),y*0.5) time.sleep(1) setY(y*0.5) time.sleep(1) + scan_progress = y/360*100 + print(str(scan_progress) + " %") setY(0) - + lidar.StopScanning() + lidar.Disconnect() + elif mode == "3": + print(scan_progress) + scan_progress += 1 + print(scan_progress) else: print("mode error") f.close() - lidar.StopScanning() - lidar.Disconnect() print("scan stoped") else: print("Error connecting to device") @@ -85,37 +126,50 @@ def startScaner(mode): async def wsfilter(websocket, message): command = message[message.find("<")+1:message.find(">")] value = message[message.find("><")+2:message.find(">", message.find("><")+2)] - #print(command + " / " + value) await wsaction(websocket, command,value) async def wsaction(websocket, command, value): - if(command == "start"): - if(value == "0"): + if command == "start": + if value == "0": await websocket.send("start scan resolution 0") - elif(value =="1"): + await loop.run_in_executor(_executor, startScaner(websocket, value)) + elif value =="1": await websocket.send("start scan resolution 1") - elif(value =="2"): + await loop.run_in_executor(_executor, startScaner(websocket, value)) + elif value =="2": await websocket.send("start scan resolution 2") + await loop.run_in_executor(_executor, startScaner(websocket, value)) + elif value =="3": + await websocket.send("start scan test") + await loop.run_in_executor(_executor, startScaner(websocket, value)) else: await websocket.send("mode error") - elif(command == "status"): - await websocket.send("Status ...") + elif command == "connect" and arduino and lidar != None: + await websocket.send("try to connect to Adruino and LIDAR") + await init(websocket) + elif command == "status": + await websocket.send("progress: " + scan_progress) else: await websocket.send("command error") - #muss noch was passieren async def wscom(websocket, path): - print("connected") + await websocket.send("Websocket connected") + await init(websocket) while True: - data = await websocket.recv() - await wsfilter(websocket, data) - print({data}) - #await websocket.send(data) + data2 = await websocket.recv() + await wsfilter(websocket, data2) + print({data2}) + if scan_progress != lastMessage: + await websocket.send(scan_progress) + lastMessage = scan_progress async def main(): server = await websockets.serve(wscom, 'localhost', 6789) await server.wait_closed() -asyncio.run(main()) + +loop = asyncio.get_event_loop() +loop.run_until_complete(main()) +#asyncio.run(main()) #while True: # startScaner(input("Scan Modus(0,1,2):")) diff --git a/PointCloudWeb.Scanner/test/serverWSonly.py b/PointCloudWeb.Scanner/test/serverWSonly.py new file mode 100644 index 0000000..048c77d --- /dev/null +++ b/PointCloudWeb.Scanner/test/serverWSonly.py @@ -0,0 +1,151 @@ +# Importing Libraries +import serial +import time +import PyLidar3 +import asyncio +import websockets +from concurrent.futures import ThreadPoolExecutor +import threading +import collections + +f = open("PointCloudWeb.Scanner\datafile.txt","wt") +f.write("y, x, z\n") + +arduino_status = False +arduino_port = "COM9" +arduino_baud = 9600 +arduino = None +lidar_status = False +lidar_port = "COM6" +lidar_chunk_size = 20000 +lidar = None +scan_progress = 0 +messageQeue = ['test', 'test1', 'abc'] +ws_message_queue = collections.deque(maxlen=100) + +async def init(): + global arduino, ws_message_queue + arduino = "Arduino" + try: + ws_message_queue.appendleft("arduino connected " + arduino_port) + global arduino_status + arduino_status = True + except: + ws_message_queue.appendleft("can not connect to arduino! " + arduino_port) + try: + global lidar + lidar = "lidar 1" + global lidar_status + lidar_status = True + ws_message_queue.appendleft("lidar connected " + lidar_port) + except: + ws_message_queue.appendleft("can not connect to lidar! " + lidar_port) + +def arduino_write_read(x): + data1 = x + return filterY(str(data1)) + +def setY(y): + tmp = arduino_write_read("<"+str(y)+">") + print(tmp) + +def filterY(data): + temp = data[data.find("<"):data.find(">")] + return temp + data[data.find("><"):data.find(">", data.find("><")+2)+1] + +def senddata(data,posy): + for x,y in data.items(): + f.write(str(posy) + ", " + str(x) + ", " + str(y) + "\n") + +def startScaner(mode): + global scan_progress, lidar, messageQeue + if lidar_status == True: + ws_message_queue.appendleft("start scan mode: " + mode) + if mode == "0": + ws_message_queue.appendleft("running") + for y in range(19): + time.sleep(0.2) + setY( y*10) + scan_progress = round(y/18*100) + ws_message_queue.appendleft("" + str(scan_progress)) + setY(0) + elif mode == "1": + ws_message_queue.appendleft("running") + for y in range(91): + time.sleep(0.2) + setY(y*2) + scan_progress = round(y/90*100) + ws_message_queue.appendleft("" + str(scan_progress)) + setY(0) + elif mode == "2": + ws_message_queue.appendleft("running") + for y in range(361): + time.sleep(0.1) + setY(y*0.5) + scan_progress = round(y/360*100) + ws_message_queue.appendleft("" + str(scan_progress)) + setY(0) + else: + ws_message_queue.appendleft("mode error") + + f.close() + ws_message_queue.appendleft("finished") + ws_message_queue.appendleft("scan finished") + else: + ws_message_queue.appendleft("Error connecting to device") + +async def wsfilter(message): + command = message[message.find("<")+1:message.find(">")] + value = message[message.find("><")+2:message.find(">", message.find("><")+2)] + await wsaction(command,value) + +async def wsaction(command, value): + global ws_message_queue + if command == "start": + if value == "0": + ws_message_queue.appendleft("start scan on low resolution") + x = threading.Thread(target=startScaner, args=(value)) + x.start() + elif value =="1": + ws_message_queue.appendleft("start scan on medium resolution") + x = threading.Thread(target=startScaner, args=(value)) + x.start() + elif value =="2": + ws_message_queue.appendleft("start scan on high resolution") + x = threading.Thread(target=startScaner, args=(value)) + x.start() + else: + ws_message_queue.appendleft("mode error") + elif command == "connect" and arduino and lidar != None: + ws_message_queue.appendleft("try to connect to Adruino and LIDAR") + await init() + elif command == "status": + ws_message_queue.appendleft("progress: " + scan_progress) + else: + ws_message_queue.appendleft("command error") + +async def producer_handler(websocket, path): + while True: + global ws_message_queue + if len(ws_message_queue) > 0: + message = ws_message_queue.pop() + await websocket.send(message) + await asyncio.sleep(0.01) + +async def consumer_handler(websocket, path): + async for message in websocket: + await wsfilter(message) + +async def handler(websocket, path): + print("Start Websocket Connection") + await init() + consumer_task = asyncio.ensure_future(consumer_handler(websocket, path)) + producer_task = asyncio.ensure_future(producer_handler(websocket, path)) + done, pending = await asyncio.wait([consumer_task, producer_task], return_when=asyncio.FIRST_COMPLETED) + for task in pending: + task.cancel() + +ws_server = websockets.serve(handler, 'localhost', 6789) +loop = asyncio.get_event_loop() +loop.run_until_complete(ws_server) +loop.run_forever() diff --git a/PointCloudWeb.Web/src/views/Scanner.vue b/PointCloudWeb.Web/src/views/Scanner.vue index c573a45..332581f 100644 --- a/PointCloudWeb.Web/src/views/Scanner.vue +++ b/PointCloudWeb.Web/src/views/Scanner.vue @@ -1,18 +1,27 @@ @@ -20,34 +29,119 @@ export default { data() { return { + wsConnection: null, logs: [], - status: "disconnected" + connection_status: false, + scan_status: false, + progress: 0, + command: "", + value: "" }; }, methods: { - sendMessage: function(message) { + sendMessage(message) { + this.wsConnection.send(message); + }, + connectWS(){ + this.wsConnection = new WebSocket("ws://127.0.0.1:6789/") + let that = this + + this.wsConnection.onopen = function(){ + that.connection_status = true + } + + this.wsConnection.onmessage = function(event){ + if(event.data) + that.msgFilter(event.data) + } + }, + msgFilter(message){ + let that = this + if(message.search("<") != -1){ + that.command = message.substr(message.search("<")+1, message.search(">")-1) + that.value = message.substr(message.search(">")+1) + console.log("command: " + that.command + " / value: " + that.value) + this.action(that.command, that.value) + } + else{ + that.command = "log" + that.value = message + this.action(that.command, that.value) + } + }, + action(command, value){ + let that = this + if(command == "progress"){ + that.progress = parseInt(value, 10) + } + else if(command == "log"){ + that.logs.push(value); + } + else if(command == "scan"){ + if(value == "running") + that.scan_status = true + else + that.scan_status = false + } + else + that.logs.push("Unknow command: " + value); - this.connection.send(message); } }, - created: function() { - this.connection = new WebSocket("ws://127.0.0.1:6789/") - let that = this - - this.connection.onopen = function(){ - that.status = "connected" - that.logs.push("successfully connected to scanserver") - } - - this.connection.onmessage = function(event){ - console.log(event) - that.logs.push(event.data); - } - + created() { + this.connectWS(); } }; \ No newline at end of file