46 from struct
import pack
64 _text_lines =
"end - 500 lines"
67 _reset_request =
False
71 _glb_filter = 0x00000000000000000000000000000000
72 _loc_filter = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
74 _dtypes = (
"8-bit",
"16-bit",
"32-bit")
79 Tk.report_callback_exception = QView._trap_error
82 main_menu = Menu(root, tearoff=0)
83 root.config(menu=main_menu)
86 m = Menu(main_menu, tearoff=0)
87 m.add_command(label=
"Save QSPY Dictionaries",
88 command=QView._onSaveDict)
89 m.add_command(label=
"Toggle QSPY Text Output",
90 command=QView._onSaveText)
91 m.add_command(label=
"Toggle QSPY Binary Output",
92 command=QView._onSaveBin)
93 m.add_command(label=
"Toggle Matlab Output",
94 command=QView._onSaveMatlab)
95 m.add_command(label=
"Toggle Sequence Output",
96 command=QView._onSaveSequence)
98 m.add_command(label=
"Exit", command=QView._quit)
99 main_menu.add_cascade(label=
"File", menu=m)
102 m = Menu(main_menu, tearoff=0)
103 QView._view_canvas = IntVar()
104 m.add_checkbutton(label=
"Canvas", variable=QView._view_canvas,
105 command=QView._onCanvasView)
106 main_menu.add_cascade(label=
"View", menu=m)
109 m = Menu(main_menu, tearoff=0)
110 m.add_command(label=
"SM Group...", accelerator=
"[NONE]",
111 command=QView._onGlbFilter_SM)
112 m.add_command(label=
"AO Group...", accelerator=
"[NONE]",
113 command=QView._onGlbFilter_AO)
114 m.add_command(label=
"QF Group...", accelerator=
"[NONE]",
115 command=QView._onGlbFilter_QF)
116 m.add_command(label=
"TE Group...", accelerator=
"[NONE]",
117 command=QView._onGlbFilter_TE)
118 m.add_command(label=
"MP Group...", accelerator=
"[NONE]",
119 command=QView._onGlbFilter_MP)
120 m.add_command(label=
"EQ Group...", accelerator=
"[NONE]",
121 command=QView._onGlbFilter_EQ)
122 m.add_command(label=
"SC Group...", accelerator=
"[NONE]",
123 command=QView._onGlbFilter_SC)
125 m.add_command(label=
"U0 Group...", accelerator=
"[NONE]",
126 command=QView._onGlbFilter_U0)
127 m.add_command(label=
"U1 Group...", accelerator=
"[NONE]",
128 command=QView._onGlbFilter_U1)
129 m.add_command(label=
"U2 Group...", accelerator=
"[NONE]",
130 command=QView._onGlbFilter_U2)
131 m.add_command(label=
"U3 Group...", accelerator=
"[NONE]",
132 command=QView._onGlbFilter_U3)
133 m.add_command(label=
"U4 Group...", accelerator=
"[NONE]",
134 command=QView._onGlbFilter_U4)
135 main_menu.add_cascade(label=
"Global-Filters", menu=m)
136 QView._menu_glb_filter = m
139 m = Menu(main_menu, tearoff=0)
140 m.add_command(label=
"AO IDs...", accelerator=
"[NONE]",
141 command=QView._onLocFilter_AO)
142 m.add_command(label=
"EP IDs...", accelerator=
"[NONE]",
143 command=QView._onLocFilter_EP)
144 m.add_command(label=
"EQ IDs...", accelerator=
"[NONE]",
145 command=QView._onLocFilter_EQ)
146 m.add_command(label=
"AP IDs...", accelerator=
"[NONE]",
147 command=QView._onLocFilter_AP)
149 m.add_command(label=
"AO-OBJ...", command=QView._onLocFilter_AO_OBJ)
150 main_menu.add_cascade(label=
"Local-Filters", menu=m)
151 QView._menu_loc_filter = m
154 m = Menu(main_menu, tearoff=0)
155 m.add_command(label=
"SM_OBJ", command=QView._onCurrObj_SM)
156 m.add_command(label=
"AO_OBJ", command=QView._onCurrObj_AO)
157 m.add_command(label=
"MP_OBJ", command=QView._onCurrObj_MP)
158 m.add_command(label=
"EQ_OBJ", command=QView._onCurrObj_EQ)
159 m.add_command(label=
"TE_OBJ", command=QView._onCurrObj_TE)
160 m.add_command(label=
"AP_OBJ", command=QView._onCurrObj_AP)
162 m1 = Menu(m, tearoff=0)
163 m1.add_command(label=
"SM_OBJ", command=QView._onQueryCurr_SM)
164 m1.add_command(label=
"AO_OBJ", command=QView._onQueryCurr_AO)
165 m1.add_command(label=
"MP_OBJ", command=QView._onQueryCurr_MP)
166 m1.add_command(label=
"EQ_OBJ", command=QView._onQueryCurr_EQ)
167 m1.add_command(label=
"TE_OBJ", command=QView._onQueryCurr_TE)
168 m1.add_command(label=
"AP_OBJ", command=QView._onQueryCurr_AP)
169 m.add_cascade(label=
"Query Current", menu=m1)
170 main_menu.add_cascade(label=
"Current-Obj", menu=m)
171 QView._menu_curr_obj = m
174 m = Menu(main_menu, tearoff=0)
175 m.add_command(label=
"Reset Target", command=reset_target)
176 m.add_command(label=
"Query Target Info", command=QView._onTargetInfo)
177 m.add_command(label=
"Tick[0]", command=QView._onTick0)
178 m.add_command(label=
"Tick[1]", command=QView._onTick1)
179 m.add_command(label=
"Command...", command=QView._CommandDialog)
181 m.add_command(label=
"Peek...", command=QView._PeekDialog)
182 m.add_command(label=
"Poke...", command=QView._PokeDialog)
183 main_menu.add_cascade(label=
"Commands", menu=m)
184 QView._menu_commands = m
187 m = Menu(main_menu, tearoff=0)
188 m.add_command(label=
"Publish...", command=QView._onEvt_PUBLISH)
189 m.add_command(label=
"Post...", command=QView._onEvt_POST)
190 m.add_command(label=
"Init SM", command=QView._onEvt_INIT)
191 m.add_command(label=
"Dispatch...", command=QView._onEvt_DISPATCH)
192 main_menu.add_cascade(label=
"Events", menu=m)
193 QView._menu_events = m
196 m = Menu(main_menu, tearoff=0)
198 main_menu.add_cascade(label=
"Custom", menu=m)
199 QView.custom_menu = m
202 m = Menu(main_menu, tearoff=0)
203 m.add_command(label=
"Online Help", command=QView._onHelp)
205 m.add_command(label=
"About...", command=QView._onAbout)
206 main_menu.add_cascade(label=
"Help", menu=m)
209 QView._scroll_text = IntVar()
210 QView._scroll_text.set(1)
211 QView._echo_text = IntVar()
212 QView._echo_text.set(0)
213 frame = Frame(root, borderwidth=1, relief=
"raised")
214 QView._target = Label(frame, height=2,
215 text=
"Target: " + QSpy._fmt_target)
216 QView._target.pack(side=
"left")
217 c = Checkbutton(frame, text=
"Scroll", variable=QView._scroll_text)
219 c = Checkbutton(frame, text=
"Echo", variable=QView._echo_text,
220 command=QSpy._reattach)
222 QView._tx = Label(frame, width=6, anchor=E,
223 borderwidth=1, relief=
"sunken")
224 QView._tx.pack(side=
"right")
225 Label(frame, text=
"Tx ").
pack(side=
"right")
226 QView._rx = Label(frame, width=8, anchor=E,
227 borderwidth=1, relief=
"sunken")
228 QView._rx.pack(side=
"right")
229 Label(frame, text=
"Rx ").
pack(side=
"right")
230 frame.pack(side=
"bottom", fill=
"x", pady=0)
233 frame = Frame(root, borderwidth=1, relief=
"sunken")
234 scrollbar = Scrollbar(frame)
235 QView._text = Text(frame, width=100, height=30,
236 wrap=
"word", yscrollcommand=scrollbar.set)
237 QView._text.bind(
"<Key>",
lambda e:
"break")
238 scrollbar.config(command=QView._text.yview)
239 scrollbar.pack(side=
"right", fill=
"y")
240 QView._text.pack(side=
"left", fill=
"both", expand=
True)
241 frame.pack(side=
"left", fill=
"both", expand=
True)
244 QView._canvas_toplevel = Toplevel()
245 QView._canvas_toplevel.withdraw()
246 QView._canvas_toplevel.protocol(
"WM_DELETE_WINDOW",
247 QView._onCanvasClose)
248 QView._canvas_toplevel.title(
"QView -- Canvas")
249 QView.canvas = Canvas(QView._canvas_toplevel)
253 QView._locAO_OBJ = StringVar()
254 QView._currObj = (StringVar(), StringVar(), StringVar(),
255 StringVar(), StringVar(), StringVar())
256 QView._command = StringVar()
257 QView._command_p1 = StringVar()
258 QView._command_p2 = StringVar()
259 QView._command_p3 = StringVar()
260 QView._peek_offs = StringVar()
261 QView._peek_dtype = StringVar(value=QView._dtypes[2])
262 QView._peek_len = StringVar()
263 QView._poke_offs = StringVar()
264 QView._poke_dtype = StringVar(value=QView._dtypes[2])
265 QView._poke_data = StringVar()
266 QView._evt_act = StringVar()
267 QView._evt_sig = StringVar()
268 QView._evt_par = (StringVar(), StringVar(), StringVar(),
269 StringVar(), StringVar(), StringVar(),
270 StringVar(), StringVar(), StringVar())
271 QView._evt_dtype = (StringVar(), StringVar(), StringVar(),
272 StringVar(), StringVar(), StringVar(),
273 StringVar(), StringVar(), StringVar())
274 for i
in range(len(QView._evt_par)):
275 QView._evt_dtype[i].set(QView._dtypes[2])
291 QView._text.delete(1.0, QView._text_lines)
292 QView._text.insert(END,
"\n")
293 QView._text.insert(END, string)
294 if QView._scroll_text.get():
295 QView._text.yview_moveto(1)
301 QView._view_canvas.set(view)
315 QView._glb_filter = 0
316 QView._loc_filter = QSpy._LOC_FLT_MASK_ALL
317 QView._locAO_OBJ.set(
"")
318 for i
in range(len(QView._currObj)):
319 QView._currObj[i].set(
"")
326 def _update_glb_filter_menu(label, mask):
327 x = (QView._glb_filter & mask)
334 QView._menu_glb_filter.entryconfig(label,
338 def _update_loc_filter_menu(label, mask):
339 x = (QView._loc_filter & mask)
346 QView._menu_loc_filter.entryconfig(label,
349 for i
in range(len(QView._currObj)):
350 QView._menu_curr_obj.entryconfig(i,
351 accelerator=QView._currObj[i].get())
352 QView._menu_events.entryconfig(0,
353 accelerator=QView._currObj[OBJ_AO].get())
354 QView._menu_events.entryconfig(1,
355 accelerator=QView._currObj[OBJ_AO].get())
356 QView._menu_events.entryconfig(2,
357 accelerator=QView._currObj[OBJ_SM].get())
358 QView._menu_events.entryconfig(3,
359 accelerator=QView._currObj[OBJ_SM].get())
360 QView._menu_commands.entryconfig(6,
361 accelerator=QView._currObj[OBJ_AP].get())
362 QView._menu_commands.entryconfig(7,
363 accelerator=QView._currObj[OBJ_AP].get())
367 if QView._currObj[OBJ_SM].get() ==
"":
368 state_SM =
"disabled"
369 if QView._currObj[OBJ_AO].get() ==
"":
370 state_AO =
"disabled"
371 if QView._currObj[OBJ_AP].get() ==
"":
373 QView._menu_events.entryconfig(0, state=state_AO)
374 QView._menu_events.entryconfig(1, state=state_AO)
375 QView._menu_events.entryconfig(2, state=state_SM)
376 QView._menu_events.entryconfig(3, state=state_SM)
377 QView._menu_commands.entryconfig(6, state=state_AP)
378 QView._menu_commands.entryconfig(7, state=state_AP)
380 _update_glb_filter_menu(
"SM Group...", QSpy._GLB_FLT_MASK_SM)
381 _update_glb_filter_menu(
"AO Group...", QSpy._GLB_FLT_MASK_AO)
382 _update_glb_filter_menu(
"QF Group...", QSpy._GLB_FLT_MASK_QF)
383 _update_glb_filter_menu(
"TE Group...", QSpy._GLB_FLT_MASK_TE)
384 _update_glb_filter_menu(
"MP Group...", QSpy._GLB_FLT_MASK_MP)
385 _update_glb_filter_menu(
"EQ Group...", QSpy._GLB_FLT_MASK_EQ)
386 _update_glb_filter_menu(
"SC Group...", QSpy._GLB_FLT_MASK_SC)
387 _update_glb_filter_menu(
"U0 Group...", QSpy._GLB_FLT_MASK_U0)
388 _update_glb_filter_menu(
"U1 Group...", QSpy._GLB_FLT_MASK_U1)
389 _update_glb_filter_menu(
"U2 Group...", QSpy._GLB_FLT_MASK_U2)
390 _update_glb_filter_menu(
"U3 Group...", QSpy._GLB_FLT_MASK_U3)
391 _update_glb_filter_menu(
"U4 Group...", QSpy._GLB_FLT_MASK_U4)
393 _update_loc_filter_menu(
"AO IDs...", QSpy._LOC_FLT_MASK_AO)
394 _update_loc_filter_menu(
"EP IDs...", QSpy._LOC_FLT_MASK_EP)
395 _update_loc_filter_menu(
"EQ IDs...", QSpy._LOC_FLT_MASK_EQ)
396 _update_loc_filter_menu(
"AP IDs...", QSpy._LOC_FLT_MASK_AP)
397 QView._menu_loc_filter.entryconfig(
"AO-OBJ...",
398 accelerator=QView._locAO_OBJ.get())
402 def _trap_error(*args):
403 QView._showerror(
"Runtime Error",
404 traceback.format_exc(3))
408 def _assert(cond, message):
410 QView._showerror(
"Assertion",
415 def _onSaveDict(*args):
416 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_SAVE_DICT))
419 def _onSaveText(*args):
420 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_SCREEN_OUT))
423 def _onSaveBin(*args):
424 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_BIN_OUT))
427 def _onSaveMatlab(*args):
428 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_MATLAB_OUT))
431 def _onSaveSequence(*args):
432 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_SEQUENCE_OUT))
435 def _onCanvasView(*args):
436 if QView._view_canvas.get():
437 QView._canvas_toplevel.state(
"normal")
439 QView._canvas_toplevel.attributes(
"-topmost", 1)
440 QView._canvas_toplevel.attributes(
"-topmost", 0)
442 QView._canvas_toplevel.withdraw()
445 def _onCanvasClose():
446 QView._view_canvas.set(0)
447 QView._canvas_toplevel.withdraw()
450 def _onGlbFilter_SM(*args):
451 QView._GlbFilterDialog(
"SM Group", QSpy._GLB_FLT_MASK_SM)
454 def _onGlbFilter_AO(*args):
455 QView._GlbFilterDialog(
"AO Group", QSpy._GLB_FLT_MASK_AO)
458 def _onGlbFilter_QF(*args):
459 QView._GlbFilterDialog(
"QF Group", QSpy._GLB_FLT_MASK_QF)
462 def _onGlbFilter_TE(*args):
463 QView._GlbFilterDialog(
"TE Group", QSpy._GLB_FLT_MASK_TE)
466 def _onGlbFilter_EQ(*args):
467 QView._GlbFilterDialog(
"EQ Group", QSpy._GLB_FLT_MASK_EQ)
470 def _onGlbFilter_MP(*args):
471 QView._GlbFilterDialog(
"MP Group", QSpy._GLB_FLT_MASK_MP)
474 def _onGlbFilter_SC(*args):
475 QView._GlbFilterDialog(
"SC Group", QSpy._GLB_FLT_MASK_SC)
478 def _onGlbFilter_U0(*args):
479 QView._GlbFilterDialog(
"U0 Group", QSpy._GLB_FLT_MASK_U0)
482 def _onGlbFilter_U1(*args):
483 QView._GlbFilterDialog(
"U1 Group", QSpy._GLB_FLT_MASK_U1)
486 def _onGlbFilter_U2(*args):
487 QView._GlbFilterDialog(
"U2 Group", QSpy._GLB_FLT_MASK_U2)
490 def _onGlbFilter_U3(*args):
491 QView._GlbFilterDialog(
"U3 Group", QSpy._GLB_FLT_MASK_U3)
494 def _onGlbFilter_U4(*args):
495 QView._GlbFilterDialog(
"U4 Group", QSpy._GLB_FLT_MASK_U4)
498 def _onLocFilter_AO(*args):
499 QView._LocFilterDialog(
"AO IDs", QSpy._LOC_FLT_MASK_AO)
502 def _onLocFilter_EP(*args):
503 QView._LocFilterDialog(
"EP IDs", QSpy._LOC_FLT_MASK_EP)
506 def _onLocFilter_EQ(*args):
507 QView._LocFilterDialog(
"EQ IDs", QSpy._LOC_FLT_MASK_EQ)
510 def _onLocFilter_AP(*args):
511 QView._LocFilterDialog(
"AP IDs", QSpy._LOC_FLT_MASK_AP)
514 def _onLocFilter_AO_OBJ(*args):
518 def _onCurrObj_SM(*args):
519 QView._CurrObjDialog(OBJ_SM,
"SM_OBJ")
523 def _onCurrObj_AO(*args):
524 QView._CurrObjDialog(OBJ_AO,
"AO_OBJ")
528 def _onCurrObj_MP(*args):
529 QView._CurrObjDialog(OBJ_MP,
"MP_OBJ")
532 def _onCurrObj_EQ(*args):
533 QView._CurrObjDialog(OBJ_EQ,
"EQ_OBJ")
536 def _onCurrObj_TE(*args):
537 QView._CurrObjDialog(OBJ_TE,
"TE_OBJ")
540 def _onCurrObj_AP(*args):
541 QView._CurrObjDialog(OBJ_AP,
"AP_OBJ")
545 def _onQueryCurr_SM(*args):
549 def _onQueryCurr_AO(*args):
553 def _onQueryCurr_MP(*args):
557 def _onQueryCurr_EQ(*args):
561 def _onQueryCurr_TE(*args):
565 def _onQueryCurr_AP(*args):
569 def _onTargetInfo(*args):
570 QSpy._sendTo(
pack(
"<B", QSpy._TRGT_INFO))
581 def _onEvt_PUBLISH(*args):
582 QView._EvtDialog(
"Publish Event", publish)
585 def _onEvt_POST(*args):
586 QView._EvtDialog(
"Post Event", post)
589 def _onEvt_INIT(*args):
590 QView._EvtDialog(
"Init Event", init)
593 def _onEvt_DISPATCH(*args):
594 QView._EvtDialog(
"Dispatch Event", dispatch)
598 webbrowser.open(
"https://www.state-machine.com/qtools/qview.html",
603 QView._MessageDialog(
"About QView",
605 "%d.%d.%d"%(QView.VERSION//100, \
606 (QView.VERSION//10) % 10, \
607 QView.VERSION % 10) + \
608 "\n\nFor more information see:\n"
609 "https://www.state-machine.com/qtools/qview.html")
612 def _showerror(title, message):
613 QView._gui.after_cancel(QSpy._after_id)
614 QView._MessageDialog(title, message)
617 def _strVar_value(strVar, base=0):
618 str = strVar.get().replace(
" ",
"")
621 value = int(str, base=base)
630 class _AttachDialog(Dialog):
632 QView._attach_dialog = self
633 super().__init__(QView._gui,
"Attach to QSpy")
635 def body(self, master):
636 self.resizable(height=
False, width=
False)
638 text=
"Make sure that QSPY back-end is running and\n"
639 "not already used by other front-end.\n\n"
640 "Press Attach to re-try to attach or\n"
641 "Close to quit.").
pack()
645 w = Button(box, text=
"Attach", width=10, command=self.ok,
647 w.pack(side=LEFT, padx=5, pady=5)
648 w = Button(box, text=
"Close", width=10, command=self.cancel)
649 w.pack(side=LEFT, padx=5, pady=5)
650 self.bind(
"<Return>", self.ok)
651 self.bind(
"<Escape>", self.cancel)
656 QView._attach_dialog =
None
663 QView._attach_dialog =
None
665 def cancel(self, event=None):
672 class _MessageDialog(Dialog):
673 def __init__(self, title, message):
674 self.message = message
675 super().__init__(QView._gui, title)
677 def body(self, master):
678 self.resizable(height=
False, width=
False)
679 Label(master, text=self.message, justify=LEFT).
pack()
683 Button(box, text=
"OK", width=10, command=self.ok,
684 default=ACTIVE).
pack(side=LEFT, padx=5, pady=5)
685 self.bind(
"<Return>", self.ok)
689 class _GlbFilterDialog(Dialog):
690 def __init__(self, title, mask):
693 super().__init__(QView._gui, title)
695 def body(self, master):
697 Button(master, text=
"Select ALL", command=self._sel_all)\
698 .grid(row=0,column=0, padx=2, pady=2, sticky=W+E)
699 Button(master, text=
"Clear ALL", command=self._clr_all)\
700 .grid(row=0,column=N_ROW-1, padx=2, pady=2, sticky=W+E)
702 self._filter_var = []
703 for i
in range(QSpy._GLB_FLT_RANGE):
704 if self._mask & (1 << i) != 0:
705 self._filter_var.append(IntVar())
706 if QView._glb_filter & (1 << i):
707 self._filter_var[n].set(1)
708 Checkbutton(master, text=QSpy._QS[i], anchor=W,
709 variable=self._filter_var[n])\
710 .grid(row=(n + N_ROW)//N_ROW,column=(n+N_ROW)%N_ROW,
711 padx=2,pady=2,sticky=W)
716 for i
in range(QSpy._GLB_FLT_RANGE):
717 if self._mask & (1 << i) != 0:
718 self._filter_var[n].set(1)
723 for i
in range(QSpy._GLB_FLT_RANGE):
724 if self._mask & (1 << i) != 0:
725 self._filter_var[n].set(0)
730 for i
in range(QSpy._GLB_FLT_RANGE):
731 if self._mask & (1 << i) != 0:
732 if self._filter_var[n].get():
733 QView._glb_filter |= (1 << i)
735 QView._glb_filter &= ~(1 << i)
737 QSpy._sendTo(
pack(
"<BBQQ", QSpy._TRGT_GLB_FILTER, 16,
738 QView._glb_filter & 0xFFFFFFFFFFFFFFFF,
739 QView._glb_filter >> 64))
743 class _LocFilterDialog(Dialog):
744 def __init__(self, title, mask):
747 super().__init__(QView._gui, title)
749 def body(self, master):
751 Button(master, text=
"Select ALL", command=self._sel_all)\
752 .grid(row=0,column=0, padx=2, pady=2, sticky=W+E)
753 Button(master, text=
"Clear ALL", command=self._clr_all)\
754 .grid(row=0,column=N_ROW-1, padx=2, pady=2, sticky=W+E)
756 self._filter_var = []
757 if self._mask == QSpy._LOC_FLT_MASK_AO:
761 for i
in range(QSpy._LOC_FLT_RANGE):
762 if self._mask & (1 << i) != 0:
763 self._filter_var.append(IntVar())
764 if QView._loc_filter & (1 << i):
765 self._filter_var[n].set(1)
766 Checkbutton(master, text=QS_id%(i), anchor=W,
767 variable=self._filter_var[n])\
768 .grid(row=(n + N_ROW)//N_ROW,column=(n+N_ROW)%N_ROW,
769 padx=2,pady=2,sticky=W)
774 for i
in range(QSpy._LOC_FLT_RANGE):
775 if self._mask & (1 << i) != 0:
776 self._filter_var[n].set(1)
781 for i
in range(QSpy._LOC_FLT_RANGE):
782 if self._mask & (1 << i) != 0:
783 self._filter_var[n].set(0)
788 for i
in range(QSpy._LOC_FLT_RANGE):
789 if self._mask & (1 << i) != 0:
790 if self._filter_var[n].get():
791 QView._loc_filter |= (1 << i)
793 QView._loc_filter &= ~(1 << i)
795 QSpy._sendTo(
pack(
"<BBQQ", QSpy._TRGT_LOC_FILTER, 16,
796 QView._loc_filter & 0xFFFFFFFFFFFFFFFF,
797 QView._loc_filter >> 64))
804 super().
__init__(QView._gui,
"Local AO-OBJ Filter")
807 Label(master, text=
"AO-OBJ").grid(row=0,column=0,
809 Entry(master, relief=SUNKEN, width=25,
810 textvariable=QView._locAO_OBJ).grid(row=0,column=1)
813 self.
_obj_obj = QView._strVar_value(QView._locAO_OBJ)
820 class _CurrObjDialog(Dialog):
821 def __init__(self, obj_kind, label):
822 self._obj_kind = obj_kind
824 super().
__init__(QView._gui,
"Current Object")
826 def body(self, master):
827 Label(master, text=self._label).grid(row=0,column=0,
829 Entry(master, relief=SUNKEN, width=25,
830 textvariable=QView._currObj[self._obj_kind])\
831 .grid(row=0,column=1)
834 self.
_obj_obj = QView._strVar_value(QView._currObj[self._obj_kind])
835 if self.
_obj_obj ==
"":
843 class _CommandDialog(Dialog):
845 super().
__init__(QView._gui,
"Command")
846 def body(self, master):
847 Label(master, text=
"command").grid(row=0,column=0,sticky=E,padx=2)
848 Entry(master, relief=SUNKEN, width=25,
849 textvariable=QView._command).grid(row=0,column=1,pady=2)
850 Label(master, text=
"param1").grid(row=1,column=0,sticky=E,padx=2)
851 Entry(master, relief=SUNKEN, width=25,
852 textvariable=QView._command_p1).grid(row=1,column=1,padx=2)
853 Label(master, text=
"param2").grid(row=2,column=0,sticky=E,padx=2)
854 Entry(master, relief=SUNKEN, width=25,
855 textvariable=QView._command_p2).grid(row=2,column=1,padx=2)
856 Label(master, text=
"param3").grid(row=3,column=0,sticky=E,padx=2)
857 Entry(master, relief=SUNKEN, width=25,
858 textvariable=QView._command_p3).grid(row=3,column=1,padx=2)
861 self._cmdId = QView._strVar_value(QView._command)
862 if self._cmdId ==
"":
863 QView._MessageDialog(
"Command Error",
"empty command")
865 self._param1 = QView._strVar_value(QView._command_p1)
866 if self._param1 ==
"":
868 elif not isinstance(self._param1, int):
869 QView._MessageDialog(
"Command Error",
"param1 not integer")
871 self._param2 = QView._strVar_value(QView._command_p2)
872 if self._param2 ==
"":
874 elif not isinstance(self._param2, int):
875 QView._MessageDialog(
"Command Error",
"param2 not integer")
877 self._param3 = QView._strVar_value(QView._command_p3)
878 if self._param3 ==
"":
880 elif not isinstance(self._param3, int):
881 QView._MessageDialog(
"Command Error",
"param3 not integer")
886 command(self._cmdId, self._param1, self._param2, self._param3)
889 class _PeekDialog(Dialog):
891 super().
__init__(QView._gui,
"Peek")
893 def body(self, master):
894 Label(master, text=
"obj/addr").grid(row=0,column=0,
896 Label(master, text=QView._currObj[OBJ_AP].get(),anchor=W,
897 relief=SUNKEN).grid(row=0,column=1, columnspan=2,sticky=E+W)
898 Label(master, text=
"offset").grid(row=1,column=0,sticky=E,padx=2)
899 Entry(master, relief=SUNKEN, width=25,
900 textvariable=QView._peek_offs).grid(row=1,column=1,
902 Label(master, text=
"n-units").grid(row=2,column=0,
904 Entry(master, relief=SUNKEN, width=12,
905 textvariable=QView._peek_len).grid(row=2,column=1,
907 OptionMenu(master, QView._peek_dtype, *QView._dtypes).grid(row=2,
908 column=2,sticky=E,padx=2)
911 if QView._currObj[OBJ_AP].get() ==
"":
912 QView._MessageDialog(
"Peek Error",
"Current AP_OBJ not set")
914 self._offs = QView._strVar_value(QView._peek_offs)
915 if not isinstance(self._offs, int):
917 i = QView._dtypes.index(QView._peek_dtype.get())
918 self._size = QView._dsizes[i]
919 self._len = QView._strVar_value(QView._peek_len)
920 if not isinstance(self._len, int):
925 peek(self._offs, self._size, self._len)
928 class _PokeDialog(Dialog):
930 super().
__init__(QView._gui,
"Poke")
932 def body(self, master):
933 Label(master, text=
"obj/addr").grid(row=0,column=0,sticky=E,padx=2)
934 Label(master, text=QView._currObj[OBJ_AP].get(), anchor=W,
935 relief=SUNKEN).grid(row=0,column=1,sticky=E+W)
936 Label(master, text=
"offset").grid(row=1,column=0,sticky=E,padx=2)
937 Entry(master, relief=SUNKEN, width=25,
938 textvariable=QView._poke_offs).grid(row=1,column=1)
939 OptionMenu(master, QView._poke_dtype,
940 *QView._dtypes).grid(row=2,column=0,sticky=E,padx=2)
941 Entry(master, relief=SUNKEN, width=25,
942 textvariable=QView._poke_data).grid(row=2,column=1)
945 if QView._currObj[OBJ_AP].get() ==
"":
946 QView._MessageDialog(
"Poke Error",
"Current AP_OBJ not set")
948 self._offs = QView._strVar_value(QView._poke_offs)
949 if not isinstance(self._offs, int):
952 self._data = QView._strVar_value(QView._poke_data)
953 if not isinstance(self._data, int):
954 QView._MessageDialog(
"Poke Error",
"data not integer")
956 dtype = QView._poke_dtype.get()
957 self._size = QView._dsizes[QView._dtypes.index(dtype)]
958 if self._size == 1
and self._data > 0xFF:
959 QView._MessageDialog(
"Poke Error",
"8-bit data out of range")
961 if self._size == 2
and self._data > 0xFFFF:
962 QView._MessageDialog(
"Poke Error",
"16-bit data out of range")
964 if self._size == 4
and self._data > 0xFFFFFFFF:
965 QView._MessageDialog(
"Poke Error",
"32-bit data out of range")
970 poke(self._offs, self._size, self._data)
973 class _EvtDialog(Dialog):
975 self._action = action
976 if action == dispatch:
977 self.
_obj_obj = QView._currObj[OBJ_SM].get()
979 self.
_obj_obj = QView._currObj[OBJ_AO].get()
982 def body(self, master):
983 Label(master, text=
"obj/addr").grid(row=0,column=0,
985 Label(master, text=self.
_obj_obj, anchor=W,
986 relief=SUNKEN).grid(row=0,column=1,columnspan=2,sticky=E+W)
987 Frame(master,height=2,borderwidth=1,relief=SUNKEN).grid(row=1,
988 column=0,columnspan=3,sticky=E+W+N+S,pady=4)
989 Label(master, text=
"sig").grid(row=2,column=0,sticky=E,
991 Entry(master, relief=SUNKEN,
992 textvariable=QView._evt_sig).grid(row=2,column=1,
993 columnspan=2,sticky=E+W)
994 for i
in range(len(QView._evt_par)):
995 Label(master, text=
"par%d"%(i+1)).grid(row=3+i,column=0,
997 OptionMenu(master, QView._evt_dtype[i], *QView._dtypes).grid(
998 row=3+i,column=1,sticky=E,padx=2)
999 Entry(master, relief=SUNKEN, width=18,
1000 textvariable=QView._evt_par[i]).grid(row=3+i,column=2,
1004 self._sig = QView._strVar_value(QView._evt_sig)
1006 QView._MessageDialog(
"Event error",
"empty event sig")
1008 self._params = bytearray()
1009 for i
in range(len(QView._evt_par)):
1010 par = QView._strVar_value(QView._evt_par[i])
1013 if not isinstance(par, int):
1014 QView._MessageDialog(
"Event Error: par%d"%(i),
1017 idx = QView._dtypes.index(QView._evt_dtype[i].get())
1018 size = QView._dsizes[idx]
1019 if size == 1
and par > 0xFF:
1020 QView._MessageDialog(
"Event Error: par%d"%(i),
1021 "8-bit data out of range")
1023 if size == 2
and par > 0xFFFF:
1024 QView._MessageDialog(
"Event Error: par%d"%(i),
1025 "16-bit data out of range")
1027 if size == 4
and par > 0xFFFFFFFF:
1028 QView._MessageDialog(
"Event Error: par%d"%(i),
1029 "32-bit data out of range")
1032 fmt = QSpy._fmt_endian + (
"B",
"H",
"I")[idx]
1033 self._params.extend(
pack(fmt, par))
1037 self._action(self._sig, self._params)
1047 _is_attached =
False
1050 _host_addr = [
"localhost", 7701]
1055 _fmt_target =
"UNKNOWN"
1078 "QS_QEP_STATE_ENTRY",
"QS_QEP_STATE_EXIT",
1079 "QS_QEP_STATE_INIT",
"QS_QEP_INIT_TRAN",
1080 "QS_QEP_INTERN_TRAN",
"QS_QEP_TRAN",
1081 "QS_QEP_IGNORED",
"QS_QEP_DISPATCH",
1085 "QS_QF_ACTIVE_DEFER",
"QS_QF_ACTIVE_RECALL",
1086 "QS_QF_ACTIVE_SUBSCRIBE",
"QS_QF_ACTIVE_UNSUBSCRIBE",
1087 "QS_QF_ACTIVE_POST",
"QS_QF_ACTIVE_POST_LIFO",
1088 "QS_QF_ACTIVE_GET",
"QS_QF_ACTIVE_GET_LAST",
1089 "QS_QF_ACTIVE_RECALL_ATTEMPT",
1092 "QS_QF_EQUEUE_POST",
"QS_QF_EQUEUE_POST_LIFO",
1093 "QS_QF_EQUEUE_GET",
"QS_QF_EQUEUE_GET_LAST",
1096 "QS_QF_NEW_ATTEMPT",
1099 "QS_QF_MPOOL_GET",
"QS_QF_MPOOL_PUT",
1102 "QS_QF_PUBLISH",
"QS_QF_NEW_REF",
1103 "QS_QF_NEW",
"QS_QF_GC_ATTEMPT",
1104 "QS_QF_GC",
"QS_QF_TICK",
1107 "QS_QF_TIMEEVT_ARM",
"QS_QF_TIMEEVT_AUTO_DISARM",
1108 "QS_QF_TIMEEVT_DISARM_ATTEMPT",
"QS_QF_TIMEEVT_DISARM",
1109 "QS_QF_TIMEEVT_REARM",
"QS_QF_TIMEEVT_POST",
1112 "QS_QF_DELETE_REF",
"QS_QF_CRIT_ENTRY",
1113 "QS_QF_CRIT_EXIT",
"QS_QF_ISR_ENTRY",
1114 "QS_QF_ISR_EXIT",
"QS_QF_INT_DISABLE",
1118 "QS_QF_ACTIVE_POST_ATTEMPT",
1121 "QS_QF_EQUEUE_POST_ATTEMPT",
1124 "QS_QF_MPOOL_GET_ATTEMPT",
1127 "QS_MUTEX_LOCK",
"QS_MUTEX_UNLOCK",
1128 "QS_SCHED_LOCK",
"QS_SCHED_UNLOCK",
1129 "QS_SCHED_NEXT",
"QS_SCHED_IDLE",
1133 "QS_QEP_TRAN_HIST",
"QS_QEP_TRAN_EP",
1137 "QS_TEST_PAUSED",
"QS_TEST_PROBE_GET",
1138 "QS_SIG_DICT",
"QS_OBJ_DICT",
1139 "QS_FUN_DICT",
"QS_USR_DICT",
1140 "QS_TARGET_INFO",
"QS_TARGET_DONE",
1141 "QS_RX_STATUS",
"QS_QUERY_DATA",
1142 "QS_PEEK_DATA",
"QS_ASSERT_FAIL",
1147 "QS_RESERVED_72",
"QS_RESERVED_73",
1148 "QS_RESERVED_74",
"QS_RESERVED_75",
1149 "QS_RESERVED_76",
"QS_RESERVED_77",
1150 "QS_RESERVED_78",
"QS_RESERVED_79",
1151 "QS_RESERVED_80",
"QS_RESERVED_81",
1152 "QS_RESERVED_82",
"QS_RESERVED_83",
1153 "QS_RESERVED_84",
"QS_RESERVED_85",
1154 "QS_RESERVED_86",
"QS_RESERVED_87",
1155 "QS_RESERVED_88",
"QS_RESERVED_89",
1156 "QS_RESERVED_90",
"QS_RESERVED_91",
1157 "QS_RESERVED_92",
"QS_RESERVED_93",
1158 "QS_RESERVED_94",
"QS_RESERVED_95",
1159 "QS_RESERVED_96",
"QS_RESERVED_97",
1160 "QS_RESERVED_98",
"QS_RESERVED_99",
1163 "QS_USER_00",
"QS_USER_01",
1164 "QS_USER_02",
"QS_USER_03",
1165 "QS_USER_04",
"QS_USER_05",
1166 "QS_USER_06",
"QS_USER_07",
1167 "QS_USER_08",
"QS_USER_09",
1168 "QS_USER_10",
"QS_USER_11",
1169 "QS_USER_12",
"QS_USER_13",
1170 "QS_USER_14",
"QS_USER_15",
1171 "QS_USER_16",
"QS_USER_17",
1172 "QS_USER_18",
"QS_USER_19",
1173 "QS_USER_20",
"QS_USER_21",
1174 "QS_USER_22",
"QS_USER_23",
1178 _GLB_FLT_MASK_ALL= 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
1179 _GLB_FLT_MASK_SM = 0x000000000000000003800000000003FE
1180 _GLB_FLT_MASK_AO = 0x0000000000000000000020000007FC00
1181 _GLB_FLT_MASK_QF = 0x000000000000000000001FC0FC800000
1182 _GLB_FLT_MASK_TE = 0x00000000000000000000003F00000000
1183 _GLB_FLT_MASK_EQ = 0x00000000000000000000400000780000
1184 _GLB_FLT_MASK_MP = 0x00000000000000000000800003000000
1185 _GLB_FLT_MASK_SC = 0x0000000000000000007F000000000000
1186 _GLB_FLT_MASK_U0 = 0x000001F0000000000000000000000000
1187 _GLB_FLT_MASK_U1 = 0x00003E00000000000000000000000000
1188 _GLB_FLT_MASK_U2 = 0x0007C000000000000000000000000000
1189 _GLB_FLT_MASK_U3 = 0x00F80000000000000000000000000000
1190 _GLB_FLT_MASK_U4 = 0x1F000000000000000000000000000000
1191 _GLB_FLT_MASK_UA = 0x1FFFFFF0000000000000000000000000
1192 _GLB_FLT_RANGE = 125
1195 _LOC_FLT_MASK_ALL= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
1196 _LOC_FLT_MASK_AO = 0x0000000000000001FFFFFFFFFFFFFFFE
1197 _LOC_FLT_MASK_EP = 0x000000000000FFFE0000000000000000
1198 _LOC_FLT_MASK_EQ = 0x00000000FFFF00000000000000000000
1199 _LOC_FLT_MASK_AP = 0xFFFFFFFF000000000000000000000000
1200 _LOC_FLT_RANGE = 128
1204 _PKT_TARGET_INFO = 64
1207 _PKT_ATTACH_CONF = 128
1218 _TRGT_TEST_SETUP = 7
1219 _TRGT_TEST_TEARDOWN = 8
1220 _TRGT_TEST_PROBE = 9
1221 _TRGT_GLB_FILTER = 10
1222 _TRGT_LOC_FILTER = 11
1223 _TRGT_AO_FILTER = 12
1226 _TRGT_QUERY_CURR = 15
1232 _QSPY_SAVE_DICT = 130
1233 _QSPY_SCREEN_OUT = 131
1235 _QSPY_MATLAB_OUT = 133
1236 _QSPY_SEQUENCE_OUT = 134
1239 _QSPY_SEND_EVENT = 135
1240 _QSPY_SEND_AO_FILTER = 136
1241 _QSPY_SEND_CURR_OBJ = 137
1242 _QSPY_SEND_COMMAND = 138
1243 _QSPY_SEND_TEST_PROBE = 139
1254 QSpy._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1255 QSpy._sock.setblocking(0)
1257 QSpy._sock.bind((
"0.0.0.0", QSpy._local_port))
1260 QView._showerror(
"UDP Socket Error",
1261 "Can't bind the UDP socket\n"
1262 "to the specified local_host.\n"
1263 "Check if other instances of qspyview\n"
1264 "or qutest are running...")
1271 QSpy._is_attached =
False
1272 QView._have_info =
False
1273 if QView._echo_text.get():
1277 QSpy._sendTo(
pack(
"<BB", QSpy._QSPY_ATTACH, channels))
1278 QSpy._attach_ctr = 50
1279 QSpy._after_id = QView._gui.after(1, QSpy._poll0)
1283 if QSpy._sock
is None:
1285 QSpy._sendTo(
pack(
"<B", QSpy._QSPY_DETACH))
1294 if QView._echo_text.get():
1298 QSpy._sendTo(
pack(
"<BB", QSpy._QSPY_ATTACH, channels))
1304 QSpy._attach_ctr -= 1
1305 if QSpy._attach_ctr == 0:
1306 if QView._attach_dialog
is None:
1307 QView._AttachDialog()
1311 packet = QSpy._sock.recv(4096)
1313 QView._showerror(
"UDP Socket Error",
1314 "Connection closed by QSpy")
1318 QSpy._after_id = QView._gui.after(QSpy._POLLI, QSpy._poll0)
1321 QView._showerror(
"UDP Socket Error",
1322 "Uknown UDP socket error")
1329 QView._showerror(
"Communication Error",
1330 "UDP packet from QSpy too short")
1335 if recID == QSpy._PKT_ATTACH_CONF:
1336 QSpy._is_attached =
True
1337 if QView._attach_dialog
is not None:
1338 QView._attach_dialog.close()
1342 if QView._reset_request:
1343 QView._reset_request =
False
1344 QSpy._sendTo(
pack(
"<B", QSpy._TRGT_RESET))
1346 QSpy._sendTo(
pack(
"<B", QSpy._TRGT_INFO))
1349 QSpy._after_id = QView._gui.after(QSpy._POLLI, QSpy._poll)
1352 QView._onCanvasView()
1355 elif recID == QSpy._PKT_DETACH:
1365 packet = QSpy._sock.recv(4096)
1367 QView._showerror(
"UDP Socket Error",
1368 "Connection closed by QSpy")
1372 QSpy._after_id = QView._gui.after(QSpy._POLLI, QSpy._poll)
1375 QView._showerror(
"UDP Socket Error",
1376 "Uknown UDP socket error")
1383 QView._showerror(
"UDP Socket Data Error",
1384 "UDP packet from QSpy too short")
1389 if recID == QSpy._PKT_TEXT_ECHO:
1392 QView.print_text(packet[3:])
1394 elif recID == QSpy._PKT_TARGET_INFO:
1396 QView._showerror(
"UDP Socket Data Error",
1397 "Corrupted Target-info")
1401 if packet[4] & 0x80 != 0:
1402 QSpy._fmt_endian =
">"
1404 tstamp = packet[5:18]
1405 QSpy._size_objPtr = tstamp[3] & 0x0F
1406 QSpy._size_funPtr = tstamp[3] >> 4
1407 QSpy._size_tstamp = tstamp[4] & 0x0F
1408 QSpy._size_sig = tstamp[0] & 0x0F
1409 QSpy._size_evtSize = tstamp[0] >> 4
1410 QSpy._size_queueCtr= tstamp[1] & 0x0F
1411 QSpy._size_poolCtr = tstamp[2] >> 4
1412 QSpy._size_poolBlk = tstamp[2] & 0x0F
1413 QSpy._size_tevtCtr = tstamp[1] >> 4
1414 QSpy._fmt_target =
"%02d%02d%02d_%02d%02d%02d"\
1415 %(tstamp[12], tstamp[11], tstamp[10],
1416 tstamp[9], tstamp[8], tstamp[7])
1418 QView._target.configure(text=
"Target: " + QSpy._fmt_target)
1419 QView._have_info =
True
1424 handler = getattr(QView._cust,
1426 if handler
is not None:
1430 QView._showerror(
"Runtime Error",
1431 traceback.format_exc(3))
1435 elif recID == QSpy._PKT_QF_RUN:
1436 handler = getattr(QView._cust,
1438 if handler
is not None:
1442 QView._showerror(
"Runtime Error",
1443 traceback.format_exc(3))
1447 elif recID == QSpy._PKT_DETACH:
1453 handler = getattr(QView._cust,
1454 QSpy._QS[recID],
None)
1455 if handler
is not None:
1459 QView._showerror(
"Runtime Error",
1460 traceback.format_exc(3))
1464 QView._rx.configure(text=
"%d"%(QSpy._rx_seq))
1468 def _sendTo(packet, str=None):
1469 tx_packet = bytearray([QSpy._tx_seq & 0xFF])
1470 tx_packet.extend(packet)
1472 tx_packet.extend(bytes(str,
"utf-8"))
1473 tx_packet.extend(b
"\0")
1475 QSpy._sock.sendto(tx_packet, QSpy._host_addr)
1477 QView._showerror(
"UDP Socket Error",
1478 traceback.format_exc(3))
1481 if not QView._gui
is None:
1482 QView._tx.configure(text=
"%d"%(QSpy._tx_seq))
1485 def _sendEvt(ao_prio, signal, params = None):
1487 fmt =
"<BB" + QSpy._fmt[QSpy._size_sig] +
"H"
1488 if params
is not None:
1489 length = len(params)
1493 if isinstance(signal, int):
1494 packet = bytearray(
pack(
1495 fmt, QSpy._TRGT_EVENT, ao_prio, signal, length))
1496 if params
is not None:
1497 packet.extend(params)
1498 QSpy._sendTo(packet)
1500 packet = bytearray(
pack(
1501 fmt, QSpy._QSPY_SEND_EVENT, ao_prio, 0, length))
1502 if params
is not None:
1503 packet.extend(params)
1504 QSpy._sendTo(packet, signal)
1539 IDS_EP = (0x80 + 64)
1540 IDS_EQ = (0x80 + 80)
1541 IDS_AP = (0x80 + 96)
1547 if QView._have_info:
1548 QSpy._sendTo(
pack(
"<B", QSpy._TRGT_RESET))
1550 QView._reset_request =
True
1554 def command(cmdId, param1 = 0, param2 = 0, param3 = 0):
1555 if isinstance(cmdId, int):
1556 QSpy._sendTo(
pack(
"<BBIII", QSpy._TRGT_COMMAND,
1557 cmdId, param1, param2, param3))
1559 QSpy._sendTo(
pack(
"<BBIII", QSpy._QSPY_SEND_COMMAND,
1560 0, param1, param2, param3),
1566 QSpy._sendTo(
pack(
"<BB", QSpy._TRGT_TICK, tick_rate))
1571 QSpy._sendTo(
pack(
"<BHBB", QSpy._TRGT_PEEK, offset, size, num))
1576 fmt =
"<BHBB" + (
"x",
"B",
"H",
"x",
"I")[size]
1577 QSpy._sendTo(
pack(fmt, QSpy._TRGT_POKE, offset, size, 1, data))
1583 def _apply(mask, is_neg):
1585 QView._glb_filter &= ~mask
1587 QView._glb_filter |= mask
1589 QView._glb_filter = 0
1594 if isinstance(arg, str):
1595 is_neg = (arg[0] ==
'-')
1599 arg = QSpy._QS.index(arg)
1601 QView._MessageDialog(
"Error in glb_filter()",
1602 'arg="' + arg +
'"\n' +
1603 traceback.format_exc(3))
1611 _apply(1 << arg, is_neg)
1613 _apply(QSpy._GLB_FLT_MASK_ALL, is_neg)
1615 _apply(QSpy._GLB_FLT_MASK_SM, is_neg)
1617 _apply(QSpy._GLB_FLT_MASK_AO, is_neg)
1619 _apply(QSpy._GLB_FLT_MASK_QF, is_neg)
1621 _apply(QSpy._GLB_FLT_MASK_TE, is_neg)
1623 _apply(QSpy._GLB_FLT_MASK_EQ, is_neg)
1625 _apply(QSpy._GLB_FLT_MASK_MP, is_neg)
1627 _apply(QSpy._GLB_FLT_MASK_U0, is_neg)
1629 _apply(QSpy._GLB_FLT_MASK_U1, is_neg)
1631 _apply(QSpy._GLB_FLT_MASK_U2, is_neg)
1633 _apply(QSpy._GLB_FLT_MASK_U3, is_neg)
1635 _apply(QSpy._GLB_FLT_MASK_U4, is_neg)
1637 _apply(QSpy._GLB_FLT_MASK_UA, is_neg)
1639 assert 0,
"invalid global filter arg=0x%X"%(arg)
1641 QSpy._sendTo(
pack(
"<BBQQ", QSpy._TRGT_GLB_FILTER, 16,
1642 QView._glb_filter & 0xFFFFFFFFFFFFFFFF,
1643 QView._glb_filter >> 64))
1644 QView._updateMenus()
1650 def _apply(mask, is_neg):
1652 QView._loc_filter &= ~mask
1654 QView._loc_filter |= mask
1664 _apply(1 << arg, is_neg)
1665 elif arg == IDS_ALL:
1666 _apply(QSpy._LOC_FLT_MASK_ALL, is_neg)
1668 _apply(QSpy._LOC_FLT_MASK_AO, is_neg)
1670 _apply(QSpy._LOC_FLT_MASK_EP, is_neg)
1672 _apply(QSpy._LOC_FLT_MASK_EQ, is_neg)
1674 _apply(QSpy._LOC_FLT_MASK_AP, is_neg)
1676 assert 0,
"invalid local filter arg=0x%X"%(arg)
1678 QSpy._sendTo(
pack(
"<BBQQ", QSpy._TRGT_LOC_FILTER, 16,
1679 QView._loc_filter & 0xFFFFFFFFFFFFFFFF,
1680 QView._loc_filter >> 64))
1688 QView._locAO_OBJ.set(obj_id)
1689 QView._menu_loc_filter.entryconfig(
"AO-OBJ...",
1690 accelerator=QView._locAO_OBJ.get())
1691 if isinstance(obj_id, str):
1692 if obj_id[0:1] ==
'-':
1695 QSpy._sendTo(
pack(
"<BB" + QSpy._fmt[QSpy._size_objPtr],
1696 QSpy._QSPY_SEND_AO_FILTER, remove, 0),
1702 QSpy._sendTo(
pack(
"<BB" + QSpy._fmt[QSpy._size_objPtr],
1703 QSpy._TRGT_AO_FILTER, remove, obj_id))
1710 if isinstance(obj_id, int):
1711 QSpy._sendTo(
pack(
"<BB" + QSpy._fmt[QSpy._size_objPtr],
1712 QSpy._TRGT_CURR_OBJ, obj_kind, obj_id))
1713 obj_id =
"0x%08X"%(obj_id)
1715 QSpy._sendTo(
pack(
"<BB" + QSpy._fmt[QSpy._size_objPtr],
1716 QSpy._QSPY_SEND_CURR_OBJ, obj_kind, 0), obj_id)
1718 QView._currObj[obj_kind].set(obj_id)
1719 QView._menu_curr_obj.entryconfig(obj_kind, accelerator=obj_id)
1720 QView._updateMenus()
1725 QSpy._sendTo(
pack(
"<BB", QSpy._TRGT_QUERY_CURR, obj_kind))
1730 QSpy._sendEvt(QSpy._EVT_PUBLISH, signal, params)
1735 QSpy._sendEvt(QSpy._EVT_POST, signal, params)
1740 def init(signal = 0, params = None):
1741 QSpy._sendEvt(QSpy._EVT_INIT, signal, params)
1746 QSpy._sendEvt(QSpy._EVT_DISPATCH, signal, params)
1782 if fmt[0:1]
in (
"@",
"=",
"<",
">",
"!"):
1790 if fmt1
in (
"B",
"b",
"c",
"x",
"?"):
1791 u = struct.unpack_from(bord + fmt1, bstr, offset)
1793 elif fmt1
in (
"H",
"h"):
1794 u = struct.unpack_from(bord + fmt1, bstr, offset)
1796 elif fmt1
in (
"I",
"L",
"i",
"l",
"f"):
1797 u = struct.unpack_from(bord + fmt1, bstr, offset)
1799 elif fmt1
in (
"Q",
"q",
"d"):
1800 u = struct.unpack_from(bord + fmt1, bstr, offset)
1803 u = struct.unpack_from(bord + QSpy._fmt[QSpy._size_tstamp],
1805 offset += QSpy._size_tstamp
1807 u = struct.unpack_from(bord + QSpy._fmt[QSpy._size_objPtr],
1809 offset += QSpy._size_objPtr
1811 u = struct.unpack_from(bord + QSpy._fmt[QSpy._size_funPtr],
1813 offset += QSpy._size_funPtr
1815 u = struct.unpack_from(bord + QSpy._fmt[QSpy._size_sig],
1817 offset += QSpy._size_sig
1822 u = (bstr[offset:end].decode(),)
1825 assert 0,
"qunpack(): unknown format"
1838 if "-h" in argv
or "--help" in argv
or "?" in argv:
1839 print(
"\nUsage: python qview.pyw [custom-script] "
1840 "[qspy_host[:udp_port]] [local_port]\n\n"
1841 "help at: https://www.state-machine.com/qtools/QView.html")
1847 if argv[arg].endswith(
".py")
or argv[arg].endswith(
".pyw"):
1852 host_port = argv[arg].split(
":")
1854 if len(host_port) > 0:
1855 QSpy._host_addr[0] = host_port[0]
1856 if len(host_port) > 1:
1857 QSpy._host_addr[1] = int(host_port[1])
1860 QSpy._local_port = int(argv[arg])
1862 QSpy._host_addr = tuple(QSpy._host_addr)
1867 QView._gui.title(
"QView " + \
1868 "%d.%d.%d"%(QView.VERSION//100, \
1869 (QView.VERSION//10) % 10, \
1870 QView.VERSION % 10) +
" -- " + script)
1871 QView._init_gui(QView._gui)
1878 HOME_DIR = os.path.dirname(os.path.realpath(script))
1880 with open(script)
as f:
1881 code = compile(f.read(), script,
"exec")
1887 QView._MessageDialog(
"Error in " + script,
1888 traceback.format_exc(3))
1896 QView._gui.mainloop()
1900 sys.exit(QView._err)
1903 if __name__ ==
"__main__":
Helper class for UDP-communication with the QSpy front-end (non-blocking UDP-socket version for QView...
def print_text(string)
Print a string to the Text area.
def show_canvas(view=1)
Make the canvas visible (to be used in the constructor of the customization class)
def customize(cust)
Set QView customization.
def pack(format, v1, v2)
packs data into binary string to be sent to QSPY.
def post(signal, params=None)
post a given event to the current AO object in the Target
def reset_target(*args)
Send the RESET packet to the Target.
def current_obj(obj_kind, obj_id)
Set the Current-Object in the Target.
def tick(tick_rate=0)
trigger system clock tick in the Target
def peek(offset, size, num)
peeks data in the Target
def loc_filter(*args)
Set/clear the Local-Filter in the Target.
def init(signal=0, params=None)
take the top-most initial transition in the current SM object in the Target
def qunpack(fmt, bstr)
Unpack a QS trace record.
def command(cmdId, param1=0, param2=0, param3=0)
executes a given command in the Target
def ao_filter(obj_id)
Set/clear the Active-Object Local-Filter in the Target.
def publish(signal, params=None)
publish a given event to subscribers in the Target
def glb_filter(*args)
Set/clear the Global-Filter in the Target.
def poke(offset, size, data)
pokes data into the Target
def dispatch(signal, params=None)
dispatch a given event in the current SM object in the Target
def query_curr(obj_kind)
query the current object in the Target