Ejemplo n.º 1
0
        public N0183Defn GetN0183Defn(N0183Frame msg)
        {
            string headerText = msg.Header.HeaderText;
            int    defnIndex;

            if (_largeTypeCodes.TryGetValue(headerText.Substring(1), out defnIndex))
            {
                msg.Header = new N0183Header(headerText.Substring(0, 1), "", headerText.Substring(1));
                return(N0183Defns[defnIndex]);
            }
            else
            {
                if (N0183Dictionary.TryGetValue(msg.Header.TypeCode, out defnIndex))
                {
                    return(N0183Defns[defnIndex]);
                }
                else
                {
                    return(new UnknownN0183Defn());
                }
            }
        }
Ejemplo n.º 2
0
        public override byte[] GetBytes(Frame frame)
        {
            N0183Frame n0183Frame = frame as N0183Frame;

            if (n0183Frame != null)
            {
                return(Encoding.ASCII.GetBytes(n0183Frame.FullMessage + "\r\n"));
            }

            N2kFrame n2kFrame = frame as N2kFrame;

            if (n2kFrame != null)
            {
                return(Encoding.ASCII.GetBytes(FrameConversion.PackN2k(n2kFrame).FullMessage + "\r\n"));
            }

            AISFrame aisFrame = frame as AISFrame;

            if (aisFrame != null)
            {
                // TODO : Breaking up message if too long

                int    padbits = 6 * aisFrame.AISData.AISString.Length - 8 * aisFrame.AISData.AISBytes.Length; // [0, 5]
                string message = "!AIVDM,1,1,,A," + aisFrame.AISData.AISString + "," + padbits;

                // Add checksum
                byte checksum = 0;
                for (int i = 1; i < message.Length; i++)
                {
                    checksum ^= Convert.ToByte(message[i]);
                }
                message += "*" + checksum.ToString("X2");

                return(Encoding.ASCII.GetBytes(message + "\r\n"));
            }

            throw new Exception("Attempt to send unknown frame type: '" + frame.GetType().Name + "'");
        }
Ejemplo n.º 3
0
        // Public functions
        public override int ProcessBytes(byte[] bytes, int offset, int size)
        {
            int numRead = 0;

            for (int i = 0; i < size; i++)
            {
                byte nextByte      = bytes[offset + i];
                bool startCharRead = (nextByte == startChar1) || (nextByte == startChar2);
                bool endCharRead   = (nextByte == endChar1) || (nextByte == endChar2);

                if (waitingForStart)
                {
                    if (endCharRead)
                    {
                        // We skip over end characters while waiting for start (There is no requirement to read them all when finishing a frame)
                    }
                    else if (startCharRead)
                    {
                        // Read in start character, toggle flag
                        _bufferIdx            = 0;
                        _buffer[_bufferIdx++] = nextByte;
                        waitingForStart       = false;
                    }
                    else
                    {
                        // Start byte does not match, return
                        return(numRead);
                    }
                }
                else
                {
                    if (startCharRead || endCharRead)
                    {
                        if (startCharRead)
                        {
                            i--;
                        }

                        // End character read, and we don't add it to the buffer (Would be trimmed by frame constructor anyway)

                        // Grab message from buffer
                        string msgData = Encoding.ASCII.GetString(_buffer, 0, _bufferIdx);

                        // Create message
                        Frame createdFrame = N0183Frame.TryCreate(msgData, DateTime.Now);
                        if (createdFrame != null)
                        {
                            OnFrameCreated(createdFrame);
                        }

                        // Reset flags and return
                        waitingForStart = true;
                        numRead         = i + 1;
                    }
                    else
                    {
                        _buffer[_bufferIdx++] = nextByte;
                    }
                }
            }

            // Read entire byte[] given.
            return(size);
        }