
| 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/PCan.pm |
package DivBasicF::PCan;
use strict;
use DivBasicF::Vector;
# use DivBasicF::AULocale;
use Logic::lq;
use Term::ReadLine;
use vars qw(@ISA);
sub new {
my $class = shift;
my $self = {};
$self->{'___LISTEN___'} = shift; # Socket, von dem gelesen wird
$self->{'___SEND___'} = shift; # Socket, an den gesandt wird
$self->{'___SYSCOMMAND___'} = shift; # syscommand fuer transmit
$self->{'___FILE___'} = shift; # Datei mit zu sendenden Daten
bless($self,$class);
if ($self->{'___LISTEN___'} eq "STDIN") {
$self->{'___LISTEN_MODE___'} = 0;
}
elsif ($self->{'___LISTEN___'} =~ /PubSub/) {
$self->{'___LISTEN_MODE___'} = 2;
$self->{'___STACK___'} = [];
}
elsif ($self->{'___LISTEN___'} =~ /BlackBoard/) {
$self->{'___LISTEN_MODE___'} = 3;
$self->{'___STACK___'} = [];
}
else {
$self->{'___LISTEN_MODE___'} = 1;
}
if ($self->{'___SEND___'} eq "STDIN") {
$self->{'___SEND_MODE___'} = 0;
}
elsif ($self->{'___SEND___'} =~ /PubSub/) {
$self->{'___SEND_MODE___'} = 2;
}
elsif ($self->{'___SEND___'} =~ /BlackBoard/) {
$self->{'___SEND_MODE___'} = 3;
}
else {
$self->{'___SEND_MODE___'} = 1;
}
$self->read_in_signals();
$self->{'NRCMD'} = 0;
$self->{'NRNR'} = 1;
$self->{'NRBIT'} = 2;
$self->{'NRLEN'} = 3;
$self->{'NRINIT'} = 4;
if (!($main::__terminal)) {
$main::__terminal = Term::ReadLine->new("PCAN");
}
autoflush STDOUT 1;
return($self);
}
#**********************************************************************
sub init_stack {
my $self = shift;
$self->{'VALUES'} = {};
my $o; my $o1;
my $nrcmd = $self->{'NRCMD'};
my $nrnr = $self->{'NRNR'};
my $nrbit = $self->{'NRBIT'};
my $nrlen = $self->{'NRLEN'};
my $nrinit = $self->{'NRINIT'};
# NACHRICHT: Mappt die Nachrichten auf eine Liste von Signalen
# NACHR_NR: Mappt die Nachrichtennummern auf eine Liste von Signalen
foreach $o (keys %{$self->{'SIGNALS'}}) {
$o1 = $self->{'SIGNALS'}->{$o};
$self->{'VALUES'}->{$o} = $o1->[$nrinit] . "\:2";
if (!($self->{'NACHRICHT'}->{$o1->[$nrcmd]})) {
$self->{'NACHRICHT'}->{$o1->[$nrcmd]} = $o1->[$nrnr] . "," . $o;
$self->{'NACHR_NR'}->{$o1->[$nrnr]} = $o1->[$nrcmd] . "," . $o;
} else {
$self->{'NACHRICHT'}->{$o1->[$nrcmd]} =
$self->{'NACHRICHT'}->{$o1->[$nrcmd]} . "," . $o;
$self->{'NACHR_NR'}->{$o1->[$nrnr]} =
$self->{'NACHR_NR'}->{$o1->[$nrnr]} . "," . $o;
}
}
}
#**********************************************************************
sub fetch_raw {
my $self = shift;
my $text = $self->readsocket();
return($text);
}
#**********************************************************************
# Hier koennen Signale vom Stack abgerufen werden.
# Durch Komma getrennte Signale muessen in einem Kommando kommen.
# Die einzelnen Bloecke sind dann Signalfolgen, die in beliebiger
# Reihenfolge hereinkommen koennen.
sub fetch {
my $self = shift;
my $le = shift;
my $zusatz = shift;
my $nrcmd = $self->{'NRCMD'};
my $nrnr = $self->{'NRNR'};
my $nrbit = $self->{'NRBIT'};
my $nrlen = $self->{'NRLEN'};
my $nrinit = $self->{'NRINIT'};
my $o; my $o1; my $o2; my $o3; my $nr;
my $sigval; my $sigvalold; my $sigreset; my $sigtoggle;
my $pcancmd; my $pcancontent; my $pcanlength;
my $signal; my @signallist; my $value;
my $value_old; my $erg; my $varlist; my $lq1;
my $error_statement = "";
if ($zusatz) {
($le,$error_statement) = $self->fetch_prepare($le,$zusatz);
}
my $lq = Logic::lq->new($self,$le);
# Es wird solange vom Stack gelesen, bis das gewuenschte
# Ergebnis erreicht ist
my $stack = [];
my $stackcounter = 0;
$self->{'SL'} = {};
my $sl = $self->{'SL'};
while (0 == 0) {
$o = $self->readsocket();
return("___NO_STACK___") if (!$o);
next if ($o !~ /(0x[0123456789ABCDEF]+) +(\d) +(.*)/);
print "N: $o\n";
$stackcounter = $stackcounter + 1;
$pcancmd = $1;
$pcanlength = 8*$2;
$pcancontent = $3;
$pcancmd =~ /^0x(.*)(...)$/;
$pcancmd = "0x" . $2;
$pcancontent =~ s/0x//g;
$pcancontent =~ s/ //g;
$pcancontent = AutoTest::Vector->new_Hex($pcanlength,$pcancontent)->to_Bin("_reverse_");
$pcancontent = $self->bitreverse($pcancontent);
print "BIT: $pcancontent\n";
my $sigresetold = "1";
$o = $self->{'NACHR_NR'}->{$pcancmd};
$o = "," . $o . ",";
if ($o =~ s/,([^,]*)__RESET_STATUS,/,/) {
$o1 = "," . $1 . "__RESET_STATUS" . $o;
}
$o =~ /^,(.*),$/;
@signallist = split(/,/,$1);
$sigreset = 1;
$sigtoggle = 0;
foreach $signal (@signallist) {
$o = $self->{'SIGNALS'}->{$signal};
$sigval = substr($pcancontent,$o->[$nrbit]-1,$o->[$nrlen]);
$sigval = AutoTest::Vector->new_Bin($o->[$nrlen]+1,$sigval)->to_Dec();
while ($sigval =~ /^0(.+)/) { $sigval = $1; } # evtl. unnoetig
$value_old = $self->{'VALUES'}->{$signal};
$value_old =~ /^(.*)\:(.*)$/;
$sigvalold = $1;
next if ($sigvalold == $sigval);
if ($signal =~ /__RESET_STATUS$/) {
$sigreset = $sigval;
$sigtoggle = 1;
$value = $sigval . ":1";
} else {
if (!$sigtoggle and $sigreset) {
$value = $sigval . ":1";
} else {
$value = $sigval . ":0";
}
}
print " ---> S: $signal, $value\n";
$self->{'VALUES'}->{$signal} = $value;
if (!($sl->{$signal})) { $sl->{$signal} = {}; }
$sl->{$signal}->{$stackcounter} = $value;
if (!($sl->{$signal."=".$sigval})) {
$sl->{$signal."=".$sigval} = {}; }
$sl->{$signal."=".$sigval}->{$stackcounter} = 1;
if ($sigreset and !$sigtoggle) {
if (!($sl->{$signal."=++"})) { $sl->{$signal."=++"} = {}; }
$sl->{$signal."=++"}->{$stackcounter} = 1;
}
}
$lq = $lq->collapse();
$lq1 = $lq->substitute("e",$stackcounter)->collapse();
print $lq1->unparse() . "\n";
if ($lq1->junc() eq "OBJ" and $lq1->pars() == 1) {
return($lq1->pars());
}
}
}
#***************************************************************
# Hier koennen Signale vom Stack abgerufen werden.
sub fetch_packetizer {
my $self = shift;
my $pcancmd; my $pcannr;
my $pcancontent; my $text; my $o;
while (0 == 0) {
$o = $self->readsocket();
return("___NO_STACK___") if (!$o);
next if ($o !~ /(0x\d+) +(\d) +(.*) +(.*)/);
print "N: $o\n";
$pcancmd = $1;
$pcancontent = $4;
$pcannr = $3;
$pcancontent =~ s/0x//g;
$pcannr =~ s/0x//g;
$pcancontent =~ s/ //g;
$pcancontent = substr($pcancontent."----------------",0,14);
$pcannr = AutoTest::Vector->new_Hex(8,$pcannr)->to_Dec();
$o = 0;
if ($pcannr > 127) {
$pcannr = $pcannr - 128;
$o = 1;
}
if (!($self->{'PACKET'}->{$pcancmd})) {
$self->{'PACKET'}->{$pcancmd} = [0,""];
}
$text = $self->{'PACKET'}->{$pcancmd}->[1];
if ($o) {
if ($self->{'PACKET'}->{$pcancmd}->[0]) {
return("___ERROR___");
}
$self->{'PACKET'}->{$pcancmd}->[0] = 1;
}
$o = 0;
while (0 == 0) {
last if (length($text) >= 14*($pcannr-1));
$o = 1;
$text = ".............." . $text;
}
if ($o) {
$text = $pcancontent . $text;
} else {
$o = length($text) - 14*($pcannr+1);
$text = substr($text,0,$o-1) .$pcancontent. substr($text,$o+14);
}
if ($text !~ /\./ and $self->{'PACKET'}->{$pcancmd}->[0]) {
$text =~ s/\-//g;
delete ($self->{'PACKET'}->{$pcancmd});
return([$pcancmd,$text]);
} else {
$self->{'PACKET'}->{$pcancmd} = $text;
}
}
}
#**********************************************************************
sub func {
my $self = shift;
my $junc = shift;
my @vals = @_;
my $o; my $o1; my $nr; my $erg;
if ($junc eq "F" or $junc eq "G") { # Fehler? was ist, wenn der
my @signals = split(/,/,$vals[0]); # zweite Parameter groesser
$o = shift(@signals); # ist als de achrichtenstack?
$o1 = $self->{'SL'}->{$o};
return("___UNDEFINED___") if (!$o1);
my %werte = %$o1;
foreach $o (@signals) {
$o1 = $self->{'SL'}->{$o};
return("___UNDEFINED___") if (!$o1);
foreach $nr (keys %werte) {
next if ($o1->{$nr});
delete ($werte{$nr});
}
return("___UNDEFINED___") if (!%werte);
}
if ($junc eq "F") {
foreach $o (sort keys %werte) {
return($o) if ($o >= $vals[1]);
}
} else {
foreach $o (sort reverse keys %werte) {
return($o) if ($o <= $vals[1]);
}
}
return("___UNDEFINED___");
}
elsif ($junc eq "H") { # Fehler? was ist, wenn der zweite
$o = $self->{'SL'}->{$vals[0]}; # Parameter groesser als die Liste ist?
$erg = 0;
foreach $o1 (sort keys %$o) {
last if ($o1 > $vals[1]);
$erg = $o->{$o1};
}
if ($erg =~ /^(.*)\.(.*)$/) {
$erg = $1;
}
return($erg);
}
return("___UNDEFINED___");
}
#**********************************************************************
sub readsocket {
my $self = shift;
my $socket = $self->{'___LISTEN___'};
my $socket_mode = $self->{'___LISTEN_MODE___'};
my $o = 0; my $o1; my $o9; my @ee = (); my @ee1 = ();
if ($socket_mode == 0) {
$o = <STDIN>;
}
elsif ($socket_mode == 1) {
$o = <$socket>;
}
elsif ($socket_mode == 2) {
while (0 == 0) {
last if (@{$self->{'___STACK___'}});
if ($o) { sleep 1; }
$o = 1;
@ee = $socket->get();
if (@ee) {
@ee1 = ();
foreach $o1 (@ee) {
@ee1 = (@ee1,split(/\n/,$o1));
}
$self->{'___STACK___'} = [@ee1];
}
}
$o = shift(@{$self->{'___STACK___'}});
}
elsif ($socket_mode == 3) {
while (0 == 0) {
last if (@{$self->{'___STACK___'}});
if ($o) { sleep 1; }
$o = 1;
$o9 = $socket->get();
if (@$o9) {
@ee1 = ();
foreach $o1 (@$o9) {
@ee1 = (@ee1,split(/\n/,$o1->[1]));
}
$self->{'___STACK___'} = [@ee1];
}
}
$o = shift(@{$self->{'___STACK___'}});
}
return($o);
}
#**********************************************************************
sub message_raw {
my $self = shift;
my $text = shift;
$self->writesocket($text."\n");
print $text . "\n";
return(1);
}
#**********************************************************************
sub message {
my $self = shift;
my $signals = [@_];
my $nrcmd = $self->{'NRCMD'};
my $nrnr = $self->{'NRNR'};
my $nrbit = $self->{'NRBIT'};
my $nrlen = $self->{'NRLEN'};
my $nrinit = $self->{'NRINIT'};
my $nachrichten = {};
my $nlist = [];
my $o; my $o1; my $o2; my $o3; my $o4; my $value; my $pcannr;
my @signallist; my $nrbytes; my $signal; my $value; my $pos; my $len;
foreach $o (@$signals) {
if ($o =~ /^(.*)\=(.*)$/) {
$signal = $1;
$value = $2;
$o1 = $self->{'SIGNALS'}->{$signal};
$pcannr = $o1->[$nrnr];
if (!($nachrichten->{$pcannr})) {
push(@$nlist,$pcannr);
$o2 = "";
@signallist = split(/,/,$self->{'NACHR_NR'}->{$pcannr});
shift(@signallist);
my $sl = $self->{'SIGNALS'};
foreach $o3 (sort {$sl->{$a}->[$nrbit] <=>
$sl->{$b}->[$nrbit]} @signallist) {
$self->{'VALUES'}->{$o3} =~ /(.*)\:(.*)/;
$o4 = $1;
$o2 = $o2 . AutoTest::Vector->new_Dec(
$self->{'SIGNALS'}->{$o3}->[$nrlen],
$o4)->to_Bin();
}
$nrbytes = sprintf("%1u",(length($o2)-1)/8) + 1;
$o2 = substr($o2."000000000",0,8*$nrbytes);
$nachrichten->{$pcannr} = $o2;
}
$o2 = $nachrichten->{$pcannr};
$pos = $self->{'SIGNALS'}->{$signal}->[$nrbit];
$len = $self->{'SIGNALS'}->{$signal}->[$nrlen];
$self->{'VALUES'}->{$signal} = $value.":2";
$o2 = substr($o2,0,$pos-1) .
AutoTest::Vector->new_Dec($len,$value)->to_Bin() .
substr($o2,$pos+$len-1);
$nachrichten->{$pcannr} = $o2;
}
}
my $text = ""; my $tt; my $zaehler;
foreach $o (@$nlist) {
print "ZZ: $o\n";
$tt = $o . " ___ZAEHLER___";
$o1 = $nachrichten->{$o};
$o3 = "";
while ($o1 =~ /^([01])(.*)$/) {
$o3 = $1 . $o3;
$o1 = $2;
}
print $o3 . "\n";
$zaehler = 0;
while ($o3) {
$zaehler = $zaehler + 1;
$tt = $tt . " 0x" . AutoTest::Vector->new_Bin(8,substr($o3,0,8))->to_Hex();
$o3 = substr($o3,8);
}
$tt =~ s/___ZAEHLER___/$zaehler/;
$text = $text . "m s " . $tt . "\n";
}
$text = $text . "\n";
print $text;
$self->writesocket($text);
}
#**********************************************************************
sub message_packetizer {
my $self = shift;
my $canid = shift;
my $text = shift;
my $nlist = [];
my $zaehler = 0;
my $o; my $zaehler; my $nr; my $tt;
while ($text) {
push(@$nlist,substr($text,0,14));
$text = substr($text,14);
$nr = $nr + 1;
}
my $diff = 128;
foreach $o (@$nlist) {
$nr = $nr - 1;
$zaehler = 1;
$tt = $canid . " ___ZAEHLER___ " .
"0x0" . AutoTest::Vector->new_Dec(8,$nr+$diff)->to_Hex();
$diff = 0;
while ($o) {
$zaehler = $zaehler + 1;
$tt = $tt . " 0x" . substr($o,0,2);
$o = substr($o,2);
}
$tt =~ s/___ZAEHLER___/$zaehler/;
$text = $text . "m s " . $tt . "\n";
}
$text = $text . "\n";
print $text;
$self->writesocket($text);
}
#**********************************************************************
sub bitreverse {
my $self = shift;
my $bits = shift;
my $o3 = "";
while ($bits =~ /^([01])(.*)$/) {
$o3 = $1 . $o3;
$bits = $2;
}
return($o3);
}
#**********************************************************************
sub writesocket {
my $self = shift;
my $text = shift;
my $socket = $self->{'___SEND___'};
my $socket_mode = $self->{'___SEND_MODE___'};
if ($socket_mode == 0) {
print $text;
}
elsif ($socket_mode == 1) {
print $socket $text;
}
elsif ($socket_mode == 2) {
$socket->msg($text);
}
elsif ($socket_mode == 3) {
$socket->msg($text);
}
}
#**********************************************************************
sub dialog {
my $self = shift;
my $text = shift;
my $prompt = shift;
if (!$prompt) {
$prompt = "<enter>";
}
print $text;
flush STDOUT;
if (-f "/etc/fstab") {
print "\n";
}
my $erg = $main::__terminal->readline($prompt);
return($erg);
}
#**********************************************************************
sub read_in_signals {
my $self = shift;
my $can_ndw = <<'TEXT_ENDE';
AE_AKFKT
0x11E (
RESET_STATUS
DRV 8
CHP 8
SPR 8
S_VIDEO_OFF
)
AE_APWRT
0x071 (
RESET_STATUS
WARTUNG_JAHR 7
WARTUNG_MON 4
WARTUNG_TAG 5
INSTR_TIME 16
)
AE_HF
0x096 (
RESET_STATUS
ONOFF
SET_INTENS 2
INTENS 8
MODUL 3
)
AE_INSTSTAT
0x056 (
RESET_STATUS
HOLDER 8
INSTR1_TYP 4
INSTR2_TYP 4
INSTR3_TYP 4
INSTR4_TYP 4
INSTR5_TYP 4
INSTR6_TYP 4
INSTR7_TYP 4
)
AE_KLVN
0x094 (
RESET_STATUS
KLST_KL1
KLST_KL2
KLST_KL3
KLST_KL4
KLST_KL5
KLST_KL6
VNST_KLVN 3
SPRAY_INIT
KLST_KL7
)
AE_OPTION
0x072 (
RESET_STATUS
FILMB
SPRAY_HEIZER
)
AE_PA_COOLAIR
0x053 (
RESET_STATUS
FAKTOR 8
MOTORNR 4
)
AE_PA_KALIBRIERUNG
0x058 (
RESET_STATUS
MOTORNR 2
)
AE_PA_PARAMETER
0x059 (
RESET_STATUS
LICHT_AN
LICHT_INTENSITAET 8
LICHT_SPANNUNG 8
PATMOTDREHRICHTUNG
PATMOTFREIGABE
PATMOTFUSSCHALTERTYP
PATMOTKALIB
PATMOTKANALNR 3
PATMOTMAXDREHMOMENT 16
PATMOTMAXDREHZAHL 16
PATMOTMODE 3
PATMOTOPERATIONMODE 2
)
AE_SERV
0x412 (
INHALT 64
)
AE_SET_ERROR
0x068 (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
AE_SET_HE
0x05A (
RESET_STATUS
AUTOPURGE_FLAG
PREPARE_PURGE
PURGE_FLAG
STOP_PURGE
)
AE_STAT
0x093 (
RESET_STATUS
AUTOPURGE_ACTIVE
AUTOPURGE_TIME 8
BLOWOUT
EMR_TEST_STAT 2
ERROR
FILMB
FREMDKAMERA
INSTR_MODE 2
LOCK_KBD
NACHKUEHLEN
PR_BEEP
PURGE_ACTIVE
PURGE_TIME 8
PU_BEEP
REST_PURGE_TIME 7
ROEFI_TASTE
SPUELMENGE 4
SPV_WASSERHEIZER
STORE_MODE 2
TEMP_WASSER 3
VIDEOMODE_LOCKED
VIDEO_MODE
VMS
WASSER_VERBRAUCHER
)
AE_STATUS_EMOTOR
0x062 (
RESET_STATUS
CHIP
COOL_ERR
DIR
EBENE 2
EMK_RI
FS_MODE
ILIGHT
ILIGHT_STEP 4
ILIGHT_VOLT 6
KUEHLUNG
KUEHLUNG_MODE 3
MO_BEEP
NACL_MENGE 4
SPEED 16
SVT_NR1 8
SVT_VALID 3
)
AE_STATUS_EMOTOR_EXT
0x067 (
RESET_STATUS
AUTOREVERSE 2
CALIBRATION 2
DMS_BEEP
DMS_BEEP_KONFIG
RATIO 11
RATIO_SIGN
SPUELUNG
TORQ 16
)
AE_STATUS_HF
0x065 (
RESET_STATUS
AKTIV
EBENE 2
ERROR
INTENSITY 7
MODULATION 3
SVT_VALID 3
)
AE_STATUS_KAMERA
0x066 (
RESET_STATUS
AWB_NOK
AWB_OK
COL_USER
COL_VALID
COL_WERK
OPT0_AWB
OPT0_MIRROR
QUAD_EINZEL
SCHWARZBILD
TYP 7
WEISSBILD
WERKS_DATEN
)
AE_STATUS_SPRAYVIT
0x060 (
RESET_STATUS
HEIZER_LUFT
HEIZER_WASSER
ILIGHT
ILIGHT_STEP 4
ILIGHT_VOLT 6
TEMP_WASSER 3
)
AE_STATUS_TURBINE
0x063 (
RESET_STATUS
CHIP
FS_MODE
ILIGHT
ILIGHT_STEP 4
ILIGHT_VOLT 6
INTENSITY 16
KUEHLUNG
KUEHLUNG_MODE 3
NACL_MENGE 4
)
AE_STATUS_US
0x064 (
RESET_STATUS
BETRIEBS_MODE 2
BOOST
EBENE 2
ENDO_MODE
FS_MODE
ILIGHT
ILIGHT_STEP 4
ILIGHT_VOLT 6
INTENSITY 7
KUEHLUNG
KUEHLUNG_MODE 3
NACL_MENGE 4
SPUELUNG
SVT_VALID 3
)
AE_VERSION
0x302 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
AK_ALIVE
0x041 (
RESET_STATUS
READY
)
AK_OPTION
0x09B (
RESET_STATUS
VENTIL_CODE 3
)
AK_REALTIME
0x040 (
RESET_STATUS
HIGH_TIME
LOW_TIME 16
)
AK_SERV
0x416 (
INHALT 64
)
AK_SET_ERROR
0x0A0 (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
AK_STAT
0x09A (
RESET_STATUS
CFS 2
CHP_ERROR
DRV_ERROR
EMR_TEST_NODE 2
EMR_TEST_STAT 2
ERROR
ERROR_DUMP_MODE 2
FRTST
FRTST_MOD
KLINGEL
KLINGEL_MOD
MOTION_UNBLOCKED
RDSVN
SAN
SPR_ERROR
SS_STATUS 5
SVC_DETECTED
)
AK_VERSION
0x304 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
AP_AEFKT
0x054 (
RESET_STATUS
INST_TEST
PREPARE_PURGE
STOP_PURGE 2
)
AP_AEWRT
0x070 (
RESET_STATUS
INSTR_TIME 16
SET_INSTR_TIME 2
SET_WARTUNG 2
)
AP_CONFIG
0x0D9 (
RESET_STATUS
BEHANDLER_ANZAHL 3
CURSOR_MODE 2
KAMERA_PC_MODUS_TASTE
WEISSBILD
)
AP_OPTION
0x0D8 (
RESET_STATUS
LAUTSPRECHER
)
AP_SERV
0x417 (
INHALT 64
)
AP_SET_AE
0x0C0 (
RESET_STATUS
AUTOPURGE_FLAG
AUTOPURGE_TIME_DECR
AUTOPURGE_TIME_INCR
BLOWOUT
CHNG_STORE_MODE
NACHKUEHLEN
PURGE_FLAG
PURGE_TIME_DECR
PURGE_TIME_INCR
SPUELMENGE_DECR
SPUELMENGE_INCR
TEMP_WASSER_DECR
TEMP_WASSER_INCR
)
AP_SET_AK
0x0C1 (
RESET_STATUS
FRTST
FRWSL
KLINGEL
KLWSL
LORDOSE_DECR
LORDOSE_INCR
MASSAGE
)
AP_SET_EMOTOR
0x0C2 (
RESET_STATUS
CHIP
CHNG_AUTOREVERSE
CHNG_CALIBRATION
CHNG_DIR
CHNG_DMS_BEEP_KONFIG
CHNG_FS_MODE
CHNG_HANDPIECE
CHNG_ILIGHT
CHNG_KUEHLUNG
CMD_STORE
DIR
DIR_CMD
EBENE 2
EBENE_CMD
ILIGHT_STEP_DECR
ILIGHT_STEP_INCR
ILIGHT_VOLT_DECR
ILIGHT_VOLT_INCR
INST_STAT
KUEHLUNG_MODE 3
KUEHLUNG_MODE_CMD
NACL_MENGE_DECR
NACL_MENGE_INCR
SPEED_DECR
SPEED_DECR_FAST
SPEED_INCR
SPEED_INCR_FAST
SPUELUNG
SVT_CHNG_CMD
SVT_CHNG_STOP_CMD
SVT_CMD
SVT_INDEX 3
TORQ_DECR
TORQ_INCR
)
AP_SET_EMOTOR_THERAPIE
0x0D2 (
RESET_STATUS
AUTOREVERSE 2
DMS_BEEP_KONFIG
FS_MODE
ILIGHT
KUEHLUNG
RATIO 11
RATIO_SIGN
SPEED 16
TORQ 16
)
AP_SET_ERROR
0x0CD (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
AP_SET_FILM
0x11A (
RESET_STATUS
ONOFF
)
AP_SET_HE
0x0C3 (
RESET_STATUS
CFS
CONFIG_CFS_POLYLICHT
CONFIG_CFS_SAUGER
SAUGUNG
)
AP_SET_HF
0x0C4 (
RESET_STATUS
CMD_STORE
EBENE 2
EBENE_CMD
INST_STAT
INTENSITY_DECR
INTENSITY_DECR_FAST
INTENSITY_INCR
INTENSITY_INCR_FAST
MODULATION_NEXT
MODULATION_PREV
SVT_CHNG_CMD
SVT_CHNG_STOP_CMD
SVT_CMD
SVT_INDEX 3
)
AP_SET_KAMERA
0x0C5 (
RESET_STATUS
AWB
CLEAR_ALLPICT
NEXT_PICT
QUAD_EINZEL
SCHWARZBILD
SET_LIVE
STORE_PICT
USER_DATEN
WEISSBILD
WERKS_DATEN
)
AP_SET_SL
0x0C6 (
RESET_STATUS
CH_MODE
COMPOSITE
INTDC
INTIC
ONOFF
)
AP_SET_SPRAYVIT_AE
0x0C7 (
RESET_STATUS
CHNG_HEIZER_LUFT
CHNG_HEIZER_WASSER
CHNG_ILIGHT
ILIGHT_STEP_DECR
ILIGHT_STEP_INCR
ILIGHT_VOLT_DECR
ILIGHT_VOLT_INCR
TEMP_WASSER_DECR
TEMP_WASSER_INCR
)
AP_SET_SPRAYVIT_HE
0x0C8 (
RESET_STATUS
CHNG_HEIZER_LUFT
CHNG_HEIZER_WASSER
CHNG_ILIGHT
ILIGHT_STEP_DECR
ILIGHT_STEP_INCR
ILIGHT_VOLT_DECR
ILIGHT_VOLT_INCR
TEMP_WASSER_DECR
TEMP_WASSER_INCR
)
AP_SET_STUHL
0x0C9 (
RESET_STATUS
AEBWD
AEFWD
GKAB
GKAUF
KPAB
KPAUF
LORDOSE_DECR
LORDOSE_INCR
MASSAGE
PATAB
PATAUF
PRG 4
PRG_CMD
PRG_MIT_AE
PRG_STORE_CMD
RLAB
RLAUF
SPEISCHALE_BEI_S
STAB
STAUF
SWAB
SWAUF
)
AP_SET_TURBINE
0x0CA (
RESET_STATUS
CHIP
CHNG_ILIGHT
CHNG_KUEHLUNG
CMD_STORE
ILIGHT_STEP_DECR
ILIGHT_STEP_INCR
ILIGHT_VOLT_DECR
ILIGHT_VOLT_INCR
INST_STAT
KUEHLUNG_MODE 3
KUEHLUNG_MODE_CMD
NACL_MENGE_DECR
NACL_MENGE_INCR
)
AP_SET_US
0x0CB (
RESET_STATUS
CHNG_BETRIEBS_MODE
CHNG_BOOST
CHNG_ENDO_MODE
CHNG_FS_MODE
CHNG_ILIGHT
CHNG_KUEHLUNG
CMD_STORE
EBENE 2
EBENE_CMD
ILIGHT_STEP_DECR
ILIGHT_STEP_INCR
ILIGHT_VOLT_DECR
ILIGHT_VOLT_INCR
INST_STAT
INTENSITY_DECR
INTENSITY_DECR_FAST
INTENSITY_INCR
INTENSITY_INCR_FAST
KUEHLUNG_MODE 3
KUEHLUNG_MODE_CMD
NACL_MENGE_DECR
NACL_MENGE_INCR
SPUELUNG
SVT_CHNG_CMD
SVT_CHNG_STOP_CMD
SVT_CMD
SVT_INDEX 3
)
AP_SET_WE
0x0CC (
RESET_STATUS
AM_TEST
BOWL_ON_S
CHNG_MUND_MODUS
CUP_ON_S
DESINF_MB_LEEREN
HYDROKOLLOID
HYDROKOLLOID_DAUER_DECR
HYDROKOLLOID_DAUER_INCR
MB_LEEREN
MUNDGLAS_HEIZER
MUNDGLAS_HEIZER_MODUS
MUNDM_DECR
MUNDM_INCR
MUNDV
MUND_TEMP_DECR
MUND_TEMP_INCR
REINIGUNG_MSBV
RNDSP
RUNDM_DECR
RUNDM_INCR
SANIER_PREPARE
SANIER_START
)
AP_STATUS
0x057 (
RESET_STATUS
BEHANDLER 3
PANEELTYP 3
THERAPIE_AKTIV 3
THERAPIE_KLAUE 4
TIMER
VIDEO_MODE
)
AP_VERSION
0x303 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
FS_POTI
0x051 (
RESET_STATUS
ANWRT 8
)
FS_SCHALT
0x052 (
RESET_STATUS
FS_RICHT 3
FS_PEDAL
FS_TASTEN 8
FS_KENNUNG 8
)
HE_INSTSTAT
0x09C (
RESET_STATUS
HOLDER 8
INSTR1_TYP 4
INSTR2_TYP 4
INSTR3_TYP 4
INSTR4_TYP 4
INSTR5_TYP 4
)
HE_KLVN
0x099 (
RESET_STATUS
KLST_KL1
KLST_KL2
KLST_KL3
KLST_KL4
KLST_KL5
SPRAY_INIT
VNST_KLVN 3
)
HE_OPTION
0x09F (
RESET_STATUS
OPTSUCTION
POLYLICHT 2
SPRAYVIT 2
)
HE_SERV
0x414 (
INHALT 64
)
HE_SET_AP
0x09E (
RESET_STATUS
TIMER
)
HE_SET_ERROR
0x13B (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
HE_SET_FILM
0x138 (
RESET_STATUS
ONOFF
)
HE_SET_KAMERA
0x13A (
RESET_STATUS
WEISSBILD
)
HE_SET_SL
0x139 (
RESET_STATUS
COMPOSITE
ONOFF
)
HE_STAT
0x098 (
RESET_STATUS
BEEPER
CAMERA 2
CONFIG_CFS_POLYLICHT
CONFIG_CFS_SAUGER
ERROR
OPTION
PL
PLCFS
PURGE_ACTIVE
SAUGI 3
SAUGM
SUCTCFS
WASSER_VERBRAUCHER
)
HE_STATUS_SPRAYVIT
0x09D (
RESET_STATUS
HEIZER_LUFT
HEIZER_WASSER
ILIGHT
ILIGHT_STEP 4
ILIGHT_VOLT 6
TEMP_WASSER 3
)
HE_VERSION
0x301 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
HF_SERV
0x419 (
INHALT 64
)
HF_STAT
0x097 (
RESET_STATUS
ERROR 8
ON
SET_INTENS 2
INTENS 7
INST_TYP 4
MODUL 3
)
HF_VERSION
0x306 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
HP_PRGPS
0x135 (
RESET_STATUS
STARTPR
POSPR
SEL_P0
SEL_P1
SEL_P2
SEL_PS
SEL_PT
)
HP_SET_AK
0x137 (
RESET_STATUS
FREIT
KLINGEL
WEISSBILD
)
HP_SET_WE
0x136 (
RESET_STATUS
MUNDV
RNDSP
SANIER_PREPARE
SANIER_START
)
KS_SERV
0x421 (
INHALT 64
)
KS_SET_ERROR
0x0B1 (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
KS_STATUS
0x0B0 (
RESET_STATUS
MOVING_HEAD
MOVING_SWORD
OKS_BUTTON 8
POSITION_HEAD 16
POSITION_SWORD 16
UKS_BUTTON 8
)
KS_VERSION
0x308 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
PA_AE_INSTR
0x082 (
RESET_STATUS
POS_0 8
POS_1 8
POS_2 8
POS_3 8
POS_4 8
)
PA_AE_KALIBRIERSTATUS
0x083 (
RESET_STATUS
STATUS 2
)
PA_AE_MOT_TEMP
0x084 (
RESET_STATUS
POS_0 8
POS_1 8
POS_2 8
POS_3 8
)
PA_SERV
0x420 (
INHALT 64
)
PA_SET_ERROR
0x081 (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
PA_STATUS
0x080 (
RESET_STATUS
DIR
IST_DREHMOMENT 16
IST_DREHZAHL 16
LICHT
STATUS
TEMP_LIMIT
TORQUE_BARRIER
TORQUE_LIMIT
)
PA_VERSION
0x307 (
RESET_STATUS
HW 8
SW_ARM_MAJ 8
SW_ARM_MIN 8
SW_H8_MAJ 8
SW_H8_MIN 8
VARIANTE 8
)
SL_OPTION
0x142 (
RESET_STATUS
SIROLUX
)
SL_STAT
0x140 (
RESET_STATUS
SRLX
INTEN 8
MODE
COMPOSITE_MODE
)
ST_OPTION
0x113 (
RESET_STATUS
KOPFSTUETZE
LORDOSE
MASSAGE
)
ST_SET_KS
0x0B2 (
RESET_STATUS
POSITION_HEAD 16
POSITION_SWORD 16
TIME_HEAD 16
)
ST_SET_WE
0x114 (
RESET_STATUS
LICHT_EIN
MUNDGLAS_FUELLEN
RUND_SPUELUNG
SPEI_AUSSCHWENKEN
SS_SPEI_AKTIV
)
ST_STAT
0x110 (
RESET_STATUS
EMR_TEST_STAT 2
ERROR
MNPRG 2
PRGST_BEFEHL
PRGST_BWGST
PRGST_PRG 2
)
ST_STATUS
0x111 (
RESET_STATUS
AEBWD
AEFWD
EMR_BEEP
ERR_BEEP
GKAB
GKAUF
KPAB
KPAUF
MASSAGE
PATAB
PATAUF
PRG 4
PRG_BEEP
PRG_MIT_AE 2
PRG_STATE 2
RLAB
RLAUF
SPEISCHALE_BEI_S
STAB
STAUF
SWAB
SWAUF
)
ST_STATUS_SS
0x112 (
RESET_STATUS
ARMLEHNE_AE 2
ARMLEHNE_HE 2
FUSSAUFLAGE 2
HANDLEISTE 2
HE 2
HECKVERKLEIDUNG 2
HUB 2
HUBRAHMEN 2
RUECKENLEHNE 2
SPEISCHALE 2
)
ST_VERSION
0x305 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
SV_AESRV
0x408 (
CMD 64
)
SV_AKSRV
0x409 (
CMD 64
)
SV_APSRV
0x40A (
CMD 64
)
SV_HESRV
0x406 (
CMD 64
)
SV_HFSRV
0x40B (
CMD 64
)
SV_KSSRV
0x40D (
CMD 64
)
SV_PASRV
0x40C (
CMD 64
)
SV_PA_COLMO_REGISTER
0x500 (
RESET_STATUS
REGISTER 8
WERT_0 16
WERT_1 16
WERT_2 16
)
SV_PA_LICHT_PARAMETER
0x502 (
RESET_STATUS
DELAY 8
LMR 8
)
SV_PA_MOT_PARAMETER
0x503 (
RESET_STATUS
AUTOREVERS_ZEIT 8
BLOCK_ZEIT 8
DEC_FAKTOR 8
INC_FAKTOR 8
MAX_TEMP 8
)
SV_PA_REQ_COLMO_REGISTER
0x501 (
RESET_STATUS
REGISTER 8
SCHREIBEN
WERT_0 16
WERT_1 16
WERT_2 16
)
SV_PA_STATUS_LICHT
0x504 (
RESET_STATUS
BNVR 8
LDR 8
LEDNVR 8
LIR 8
LMR 8
LSR 8
)
SV_TEST
0x410 (
REQUEST
)
SV_WESRV
0x407 (
CMD 64
)
WE_AKFKT
0x095 (
RESET_STATUS
UPM_FREI
SAUGM
)
WE_OPTION
0x213 (
RESET_STATUS
AMALGAM
DESINFEKTION
FILMB
HYDROKOLLOID
MSBV
MUNDGLAS_HEIZER
)
WE_SAN
0x211 (
RESET_STATUS
AEST_KL1
AEST_KL2
AEST_KL3
AEST_KL4
AEST_KL5
AEST_KL6
AE_VALVE_ONOFF 3
FHLRK 4
HEST_KL1
HEST_KL2
HEST_KL3
HEST_KL4
HE_VALVE_ONOFF 3
RESTZ_MIN 6
RESTZ_STD 5
SAN
SANAN
SANIER_PHASE 3
SANOK
)
WE_SERV
0x413 (
INHALT 64
)
WE_SET_ERROR
0x214 (
CAT 4
CODE 12
MSEC_HIGH 11
MSEC_LOW 16
NODE_ID 8
SUBSYSTEM_INST 3
SUBSYTEM_ID 10
)
WE_STAT
0x210 (
RESET_STATUS
AE_WASS_OK
AKTIVE_VERBRAUCHER 5
DURCHFLUSS 11
DVGW_MODE
ERROR
HE_WASS_OK
KEIN_WASSER
NETZTEIL_90
SANIER_ACTIVE
SAUGK 3
)
WE_STAT_EXT
0x212 (
RESET_STATUS
AMALGAM 2
BOWL_ON_S
CUP_ON_S
DESIN
DESINF_MB_LEEREN 3
FILMB
HYDROKOLLOID
HYDROKOLLOID_DAUER 8
MB_LEEREN 3
MUNDGLAS_HEIZER
MUNDGLAS_HEIZER_MODUS
MUNDM 4
MUNDV
MUND_TEMP 4
PUMPEN_NOTBETRIEB
REINIGUNG_MSBV
RNDSP
RUNDM 9
)
WE_VERSION
0x300 (
RESET_STATUS
SW_MAJ 8
SW_MIN 8
HW_MAJ 8
HW_MIN 8
)
TEXT_ENDE
# SIGNALS: Liste aller Signale, Format:
# Nachricht,NachrichtNr,Startbit,Laenge,Defaultwert
my $zeile; my $bit; my $laenge;
my $signalname; my $pcancommand; my $pcannr; my $o;
foreach $zeile (split(/\n/,$can_ndw)) {
if ($zeile =~ /^([A-Z]+)\_([A-Z\_]+)/) {
$pcancommand = $zeile;
$bit = 1;
}
elsif ($zeile =~ /0x([0123456789ABCDEF]+)/) {
$pcannr = "0x" . $1;
}
# elsif ($zeile =~ /RESET\_STATUS/) {
# 1;
# }
elsif ($zeile =~ /([A-Z].*)/) {
$signalname = $1;
$laenge = 1;
if ($signalname =~ /^(.*) (\d+)/) {
$laenge = $2;
$signalname = $1;
}
$signalname =~ s/ //g;
$o = 0;
# if ($signalname eq "RESET_STATUS") { $o = 1; }
$self->{'SIGNALS'}->{$pcancommand."__".$signalname} =
[$pcancommand,$pcannr,$bit,$laenge,$o];
# print "$signalname: $pcancommand $pcannr $bit $laenge\n";
$bit = $bit + $laenge;
}
}
}
1;