Subversion Repositories Projects

Rev

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

Rev Author Line No. Line
1563 - 1
package dongfang.mkt.comm;
2
 
3
import java.io.IOException;
4
import java.io.OutputStream;
5
 
1566 - 6
import dongfang.mkt.RequestFrameVisitor;
1563 - 7
import dongfang.mkt.frames.AllDisplaysRequestFrame;
8
import dongfang.mkt.frames.AnalogDebugLabelRequestFrame;
9
import dongfang.mkt.frames.AttitudeDataRequestFrame;
10
import dongfang.mkt.frames.ChangeParameterSetRequestFrame;
11
import dongfang.mkt.frames.CompassHeadingRequestFrame;
1695 - 12
import dongfang.mkt.frames.DCMMatrixRequestFrame;
1563 - 13
import dongfang.mkt.frames.DebugRequestFrame;
14
import dongfang.mkt.frames.ExternalControlRequestFrame;
15
import dongfang.mkt.frames.LoopbackTestRequestFrame;
16
import dongfang.mkt.frames.MotorTestRequestFrame;
17
import dongfang.mkt.frames.OSDDataRequestFrame;
1696 - 18
import dongfang.mkt.frames.ProfilerLabelRequestFrame;
19
import dongfang.mkt.frames.ProfilerRequestFrame;
1563 - 20
import dongfang.mkt.frames.ReadExternalControlRequestFrame;
1611 - 21
import dongfang.mkt.frames.ReadIMUConfigurationRequestFrame;
1688 - 22
import dongfang.mkt.frames.ReadMotorMixerRequestFrame;
1611 - 23
import dongfang.mkt.frames.ReadParamSetRequestFrame;
1690 - 24
import dongfang.mkt.frames.ReadRCChannelsRequestFrame;
1688 - 25
import dongfang.mkt.frames.ReadVariablesRequestFrame;
1563 - 26
import dongfang.mkt.frames.RequestFrame;
27
import dongfang.mkt.frames.ResetRequestFrame;
28
import dongfang.mkt.frames.SetCompassHeadingRequestFrame;
29
import dongfang.mkt.frames.SingleDisplayRequestFrame;
30
import dongfang.mkt.frames.VersionRequestFrame;
1611 - 31
import dongfang.mkt.frames.WriteIMUConfigurationRequestFrame;
1688 - 32
import dongfang.mkt.frames.WriteMotorMixerRequestFrame;
1611 - 33
import dongfang.mkt.frames.WriteParamSetRequestFrame;
1563 - 34
 
35
public class MKOutputStream extends OutputStream implements RequestFrameVisitor {
36
        public class MKDataOutputStream {
37
                int[] inbuf = new int[3];
38
                int[] outbuf = new int[4];
39
                int inbufptr = 0;
40
 
41
                void writeByte(int b) throws IOException {
42
                        if(inbufptr == inbuf.length) flush();
43
                        inbuf[inbufptr++] = b;
44
                }
45
 
1689 - 46
                void writeSignedByte(int b) throws IOException {
47
                        if (b<0) b+= 256;
48
                        writeByte(b);
49
                }
50
 
1563 - 51
                public void writeBytes(int[] bs) throws IOException {
52
                        for (int i=0; i<bs.length; i++)
53
                                writeByte(bs[i]);
54
                }
55
 
56
                void writeWord(int w) throws IOException {
57
                        writeByte(w & 0xff);
58
                        writeByte(w >>> 8);
59
                }
60
 
61
                void writeChars(char[] s) throws IOException {
62
                        for (int i=0; i<s.length; i++) {
63
                                // Here, a 1:1 mapping between byte values and char codes is assumed.
64
                                // That means we're assuming ISO-8859-1 (= the first 256 code points
65
                                // of Unicode, which Java uses for chars)
66
                                writeByte(s[i]);
67
                        }
68
                }
69
 
70
                void flush() throws IOException {
71
                        if (inbufptr == 0)
72
                                return;
73
 
74
                        while(inbufptr < inbuf.length) {
75
                                // add padding .. well just clear it, for tidyness.
76
                                inbuf[inbufptr++] = 0;
77
                        }
78
 
79
                        MKOutputStream.this.writeByte((inbuf[0] >>> 2) + '=');
80
                        MKOutputStream.this.writeByte(( ((inbuf[0] & 0x03) << 4) | (inbuf[1] >>> 4) ) + '=');
81
                        MKOutputStream.this.writeByte(( ((inbuf[1] & 0x0f) << 2) | (inbuf[2] >>> 6)) + '=');
82
                        MKOutputStream.this.writeByte(((inbuf[2] & 0x3f) + '='));
83
 
84
                        inbufptr = 0;
85
                }
86
        }
87
 
88
        final OutputStream os;
89
        MKDataOutputStream base64OutputStream = new MKDataOutputStream();
90
        int crc;
91
 
92
        public MKOutputStream(OutputStream os) {
93
                this.os = os;
94
        }
95
 
96
        @Override
97
        public void write(int b) throws IOException {
98
                os.write(b);
99
                // System.out.println("Writing: " + b);
100
        }
101
 
102
        public void writeByte(int b) throws IOException {
103
                crc += b;
104
                write(b);
105
        }
106
 
107
        public void write(RequestFrame f) throws IOException {
108
                write(crc = '#');
109
 
110
                int address = f.getAddress() + 'a';
111
                writeByte(address);
112
 
113
                // Will cause one of the "visit" methods below 
114
                // to be called, depending on the type of f.
115
                f.accept(this);
116
                base64OutputStream.flush();
117
 
118
                crc %= 4096;
119
                write((crc >>> 6) + '=');
120
                write((crc & 0x3f) + '=');
121
 
122
                write('\r');
123
        }
124
 
125
        /*
126
        public void visit(RequestFrame f) {
127
                throw new RuntimeException("Unbound RequestFrame type: "
128
                                + f.getClass().getSimpleName()
129
                                + ". Don't know how to output.");
130
        }
131
        */
132
 
133
        public void visit(AnalogDebugLabelRequestFrame f) throws IOException {
134
                writeByte('a');
135
                base64OutputStream.writeByte(f.getChannel());
136
        }
137
 
1696 - 138
        public void visit(ProfilerLabelRequestFrame f) throws IOException {
139
                writeByte('f');
140
                base64OutputStream.writeByte(f.getChannel());
141
        }
142
 
1563 - 143
        public void visit(AttitudeDataRequestFrame f) throws IOException {
144
                writeByte('c');
145
                base64OutputStream.writeByte(f.getAutoSendInterval());
146
        }
147
 
148
        public void visit(DebugRequestFrame f) throws IOException {
149
                writeByte('d');
150
                base64OutputStream.writeByte(f.getAutoSendInterval());
151
        }
152
 
1696 - 153
        public void visit(ProfilerRequestFrame f) throws IOException {
154
                writeByte('u');
155
                base64OutputStream.writeByte(f.getAutoSendInterval());
156
        }
157
 
1695 - 158
        public void visit(DCMMatrixRequestFrame f) throws IOException {
159
                writeByte('e');
160
        }
161
 
1563 - 162
        public void visit(ChangeParameterSetRequestFrame f) throws IOException {
163
                writeByte('f');
164
                base64OutputStream.writeByte(f.getParameterSetNumber());
165
        }
166
 
167
        public void visit(VersionRequestFrame f) throws IOException {
168
                writeByte('v');
169
        }
170
 
171
        public void visit(ResetRequestFrame f) throws IOException {
172
                writeByte('R');
173
        }
174
 
175
        public void visit(MotorTestRequestFrame f) throws IOException {
176
                writeByte('t');
177
                base64OutputStream.writeBytes(f.getMotorValues());
178
        }
179
 
180
        public void visit(SingleDisplayRequestFrame f) throws IOException {
181
                writeByte('l');
182
                base64OutputStream.writeByte(f.getMenuItemCode()); // In 0.74 there is not the all in one mode.
183
        }
184
 
185
        public void visit(AllDisplaysRequestFrame f) throws IOException {
186
                writeByte('h');
187
                base64OutputStream.writeByte(f.getPageOrder().getRemoteKeys());
188
                // mdo.writeByte(f.getAutoSendInterval());
189
        }
1688 - 190
 
191
        public void visit(ReadMotorMixerRequestFrame f) throws IOException {
192
                writeByte('n');
193
        }
1563 - 194
 
1688 - 195
        public void visit(WriteMotorMixerRequestFrame f) throws IOException {
196
                writeByte('m');
1689 - 197
                base64OutputStream.writeByte(f.getMotorMixerVersionNumber());
198
                base64OutputStream.writeByte(f.getDataLength());
199
                base64OutputStream.writeChars(f.getName());
1688 - 200
                for(int i=0; i<f.getMatrix().length; i++) {
201
                        int[] row = f.getMatrix()[i];
202
                        for(int j=0; j<row.length; j++) {
1689 - 203
                                base64OutputStream.writeSignedByte(row[j]);
204
                                //System.out.print(row[j] + " ");
1688 - 205
                        }
1689 - 206
                        //System.out.println();
1688 - 207
                }
208
                /*
209
                for(int i=0; i<f.getOppositeMotors().length; i++) {
210
                        base64OutputStream.writeByte(f.getOppositeMotors()[i]);
211
                }
212
                */
213
        }
214
 
215
        public void visit(ReadVariablesRequestFrame f) throws IOException {
1563 - 216
                writeByte('x');
217
        }
218
 
219
        public void visit(ExternalControlRequestFrame f) throws IOException {
220
                writeByte('b');
221
                base64OutputStream.writeByte(f.getDigital()[0]);
222
                base64OutputStream.writeByte(f.getDigital()[1]);
223
                base64OutputStream.writeByte(f.getRemoteButtons());
224
                base64OutputStream.writeByte(f.getPitch());
225
                base64OutputStream.writeByte(f.getRoll());
226
                base64OutputStream.writeByte(f.getYaw());
227
                base64OutputStream.writeByte(f.getThrottle());
228
                base64OutputStream.writeByte(f.getHeight());
229
                base64OutputStream.writeByte(f.getCommand());
230
                base64OutputStream.writeByte(f.getFrameNum());
231
                base64OutputStream.writeByte(f.getArgument());
232
        }
233
 
234
        public void visit(ReadExternalControlRequestFrame f) throws IOException {
235
                writeByte('g');
236
        }
237
 
238
        public void visit(LoopbackTestRequestFrame f) throws IOException {
239
                writeByte('0');
240
                base64OutputStream.writeByte(f.getByte());
241
                base64OutputStream.writeWord(f.getWord());
242
                base64OutputStream.writeChars(f.getChararray());
243
        }
244
 
1611 - 245
        public void visit(ReadParamSetRequestFrame f) throws IOException {
1563 - 246
                writeByte('q');
247
                base64OutputStream.writeByte(f.getConfigurationSetNumber());
248
        }
249
 
1611 - 250
        public void visit(WriteParamSetRequestFrame f) throws IOException {
1563 - 251
                writeByte('s');
252
                base64OutputStream.writeByte(f.getConfigurationSetNumber());
253
                base64OutputStream.writeByte(f.getConfigurationVersionNumber());
1573 - 254
                base64OutputStream.writeByte(f.getDataLength() + 12);
1563 - 255
                base64OutputStream.writeBytes(f.getData());
1573 - 256
                base64OutputStream.writeChars(f.getName());
1563 - 257
        }
258
 
259
        public void visit(SetCompassHeadingRequestFrame f) throws IOException {
260
                writeByte('K');
261
        }
262
 
263
        public void visit(CompassHeadingRequestFrame f) throws IOException {
264
                writeByte('w');
265
        }
266
 
267
        public void visit(OSDDataRequestFrame f) throws IOException {
268
                writeByte('o');
269
                base64OutputStream.writeByte(f.getAutoSendInterval());
270
        }
1611 - 271
 
272
        public void visit(ReadIMUConfigurationRequestFrame f) throws IOException {
273
                writeByte('i');
274
        }
275
 
276
        public void visit(WriteIMUConfigurationRequestFrame f) throws IOException {
277
                writeByte('j');
278
                base64OutputStream.writeByte(f.getConfigurationVersionNumber());
279
                base64OutputStream.writeByte(f.getDataLength());
280
                base64OutputStream.writeBytes(f.getData());
281
        }
1690 - 282
 
283
        public void visit(ReadRCChannelsRequestFrame f) throws IOException {
284
                writeByte('p');
285
        }
1563 - 286
}