Subversion Repositories HomeAutomation

Rev

Rev 453 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
450 arune 1
using System;
2
using System.Net;
3
using System.Net.Sockets;
4
using System.Text;
5
using System.Threading;
6
using System.Collections;
7
using System.IO;
8
 
9
public class DaemonConnection {
10
	private TcpClient tc;
11
	private bool running;
453 arune 12
//	private string host;
13
//	private int port;
450 arune 14
	private NetworkStream ns;
15
 
16
	const byte DEBUG_LEVEL = 2;	//0, 1, 2, 3
17
 
18
	private Queue canPackets = Queue.Synchronized(new Queue());
19
 
20
	public DaemonConnection() {
21
	}
22
 
23
	public void flushData() {
24
		canPackets.Clear();
25
	}
26
 
27
	public bool init(string host, int port) {
28
		//connect
29
		bool success = false;
30
		try {
31
			tc = new TcpClient();
32
			tc.Connect(host, port);
33
			ns = tc.GetStream();
34
			Console.WriteLine("Connected to host " + host + " on port " + port);
35
			success = true;
36
			running = true;
37
 
38
			Thread t = new Thread(thread);
39
			t.Start();
40
 
41
		} catch {
42
			Console.WriteLine("Unknown error when connecting to host " + host + " on port " + port);
43
		}
44
		return success;
45
	}
46
 
47
	public bool getData(out CanPacket cp) {
48
		cp = null;
49
		if (canPackets.Count>0) {
50
			cp = (CanPacket)canPackets.Dequeue();
51
			return true;
52
		}
53
		return false;
54
	}
55
 
56
	public void thread() {
57
		byte[] data = new byte[1024];
58
		int recv;
59
		while (running) {
453 arune 60
			Thread.Sleep(1);
450 arune 61
			//Console.Write(".");
62
			if (ns.DataAvailable) {
63
				recv = ns.Read(data, 0, data.Length);
64
				if (recv == 0)
65
					break;
66
 
67
				string tcpdata = Encoding.ASCII.GetString(data, 0, recv);
1397 arune 68
				string [] split = null;
69
				split = tcpdata.Split( '\n' );
70
				for (int i = 0; i < split.Length; i++)
71
				{
72
					if (split[i].Trim().Length>3) {
73
						CanPacket cp = new CanPacket(split[i].Trim().Substring(4));
74
						canPackets.Enqueue(cp);
75
						//Console.WriteLine(cp.toRawString());
76
					}
450 arune 77
				}
78
			}
79
		}
80
 
81
		ns.Close();
82
		tc.Close();
83
	}
84
 
85
	public void stop() {
86
		running = false;
87
	}
88
 
89
	public void sendCanPacket(CanPacket cp) {
90
		if (running) {
91
			try {
92
				byte[] data = new byte[1024];
93
 
94
				data = Encoding.ASCII.GetBytes(cp.toRawString()+"\n");
95
				ns.Write(data, 0, data.Length);
96
			}
97
			catch (Exception) {
98
				Console.WriteLine("Unknown error occured when trying to send data to host");
99
				running = false;
100
			}
101
		}
102
	}
103
 
104
}