OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [perl_gui/] [lib/] [perl/] [HexSpin3.pm] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
#!/usr/bin/perl -w
2
package HexSpin;
3
 
4
use strict;
5
use warnings;
6
 
7
#use diagnostics;
8
use Gtk3;
9
 
10
 
11
use Glib qw (TRUE FALSE);
12
 
13
 
14
use Glib::Object::Subclass
15
    Gtk3::Entry::,
16
    signals => {
17
 
18
    };
19
 
20
 
21
 
22
 
23
 
24
use constant SPIN_HEIGHT => 16; # height of arrow pixmap (must
25
                                                                                # correspond to pixmap data)
26
 
27
use constant SPIN_MIDDLE => ( SPIN_HEIGHT / 2 );
28
 
29
use constant VERT_MARGIN => 3;    # top and bottom margin of widget
30
 
31
use constant REPEAT_LATENCY => 700; # msec before first auto repeat
32
use constant REPEAT_INTERVAL => 30; # msec before following auto repeat
33
 
34
 
35
# Pixmap for arrow item of hex pseudo spinbox
36
# -------------------------------------------
37
 
38
my $arrow_xpm = Gtk3::Gdk::Pixbuf->new_from_xpm_data (
39
                        "11 16  3 1",
40
                        "      c None",
41
                        "+     c Black",
42
                        "-     c Gray80",
43
                        "    -+-    ",
44
                        "   -+++-   ",
45
                        "  -++-++-  ",
46
                        " -++- -++- ",
47
                        "-++-   -++-",
48
                        "---     ---",
49
                        "           ",
50
                        "           ",
51
                        "           ",
52
                        "           ",
53
                        "---     ---",
54
                        "-++-   -++-",
55
                        " -++- -++- ",
56
                        "  -++-++-  ",
57
                        "   -+++-   ",
58
                        "    -+-     " );
59
 
60
 
61
 
62
# Arrow-button event in pseudo-spinbox entry widget
63
# =================================================
64
# Argument  #0 : entry widget (pseudo spinbutton)
65
#  #1 : entry-item-position step: +1 or -1
66
#  #2 : event ''
67
#  #3 : threshold y-coordinate between up and down zone
68
 
69
sub SpinarrowHit {
70
     my ( $p_box, $p_pos, $p_event, $p_middle ) = @_;
71
     my         $page;
72
     my ( $x_step, $time_out );
73
     if ( ${$p_box}{'REPEAT'} ne '' ) {
74
 
75
                        # Spin arrow button released: cancel repeat timer
76
 
77
                Glib::Source->remove ( ${$p_box}{'REPEAT'} );
78
                ${$p_box}{'REPEAT'} = '';
79
     }
80
     if ( ref ($p_event) =~ /Button/ ) {
81
 
82
                        # Spin arrow button pressed: step the value, set repeat timer
83
 
84
                if ( index ($p_event->type, 'release' ) > 0 ) {
85
                        unless ( ${$p_box}{'REPEAT'} eq '' ) {
86
                                Glib::Source->remove ( ${$p_box}{'REPEAT'} );
87
                                ${$p_box}{'REPEAT'} = '';
88
                        }
89
                        return;
90
                }
91
                my $step = ${$p_box}{'STEP'};
92
                my $pos_y = $p_event-> y;
93
 
94
                if ( $pos_y <= $p_middle - 1 ) {
95
                        $x_step = 1 * $step;
96
                } elsif ( $pos_y > $p_middle + 1 ) {
97
                        $x_step = -1 * $step;
98
                } else {
99
                        return;
100
                }
101
                $time_out = REPEAT_LATENCY;
102
                $page=1;
103
         } else {
104
 
105
                        # Repeat timer struck: step and re-launch the repeat timer
106
 
107
                $x_step = $p_pos;
108
                $time_out = REPEAT_INTERVAL;
109
                $page=${$p_box}{'PAGE'};
110
     }
111
 
112
     my $x_value = $p_box->get_text ();
113
     $x_value =~ s/\s*//;
114
     unless ( $x_value =~ /^[0-9a-f]+$/i ) { return; }
115
     $x_value= hex ( $x_value );
116
     my $new_val= $x_value + $x_step *$page;
117
     if ( $new_val >= ${$p_box}{'MAX'}  ) { $new_val=${$p_box}{'MAX'} }
118
     if ( $new_val <= ${$p_box}{'MIN'}  ) { $new_val=${$p_box}{'MIN'} }
119
     set_hex_test($p_box,$new_val);
120
     ${$p_box}{'REPEAT'} = Glib::Timeout->add ( $time_out,
121
                                sub {
122
                                        SpinarrowHit ( $p_box, $x_step, '', $p_middle );
123
                                        return FALSE;
124
                                } );
125
} # sub SpinarrowHit
126
 
127
 
128
 
129
# Check contents of the pseudo spinbox against non-hex characters
130
# ===============================================================
131
#   Restore to last valid value in case of error
132
#
133
# Argument  #0 : entry widget (pseudo spinbutton)
134
#  #1 : entry-item-position step: +1 or -1
135
#  #2 : event
136
 
137
sub SpinvalueCheck {
138
     my ( $p_box, $p_pos, $p_event ) = @_;
139
 
140
     my $new_value;
141
     my $old_value = ${$p_box}{'VALUE'};
142
     my $x_shown = $p_box->get_text ();
143
     if ( $x_shown =~ /^[0-9a-f]+$/i ) {
144
                $new_value = hex ( $x_shown );
145
                if( $old_value ==  $new_value){ print "$new_value\n"};
146
                $new_value = ${$p_box}{'MAX'} if ($new_value >= ${$p_box}{'MAX'} );
147
                $new_value = ${$p_box}{'MIN'} if ($new_value <= ${$p_box}{'MIN'} );
148
 
149
 
150
                ${$p_box}{'VALUE'} = $new_value;
151
     } else {
152
                 set_hex_test($p_box, $old_value );
153
 
154
     }
155
} # SpinvalueCheck
156
 
157
 
158
 
159
sub SpinvalueCheck2 {
160
     my ( $p_box, $p_pos, $p_event ) = @_;
161
     return     if( !defined ${$p_box}{'MAX'});
162
     my $x_shown = $p_box->get_text ();
163
     $x_shown =~ s/[^0-9a-fA-F]//g;# remove_not_hex( $x_shown);
164
     my $new_value = hex ( $x_shown );
165
     #print "$x_shown  ,  $new_value\n"; 
166
     $new_value = ${$p_box}{'MAX'} if ($new_value >= ${$p_box}{'MAX'} );
167
     $new_value = ${$p_box}{'MIN'} if ($new_value <= ${$p_box}{'MIN'} );
168
     ${$p_box}{'VALUE'} = $new_value;
169
     $p_box->set_text ( $x_shown );
170
 
171
} # SpinvalueCheck
172
 
173
 
174
sub SpinvalueCheck3 {
175
     my ( $p_box, $p_pos, $p_event ) = @_;
176
     my $x_shown = $p_box->get_text ();
177
     $x_shown =~ s/[^0-9a-fA-F]//g;# remove_not_hex( $x_shown);
178
     my $new_value = hex ( $x_shown );
179
     $new_value = ${$p_box}{'MAX'} if ($new_value >= ${$p_box}{'MAX'} );
180
     $new_value = ${$p_box}{'MIN'} if ($new_value <= ${$p_box}{'MIN'} );
181
 
182
     set_hex_test($p_box,$new_value);
183
 
184
 
185
 
186
} # SpinvalueCheck
187
 
188
sub set_hex_test {
189
        my ($self,$value)=@_;
190
        ${$self}{'VALUE'} = $value;
191
        my $w= ${$self}{'WIDTH'};
192
        $w = ($w ==-1 )? "\%x" : "\%0${w}x";
193
        $self->set_text ( sprintf ( $w, $value ) );
194
}
195
 
196
# Create a hex Spinbutton
197
# =======================
198
# Argument  #0 : intial value
199
#  #1 : lower limit
200
#  #2 : upper limit
201
#
202
# Return:  entry widget created (pseudo spinbutton)
203
#
204
# - program calls: numeric values are represented as perl values
205
# - spinbox display: values are represented as hex strings
206
# - contents of the entry widget are verified (only hex digits?) when
207
#  focus is lost: in case of an error, revert to the last valid hex value.
208
#
209
# State variables attached as hash values:
210
# ${$widget}{VALUE} last accepted value
211
# ${$widget}{MIN} lowest value
212
# ${$widget}{MAX} highest accepted value
213
# ${$widget}{REPEAT} id of repeat timer
214
 
215
sub new {
216
        my ($class, $p_value, $p_min, $p_max, $step, $page ) = @_;
217
        $step =1 if (!defined $step);
218
        $page = 0xFF * $step if (!defined $page);
219
        my $w_temp = Gtk3::Entry->new;
220
 
221
        $w_temp->set_max_length (8);
222
 
223
 
224
        $w_temp->set_editable ( TRUE );
225
        $w_temp->set_size_request ( 140, -1 );
226
        $w_temp->set_icon_from_pixbuf ( 'secondary', $arrow_xpm );
227
        $w_temp->set_icon_activatable ( 'secondary', TRUE );
228
        #$w_temp->set_inner_border ( { 'left'=>4, 'right'=>0,'top'=>VERT_MARGIN, 'bottom'=>VERT_MARGIN } );
229
        $w_temp->signal_connect ( 'icon-press', \&SpinarrowHit, SPIN_MIDDLE );
230
        $w_temp->signal_connect ( 'icon-release', \&SpinarrowHit, SPIN_MIDDLE );
231
        $w_temp->signal_connect ( 'changed', \&SpinvalueCheck2 );
232
        #$w_temp->signal_connect ( 'leave-notify-event', \&SpinvalueCheck );
233
        $w_temp->signal_connect ( 'activate',\&SpinvalueCheck3 );
234
 
235
 
236
        ${$w_temp}{'MIN'} = $p_min;
237
        ${$w_temp}{'MAX'} = $p_max;
238
        ${$w_temp}{'STEP'} = $step;
239
        ${$w_temp}{'PAGE'} =$page;
240
        ${$w_temp}{'WIDTH'} = 8;
241
        $w_temp->set_max_length (8);
242
        $w_temp->set_width_chars(8);
243
 
244
        ${$w_temp}{'REPEAT'} = '';
245
        set_hex_test($w_temp,$p_value);
246
 
247
        my $self = $w_temp;
248
        bless($self,$class);
249
 
250
        return $self;
251
} # sub HexSpinButton
252
 
253
sub set_increments {
254
        my ($self,$step, $page)=@_;
255
        $step =1 if (!defined $step);
256
        $page = 0xFF * $step if (!defined $page);
257
        ${$self}{'STEP'} = $step;
258
        ${$self}{'PAGE'} =$page;
259
}
260
 
261
#set the entry lenth and padding zero with/ Set $digit to -1 if no zero padding  is desired 
262
sub set_digits {
263
        my ($self,$digit)=@_;
264
        if($digit == -1){
265
                $self->set_max_length (16);
266
                $self->set_width_chars(16);
267
                ${$self}{'WIDTH'} = -1;
268
 
269
        }else{
270
                $self->set_max_length ($digit);
271
                $self->set_width_chars($digit);
272
                ${$self}{'WIDTH'} = $digit;
273
        }
274
        my $p_value= ${$self}{'VALUE'};
275
        set_hex_test($self,$p_value);
276
}
277
 
278
 
279
sub get_value {
280
        my $self=shift;
281
        my $x_shown = $self->get_text ();
282
     $x_shown =~ s/[^0-9a-fA-F]//g;# remove_not_hex( $x_shown);
283
     my $new_value = hex ( $x_shown );
284
     return $new_value;
285
     #print "$x_shown  ,  $new_value\n"; 
286
}
287
 
288
 
289
sub set_value {
290
        my ($self,$value)=@_;
291
        set_hex_test($self,$value);
292
}
293
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.