
| Current Path : /var/www/web-klick.de/dsh/90_akt/DivBasicF/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/90_akt/DivBasicF/CanSignals.pm |
package DivBasicF::CanSignals;
use strict;
use DivBasicF::BlackBoard;
use Data::Dumper;
sub new {
my $class = shift;
my $self = {};
$self->{'IN'} = DivBasicF::BlackBoard->new(shift(@_)); # Eingehende Signale
$self->{'OUT'} = DivBasicF::BlackBoard->new(shift(@_)); # Ausgehende Signale
$self->{'TELEGRAMS'} = shift; # Hash von Telegrammen:
# Keys sind die Telegramme
# Values ist ein Array der Signale
# fuer jedes Telegramm, gefolgt von
# der Anzahl der Bits:
# [<bytes>,<signal1>=<bits1>,<signals2>=<bits2>, ...]
# Erster Parameter <bytes> ist die Byte-Laenge
bless($self,$class);
$self->init_telegrams();
return($self);
}
#**************************************************************************
sub init_telegrams {
my $self = shift;
$self->{'SIGNALS'} = {}; # Hash mit allen Signalen. Values:
# [<telegramm>,<position>,<laenge>]
my $o; my $zaehler; my $telegram; my @signalfolge; my $laenge; my $signal;
foreach $telegram (keys %{$self->{'TELEGRAMS'}}) {
@signalfolge = @{$self->{'TELEGRAMS'}->{$telegram}};
shift(@signalfolge);
$zaehler = 1;
while (@signalfolge) {
$signal = shift(@signalfolge);
next if ($signal !~ /^(.*)\=(.*)$/);
$laenge = $2;
$signal = $1;
$self->{'SIGNALS'}->{$signal} =
["0x".sprintf("%1x",$telegram),$zaehler,$laenge];
$zaehler = $zaehler + $laenge;
}
}
print Dumper($self->{'TELEGRAMS'});
print Dumper($self->{'SIGNALS'});
}
#***********************************************************************
# Reads CAN-Signals in Hex-Format
sub fetch {
my $self = shift;
my $max_telegrams = shift;
my $name; my $len; my $data; my $telegram; my $o; my $time1; my $time2;
my $telegrams = "";
my $zaehler = 0;
while ($zaehler < $max_telegrams) {
$zaehler = $zaehler + 1;
$o = $self->{'IN'}->get();
last if (!@$o);
print "GETXX: $o " . join(" --- ",@$o) . "\n";
$telegram = sprintf("%1x",eval($o->[0]));
$time2 = $o->[1];
$o = $self->telegram_to_signal($telegram);
next if (!$o);
unshift(@$o,"TELEGRAM=".$telegram);
push(@$o,"TIME2=".$time2);
$telegrams = $telegrams . join(",",@$o) . "\n";
}
return($telegrams);
}
#***********************************************************************
sub telegram_to_signal {
my $self = shift;
my $telegram = shift;
my $signal; my $wert;
my $name = substr($telegram,0,3);
my $len = substr($telegram,3,1);
my $data = substr($telegram,4,2*$len);
my $time2 = substr($telegram,2*$len+4,4);
if (length($data) != 2*$len or ($time2 and length($time2) != 4)) {
print "FEHLER\n";
return([]);
}
my $data_bin = sprintf("%0".sprintf("%1u",8*$len)."b",eval("0x".$data));
my $ee = $self->{'TELEGRAMS'}->{$name};
return("") if (!$ee);
my $telegram1 = [];
my $zaehler = 0;
while (@$ee) {
$signal = shift(@$ee);
$wert = eval("0b".substr($data_bin,$zaehler,shift(@$ee)));
push(@$telegram1,$signal."=".sprintf("%1u",$wert));
}
return($telegram1);
}
#***********************************************************************
sub message {
my $self = shift;
my $signals = shift;
my $signal; my $wert; my $zaehler; my $laenge; my $wert; my $telegram;
my $nachrichten = {};
foreach $signal (split(/,/,$signals)) {
next if ($signal !~ /^(.*)\=(.*)$/);
$wert = $2;
$signal = $1;
$telegram = $self->{'SIGNALS'}->{$signal}->[0];
$zaehler = $self->{'SIGNALS'}->{$signal}->[1];
$laenge = $self->{'SIGNALS'}->{$signal}->[2];
if (!($nachrichten->{$telegram})) { # Telegramm
$nachrichten->{$telegram} =
sprintf(
"%0" .
sprintf("%1u",8*$self->{'TELEGRAMS'}->{$telegram}->[0]) .
"u",
0
);
}
$nachrichten->{$telegram} =
substr($nachrichten->{$telegram},0,$zaehler-1) .
sprintf("%0" . sprintf("%1u",8*$laenge) . "b",$wert);
substr($nachrichten->{$telegram},$zaehler+$laenge);
}
foreach $telegram (keys %$nachrichten) {
$self->{'OUT'}->msg($telegram . $self->{'TELEGRAMS'}->{$telegram}->[0] .
sprintf("%0" . 2*$self->{'TELEGRAMS'}->{$telegram}->[0] .
"x",eval("0b".$nachrichten->{$telegram})));
}
}
#***************************************************************
1;