wedn, 11/27/2024
# pyThread111924
# Nov 21,2024 ok good reading
#11/9/2024
#PyQt5HMUSB071724.py
# oct 12, 2024
#C:\Users\admin\PycharmProjects\pyHMUSB_1
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow,QMessageBox,QDialog
from PyQt5.uic import loadUi
#from PyQt5.QtCore import QTimer
import sys
#from threading import Thread
import threading
import datetime
from threading import Event
import time
from time import sleep
from threading import Thread
import queue
# initilizee
q =queue.Queue() # fifo
# seriasl Port
import keyboard
import serial
# Global variable for RS232 read
Gloabal_RS232Read =0
#../
#
#from pyHMUSB import add2,OpenPort,PortClose
#from myModuleSerial import add
#import pyHMUSB
from pyHMUSB import *
event = Event()
timerEnable =1
class MainUIxy(QMainWindow):
def __init__(self):
super(MainUIxy, self).__init__()
loadUi("myTestQt5.ui", self) # Load the UI file
self.pushButtonXHome.clicked.connect(XHomeAxis)
self.XJOG_PB.clicked.connect(XJOGAxis)
#self.StartTimerPB.connect(StatTimerCallBack)
self.ThreadON_PB.clicked.connect(Thread_ON)
self.ThreadOFF_PB.clicked.connect(Thread_OFF)
self.PBStartTimer.clicked.connect(StatTimerCallBack)
# Wait for the timer to finish
#timer.join()
# create the event
#PortClose()
#serialPort.close()
#print(add(1,2))
# Seerial Module
baudrate = 115200
print(add2(7,4))
print(baudrate)
serialPort = serial.Serial(port='COM3', baudrate=baudrate, parity=serial.PARITY_NONE, bytesize=8, timeout=1,
stopbits=serial.STOPBITS_ONE)
#serialPort.close()
def OpenSerialPort():
try:
serialPort.close()
serialPort.open()
except serial.SerialException:
print("done")
#serialPort.open()
#OpenPort()
#PortClose()
def Thread_ON():
OpenSerialPort()
print("thread ON")
t1 = Thread(target=myThreadRS232Function, args=(event,q))
t1.start()
#t1.join()
# block for a while
sleep(3)
def Thread_OFF():
print("thread OFF")
print(q.get())
print(q.get())
serialPort.close()
# stop the worker thread
print('Main stopping thread')
event.set()
# wait for the new thread to finish
t1.thread.join()
# Wait for the timer to finish
timer.join()
def my_function():
timer = threading.Timer(3.0, my_function)
timer.start()
#print("Timer event triggered!")
def StatTimerCallBack():
#timerEnable = 7
print("set timer start")
#Thread(target=myThreadRS232Function, args=(event,q))
# Create a timer that triggers after 5 seconds
timer = threading.Timer(3.0, my_function)
timer.start()
print("CallBackTimerF")
sleep(3)
# define myThreadRS232Function
def myThreadRS232Function(event,q):
global Gloabal_RS232Read
while True:
Gloabal_RS232Read += 1
#print(f'{Gloabal_RS232Read}')
message = serialPort.readline()
length = len(message)
if (length > 0):
print(message)
q.put(message)
sleep(1)
if event.is_set():
break
def callback_function():
length = len(q.get())
if (length > 0):
print("data Event triggered!")
print(q.get())
def XHomeAxis():
serialString = ""
serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n','ascii'))
print("test")
print(Gloabal_RS232Read)
while True:
try:
message = serialPort.readline()
print(message)
if keyboard.is_pressed('q'):
print("quit")
break
except KeyboardInterrupt:
break
XPosition =0.300
def XJOGAxis(): #F6
serialString = ""
global XPosition
XPosIncrement = 0.200
#round(XPosition, 2)
serialPort.write(bytearray('{"gc":"G1 F150 X'+str(round(XPosition,2)) +' Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G1 F150 X0.400 Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n', 'ascii'))
XPosition = XPosition +XPosIncrement
print("XJOG-test")
while True:
try:
message = serialPort.readline()
print(message)
if keyboard.is_pressed('q'):
print("quit")
break
except KeyboardInterrupt:
break
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MainUIxy()
ui.show()
app.exec_()
print("done-1")
serialPort.close()
# wait for the new thread to finish
t1.thread.join()
# Wait for the timer to finish
timer.join()
#REFERENCE
#https://superfastpython.com/stop-a-thread-in-python/
readind
XJOG-test
b'{"r":{},"f":[1,0,36,137]}\n'
b'{"sr":{"posx":0.500,"vel":3.99,"stat":5}}\n'
b'{"qr":31,"qi":1,"qo":0}\n'
b'{"sr":{"posx":0.700,"vel":0.00,"stat":3}}\n'
b'{"qr":32,"qi":0,"qo":1}\n'
11/20/24
# pyThread111924
11/9/2024
#PyQt5HMUSB071724.py
# oct 12, 2024
#C:\Users\admin\PycharmProjects\pyHMUSB_1
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow,QMessageBox,QDialog
from PyQt5.uic import loadUi
#from PyQt5.QtCore import QTimer
import sys
#from threading import Thread
import threading
import datetime
from threading import Event
import time
from time import sleep
from threading import Thread
import queue
# initilizee
q =queue.Queue() # fifo
# seriasl Port
import keyboard
import serial
# Global variable for RS232 read
Gloabal_RS232Read =0
#../
#
#from pyHMUSB import add2,OpenPort,PortClose
#from myModuleSerial import add
#import pyHMUSB
from pyHMUSB import *
event = Event()
timerEnable =1
class MainUIxy(QMainWindow):
def __init__(self):
super(MainUIxy, self).__init__()
loadUi("myTestQt5.ui", self) # Load the UI file
self.pushButtonXHome.clicked.connect(XHomeAxis)
self.XJOG_PB.clicked.connect(XJOGAxis)
#self.StartTimerPB.connect(StatTimerCallBack)
self.ThreadON_PB.clicked.connect(Thread_ON)
self.ThreadOFF_PB.clicked.connect(Thread_OFF)
self.PBStartTimer.clicked.connect(StatTimerCallBack)
# Wait for the timer to finish
#timer.join()
# create the event
#PortClose()
#serialPort.close()
#print(add(1,2))
# Seerial Module
baudrate = 115200
print(add2(7,4))
print(baudrate)
serialPort = serial.Serial(port='COM8', baudrate=baudrate, parity=serial.PARITY_NONE, bytesize=8, timeout=1,
stopbits=serial.STOPBITS_ONE)
#serialPort.close()
def OpenSerialPort():
try:
serialPort.close()
serialPort.open()
except serial.SerialException:
print("done")
#serialPort.open()
#OpenPort()
#PortClose()
def Thread_ON():
OpenSerialPort()
print("thread ON")
t1 = Thread(target=myThreadRS232Function, args=(event,q))
t1.start()
#t1.join()
# block for a while
sleep(3)
def Thread_OFF():
print("thread OFF")
print(q.get())
print(q.get())
serialPort.close()
# stop the worker thread
print('Main stopping thread')
event.set()
# wait for the new thread to finish
t1.thread.join()
# Wait for the timer to finish
timer.join()
def my_function():
timer = threading.Timer(3.0, my_function)
timer.start()
print("Timer event triggered!")
def StatTimerCallBack():
#timerEnable = 7
print("set timer start")
#Thread(target=myThreadRS232Function, args=(event,q))
# Create a timer that triggers after 5 seconds
timer = threading.Timer(3.0, my_function)
timer.start()
print("CallBackTimerF")
sleep(3)
# define myThreadRS232Function
def myThreadRS232Function(event,q):
global Gloabal_RS232Read
while True:
Gloabal_RS232Read += 1
#print(f'{Gloabal_RS232Read}')
message = serialPort.readline()
length = len(message)
if (length > 0):
print(message)
q.put(message)
sleep(1)
if event.is_set():
break
def callback_function():
print("data Event triggered!")
length = len(q.get())
if (length > 0):
#print(message)
print(q.get())
def XHomeAxis():
serialString = ""
serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n','ascii'))
print("test")
print(Gloabal_RS232Read)
while True:
try:
message = serialPort.readline()
print(message)
if keyboard.is_pressed('q'):
print("quit")
break
except KeyboardInterrupt:
break
XPosition =0.300
def XJOGAxis(): #F6
serialString = ""
global XPosition
XPosIncrement = 0.200
#round(XPosition, 2)
serialPort.write(bytearray('{"gc":"G1 F150 X'+str(round(XPosition,2)) +' Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G1 F150 X0.400 Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n', 'ascii'))
XPosition = XPosition +XPosIncrement
print("XJOG-test")
while True:
try:
message = serialPort.readline()
print(message)
if keyboard.is_pressed('q'):
print("quit")
break
except KeyboardInterrupt:
break
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MainUIxy()
ui.show()
app.exec_()
print("done-1")
serialPort.close()
# wait for the new thread to finish
t1.thread.join()
# Wait for the timer to finish
timer.join()
#REFERENCE
#https://superfastpython.com/stop-a-thread-in-python/
# timwerEventThread
import threading
import time
def my_function():
print("Timer event triggered!")
# Create a timer that triggers after 5 seconds
timer = threading.Timer(5.0, my_function)
timer.start()
# Do other work while the timer is running
time.sleep(2)
print("Doing other work...")
# Wait for the timer to finish
timer.join()
C:\Users\hmill\PycharmProjects\HM_python0927-1
C:\Users\admin\PycharmProjects\pyHMUSB_1
QTimer in PyQt5
https://www.youtube.com/watch?v=DQkDWsHYxq8
../
Create An LCD Clock - PyQt5 GUI Thursdays #35
https://www.youtube.com/watch?v=CcnsV4qlBGQ&t=55s
11/15/24
#11/15/24
# pyScheduling
# pip install schedule
import schedule
from datetime import time, timedelta,date
import time as tmr
def job():
print("subscribe to me")
schedule.every(5).seconds.do(job)
while True:
schedule.run_pending()
tmr.sleep(1)
11/14/2024
..work onProgress
#PyQt5HMUSB071724.py
# oct 12, 2024
#C:\Users\admin\PycharmProjects\pyHMUSB_1
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow,QMessageBox,QDialog
from PyQt5.uic import loadUi
import sys
#from threading import Thread
import threading
import time
from threading import Event
from time import sleep
from threading import Thread
# seriasl Port
import keyboard
import serial
import time
# Global variable for RS232 read
Gloabal_RS232Read =0
#../
#
#from pyHMUSB import add2,OpenPort,PortClose
#from myModuleSerial import add
#import pyHMUSB
from pyHMUSB import *
class MainUIxy(QMainWindow):
def __init__(self):
super(MainUIxy, self).__init__()
loadUi("myTestQt5.ui", self) # Load the UI file
self.pushButtonXHome.clicked.connect(XHomeAxis)
self.XJOG_PB.clicked.connect(XJOGAxis)
self.ThreadON_PB.clicked.connect(Thread_ON)
self.ThreadOFF_PB.clicked.connect(Thread_OFF)
# create the event
#PortClose()
#print(add(1,2))
# Seerial Module
baudrate = 115200
print(add2(7,4))
print(baudrate)
serialPort = serial.Serial(port='COM3', baudrate=baudrate, parity=serial.PARITY_NONE, bytesize=8, timeout=1,
stopbits=serial.STOPBITS_ONE)
event = Event()
def Thread_ON():
#OpenSerialPort()
start_time = time.time()
interval = 5 # seconds
print("thread ON")
t1 = Thread(target=myThreadRS232Function, args=(event,))
t1.start()
#t1.join()
# block for a while
sleep(3)
def Thread_OFF():
print("thread OFF")
# stop the worker thread
print('Main stopping thread')
event.set()
# wait for the new thread to finish
t1.thread.join()
# define myThreadRS232Function
def myThreadRS232Function(event):
global Gloabal_RS232Read
global reading
if (serialPort.is_open):
while (True):
reading = serialPort.readline()
length = len(reading)
#print(length)
if (length >0):
print(reading)
# Check if 'inner' key exists inside 'outer'
else:
print("notOpen")
time.sleep(0.25)
def XHomeAxis():
serialString = ""
serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n','ascii'))
#print("test")
#print(Gloabal_RS232Read)
while True:
try:
#message = serialPort.readline()
#print(message)
if keyboard.is_pressed('q'):
print("quit")
break
except KeyboardInterrupt:
break
XPosition =1.000
def XJOGAxis(): #F6
serialString = ""
global XPosition
global reading
XPosIncrement = 0.500
#round(XPosition, 2)
serialPort.write(bytearray('{"gc":"G1 F150 X'+str(round(XPosition,2)) +' Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G1 F150 X0.400 Y0.000 A0.000"}''\r\n', 'ascii'))
#serialPort.write(bytearray('{"gc":"G28.2 X0"}''\r\n', 'ascii'))
XPosition = XPosition +XPosIncrement
print(XPosition)
print("XJOG-test")
length = len(reading)
if (length > 2):
print(reading)
def callback_function():
print("Event triggered!")
def myTimeEvent():
while True:
current_time = time.time()
if current_time - start_time >= interval:
callback_function()
start_time = current_time # Reset the timer
time.sleep(1) # Check every second
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MainUIxy()
ui.show()
app.exec_()
print("done-1")
serialPort.close()
#REFERENCE
#https://superfastpython.com/stop-a-thread-in-python/
../python
..//
XJOG-test
b'{"r":{},"f":[1,0,36,137]}\n'
b'{"sr":{"posx":0.000,"feed":150.00,"vel":3.99,"stat":5}}\n'
b'{"qr":31,"qi":1,"qo":0}\n'
b'{"sr":{"posx":0.456,"vel":150.00}}\n'
b'{"sr":{"posx":0.942}}\n'
b'{"sr":{"posx":1.000,"vel":0.00,"stat":3}}\n'
b'{"qr":32,"qi":0,"qo":1}\n'
..///
liteplacer startUP
...//
Application Start
Version: 1.0.8340.22961, build date: 11/01/2022 12:45:22
Reading application settings from C:\LitePlacer\LitePlacer.Appsettings
Creating data file backups to C:\LitePlacer\DataBackup\2024-11-14 15.43.00
Basic Setup tab begin
LoadVideoAlgorithms from C:\LitePlacer\LitePlacer.VideoAlgorithms
UpdateVideoProcessing()
BuildFunctionsList:
No saved temp CAD data file
No saved temp job data file
DownCamera already stopped
UpCamera already stopped
Downcamera moniker not found. Moniker: @device:pnp:\\?\usb#vid_f007&pid_a999&mi_00#6&1b900a24&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
camera resolution not set.
camera resolution not set.
camera resolution not set.
camera resolution not set.
camera resolution not set.
camera resolution not set.
camera resolution not set.
camera resolution not set.
Loading tapes with nozzles data
Reading v2 format file C:\LitePlacer\LitePlacer.TapesData_v2
Loading nozzles data
Reading v2 format file C:\LitePlacer\LitePlacer.NozzlesLoadData_v2
Reading v2 format file C:\LitePlacer\LitePlacer.NozzlesUnLoadData_v2
Reading v2 format file C:\LitePlacer\LitePlacer.NozzlesVisionParameters_v21
Loading nozzle calibration data from C:\LitePlacer\LitePlacer.NozzlesCalibrationData_v3
Connected to serial port COM3
==> {sr:n}
TinyG board found.
<== {"r":{"sr":{"posx":0.000,"posy":0.000,"posz":0.000,"posa":0.000,"feed":0.00,"vel":0.00,"unit":1,"coor":1,"dist":0,"frmo":1,"stat":1}},"f":[1,0,7,3689]}
ReadyEvent r:sr
Reading TinyG settings:
==> {"st":""}
<== {"r":{"st":0},"f":[1,0,10,8400]}
ReadyEvent r
==> {"mt":""}
<== {"r":{"mt":300.00},"f":[1,0,10,2825]}
mt value: 300
ReadyEvent r
==> {"jv":""}
<== {"r":{"jv":3},"f":[1,0,10,5886]}
ReadyEvent r
==> {"js":""}
<== {"r":{"js":1},"f":[1,0,10,5969]}
ReadyEvent r
==> {"tv":""}
<== {"r":{"tv":1},"f":[1,0,10,7227]}
ReadyEvent r
==> {"qv":""}
<== {"r":{"qv":2},"f":[1,0,10,4252]}
ReadyEvent r
==> {"sv":""}
<== {"r":{"sv":1},"f":[1,0,10,9297]}
ReadyEvent r
==> {"si":""}
<== {"r":{"si":200},"f":[1,0,10,4311]}
ReadyEvent r
==> {"gun":""}
<== {"r":{"gun":1},"f":[1,0,11,7651]}
ReadyEvent r
==> {"1ma":""}
<== {"r":{"1ma":0},"f":[1,0,11,7976]}
ReadyEvent r
==> {"1sa":""}
<== {"r":{"1sa":0.900},"f":[1,0,11,7161]}
ReadyEvent r
==> {"1tr":""}
<== {"r":{"1tr":40.0000},"f":[1,0,11,2474]}
ReadyEvent r
==> {"1mi":""}
<== {"r":{"1mi":8},"f":[1,0,11,7985]}
ReadyEvent r
==> {"1po":""}
<== {"r":{"1po":0},"f":[1,0,11,5004]}
ReadyEvent r
==> {"1pm":""}
<== {"r":{"1pm":2},"f":[1,0,11,3385]}
ReadyEvent r
==> {"2ma":""}
<== {"r":{"2ma":1},"f":[1,0,11,2464]}
ReadyEvent r
==> {"2sa":""}
<== {"r":{"2sa":0.900},"f":[1,0,11,9295]}
ReadyEvent r
==> {"2tr":""}
<== {"r":{"2tr":40.0000},"f":[1,0,11,2225]}
ReadyEvent r
==> {"2mi":""}
<== {"r":{"2mi":8},"f":[1,0,11,1659]}
ReadyEvent r
==> {"2po":""}
<== {"r":{"2po":0},"f":[1,0,11,5513]}
ReadyEvent r
==> {"2pm":""}
<== {"r":{"2pm":2},"f":[1,0,11,7058]}
ReadyEvent r
==> {"3ma":""}
<== {"r":{"3ma":2},"f":[1,0,11,3787]}
ReadyEvent r
==> {"3sa":""}
<== {"r":{"3sa":1.800},"f":[1,0,11,1431]}
ReadyEvent r
==> {"3tr":""}
<== {"r":{"3tr":8.0000},"f":[1,0,11,7613]}
ReadyEvent r
==> {"3mi":""}
<== {"r":{"3mi":8},"f":[1,0,11,5332]}
ReadyEvent r
==> {"3po":""}
<== {"r":{"3po":0},"f":[1,0,11,9186]}
ReadyEvent r
==> {"3pm":""}
<== {"r":{"3pm":2},"f":[1,0,11,7567]}
ReadyEvent r
==> {"4ma":""}
<== {"r":{"4ma":3},"f":[1,0,11,8274]}
ReadyEvent r
==> {"4sa":""}
<== {"r":{"4sa":0.900},"f":[1,0,11,7235]}
ReadyEvent r
==> {"4tr":""}
<== {"r":{"4tr":160.0000},"f":[1,0,11,2085]}
ReadyEvent r
==> {"4mi":""}
<== {"r":{"4mi":8},"f":[1,0,11,9005]}
ReadyEvent r
==> {"4po":""}
<== {"r":{"4po":0},"f":[1,0,11,2860]}
ReadyEvent r
==> {"4pm":""}
<== {"r":{"4pm":2},"f":[1,0,11,1241]}
ReadyEvent r
==> {"Xam":""}
<== {"r":{"xam":1},"f":[1,0,11,9625]}
ReadyEvent r
==> {"Xvm":""}
<== {"r":{"xvm":10000},"f":[1,0,11,3029]}
ReadyEvent r
==> {"Xfr":""}
<== {"r":{"xfr":10000},"f":[1,0,11,7270]}
ReadyEvent r
==> {"Xtn":""}
<== {"r":{"xtn":0.000},"f":[1,0,11,7296]}
ReadyEvent r
==> {"Xtm":""}
<== {"r":{"xtm":600.000},"f":[1,0,11,3084]}
ReadyEvent r
==> {"Xjm":""}
<== {"r":{"xjm":1000},"f":[1,0,11,1454]}
ReadyEvent r
==> {"Xjh":""}
<== {"r":{"xjh":2000},"f":[1,0,11,5217]}
ReadyEvent r
==> {"Xsv":""}
<== {"r":{"xsv":2000},"f":[1,0,11,8943]}
ReadyEvent r
==> {"Xlv":""}
<== {"r":{"xlv":100},"f":[1,0,11,1277]}
ReadyEvent r
==> {"Xlb":""}
<== {"r":{"xlb":8.000},"f":[1,0,11,3381]}
ReadyEvent r
==> {"Xzb":""}
<== {"r":{"xzb":2.000},"f":[1,0,11,5206]}
ReadyEvent r
==> {"Yam":""}
<== {"r":{"yam":1},"f":[1,0,11,3299]}
ReadyEvent r
==> {"Yvm":""}
<== {"r":{"yvm":10000},"f":[1,0,11,1999]}
ReadyEvent r
==> {"Yfr":""}
<== {"r":{"yfr":10000},"f":[1,0,11,9404]}
ReadyEvent r
==> {"Ytn":""}
<== {"r":{"ytn":0.000},"f":[1,0,11,6266]}
ReadyEvent r
==> {"Ytm":""}
<== {"r":{"ytm":400.000},"f":[1,0,11,6222]}
ReadyEvent r
==> {"Yjm":""}
<== {"r":{"yjm":1000},"f":[1,0,11,8174]}
ReadyEvent r
==> {"Yjh":""}
<== {"r":{"yjh":2000},"f":[1,0,11,1938]}
ReadyEvent r
==> {"Ysv":""}
<== {"r":{"ysv":2000},"f":[1,0,11,5664]}
ReadyEvent r
==> {"Ylv":""}
<== {"r":{"ylv":100},"f":[1,0,11,3327]}
ReadyEvent r
==> {"Ylb":""}
<== {"r":{"ylb":8.000},"f":[1,0,11,2351]}
ReadyEvent r
==> {"Yzb":""}
<== {"r":{"yzb":2.000},"f":[1,0,11,7340]}
ReadyEvent r
==> {"Zam":""}
<== {"r":{"zam":1},"f":[1,0,11,6972]}
ReadyEvent r
==> {"Zvm":""}
<== {"r":{"zvm":5000},"f":[1,0,11,9156]}
ReadyEvent r
==> {"Zfr":""}
<== {"r":{"zfr":2000},"f":[1,0,11,9342]}
ReadyEvent r
==> {"Ztn":""}
<== {"r":{"ztn":0.000},"f":[1,0,11,8400]}
ReadyEvent r
==> {"Ztm":""}
<== {"r":{"ztm":80.000},"f":[1,0,11,8706]}
ReadyEvent r
==> {"Zjm":""}
<== {"r":{"zjm":500},"f":[1,0,11,7926]}
ReadyEvent r
==> {"Zjh":""}
<== {"r":{"zjh":500},"f":[1,0,11,2724]}
ReadyEvent r
==> {"Zsv":""}
<== {"r":{"zsv":1000},"f":[1,0,11,508]}
ReadyEvent r
==> {"Zlv":""}
<== {"r":{"zlv":100},"f":[1,0,11,5377]}
ReadyEvent r
==> {"Zlb":""}
<== {"r":{"zlb":10.000},"f":[1,0,11,5156]}
ReadyEvent r
==> {"Zzb":""}
<== {"r":{"zzb":2.000},"f":[1,0,11,6310]}
ReadyEvent r
==> {"Aam":""}
<== {"r":{"aam":1},"f":[1,0,11,960]}
ReadyEvent r
==> {"Avm":""}
<== {"r":{"avm":50000},"f":[1,0,11,3126]}
ReadyEvent r
==> {"Afr":""}
<== {"r":{"afr":200000},"f":[1,0,11,1133]}
ReadyEvent r
==> {"Atn":""}
<== {"r":{"atn":0.000},"f":[1,0,11,2003]}
ReadyEvent r
==> {"Atm":""}
<== {"r":{"atm":600.000},"f":[1,0,11,840]}
ReadyEvent r
==> {"Ajm":""}
<== {"r":{"ajm":5000},"f":[1,0,11,2237]}
ReadyEvent r
==> {"Ajh":""}
<== {"r":{"ajh":5000},"f":[1,0,11,959]}
ReadyEvent r
==> {"Asv":""}
<== {"r":{"asv":2000},"f":[1,0,11,6396]}
ReadyEvent r
==> {"ec":""}
<== {"r":{"ec":0},"f":[1,0,10,5349]}
ValueUpdater, no operation(ec, 0)
ReadyEvent r
==> {"ee":""}
<== {"r":{"ee":0},"f":[1,0,10,5432]}
ValueUpdater, no operation(ee, 0)
ReadyEvent r
==> {"ex":""}
<== {"r":{"ex":1},"f":[1,0,10,1021]}
ValueUpdater, no operation(ex, 1)
ReadyEvent r
==> {"Xsn":""}
<== {"r":{"xsn":3},"f":[1,0,11,6374]}
ReadyEvent r
==> {"Xsx":""}
<== {"r":{"xsx":2},"f":[1,0,11,8632]}
ReadyEvent r
==> {"Ysn":""}
<== {"r":{"ysn":3},"f":[1,0,11,48]}
ReadyEvent r
==> {"Ysx":""}
<== {"r":{"ysx":2},"f":[1,0,11,9141]}
ReadyEvent r
==> {"Zsn":""}
<== {"r":{"zsn":3},"f":[1,0,11,3721]}
ReadyEvent r
==> {"Zsx":""}
<== {"r":{"zsx":2},"f":[1,0,11,2815]}
ReadyEvent r
==> {"Asn":""}
<== {"r":{"asn":0},"f":[1,0,11,5266]}
ReadyEvent r
==> {"Asx":""}
<== {"r":{"asx":0},"f":[1,0,11,5174]}
ReadyEvent r
==> {"me":""}
<== {"r":{"me":null},"f":[1,0,10,3586]}
PumpOff(), TinyG
==> {"gc":"M05"}
VacuumOff(), TinyG
==> {"gc":"M09"}
<== {"r":{},"f":[1,0,13,72]}
<== {"qr":32,"qi":1,"qo":1}
<== {"r":{},"f":[1,0,13,72]}
<== {"qr":32,"qi":1,"qo":1}
Startup completed.