Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
Initial support for Linux.
Browse files Browse the repository at this point in the history
... add seperate thread for receiving.
  • Loading branch information
NicolaiPetri committed Sep 7, 2015
1 parent ae1b59b commit c6ac362
Showing 1 changed file with 48 additions and 1 deletion.
49 changes: 48 additions & 1 deletion FrameLayer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Linq;
using System.IO.Ports;
//using System.Collections;
using System.Collections.Concurrent;
Expand Down Expand Up @@ -221,6 +222,33 @@ public EnOceanFrameLayer()
};


}
void recvHackThread()
{
Console.WriteLine("Starting Linux recv hack thread");
byte[] rxBuf = new byte[64];
while (commActive)
{
try {
int readBytes = serialPort.Read(rxBuf, 0, 64);
if (readBytes >0) {
var tBuf = rxBuf.Take(readBytes);
// Console.WriteLine("Got {0} bytes", readBytes);
//byte[] rBuf = new byte[sp.BytesToRead];
//int bytesRead = sp.Read(rBuf, 0, rBuf.Length);
lock(receiveBuffer) {
receiveBuffer.InsertRange(receiveBuffer.Count, tBuf);
receiveIdx += readBytes;
}
}
processReceiveBuffer();
} catch (TimeoutException e) {
// Do nothing
} catch (Exception e) {
Console.WriteLine("E hack : {0}", e);
}
}
Console.WriteLine("Ending Linux recv comm thread");
}
void commThread()
{
Expand Down Expand Up @@ -315,16 +343,30 @@ byte CalculateFrameChecksum(byte[] frameData)
public bool Open(string portName)
{
serialPort = new SerialPort(portName, 57600);
serialPort.DataReceived += new SerialDataReceivedEventHandler(onCommDataReceived);
bool useRecvEvent = true;
int p = (int) Environment.OSVersion.Platform;
if ((p == 4) || (p == 6) || (p == 128)) {
Console.WriteLine ("Running on Unix");
useRecvEvent = false;
}
if (useRecvEvent)
serialPort.DataReceived += new SerialDataReceivedEventHandler(onCommDataReceived);
try
{
serialPort.Open();
if (!useRecvEvent) {
serialPort.ReadTimeout = 50;
var hackThread = new Thread(new ThreadStart(recvHackThread));
hackThread.Start();
}
commThreadHandle = new Thread(new ThreadStart(commThread));
commThreadHandle.Start();
}
catch (Exception e)
{
Console.WriteLine("Error opening port: {0}", e);
if (useRecvEvent)
serialPort.DataReceived -= new SerialDataReceivedEventHandler(onCommDataReceived);
commActive = false;
return false;

Expand Down Expand Up @@ -358,15 +400,20 @@ void onCommDataReceived(
SerialPort sp = (SerialPort)sender;
byte[] rBuf = new byte[sp.BytesToRead];
int bytesRead = sp.Read(rBuf, 0, rBuf.Length);
lock(receiveBuffer) {
receiveBuffer.InsertRange(receiveBuffer.Count, rBuf);
receiveIdx += bytesRead;
}
processReceiveBuffer();
/* Console.WriteLine("Data Received: {0} bytes", bytesRead);
foreach (var b in receiveBuffer)
{
Console.Write("0x{0:X2} ", b);
}
Console.WriteLine();
*/
}
void processReceiveBuffer() {
AGAIN:
while (receiveBuffer.Count > 0 && receiveBuffer[0] != 0x55)
receiveBuffer.RemoveAt(0);
Expand Down

0 comments on commit c6ac362

Please sign in to comment.