116 lines
3.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|