summaryrefslogtreecommitdiff
path: root/lib/simulator/uart_monitor.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/simulator/uart_monitor.tcl')
-rw-r--r--lib/simulator/uart_monitor.tcl886
1 files changed, 886 insertions, 0 deletions
diff --git a/lib/simulator/uart_monitor.tcl b/lib/simulator/uart_monitor.tcl
new file mode 100644
index 0000000..28d3b48
--- /dev/null
+++ b/lib/simulator/uart_monitor.tcl
@@ -0,0 +1,886 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _UART_MONITOR_TCL ] } {
+set _UART_MONITOR_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# UART monitor
+# -------------------------------------------------------------------------
+
+class UARTMonitor {
+
+ common geometry ${::CONFIG(UART_MON_GEOMETRY)} ;# Last window geometry
+ common uart_mon_count 0 ;# Counter of intances
+
+ # Font: Tiny normal font
+ common tiny_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font: Big bold font
+ common big_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+ # Font: Normal font
+ common normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font:
+ common normal_fixed_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font:
+ common bold_fixed_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+
+ common rect_size 12
+ common empty_fill {#888888}
+ common empty_outline {#AAAAAA}
+
+ common MAX_G_LOG_LENGTH 100 ;# Int:
+ common MAX_D_LOG_LENGTH 100 ;# Int:
+
+ private variable dialog_opened 0 ;# Bool: Dialog window opened
+ private variable win ;# Widget: Dialog window
+
+ private variable status_bar 1
+ private variable rxd_frame
+ private variable txd_frame
+
+ private variable general_log
+ private variable general_log_length
+ private variable data_transfer_log
+ private variable data_transfer_log_length
+ private variable canvas
+ private variable bit_rect
+ private variable uart_value_label
+ private variable shift_reg
+ private variable shift_reg_bits_written
+ private variable bit
+
+ private variable graph_position
+ private variable graph_prev_states
+ private variable graph_elements
+
+ constructor {} {
+ array set data_transfer_log_length {
+ r 0 t 0
+ }
+ array set general_log_length {
+ r 0 t 0
+ }
+ array set shift_reg {
+ r 0 t 0
+ }
+ array set shift_reg_bits_written {
+ r 0 t 0
+ }
+ array set graph_position {
+ r 0 t 0
+ }
+ array set graph_prev_states {
+ t 1 r 1
+ }
+ array set graph_elements {
+ t {} r {}
+ }
+ array set bit {
+ fe 0 sm0 0
+ sm1 0 sm2 0
+ ren 0 ti 0
+ ri 0 smod1 0
+ tclk 0 rclk 0
+ }
+ }
+
+ destructor {
+ uart_monitor_close
+ }
+
+ ## Invoke interrupt monitor window
+ # @return void
+ public method uart_monitor_invoke_dialog {} {
+ set win [toplevel .uartmonitor${uart_mon_count}]
+ incr uart_mon_count
+
+ set main_frame [frame $win.main_frame]
+ set status_bar [label $win.status_bar]
+
+ # --------------------------------------------------------------
+ # RECEIVER PART
+ # --------------------------------------------------------------
+ grid [label $main_frame.r_header_lbl \
+ -font $big_font \
+ -text [mc "RxD line"] \
+ ] -row 0 -column 1 -sticky w -padx 0 -columnspan 2 -sticky we
+ # Mode:
+ grid [label $main_frame.r_mode_lbl \
+ -text [mc "Mode:"] \
+ ] -row 1 -column 1 -sticky w -padx 5
+ set uart_value_label(r_mode) [label $main_frame.r_mode_v_lbl]
+ grid $uart_value_label(r_mode) -row 1 -column 2 -sticky w -padx 5
+ # Line function:
+ grid [label $main_frame.r_lf_lbl \
+ -text [mc "Line function:"] \
+ ] -row 2 -column 1 -sticky w -padx 5
+ set uart_value_label(r_lf) [label $main_frame.r_lf_v_lbl]
+ grid $uart_value_label(r_lf) -row 2 -column 2 -sticky w -padx 5
+ # BR Generator:
+ grid [label $main_frame.r_brg_lbl \
+ -text [mc "BR Generator:"] \
+ ] -row 3 -column 1 -sticky w -padx 5
+ set uart_value_label(r_brg) [label $main_frame.r_brg_v_lbl]
+ grid $uart_value_label(r_brg) -row 3 -column 2 -sticky w -padx 5
+ # BRG prescaler:
+ grid [label $main_frame.r_brgp_lbl \
+ -text [mc "BRG prescaler:"] \
+ ] -row 4 -column 1 -sticky w -padx 5
+ set uart_value_label(r_brgp) [label $main_frame.r_brgp_v_lbl]
+ grid $uart_value_label(r_brgp) -row 4 -column 2 -sticky w -padx 5
+ # Resulting bdps:
+ grid [label $main_frame.r_rbdps_lbl \
+ -text [mc "Resulting bdps:"] \
+ ] -row 5 -column 1 -sticky w -padx 5
+ set uart_value_label(r_rbdps) [label $main_frame.r_rbdps_v_lbl]
+ grid $uart_value_label(r_rbdps) -row 5 -column 2 -sticky w -padx 5
+ # State:
+ grid [label $main_frame.r_state_lbl \
+ -text [mc "State:"] \
+ ] -row 6 -column 1 -sticky w -padx 5
+ set uart_value_label(r_state) [label $main_frame.r_state_v_lbl]
+ grid $uart_value_label(r_state) -row 6 -column 2 -sticky w -padx 5
+
+ set canvas(r) [canvas $main_frame.r_canvas \
+ -width 240 \
+ -height 175 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ ]
+ fill_canvas r
+ grid $canvas(r) -row 8 -column 1 -columnspan 2 -sticky we
+
+ set data_transfer_log(r) [text $main_frame.r_data_transfer_log \
+ -height 4 \
+ -width 0 \
+ -bd 0 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ -font $normal_fixed_font \
+ -wrap none \
+ -xscrollcommand [list $main_frame.r_stl_scrollbar set] \
+ ]
+ $data_transfer_log(r) tag configure tag_bold -font $bold_fixed_font
+ $data_transfer_log(r) insert end [mc "HEX \nDEC \nOCT \nASCII "]
+ $data_transfer_log(r) configure -state disabled
+ for {set i 1} {$i <= 4} {incr i} {
+ $data_transfer_log(r) tag add tag_bold $i.0 $i.5
+ }
+ grid $data_transfer_log(r) -row 9 -column 1 -columnspan 2 -sticky we
+ grid [ttk::scrollbar $main_frame.r_stl_scrollbar \
+ -orient horizontal \
+ -command [list $data_transfer_log(r) xview] \
+ ] -row 10 -column 1 -columnspan 2 -sticky we
+
+ set general_log_frame [frame $main_frame.r_general_log_frame]
+ set general_log(r) [text $general_log_frame.general_log \
+ -height 4 \
+ -width 0 \
+ -yscrollcommand [list $general_log_frame.scrollbar set] \
+ -state disabled \
+ ]
+ set general_log_sc_bar [ttk::scrollbar $general_log_frame.scrollbar \
+ -orient vertical \
+ -command [list $general_log(r) yview] \
+ ]
+ pack $general_log_sc_bar -side right -fill y
+ pack $general_log(r) -side left -fill both -expand 1
+ grid $general_log_frame -row 11 -column 1 -columnspan 2 -sticky wens -pady 2
+
+ # --------------------------------------------------------------
+ # TRANSMITTER PART
+ # --------------------------------------------------------------
+ grid [label $main_frame.t_header_lbl \
+ -font $big_font \
+ -text [mc "TxD line"] \
+ ] -row 0 -column 4 -sticky w -padx 0 -columnspan 2 -sticky we
+ # Mode:
+ grid [label $main_frame.t_mode_lbl \
+ -text [mc "Mode:"] \
+ ] -row 1 -column 4 -sticky w -padx 5
+ set uart_value_label(t_mode) [label $main_frame.t_mode_v_lbl]
+ grid $uart_value_label(t_mode) -row 1 -column 5 -sticky w -padx 5
+ # Line function:
+ grid [label $main_frame.t_lf_lbl \
+ -text [mc "Line function:"] \
+ ] -row 2 -column 4 -sticky w -padx 5
+ set uart_value_label(t_lf) [label $main_frame.t_lf_v_lbl]
+ grid $uart_value_label(t_lf) -row 2 -column 5 -sticky w -padx 5
+ # BR Generator:
+ grid [label $main_frame.t_brg_lbl \
+ -text [mc "BR Generator:"] \
+ ] -row 3 -column 4 -sticky w -padx 5
+ set uart_value_label(t_brg) [label $main_frame.t_brg_v_lbl]
+ grid $uart_value_label(t_brg) -row 3 -column 5 -sticky w -padx 5
+ # BRG prescaler:
+ grid [label $main_frame.t_brgp_lbl \
+ -text [mc "BRG prescaler:"] \
+ ] -row 4 -column 4 -sticky w -padx 5
+ set uart_value_label(t_brgp) [label $main_frame.t_brgp_v_lbl]
+ grid $uart_value_label(t_brgp) -row 4 -column 5 -sticky w -padx 5
+ # Resulting bdps:
+ grid [label $main_frame.t_rbdps_lbl \
+ -text [mc "Resulting bdps:"] \
+ ] -row 5 -column 4 -sticky w -padx 5
+ set uart_value_label(t_rbdps) [label $main_frame.t_rbdps_v_lbl]
+ grid $uart_value_label(t_rbdps) -row 5 -column 5 -sticky w -padx 5
+ # State:
+ grid [label $main_frame.t_state_lbl \
+ -text [mc "State:"] \
+ ] -row 6 -column 4 -sticky w -padx 5
+ set uart_value_label(t_state) [label $main_frame.t_state_v_lbl]
+ grid $uart_value_label(t_state) -row 6 -column 5 -sticky w -padx 5
+
+ set canvas(t) [canvas $main_frame.t_canvas \
+ -width 240 \
+ -height 175 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ ]
+ fill_canvas t
+ grid $canvas(t) -row 8 -column 4 -columnspan 2 -sticky nw
+
+ set data_transfer_log(t) [text $main_frame.t_data_transfer_log \
+ -height 4 \
+ -width 0 \
+ -bd 0 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ -font $normal_fixed_font \
+ -wrap none \
+ -xscrollcommand [list $main_frame.t_stl_scrollbar set] \
+ ]
+ $data_transfer_log(t) tag configure tag_bold -font $bold_fixed_font
+ $data_transfer_log(t) insert end [mc "HEX \nDEC \nOCT \nASCII "]
+ $data_transfer_log(t) configure -state disabled
+ for {set i 1} {$i <= 4} {incr i} {
+ $data_transfer_log(t) tag add tag_bold $i.0 $i.5
+ }
+ grid $data_transfer_log(t) -row 9 -column 4 -columnspan 2 -sticky we
+ grid [ttk::scrollbar $main_frame.t_stl_scrollbar \
+ -orient horizontal \
+ -command [list $data_transfer_log(t) xview] \
+ ] -row 10 -column 4 -columnspan 2 -sticky we
+
+ set general_log_frame [frame $main_frame.t_general_log_frame]
+ set general_log(t) [text $general_log_frame.general_log \
+ -height 4 \
+ -width 0 \
+ -yscrollcommand [list $general_log_frame.scrollbar set] \
+ -state disabled \
+ ]
+ set general_log_sc_bar [ttk::scrollbar $general_log_frame.scrollbar \
+ -orient vertical \
+ -command [list $general_log(t) yview] \
+ ]
+ pack $general_log_sc_bar -side right -fill y
+ pack $general_log(t) -side left -fill both -expand 1
+ grid $general_log_frame -row 11 -column 4 -columnspan 2 -sticky wens -pady 2
+
+ grid [ttk::separator $main_frame.sep -orient vertical] -row 0 -column 3 -rowspan 12 -padx 2 -sticky ns
+ pack $main_frame -fill y -padx 2 -pady 2 -anchor nw -expand 1
+
+ # Pack main frame and create bottom frame
+ pack $main_frame -fill both -expand 1
+ pack [ttk::separator $win.sep -orient horizontal] \
+ -fill x -pady 1
+ pack $status_bar -side left -fill x -padx 5
+ pack [ttk::button $win.close_but \
+ -text [mc "Close"] \
+ -compound left \
+ -command [list $this uart_monitor_close] \
+ -image ::ICONS::16::button_cancel \
+ ] -side right -pady 2 -padx 5
+ uart_monitor_set_status_tip $win.close_but [mc "Close this dialog window"]
+
+ # Set window attributes
+ wm iconphoto $win ::ICONS::16::__blockdevice
+ wm title $win "[mc {UART Monitor}] - [$this cget -projectName] - MCU 8051 IDE"
+ wm minsize $win 500 500
+ wm resizable $win 1 1
+ wm protocol $win WM_DELETE_WINDOW [list $this uart_monitor_close]
+ bindtags $win [list $win Toplevel all .]
+
+ update idletasks
+ if {$geometry != {}} {
+ regsub {\+\d+\+\d+} $geometry [format {+%d+%d} [winfo width $win] [winfo height $win]] geometry
+ wm geometry $win $geometry
+ }
+
+ set dialog_opened 1
+
+# #< DEBUG !!!
+# uart_monitor_byte_received 100 111 132
+# uart_monitor_byte_transmitted 101 112 122
+#
+ uart_monitor_refresh_configuration
+ uart_monitor_write_to_log r "THIS TOOL IS NOT FUNCTIONAL YET!"
+ uart_monitor_write_to_log t "THIS TOOL IS NOT FUNCTIONAL YET!"
+#
+# uart_monitor_shift_reg_input r 1 1
+# uart_monitor_shift_reg_input r 1 0
+# uart_monitor_shift_reg_input r 1 0
+# uart_monitor_shift_reg_input r 1 1
+# uart_monitor_shift_reg_input r 1 1
+#
+# uart_monitor_shift_reg_input t 0 1
+# uart_monitor_shift_reg_input t 0 0
+# uart_monitor_shift_reg_input t 0 0
+# uart_monitor_shift_reg_input t 0 1
+# uart_monitor_shift_reg_input t 0 1
+#
+# uart_monitor_update_sbuf r
+# uart_monitor_update_sbuf t
+#
+# uart_monitor_graph_draw t {1 0 1 0 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {0 1 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 0}
+# uart_monitor_graph_draw t {1 0 1 0 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {0 1 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 0}
+# #> DEBUG !!!
+ }
+
+ public method uart_monitor_close {} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ set geometry [wm geometry $win]
+ set dialog_opened 0
+
+ if {[winfo exists $win]} {
+ destroy $win
+ }
+ }
+
+ ## Set status bar tip for certain widget
+ # @parm Widget widget - Some button or label ...
+ # @parm String text - Status tip
+ # @return void
+ private method uart_monitor_set_status_tip {widget text} {
+ bind $widget <Enter> [list $status_bar configure -text $text]
+ bind $widget <Leave> [list $status_bar configure -text {}]
+ }
+
+ private method fill_canvas {side} {
+ set labels [list 8 7 6 5 4 3 2 1 0]
+
+ set x 5
+ set j 0
+ for {set i 0} {$i < 10} {incr i} {
+ set y 20
+ set bit_rect(s,$side,$i) [$canvas($side) create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+
+ if {($side == {r} && $i > 0 && $i < 10) || ($side == {t} && $i >= 0 && $i < 9)} {
+ if {$j == 1} {
+ incr x 3
+ }
+ set y 50
+ set bit_rect(b,$side,$j) [$canvas($side) create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+ $canvas($side) create text \
+ [expr {$x + ($rect_size / 2)}] \
+ [expr {$y + ($rect_size / 2)}] \
+ -text [lindex $labels $j] \
+ -font $tiny_font
+ if {$j == 1} {
+ incr x -3
+ }
+ incr j
+ }
+
+ incr x $rect_size
+ incr x 2
+ }
+
+ $canvas($side) create text 5 5 -anchor nw -font $normal_font -text [mc "The shift register:"]
+ $canvas($side) create text 5 35 -anchor nw -font $normal_font -text "SBUF [string toupper $side]:"
+
+ # --------------------------------------------------------------
+
+ if {$side == {r}} {
+ set graph_label [list \
+ [mc "RxD"] \
+ [mc "RI"] \
+ [mc "ALE"] \
+ [mc "SHIFT"] \
+ [mc "SBUF"] \
+ ]
+ } else {
+ set graph_label [list \
+ [mc "TxD"] \
+ [mc "TI"] \
+ [mc "ALE"] \
+ [mc "SHIFT"] \
+ [mc "SBUF"] \
+ ]
+ }
+ for {set y 0} {$y < 5} {incr y} {
+ set y_0 [expr {75 + $y * 20}]
+ set y_1 [expr {$y_0 + 15}]
+
+ for {set x 45} {$x <= 235} {incr x 5} {
+ $canvas($side) create line $x $y_0 $x $y_1 -fill {#AAAAAA} -tags grid -dash .
+ }
+
+ $canvas($side) create text 5 $y_0 -anchor nw -font $bold_fixed_font -text [lindex $graph_label $y]
+
+ incr y_0 -3
+ $canvas($side) create line 45 $y_0 235 $y_0 -fill {#AAAAAA} -tags grid
+ }
+ }
+
+ public method uart_monitor_refresh_configuration {} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ set pcon [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ set scon [$this getSfrDEC $::Simulator_ENGINE::symbol(SCON)]
+
+ set bit(fe) [$this sim_engine_get_FE]
+ set bit(sm0) [$this sim_engine_get_SM0]
+ set bit(sm1) [expr {$scon & 0x40}]
+ set bit(sm2) [expr {$scon & 0x20}]
+ set bit(ren) [expr {$scon & 0x10}]
+ set bit(ti) [expr {$scon & 0x02}]
+ set bit(ri) [expr {$scon & 0x01}]
+
+ set bit(smod1) [expr {$pcon & 0x80}]
+
+ if {[$this get_feature_available t2]} {
+ set bit(tclk) [$this getBit $::Simulator_ENGINE::symbol(TCLK)]
+ set bit(rclk) [$this getBit $::Simulator_ENGINE::symbol(RCLK)]
+ } else {
+ set bit(tclk) 0
+ set bit(rclk) 0
+ }
+
+ ## Determinate mode of operation
+ # Mode 0
+ if {!$bit(sm0) && !$bit(sm1)} {
+ set mode [mc "0 (8-bit Shift register)"]
+ # Mode 1
+ } elseif {!$bit(sm0) && $bit(sm1)} {
+ set mode [mc "1 (8-bit UART)"]
+ # Mode 2
+ } elseif {$bit(sm0) && !$bit(sm1)} {
+ set mode [mc "2 (9-bit UART)"]
+ # Mode 3
+ } elseif {$bit(sm0) && $bit(sm1)} {
+ set mode [mc "3 (9-bit UART)"]
+ }
+
+ ## Determinate line functions
+ if {!$bit(sm0) && !$bit(sm1)} {
+ set r_lf [mc "Data input/output"]
+ set t_lf [mc "Shift clock output"]
+ } else {
+ set r_lf [mc "Data input"]
+ set t_lf [mc "Data output"]
+ }
+
+ ## Determinate source of baud rate clock
+ if {$bit(sm1)} {
+ if {$bit(rclk)} {
+ set r_brg [mc "Timer 2"]
+ } else {
+ set r_brg [mc "Timer 1"]
+ }
+ if {$bit(tclk)} {
+ set t_brg [mc "Timer 2"]
+ } else {
+ set t_brg [mc "Timer 1"]
+ }
+ } else {
+ set r_brg [mc "Master clock"]
+ set t_brg [mc "Master clock"]
+ }
+
+ ## Determinate resulting baud rate
+ set r_rbdps [determinate_baud_rate t]
+ set t_rbdps [determinate_baud_rate t]
+
+ ## Determinate state of the interface
+ set r_state [mc "WAITING"]
+ set t_state [mc "WAITING"]
+
+ # --------------------------------------------------------------
+ # RECEIVER PART
+ # --------------------------------------------------------------
+ $uart_value_label(r_mode) configure -text $mode
+ $uart_value_label(r_lf) configure -text $r_lf
+ $uart_value_label(r_brg) configure -text $r_brg
+ $uart_value_label(r_rbdps) configure -text $r_rbdps
+ $uart_value_label(r_state) configure -text $r_state
+
+ # --------------------------------------------------------------
+ # TRANSMITTER PART
+ # --------------------------------------------------------------
+ $uart_value_label(t_mode) configure -text $mode
+ $uart_value_label(t_lf) configure -text $t_lf
+ $uart_value_label(t_brg) configure -text $t_brg
+ $uart_value_label(t_rbdps) configure -text $t_rbdps
+ $uart_value_label(t_state) configure -text $t_state
+ }
+
+ private method determinate_baud_rate {side} {
+ # RxD side
+ if {$side == {r}} {
+ # Timer 2
+ if {$bit(rclk)} {
+ return [mc "Determinated by timer 2"]
+
+ # Timer 1
+ } else {
+ set tmod [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ if {$tmod & 0x40} {
+ return [mc "Unknown"]
+ }
+ set clock_f [expr {1000 * [$this getEngineClock] * (1 + ([$this get_X2] ? 1 : 0))}]
+ set mode [expr {($tmod & 0x30) >> 4}]
+ switch -- $mode {
+ 0 {
+ return [expr {$clock_f / 8192.0}]
+ }
+ 1 {
+ return [expr {$clock_f / 65536.0}]
+ }
+ 2 {
+ set th1 [$this getSfrDEC $::Simulator_ENGINE::symbol(TH1)]
+ return [expr {$clock_f / (256.0 - $th1)}]
+ }
+ 3 {
+ return 0
+ }
+ }
+ }
+
+ # TxD side
+ } else {
+ # Timer 2
+ if {$bit(tclk)} {
+ return [mc "Determinated by timer 2"]
+
+ # Timer 1
+ } else {
+ set tmod [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ if {$tmod & 0x40} {
+ return [mc "Unknown"]
+ }
+ set clock_f [expr {1000 * [$this getEngineClock] * (1 + ([$this get_X2] ? 1 : 0))}]
+ set mode [expr {($tmod & 0x30) >> 4}]
+ switch -- $mode {
+ 0 {
+ return [expr {$clock_f / 8192.0}]
+ }
+ 1 {
+ return [expr {$clock_f / 65536.0}]
+ }
+ 2 {
+ set th1 [$this getSfrDEC $::Simulator_ENGINE::symbol(TH1)]
+ return [expr {$clock_f / (256.0 - $th1)}]
+ }
+ 3 {
+ return 0
+ }
+ }
+ }
+ }
+
+ return [mc "Unknown"]
+ }
+
+ public method uart_monitor_update_prescaler {side value} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $uart_value_label(${side}_brgp) configure -text $value
+ }
+
+ public method uart_monitor_byte_received {args} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ foreach byte $args {
+ write_to_data_transfer_log r $byte
+ }
+ }
+
+ public method uart_monitor_byte_transmitted {args} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ foreach byte $args {
+ write_to_data_transfer_log t $byte
+ }
+ }
+
+ private method write_to_data_transfer_log {side byte} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $data_transfer_log($side) configure -state normal
+ if {$data_transfer_log_length($side) == $MAX_D_LOG_LENGTH} {
+ for {set i 1} {$i < 5} {incr i} {
+ $data_transfer_log($side) delete $i.4 $i.6
+ }
+ incr data_transfer_log_length($side) -1
+ }
+
+ set i [expr {6 + $data_transfer_log_length($side) * 4}]
+
+ $data_transfer_log($side) insert 1.$i [format {%3X } $byte]
+ $data_transfer_log($side) insert 2.$i [format {%3d } $byte]
+ $data_transfer_log($side) insert 3.$i [format {%3o } $byte]
+ if {[string is print -strict [format {%c} $byte]]} {
+ $data_transfer_log($side) insert 4.$i [format { %c } $byte]
+ } else {
+ $data_transfer_log($side) insert 4.$i { }
+ }
+ $data_transfer_log($side) configure -state disabled
+
+ incr data_transfer_log_length($side)
+ }
+
+ public method uart_monitor_write_to_log {side text} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $general_log($side) configure -state normal
+ if {$general_log_length($side) == $MAX_G_LOG_LENGTH} {
+ $general_log($side) delete 1.0 2.0
+ $general_log($side) mark set {end-1l lineend}
+ }
+
+ $general_log($side) insert insert $text
+ $general_log($side) insert insert "\n"
+ $general_log($side) see insert
+ $general_log($side) configure -state disabled
+ }
+
+ public method uart_monitor_shift_reg_input {side right__left bit_val} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ incr shift_reg_bits_written($side)
+ if {$right__left} {
+ set shift_reg($side) [expr {($shift_reg($side) >> 1) | (($bit_val ? 1 : 0) << 9)}]
+ set start 0
+ set end [expr {$shift_reg_bits_written($side) - 1}]
+ } else {
+ set shift_reg($side) [expr {0x3FF & (($shift_reg($side) << 1) | ($bit_val ? 1 : 0))}]
+ set start [expr {9 - $shift_reg_bits_written($side)}]
+ set end 9
+ }
+
+ for {set i $start} {$i <= $end} {incr i} {
+ if {$shift_reg($side) & (1 << (9 - $i))} {
+ set outline ${::BitMap::one_outline}
+ set fill ${::BitMap::one_fill}
+ } else {
+ set outline ${::BitMap::zero_outline}
+ set fill ${::BitMap::zero_fill}
+ }
+
+ $canvas($side) itemconfigure $bit_rect(s,$side,$i) \
+ -outline $outline \
+ -fill $fill
+ }
+ }
+ public method uart_monitor_shift_reg_clear {side} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ for {set i 0} {$i < 9} {incr i} {
+ $canvas($side) itemconfigure $bit_rect(s,$side,$i) \
+ -outline $empty_outline \
+ -fill $empty_fill
+ }
+ set shift_reg($side) 0
+ set shift_reg_bits_written($side) 0
+ }
+ public method uart_monitor_update_sbuf {side} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ if {$side == {r}} {
+ set sbuf [$this getSfrDEC $::Simulator_ENGINE::symbol(SBUFR)]
+ set bit8 [$this getBit $::Simulator_ENGINE::symbol(RB8)]
+ } else {
+ set sbuf [$this getSfrDEC $::Simulator_ENGINE::symbol(SBUFT)]
+ set bit8 [$this getBit $::Simulator_ENGINE::symbol(TB8)]
+ }
+
+ for {set i 0} {$i < 9} {incr i} {
+ if {!$i} {
+ set value $bit8
+ } else {
+ set value [expr {$sbuf & (1 << (8 - $i))}]
+ }
+
+ if {$value} {
+ set outline ${::BitMap::one_outline}
+ set fill ${::BitMap::one_fill}
+ } else {
+ set outline ${::BitMap::zero_outline}
+ set fill ${::BitMap::zero_fill}
+ }
+
+ $canvas($side) itemconfigure $bit_rect(b,$side,$i) \
+ -outline $outline \
+ -fill $fill
+ }
+ }
+ public method uart_monitor_graph_clear {side} {
+ $canvas($side) delete graph
+
+ set graph_position($side) 0
+ set graph_prev_states($side) 1
+ set graph_elements($side) [list]
+ }
+
+ public method uart_monitor_graph_draw {side values} {
+ if {$graph_position($side) == 190} {
+ $canvas($side) move graph -1 0
+ foreach items [lindex $graph_elements($side) 0] {
+ foreach item $items {
+ $canvas($side) delete $item
+ }
+ }
+ set graph_elements($side) [lreplace $graph_elements($side) 0 0]
+ incr graph_position($side) -1
+ }
+
+ set x_0 [expr {45 + $graph_position($side)}]
+ set x_1 [expr {$x_0 + 1}]
+
+ set i 0
+ set prev_state [list]
+ set graph_elems [list]
+ foreach state $values {
+ set top [expr {75 + $i * 20}]
+ set mid [expr {82 + $i * 20}]
+ set bot [expr {90 + $i * 20}]
+ switch -- [lindex $graph_prev_states($side) $i] {
+ 0 {
+ switch -- $state {
+ 0 { ;# 0 --> 0
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $bot $x_1 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 0 --> 1
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $mid -tags graph -fill {#FF0000}] \
+ [$canvas($side) create line $x_0 $mid $x_0 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ 1 {
+ switch -- $state {
+ 0 { ;# 1 --> 0
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $mid -tags graph -fill {#FF0000}] \
+ [$canvas($side) create line $x_0 $mid $x_0 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 1 --> 1
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_1 $top -tags graph -fill {#FF0000}] \
+ ]
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0055FF}] \
+ ]
+ }
+ }
+
+ incr i
+ lappend prev_state $state
+ }
+
+ incr graph_position($side)
+ set graph_prev_states($side) $prev_state
+ lappend graph_elements($side) $graph_elems
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard