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()); } } }
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 + "'"); }
// 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); }