Subversion Repositories HomeAutomation

Rev

Rev 453 | Go to most recent revision | Details | 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;
12
	private string host;
13
	private int port;
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) {
60
			Thread.Sleep(20);
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);
68
				if (tcpdata.Length>3) {
69
					CanPacket cp = new CanPacket(tcpdata.Substring(4));
70
					canPackets.Enqueue(cp);
71
					//Console.WriteLine(cp.toRawString());
72
				}
73
			}
74
		}
75
 
76
		ns.Close();
77
		tc.Close();
78
	}
79
 
80
	public void stop() {
81
		running = false;
82
	}
83
 
84
	public void sendCanPacket(CanPacket cp) {
85
		if (running) {
86
			try {
87
				byte[] data = new byte[1024];
88
 
89
				data = Encoding.ASCII.GetBytes(cp.toRawString()+"\n");
90
				ns.Write(data, 0, data.Length);
91
			}
92
			catch (Exception) {
93
				Console.WriteLine("Unknown error occured when trying to send data to host");
94
				running = false;
95
			}
96
		}
97
	}
98
 
99
}