Ignore:
Timestamp:
Jan 11, 2012, 4:32:57 PM (13 years ago)
Author:
demin
Message:

adapt to paella v2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MultiChannelUSB/UserInterface.tcl

    r85 r159  
    1616    namespace import ::blt::tabnotebook
    1717
    18     proc validate {max value} {
     18# -------------------------------------------------------------------------
     19
     20    variable oscCodes
     21    array set oscCodes {
     22        1 {Channel 1}
     23        2 {Channel 2}
     24        3 {Channel 3}
     25        4 {Channel 4}
     26        5 {Channel 5}
     27        6 {Trigger}
     28    }
     29
     30# -------------------------------------------------------------------------
     31
     32    variable adcCodes
     33    array set adcCodes {
     34        1 {ADC 1}
     35        2 {ADC 2}
     36        3 {ADC 3}
     37    }
     38
     39# -------------------------------------------------------------------------
     40
     41    variable inpCodes
     42    array set inpCodes {
     43        0 {raw data}
     44        1 {filtered}
     45        2 {amplitude}
     46        3 {amp flag}
     47    }
     48
     49# -------------------------------------------------------------------------
     50
     51    proc validate {max size value} {
    1952        if {![regexp {^[0-9]*$} $value]} {
     53            return 0
     54        } elseif {[regexp {^0[0-9]+$} $value]} {
    2055            return 0
    2156        } elseif {$value > $max} {
    2257            return 0
    23         } elseif {[string length $value] > 4} {
     58        } elseif {[string length $value] > $size} {
    2459            return 0
    2560        } else {
     
    3065# -------------------------------------------------------------------------
    3166
    32     Class Display
    33 
    34 # -------------------------------------------------------------------------
    35 
    36     Display instproc usbCmd {command} {
    37         global usb_handle
    38 
    39         if {[catch {$usb_handle writeRaw [usb::convert $command]} result]} {
    40             puts {Error during write}
    41             puts $result
    42         }
    43     }
    44 
    45 # -------------------------------------------------------------------------
    46 
    47     Display instproc usbCmdRead {command width size} {
    48         global usb_handle
    49 
     67    proc doublevalidate {max value} {
     68        if {![regexp {^[0-9]{0,2}\.?[0-9]{0,3}$} $value]} {
     69            return 0
     70        } elseif {[regexp {^0[0-9]+$} $value]} {
     71            return 0
     72        } elseif {$value > $max} {
     73            return 0
     74        } else {
     75            return 1
     76        }
     77    }
     78
     79# -------------------------------------------------------------------------
     80
     81    proc legendLabel {master row key title} {
     82        label ${master}.${key}_label -anchor w -text ${title}
     83        label ${master}.${key}_value -width 10 -anchor e -text {}
     84
     85        grid ${master}.${key}_label -row ${row} -column 1 -sticky w
     86        grid ${master}.${key}_value -row ${row} -column 2 -sticky ew
     87    }
     88
     89# -------------------------------------------------------------------------
     90
     91    proc legendButton {master row key title var bg {fg black}} {
     92        checkbutton ${master}.${key}_check -variable $var
     93        label ${master}.${key}_label -anchor w -text ${title} -bg ${bg} -fg $fg
     94        label ${master}.${key}_value -width 10 -anchor e -text {} -bg ${bg} -fg $fg
     95
     96        grid ${master}.${key}_check -row ${row} -column 0 -sticky w
     97        grid ${master}.${key}_label -row ${row} -column 1 -sticky w
     98        grid ${master}.${key}_value -row ${row} -column 2 -sticky ew
     99    }
     100
     101# -------------------------------------------------------------------------
     102
     103    Class UsbController
     104
     105# -------------------------------------------------------------------------
     106
     107    UsbController instproc usbConnect {} {
     108        my instvar handle
     109
     110        puts usbConnect
     111
     112        if {[my exists handle]} {
     113            $handle disconnect
     114            unset handle
     115        }
     116if {1} {
     117        while {[catch {usb::connect 0x09FB 0x6001 1 1 0} result]} {
     118            set answer [tk_messageBox -icon error -type retrycancel \
     119                -message {Cannot access USB device} -detail $result]
     120#            puts $result
     121            if {[string equal $answer cancel]} exit
     122        }
     123
     124        set handle $result
     125
     126}
     127    }
     128
     129# -------------------------------------------------------------------------
     130
     131    UsbController instproc usbHandle {} {
     132        my instvar handle
     133
     134        if {[my exists handle]} {
     135            return $handle
     136        } else {
     137            my usbConnect
     138        }
     139    }
     140
     141# -------------------------------------------------------------------------
     142
     143    UsbController instproc usbCmd {command} {
     144        set code [catch {[my usbHandle] writeRaw [usb::convert $command]} result]
     145        switch -- $code {
     146            1 {
     147#                puts $result
     148                my usbConnect
     149            }
     150        }
     151
     152    }
     153
     154# -------------------------------------------------------------------------
     155
     156    UsbController instproc usbCmdReadRaw {command size data} {
    50157        my usbCmd $command
    51158
    52         set usb_data {}
    53         if {[catch {$usb_handle readHex $width $size} result]} {
    54             puts {Error during read}
    55             puts $result
    56             set result {}
    57         }
    58 
    59         my set data $result
    60     }
    61 
    62 # -------------------------------------------------------------------------
    63 
    64     Display instproc usbCmdReadEpt {command size} {
    65         global usb_handle
    66 
     159        set code [catch {[my usbHandle] readRaw $size} result]
     160        switch -- $code {
     161            0 {
     162                set $data $result
     163            }
     164            1 {
     165#                puts $result
     166                my usbConnect
     167            }
     168            5 {
     169#                puts Busy
     170            }
     171        }
     172    }
     173
     174# -------------------------------------------------------------------------
     175
     176    UsbController instproc usbCmdReadRaw {command size data} {
    67177        my usbCmd $command
    68178
    69         set usb_data {}
    70         if {[catch {$usb_handle readEpt $size} result]} {
    71             puts {Error during read}
    72             puts $result
    73             set result {}
    74         }
    75 
    76         my set data $result
    77     }
    78 
    79 # -------------------------------------------------------------------------
    80 
    81     Class CfgDisplay -superclass Display -parameter {
     179        set code [catch {[my usbHandle] readRaw $size} result]
     180        switch -- $code {
     181            0 {
     182                set $data $result
     183            }
     184            1 {
     185#                puts $result
     186                my usbConnect
     187            }
     188            5 {
     189#                puts Busy
     190            }
     191        }
     192    }
     193
     194# -------------------------------------------------------------------------
     195
     196    UsbController instproc usbCmdReadHex {command width size data} {
     197        my usbCmd $command
     198
     199        set code [catch {[my usbHandle] readHex $width $size} result]
     200        switch -- $code {
     201            0 {
     202                set $data $result
     203            }
     204            1 {
     205#                puts $result
     206                my usbConnect
     207            }
     208            5 {
     209#                puts Busy
     210            }
     211        }
     212    }
     213
     214# -------------------------------------------------------------------------
     215
     216    Class MuxDisplay -parameter {
    82217        {master}
    83     }
    84 
    85 # -------------------------------------------------------------------------
    86 
    87     CfgDisplay instproc init {} {
    88 
    89         my reset
     218        {controller}
     219    }
     220
     221# -------------------------------------------------------------------------
     222
     223    MuxDisplay instproc init {} {
    90224
    91225        my setup
     
    96230# -------------------------------------------------------------------------
    97231
    98     CfgDisplay instproc destroy {} {
     232    MuxDisplay instproc destroy {} {
    99233        next
    100234    }
     
    102236# -------------------------------------------------------------------------
    103237
    104     CfgDisplay instproc reset {} {
    105     }
    106 
    107 # -------------------------------------------------------------------------
    108 
    109     CfgDisplay instproc start {} {
     238    MuxDisplay instproc start {} {
     239        my instvar config chan_val
     240
     241        set chan_val(1) 0
     242        set chan_val(2) 0
     243        set chan_val(3) 0
     244        set chan_val(4) 0
     245        set chan_val(5) 0
     246        set chan_val(6) 0
     247
     248        trace add variable [myvar chan_val] write [myproc chan_val_update]
     249        trace add variable [myvar polar] write [myproc polar_update]
     250
     251        $config(1).chan_1_1 select
     252        $config(2).chan_1_2 select
     253        $config(3).chan_1_3 select
     254        $config(4).chan_1_1 select
     255        $config(5).chan_3_1 select
     256        $config(6).chan_3_1 select
     257
     258        for {set i 1} {$i <= 3} {incr i} {
     259          $config(7).polar$i select
     260        }
     261    }
     262
     263# -------------------------------------------------------------------------
     264
     265    MuxDisplay instproc setup {} {
     266        variable oscCodes
     267        variable adcCodes
     268        variable inpCodes
     269        my instvar master
    110270        my instvar config
    111271
    112         trace add variable [myvar dac1] write [myproc dac1_update]
    113         trace add variable [myvar dac2] write [myproc dac2_update]
    114         trace add variable [myvar polar] write [myproc polar_update]
    115 
    116         ${config(1)}.dac1 set 0
    117         ${config(1)}.dac2 set 0
    118 
    119         ${config(2)}.polar1 select
    120         ${config(2)}.polar2 select
    121         ${config(2)}.polar3 select
    122     }
    123 
    124 # -------------------------------------------------------------------------
    125 
    126     CfgDisplay instproc setup {} {
    127         my instvar number master
    128         my instvar config
    129 
    130         set config(1) [labelframe ${master}.cfg1 -borderwidth 1 -relief sunken -text {DAC}]
    131         set config(2) [labelframe ${master}.cfg2 -borderwidth 1 -relief sunken -text {polarity inversion}]
    132 
    133         frame ${config(1)}.limits
    134         label ${config(1)}.limits.min -text {0.0V}
    135         label ${config(1)}.limits.max -text {-3.3V}
    136 
    137         scale ${config(1)}.dac1 -orient vertical -from 0 -to 4095 -tickinterval 500 -variable [myvar dac1]
    138         scale ${config(1)}.dac2 -orient vertical -from 0 -to 4095 -tickinterval 0 -variable [myvar dac2]
    139 
    140         checkbutton ${config(2)}.polar1 -text {channel 1} -variable [myvar polar(1)]
    141         checkbutton ${config(2)}.polar2 -text {channel 2} -variable [myvar polar(2)]
    142         checkbutton ${config(2)}.polar3 -text {channel 3} -variable [myvar polar(3)]
    143 
    144         grid ${config(1)} -sticky ns
    145         grid ${config(2)} -sticky ew -pady 7
    146 
    147         pack ${config(1)}.limits.min -anchor n -side top -pady 10
    148         pack ${config(1)}.limits.max -anchor s -side bottom -pady 9
    149 
    150         grid ${config(1)}.dac1 ${config(1)}.dac2 ${config(1)}.limits -sticky ns -pady 7
    151 
    152         grid ${config(2)}.polar1
    153         grid ${config(2)}.polar2
    154         grid ${config(2)}.polar3
     272        set size [array size inpCodes]
     273        set oscList [array get oscCodes]
     274        set adcList [array get adcCodes]
     275        set inpList [array get inpCodes]
     276
     277        foreach {osc title} $oscList {
     278            set config($osc) [labelframe ${master}.mux_$osc -borderwidth 1 -relief sunken -text $title]
     279
     280            foreach {ch dummy} $adcList {
     281                label $config($osc).chan_${ch} -text "#$ch "
     282                grid $config($osc).chan_${ch} -row 0 -column $ch -sticky w
     283            }
     284            foreach {code input} $inpList {
     285                set row [expr {$code + 1}]
     286                set last 0
     287                foreach {ch dummy} $adcList {
     288                    set value [expr {$size * ($ch - 1) + $code}]
     289                    radiobutton $config($osc).chan_${code}_${ch} -variable [myvar chan_val($osc)] -value ${value}
     290                    grid $config($osc).chan_${code}_${ch} -row ${row} -column $ch -sticky w
     291                    set last $ch
     292                }
     293                $config($osc).chan_${code}_${last} configure -text $input
     294            }
     295            set column [expr {($osc - 1) % 3}]
     296            set row [expr {($osc - 1) / 3 * 2 + 1}]
     297            grid $config($osc) -row $row -column $column -sticky news -padx 10
     298        }
     299
     300        set config(7) [labelframe ${master}.mux_8 -borderwidth 1 -relief sunken -text {polarity inversion}]
     301        for {set i 1} {$i <= 3} {incr i} {
     302          checkbutton $config(7).polar$i -text "ADC $i" -variable [myvar polar($i)]
     303          grid ${config(7)}.polar$i
     304        }
     305        grid $config(7) -row 2 -column 3 -sticky news -padx 10
     306
     307        grid columnconfigure ${master} 0 -weight 1
     308        grid columnconfigure ${master} 1 -weight 1
     309        grid columnconfigure ${master} 2 -weight 1
     310        grid columnconfigure ${master} 3 -weight 1
    155311
    156312        grid rowconfigure ${master} 0 -weight 1
    157         grid rowconfigure ${config(1)} 0 -weight 1
    158         grid rowconfigure ${config(2)} 0 -weight 1
    159     }
    160 
    161 # -------------------------------------------------------------------------
    162 
    163     CfgDisplay instproc dac1_update args {
    164         my instvar dac1
    165 
    166         set value [format {%03x} $dac1]
    167         set command 0005012000050030000500[string range $value 0 1]000502[string index $value 2]0
    168 
    169         my usbCmd $command
    170     }
    171 
    172 # -------------------------------------------------------------------------
    173 
    174     CfgDisplay instproc dac2_update args {
    175         my instvar dac2
    176 
    177         set value [format {%03x} $dac2]
    178         set command 0005012400050030000500[string range $value 0 1]000502[string index $value 2]0
    179 
    180         my usbCmd $command
    181     }
    182 
    183 # -------------------------------------------------------------------------
    184 
    185     CfgDisplay instproc polar_update args {
    186         my instvar polar
    187 
    188         set value [format {0%x%x%x} $polar(3) $polar(2) $polar(1)]
    189 
    190         my usbCmd 000A${value}
    191     }
    192 
    193 # -------------------------------------------------------------------------
    194 
    195     Class OscDisplay -superclass Display -parameter {
     313        grid rowconfigure ${master} 1 -weight 0
     314        grid rowconfigure ${master} 2 -weight 0
     315        grid rowconfigure ${master} 3 -weight 0
     316        grid rowconfigure ${master} 4 -weight 1
     317
     318    }
     319
     320
     321# ------------------------------------------------------------------------
     322
     323    MuxDisplay instproc chan_val_update args {
     324        my instvar controller chan_val
     325
     326        set byte1 [format {%02x%02x} $chan_val(2) $chan_val(1)]
     327        set byte2 [format {%02x%02x} $chan_val(4) $chan_val(3)]
     328        set byte3 [format {%02x%02x} $chan_val(6) $chan_val(5)]
     329
     330        $controller usbCmd 000200020004${byte1}000200030004${byte2}000200040004${byte3}
     331    }
     332
     333# -------------------------------------------------------------------------
     334
     335    MuxDisplay instproc polar_update args {
     336        my instvar controller polar
     337
     338        set value [format {%x%x%x} $polar(3) $polar(2) $polar(1)]
     339
     340        $controller usbCmd 0002000100040${value}
     341    }
     342
     343# -------------------------------------------------------------------------
     344
     345    Class HstDisplay -parameter {
    196346        {number}
    197347        {master}
    198     }
    199 
    200 # -------------------------------------------------------------------------
    201 
    202     OscDisplay instproc init {} {
    203         my instvar data xvec yvec
    204 
    205         set xvec [vector #auto]
    206         set yvec [vector #auto]
    207         # fill one vector for the x axis with 1025 points
    208         $xvec seq 0 1024
    209 
    210         my reset
     348        {controller}
     349    }
     350
     351# -------------------------------------------------------------------------
     352
     353    HstDisplay instproc init {} {
     354
     355        my set data {}
     356
     357        vector create [myvar xvec](4096)
     358        vector create [myvar yvec](4096)
     359
     360        # fill one vector for the x axis with 4096 points
     361        [myvar xvec] seq -0.5 4095.5
    211362
    212363        my setup
     
    217368# -------------------------------------------------------------------------
    218369
    219     OscDisplay instproc destroy {} {
     370    HstDisplay instproc destroy {} {
    220371        next
    221372    }
     
    223374# -------------------------------------------------------------------------
    224375
    225     OscDisplay instproc reset {} {
    226         my instvar data xvec yvec
    227 
    228         set data {}
    229 
    230         $yvec set {}
    231     }
    232 
    233 # -------------------------------------------------------------------------
    234 
    235     OscDisplay instproc start {} {
    236         my instvar config trig_mux disp_mux
    237 
    238         set trig_mux 2
    239         set disp_mux 2
     376    HstDisplay instproc start {} {
     377        my instvar config
    240378
    241379        trace add variable [myvar data] write [myproc data_update]
    242         trace add variable [myvar auto] write [myproc auto_update]
     380        trace add variable [myvar cntr_val] write [myproc cntr_val_update]
     381        trace add variable [myvar rate_val] write [myproc rate_val_update]
     382
     383        trace add variable [myvar axis] write [myproc axis_update]
    243384        trace add variable [myvar thrs] write [myproc thrs_update]
    244         trace add variable [myvar thrs_val] write [myproc thrs_val_update]
    245         trace add variable [myvar disp_val] write [myproc disp_val_update]
    246         trace add variable [myvar trig_val] write [myproc trig_val_update]
    247 
    248         ${config}.auto_check select
     385        trace add variable [myvar thrs_val] write [myproc thrs_update]
     386
     387        ${config}.axis_check select
     388
    249389        ${config}.thrs_check select
    250         ${config}.thrs_field set 1278
    251         ${config}.disp_uwt2 select
    252         ${config}.trig_uwt2 select
    253     }
    254 
    255 # -------------------------------------------------------------------------
    256 
    257     OscDisplay instproc setup {} {
     390        ${config}.thrs_field set 25
     391
     392        set cntr_tmp 1200000000
     393        my set cntr_val $cntr_tmp
     394        my set cntr_bak $cntr_tmp
     395        my set cntr_old $cntr_tmp
     396        my set yvec_bak 0.0
     397        my set yvec_old 0.0
     398
     399        my set rate_val(inst) 0.0
     400        my set rate_val(mean) 0.0
     401
     402#        my cntr_reset
     403    }
     404
     405# -------------------------------------------------------------------------
     406
     407    HstDisplay instproc setup {} {
    258408        my instvar number master
    259         my instvar data xvec yvec
    260         my instvar config auto thrs thrs_val disp_val trig_val
     409        my instvar xvec yvec graph
     410        my instvar config thrs thrs_val
     411        my instvar cntr_h cntr_m cntr_s
    261412
    262413        # create a graph widget and show a grid
    263414        set graph [graph ${master}.graph -height 250 -leftmargin 80]
    264         $graph crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    265         $graph grid configure -hide no
    266         $graph legend configure -hide yes
    267         $graph axis configure x -min 0 -max 1024
    268         $graph axis configure y -min 0 -max 4100
    269 
    270         set config [frame ${master}.config]
    271 
    272         checkbutton ${config}.auto_check -text {auto update} -variable [myvar auto]
    273 
    274         frame ${config}.spc1 -width 10 -height 10
    275 
    276         checkbutton ${config}.thrs_check -text threshold -variable [myvar thrs]
    277         spinbox ${config}.thrs_field -from 1 -to 4095 \
    278             -increment 5 -width 10 -textvariable [myvar thrs_val] \
    279             -validate all -vcmd {::mca::validate 4095 %P}
    280 
    281         frame ${config}.spc2 -width 10 -height 10
    282 
    283         label ${config}.disp -text {display input}
    284         radiobutton ${config}.disp_data -text {raw data} -variable [myvar disp_val] -value data
    285         radiobutton ${config}.disp_uwt1 -text {filter 1} -variable [myvar disp_val] -value uwt1
    286         radiobutton ${config}.disp_uwt2 -text {filter 2} -variable [myvar disp_val] -value uwt2
    287         radiobutton ${config}.disp_uwt3 -text {filter 3} -variable [myvar disp_val] -value uwt3
    288         radiobutton ${config}.disp_base -text {baseline} -variable [myvar disp_val] -value base
    289 #        radiobutton ${config}.disp_sum8 -text {sum of 8} -variable [myvar disp_val] -value sum8
    290 
    291         frame ${config}.spc3 -width 10 -height 10
    292 
    293         label ${config}.trig -text {trigger input}
    294         radiobutton ${config}.trig_data -text {raw data} -variable [myvar trig_val] -value data
    295         radiobutton ${config}.trig_uwt1 -text {filter 1} -variable [myvar trig_val] -value uwt1
    296         radiobutton ${config}.trig_uwt2 -text {filter 2} -variable [myvar trig_val] -value uwt2
    297         radiobutton ${config}.trig_uwt3 -text {filter 3} -variable [myvar trig_val] -value uwt3
    298         radiobutton ${config}.trig_base -text {baseline} -variable [myvar trig_val] -value base
    299 #        radiobutton ${config}.trig_sum8 -text {sum of 8} -variable [myvar trig_val] -value sum8
    300 
    301         frame ${config}.spc4 -width 10 -height 10
    302 
    303         button ${config}.acquire -text Acquire \
    304             -bg green -activebackground green -command [myproc acquire]
    305         button ${config}.restart -text Restart \
    306             -bg yellow -activebackground yellow -command [myproc restart]
    307         button ${config}.register -text Register \
    308             -bg lightblue -activebackground lightblue -command [myproc register]
    309 
    310         grid ${config}.auto_check -sticky w
    311         grid ${config}.spc1
    312         grid ${config}.thrs_check -sticky w
    313         grid ${config}.thrs_field -sticky ew -pady 1 -padx 5
    314         grid ${config}.spc2
    315         grid ${config}.disp -sticky w -pady 1 -padx 3
    316         grid ${config}.disp_data -sticky w
    317         grid ${config}.disp_uwt1 -sticky w
    318         grid ${config}.disp_uwt2 -sticky w
    319         grid ${config}.disp_uwt3 -sticky w
    320         grid ${config}.disp_base -sticky w
    321 #        grid ${config}.disp_sum8 -sticky w
    322         grid ${config}.spc3
    323         grid ${config}.trig -sticky w -pady 1 -padx 3
    324         grid ${config}.trig_data -sticky w
    325         grid ${config}.trig_uwt1 -sticky w
    326         grid ${config}.trig_uwt2 -sticky w
    327         grid ${config}.trig_uwt3 -sticky w
    328         grid ${config}.trig_base -sticky w
    329 #        grid ${config}.disp_sum8 -sticky w
    330         grid ${config}.spc4
    331         grid ${config}.acquire -sticky ew -pady 3 -padx 5
    332         grid ${config}.restart -sticky ew -pady 3 -padx 5
    333         grid ${config}.register -sticky ew -pady 3 -padx 5
    334 
    335         grid ${graph} -row 0 -column 0 -sticky news
    336         grid ${config} -row 0 -column 1
    337 
    338         grid rowconfigure ${master} 0 -weight 1
    339         grid columnconfigure ${master} 0 -weight 1
    340         grid columnconfigure ${master} 1 -weight 0 -minsize 80
    341 
    342         # enable zooming
    343         Blt_ZoomStack $graph
    344 
    345         #bind .graph <Motion> {%W crosshairs configure -position @%x,%y}
    346 
    347         # create one element with data for the x and y axis, no dots
    348         $graph element create Spectrum1 -symbol none -xdata $xvec -ydata $yvec
    349     }
    350 
    351 # -------------------------------------------------------------------------
    352 
    353     OscDisplay instproc data_update args {
    354         my instvar data yvec
    355         $yvec set $data
    356     }
    357 
    358 # -------------------------------------------------------------------------
    359 
    360     OscDisplay instproc auto_update args {
    361         my instvar config auto after_handle
    362 
    363         if {$auto} {
    364             ${config}.acquire configure -state disabled
    365             ${config}.restart configure -state disabled
    366             ${config}.register configure -state disabled
    367 
    368             my acquire_restart_loop
    369         } else {
    370             if {[my exists after_handle]} {
    371                 after cancel $after_handle
    372             }
    373             ${config}.acquire configure -state active
    374             ${config}.restart configure -state active
    375             ${config}.register configure -state active
    376         }
    377     }
    378 
    379 # -------------------------------------------------------------------------
    380 
    381     OscDisplay instproc thrs_update args {
    382         my instvar config number thrs thrs_val
    383 
    384         set val_addr [format %04x [expr {17 + ${number}}]]
    385 
    386         if {$thrs} {
    387             ${config}.thrs_field configure -state normal
    388             my thrs_val_update
    389         } else {
    390             ${config}.thrs_field configure -state disabled
    391             my usbCmd ${val_addr}0000
    392         }
    393     }
    394 
    395 # -------------------------------------------------------------------------
    396 
    397     OscDisplay instproc thrs_val_update args {
    398         my instvar config number thrs_val
    399 
    400         if {[string equal $thrs_val {}]} {
    401             set thrs_val 0
    402         }
    403 
    404         set val_addr [format %04x [expr {17 + ${number}}]]
    405         set value [format %04x $thrs_val]
    406 
    407         my usbCmd ${val_addr}${value}
    408     }
    409 
    410 # -------------------------------------------------------------------------
    411 
    412     OscDisplay instproc mux {} {
    413         my instvar trig_mux disp_mux
    414 
    415         format {00%x%x} $trig_mux $disp_mux
    416     }
    417 
    418 # ------------------------------------------------------------------------
    419 
    420     OscDisplay instproc disp_val_update args {
    421         my instvar number disp_val disp_mux
    422 
    423         set mux_addr [format %04x [expr {20 + ${number}}]]
    424 
    425         switch -- $disp_val {
    426             data {
    427                 set disp_mux 0
    428                 my usbCmd ${mux_addr}[my mux]
    429             }
    430             uwt1 {
    431                 set disp_mux 1
    432                 my usbCmd ${mux_addr}[my mux]
    433             }
    434             uwt2 {
    435                 set disp_mux 2
    436                 my usbCmd ${mux_addr}[my mux]
    437             }
    438             uwt3 {
    439                 set disp_mux 3
    440                 my usbCmd ${mux_addr}[my mux]
    441             }
    442             base {
    443                 set disp_mux 4
    444                 my usbCmd ${mux_addr}[my mux]
    445             }
    446         }
    447     }
    448 
    449 # ------------------------------------------------------------------------
    450 
    451     OscDisplay instproc trig_val_update args {
    452         my instvar number trig_val trig_mux
    453 
    454         set mux_addr [format %04x [expr {20 + ${number}}]]
    455 
    456         switch -- $trig_val {
    457             data {
    458                 set trig_mux 0
    459                 my usbCmd ${mux_addr}[my mux]
    460             }
    461             uwt1 {
    462                 set trig_mux 1
    463                 my usbCmd ${mux_addr}[my mux]
    464             }
    465             uwt2 {
    466                 set trig_mux 2
    467                 my usbCmd ${mux_addr}[my mux]
    468             }
    469             uwt3 {
    470                 set trig_mux 3
    471                 my usbCmd ${mux_addr}[my mux]
    472             }
    473             base {
    474                 set trig_mux 4
    475                 my usbCmd ${mux_addr}[my mux]
    476             }
    477         }
    478     }
    479 
    480 # -------------------------------------------------------------------------
    481 
    482     OscDisplay instproc save_data {data} {
    483         set file [tk_getSaveFile]
    484         if {[string equal $file {}]} {
    485             return
    486         }
    487 
    488         set x [catch {set fid [open $file w+]}]
    489         set y [catch {puts $fid $data}]
    490         set z [catch {close $fid}]
    491 
    492         if { $x || $y || $z || ![file exists $file] || ![file isfile $file] || ![file readable $file] } {
    493             tk_messageBox -icon error \
    494                 -message "An error occurred while writing to \"$file\""
    495         } else {
    496             tk_messageBox -icon info \
    497                 -message "File \"$file\" written successfully"
    498         }
    499     }
    500 
    501 # -------------------------------------------------------------------------
    502 
    503     OscDisplay instproc acquire {} {
    504         my instvar number
    505         my usbCmdRead 0002000${number} 2 1024
    506    }
    507 
    508 # -------------------------------------------------------------------------
    509 
    510     OscDisplay instproc restart {} {
    511         my instvar number
    512         my usbCmd 0001000${number}
    513     }
    514 
    515 # -------------------------------------------------------------------------
    516 
    517     OscDisplay instproc register {} {
    518         my save_data [my set data]
    519     }
    520 
    521 # -------------------------------------------------------------------------
    522 
    523     OscDisplay instproc acquire_restart_loop {} {
    524         my instvar number after_handle
    525 
    526         my acquire
    527         my restart
    528 
    529         set after_handle [after 1000 [myproc acquire_restart_loop]]
    530     }
    531 
    532 # -------------------------------------------------------------------------
    533 
    534     Class HstDisplay -superclass Display -parameter {
    535         {number}
    536         {master}
    537     }
    538 
    539 # -------------------------------------------------------------------------
    540 
    541     HstDisplay instproc init {} {
    542         my instvar data xvec yvec
    543 
    544         set xvec [vector #auto]
    545         set yvec [vector #auto]
    546         # fill one vector for the x axis with 4097 points
    547         $xvec seq 0 4096
    548 
    549         my reset
    550 
    551         my setup
    552 
    553         next
    554     }
    555 
    556 # -------------------------------------------------------------------------
    557 
    558     HstDisplay instproc destroy {} {
    559         next
    560     }
    561 
    562 # -------------------------------------------------------------------------
    563 
    564     HstDisplay instproc reset {} {
    565         my instvar data xvec yvec
    566 
    567         set data {}
    568 
    569         $yvec set {}
    570     }
    571 
    572 # -------------------------------------------------------------------------
    573 
    574     HstDisplay instproc start {} {
    575         my instvar config base_mux peak_mux
    576 
    577         set base_mux 0
    578         set peak_mux 1
    579 
    580         trace add variable [myvar axis] write [myproc axis_update]
    581         trace add variable [myvar data] write [myproc data_update]
    582         trace add variable [myvar auto] write [myproc auto_update]
    583         trace add variable [myvar peak] write [myproc peak_update]
    584         trace add variable [myvar thrs] write [myproc thrs_update]
    585         trace add variable [myvar thrs_val] write [myproc thrs_val_update]
    586         trace add variable [myvar base] write [myproc base_update]
    587         trace add variable [myvar base_typ] write [myproc base_typ_update]
    588         trace add variable [myvar base_val] write [myproc base_val_update]
    589 
    590         ${config}.axis_check deselect
    591         ${config}.auto_check select
    592         ${config}.peak_check select
    593 
    594         ${config}.thrs_check select
    595         ${config}.thrs_field set 1278
    596 
    597         ${config}.base_const select
    598         ${config}.base_field set 35
    599         ${config}.base_check deselect
    600     }
    601 
    602 # -------------------------------------------------------------------------
    603 
    604     HstDisplay instproc setup {} {
    605         my instvar number master
    606         my instvar data xvec yvec graph
    607         my instvar config auto thrs thrs_val base base_typ base_val
    608 
    609         # create a graph widget and show a grid
    610         set graph [graph ${master}.graph -height 250 -leftmargin 80]
    611         $graph crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
     415        $graph crosshairs configure -hide no -linewidth 1 -color darkblue -dashes {2 2}
    612416        $graph grid configure -hide no
    613417        $graph legend configure -hide yes
    614418        $graph axis configure x -min 0 -max 4096
    615419
    616         set config [frame ${master}.config]
     420        set config [frame ${master}.config -width 170]
    617421
    618422        checkbutton ${config}.axis_check -text {log scale} -variable [myvar axis]
    619423
    620         frame ${config}.spc1 -width 10 -height 10
    621 
    622         checkbutton ${config}.auto_check -text {auto update} -variable [myvar auto]
    623 
    624         frame ${config}.spc2 -width 10 -height 10
    625 
    626         checkbutton ${config}.peak_check -text {peak detect} -variable [myvar peak]
    627 
    628         frame ${config}.spc3 -width 10 -height 10
    629 
    630         checkbutton ${config}.thrs_check -text threshold -variable [myvar thrs]
     424        frame ${config}.spc1 -width 170 -height 30
     425
     426        frame ${config}.rate_frame -borderwidth 0 -width 170
     427        legendLabel ${config}.rate_frame 0 inst {Inst. rate, 1/s}
     428        legendLabel ${config}.rate_frame 1 mean {Avg. rate, 1/s}
     429
     430        frame ${config}.spc2 -width 170 -height 30
     431
     432        frame ${config}.chan_frame -borderwidth 0 -width 170
     433        legendLabel ${config}.chan_frame 0 entr  {Total entries}
     434        legendLabel ${config}.chan_frame 1 empty {}
     435        legendLabel ${config}.chan_frame 2 axisy {Bin entries}
     436        legendLabel ${config}.chan_frame 3 axisx {Bin number}
     437
     438        frame ${config}.spc3 -width 170 -height 30
     439
     440        checkbutton ${config}.thrs_check -text {amplitude threshold} -variable [myvar thrs]
    631441        spinbox ${config}.thrs_field -from 1 -to 4095 \
    632442            -increment 5 -width 10 -textvariable [myvar thrs_val] \
    633             -validate all -vcmd {::mca::validate 4095 %P}
    634 
    635         frame ${config}.spc4 -width 10 -height 10
    636 
    637         checkbutton ${config}.base_check -text baseline -variable [myvar base]
    638         radiobutton ${config}.base_auto -text automatic -variable [myvar base_typ] -value auto
    639         radiobutton ${config}.base_const -text constant -variable [myvar base_typ] -value const
    640         spinbox ${config}.base_field -from 1 -to 4095 \
    641             -increment 5 -width 10 -textvariable [myvar base_val] \
    642             -validate all -vcmd {::mca::validate 4095 %P}
    643 
    644         frame ${config}.spc5 -width 10 -height 10
    645 
    646         button ${config}.acquire -text Acquire \
    647             -bg green -activebackground green -command [myproc acquire]
    648         button ${config}.restart -text Restart \
    649             -bg yellow -activebackground yellow -command [myproc restart]
     443            -validate all -vcmd {::mca::validate 4095 4 %P}
     444
     445        frame ${config}.spc4 -width 170 -height 30
     446
     447        label ${config}.cntr -text {time of exposure}
     448        frame ${config}.cntr_frame -borderwidth 0 -width 170
     449
     450        label ${config}.cntr_frame.h -width 3 -anchor w -text {h}
     451        entry ${config}.cntr_frame.h_field -width 3 -textvariable [myvar cntr_h] \
     452            -validate all -vcmd {::mca::validate 999 3 %P}
     453        label ${config}.cntr_frame.m -width 3 -anchor w -text {m}
     454        entry ${config}.cntr_frame.m_field -width 3 -textvariable [myvar cntr_m] \
     455            -validate all -vcmd {::mca::validate 59 2 %P}
     456        label ${config}.cntr_frame.s -width 3 -anchor w -text {s}
     457        entry ${config}.cntr_frame.s_field -width 6 -textvariable [myvar cntr_s] \
     458            -validate all -vcmd {::mca::doublevalidate 59.999 %P}
     459
     460        grid ${config}.cntr_frame.h_field ${config}.cntr_frame.h \
     461            ${config}.cntr_frame.m_field ${config}.cntr_frame.m ${config}.cntr_frame.s_field ${config}.cntr_frame.s
     462
     463        frame ${config}.spc5 -width 170 -height 10
     464
     465        button ${config}.start -text Start \
     466            -bg yellow -activebackground yellow -command [myproc cntr_start]
     467        button ${config}.reset -text Reset \
     468            -bg red -activebackground red -command [myproc cntr_reset]
     469
     470        frame ${config}.spc6 -width 170 -height 30
     471
     472
    650473        button ${config}.register -text Register \
    651474            -bg lightblue -activebackground lightblue -command [myproc register]
     
    653476        grid ${config}.axis_check -sticky w
    654477        grid ${config}.spc1
    655         grid ${config}.auto_check -sticky w
     478        grid ${config}.rate_frame -sticky ew -padx 5
    656479        grid ${config}.spc2
    657         grid ${config}.peak_check -sticky w
     480        grid ${config}.chan_frame -sticky ew -padx 5
    658481        grid ${config}.spc3
    659482        grid ${config}.thrs_check -sticky w
    660483        grid ${config}.thrs_field -sticky ew -pady 1 -padx 5
    661484        grid ${config}.spc4
    662         grid ${config}.base_check -sticky w
    663         grid ${config}.base_auto -sticky w
    664         grid ${config}.base_const -sticky w
    665         grid ${config}.base_field -sticky ew -pady 1 -padx 5
     485        grid ${config}.cntr -sticky w -pady 1 -padx 3
     486        grid ${config}.cntr_frame -sticky ew -padx 5
    666487        grid ${config}.spc5
    667         grid ${config}.acquire -sticky ew -pady 3 -padx 5
    668         grid ${config}.restart -sticky ew -pady 3 -padx 5
     488        grid ${config}.start -sticky ew -pady 3 -padx 5
     489        grid ${config}.reset -sticky ew -pady 3 -padx 5
     490        grid ${config}.spc6
    669491        grid ${config}.register -sticky ew -pady 3 -padx 5
    670492
     
    676498        grid columnconfigure ${master} 1 -weight 0 -minsize 80
    677499
     500        grid columnconfigure ${config}.rate_frame 1 -weight 1
     501        grid columnconfigure ${config}.chan_frame 1 -weight 1
     502
    678503        # enable zooming
    679504        Blt_ZoomStack $graph
    680505
     506        my crosshairs $graph
     507
    681508        #bind .graph <Motion> {%W crosshairs configure -position @%x,%y}
    682509
    683510        # create one element with data for the x and y axis, no dots
    684         $graph element create Spectrum1 -symbol none -smooth step -xdata $xvec -ydata $yvec
     511        $graph element create Spectrum1 -color blue -linewidth 2 -symbol none -smooth step -xdata [myvar xvec] -ydata [myvar yvec]
     512    }
     513
     514# -------------------------------------------------------------------------
     515
     516    HstDisplay instproc coor_update {W x y} {
     517        my instvar config graph
     518
     519        $W crosshairs configure -position @${x},${y}
     520
     521        set index [$W axis invtransform x $x]
     522        set index [::tcl::mathfunc::round $index]
     523        catch {
     524            ${config}.chan_frame.axisy_value configure -text [[myvar yvec] index $index]
     525            ${config}.chan_frame.axisx_value configure -text ${index}.0
     526        }
     527    }
     528# -------------------------------------------------------------------------
     529
     530    HstDisplay instproc crosshairs {graph} {
     531        set method [myproc coor_update]
     532        bind $graph <Motion> [list [self] coor_update %W %x %y]
     533        bind $graph <Leave> {
     534            %W crosshairs off
     535        }
     536        bind $graph <Enter> {
     537            %W crosshairs on
     538        }
    685539    }
    686540
     
    698552# -------------------------------------------------------------------------
    699553
    700     HstDisplay instproc data_update args {
    701         my instvar data yvec
    702         $yvec set $data
    703     }
    704 
    705 # -------------------------------------------------------------------------
    706 
    707     HstDisplay instproc auto_update args {
    708         my instvar auto after_handle
    709         my instvar config
    710         if {$auto} {
    711             ${config}.acquire configure -state disabled
    712             ${config}.register configure -state disabled
    713 
    714             my acquire_loop
    715         } else {
    716             if {[my exists after_handle]} {
    717                 after cancel $after_handle
    718             }
    719             ${config}.acquire configure -state active
    720             ${config}.register configure -state active
    721         }
    722     }
    723 
    724 # -------------------------------------------------------------------------
    725 
    726     HstDisplay instproc mux {} {
    727         my instvar base_mux peak_mux
    728 
    729         format {00%x%x} $base_mux $peak_mux
    730     }
    731 
    732 # -------------------------------------------------------------------------
    733 
    734     HstDisplay instproc peak_update args {
    735         my instvar number peak peak_mux
    736 
    737         set mux_addr [format %04x [expr {23 + ${number}}]]
    738 
    739         if {$peak} {
    740             set peak_mux 1
    741             my usbCmd ${mux_addr}[my mux]
    742         } else {
    743             set peak_mux 0
    744             my usbCmd ${mux_addr}[my mux]
    745         }
    746     }
    747 
    748 # -------------------------------------------------------------------------
    749 
    750554    HstDisplay instproc thrs_update args {
    751         my instvar config number thrs thrs_val
    752 
    753         set val_addr [format %04x [expr {14 + ${number}}]]
     555        my instvar controller config number thrs thrs_val
     556
     557        if {[string equal $thrs_val {}]} {
     558            set thrs_val 0
     559        }
     560
     561        set val_addr [format %02x [expr {6 + 2 * ${number}}]]
    754562
    755563        if {$thrs} {
    756564            ${config}.thrs_field configure -state normal
    757             my thrs_val_update
     565            set value [format %03x $thrs_val]
    758566        } else {
    759567            ${config}.thrs_field configure -state disabled
    760             my usbCmd ${val_addr}0000
    761         }
    762     }
    763 
    764 # -------------------------------------------------------------------------
    765 
    766     HstDisplay instproc thrs_val_update args {
    767         my instvar config number thrs_val
     568            set value 000
     569        }
     570
     571        $controller usbCmd 000200${val_addr}00040${value}
     572    }
     573
     574# -------------------------------------------------------------------------
     575
     576    HstDisplay instproc rate_val_update {name key op} {
     577        my instvar config rate_val
     578
     579        ${config}.rate_frame.${key}_value configure -text [format {%.2e} $rate_val(${key})]
     580    }
     581
     582# -------------------------------------------------------------------------
     583
     584    HstDisplay instproc cntr_val_update args {
     585        my instvar cntr_val cntr_h cntr_m cntr_s
     586
     587        set cntr_tmp [expr {${cntr_val}/20000}]
     588        set cntr_h [expr {${cntr_tmp}/3600000}]
     589        set cntr_m [expr {${cntr_tmp}%3600000/60000}]
     590        set cntr_s [expr {${cntr_tmp}%3600000%60000/1000.0}]
     591    }
     592
     593# -------------------------------------------------------------------------
     594
     595    HstDisplay instproc cntr_setup {} {
     596        my instvar controller number cntr_val
     597
     598        set word0 [format %08x [expr {${cntr_val} & 0xFFFFFFFF}]]
     599        set word1 [format %08x [expr {${cntr_val} >> 32}]]
     600
     601        set prefix [format %x [expr {5 + ${number}}]]
     602
     603        set command {}
     604        append command 0001${prefix}000000200000004[string range $word0 4 7]
     605        append command 0001${prefix}000000200010004[string range $word0 0 3]
     606        append command 0001${prefix}000000200020004[string range $word1 4 7]
     607        append command 0001${prefix}000000200030004[string range $word1 0 3]
     608
     609        # send counter value
     610        $controller usbCmd $command
     611
     612        # load counter value
     613#        set val_addr [format %02x [expr {12 + ${number}}]]
     614#        $controller usbCmd 000200${val_addr}00040001000200${val_addr}00040000
     615    }
     616
     617# -------------------------------------------------------------------------
     618
     619    HstDisplay instproc cntr_reset {} {
     620        my instvar controller number after_handle
     621        my instvar cntr_val cntr_bak cntr_old yvec_bak yvec_old
     622
     623        my cntr_stop
     624
     625        set value [format %04x [expr {1 << (5 + ${number})}]]
     626        $controller usbCmd 000200000004${value}0002000000040000
     627
     628        set cntr_val $cntr_bak
     629        my cntr_setup
     630
     631        set cntr_old $cntr_bak
     632        set yvec_bak 0.0
     633        set yvec_old 0.0
     634       
     635        my acquire
     636
     637        my cntr_ready
     638    }
     639
     640# -------------------------------------------------------------------------
     641
     642    HstDisplay instproc cntr_ready {} {
     643        my instvar config cntr_val cntr_bak
     644
     645        set cntr_val $cntr_bak
     646
     647        ${config}.start configure -text Start -command [myproc cntr_start]
     648        ${config}.reset configure -state active
     649
     650        ${config}.cntr_frame.h_field configure -state normal
     651        ${config}.cntr_frame.m_field configure -state normal
     652        ${config}.cntr_frame.s_field configure -state normal
     653    }
     654
     655# -------------------------------------------------------------------------
     656
     657    HstDisplay instproc cntr_start {} {
     658        my instvar config
     659        my instvar cntr_h cntr_m cntr_s
     660        my instvar cntr_val cntr_bak cntr_old yvec_bak yvec_old
     661
     662        set h $cntr_h
     663        set m $cntr_m
     664        set s $cntr_s
     665
     666        if {[string equal $h {}]} {
     667            set h 0
     668        }
     669        if {[string equal $m {}]} {
     670            set m 0
     671        }
     672        if {[string equal $s {}]} {
     673            set s 0
     674        }
     675
     676        set cntr_tmp [expr {${h}*3600000 + ${m}*60000 + ${s}*1000}]
     677        set cntr_tmp [expr {entier(20000 * ${cntr_tmp})}]
     678
     679        if {$cntr_tmp > 0} {
     680            ${config}.cntr_frame.h_field configure -state disabled
     681            ${config}.cntr_frame.m_field configure -state disabled
     682            ${config}.cntr_frame.s_field configure -state disabled
     683
     684            set cntr_val $cntr_tmp
     685            set cntr_bak $cntr_tmp
     686            set cntr_old $cntr_tmp
     687            set yvec_bak [usb::integrateBlt [myvar yvec] 0]
     688            set yvec_old $yvec_bak
     689
     690            my cntr_setup
     691
     692            my cntr_resume
     693        }
     694    }
     695
     696# -------------------------------------------------------------------------
     697
     698    HstDisplay instproc cntr_pause {} {
     699        my instvar config
     700
     701        my cntr_stop
     702
     703        ${config}.start configure -text Resume -command [myproc cntr_resume]
     704#        ${config}.reset configure -state active
     705
     706    }
     707
     708# -------------------------------------------------------------------------
     709
     710    HstDisplay instproc cntr_resume {} {
     711        my instvar controller config number auto
     712
     713        set val_addr [format %02x [expr {13 + ${number}}]]
     714
     715        ${config}.start configure -text Pause -command [myproc cntr_pause]
     716#        ${config}.reset configure -state disabled
     717
     718        $controller usbCmd 000200${val_addr}00040002
     719
     720        set auto 1
     721
     722        after 100 [myproc acquire_loop]
     723    }
     724
     725# -------------------------------------------------------------------------
     726
     727    HstDisplay instproc cntr_stop {} {
     728        my instvar controller config number auto
     729
     730        set val_addr [format %02x [expr {13 + ${number}}]]
     731
     732        $controller usbCmd 000200${val_addr}00040000
     733
     734        set auto 0
     735    }
     736
     737# -------------------------------------------------------------------------
     738
     739    HstDisplay instproc data_update args {
     740        my instvar data
     741        usb::convertBlt $data 4 [myvar yvec]
     742    }
     743
     744# -------------------------------------------------------------------------
     745
     746    HstDisplay instproc acquire_loop {} {
     747        my instvar cntr_val auto
     748
     749        my acquire
     750
     751        if {$cntr_val == 0} {
     752            my cntr_stop
     753            my cntr_ready
     754        } elseif {$auto} {
     755            after 1000 [myproc acquire_loop]
     756        }
     757    }
     758
     759# -------------------------------------------------------------------------
     760
     761    HstDisplay instproc acquire {} {
     762        my instvar controller config number
     763        my instvar cntr_val cntr_bak cntr_old yvec_bak yvec_old rate_val
     764
     765        set size 4096
     766
     767        set prefix [format {%x} [expr {$number + 2}]]
     768
     769        set value [format {%08x} [expr {$size * 2}]]
     770
     771        set command 0001${prefix}000000200000001[string range $value 0 3]0003[string range $value 4 7]00050000
     772
     773        $controller usbCmdReadRaw $command [expr {$size * 4}] [myvar data]
     774        set yvec_new [usb::integrateBlt [myvar yvec] 0]
     775
     776        set prefix [format {%x} [expr {$number + 5}]]
     777        set command 0001${prefix}000000200000003000400050000
     778
     779        $controller usbCmdReadHex $command 8 1 [myvar cntr_val]
     780        set cntr_new $cntr_val
     781
     782        if {$cntr_new < $cntr_old} {
     783            set rate_val(inst) [expr {($yvec_new - $yvec_old)*20000000/($cntr_old - $cntr_new)}]
     784            set rate_val(mean) [expr {($yvec_new - $yvec_bak)*20000000/($cntr_bak - $cntr_new)}]
     785            ${config}.chan_frame.entr_value configure -text $yvec_new
     786
     787            set yvec_old $yvec_new
     788            set cntr_old $cntr_new
     789        }
     790   }
     791
     792# -------------------------------------------------------------------------
     793
     794    HstDisplay instproc save_data {data} {
     795        my instvar number
     796
     797        set types {
     798            {{Data Files}       {.dat}        }
     799            {{All Files}        *             }
     800        }
     801
     802        set stamp [clock format [clock seconds] -format %Y%m%d_%H%M%S]
     803        set fname spectrum_[expr {$number + 1}]_${stamp}.dat
     804
     805        set fname [tk_getSaveFile -filetypes $types -initialfile $fname]
     806        if {[string equal $fname {}]} {
     807            return
     808        }
     809
     810        set x [catch {
     811            set fid [open $fname w+]
     812            puts $fid $data
     813            close $fid
     814        }]
     815
     816        if { $x || ![file exists $fname] || ![file isfile $fname] || ![file readable $fname] } {
     817            tk_messageBox -icon error \
     818                -message "An error occurred while writing to \"$fname\""
     819        } else {
     820            tk_messageBox -icon info \
     821                -message "File \"$fname\" written successfully"
     822        }
     823    }
     824
     825# -------------------------------------------------------------------------
     826
     827    HstDisplay instproc register {} {
     828        my save_data [join [[myvar yvec] range 0 4095] \n]
     829    }
     830
     831# -------------------------------------------------------------------------
     832
     833    Class CntDisplay -parameter {
     834        {master}
     835        {controller}
     836    }
     837
     838# -------------------------------------------------------------------------
     839
     840    CntDisplay instproc init {} {
     841
     842        my set data {}
     843        my set cntr 0
     844        my set recs 0
     845
     846        vector create [myvar xvec](16384)
     847        vector create [myvar yvec](16384)
     848
     849        # fill one vector for the x axis with 16384 points
     850        [myvar xvec] seq -0.5 16384.5
     851
     852        my setup
     853
     854        next
     855    }
     856
     857# -------------------------------------------------------------------------
     858
     859    CntDisplay instproc destroy {} {
     860        next
     861    }
     862
     863# -------------------------------------------------------------------------
     864
     865    CntDisplay instproc start {} {
     866        my instvar config
     867
     868        trace add variable [myvar data] write [myproc data_update]
     869
     870        trace add variable [myvar thrs] write [myproc thrs_update]
     871        trace add variable [myvar thrs_val] write [myproc thrs_update]
     872
     873        trace add variable [myvar cntr] write [myproc cntr_update]
     874        trace add variable [myvar recs] write [myproc recs_update]
     875
     876        trace add variable [myvar axis] write [myproc axis_update]
     877
     878        ${config}.axis_check select
     879
     880        ${config}.thrs_check select
     881        ${config}.thrs_field set 25
     882
     883        my set cntr_val 100
     884        my set cntr_bak 100
     885        my set recs_val 100
     886        my set recs_bak 100
     887
     888#        my cntr_reset
     889    }
     890
     891# -------------------------------------------------------------------------
     892
     893    CntDisplay instproc setup {} {
     894        my instvar master
     895        my instvar xvec yvec graph
     896        my instvar config
     897        my instvar cntr_ms
     898
     899        # create a graph widget and show a grid
     900        set graph [graph ${master}.graph -height 250 -leftmargin 80]
     901        $graph crosshairs configure -hide no -linewidth 1 -color darkblue -dashes {2 2}
     902        $graph grid configure -hide no
     903        $graph legend configure -hide yes
     904        $graph axis configure x -min 0 -max 16384
     905
     906        set config [frame ${master}.config -width 170]
     907
     908        checkbutton ${config}.axis_check -text {log scale} -variable [myvar axis]
     909
     910        frame ${config}.spc1 -width 170 -height 30
     911
     912        frame ${config}.chan_frame -borderwidth 0 -width 170
     913        legendLabel ${config}.chan_frame 0 mean  {Mean value}
     914        legendLabel ${config}.chan_frame 1 entr  {Total entries}
     915        legendLabel ${config}.chan_frame 2 empty {}
     916        legendLabel ${config}.chan_frame 3 axisy {Bin entries}
     917        legendLabel ${config}.chan_frame 4 axisx {Bin number}
     918
     919        frame ${config}.spc3 -width 170 -height 30
     920
     921        checkbutton ${config}.thrs_check -text {amplitude threshold} -variable [myvar thrs]
     922        spinbox ${config}.thrs_field -from 1 -to 4095 \
     923            -increment 5 -width 10 -textvariable [myvar thrs_val] \
     924            -validate all -vcmd {::mca::validate 4095 4 %P}
     925
     926        frame ${config}.spc4 -width 170 -height 30
     927
     928        label ${config}.cntr -text {time of exposure (ms)}
     929        spinbox ${config}.cntr_field -from 0 -to 9999 \
     930            -increment 10 -width 10 -textvariable [myvar cntr_val] \
     931            -validate all -vcmd {::mca::validate 9999 4 %P}
     932
     933        frame ${config}.spc5 -width 170 -height 10
     934
     935        label ${config}.recs -text {number of exposures}
     936        spinbox ${config}.recs_field -from 0 -to 99999 \
     937            -increment 10 -width 10 -textvariable [myvar recs_val] \
     938            -validate all -vcmd {::mca::validate 99999 5 %P}
     939
     940        frame ${config}.spc6 -width 170 -height 10
     941
     942        button ${config}.start -text {Start}  \
     943            -bg yellow -activebackground yellow -command [myproc recs_start]
     944
     945        button ${config}.reset -text Reset \
     946            -bg red -activebackground red -command [myproc cntr_reset]
     947
     948        frame ${config}.spc7 -width 170 -height 30
     949
     950        button ${config}.register -text Register \
     951            -bg lightblue -activebackground lightblue -command [myproc register]
     952
     953        grid ${config}.axis_check -sticky w
     954        grid ${config}.spc1
     955        grid ${config}.chan_frame -sticky ew -padx 5
     956        grid ${config}.spc3
     957        grid ${config}.thrs_check -sticky w
     958        grid ${config}.thrs_field -sticky ew -pady 1 -padx 5
     959        grid ${config}.spc4
     960        grid ${config}.cntr -sticky w -pady 1 -padx 3
     961        grid ${config}.cntr_field -sticky ew -pady 1 -padx 5
     962        grid ${config}.spc5
     963        grid ${config}.recs -sticky w -pady 1 -padx 3
     964        grid ${config}.recs_field -sticky ew -pady 1 -padx 5
     965        grid ${config}.spc6
     966        grid ${config}.start -sticky ew -pady 3 -padx 5
     967        grid ${config}.reset -sticky ew -pady 3 -padx 5
     968        grid ${config}.spc7
     969        grid ${config}.register -sticky ew -pady 3 -padx 5
     970
     971        grid ${graph} -row 0 -column 0 -sticky news
     972        grid ${config} -row 0 -column 1
     973
     974        grid rowconfigure ${master} 0 -weight 1
     975        grid columnconfigure ${master} 0 -weight 1
     976        grid columnconfigure ${master} 1 -weight 0 -minsize 80
     977
     978        grid columnconfigure ${config}.chan_frame 1 -weight 1
     979
     980        # enable zooming
     981        Blt_ZoomStack $graph
     982
     983        my crosshairs $graph
     984
     985        #bind .graph <Motion> {%W crosshairs configure -position @%x,%y}
     986
     987        # create one element with data for the x and y axis, no dots
     988        $graph element create Spectrum1 -color blue -linewidth 2 -symbol none -smooth step -xdata [myvar xvec] -ydata [myvar yvec]
     989    }
     990
     991# -------------------------------------------------------------------------
     992
     993    CntDisplay instproc coor_update {W x y} {
     994        my instvar config graph
     995
     996        $W crosshairs configure -position @${x},${y}
     997
     998        set index [$W axis invtransform x $x]
     999        set index [::tcl::mathfunc::round $index]
     1000        catch {
     1001            ${config}.chan_frame.axisy_value configure -text [[myvar yvec] index $index]
     1002            ${config}.chan_frame.axisx_value configure -text ${index}.0
     1003        }
     1004    }
     1005# -------------------------------------------------------------------------
     1006
     1007    CntDisplay instproc crosshairs {graph} {
     1008        set method [myproc coor_update]
     1009        bind $graph <Motion> [list [self] coor_update %W %x %y]
     1010        bind $graph <Leave> {
     1011            %W crosshairs off
     1012        }
     1013        bind $graph <Enter> {
     1014            %W crosshairs on
     1015        }
     1016    }
     1017
     1018# -------------------------------------------------------------------------
     1019
     1020    CntDisplay instproc thrs_update args {
     1021        my instvar controller config thrs thrs_val
    7681022
    7691023        if {[string equal $thrs_val {}]} {
     
    7711025        }
    7721026
    773         set val_addr [format %04x [expr {14 + ${number}}]]
    774         set value [format %04x $thrs_val]
    775 
    776         my usbCmd ${val_addr}${value}
    777     }
    778 
    779 # -------------------------------------------------------------------------
    780 
    781     HstDisplay instproc base_update args {
    782         my instvar config number base base_val base_mux
    783 
    784         set mux_addr [format %04x [expr {23 + ${number}}]]
    785         set val_addr [format %04x [expr {11 + ${number}}]]
    786 
    787         if {$base} {
    788             ${config}.base_auto configure -state normal
    789             ${config}.base_const configure -state normal
    790             my base_typ_update
     1027        set number 0
     1028        set val_addr [format %02x [expr {7 + 2 * ${number}}]]
     1029
     1030        if {$thrs} {
     1031            ${config}.thrs_field configure -state normal
     1032            set value [format %03x $thrs_val]
    7911033        } else {
    792             ${config}.base_auto configure -state disabled
    793             ${config}.base_const configure -state disabled
    794             ${config}.base_field configure -state disabled
    795             set base_mux 0
    796             my usbCmd ${mux_addr}[my mux]${val_addr}0000
    797         }
    798     }
    799 
    800 # -------------------------------------------------------------------------
    801 
    802     HstDisplay instproc base_typ_update args {
    803         my instvar config number base_typ base_val base_mux
    804 
    805         set mux_addr [format %04x [expr {23 + ${number}}]]
    806         set val_addr [format %04x [expr {11 + ${number}}]]
    807         set value [format %04x $base_val]
    808 
    809         switch -- $base_typ {
    810             auto {
    811                 ${config}.base_field configure -state disabled
    812                 set base_mux 1
    813                 my usbCmd ${mux_addr}[my mux]
    814             }
    815             const {
    816                 ${config}.base_field configure -state normal
    817                 set base_mux 0
    818                 my usbCmd ${mux_addr}[my mux]${val_addr}${value}
    819             }
    820         }
    821     }
    822 
    823 # -------------------------------------------------------------------------
    824 
    825     HstDisplay instproc base_val_update args {
    826         my instvar number base_val
    827 
    828         if {[string equal $base_val {}]} {
    829             set base_val 0
    830         }
    831 
    832         set val_addr [format %04x [expr {11 + ${number}}]]
    833         set value [format %04x $base_val]
    834 
    835         my usbCmd ${val_addr}${value}
    836     }
    837 
    838 # -------------------------------------------------------------------------
    839 
    840     HstDisplay instproc acquire {} {
    841         my instvar number
    842         my usbCmdRead 0002001${number} 4 4096
     1034            ${config}.thrs_field configure -state disabled
     1035            set value 000
     1036        }
     1037
     1038        $controller usbCmd 000200${val_addr}00040${value}
     1039    }
     1040
     1041# -------------------------------------------------------------------------
     1042
     1043    CntDisplay instproc cntr_update args {
     1044        my instvar cntr cntr_val
     1045        set cntr_val [expr {${cntr}/20000}]
     1046
     1047    }
     1048
     1049# -------------------------------------------------------------------------
     1050
     1051    CntDisplay instproc recs_update args {
     1052        my instvar recs recs_val
     1053        set recs_val [expr {${recs}*1}]
     1054    }
     1055
     1056# -------------------------------------------------------------------------
     1057
     1058    CntDisplay instproc cntr_setup {} {
     1059        my instvar controller cntr_val
     1060
     1061        set cntr_tmp [expr {${cntr_val} * 20000}]
     1062        set word0 [format {%08x} [expr {${cntr_tmp} & 0xFFFFFFFF}]]
     1063        set word1 [format {%08x} [expr {${cntr_tmp} >> 32}]]
     1064
     1065        set prefix [format {%x} 9]
     1066
     1067        set command {}
     1068        append command 0001${prefix}000000200000004[string range $word0 4 7]
     1069        append command 0001${prefix}000000200010004[string range $word0 0 3]
     1070        append command 0001${prefix}000000200020004[string range $word1 4 7]
     1071        append command 0001${prefix}000000200030004[string range $word1 0 3]
     1072
     1073        # send counter value
     1074        $controller usbCmd $command
     1075    }
     1076
     1077# -------------------------------------------------------------------------
     1078
     1079    CntDisplay instproc recs_setup {} {
     1080        my instvar controller recs_val
     1081
     1082        set word0 [format {%08x} [expr {${recs_val} & 0xFFFFFFFF}]]
     1083        set word1 [format {%08x} [expr {${recs_val} >> 32}]]
     1084
     1085        set prefix [format {%x} 10]
     1086
     1087        set command {}
     1088        append command 0001${prefix}000000200000004[string range $word0 4 7]
     1089        append command 0001${prefix}000000200010004[string range $word0 0 3]
     1090        append command 0001${prefix}000000200020004[string range $word1 4 7]
     1091        append command 0001${prefix}000000200030004[string range $word1 0 3]
     1092
     1093        # send counter value
     1094        $controller usbCmd $command
     1095    }
     1096
     1097# -------------------------------------------------------------------------
     1098
     1099    CntDisplay instproc cntr_reset {} {
     1100        my instvar controller after_handle
     1101        my instvar cntr_val cntr_bak recs_val recs_bak
     1102
     1103        my cntr_stop
     1104
     1105        set value [format {%04x} [expr {1 << 11}]]
     1106        $controller usbCmd 000200000004${value}0002000000040000
     1107
     1108        my recs_stop
     1109    }
     1110
     1111# -------------------------------------------------------------------------
     1112
     1113    CntDisplay instproc cntr_ready {} {
     1114        my instvar config cntr_val cntr_bak recs_val recs_bak
     1115
     1116        set cntr_val $cntr_bak
     1117        set recs_val $recs_bak
     1118
     1119        ${config}.start configure -text Start -command [myproc recs_start]
     1120        ${config}.reset configure -state active
     1121
     1122        ${config}.start configure -state active
     1123        ${config}.cntr_field configure -state normal
     1124        ${config}.recs_field configure -state normal
     1125    }
     1126
     1127# -------------------------------------------------------------------------
     1128
     1129    CntDisplay instproc recs_start {} {
     1130        my instvar controller config auto
     1131        my instvar cntr_val cntr_bak recs_val recs_bak
     1132
     1133        if {$cntr_val > 0 && $recs_val > 0} {
     1134            ${config}.start configure -text {Stop} -command [myproc recs_stop]
     1135            ${config}.cntr_field configure -state disabled
     1136            ${config}.recs_field configure -state disabled
     1137
     1138            set cntr_bak $cntr_val
     1139            set recs_bak $recs_val
     1140
     1141            my cntr_setup
     1142            my recs_setup
     1143
     1144            set val_addr [format {%02x} 16]
     1145
     1146            $controller usbCmd 000200${val_addr}00040002
     1147
     1148            set auto 1
     1149
     1150            after 100 [myproc acquire_loop]
     1151        }
     1152    }
     1153
     1154# -------------------------------------------------------------------------
     1155
     1156    CntDisplay instproc recs_stop {} {
     1157        my instvar cntr_val cntr_bak recs_val recs_bak
     1158
     1159        my cntr_stop
     1160
     1161        set cntr_val $cntr_bak
     1162        my cntr_setup
     1163
     1164        set recs_val $recs_bak
     1165        my recs_setup
     1166
     1167        my acquire
     1168
     1169        my cntr_ready
     1170    }
     1171
     1172# -------------------------------------------------------------------------
     1173
     1174    CntDisplay instproc cntr_stop {} {
     1175        my instvar controller config auto
     1176
     1177        set val_addr [format {%02x} 16]
     1178
     1179        $controller usbCmd 000200${val_addr}00040000
     1180
     1181        set auto 0
     1182    }
     1183
     1184# -------------------------------------------------------------------------
     1185
     1186    CntDisplay instproc acquire_loop {} {
     1187        my instvar recs_val auto
     1188
     1189        my acquire
     1190
     1191        if {$recs_val == 0} {
     1192            my cntr_stop
     1193            my cntr_ready
     1194        } elseif {$auto} {
     1195            after 1000 [myproc acquire_loop]
     1196        }
     1197    }
     1198
     1199# -------------------------------------------------------------------------
     1200
     1201    CntDisplay instproc data_update args {
     1202        my instvar config data
     1203        usb::convertBlt $data 2 [myvar yvec]
     1204
     1205        ${config}.chan_frame.mean_value configure \
     1206            -text [format {%.2e} [usb::integrateBlt [myvar yvec] 1]]
     1207        ${config}.chan_frame.entr_value configure \
     1208            -text [usb::integrateBlt [myvar yvec] 0]
     1209
     1210    }
     1211
     1212# -------------------------------------------------------------------------
     1213
     1214    CntDisplay instproc axis_update args {
     1215        my instvar axis graph
     1216        if {$axis} {
     1217            $graph axis configure y -min 1 -max 1E5 -logscale yes
     1218        } else {
     1219            $graph axis configure y -min {} -max {} -logscale no
     1220        }
     1221    }
     1222
     1223# -------------------------------------------------------------------------
     1224
     1225    CntDisplay instproc acquire {} {
     1226        my instvar controller config
     1227        my instvar cntr cntr_val recs recs_val
     1228
     1229        set size 16384
     1230
     1231        set prefix [format {%x} 8]
     1232
     1233        set value [format {%08x} $size]
     1234
     1235        set command 0001${prefix}000000200000001[string range $value 0 3]0003[string range $value 4 7]00050000
     1236
     1237        $controller usbCmdReadRaw $command [expr {$size * 2}] [myvar data]
     1238
     1239        set prefix [format {%x} 9]
     1240        set command 0001${prefix}000000200000003000400050000
     1241
     1242        $controller usbCmdReadHex $command 8 1 [myvar cntr]
     1243
     1244        set prefix [format {%x} 10]
     1245        set command 0001${prefix}000000200000003000400050000
     1246
     1247        $controller usbCmdReadHex $command 8 1 [myvar recs]
    8431248   }
    8441249
    8451250# -------------------------------------------------------------------------
    8461251
    847     HstDisplay instproc restart {} {
    848         my instvar number
    849         my usbCmd 0001001${number}
    850     }
    851 
    852 # -------------------------------------------------------------------------
    853 
    854     HstDisplay instproc save_data {data} {
    855         set file [tk_getSaveFile]
    856         if {[string equal $file {}]} {
     1252    CntDisplay instproc save_data {data} {
     1253
     1254        set types {
     1255            {{Data Files}       {.dat}        }
     1256            {{All Files}        *             }
     1257        }
     1258
     1259        set stamp [clock format [clock seconds] -format %Y%m%d_%H%M%S]
     1260        set fname counts_${stamp}.dat
     1261
     1262        set fname [tk_getSaveFile -filetypes $types -initialfile $fname]
     1263        if {[string equal $fname {}]} {
    8571264            return
    8581265        }
    8591266
    860         set x [catch {set fid [open $file w+]}]
    861         set y [catch {puts $fid $data}]
    862         set z [catch {close $fid}]
    863 
    864         if { $x || $y || $z || ![file exists $file] || ![file isfile $file] || ![file readable $file] } {
     1267        set x [catch {
     1268            set fid [open $fname w+]
     1269            puts $fid $data
     1270            close $fid
     1271        }]
     1272
     1273        if { $x || ![file exists $fname] || ![file isfile $fname] || ![file readable $fname] } {
    8651274            tk_messageBox -icon error \
    866                 -message "An error occurred while writing to \"$file\""
     1275                -message "An error occurred while writing to \"$fname\""
    8671276        } else {
    8681277            tk_messageBox -icon info \
    869                 -message "File \"$file\" written successfully"
    870         }
    871     }
    872 
    873 # -------------------------------------------------------------------------
    874 
    875     HstDisplay instproc register {} {
    876         my save_data [my set data]
    877     }
    878 
    879 # -------------------------------------------------------------------------
    880 
    881     HstDisplay instproc acquire_loop {} {
    882         my instvar number after_handle
    883 
    884         my acquire
    885 
    886         set after_handle [after 1000 [myproc acquire_loop]]
    887     }
    888 
    889 # -------------------------------------------------------------------------
    890 
    891     Class EptDisplay -superclass Display -parameter {
    892         {number}
     1278                -message "File \"$fname\" written successfully"
     1279        }
     1280    }
     1281
     1282# -------------------------------------------------------------------------
     1283
     1284    CntDisplay instproc register {} {
     1285        my save_data [join [[myvar yvec] range 0 16383] \n]
     1286    }
     1287
     1288# -------------------------------------------------------------------------
     1289
     1290    Class OscDisplay -parameter {
    8931291        {master}
    894     }
    895 
    896 # -------------------------------------------------------------------------
    897 
    898     EptDisplay instproc init {} {
    899         my instvar data xvec yvec
    900 
    901         set xvec [vector #auto]
    902 
    903         for {set i 0} {$i < 11} {incr i} {
    904           set yvec($i) [vector #auto]
     1292        {controller}
     1293    }
     1294
     1295# -------------------------------------------------------------------------
     1296
     1297    OscDisplay instproc init {} {
     1298        my instvar sequence data xvec yvec
     1299
     1300        set data {}
     1301       
     1302        set sequence 0
     1303
     1304#        set xvec [vector create #auto(262144)]
     1305        set xvec [vector create #auto(10000)]
     1306
     1307        for {set i 1} {$i <= 9} {incr i} {
     1308#          dict set yvec $i [vector create #auto(262144)]
     1309          dict set yvec $i [vector create #auto(10000)]
    9051310        }
    9061311
    9071312        # fill one vector for the x axis
     1313#        $xvec seq 0 262143
    9081314        $xvec seq 0 10000
    9091315
    910         my reset
    911 
    9121316        my setup
    9131317
     
    9171321# -------------------------------------------------------------------------
    9181322
    919     EptDisplay instproc destroy {} {
     1323    OscDisplay instproc destroy {} {
    9201324        next
    9211325    }
     
    9231327# -------------------------------------------------------------------------
    9241328
    925     EptDisplay instproc reset {} {
    926         my instvar data xvec yvec
    927         my instvar number_val directory
    928 
    929         set data {}
     1329    OscDisplay instproc start {} {
     1330        my instvar config
     1331        my instvar recs_val directory
    9301332
    9311333        set directory $::env(HOMEPATH)
    932         set number_val 10
    933 
    934         for {set i 0} {$i < 11} {incr i} {
    935           $yvec($i) set {}
    936         }
    937     }
    938 
    939 # -------------------------------------------------------------------------
    940 
    941     EptDisplay instproc start {} {
     1334        set recs_val 100
     1335
     1336        trace add variable [myvar chan] write [myproc chan_update]
     1337
     1338        trace add variable [myvar data] write [myproc data_update]
     1339
     1340        trace add variable [myvar auto] write [myproc auto_update]
     1341
     1342        trace add variable [myvar thrs] write [myproc thrs_update 0]
     1343        trace add variable [myvar thrs_val] write [myproc thrs_update 0]
     1344
     1345        trace add variable [myvar recs_val] write [myproc recs_val_update]
     1346
     1347        trace add variable [myvar last] write [myproc last_update]
     1348
     1349        ${config}.chan_frame.chan1_check select
     1350        ${config}.chan_frame.chan2_check select
     1351        ${config}.chan_frame.chan3_check select
     1352        ${config}.chan_frame.chan4_check select
     1353        ${config}.chan_frame.chan5_check select
     1354        ${config}.chan_frame.chan6_check select
     1355
     1356        ${config}.thrs_check select
     1357        ${config}.thrs_field set 100
     1358    }
     1359
     1360# -------------------------------------------------------------------------
     1361
     1362    OscDisplay instproc setup {} {
     1363        my instvar master
     1364        my instvar xvec yvec graph
    9421365        my instvar config
    9431366
    944         trace add variable [myvar recs_val] write [myproc recs_val_update]
    945         trace add variable [myvar data] write [myproc data_update]
    946         trace add variable [myvar last] write [myproc data_update]
    947 
    948     }
    949 
    950 # -------------------------------------------------------------------------
    951 
    952     EptDisplay instproc setup {} {
    953         my instvar master
    954         my instvar data xvec yvec graph
    955         my instvar config number_val
    956 
    9571367        # create a graph widget and show a grid
    958         set display [frame ${master}.display]
    959 
    960         set graph(0) [graph ${display}.graph0 -height 200 -leftmargin 80]
    961         $graph(0) crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    962         $graph(0) grid configure -hide no
    963         $graph(0) legend configure -hide yes
    964         $graph(0) axis configure x -min 0 -max 10000
    965         $graph(0) axis configure y -min 0 -max 4100
    966 
    967         set graph(1) [graph ${display}.graph1 -height 200 -leftmargin 80]
    968         $graph(1) crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    969         $graph(1) grid configure -hide no
    970         $graph(1) legend configure -hide yes
    971         $graph(1) axis configure x -min 0 -max 10000 -hide yes
    972         $graph(1) axis configure y -min 0 -max 4100
    973 
    974         set graph(2) [graph ${display}.graph2 -height 200 -leftmargin 80]
    975         $graph(2) crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    976         $graph(2) grid configure -hide no
    977         $graph(2) legend configure -hide yes
    978         $graph(2) axis configure x -min 0 -max 10000 -hide yes
    979         $graph(2) axis configure y -min 0 -max 4100
    980 
    981         set graph(3) [graph ${display}.graph3 -height 100 -leftmargin 80]
    982         $graph(3) crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    983         $graph(3) grid configure -hide no
    984         $graph(3) legend configure -hide yes
    985         $graph(3) axis configure x -min 0 -max 10000 -hide yes
    986         $graph(3) axis configure y -min 0 -max 25
    987 
    988         scale ${master}.last -orient horizontal -from 1 -to 35 -tickinterval 0 -showvalue no -variable [myvar last]
    989 
    990         set config [frame ${master}.config -width 120]
    991 
    992         label ${config}.recs -text {number of records}
    993         spinbox ${config}.recs_field -from 5 -to 100 \
    994             -increment 5 -width 10 -textvariable [myvar recs_val] \
    995             -validate all -vcmd {::mca::validate 100 %P}
    996 
    997         frame ${config}.spc1 -width 10 -height 10
    998 
    999         button ${config}.sequence -text {Start Recording}  \
    1000             -bg red -activebackground red -command [myproc sequence]
    1001 
    1002         frame ${config}.spc2 -width 10 -height 10
    1003 
    1004         label ${config}.stat -text {}
    1005 
    1006         frame ${config}.spc3 -width 10 -height 20
     1368        set graph [graph ${master}.graph -height 250 -leftmargin 80]
     1369        $graph crosshairs configure -hide no -linewidth 1 -color darkblue -dashes {2 2}
     1370        $graph grid configure -hide no
     1371        $graph legend configure -hide yes
     1372        $graph axis configure x -min 0 -max 10000
     1373        $graph axis configure y -min 0 -max 4100
     1374
     1375#        scale ${master}.last -orient horizontal -from 1 -to 27 -tickinterval 0 -showvalue no -variable [myvar last]
     1376
     1377        set config [frame ${master}.config -width 170]
     1378
     1379        frame ${config}.chan_frame -width 170
     1380        legendButton ${config}.chan_frame 0 chan1 {Channel 1} [myvar chan(1)] turquoise2
     1381        legendButton ${config}.chan_frame 1 chan2 {Channel 2} [myvar chan(2)] SpringGreen2
     1382        legendButton ${config}.chan_frame 2 chan3 {Channel 3} [myvar chan(3)] orchid2
     1383        legendButton ${config}.chan_frame 3 chan4 {Channel 4} [myvar chan(4)] orange2
     1384        legendButton ${config}.chan_frame 4 chan5 {Channel 5} [myvar chan(5)] blue1 white
     1385        legendButton ${config}.chan_frame 5 chan6 {Channel 6} [myvar chan(6)] gray65 white
     1386        legendLabel  ${config}.chan_frame 6 axisx {Time axis}
     1387
     1388        frame ${config}.spc1 -width 170 -height 30
     1389
     1390        checkbutton ${config}.auto_check -text {auto update} -variable [myvar auto]
     1391
     1392        frame ${config}.spc2 -width 170 -height 30
     1393
     1394        checkbutton ${config}.thrs_check -text threshold -variable [myvar thrs]
     1395        spinbox ${config}.thrs_field -from 1 -to 4095 \
     1396            -increment 5 -width 10 -textvariable [myvar thrs_val] \
     1397            -validate all -vcmd {::mca::validate 4095 4 %P}
     1398
     1399        frame ${config}.spc3 -width 170 -height 30
    10071400
    10081401        button ${config}.acquire -text Acquire \
    1009             -bg green -activebackground green -command [myproc acquire]
     1402            -bg green -activebackground green -command [myproc acquire_start]
    10101403        button ${config}.register -text Register \
    10111404            -bg lightblue -activebackground lightblue -command [myproc register]
    10121405
    1013 
    1014         grid ${config}.recs -sticky w -pady 1 -padx 3
    1015         grid ${config}.recs_field -sticky ew -pady 1 -padx 5
     1406        frame ${config}.spc4 -width 170 -height 30
     1407
     1408        label ${config}.recs -text {number of records}
     1409        spinbox ${config}.recs_field -from 0 -to 10000 \
     1410            -increment 10 -width 10 -textvariable [myvar recs_val] \
     1411            -validate all -vcmd {::mca::validate 10000 5 %P}
     1412
     1413        frame ${config}.spc5 -width 170 -height 10
     1414
     1415        button ${config}.sequence -text {Start Recording} -command [myproc sequence_start] \
     1416            -bg yellow -activebackground yellow
     1417
     1418        frame ${config}.spc6 -width 170 -height 10
     1419
     1420        button ${config}.recover -text {Read file} \
     1421            -bg lightblue -activebackground lightblue -command [myproc recover]
     1422
     1423        grid ${config}.chan_frame -sticky ew
    10161424        grid ${config}.spc1
    1017         grid ${config}.sequence -sticky ew -pady 3 -padx 5
     1425        grid ${config}.auto_check -sticky w
    10181426        grid ${config}.spc2
    1019         grid ${config}.stat -sticky w -pady 1 -padx 3
     1427        grid ${config}.thrs_check -sticky w
     1428        grid ${config}.thrs_field -sticky ew -pady 1 -padx 5
    10201429        grid ${config}.spc3
    10211430        grid ${config}.acquire -sticky ew -pady 3 -padx 5
    10221431        grid ${config}.register -sticky ew -pady 3 -padx 5
    1023 
    1024         grid ${graph(3)} -row 0 -column 0 -sticky news
    1025         grid ${graph(2)} -row 1 -column 0 -sticky news
    1026         grid ${graph(1)} -row 2 -column 0 -sticky news
    1027         grid ${graph(0)} -row 3 -column 0 -sticky news
    1028 
    1029         grid ${display} -row 0 -column 0 -sticky news
     1432        grid ${config}.spc4
     1433        grid ${config}.recs -sticky w -pady 1 -padx 3
     1434        grid ${config}.recs_field -sticky ew -pady 1 -padx 5
     1435        grid ${config}.spc5
     1436        grid ${config}.sequence -sticky ew -pady 3 -padx 5
     1437        grid ${config}.spc6
     1438        grid ${config}.recover -sticky ew -pady 3 -padx 5
     1439
     1440        grid ${graph} -row 0 -column 0 -sticky news
    10301441        grid ${config} -row 0 -column 1
    10311442
    1032         grid ${master}.last -row 1 -column 0 -columnspan 2 -sticky ew
     1443#        grid ${master}.last -row 1 -column 0 -columnspan 2 -sticky ew
    10331444
    10341445        grid rowconfigure ${master} 0 -weight 1
     
    10361447        grid columnconfigure ${master} 1 -weight 0 -minsize 120
    10371448
    1038         grid columnconfigure ${display} 0 -weight 1
    1039         grid rowconfigure ${display} 0 -weight 1
    1040         grid rowconfigure ${display} 1 -weight 1
    1041         grid rowconfigure ${display} 2 -weight 1
    1042         grid rowconfigure ${display} 3 -weight 1
     1449        grid columnconfigure ${config}.chan_frame 2 -weight 1
    10431450
    10441451        # enable zooming
    1045         Blt_ZoomStack $graph(0)
    1046         Blt_ZoomStack $graph(1)
    1047         Blt_ZoomStack $graph(2)
    1048         Blt_ZoomStack $graph(3)
    1049 
    1050         #bind .graph <Motion> {%W crosshairs configure -position @%x,%y}
     1452        Blt_ZoomStack $graph
     1453
     1454        my crosshairs $graph
    10511455
    10521456        # create one element with data for the x and y axis, no dots
    1053         $graph(0) element create Spectrum0 -symbol none -xdata $xvec -ydata $yvec(0)
    1054         $graph(1) element create Spectrum1 -symbol none -xdata $xvec -ydata $yvec(1)
    1055         $graph(2) element create Spectrum2 -symbol none -xdata $xvec -ydata $yvec(2)
    1056         for {set i 3} {$i < 11} {incr i} {
    1057           $graph(3) element create Spectrum$i -symbol none -xdata $xvec -ydata $yvec($i)
    1058         }
    1059     }
    1060 
    1061 # -------------------------------------------------------------------------
    1062 
    1063     EptDisplay instproc recs_val_update args {
     1457        $graph pen create pen1 -color turquoise3 -linewidth 2 -symbol none
     1458        $graph pen create pen2 -color SpringGreen3 -linewidth 2 -symbol none
     1459        $graph pen create pen3 -color orchid3 -linewidth 2 -symbol none
     1460        $graph pen create pen4 -color orange3 -linewidth 2 -symbol none
     1461        $graph pen create pen5 -color blue2 -linewidth 2 -symbol none
     1462        $graph pen create pen6 -color gray55 -linewidth 2 -symbol none
     1463
     1464        $graph element create Spectrum1 -pen pen1 -xdata $xvec -ydata [dict get $yvec 1]
     1465        $graph element create Spectrum2 -pen pen2 -xdata $xvec -ydata [dict get $yvec 2]
     1466        $graph element create Spectrum3 -pen pen3 -xdata $xvec -ydata [dict get $yvec 3]
     1467        $graph element create Spectrum4 -pen pen4 -xdata $xvec -ydata [dict get $yvec 4]
     1468        $graph element create Spectrum5 -pen pen5 -xdata $xvec -ydata [dict get $yvec 5]
     1469        $graph element create Spectrum6 -pen pen6 -xdata $xvec -ydata [dict get $yvec 6]
     1470    }
     1471
     1472# -------------------------------------------------------------------------
     1473
     1474    OscDisplay instproc coor_update {W x y} {
     1475        my instvar xvec yvec graph
     1476        my instvar config
     1477
     1478        $W crosshairs configure -position @${x},${y}
     1479
     1480        set index [$W axis invtransform x $x]
     1481        set index [::tcl::mathfunc::round $index]
     1482        catch {
     1483            ${config}.chan_frame.chan1_value configure -text [[dict get $yvec 1] index $index]
     1484            ${config}.chan_frame.chan2_value configure -text [[dict get $yvec 2] index $index]
     1485            ${config}.chan_frame.chan3_value configure -text [[dict get $yvec 3] index $index]
     1486            ${config}.chan_frame.chan4_value configure -text [[dict get $yvec 4] index $index]
     1487            ${config}.chan_frame.chan5_value configure -text [[dict get $yvec 5] index $index]
     1488            ${config}.chan_frame.chan6_value configure -text [[dict get $yvec 6] index $index]
     1489            ${config}.chan_frame.axisx_value configure -text ${index}.0
     1490        }
     1491    }
     1492# -------------------------------------------------------------------------
     1493
     1494    OscDisplay instproc crosshairs {graph} {
     1495        set method [myproc coor_update]
     1496        bind $graph <Motion> [list [self] coor_update %W %x %y]
     1497        bind $graph <Leave> {
     1498            %W crosshairs off
     1499        }
     1500        bind $graph <Enter> {
     1501            %W crosshairs on
     1502        }
     1503    }
     1504
     1505# -------------------------------------------------------------------------
     1506
     1507    OscDisplay instproc chan_update {name key op} {
     1508        my instvar config graph chan
     1509
     1510        if {$chan(${key})} {
     1511            $graph pen configure pen${key} -linewidth 2
     1512        } else {
     1513            $graph pen configure pen${key} -linewidth 0
     1514        }
     1515    }
     1516
     1517# -------------------------------------------------------------------------
     1518
     1519    OscDisplay instproc recs_val_update args {
    10641520        my instvar recs_val
    10651521        if {[string equal $recs_val {}]} {
    1066             set number_val 0
    1067         }
    1068     }
    1069 
    1070 # -------------------------------------------------------------------------
    1071 
    1072     EptDisplay instproc data_update args {
    1073         my instvar data xvec yvec graph last
     1522            set recs_val 0
     1523        }
     1524    }
     1525
     1526# -------------------------------------------------------------------------
     1527
     1528    OscDisplay instproc last_update args {
     1529        my instvar graph last
    10741530
    10751531        set first [expr {$last - 1}]
     1532
     1533        $graph axis configure x -min ${first}0000 -max ${last}0000
     1534    }
     1535
     1536# -------------------------------------------------------------------------
     1537
     1538    OscDisplay instproc thrs_update {reset args} {
     1539        my instvar controller config thrs thrs_val
     1540
     1541        if {[string equal $thrs_val {}]} {
     1542            set thrs_val 0
     1543        }
     1544
     1545        if {$thrs} {
     1546            ${config}.thrs_field configure -state normal
     1547            set value [format %03x $thrs_val]
     1548        } else {
     1549            ${config}.thrs_field configure -state disabled
     1550            set value 000
     1551        }
     1552
     1553        set command {}
     1554        if {$reset} {
     1555            append command 0002000500041${value}
     1556        }
     1557        append command 0002000500040${value}
     1558
     1559        $controller usbCmd $command
     1560    }
     1561
     1562# -------------------------------------------------------------------------
     1563
     1564    OscDisplay instproc data_update args {
     1565        my instvar data yvec
     1566        my instvar graph chan waiting sequence auto
     1567
     1568        usb::convertOsc $data $yvec
     1569
     1570        foreach {key value} [array get chan] {
     1571            $graph pen configure pen${key} -dashes 0
     1572        }
     1573
     1574        set waiting 0
     1575
     1576        if {$sequence} {
     1577            my sequence_register
     1578        } elseif {$auto} {
     1579            after 1000 [myproc acquire_start]
     1580        }
     1581    }
     1582
     1583# -------------------------------------------------------------------------
     1584
     1585    OscDisplay instproc acquire_start {} {
     1586        my instvar graph chan controller waiting
     1587
     1588        foreach {key value} [array get chan] {
     1589            $graph pen configure pen${key} -dashes dot
     1590        }
     1591
     1592        # restart
     1593        my thrs_update 1
     1594
     1595        set waiting 1
     1596
     1597        after 200 [myproc acquire_loop]
     1598    }
     1599
     1600# -------------------------------------------------------------------------
     1601
     1602    OscDisplay instproc acquire_loop {} {
     1603        my instvar controller waiting
     1604
     1605#        set size 262144
     1606        set size 10000
     1607
     1608        set value [format {%08x} [expr {$size * 4}]]
     1609
     1610        set command 00011000000200000001[string range $value 0 3]0003[string range $value 4 7]00050000
    10761611       
    1077         $xvec seq ${first}0000 ${last}0000
    1078         for {set i 0} {$i < 4} {incr i} {
    1079             $graph($i) axis configure x -min ${first}0000 -max ${last}0000
    1080         }
    1081 
    1082         for {set i 0} {$i < 11} {incr i} {
    1083             $yvec($i) set [lrange [lindex $data $i] ${first}0000 ${last}0000]
    1084         }
    1085     }
    1086 
    1087 
    1088 # -------------------------------------------------------------------------
    1089 
    1090     EptDisplay instproc save_data {data} {
    1091         set file [tk_getSaveFile]
    1092         if {[string equal $file {}]} {
     1612        $controller usbCmdReadRaw $command [expr {$size * 8}] [myvar data]
     1613
     1614        if {$waiting} {
     1615            after 200 [myproc acquire_loop]
     1616        }
     1617    }
     1618
     1619# -------------------------------------------------------------------------
     1620
     1621    OscDisplay instproc auto_update args {
     1622        my instvar config auto
     1623
     1624        if {$auto} {
     1625            ${config}.recs_field configure -state disabled
     1626            ${config}.sequence configure -state disabled
     1627            ${config}.acquire configure -state disabled
     1628            ${config}.register configure -state disabled
     1629            ${config}.recover configure -state disabled
     1630
     1631            my acquire_start
     1632        } else {
     1633            ${config}.recs_field configure -state normal
     1634            ${config}.sequence configure -state active
     1635            ${config}.acquire configure -state active
     1636            ${config}.register configure -state active
     1637            ${config}.recover configure -state active
     1638        }
     1639    }
     1640
     1641# -------------------------------------------------------------------------
     1642
     1643    OscDisplay instproc save_data {fname} {
     1644        my instvar data
     1645
     1646        set fid [open $fname w+]
     1647        fconfigure $fid -translation binary -encoding binary
     1648
     1649#        puts -nonewline $fid [binary format "H*iH*" "1f8b0800" [clock seconds] "0003"]
     1650#        puts -nonewline $fid [zlib deflate $data]
     1651        puts -nonewline $fid $data
     1652#        puts -nonewline $fid [binary format i [zlib crc32 $data]]
     1653#        puts -nonewline $fid [binary format i [string length $data]]
     1654
     1655        close $fid
     1656    }
     1657
     1658# -------------------------------------------------------------------------
     1659
     1660    OscDisplay instproc open_data {} {
     1661        set types {
     1662            {{Data Files}       {.dat}     }
     1663            {{All Files}        *             }
     1664        }
     1665
     1666        set fname [tk_getOpenFile -filetypes $types]
     1667        if {[string equal $fname {}]} {
    10931668            return
    10941669        }
    10951670
    1096         set x [catch {set fid [open $file w+]}]
    1097         set y [catch {puts $fid $data}]
    1098         set z [catch {close $fid}]
    1099 
    1100         if { $x || $y || $z || ![file exists $file] || ![file isfile $file] || ![file readable $file] } {
     1671        set x [catch {
     1672            set fid [open $fname r+]
     1673            fconfigure $fid -translation binary -encoding binary
     1674#            set size [file size $fname]
     1675#            seek $fid 10
     1676#            my set data [zlib inflate [read $fid [expr {$size - 18}]]]
     1677            my set data [read $fid]
     1678            close $fid
     1679        }]
     1680
     1681        if { $x || ![file exists $fname] || ![file isfile $fname] || ![file readable $fname] } {
    11011682            tk_messageBox -icon error \
    1102                 -message "An error occurred while writing to \"$file\""
     1683                -message "An error occurred while reading \"$fname\""
    11031684        } else {
    11041685            tk_messageBox -icon info \
    1105                 -message "File \"$file\" written successfully"
    1106         }
    1107     }
    1108 
    1109 # -------------------------------------------------------------------------
    1110 
    1111     EptDisplay instproc acquire {} {
    1112         my usbCmdReadEpt 00060000 2097152
    1113    }
    1114 
    1115 # -------------------------------------------------------------------------
    1116 
    1117     EptDisplay instproc register {} {
    1118         my save_data [my set data]
    1119     }
    1120 
    1121 # -------------------------------------------------------------------------
    1122 
    1123     EptDisplay instproc sequence {} {
    1124         my instvar config recs_val directory counter
     1686                -message "File \"$fname\" read successfully"
     1687        }
     1688    }
     1689
     1690# -------------------------------------------------------------------------
     1691
     1692    OscDisplay instproc register {} {
     1693        set types {
     1694            {{Data Files}       {.dat}     }
     1695            {{All Files}        *             }
     1696        }
     1697
     1698        set stamp [clock format [clock seconds] -format %Y%m%d_%H%M%S]
     1699        set fname oscillogram_${stamp}.dat
     1700
     1701        set fname [tk_getSaveFile -filetypes $types -initialfile $fname]
     1702        if {[string equal $fname {}]} {
     1703            return
     1704        }
     1705   
     1706        if {[catch {my save_data $fname} result]} {
     1707            tk_messageBox -icon error \
     1708                -message "An error occurred while writing to \"$fname\""
     1709        } else {
     1710            tk_messageBox -icon info \
     1711                -message "File \"$fname\" written successfully"
     1712        }
     1713    }
     1714
     1715# -------------------------------------------------------------------------
     1716
     1717    OscDisplay instproc recover {} {
     1718        my open_data
     1719    }
     1720
     1721# -------------------------------------------------------------------------
     1722
     1723    OscDisplay instproc sequence_start {} {
     1724        my instvar config recs_val recs_bak directory counter sequence
     1725
     1726        set counter 1
     1727        if {$counter > $recs_val} {
     1728            return
     1729        }
    11251730
    11261731        set directory [tk_chooseDirectory -initialdir $directory -title {Choose a directory}]
     
    11311736
    11321737        ${config}.recs_field configure -state disabled
    1133         ${config}.sequence configure -state disabled
     1738        ${config}.sequence configure -text {Stop Recording} -command [myproc sequence_stop]
    11341739        ${config}.acquire configure -state disabled
    11351740        ${config}.register configure -state disabled
     1741        ${config}.recover configure -state disabled
    11361742       
    1137         set counter 1
     1743        set recs_bak $recs_val
     1744
     1745        set sequence 1
     1746
     1747        my acquire_start
     1748    }
     1749
     1750# -------------------------------------------------------------------------
     1751
     1752    OscDisplay instproc sequence_register {} {
     1753        my instvar config recs_val recs_bak directory counter
     1754
     1755        set fname [file join $directory oscillogram_$counter.dat]
     1756
     1757        my incr counter
     1758
     1759        if {[catch {my save_data $fname} result]} {
     1760            tk_messageBox -icon error \
     1761                -message "An error occurred while writing to \"$fname\""
     1762        } elseif {$counter <= $recs_bak} {
     1763            set recs_val [expr {$recs_bak - $counter}]
     1764            my acquire_start
     1765            return
     1766        }
    11381767       
    1139         if {$counter <= $recs_val} {
    1140             ${config}.stat configure -text "record $counter of $recs_val"
    1141             set after_handle [after 100 [myproc acquire_register_loop]]
    1142         }
    1143     }
    1144 
    1145 # -------------------------------------------------------------------------
    1146 
    1147     EptDisplay instproc acquire_register_loop {} {
    1148         my instvar after_handle
    1149         my instvar config data recs_val directory counter
    1150 
    1151         my acquire
    1152 
    1153         set file [file join $directory ept_$counter.dat.gz]
    1154 
    1155         set x [catch {set fid [open $file w+]}]
    1156         fconfigure $fid -translation binary -encoding binary
    1157 
    1158         set y [catch {
    1159             puts -nonewline $fid [binary format "H*iH*" "1f8b0800" [clock seconds] "0003"]
    1160             puts -nonewline $fid [zlib deflate $data]
    1161             puts -nonewline $fid [binary format i [zlib crc32 $data]]
    1162             puts -nonewline $fid [binary format i [string length $data]]
    1163         }]
    1164 
    1165         set z [catch {close $fid}]
    1166 
    1167         my incr counter
    1168 
    1169         if { $x || $y || $z || ![file exists $file] || ![file isfile $file] || ![file readable $file] } {
    1170             tk_messageBox -icon error -message "An error occurred while writing to \"$file\""
    1171         } elseif {$counter <= $recs_val} {
    1172             ${config}.stat configure -text "record $counter of $recs_val"
    1173             set after_handle [after 100 [myproc acquire_register_loop]]
    1174             return
    1175         }
     1768        my sequence_stop
     1769    }
     1770
     1771# -------------------------------------------------------------------------
     1772
     1773    OscDisplay instproc sequence_stop {} {
     1774        my instvar config recs_val recs_bak sequence
     1775
     1776        set sequence 0
    11761777       
    1177         ${config}.stat configure -text {}
     1778        set recs_val $recs_bak
     1779
    11781780        ${config}.recs_field configure -state normal
    1179         ${config}.sequence configure -state active
     1781        ${config}.sequence configure -text {Start Recording} -command [myproc sequence_start]
    11801782        ${config}.acquire configure -state active
    11811783        ${config}.register configure -state active
    1182 
    1183     }
    1184 
    1185 # -------------------------------------------------------------------------
    1186 
    1187     Class MemDisplay -superclass Display -parameter {
    1188         {number}
    1189         {master}
    1190     }
    1191 
    1192 # -------------------------------------------------------------------------
    1193 
    1194     MemDisplay instproc init {} {
    1195         my instvar data xvec yvec
    1196 
    1197         set xvec [vector #auto]
    1198         set yvec [vector #auto]
    1199 
    1200         # fill one vector for the x axis
    1201         $xvec seq 0 10000
    1202 
    1203         my reset
    1204 
    1205         my setup
    1206 
    1207         next
    1208     }
    1209 
    1210 # -------------------------------------------------------------------------
    1211 
    1212     MemDisplay instproc destroy {} {
    1213         next
    1214     }
    1215 
    1216 # -------------------------------------------------------------------------
    1217 
    1218     MemDisplay instproc reset {} {
    1219         my instvar data xvec yvec
    1220 
    1221         set data {}
    1222 
    1223         $yvec set {}
    1224     }
    1225 
    1226 # -------------------------------------------------------------------------
    1227 
    1228     MemDisplay instproc start {} {
    1229         my instvar config
    1230 
    1231         trace add variable [myvar data] write [myproc data_update]
    1232         trace add variable [myvar last] write [myproc data_update]
    1233     }
    1234 
    1235 # -------------------------------------------------------------------------
    1236 
    1237     MemDisplay instproc setup {} {
    1238         my instvar master
    1239         my instvar data xvec yvec
    1240         my instvar config auto thrs thrs_val disp_val trig_val
    1241 
    1242         # create a graph widget and show a grid
    1243         set graph [graph ${master}.graph -height 250 -leftmargin 80]
    1244         $graph crosshairs configure -hide no -linewidth 2 -dashes { 1 1 }
    1245         $graph grid configure -hide no
    1246         $graph legend configure -hide yes
    1247         $graph axis configure x -min 0 -max 10000
    1248 #        $graph axis configure y -min 0 -max 4100
    1249 
    1250         scale ${master}.last -orient horizontal -from 1 -to 105 -tickinterval 0 -variable [myvar last]
    1251 
    1252         set config [frame ${master}.config]
    1253 
    1254         button ${config}.acquire -text Acquire \
    1255             -bg green -activebackground green -command [myproc acquire]
    1256         button ${config}.register -text Register \
    1257             -bg lightblue -activebackground lightblue -command [myproc register]
    1258 
    1259         grid ${config}.acquire -sticky ew -pady 3 -padx 5
    1260         grid ${config}.register -sticky ew -pady 3 -padx 5
    1261 
    1262         grid ${graph} -row 0 -column 0 -sticky news
    1263         grid ${config} -row 0 -column 1
    1264 
    1265         grid ${master}.last -row 1 -column 0 -columnspan 2 -sticky ew
    1266 
    1267         grid rowconfigure ${master} 0 -weight 1
    1268         grid columnconfigure ${master} 0 -weight 1
    1269         grid columnconfigure ${master} 1 -weight 0 -minsize 80
    1270 
    1271         # enable zooming
    1272         Blt_ZoomStack $graph
    1273 
    1274         #bind .graph <Motion> {%W crosshairs configure -position @%x,%y}
    1275 
    1276         # create one element with data for the x and y axis, no dots
    1277         $graph element create Spectrum -symbol none -xdata $xvec -ydata $yvec
    1278     }
    1279 
    1280 # -------------------------------------------------------------------------
    1281 
    1282     MemDisplay instproc data_update args {
    1283         my instvar data yvec last
    1284 
    1285         set first [expr {$last - 1}]
    1286         $yvec set [lrange $data ${first}0000 ${last}0000]
    1287     }
    1288 
    1289 # -------------------------------------------------------------------------
    1290 
    1291     MemDisplay instproc save_data {data} {
    1292         set file [tk_getSaveFile]
    1293         if {[string equal $file {}]} {
    1294             return
    1295         }
    1296 
    1297         set x [catch {set fid [open $file w+]}]
    1298         set y [catch {puts $fid $data}]
    1299         set z [catch {close $fid}]
    1300 
    1301         if { $x || $y || $z || ![file exists $file] || ![file isfile $file] || ![file readable $file] } {
    1302             tk_messageBox -icon error \
    1303                 -message "An error occurred while writing to \"$file\""
    1304         } else {
    1305             tk_messageBox -icon info \
    1306                 -message "File \"$file\" written successfully"
    1307         }
    1308     }
    1309 
    1310 # -------------------------------------------------------------------------
    1311 
    1312     MemDisplay instproc acquire {} {
    1313         my usbCmdRead 00040000 1 524288
    1314 #        my usbCmdRead 00060000 1 1048576
    1315    }
    1316 
    1317 # -------------------------------------------------------------------------
    1318 
    1319     MemDisplay instproc register {} {
    1320         my save_data [my set data]
    1321     }
    1322 
    1323 # -------------------------------------------------------------------------
    1324 
    1325     namespace export MemDisplay
    1326     namespace export EptDisplay
     1784        ${config}.recover configure -state active
     1785    }
     1786
     1787# -------------------------------------------------------------------------
     1788
     1789    namespace export MuxDisplay
    13271790    namespace export HstDisplay
     1791    namespace export CntDisplay
    13281792    namespace export OscDisplay
    1329     namespace export CfgDisplay
    13301793}
    13311794
    1332 set config [frame .config]
    13331795set notebook [::blt::tabnotebook .notebook -borderwidth 1 -selectforeground black -side bottom]
    13341796
    1335 grid ${config} -row 0 -column 0 -sticky ns -padx 3
    1336 grid ${notebook} -row 0 -column 1  -sticky news -pady 5
     1797grid ${notebook} -row 0 -column 0  -sticky news -pady 5
    13371798
    13381799grid rowconfigure . 0 -weight 1
    1339 grid columnconfigure . 0 -weight 0  -minsize 50
    1340 grid columnconfigure . 1 -weight 1
    1341 
    1342 foreach i {0 1 2} {
    1343     set channel [expr $i + 1]
    1344 
    1345     set window [frame ${notebook}.hst_$i]
    1346     $notebook insert end -text "Histogram $channel" -window $window -fill both
    1347     ::mca::HstDisplay hst_$i -number $i -master $window
    1348 
    1349     set window [frame ${notebook}.osc_$i]
    1350     $notebook insert end -text "Pulse shape $channel" -window $window -fill both
    1351     ::mca::OscDisplay osc_$i -number $i -master $window
    1352 }
    1353 
    1354 #set window [frame ${notebook}.cfg]
    1355 #$notebook insert end -text "Configuration" -window $window -fill both
    1356 ::mca::CfgDisplay cfg -master $config
     1800grid columnconfigure . 0 -weight 1
     1801
     1802::mca::UsbController usb
     1803
     1804set window [frame ${notebook}.hst_0]
     1805$notebook insert end -text "Spectrum histogram" -window $window -fill both
     1806::mca::HstDisplay hst_0 -number 0 -master $window -controller usb
     1807
     1808set window [frame ${notebook}.cnt_0]
     1809$notebook insert end -text "Rate histogram" -window $window -fill both
     1810::mca::CntDisplay cnt_0 -master $window -controller usb
     1811
     1812set window [frame ${notebook}.mux]
     1813$notebook insert end -text "Interconnect" -window $window -fill both
     1814::mca::MuxDisplay mux -master $window -controller usb
    13571815
    13581816set window [frame ${notebook}.ept]
    1359 $notebook insert end -text "EPT" -window $window -fill both
    1360 ::mca::EptDisplay ept -master $window
    1361 
    1362 #set window [frame ${notebook}.mem]
    1363 #$notebook insert end -text "Memory test" -window $window -fill both
    1364 #::mca::MemDisplay mem -master $window
    1365 
    1366 set usb_handle {}
    1367 
    1368 while {[catch {usb::connect 0x09FB 0x6001 1 1 0} usb_handle]} {
    1369     set answer [tk_messageBox -icon error -type retrycancel \
    1370         -message {Cannot access USB device} -detail $usb_handle]
    1371     if {[string equal $answer cancel]} break
    1372 }
    1373 
    1374 # cfg reset
    1375 cfg reset
    1376 
    1377 cfg start
    1378 
    1379 foreach i {0 1 2} {
    1380     hst_$i start
    1381     osc_$i start
    1382 
    1383     hst_$i restart
    1384     osc_$i restart
    1385 }
    1386 
    1387 ept start
    1388 #mem start
     1817$notebook insert end -text "Oscilloscope" -window $window -fill both
     1818::mca::OscDisplay osc -master $window -controller usb
     1819
     1820update
     1821
     1822usb usbCmd 00000000
     1823
     1824hst_0 start
     1825
     1826cnt_0 start
     1827
     1828mux start
     1829
     1830osc start
Note: See TracChangeset for help on using the changeset viewer.