git_bsmd/AIS/bsmd.AISService/AIS/TelnetDataHandler.cs

116 lines
3.7 KiB
C#

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