From 31b892aee25e14278f7956dd70740f49b039c37b Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Fri, 17 Jan 2020 20:59:12 +0530
Subject: [PATCH] start serialserver.py

---
 py/serialserver.py | 153 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 153 insertions(+)
 create mode 100755 py/serialserver.py

diff --git a/py/serialserver.py b/py/serialserver.py
new file mode 100755
index 0000000..9e2874d
--- /dev/null
+++ b/py/serialserver.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python3
+#
+# serialserver.py
+#    send a serial file with handshaking
+#
+# Neil Gershenfeld 1/17/20
+#
+# This work may be reproduced, modified, distributed,
+# performed, and displayed for any purpose, but must
+# acknowledge the mods project. Copyright is
+# retained and must be preserved. The work is provided
+# as is; no warranty is provided, and users accept all 
+# liability.
+#
+
+import sys,serial,time,threading,os,time,asyncio,websockets
+#from Tkinter import *
+
+async def hello(websocket, path):
+   while (1):
+      name = await websocket.recv()
+      print("< {}".format(name))
+start_server = websockets.serve(hello, 'localhost', 1234)
+asyncio.get_event_loop().run_until_complete(start_server)
+asyncio.get_event_loop().run_forever()
+
+WINDOW = 400 # window size
+RUN = 0
+PAUSE = 1
+state = RUN
+
+#
+# send routine
+#
+#def send(parent,canvas,data,s):
+def send(canvas,data,s):
+   global state,tstart
+   n = 0
+   N = len(data)
+   for c in data:
+      #
+      # check for pause
+      #
+      if (state == PAUSE):
+         while (state == PAUSE):
+            time.sleep(0.001)
+      #
+      # check for flow control handshaking
+      #
+      if (flow == "dsrdtr"):
+         while (s.getDSR() != True):
+            time.sleep(0.001)
+      elif (flow == "rtscts"):
+         while (s.getCTS() != True):
+            time.sleep(0.001)
+      #
+      # send next char
+      #
+      s.write(c)
+      s.flush()
+      #
+      # update
+      #
+      n += 1
+      percent = (100.0*n)/len(data)
+      dt = (time.time() - tstart)/60.
+      totalt = (dt/n)*len(data)
+      canvas.itemconfigure("text",text="sending %.1f%% (%.0f/%.0f min)"%(percent,dt,totalt))
+      canvas.update()
+   s.close()
+   os._exit(0)
+#
+# pause routine
+#
+def pause():
+   global state
+   if (state == RUN):
+      state = PAUSE
+      pause_button.config(text="continue")
+   elif (state == PAUSE):
+      state = RUN
+      pause_button.config(text="pause")
+#
+# cancel routine
+#
+def cancel():
+   global s
+   s.close()
+   sys.exit()
+#
+# quit routine
+#
+def quit():
+   s.close()
+   sys.exit()
+#
+# command line
+#
+if (len(sys.argv) != 4):
+   print("command line: mod_serial.py port speed flow")
+   print("   port = serial port")
+   print("   speed = comm speed")
+   print("   flow = flow control (none | xonxoff | rtscts | dsrdtr )")
+   sys.exit()
+port = sys.argv[1]
+speed = sys.argv[2]
+flow = sys.argv[3]
+filename = sys.argv[4]
+
+"""
+#
+# open file
+#
+f = open(filename)
+data = f.read()
+f.close()
+#
+# open port
+#
+if (flow == "xonxoff"):
+   s = serial.Serial(port, baudrate=speed, xonxoff=True, timeout=0)
+elif (flow == "rtscts"):
+   s = serial.Serial(port, baudrate=speed, rtscts=True, timeout=0)
+elif (flow == "dsrdtr"):
+   s = serial.Serial(port, baudrate=speed, dsrdtr=True, timeout=0)
+elif (flow == "none"):
+   s = serial.Serial(port, baudrate=speed, timeout=0)
+s.flushInput()
+s.flushOutput()
+#
+# set up GUI
+#
+root = Tk()
+root.title('mod_serial.py')
+canvas = Canvas(root, width=WINDOW, height=.25*WINDOW, background='white')
+canvas.create_text(.5*WINDOW,.1*WINDOW,text="",font=("Helvetica",24),tags="text",fill="#0000b0")
+canvas.pack()
+pause_button = Button(root,text="pause",command=pause)
+pause_button.pack()
+cancel_button = Button(root,text="cancel",command=cancel)
+cancel_button.pack()
+#
+# start sending thread
+#
+tstart = time.time()
+t = threading.Thread(target=send,args=(canvas,data,s))
+t.start()
+#
+# start UI loop
+#
+root.mainloop()
+"""
+
-- 
GitLab