⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchdog.tcl

📁 eCos操作系统源码
💻 TCL
📖 第 1 页 / 共 2 页
字号:
# {{{  Banner                                                   # ============================================================================# #      watchdog.tcl# #      Watchdog support for the eCos synthetic target I/O auxiliary# # ============================================================================# ####COPYRIGHTBEGIN#####                                                                           #  ----------------------------------------------------------------------------#  Copyright (C) 2002 Bart Veer# #  This file is part of the eCos host tools.# #  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.# #  ----------------------------------------------------------------------------#                                                                           # ####COPYRIGHTEND##### ============================================================================# #####DESCRIPTIONBEGIN##### #  Author(s):   bartv#  Contact(s):  bartv#  Date:        2002/09/04#  Version:     0.01#  Description:#      Implementation of the watchdog device. This script should only ever#      be run from inside the ecosynth auxiliary.# # ####DESCRIPTIONEND##### ============================================================================# }}}namespace eval watchdog {    # Was initialization successful?    variable init_ok 1    # Has the alarm triggered?    variable alarm_triggered 0        # The eCos application process id. This is needed to send a SIGPWR signal    # if the watchdog triggers, and to access /proc/<pid>/stat to obtain    # timing information. Strictly speaking _ppid is not exported by    # the I/O auxiliary.    if { ! [info exists synth::_ppid] } {        synth::report_error "Watchdog initialization failed, _ppid variable required"        return ""    }    variable ecos_pid $synth::_ppid    # Resolution, i.e. how long to go between checks. Currently this is hard-wired    # to one second, or 1000 ms. This may become configurable, either on the    # target-side via CDL or on the host-side via the target definition file.    # Note that currently the watchdog device and the GUI get updated via the    # same timer. If the resolution is changed to e.g. 10 seconds then it might    # be a good idea to update the GUI more frequently, although there are    # arguments for keeping the animation in step with the real work.    variable resolution 1000        # Options from the target definition file    variable use_wallclock 0    variable window_pack   "-in .main.n -side right"    variable sound_file    ""    variable sound_player  "play"    if { [synth::tdf_has_device "watchdog"] } {        if { [synth::tdf_has_option "watchdog" "use"] } {            set _use [synth::tdf_get_option "watchdog" "use"]            if { "wallclock_time" == $_use } {                set watchdog::use_wallclock 1            } elseif { "consumed_cpu_time" == $_use } {                set watchdog::use_wallclock 0            } else {                synth::report_error "Invalid entry in target definition file $synth::target_definition\n\                                    \    Device watchdog, option \"use\" should be \"wallclock_time\" or \"consumed_cpu_time\"\n"            }            unset _use        }        if { [synth::tdf_has_option "watchdog" "watchdog_pack"] } {            set watchdog::window_pack [synth::tdf_get_option "watchdog" "watchdog_pack"]            # Too complicated to validate here, instead leave it to a catch statement            # when the window actually gets packed        }        if { [synth::tdf_has_option "watchdog" "sound"] } {            set _sound_file [synth::tdf_get_option "watchdog" "sound"]            # Look for this sound file in the install tree first, then absolute or relative            if { [file exists [file join $synth::device_install_dir $_sound_file] ] } {                set _sound_file [file join $synth::device_install_dir $_sound_file]            }            if { ![file exists $_sound_file] } {                synth::report_error "Invalid entry in target definition file $synth::target_definition\n\                                    \    Device watchdog, option \"sound\", failed to find $_sound_file\n"            } elseif { ! [file readable $_sound_file] } {                synth::report_error "Invalid entry in target definition file $synth::target_definition\n\                                    \    Device watchdog, option \"sound\", no read access to file $_sound_file\n"            } else {                set watchdog::sound_file $_sound_file            }            unset _sound_file        }        if { [synth::tdf_has_option "watchdog" "sound_player"] } {            set watchdog::sound_player [synth::tdf_get_option "watchdog" "sound_player"]        }    }    # There is no point in creating the watchdog window if any of the image files are missing    if { $synth::flag_gui } {        foreach _image [list "doghouse.gif" "alarm.gif" "eye.gif" "asleep.gif"] {            variable image_[file rootname $_image]            if { ! [synth::load_image "watchdog::image_[file rootname $_image]" [file join $synth::device_install_dir $_image]] } {                synth::report_error "Watchdog device, unable to load image $_image\n\                                    \    This file should have been installed in $synth::device_install_dir\n"                set watchdog::init_ok 0            }        }    }    if { $synth::flag_gui && $watchdog::init_ok } {        canvas .watchdog -width [image width $image_doghouse] -height [image height $image_doghouse] \            -borderwidth 0        variable background [.watchdog create image 0 0 -anchor nw -image $image_doghouse]            # Eye positions inside the doghouse. The eye is an 8x10 gif,        # mostly white but transparent around the corners        variable left_eye_x         48        variable left_eye_y         70        variable right_eye_x        58        variable right_eye_y        70                # Pupil positions relative to the eye. The pupils are 3x3 rectangles.        # The dog can look in one of nine different directions, with both eyes        # looking in the same direction (if visible)        variable pupil_positions { { 1 6 } { 1 5 } { 1 3 } { 3 1 } { 3 4 } { 3 6 } { 4 3 } { 4 5 } { 4 6 } }            # Which eyes are currently visible: none, left, right or both        variable eyes "none"        # What is the current pupil position?        variable pupils 4                variable left_eye  [.watchdog create image $left_eye_x $left_eye_y -anchor nw -image $image_eye]        variable right_eye [.watchdog create image $right_eye_x $right_eye_y -anchor nw -image $image_eye]            variable left_pupil \            [.watchdog create rectangle \                 [expr $left_eye_x + [lindex [lindex $pupil_positions $pupils] 0]]     \                 [expr $left_eye_y + [lindex [lindex $pupil_positions $pupils] 1]]     \                 [expr $left_eye_x + [lindex [lindex $pupil_positions $pupils] 0] + 2] \                 [expr $left_eye_y + [lindex [lindex $pupil_positions $pupils] 1] + 2] \                 -fill black]        variable right_pupil \            [.watchdog create rectangle \                 [expr $right_eye_x + [lindex [lindex $pupil_positions $pupils] 0]]     \                 [expr $right_eye_y + [lindex [lindex $pupil_positions $pupils] 1]]     \                 [expr $right_eye_x + [lindex [lindex $pupil_positions $pupils] 0] + 2] \                 [expr $right_eye_y + [lindex [lindex $pupil_positions $pupils] 1] + 2] \                 -fill black]            # The dog is asleep until the eCos application activates the watchdog device        .watchdog lower $left_eye $background        .watchdog lower $right_eye $background        .watchdog lower $left_pupil $background        .watchdog lower $right_pupil $background        # Prepare for an alarm, but obviously the alarm picture should be hidden for now.        variable alarm [.watchdog create image 30 56 -anchor nw -image $image_alarm]        .watchdog lower $alarm $background        # Start asleep        variable asleep [.watchdog create image 48 70 -anchor nw -image $image_asleep]                # Now try to pack the watchdog window using the option provided by the        # user. If that fails, report the error and pack in a default window.        if { [catch { eval pack .watchdog $watchdog::window_pack } message] } {            synth::report_error "Watchdog device, failed to pack window in $watchdog::window_pack\n    $message"            pack .watchdog -in .main.n -side right        }                           # Updating the display. This happens once a second.        # If neither eye is visible, choose randomly between        # left-only, right-only or both. Otherwise there is        # a one in eight chance of blinking, probably switching        # to one of the other eye modes        #        # Also, the visible pupil(s) will move every second, to one        # of nine positions        proc gui_update { } {                    if { "none" == $watchdog::eyes} {                set rand [expr int(3 * rand())]                if { 0 == $rand } {                    set watchdog::eyes "left"                    .watchdog raise $watchdog::left_eye   $watchdog::background                    .watchdog raise $watchdog::left_pupil $watchdog::left_eye                } elseif { 1 == $rand } {                    set watchdog::eyes "right"                    .watchdog raise $watchdog::right_eye   $watchdog::background

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -