Subversion Repositories HomeAutomation

Rev

Rev 450 | Rev 770 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
450 arune 1
using System.Threading;
2
using System;
3
 
4
public class CanNMT {
5
    private const byte CAN_NMT              = 0x00;
6
 
7
    private const byte CAN_NMT_RESET        = 0x04;
8
    private const byte CAN_NMT_BIOS_START   = 0x08;
9
    private const byte CAN_NMT_PGM_START    = 0x0C;
10
    private const byte CAN_NMT_PGM_DATA     = 0x10;
11
    private const byte CAN_NMT_PGM_END      = 0x14;
12
    private const byte CAN_NMT_PGM_COPY     = 0x18;
13
    private const byte CAN_NMT_PGM_ACK      = 0x1C;
14
    private const byte CAN_NMT_PGM_NACK     = 0x20;
15
    private const byte CAN_NMT_START_APP    = 0x24;
16
    private const byte CAN_NMT_APP_START    = 0x28;
17
    private const byte CAN_NMT_HEARTBEAT    = 0x2C;
18
 
19
    CanPacket cp;
20
    private bool running = false;
21
 
22
    public CanNMT() {
23
        cp = new CanPacket();
24
        cp.setExt(1);
25
    }
453 arune 26
 
27
    public CanNMT(CanPacket cp) {
28
        this.cp = cp;
29
        this.cp.setExt(1);
30
    }
450 arune 31
 
453 arune 32
    public byte getSender() {
33
        return (byte)((cp.getId()>>8)&0xFF);
34
    }
35
 
36
    public bool isNMTPacket() {
37
        if (((cp.getId()>>24)&0xFF) == 0) {
38
            return true;
39
        }
40
        return false;
41
    }
42
 
43
    public byte getType() {
44
        return (byte)((cp.getId()>>16)&0xFF);
45
    }
46
 
47
    public byte getReceiver() {
48
        return (byte)((cp.getId()>>0)&0xFF);
49
    }
50
 
450 arune 51
    public void setSender(byte id) {
52
        cp.setId( ( ( cp.getId()&0x00FF00FF )|((uint)id<<8) ) );
53
    }
54
    public void setReceiver(byte id) {
55
        cp.setId( ( ( cp.getId()&0x00FFFF00 )|((uint)id) ) );
56
    }
57
 
58
    public CanPacket getResetPacket() {
59
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_RESET<<16 ) );
60
        cp.setDataLength(0);
61
        return cp;
62
    }
63
 
64
    public CanPacket getStartPacket() {
65
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_START_APP<<16 ) );
66
        cp.setDataLength(0);
67
        return cp;
68
    }
453 arune 69
 
70
    public CanPacket getPgmStartPacket(byte[] data) {
71
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_START<<16 ) );
72
        cp.setData(data);
73
        cp.setDataLength(4);
74
        return cp;
75
    }
76
 
77
    public CanPacket getPgmDataPacket(byte[] data, byte datalen) {
78
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_DATA<<16 ) );
79
        cp.setData(data);
80
        cp.setDataLength(datalen);
81
        return cp;
82
    }
83
 
84
    public CanPacket getPgmEndPacket() {
85
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_END<<16 ) );
86
        cp.setDataLength(0);
87
        return cp;
88
    }
89
 
90
    public CanPacket getPgmCopyPacket(byte[] data) {
91
        cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_COPY<<16 ) );
92
        cp.setData(data);
93
        cp.setDataLength(6);
94
        return cp;
95
    }
450 arune 96
 
97
    public bool isBiosStart(CanPacket cp, byte sender) {
98
        bool returnval = false;
99
        uint id = cp.getId();
100
        if ((id&0x00FF0000) == (CAN_NMT_BIOS_START<<16) && (id&0x0000FF00) == (sender<<8)) {
101
            returnval = true;
102
            byte[] data = cp.getData();
103
            string appinfo = "Application installed";
104
            if (data[2] == 0) {
105
                appinfo = "No application installed";
106
            }
107
            Console.WriteLine("Bios started on node 0x" + String.Format("{0:x2}", sender) +
108
                                ", bios version 0x" + String.Format("{0:x2}", data[1]) + String.Format("{0:x2}", data[0]) +
109
                                ", " + appinfo
110
                                );
111
        }
112
        return returnval;
113
    }
114
 
115
    public bool doStart(DaemonConnection dc, byte receiver) {
116
        return doStart(dc, receiver, 0);
117
    }
118
 
119
    public bool doStart(DaemonConnection dc, byte receiver, byte sender) {
120
        bool success = true;
121
 
122
        setReceiver(receiver);
123
        dc.sendCanPacket(getStartPacket());
124
        return success;
125
    }
126
 
127
    public bool doReset(DaemonConnection dc, byte receiver) {
128
        return doReset(dc, receiver, 0);
129
    }
130
 
131
    public bool doReset(DaemonConnection dc, byte receiver, byte sender) {
132
        bool success = false;
133
 
134
        setReceiver(receiver);
135
        dc.sendCanPacket(getResetPacket());
136
        CanPacket getcp;
137
        running = true;
138
        dc.flushData();
139
        for (int i = 0; i < 150; i++) {
140
            Thread.Sleep(50);
141
            if (dc.getData(out getcp)) {
142
                if (isBiosStart(getcp, receiver)) {
143
                    success = true;
144
                    break;
145
                }
146
            }
147
 
148
            if (!running) {
149
                break;
150
            }
151
        }
152
        if (!success) {
153
            Console.WriteLine("Timed out while waiting for node to reset");
154
        }
155
        return success;
156
    }
157
 
158
    public void stop() {
159
        running = false;
160
    }
161
 
162
}