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

📄 watchdog.tcl

📁 开放源码实时操作系统源码.
💻 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 + -