private void mainloop()
{
DateTime lastrecv = DateTime.MinValue;
threadrun = true;
bool isrtcm = false;
bool issbp = false;
while (threadrun)
{
try
{
// reconnect logic - 10 seconds with no data, or comport is closed
try
{
if ((DateTime.Now - lastrecv).TotalSeconds > 10 || !comPort.IsOpen)
{
this.LogInfo("Reconnecting");
// close existing
comPort.Close();
// reopen
comPort.Open();
// reset timer
lastrecv = DateTime.Now;
}
}
catch
{
this.LogError("Failed to reconnect");
// sleep for 10 seconds on error
System.Threading.Thread.Sleep(10000);
}
// limit to 110 byte packets
byte[] buffer = new byte[110];
// limit to 180 byte packet if using new packet
if (rtcm_msg)
buffer = new byte[180];
while (comPort.BytesToRead > 0)
{
int read = comPort.Read(buffer, 0, Math.Min(buffer.Length, comPort.BytesToRead));
if (read > 0)
lastrecv = DateTime.Now;
bytes += read;
bps += read;
try
{
if (basedata != null)
basedata.Write(buffer, 0, read);
}
catch
{
}
if (!(isrtcm || issbp))
sendData(buffer, (byte) read);
// check for valid rtcm packets
for (int a = 0; a < read; a++)
{
int seenmsg = -1;
// rtcm
if ((seenmsg = rtcm3.Read(buffer[a])) > 0)
{
isrtcm = true;
sendData(rtcm3.packet, (byte) rtcm3.length);
string msgname = "Rtcm" + seenmsg;
if (!msgseen.ContainsKey(msgname))
msgseen[msgname] = 0;
msgseen[msgname] = (int) msgseen[msgname] + 1;
ExtractBasePos(seenmsg);
}
// sbp
if ((seenmsg = sbp.read(buffer[a])) > 0)
{
issbp = true;
sendData(sbp.packet, (byte) sbp.length);
string msgname = "Sbp" + seenmsg.ToString("X4");
if (!msgseen.ContainsKey(msgname))
msgseen[msgname] = 0;
msgseen[msgname] = (int) msgseen[msgname] + 1;
}
// ubx
if ((seenmsg = ubx_m8p.Read(buffer[a])) > 0)
{
ProcessUBXMessage();
string msgname = "Ubx" + seenmsg.ToString("X4");
if (!msgseen.ContainsKey(msgname))
msgseen[msgname] = 0;
msgseen[msgname] = (int) msgseen[msgname] + 1;
}
}
}
System.Threading.Thread.Sleep(10);
}
catch (Exception ex)
{
this.LogError(ex);
}
}
}