// // Class: TelnetDataHandler // Current CLR: 4.0.30319.296 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 3/16/2013 2:12:35 PM // // Copyright (c) 2013 Informatikbüro Daniel Schick. All rights reserved. using System; using System.Collections.Generic; using System.Threading; using System.Diagnostics; using log4net; namespace bsmd.AISService.AIS { public class TelnetDataHandler { AIS_Telnet aisTelnet; AIS_Decoder decoder; Thread readerThread; bool requestStop; internal static ILog _log = LogManager.GetLogger(typeof(TelnetDataHandler)); public TelnetDataHandler(AIS_Telnet telnetConnection, AIS_Decoder aisDecoder) { this.aisTelnet = telnetConnection; this.decoder = aisDecoder; } public AIS_Decoder AIS_Decoder { get { return this.decoder; } } public override string ToString() { return string.Format("Telnet AIS Receiver {0}:{1}", this.aisTelnet.Hostname, this.aisTelnet.Port); } public bool Start(ref string message) { if (readerThread != null) return true; // already running try { this.readerThread = new Thread(new ThreadStart(this.ReaderThread)); readerThread.Start(); this.requestStop = false; message = "reader thread started"; return true; } catch (Exception ex) { message = ex.Message; return false; } } public void Stop() { if (readerThread.IsAlive) { this.requestStop = true; readerThread.Join(); } this.readerThread = null; } private void ReaderThread() { NMEA.Status nmea_Status = NMEA.Status.OK; _log.Info("starting telnet reader thread"); while (!requestStop) { try { string data = this.aisTelnet.ReadLine(); // Trace.WriteLine(data); if (data != null && data.Length > 0) { NMEA decodedSentence = NMEA.Decode(data, ref nmea_Status); if (decodedSentence != null) { if (decodedSentence is NMEA_AIS_Sentence) { NMEA_AIS_Sentence aisSentence = decodedSentence as NMEA_AIS_Sentence; this.decoder.Decode(aisSentence.AIS_Message, aisSentence.Msg_Sentence_Nr, aisSentence.Total_Sentence_Nr, aisSentence.Seq_Message_Ident, this.aisTelnet.StationName); } } else { _log.Info("Serial data handler: NMEA decoder returned null/empty sentence"); } } } catch (Exception ex) { var st = new StackTrace(ex, true); var frame = st.GetFrame(0); var line = frame.GetFileLineNumber(); _log.WarnFormat("Exception in telnet reader thread: {0}, top frame ln {1}", ex.Message, line); } // Thread.Sleep(100); } aisTelnet.Close(); } } }