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);
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
}