Class MakePacket
- java.lang.Object
-
- jmri.jmrix.direct.MakePacket
-
public class MakePacket extends java.lang.Object
Provide utilities for coding/decoding NMRA S&RP DCC packets into sequences to send through a standard serial port.This is strongly based on the makepckt.c file from the PacketScript 1.1. package of Kenneth Rice. The original header comment from that file follows here.
Some Useful Background information startbit: 1 stopbit : 1 databits: 8 baudrate: 19200 ==> one serial bit takes 52.08 usec. (at 19200 baud) ==> NMRA-1-Bit: 01 (52 usec low and 52 usec high) NMRA-0-Bit: 0011 (at least 100 usec low and high) note we are allowed to stretch NMRA-0 e.g. 000111, 00001111, 000001111 are all valid NMRA-0 representations serial stream (only start/stop bits): 0_______10_______10_______10_______10_______10_______10___ ... problem: how to place the NMRA-0- and NMRA-1-Bits in the serial stream examples: 0 0xF0 _____----- 00 0xC6 __--___--- 01 0x78 ____----_- 10 0xE1 _-____---- 001 0x66 __--__--_- 010 0x96 __--_-__-- 011 0x5C ___---_-_- 100 0x99 _-__--__-- 101 0x71 _-___---_- 110 0xC5 _-_-___--- 0111 0x56 __--_-_-_- 1011 0x59 _-__--_-_- 1101 0x65 _-_-__--_- 1110 0x95 _-_-_-__-- 11111 0x55 _-_-_-_-_- ^ ^ start- stop- bit bit Limitation If we ever need to generate a pattern of four '1's followed by a '0' and land it on a the start of a byte boundary - Sorry - it can't be done !! makepckt.c Send an nmra packet out the serial port in such a way that the signal can just be amplified and put on the track. Copyright 1993 Kenneth Rice You may freely distribute this source code, and use all or part of this source code in all software including commercial, freeware, shareware and private applications. Please report bugs, fixes, etc to me at: kenr@xis.xerox.com or 73577,1653 (compuserve) Created 02/08/93 03/05/93 Works for all 3 byte packets. Still errors for 4 byte. 07/01/93 Renamed to makepckt.c to be nice to dos users. 10/23/93 Added backtracking and max length.
-
-
Constructor Summary
Constructors Constructor Description MakePacket()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description (package private) static int[]
bitStreamToSerialBytes(int[] inputBitStream)
Generate the serial bytes from the bit stream.static int[]
createStream(byte[] packet)
Take in the packet as an array of Bytes and convert them into NMRA'1','0' representation, in preparation to be sent over a serial link.(package private) static boolean
readFirstChild(int[] bs, int offset, int validBits, jmri.jmrix.direct.MakePacket.Node thisNode)
Find the first largest (ie longest length) child at this Node.(package private) static boolean
readNextChild(jmri.jmrix.direct.MakePacket.Node thisNode)
Find the next largest (ie longest length) child at this Node.static boolean
setPreambleLength(int preambleLen)
Set the Preamble Length - Default is 15 NRMA '1's Every NMRA packet decoded starts with a preamble Service mode requires longer preambles Thus this public function allowing user to define the lenght of desired preamble
-
-
-
Constructor Detail
-
MakePacket
public MakePacket()
-
-
Method Detail
-
setPreambleLength
public static boolean setPreambleLength(int preambleLen)
Set the Preamble Length - Default is 15 NRMA '1's Every NMRA packet decoded starts with a preamble Service mode requires longer preambles Thus this public function allowing user to define the lenght of desired preamble- Parameters:
preambleLen
- int- Returns:
- boolean true if preamble is a multiple of 5, otherwise fails and returns false
-
createStream
public static int[] createStream(byte[] packet)
Take in the packet as an array of Bytes and convert them into NMRA'1','0' representation, in preparation to be sent over a serial link.- Parameters:
packet
- byte[] NRMA packet in a array of bytes- Returns:
- int[] first byte is length - 0 length indicates failed to do
-
bitStreamToSerialBytes
static int[] bitStreamToSerialBytes(int[] inputBitStream)
Generate the serial bytes from the bit stream.Basically this is a depth first, prune largest tree search, always going down the subtree that uses the most bits for the next byte. If we get an error, backtrack up the tree until we reach a Node that we have not completely traversed all the subtrees for and try going down the subtree that uses the second most bits. Keep going until we finish converting the packet or run out of things to try.
This is not guaranteed to find the shortest serial stream for a given packet, but it is guaranteed to find a stream if one exists. Also, it usually does come up with the shortest packet
- Parameters:
inputBitStream
- sequence of binary bits to send as DCC waveform- Returns:
- sequence of long/short codes to send, coded as voltage high 1, voltage low 0 values as aynch bytes to send at the DCC rate
-
readNextChild
static boolean readNextChild(jmri.jmrix.direct.MakePacket.Node thisNode)
Find the next largest (ie longest length) child at this Node.- Parameters:
thisNode
- (INPUT/OUTPUT) determine if there is another child if so update Node with ie the Bit pattern and its associated lenght- Returns:
- false if one doesn't exist otherwise returns true
-
readFirstChild
static boolean readFirstChild(int[] bs, int offset, int validBits, jmri.jmrix.direct.MakePacket.Node thisNode)
Find the first largest (ie longest length) child at this Node.- Parameters:
bs
- (INPUT) Bit stream arrayoffset
- Offset in to buffervalidBits
- (INPUT) number of valid bits in the bit streamthisNode
- (OUTPUT) where to put largest child found ie the Bit pattern and its associated lenght- Returns:
- false if one doesn't exist otherwise returns true
-
-