# Encoding is as follows (bits from MSbit to LSbit):
#
# RED
+# 6 bits angle
# 1 bit reserved (0)
# 1 bit `edge or core' (currently 0 meaning `core')
-# 6 bits angle
#
# GREEN
# 2 bits segment overflow
# the remainder of the bits are the position of that feature
# the feature all-bits-1 (0b111111) is for fixed track
# (so every moveable feature prefix must contain at least one 0)
+# BUT all of the bits are in the reverse order (so the
+# MSbit of GREEN is the LSbit of the moveable feature position)
#
# BLUE
-# 8 bits segment main
+# 8 bits segment main IN REVERSE ORDER
use strict;
use IO::Handle;
}
}
+sub reverse_bits_in_byte ($) {
+ my ($b) = @_;
+ my ($c);
+ $c = (($b >> 1) & 0x55) | (($b << 1) & 0xaa);
+ $c |= (($b >> 2) & 0x33) | (($b << 2) & 0xcc);
+ $c |= (($b >> 4) & 0x0f) | (($b << 4) & 0xf0);
+ return $c;
+}
+
sub cssnmap ($$$$) {
my ($seg,$movfeatconf,$segnum,$posinfo) = @_;
- my ($green,$blue);
+ my ($green,$blue,$greenr,$bluer);
$green= (($segnum >> 8) & 0x03)<<6;
$green |= $posinfo;
$blue= $segnum & 0xff;
+ $greenr= reverse_bits_in_byte($green);
+ $bluer= reverse_bits_in_byte($blue);
printf("C %s/%s %.10f %.10f\n".
- "# %s/%s 0x%x 0x%x\n",
+ "# %s/%s 0x%x 0x%x 0x%x 0x%x\n",
$seg,$movfeatconf,
- $green/255, $blue/255,
+ $greenr/255, $bluer/255,
$seg,$movfeatconf,
- $green, $blue)
+ $green, $blue, $greenr, $bluer)
or die $!;
}