chiark / gitweb /
sane handling of incoming detections
[trains.git] / hostside / parse-proto-spec
index 0ed738128b4c113d798a675540d55c9fce8dfe05..0dc083d0d5a0c7fc5a5d8e3ec8d83fceb598c881 100755 (executable)
@@ -35,6 +35,11 @@ sub expand_and_write () {
     pln($templl);
 }
 
+sub b2xh ($$) {
+    my ($bin,$orin) = @_;
+    return sprintf "0x%02x", (oct("0b$bin") | $orin);
+}
+
 sub process_line () {
     chomp;
     $origprotoline= $_;
@@ -48,9 +53,9 @@ sub process_line () {
     next unless defined $dirn;
     next unless m/^ ([<>]) / && $1 eq $dirn;
     die if m/\t/;
-    die unless m/^ [<>] ([01A-Za-z. ]+?)   +(\S.*)$/;
+    die unless
+ m/^ [<>] ([01A-Za-z. ]+?)(?:   +|\s+\([+? A-Z0-9a-z]+\)\s+)([^() \t\n].*)$/;
     $msg= $1; $rhs= $2;
-    $rhs =~ s/^\([A-Z][0-9A-Z]+\) +//;
     next if $rhs =~ m/^\}/;
     next if $msg =~ m/\.\.\./;
     $rhs =~ m/^([A-Z]+)\s/ or die "$rhs?";
@@ -58,6 +63,7 @@ sub process_line () {
     $msg =~ s/ //g;
     if ($msg =~ m/^0[01]{7}$/) {
        $opcode= $&;
+       $opcodemask= '11111111';
        $arglen= 0;
        $ybit= 0;
     } else {
@@ -73,6 +79,8 @@ sub process_line () {
            $msg =~ m/^(0[01][01_]{6})$/;
        $opcode= $1;
        die if $opcode =~ m/_[01]/;
+       $opcodemask= $opcode;
+       $opcodemask =~ y/01_/110/;
        $opcode =~ s/_/0/g;
        $arglen= $msg;
        $arglen =~ s/[01]//g;
@@ -84,9 +92,17 @@ sub process_line () {
        $v{yn}= $yval;
        $v{dname}= $dname;
        $v{cname}= $cname;
+       $v{noiselevel}=
+           ($cname =~ m/nmradone/ ? 3 :
+            $cname =~ m/p[io]ng/ ? 2 :
+            $cname =~ m/detect/ ? 2 :
+            0);
        $v{cnameyn}= $cname.$yval;
-       $v{opcode}= sprintf "0x%02x", oct("0b$opcode");
-       $v{opcodeyn}= sprintf "0x%02x", (oct("0b$opcode") | $ybit * $yval);
+       $v{cnameynu}= uc($cname.$yval);
+       $v{opcode}= b2xh($opcode, 0);
+       $v{opcodeyn}= b2xh($opcode, $ybit * $yval);
+       $v{opcodemask}= b2xh($opcodemask, 0);
+       $v{opcodemaskyn}= b2xh($opcodemask, $ybit);
        $v{arglen}= $arglen;
        $v{arglentf}= sprintf "%d", !!$arglen;
        expand_and_write();