Subversion Repositories Projects

Rev

Rev 266 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 266 Rev 381
1
/********************************************************************************************************************************
1
/********************************************************************************************************************************
2
 *                                                                    
2
 *                                                                    
3
 * Abstaction Layer to Communicate via J2ME and Bluetooth with the FlightCtrl of the MikroKopter Project (www.mikrokopter.de )  
3
 * Abstaction Layer to Communicate via J2ME and Bluetooth with the FlightCtrl of the MikroKopter Project (www.mikrokopter.de )  
4
 *                                                
4
 *                                                
5
 * Author:        Marcus -LiGi- Bueschleb          
5
 * Author:        Marcus -LiGi- Bueschleb          
6
 *
6
 *
7
 * see README for further Infos
7
 * see README for further Infos
8
 *
8
 *
9
 *
9
 *
10
 *******************************************************************************************************************************/
10
 *******************************************************************************************************************************/
11
 
11
 
12
 
12
 
13
package org.ligi.ufo;
13
package org.ligi.ufo;
14
 
14
 
15
 
15
 
16
//#ifdef j2me
16
//#ifdef j2me
17
//# import javax.microedition.io.*;
17
//# import javax.microedition.io.*;
18
//#endif
18
//#endif
19
 
19
 
20
//#ifdef android
20
//#ifdef android
21
import android.util.Log;
21
import android.util.Log;
22
//#endif
22
//#endif
23
 
23
 
24
 
24
 
25
 
25
 
26
import java.io.*;
26
import java.io.*;
27
 
27
 
28
 
28
 
29
public class MKCommunicator
29
public class MKCommunicator
30
    implements Runnable,DUBwiseDefinitions
30
    implements Runnable,DUBwiseDefinitions
31
{
31
{
-
 
32
    public byte slave_addr=-1;
-
 
33
 
-
 
34
    public int primary_abo;
-
 
35
    public int secondary_abo;
-
 
36
    public int default_abo;
32
 
37
 
33
    public int angle_nick=-4242;
38
    public int angle_nick=-4242;
34
    public int angle_roll=-4242;
39
    public int angle_roll=-4242;
35
    public byte bl_retrys=0;
40
    public byte bl_retrys=0;
36
    public boolean init_bootloader=false;
-
 
37
 
41
 
38
    public boolean disconnect_notify=false;
42
    public boolean disconnect_notify=false;
39
 
43
 
40
    public byte lib_version_major=0;
44
    public byte lib_version_major=0;
41
    public byte lib_version_minor=7;
45
    public byte lib_version_minor=9;
42
 
46
 
43
    public byte last_navi_error=0;
47
    public byte last_navi_error=0;
-
 
48
 
-
 
49
    public boolean mixer_change_notify=false;
-
 
50
    public boolean mixer_change_success=false;
-
 
51
 
-
 
52
    public boolean change_notify=false;
-
 
53
    public boolean thread_running=true;
44
 
54
 
45
    public String lib_version_str()
55
    public String lib_version_str()
46
    {
56
    {
47
        return "V"+lib_version_major+"."+lib_version_minor;
57
        return "V"+lib_version_major+"."+lib_version_minor;
48
    }
58
    }
49
   
59
   
50
 
60
 
51
    public int AngleNick()
61
    public int AngleNick()
52
    {
62
    {
53
        if (ufo_prober.is_mk())
63
        if (is_mk())
54
            return angle_nick;
64
            return angle_nick;
55
        else    if (ufo_prober.is_navi())
65
        else    if (is_navi())
56
            return debug_data.analog[0];
66
            return debug_data.analog[0];
57
        return -1;
67
        return -1;
58
 
68
 
59
    }
69
    }
60
 
70
 
61
 
71
 
62
    public int Alt() // in dm
72
    public int Alt() // in dm
63
    {
73
    {
64
        int alt=0;
74
        int alt=0;
65
        if (ufo_prober.is_mk())
75
        if (is_mk())
66
            alt=debug_data.analog[5]/3;
76
            alt=debug_data.analog[5]/3;
67
        else   
77
        else   
68
            if (ufo_prober.is_navi())
78
            if (is_navi())
69
                alt=gps_position.Altimeter/3;
79
                alt=gps_position.Altimeter/3;
70
        if ( alt<0) alt=0;  // mk
80
        if ( alt<0) alt=0;  // mk
71
        if ( alt>20000) alt=0; // navi
81
        if ( alt>20000) alt=0; // navi
72
 
82
 
73
        return alt;
83
        return alt;
74
               
84
               
75
    }
85
    }
76
 
86
 
77
    public String Alt_formated() // in dm
87
    public String Alt_formated() // in dm
78
    {
88
    {
79
        return "" + Alt()/10 + "m";
89
        return "" + Alt()/10 + "m";
80
    }
90
    }
81
    public int AngleRoll()
91
    public int AngleRoll()
82
    {
92
    {
83
        if (ufo_prober.is_mk())
93
        if (is_mk())
84
            return angle_roll;
94
            return angle_roll;
-
 
95
        else   
85
        else    if (ufo_prober.is_navi())
96
            if (is_navi())
86
           
97
           
87
            return debug_data.analog[1];
98
            return debug_data.analog[1];
88
        return -1;
99
        return -1;
89
       
100
       
90
    }
101
    }
91
 
102
 
92
 
103
 
93
    /***************** Section: public Attributes **********************************************/
104
    /***************** Section: public Attributes **********************************************/
94
    public boolean connected=false; // flag for the connection state
105
    public boolean connected=false; // flag for the connection state
95
 
106
 
96
    public String mk_url=""; // buffer the url which is given in the constuctor for reconnectin purposes
107
    public String mk_url=""; // buffer the url which is given in the constuctor for reconnectin purposes
97
 
108
 
98
    public final static int DATA_BUFF_LEN = 20; // in lines
109
    public final static int DATA_BUFF_LEN = 20; // in lines
99
 
110
 
100
    public String[] data_buff;
111
    public String[] data_buff;
101
 
112
 
102
    //    boolean do_log=false;
113
    //    boolean do_log=false;
103
    boolean do_log=true;
114
    boolean do_log=true;
104
 
115
 
105
    int data_buff_pos=0;
116
    int data_buff_pos=0;
106
 
117
 
107
 
118
 
108
    //    public final static int DATA_IN_BUFF_SIZE=512;
119
    //    public final static int DATA_IN_BUFF_SIZE=512;
109
    public final static int DATA_IN_BUFF_SIZE=2048;
120
    public final static int DATA_IN_BUFF_SIZE=2048;
110
    //    public final static int DATA_IN_BUFF_SIZE=4096;
121
    //    public final static int DATA_IN_BUFF_SIZE=4096;
111
 
122
 
112
    public byte user_intent=0;
123
    public byte user_intent=0;
113
    public final static int[] crc16_table = {
-
 
114
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
-
 
115
        0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
-
 
116
        0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
-
 
117
        0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
-
 
118
        0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
-
 
119
        0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
-
 
120
        0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
-
 
121
        0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
-
 
122
        0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
-
 
123
        0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
-
 
124
        0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
-
 
125
        0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
-
 
126
        0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
-
 
127
        0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
-
 
128
        0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
-
 
129
        0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
-
 
130
        0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
-
 
131
        0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
-
 
132
        0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
-
 
133
        0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
-
 
134
        0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
-
 
135
        0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
-
 
136
        0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
-
 
137
        0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
-
 
138
        0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
-
 
139
        0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
-
 
140
        0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
-
 
141
        0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
-
 
142
        0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
-
 
143
        0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
-
 
144
        0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
-
 
145
        0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
-
 
146
    };
-
 
147
 
124
 
148
    public void log(String str)
125
    public void log(String str)
149
    {
126
    {
150
//#ifdef android
127
//#ifdef android
151
        if (do_log)     Log.d("MK-Comm",str);
128
        if (do_log)     Log.d("MK-Comm",str);
152
//#endif
129
//#endif
153
//      canvas.debug.log(str);
130
//      canvas.debug.log(str);
154
        //      System.out.println(str);
131
        //      System.out.println(str);
155
    }
132
    }
156
 
-
 
157
    public int CRC16(int ch, int crc)
-
 
158
    {
-
 
159
        return crc16_table[((crc >> 8) ^ (ch)) & 0xFF] ^ (crc << 8);
-
 
160
    }
-
 
161
 
-
 
162
 
133
 
163
    public int conn_time_in_s()
134
    public int conn_time_in_s()
164
    {
135
    {
165
        if (connected)
136
        if (connected)
166
            return (int)((System.currentTimeMillis()-connection_start_time)/1000);
137
            return (int)((System.currentTimeMillis()-connection_start_time)/1000);
167
        else
138
        else
168
            return 0;
139
            return 0;
169
    }
140
    }
170
    public final static byte BOOTLOADER_STAGE_NONE=0;
-
 
171
    public final static byte BOOTLOADER_STAGE_GOT_MKBL=1;
-
 
-
 
141
 
172
 
142
 
173
    byte bootloader_stage= BOOTLOADER_STAGE_NONE;
143
    //    byte bootloader_stage= BOOTLOADER_STAGE_NONE;
174
 
144
 
175
    public MKLCD LCD;
145
    public MKLCD LCD;
176
    public MKVersion version;
146
    public MKVersion version;
177
    public MKDebugData debug_data;
147
    public MKDebugData debug_data;
178
 
148
 
179
    public int[] extern_control;
149
    public int[] extern_control;
180
 
150
 
181
    public MKGPSPosition gps_position;
151
    public MKGPSPosition gps_position;
182
 
152
 
183
    public MKStickData stick_data;
153
    public MKStickData stick_data;
184
    public MKParamsParser params;
154
    public MKParamsParser params;
185
    public MKWatchDog watchdog;
155
    public MKWatchDog watchdog;
186
    public MKProxy proxy=null;
156
    public MKProxy proxy=null;
187
    public MKStatistics stats ;
157
    public MKStatistics stats ;
188
    //    public DUBwiseDebug debug;
158
    //    public DUBwiseDebug debug;
189
 
159
 
190
    public UFOProber    ufo_prober;
160
    //    public UFOProber      ufo_prober;
191
    public long connection_start_time=-1;
161
    public long connection_start_time=-1;
192
 
162
 
193
 
163
 
194
    public String error_str = null;
164
    public String error_str = null;
195
   
165
   
196
 
166
 
197
    public final static int FC_SLAVE_ADDR              = 'a'+1;
167
    public final static byte FC_SLAVE_ADDR              = 1;
198
    public final static int NAVI_SLAVE_ADDR            = 'a'+2;
168
    public final static byte NAVI_SLAVE_ADDR            = 2;
-
 
169
    public final static byte MK3MAG_SLAVE_ADDR          = 3;
-
 
170
    public final static byte FOLLOWME_SLAVE_ADDR        = 10;
-
 
171
    public final static byte RE_SLAVE_ADDR              = 23;
-
 
172
 
-
 
173
 
-
 
174
 
-
 
175
 
-
 
176
    public boolean is_navi()
-
 
177
    {
-
 
178
        return (slave_addr==NAVI_SLAVE_ADDR);
-
 
179
    }
-
 
180
 
-
 
181
 
-
 
182
    public boolean is_mk()
-
 
183
    {
-
 
184
        return (slave_addr==FC_SLAVE_ADDR);
-
 
185
    }
-
 
186
 
-
 
187
    public boolean is_mk3mag()
-
 
188
    {
-
 
189
        return (slave_addr==MK3MAG_SLAVE_ADDR);
-
 
190
    }
-
 
191
 
-
 
192
    public boolean is_rangeextender()
-
 
193
    {
-
 
194
        return (slave_addr==RE_SLAVE_ADDR);
-
 
195
    }
-
 
196
 
-
 
197
    public boolean is_followme()
-
 
198
    {
-
 
199
        return (slave_addr==FOLLOWME_SLAVE_ADDR);
-
 
200
    }
-
 
201
 
-
 
202
 
-
 
203
 
-
 
204
    public boolean is_incompatible()
-
 
205
    {
-
 
206
        switch (slave_addr)
-
 
207
            {
-
 
208
            case FC_SLAVE_ADDR:
-
 
209
            case NAVI_SLAVE_ADDR:
-
 
210
            case MK3MAG_SLAVE_ADDR:
-
 
211
            case FOLLOWME_SLAVE_ADDR:
-
 
212
            case RE_SLAVE_ADDR:
-
 
213
                return false;
-
 
214
            default:
-
 
215
                return true;
-
 
216
            }
-
 
217
    }
-
 
218
 
-
 
219
    public String extended_name()
-
 
220
    {
-
 
221
        switch (slave_addr)
-
 
222
            {
-
 
223
            case -1:
-
 
224
                return "No Device";
-
 
225
 
-
 
226
            case FC_SLAVE_ADDR:
-
 
227
                return "MK-Connection";
-
 
228
 
-
 
229
            case NAVI_SLAVE_ADDR:
-
 
230
                return "Navi-Connection";
-
 
231
 
-
 
232
            case MK3MAG_SLAVE_ADDR:
-
 
233
                return "MK3MAG-Connection";
-
 
234
 
-
 
235
            case FOLLOWME_SLAVE_ADDR:
-
 
236
                return "FollowMe Connection";
-
 
237
            case RE_SLAVE_ADDR:
-
 
238
                return "RangeExtender Connection";
-
 
239
 
199
    public final static int MK3MAG_SLAVE_ADDR          = 'a'+3;
240
            default:
200
 
241
                return "Incompatible Device";
201
 
242
            }
202
 
243
    }
203
 
244
 
204
    /****************** Section: private Attributes **********************************************/
245
    /****************** Section: private Attributes **********************************************/
205
//#ifdef j2me
246
//#ifdef j2me
206
//#    private javax.microedition.io.StreamConnection connection;
247
//#    private javax.microedition.io.StreamConnection connection;
207
//#endif
248
//#endif
208
 
249
 
209
//#ifdef android
250
//#ifdef android
210
//    java.net.Socket connection;
251
//    java.net.Socket connection;
211
    java.net.Socket connection;
252
    java.net.Socket connection;
212
//#endif
253
//#endif
213
 
254
 
214
 
255
 
215
    private java.io.InputStream reader;    
256
    private java.io.InputStream reader;    
216
    private java.io.OutputStream writer;    
257
    private java.io.OutputStream writer;    
217
 
258
 
218
 
259
 
219
 
260
 
220
    public String name;
261
    public String name;
221
    //    DUBwise root;
262
    //    DUBwise root;
222
 
263
 
223
 
264
 
224
    private boolean sending=false;
265
    private boolean sending=false;
225
    private boolean recieving=false;
266
    private boolean recieving=false;
226
 
267
 
227
 
268
 
228
 
269
 
229
    /******************  Section: public Methods ************************************************/
270
    /******************  Section: public Methods ************************************************/
230
    public MKCommunicator()  
271
    public MKCommunicator()  
231
    {
272
    {
232
 
273
 
233
        data_buff=new String[DATA_BUFF_LEN];
274
        data_buff=new String[DATA_BUFF_LEN];
234
        for (int i=0;i<DATA_BUFF_LEN;i++)
275
        for (int i=0;i<DATA_BUFF_LEN;i++)
235
            data_buff[i]="";
276
            data_buff[i]="";
236
        //      debug=debug_;
277
        //      debug=debug_;
237
        //      root=root_;
278
        //      root=root_;
238
        version=new MKVersion();
279
        version=new MKVersion();
239
        debug_data=new MKDebugData();
280
        debug_data=new MKDebugData();
240
        stick_data=new MKStickData();
281
        stick_data=new MKStickData();
241
        params=new MKParamsParser();
282
        params=new MKParamsParser();
242
        extern_control=new int[EXTERN_CONTROL_LENGTH];
283
        extern_control=new int[EXTERN_CONTROL_LENGTH];
243
        extern_control[EXTERN_CONTROL_CONFIG]=1;
284
        extern_control[EXTERN_CONTROL_CONFIG]=1;
244
        extern_control[EXTERN_CONTROL_FRAME]=1;
285
        extern_control[EXTERN_CONTROL_FRAME]=1;
245
       
286
       
246
        LCD= new MKLCD(this);
287
        LCD= new MKLCD(this);
247
        watchdog=new MKWatchDog(this);
288
        watchdog=new MKWatchDog(this);
248
        gps_position=new MKGPSPosition();
289
        gps_position=new MKGPSPosition();
249
        stats = new MKStatistics();
290
        stats = new MKStatistics();
250
        proxy =new MKProxy(this);
291
        proxy =new MKProxy(this);
251
        ufo_prober=new UFOProber();
292
        //      ufo_prober=new UFOProber();
252
        new Thread( this ).start(); // fire up main Thread 
293
        new Thread( this ).start(); // fire up main Thread 
253
    }
294
    }
254
 
295
 
255
 
296
 
256
 
297
 
257
    public void write_raw(byte[] _data)
298
    public void write_raw(byte[] _data)
258
    {
299
    {
259
        wait4send();
300
        wait4send();
260
        sending=true;
301
        sending=true;
261
        try {
302
        try {
262
        writer.write(_data,0,_data.length);
303
        writer.write(_data,0,_data.length);
263
        writer.flush();
304
        writer.flush();
264
 
305
 
265
        stats.bytes_out+=_data.length;
306
        stats.bytes_out+=_data.length;
266
        }
307
        }
267
        catch ( Exception e){}
308
        catch ( Exception e){}
268
        sending=false;
309
        sending=false;
269
    }
310
    }
270
 
311
 
271
    public void do_proxy(String proxy_url)
312
    public void do_proxy(String proxy_url)
272
    {
313
    {
273
        proxy.connect(proxy_url);
314
        proxy.connect(proxy_url);
274
    }
315
    }
275
   
316
   
276
    //    int port;
317
    //    int port;
277
 
318
 
278
    //  URL string: "btspp://XXXXXXXXXXXX:1" - the X-Part is the MAC-Adress of the Bluetooth-Device connected to the Fligth-Control
319
    //  URL string: "btspp://XXXXXXXXXXXX:1" - the X-Part is the MAC-Adress of the Bluetooth-Device connected to the Fligth-Control
279
    public void connect_to(String _url,String _name)
320
    public void connect_to(String _url,String _name)
280
    {
321
    {
281
        //      port=_port;
322
        //      port=_port;
282
        mk_url=_url; // remember URL for connecting / reconnecting later
323
        mk_url=_url; // remember URL for connecting / reconnecting later
283
        name=_name;
324
        name=_name;
284
        force_disconnect=false;
325
        force_disconnect=false;
285
        connected=false;
326
        connected=false;
286
    }
327
    }
287
 
328
 
288
    public boolean ready()
329
    public boolean ready()
289
    {
330
    {
290
        return (connected&&(version.major!=-1));
331
        return (connected&&(version.major!=-1));
291
    }
332
    }
292
 
333
 
293
 
334
 
294
    public String get_buff(int age)
335
    public String get_buff(int age)
295
    {
336
    {
296
 
337
 
297
        age%=DATA_BUFF_LEN;
338
        age%=DATA_BUFF_LEN;
298
       
339
       
299
        if (age<=data_buff_pos)
340
        if (age<=data_buff_pos)
300
            return ""+data_buff[data_buff_pos-age];
341
            return ""+data_buff[data_buff_pos-age];
301
        else
342
        else
302
            return ""+data_buff[DATA_BUFF_LEN+data_buff_pos-age];
343
            return ""+data_buff[DATA_BUFF_LEN+data_buff_pos-age];
303
       
344
       
304
 
345
 
305
    }
346
    }
306
    /******************  Section: private Methods ************************************************/
347
    /******************  Section: private Methods ************************************************/
307
    private void connect()
348
    private void connect()
308
    {
349
    {
309
        log("trying to connect to" + mk_url);
350
        log("trying to connect to" + mk_url);
310
        try{
351
        try{
311
           
352
           
312
            // old call
353
            // old call
313
            // connection = (StreamConnection) Connector.open(mk_url, Connector.READ_WRITE);
354
            // connection = (StreamConnection) Connector.open(mk_url, Connector.READ_WRITE);
314
         
355
         
315
//#ifdef android
356
//#ifdef android
316
            connection = (new java.net.Socket(mk_url.split(":")[0],Integer.parseInt(mk_url.split(":")[1])));
357
            connection = (new java.net.Socket(mk_url.split(":")[0],Integer.parseInt(mk_url.split(":")[1])));
317
            //.Socket 
358
            //.Socket 
318
 
359
 
319
            reader=connection.getInputStream();
360
            reader=connection.getInputStream();
320
            writer=connection.getOutputStream();
361
            writer=connection.getOutputStream();
321
 
362
 
322
            String magic="conn:foo bar\r\n";
363
            String magic="conn:foo bar\r\n";
323
            writer.write(magic.getBytes());
364
            writer.write(magic.getBytes());
324
            writer.flush();
365
            writer.flush();
325
 
366
 
326
//#else
367
//#else
327
 
368
 
328
//#         connection = (StreamConnection) Connector.open(mk_url);
369
//#         connection = (StreamConnection) Connector.open(mk_url);
329
 
370
 
330
//#         reader=connection.openInputStream();
371
//#         reader=connection.openInputStream();
331
//#         writer=connection.openOutputStream();
372
//#         writer=connection.openOutputStream();
332
 
373
 
333
//#endif
374
//#endif
334
            connection_start_time=System.currentTimeMillis();
375
            connection_start_time=System.currentTimeMillis();
335
            connected=true; // if we get here everything seems to be OK
376
            connected=true; // if we get here everything seems to be OK
336
 
377
 
337
            stats.reset();
378
            stats.reset();
338
 
379
 
339
            log("connecting OK");
380
            log("connecting OK");
340
        }
381
        }
341
        catch (Exception ex)
382
        catch (Exception ex)
342
            {
383
            {
343
                // TODO difference fatal errors from those which will lead to reconnection
384
                // TODO difference fatal errors from those which will lead to reconnection
344
                log("Problem connecting" + "\n" + ex);
385
                log("Problem connecting" + "\n" + ex);
345
            }  
386
            }  
346
    }
387
    }
347
 
388
 
348
    public int[] Decode64(byte[] in_arr, int offset,int len)
389
    public int[] Decode64(byte[] in_arr, int offset,int len)
349
    {
390
    {
350
        int ptrIn=offset;      
391
        int ptrIn=offset;      
351
        int a,b,c,d,x,y,z;
392
        int a,b,c,d,x,y,z;
352
        int ptr=0;
393
        int ptr=0;
353
       
394
       
354
        int[] out_arr=new int[len];
395
        int[] out_arr=new int[len];
355
 
396
 
356
        while(len!=0)
397
        while(len!=0)
357
            {
398
            {
358
                a=0;
399
                a=0;
359
                b=0;
400
                b=0;
360
                c=0;
401
                c=0;
361
                d=0;
402
                d=0;
362
                try {
403
                try {
363
                a = in_arr[ptrIn++] - '=';
404
                a = in_arr[ptrIn++] - '=';
364
                b = in_arr[ptrIn++] - '=';
405
                b = in_arr[ptrIn++] - '=';
365
                c = in_arr[ptrIn++] - '=';
406
                c = in_arr[ptrIn++] - '=';
366
                d = in_arr[ptrIn++] - '=';
407
                d = in_arr[ptrIn++] - '=';
367
                }
408
                }
368
                catch (Exception e) {}
409
                catch (Exception e) {}
369
                //if(ptrIn > max - 2) break;     // nicht mehr Daten verarbeiten, als empfangen wurden
410
                //if(ptrIn > max - 2) break;     // nicht mehr Daten verarbeiten, als empfangen wurden
370
 
411
 
371
                x = (a << 2) | (b >> 4);
412
                x = (a << 2) | (b >> 4);
372
                y = ((b & 0x0f) << 4) | (c >> 2);
413
                y = ((b & 0x0f) << 4) | (c >> 2);
373
                z = ((c & 0x03) << 6) | d;
414
                z = ((c & 0x03) << 6) | d;
374
 
415
 
375
                if((len--)!=0) out_arr[ptr++] = x; else break;
416
                if((len--)!=0) out_arr[ptr++] = x; else break;
376
                if((len--)!=0) out_arr[ptr++] = y; else break;
417
                if((len--)!=0) out_arr[ptr++] = y; else break;
377
                if((len--)!=0) out_arr[ptr++] = z; else break;
418
                if((len--)!=0) out_arr[ptr++] = z; else break;
378
            }
419
            }
379
       
420
       
380
        return out_arr;
421
        return out_arr;
381
 
422
 
382
    }
423
    }
-
 
424
 
-
 
425
 
383
 
426
 
384
    public void wait4send()
427
    public void wait4send()
385
    {
428
    {
386
        while(sending) //||recieving)
429
        while(sending) //||recieving)
387
            sleep(50);
430
            sleep(50);
388
    }
431
    }
389
 
432
 
390
 
433
 
391
    public void sleep(int time)
434
    public void sleep(int time)
392
    {
435
    {
393
        try { Thread.sleep(time); }
436
        try { Thread.sleep(time); }
394
        catch (Exception e)  {   }
437
        catch (Exception e)  {   }
395
    }
438
    }
396
 
439
 
397
    // FC - Function Mappers
440
    // FC - Function Mappers
398
 
441
 
399
    // send a version Request to the FC - the reply to this request will be processed in process_data when it arrives
442
    // send a version Request to the FC - the reply to this request will be processed in process_data when it arrives
400
    public void get_version()
443
    public void get_version()
401
    {
444
    {
402
        stats.version_data_request_count++;
445
        stats.version_data_request_count++;
403
        send_command(0,'v');
446
        send_command(0,'v');
404
    }
447
    }
405
 
448
 
406
    public void set_gps_target(int longitude,int latitude)
449
    public void set_gps_target(int longitude,int latitude)
407
    {
450
    {
408
        int[] target=new int[8];
451
        int[] target=new int[8];
409
        target[0]= (0xFF)&(longitude<<24);
452
        target[0]= (0xFF)&(longitude<<24);
410
        target[1]= (0xFF)&(longitude<<16);
453
        target[1]= (0xFF)&(longitude<<16);
411
        target[2]= (0xFF)&(longitude<<8);
454
        target[2]= (0xFF)&(longitude<<8);
412
        target[3]= (0xFF)&(longitude);
455
        target[3]= (0xFF)&(longitude);
413
        //      send_command(0,'s',target);
456
        //      send_command(0,'s',target);
414
    }
457
    }
415
 
458
 
416
    // send a MotorTest request - params are the speed for each Motor
459
    // send a MotorTest request - params are the speed for each Motor
417
    public void motor_test(int[] params)
460
    public void motor_test(int[] params)
418
    {
461
    {
419
        stats.motortest_request_count++;
462
        stats.motortest_request_count++;
420
        send_command(FC_SLAVE_ADDR,'t',params);
463
        send_command(FC_SLAVE_ADDR,'t',params);
421
    }
464
    }
-
 
465
 
-
 
466
    public void set_mixer_table(int[] params)
-
 
467
    {
-
 
468
       
-
 
469
        send_command(FC_SLAVE_ADDR,'m',params);
-
 
470
    }
-
 
471
 
-
 
472
 
-
 
473
    public long lon;
-
 
474
    public  long lat;
-
 
475
 
-
 
476
    public void send_follow_me(int time)
-
 
477
    {
-
 
478
        long alt=0;
-
 
479
 
-
 
480
        int[] params=new int[29];
-
 
481
 
-
 
482
 
-
 
483
        params[0]=(int)((lon)&0xFF) ;
-
 
484
        params[1]=(int)((lon>>8)&0xFF) ;
-
 
485
        params[2]=(int)((lon>>16)&0xFF) ;
-
 
486
        params[3]=(int)((lon>>24)&0xFF)         ;
-
 
487
 
-
 
488
        params[4]=(int)((lat)&0xFF) ;
-
 
489
        params[5]=(int)((lat>>8)&0xFF) ;
-
 
490
        params[6]=(int)((lat>>16)&0xFF) ;
-
 
491
        params[7]=(int)((lat>>24)&0xFF) ;
-
 
492
 
-
 
493
        params[8]=(int)((alt)&0xFF );
-
 
494
        params[9]=(int)((alt>>8)&0xFF );
-
 
495
        params[10]=(int)((alt>>16)&0xFF);
-
 
496
        params[11]=(int)((alt>>24)&0xFF );
-
 
497
 
-
 
498
        params[12]=2;  // newdata
-
 
499
 
-
 
500
        params[13]=0;  // heading
-
 
501
        params[14]=0;  // heading
-
 
502
       
-
 
503
        params[15]=1;  // tolerance
-
 
504
 
-
 
505
        params[16]=time;  // time
-
 
506
        params[17]=0;  // event
-
 
507
 
-
 
508
        send_command(NAVI_SLAVE_ADDR,'s',params);
-
 
509
    }
422
 
510
 
423
 
511
 
424
    public void send_extern_control()
512
    public void send_extern_control()
425
    {
513
    {
426
 
514
 
427
        stats.external_control_request_count++;
515
        stats.external_control_request_count++;
428
        send_command(FC_SLAVE_ADDR,'b',extern_control);
516
        send_command(FC_SLAVE_ADDR,'b',extern_control);
429
    }
517
    }
430
 
518
 
431
    /*    public void send_keys(int[] params)
519
    /*    public void send_keys(int[] params)
432
          {
520
          {
433
          send_command(FC_SLAVE_ADDR,'k',params);
521
          send_command(FC_SLAVE_ADDR,'k',params);
434
          }*/
522
          }*/
435
   
523
   
436
    // get params
524
    // get params
437
    public void get_params(int id)
525
    public void get_params(int id)
438
    {
526
    {
439
        wait4send();
527
        wait4send();
440
        send_command(FC_SLAVE_ADDR,'q',id+1);
528
        send_command(FC_SLAVE_ADDR,'q',id+1);
441
        stats.params_data_request_count++;
529
        stats.params_data_request_count++;
442
    }
530
    }
443
 
531
 
444
   public void get_debug_name(int id)
532
   public void get_debug_name(int id)
445
    {
533
    {
446
 
534
 
447
        wait4send();
535
        wait4send();
448
        send_command(0,'a',id);
536
        send_command(0,'a',id);
449
    }
537
    }
450
 
538
 
451
 
539
 
452
    public void trigger_LCD_by_page(int page)
540
    public void trigger_LCD_by_page(int page)
453
    {
541
    {
454
        wait4send();
542
        wait4send();
455
        send_command(0,'l',page);
543
        send_command(0,'l',page);
456
        stats.lcd_data_request_count++;
544
        stats.lcd_data_request_count++;
457
    }
545
    }
458
 
546
 
459
    public void trigger_debug()
547
    public void trigger_debug()
460
    {
548
    {
461
        if (sending||recieving) return; // its not that important - can be dropped
549
        if (sending||recieving) return; // its not that important - can be dropped
462
        send_command(0,'c');
550
        send_command(0,'c');
463
    }
551
    }
464
 
552
 
465
 
553
 
466
    public void switch_todo()
554
    public void switch_todo()
467
    {
555
    {
468
        sleep(150);
556
        sleep(150);
469
        version.reset();
557
        version.reset();
470
        //      LCD= new MKLCD(this);
558
        //      LCD= new MKLCD(this);
471
        debug_data=new MKDebugData();
559
        debug_data=new MKDebugData();
472
 
560
 
473
    }
561
    }
474
 
562
 
475
    public void switch_to_fc()
563
    public void switch_to_fc()
476
    {
564
    {
477
        wait4send();
565
        wait4send();
478
        send_command(NAVI_SLAVE_ADDR,'u',0);
566
        send_command(NAVI_SLAVE_ADDR,'u',0);
479
        switch_todo();
567
        switch_todo();
480
 
568
 
481
    }
569
    }
482
 
570
 
483
 
571
 
484
    public void switch_to_mk3mag()
572
    public void switch_to_mk3mag()
485
    {
573
    {
486
        wait4send();
574
        wait4send();
487
        send_command(NAVI_SLAVE_ADDR   ,'u',1);
575
        send_command(NAVI_SLAVE_ADDR   ,'u',1);
488
        switch_todo();
576
        switch_todo();
489
    }
577
    }
490
 
578
 
491
    public final static byte[] navi_switch_magic={27,27,0x55,(byte)0xAA,0,(byte)'\r'};
579
    public final static byte[] navi_switch_magic={27,27,0x55,(byte)0xAA,0,(byte)'\r'};
492
    public void switch_to_navi()
580
    public void switch_to_navi()
493
    {
581
    {
494
        wait4send();
582
        wait4send();
495
        sending=true;
583
        sending=true;
496
        try
584
        try
497
            {
585
            {
498
                writer.write(navi_switch_magic);
586
                writer.write(navi_switch_magic);
499
                stats.bytes_out+=6;
587
                stats.bytes_out+=6;
500
                writer.flush();
588
                writer.flush();
501
            }
589
            }
502
        catch (Exception e)  {   }
590
        catch (Exception e)  {   }
503
        sending=false;
591
        sending=false;
504
       
592
       
505
        switch_todo();
593
        switch_todo();
506
 
594
 
507
    }
595
    }
508
 
-
 
-
 
596
 
509
    public String[] flash_msgs;
597
 
510
        int msg_pos=0;
598
        int msg_pos=0;
511
 
599
 
512
 
600
 
513
    public boolean bootloader_intension_flash=false;
601
    //    public boolean bootloader_intension_flash=false;
514
 
-
 
515
    public boolean bootloader_finish_ok=false;
-
 
-
 
602
 
-
 
603
    //    public boolean bootloader_finish_ok=false;
-
 
604
 
516
 
605
 
517
    public void jump_bootloader()
606
    //    public void jump_bootloader()
518
    {
607
    // {
519
 
608
        /*
520
        bootloader_finish_ok=false;
609
        bootloader_finish_ok=false;
521
        msg_pos=0;
610
        msg_pos=0;
522
        bootloader_stage= BOOTLOADER_STAGE_NONE;
611
        bootloader_stage= BOOTLOADER_STAGE_NONE;
523
        flash_msgs=new String[100];
612
        //   flash_msgs=new String[100];
524
        flash_msgs[msg_pos++]="Initiializing Bootloader";
613
        //   flash_msgs[msg_pos++]="Initiializing Bootloader";
525
        wait4send();
614
        wait4send();
526
        sending=true;
615
        sending=true;
527
       
616
       
528
        try
617
        try
529
            {
618
            {
530
                int attempt=0;
619
                int attempt=0;
531
 
620
 
532
                while(bootloader_stage!= BOOTLOADER_STAGE_GOT_MKBL)
621
                while(bootloader_stage!= BOOTLOADER_STAGE_GOT_MKBL)
533
                    {
622
                    {
534
                        flash_msgs[msg_pos]="attempt "+attempt;
623
                        flash_msgs[msg_pos]="attempt "+attempt;
535
                        attempt++;
624
                        attempt++;
536
                        send_command_nocheck((byte)FC_SLAVE_ADDR,'R',new int[0]);
625
                        send_command_nocheck((byte)FC_SLAVE_ADDR,'R',new int[0]);
537
                       
626
                       
538
                        try{
627
                        try{
539
                        writer.write( 27);
628
                        writer.write( 27);
540
                        writer.flush();
629
                        writer.flush();
541
 
630
 
542
                        sleep(20);
631
                        sleep(20);
543
                       
632
                       
544
                        writer.write( 0xAA);
633
                        writer.write( 0xAA);
545
                        writer.flush();
634
                        writer.flush();
546
                        }
635
                        }
547
                        catch (Exception e)  { }
636
                        catch (Exception e)  { }
548
                        sleep((attempt%2==0)?80:800); //800
637
                        sleep((attempt%2==0)?80:800); //800
549
                    }
638
                    }
550
                msg_pos++;
639
                msg_pos++;
551
            }
640
            }
552
 
641
 
553
        catch (Exception e)  {  
642
        catch (Exception e)  {  
554
                flash_msgs[msg_pos++]="Exception:" +e.getMessage() ;
643
                flash_msgs[msg_pos++]="Exception:" +e.getMessage() ;
555
                flash_msgs[msg_pos++]=e.toString() ;
644
                flash_msgs[msg_pos++]=e.toString() ;
556
        }
645
        }
557
 
646
 
558
        new Thread( this ).start(); // fire up main Thread 
647
        new Thread( this ).start(); // fire up main Thread
-
 
648
        */
559
    }
649
    //    }
560
 
650
 
561
 
651
 
562
    public void get_error_str()
652
    public void get_error_str()
563
    {
653
    {
564
        send_command(NAVI_SLAVE_ADDR,'e');
654
        send_command(NAVI_SLAVE_ADDR,'e');
565
    }
655
    }
566
 
656
 
567
    public void trigger_rcdata()
657
    public void trigger_rcdata()
568
    {
658
    {
569
        send_command(FC_SLAVE_ADDR,'p');
659
        send_command(FC_SLAVE_ADDR,'p');
570
    }
660
    }
571
 
661
 
572
 
662
 
573
    public void write_params(int to)
663
    public void write_params(int to)
574
    {
664
    {
575
        params.update_backup(to);
665
        params.update_backup(to);
576
        write_params_(to) ;
666
        write_params_(to) ;
577
    }
667
    }
578
 
668
 
579
    public void write_params_(int to)
669
    public void write_params_(int to)
580
    {
670
    {
581
        wait4send();
671
        wait4send();
582
        params.active_paramset=to;
672
        params.active_paramset=to;
583
        send_command(FC_SLAVE_ADDR,'s',params.field_bak[to]);
673
        send_command(FC_SLAVE_ADDR,'s',params.field_bak[to]);
584
   
674
   
585
    }
675
    }
586
 
676
 
587
    public void set_debug_interval(int interval)
677
    public void set_debug_interval(int interval)
588
    {
678
    {
589
        send_command(2,'d',interval);
679
        send_command(2,'d',interval);
590
    }
680
    }
591
 
681
 
592
 
682
 
593
    public void set_gpsosd_interval(int interval)
683
    public void set_gpsosd_interval(int interval)
594
    {
684
    {
595
        send_command(NAVI_SLAVE_ADDR,'o',interval);
685
        send_command(NAVI_SLAVE_ADDR,'o',interval);
596
    }
686
    }
597
 
687
 
598
    public void send_command(int modul,char cmd)
688
    public void send_command(int modul,char cmd)
599
    {
689
    {
600
        send_command(modul,cmd,new int[0]);
690
        send_command(modul,cmd,new int[0]);
601
    }
691
    }
602
 
692
 
603
 
693
 
604
   
694
   
605
    public void send_command(int modul,char cmd,int param)
695
    public void send_command(int modul,char cmd,int param)
606
    {
696
    {
607
        int[] params=new int[1];
697
        int[] params=new int[1];
608
        params[0]=param;
698
        params[0]=param;
609
        send_command(modul,cmd,params);
699
        send_command(modul,cmd,params);
610
    }
700
    }
611
 
701
 
612
    public void send_command_nocheck(byte modul,char cmd,int[] params)
702
    public void send_command_nocheck(byte modul,char cmd,int[] params)
613
    {
703
    {
614
//      char[] send_buff=new char[5 + (params.length/3 + (params.length%3==0?0:1) )*4]; // 5=1*start_char+1*addr+1*cmd+2*crc
704
//      char[] send_buff=new char[5 + (params.length/3 + (params.length%3==0?0:1) )*4]; // 5=1*start_char+1*addr+1*cmd+2*crc
615
 
705
 
616
        byte[] send_buff=new byte[3 + (params.length/3 + (params.length%3==0?0:1) )*4]; // 5=1*start_char+1*addr+1*cmd+2*crc
706
        byte[] send_buff=new byte[3 + (params.length/3 + (params.length%3==0?0:1) )*4]; // 5=1*start_char+1*addr+1*cmd+2*crc
617
        send_buff[0]='#';
707
        send_buff[0]='#';
618
        send_buff[1]=modul;
708
        send_buff[1]=(byte)(modul+'a');
619
        send_buff[2]=(byte)cmd;
709
        send_buff[2]=(byte)cmd;
620
       
710
       
621
        for(int param_pos=0;param_pos<(params.length/3 + (params.length%3==0?0:1)) ;param_pos++)
711
        for(int param_pos=0;param_pos<(params.length/3 + (params.length%3==0?0:1)) ;param_pos++)
622
            {
712
            {
623
                int a = (param_pos*3<params.length)?params[param_pos*3]:0;
713
                int a = (param_pos*3<params.length)?params[param_pos*3]:0;
624
                int b = ((param_pos*3+1)<params.length)?params[param_pos*3+1]:0;
714
                int b = ((param_pos*3+1)<params.length)?params[param_pos*3+1]:0;
625
                int c = ((param_pos*3+2)<params.length)?params[param_pos*3+2]:0;
715
                int c = ((param_pos*3+2)<params.length)?params[param_pos*3+2]:0;
626
 
716
 
627
                send_buff[3+param_pos*4] =  (byte)((a >> 2)+'=' );
717
                send_buff[3+param_pos*4] =  (byte)((a >> 2)+'=' );
628
                send_buff[3+param_pos*4+1] = (byte)('=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)));
718
                send_buff[3+param_pos*4+1] = (byte)('=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)));
629
                send_buff[3+param_pos*4+2] = (byte)('=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)));
719
                send_buff[3+param_pos*4+2] = (byte)('=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)));
630
                send_buff[3+param_pos*4+3] = (byte)('=' + ( c & 0x3f));
720
                send_buff[3+param_pos*4+3] = (byte)('=' + ( c & 0x3f));
631
 
721
 
632
                //send_buff[3+foo]='=';
722
                //send_buff[3+foo]='=';
633
            }
723
            }
634
 
724
 
635
        /*      for(int foo=0;foo<(params.length/3 + (params.length%3==0?0:1) )*4;foo++)
725
        /*      for(int foo=0;foo<(params.length/3 + (params.length%3==0?0:1) )*4;foo++)
636
                {
726
                {
637
                int a = (foo<params.length) params[foo];
727
                int a = (foo<params.length) params[foo];
638
                int a = params[foo];
728
                int a = params[foo];
639
               
729
               
640
                //send_buff[3+foo]='=';
730
                //send_buff[3+foo]='=';
641
                }
731
                }
642
        */
732
        */
643
        try
733
        try
644
            {
734
            {
645
                int tmp_crc=0;
735
                int tmp_crc=0;
646
                for ( int tmp_i=0; tmp_i<send_buff.length;tmp_i++)
736
                for ( int tmp_i=0; tmp_i<send_buff.length;tmp_i++)
647
                    tmp_crc+=(int)send_buff[tmp_i];
737
                    tmp_crc+=(int)send_buff[tmp_i];
648
                       
738
                       
649
                writer.write(send_buff,0,send_buff.length);
739
                writer.write(send_buff,0,send_buff.length);
650
                tmp_crc%=4096;
740
                tmp_crc%=4096;
651
 
741
 
652
                writer.write( (char)(tmp_crc/64 + '='));
742
                writer.write( (char)(tmp_crc/64 + '='));
653
                writer.write( (char)(tmp_crc%64 + '='));
743
                writer.write( (char)(tmp_crc%64 + '='));
654
                writer.write('\r');
744
                writer.write('\r');
655
                stats.bytes_out+=send_buff.length+3;
745
                stats.bytes_out+=send_buff.length+3;
656
                writer.flush();
746
                writer.flush();
657
            }
747
            }
658
        catch (Exception e)
748
        catch (Exception e)
659
            { // problem sending data to FC
749
            { // problem sending data to FC
660
            }
750
            }
661
 
751
 
662
    }
752
    }
663
    // send command to FC ( add crc and pack into pseudo Base64
753
    // send command to FC ( add crc and pack into pseudo Base64
664
    public void send_command(int modul,char cmd,int[] params)
754
    public void send_command(int modul,char cmd,int[] params)
665
    {
755
    {
666
        //      if (modul==0) return;
756
        //      if (modul==0) return;
667
        sending=true;
757
        sending=true;
668
        send_command_nocheck((byte)modul,cmd,params);
758
        send_command_nocheck((byte)modul,cmd,params);
669
        sending=false;
759
        sending=false;
670
    }
760
    }
671
 
761
 
672
 
-
 
-
 
762
 
673
    public int slave_addr=-1;
763
 
674
 
764
 
675
 
765
 
676
    public int UBatt()
766
    public int UBatt()
677
    {
767
    {
-
 
768
 
-
 
769
        switch (slave_addr)
-
 
770
            {
678
        if (ufo_prober.is_mk())
771
            case FC_SLAVE_ADDR:
679
            return debug_data.UBatt();
772
                return debug_data.analog[8];
-
 
773
 
680
        else  if (ufo_prober.is_navi())
774
            case NAVI_SLAVE_ADDR:
681
            return gps_position.UBatt;
775
                return gps_position.UBatt;
-
 
776
 
-
 
777
            case FOLLOWME_SLAVE_ADDR:
-
 
778
                return debug_data.analog[8];
-
 
779
 
-
 
780
            default:
-
 
781
                return -1; // No Info
-
 
782
            }
-
 
783
 
-
 
784
    }
-
 
785
 
-
 
786
 
-
 
787
 
-
 
788
    public int SatsInUse()
-
 
789
    {
-
 
790
 
-
 
791
        switch (slave_addr)
-
 
792
            {
-
 
793
            case NAVI_SLAVE_ADDR:
-
 
794
                return gps_position.SatsInUse;
-
 
795
 
-
 
796
            case FOLLOWME_SLAVE_ADDR:
-
 
797
                return debug_data.analog[12];
682
       
798
 
-
 
799
            default:
683
        return -1;
800
                return -1; // No Info
-
 
801
            }
684
 
802
 
685
    }
803
    }
686
 
804
 
687
 
805
 
688
 
806
 
689
    public int SenderOkay()
807
    public int SenderOkay()
690
    {
808
    {
691
        if (ufo_prober.is_mk())
809
        switch (slave_addr)
692
            return debug_data.SenderOkay();
810
            {
693
        else  if (ufo_prober.is_navi())
811
            case FC_SLAVE_ADDR:
694
            return gps_position.SenderOkay;
812
                return debug_data.analog[10];
695
       
813
 
-
 
814
            case NAVI_SLAVE_ADDR:
696
        return -1;
815
                return gps_position.SenderOkay;
-
 
816
 
-
 
817
            default:
-
 
818
                return -1; // No Info
697
 
819
            }
698
    }
820
    }
699
 
821
 
700
 
822
 
701
    public    int[][] debug_buff=null;
823
    public    int[][] debug_buff=null;
702
    public    int     debug_buff_off=0;
824
    public    int     debug_buff_off=0;
703
    public    int     debug_buff_len=0;
825
    public    int     debug_buff_len=0;
704
    public    int    debug_buff_interval=0;
826
    public    int    debug_buff_interval=0;
705
    public    int    debug_buff_lastset=0;
827
    public    int    debug_buff_lastset=0;
706
    public    int    debug_buff_max=1;
828
    public    int    debug_buff_max=1;
707
 
829
 
708
    public    int[] debug_buff_targets=null;
830
    public    int[] debug_buff_targets=null;
709
 
831
 
710
    public void setup_debug_buff(int[] targets,int len,int interval)
832
    public void setup_debug_buff(int[] targets,int len,int interval)
711
    {
833
    {
712
        debug_buff=new int[len][targets.length];
834
        debug_buff=new int[len][targets.length];
713
 
835
 
714
        debug_buff_off=0;
836
        debug_buff_off=0;
715
        debug_buff_len=len;
837
        debug_buff_len=len;
716
 
838
 
717
        debug_buff_interval=interval;
839
        debug_buff_interval=interval;
718
        if (debug_buff_interval<2)debug_buff_interval=2;
840
        if (debug_buff_interval<2)debug_buff_interval=2;
719
        debug_buff_targets=targets;
841
        debug_buff_targets=targets;
720
        debug_buff_max=1;
842
        debug_buff_max=1;
721
        debug_buff_lastset=0;
843
        debug_buff_lastset=0;
722
    }
844
    }
723
 
845
 
724
    public int chg_debug_max(int val)
846
    public int chg_debug_max(int val)
725
    {
847
    {
726
        if (val>debug_buff_max)
848
        if (val>debug_buff_max)
727
            debug_buff_max=val;
849
            debug_buff_max=val;
728
        if (-val>debug_buff_max)
850
        if (-val>debug_buff_max)
729
            debug_buff_max=-val;
851
            debug_buff_max=-val;
730
        return val;
852
        return val;
731
    }
853
    }
732
 
854
 
733
    public void destroy_debug_buff()
855
    public void destroy_debug_buff()
734
    {
856
    {
735
        debug_buff_targets=null;
857
        debug_buff_targets=null;
736
    }
858
    }
737
 
859
 
738
    public void process_data(byte[] data,int len)
860
    public void process_data(byte[] data,int len)
739
    {
861
    {
-
 
862
 
-
 
863
        // check crc
-
 
864
        int tmp_crc=0;
-
 
865
        for ( int i=0 ; i<len-2 ; i++)
-
 
866
            tmp_crc+=(int)data[i];
-
 
867
 
-
 
868
        tmp_crc%=4096;
-
 
869
       
-
 
870
        if (!((data[len-2]==(char)(tmp_crc/64 + '='))
-
 
871
            &&
-
 
872
              (data[len-1]==(char)(tmp_crc%64 + '='))))
-
 
873
            {
-
 
874
                stats.crc_fail++;
-
 
875
                return;
-
 
876
            }
-
 
877
        // end of c
740
 
878
 
741
        slave_addr=data[1];
879
        //      slave_addr=data[1];
-
 
880
        log("command " +(char)data[2] );               
-
 
881
 
-
 
882
 
-
 
883
        int[] decoded_data=Decode64(data,3,len-5);
742
        log("command " +(char)data[2] );               
884
 
743
        switch((char)data[2])
885
        switch((char)data[2])
744
            {
886
            {
745
 
887
 
746
            case 'A': // debug Data Names
888
            case 'A': // debug Data Names
747
                stats.debug_names_count++;
889
                stats.debug_names_count++;
748
                debug_data.set_names_by_mk_data(Decode64(data,3,len-3));
890
                debug_data.set_names_by_mk_data(decoded_data);
749
                break;
891
                break;
750
 
892
 
751
            case 'B': // external_control confirm frames
893
            case 'B': // external_control confirm frames
752
                stats.external_control_confirm_frame_count++;
894
                stats.external_control_confirm_frame_count++;
753
                break;
895
                break;
754
 
896
 
755
            case 'L': // LCD Data
897
            case 'L': // LCD Data
756
                stats.lcd_data_count++;
898
                stats.lcd_data_count++;
757
                LCD.handle_lcd_data(Decode64(data,3,len-3));
899
                LCD.handle_lcd_data(decoded_data);
758
 
900
 
759
                break;
901
                break;
760
 
902
 
761
            case 'D': // debug Data
903
            case 'D': // debug Data
762
                log("got debug data");
904
                log("got debug data");
763
                stats.debug_data_count++;
905
                stats.debug_data_count++;
764
                debug_data.set_by_mk_data(Decode64(data,3,len-3),version);
906
                debug_data.set_by_mk_data(decoded_data,version);
765
 
907
 
766
                if (ufo_prober.is_mk())
908
                if (is_mk())
767
                    {
909
                    {
768
                        stats.process_mkflags(debug_data.motor_val(0)); // TODO remove dirty hack
910
                        stats.process_mkflags(debug_data.motor_val(0)); // TODO remove dirty hack
769
                        stats.process_alt(Alt());
911
                        stats.process_alt(Alt());
770
                    }
912
                    }
771
                if (debug_buff_targets!=null)
913
                if (debug_buff_targets!=null)
772
                    {
914
                    {
773
                        for (int sp=0;sp<debug_buff_targets.length;sp++)
915
                        for (int sp=0;sp<debug_buff_targets.length;sp++)
774
                            debug_buff[debug_buff_off][sp]=chg_debug_max(debug_data.analog[debug_buff_targets[sp]]);
916
                            debug_buff[debug_buff_off][sp]=chg_debug_max(debug_data.analog[debug_buff_targets[sp]]);
775
                        if (debug_buff_off>debug_buff_lastset)
917
                        if (debug_buff_off>debug_buff_lastset)
776
                            debug_buff_lastset=debug_buff_off;
918
                            debug_buff_lastset=debug_buff_off;
777
 
919
 
778
                        debug_buff_off=(debug_buff_off+1)%debug_buff_len;
920
                        debug_buff_off=(debug_buff_off+1)%debug_buff_len;
779
                           
921
                           
780
                    }
922
                    }
781
                log("processed debug data");
923
                log("processed debug data");
782
                break;
924
                break;
783
               
925
               
784
            case 'V': // Version Info
926
            case 'V': // Version Info
785
                stats.version_data_count++;
927
                stats.version_data_count++;
786
                slave_addr=data[1];
928
                if (slave_addr!=data[1]-'a')
-
 
929
                    {
-
 
930
                        slave_addr=(byte)(data[1]-'a');
-
 
931
                        change_notify=true;
-
 
932
                    }
-
 
933
 
787
 
934
                /*
788
                switch(slave_addr)
935
                switch(slave_addr)
789
                    {
936
                    {
790
                    case FC_SLAVE_ADDR:
937
                    case FC_SLAVE_ADDR:
791
                        ufo_prober.set_to_mk();
938
                        ufo_prober.set_to_mk();
792
                        break;
939
                        break;
793
 
940
 
794
                    case NAVI_SLAVE_ADDR:
941
                    case NAVI_SLAVE_ADDR:
795
                        ufo_prober.set_to_navi();
942
                        ufo_prober.set_to_navi();
796
                        break;
943
                        break;
797
 
944
 
798
                    case MK3MAG_SLAVE_ADDR:
945
                    case MK3MAG_SLAVE_ADDR:
799
                        //                      ufo_prober.set_to_mk();
-
 
800
                        ufo_prober.set_to_mk3mag();
946
                        ufo_prober.set_to_mk3mag();
801
                        break;
947
                        break;
-
 
948
 
-
 
949
                    case RE_SLAVE_ADDR:
-
 
950
                        ufo_prober.set_to_rangeextender();
-
 
951
                        break;
802
 
952
 
803
                    default:
953
                    default:
804
                        ufo_prober.set_to_incompatible();
954
                        ufo_prober.set_to_incompatible();
805
                        break;
955
                        break;
806
                    }
956
                    }
-
 
957
                */
807
 
-
 
808
 
958
 
809
                version.set_by_mk_data(Decode64(data,3,len-3));
959
                version.set_by_mk_data(decoded_data);
810
                break;
960
                break;
811
 
961
 
812
            case 'w':
962
            case 'w':
813
                int[] dec=Decode64(data,3,len-3);
-
 
814
                angle_nick=MKHelper.parse_signed_int_2(dec[0],dec[1]);
963
                angle_nick=MKHelper.parse_signed_int_2(decoded_data[0],decoded_data[1]);
815
                angle_roll=MKHelper.parse_signed_int_2(dec[2],dec[3]);
964
                angle_roll=MKHelper.parse_signed_int_2(decoded_data[2],decoded_data[3]);
816
                stats.angle_data_count++;
965
                stats.angle_data_count++;
817
 
-
 
818
                break;
966
                break;
819
 
967
 
820
 
968
 
821
            case 'Q':
969
            case 'Q':
822
                if (ufo_prober.is_mk())
970
                if (is_mk())
823
                    {
971
                    {
824
                        stats.params_data_count++;
972
                        stats.params_data_count++;
825
                        params.set_by_mk_data(Decode64(data,3,len-3));
973
                        params.set_by_mk_data(decoded_data);
826
                    }
974
                    }
827
                break;
975
                break;
828
               
976
 
-
 
977
            case 'M':
-
 
978
                mixer_change_notify=true;
-
 
979
                mixer_change_success=(decoded_data[0]==1);
-
 
980
                break;
829
            case 'P':
981
            case 'P':
830
                stats.stick_data_count++;
982
                stats.stick_data_count++;
831
                stick_data.set_by_mk_data(Decode64(data,3,20));
983
                stick_data.set_by_mk_data(decoded_data);
832
                break;
984
                break;
833
 
985
 
834
 
-
 
835
            case 'E':
986
 
836
                int[] dec_data=Decode64(data,3,len-3);
987
            case 'E':  // Error Str from Navi
837
                error_str="";
988
                error_str="";
838
                for(int foo=0;foo<20;foo++)
989
                for(int foo=0;foo<20;foo++)
839
                    if (dec_data[foo]!=0)
990
                    if (decoded_data[foo]!=0)
840
                        error_str+=(char)dec_data[foo];
991
                        error_str+=(char)decoded_data[foo];
841
                break;
992
                break;
842
 
993
 
843
 
994
               
844
            case 'O':
995
            case 'O': // OSD Values Str from Navi
845
                stats.navi_data_count++;
996
                stats.navi_data_count++;
846
                log("got navi data(" + len +"):");
997
                log("got navi data(" + len +"):");
847
               
998
               
848
                gps_position.set_by_mk_data(Decode64(data,3,len-3),version);
999
                gps_position.set_by_mk_data(decoded_data,version);
849
 
1000
 
850
                stats.process_mkflags(gps_position.MKFlags);
1001
                stats.process_mkflags(gps_position.MKFlags);
851
                stats.process_compas(gps_position.CompasHeading);
1002
                stats.process_compas(gps_position.CompasHeading);
852
                stats.process_speed(gps_position.GroundSpeed);
1003
                stats.process_speed(gps_position.GroundSpeed);
853
                stats.process_alt(Alt());
1004
                stats.process_alt(Alt());
854
                log("long:" + gps_position.Longitude);
-
 
855
                log("lat:" + gps_position.Latitude);
-
 
856
 
1005
 
857
                break;
1006
                break;
858
 
1007
 
859
 
-
 
860
                // Error from Navi
-
 
861
 
-
 
862
 
1008
 
863
            default:
1009
            default:
864
                stats.other_data_count++;
1010
                stats.other_data_count++;
865
                break;
1011
                break;
866
 
1012
 
867
            }
1013
            }
868
       
1014
       
869
    }
1015
    }
870
 
1016
 
871
   
1017
   
872
 
1018
 
873
    public boolean force_disconnect=true;
1019
    public boolean force_disconnect=true;
874
 
1020
 
875
    public void close_connections(boolean force)
1021
    public void close_connections(boolean force)
876
    {
1022
    {
877
 
1023
 
878
        //      if ((!force)&&root.canvas.do_vibra) root.vibrate(500);
1024
        //      if ((!force)&&root.canvas.do_vibra) root.vibrate(500);
879
        force_disconnect=force;
1025
        force_disconnect|=force;
880
        try{ reader.close(); }
1026
        try{ reader.close(); }
881
        catch (Exception inner_ex) { }
1027
        catch (Exception inner_ex) { }
882
 
1028
 
883
        try{ writer.close(); }
1029
        try{ writer.close(); }
884
        catch (Exception inner_ex) { }
1030
        catch (Exception inner_ex) { }
885
       
1031
       
886
//#ifdef j2me
1032
//#ifdef j2me
887
//#     try{ connection.close(); }
1033
//#     try{ connection.close(); }
888
//#     catch (Exception inner_ex) { }
1034
//#     catch (Exception inner_ex) { }
889
//#endif
1035
//#endif
-
 
1036
        slave_addr=-1;
890
        ufo_prober.set_to_none();
1037
        //      ufo_prober.set_to_none();
891
        stats.reset();
1038
        stats.reset();
892
        connected=false;
1039
        connected=false;
893
        version.reset();
1040
        version.reset();
-
 
1041
        //      if (bootloader_stage==BOOTLOADER_STAGE_NONE)
894
        disconnect_notify=true;
1042
        disconnect_notify=true;
895
    }
1043
    }
-
 
1044
 
-
 
1045
 
896
 
1046
    int last_avr_sig=-1;
897
    // Thread to recieve data from Connection
1047
    // Thread to recieve data from Connection
898
    public void run()
1048
    public void run()
899
    {
1049
    {
900
        boolean sigfail=false;
1050
        //      boolean sigfail=false;
901
        if (bootloader_stage==BOOTLOADER_STAGE_GOT_MKBL)
1051
        /*      if (bootloader_stage==BOOTLOADER_STAGE_GOT_MKBL)
902
            {
1052
            {
903
            try {
1053
            try {
904
                        flash_msgs[msg_pos++]="reading avr_sig";
-
 
905
 
-
 
906
                        writer.write( 't');
-
 
907
                        writer.flush();
-
 
908
               
-
 
909
                        int avr_sig=reader.read();
-
 
910
 
-
 
911
                        //while (avr_sig==63)
-
 
912
                        //    avr_sig=reader.read();
-
 
913
 
-
 
914
                        flash_msgs[msg_pos++]="got avr sig " + avr_sig;
-
 
915
 
-
 
916
                        int avrsig_suff=reader.read();
-
 
917
                        if (avrsig_suff!=0)
-
 
918
                            throw new Exception("val after avrsig is" +avrsig_suff +"should b 0");
-
 
919
 
-
 
920
                        if ((avr_sig!=0x74)&&(avr_sig!=224)&&(avr_sig!=120))
-
 
921
                            {
-
 
922
                                sigfail=true;
-
 
923
                                throw new Exception("avr sig" + avr_sig + " unknown");
-
 
924
                            }
-
 
925
                   
-
 
926
                        writer.write('T');
-
 
927
                        //              writer.flush();
-
 
928
                        writer.write(avr_sig);   // set devicetyp = 0x74 oder 0x76  
-
 
929
                        writer.flush();
-
 
930
 
-
 
931
                        if (reader.read()!=0x0d)
-
 
932
                            throw new Exception("cant get buffer size");
-
 
933
                       
-
 
934
                        writer.write('V');
-
 
935
                        writer.flush();
-
 
936
 
-
 
937
                        int bl_version_major=reader.read();
-
 
938
                        int bl_version_minor=reader.read();
-
 
939
 
-
 
940
                        flash_msgs[msg_pos++]="BL Version " + bl_version_major+"."+bl_version_minor;
-
 
941
                       
-
 
942
                       
-
 
943
                        writer.write('b');
-
 
944
                        writer.flush();
-
 
945
 
-
 
946
                        if (reader.read()!='Y')
-
 
947
                            throw new Exception("cant get buffer size");
-
 
948
 
-
 
949
                        int send_buff_size1=reader.read();
-
 
950
                        int send_buff_size2=reader.read();
-
 
951
                        int send_buff_size=send_buff_size1*0x100+send_buff_size2;
-
 
952
                       
-
 
953
                        flash_msgs[msg_pos++]="BUFF Size:" + send_buff_size;
1054
 
954
                        //                      if (send_buff_size>128)
1055
                        //                      if (send_buff_size>128)
955
                        //    send_buff_size=128;
1056
                        //    send_buff_size=128;
956
 
1057
 
957
                        //                      if (!bootloader_intension
1058
                        //                      if (!bootloader_intension
958
                            if (bootloader_intension_flash)
1059
                        if (bootloader_intension_flash)
959
                            {          
1060
                            {          
960
                               
1061
                               
961
                                byte[] flash_buff =new byte[send_buff_size]; ///!!
1062
                                byte[] flash_buff =new byte[send_buff_size]; ///!!
962
                               
1063
                               
963
                                String firmware_filename=(avr_sig==224)?"/navi.bin":((avr_sig==120)?"/mk3.bin":"/fc.bin");
1064
                                String firmware_filename=(avr_sig==224)?"/navi.bin":((avr_sig==120)?"/mk3.bin":"/fc.bin");
964
                                flash_msgs[msg_pos++]="Opening firmware " + firmware_filename + "..";
1065
                                flash_msgs[msg_pos++]="Opening firmware " + firmware_filename + "..";
965
                               
1066
                               
966
                               
1067
                               
967
                                InputStream in;
1068
                                InputStream in;
968
                                try {
1069
                                try {
969
                                    in=this.getClass().getResourceAsStream(firmware_filename);     
1070
                                    in=this.getClass().getResourceAsStream(firmware_filename);     
970
                                }
1071
                                }
971
                               
1072
                               
972
                                catch (Exception e) {               throw new Exception(" .. cant open firmware");                      }
1073
                                catch (Exception e) {               throw new Exception(" .. cant open firmware");                      }
973
                                int firmware_size=-1;
1074
                                int firmware_size=-1;
974
                                try {
1075
                                try {
975
                                                                   
1076
                                                                   
976
                                firmware_size= ((int)in.read()<<24) |((int)in.read()<<16) | ((int)in.read()<<8) | ((int)in.read()&0xff) ;
1077
                                firmware_size= ((int)in.read()<<24) |((int)in.read()<<16) | ((int)in.read()<<8) | ((int)in.read()&0xff) ;
977
                                }
1078
                                }
978
                                catch (Exception e) {               throw new Exception(" .. cant read size");                  }
1079
                                catch (Exception e) {               throw new Exception(" .. cant read size");                  }
979
                               
-
 
980
                               
-
 
981
                               
1080
                               
982
                                int blocks2write=((firmware_size/send_buff_size));
1081
                                int blocks2write=((firmware_size/send_buff_size));
983
                                flash_msgs[msg_pos++]=".. open("+blocks2write+" blocks," + firmware_size + "bytes)";
1082
                                flash_msgs[msg_pos++]=".. open("+blocks2write+" blocks," + firmware_size + "bytes)";
984
                               
1083
                               
985
                               
-
 
986
                               
1084
                               
987
                                //                      if (true) throw new Exception("before erasing");
1085
                                //                      if (true) throw new Exception("before erasing");
988
                               
1086
                               
989
                                //      if (true) throw new Exception("before erasing" );               
1087
                                //      if (true) throw new Exception("before erasing" );              
990
                               
1088
                               
991
                                flash_msgs[msg_pos++]="Erasing Flash ..";
1089
                                flash_msgs[msg_pos++]="Erasing Flash ..";
992
                                writer.write('e');
1090
                                writer.write('e');
993
                                writer.flush();
1091
                                writer.flush();
994
                               
1092
                               
995
                                if (reader.read()!=0x0d)
1093
                                if (reader.read()!=0x0d)
996
                                    throw new Exception("cant erase flash");
1094
                                    throw new Exception("cant erase flash");
997
                               
1095
                               
998
                                flash_msgs[msg_pos]+="OK";
1096
                                flash_msgs[msg_pos]+="OK";
999
                               
1097
                               
1000
                               
1098
                               
1001
                                writer.write('A');
1099
                                writer.write('A');
1002
                                writer.write(0);
1100
                                writer.write(0);
1003
                                writer.write(0);
1101
                                writer.write(0);
1004
                                writer.flush();
1102
                                writer.flush();
1005
                               
1103
                               
1006
                                if (reader.read()!=0x0d)
1104
                                if (reader.read()!=0x0d)
1007
                                    throw new Exception("cant set addr");
1105
                                    throw new Exception("cant set addr");
1008
                               
1106
                               
1009
                                flash_msgs[msg_pos++]="addr set";
1107
                                flash_msgs[msg_pos++]="addr set";
1010
                               
1108
                               
1011
                               
1109
                               
1012
                                //                      int blocks2write=((firmware_size/send_buff_size));
1110
                                //                      int blocks2write=((firmware_size/send_buff_size));
1013
                                if ((firmware_size%send_buff_size)>0)
1111
                                if ((firmware_size%send_buff_size)>0)
1014
                                    blocks2write++;
1112
                                    blocks2write++;
1015
                               
1113
                               
1016
                                for ( int block=0; block<blocks2write; block ++)
1114
                                for ( int block=0; block<blocks2write; block ++)
1017
                                    {
1115
                                    {
1018
                                        int hex_bytes_read=in.read(flash_buff,0,send_buff_size);
1116
                                        int hex_bytes_read=in.read(flash_buff,0,send_buff_size);
1019
                                       
1117
                                       
1020
                                        flash_msgs[msg_pos]="bl:" + block + "/" + blocks2write + " si:"+hex_bytes_read ;
1118
                                        flash_msgs[msg_pos]="bl:" + block + "/" + blocks2write + " si:"+hex_bytes_read ;
1021
                                       
1119
                                       
1022
                                       
1120
                                       
1023
                                        writer.write('B');
1121
                                        writer.write('B');
1024
                                        writer.write((hex_bytes_read>>8)& 0xFF);
1122
                                        writer.write((hex_bytes_read>>8)& 0xFF);
1025
                                        writer.write((hex_bytes_read)& 0xFF);
1123
                                        writer.write((hex_bytes_read)& 0xFF);
1026
                                        writer.write('F');
1124
                                        writer.write('F');
1027
                                        writer.flush();
1125
                                        writer.flush();
1028
                                       
1126
                                       
1029
                                       
1127
                                       
1030
                                        writer.write(flash_buff,0,hex_bytes_read);
1128
                                        writer.write(flash_buff,0,hex_bytes_read);
1031
                                        writer.flush();                                
1129
                                        writer.flush();                                
1032
                                       
1130
                                       
1033
                                       
1131
                                       
1034
                                        if (avr_sig==224)
1132
                                        if (avr_sig==224)
1035
                                            {
1133
                                            {
1036
                                                int crc=0xFFFF;
1134
                                                int crc=0xFFFF;
1037
                                                for (int crc_pos=0;crc_pos<hex_bytes_read;crc_pos++)
1135
                                                for (int crc_pos=0;crc_pos<hex_bytes_read;crc_pos++)
1038
                                                    crc=CRC16(flash_buff[crc_pos],crc);
1136
                                                    crc=CRC16(flash_buff[crc_pos],crc);
1039
                                                writer.write(crc>>8);
1137
                                                writer.write(crc>>8);
1040
                                                writer.write(crc&0xff);
1138
                                                writer.write(crc&0xff);
1041
                                                writer.flush();
1139
                                                writer.flush();
1042
                                            }
1140
                                            }
1043
                                        //  flash_msgs[msg_pos]+="ok";
1141
                                        //  flash_msgs[msg_pos]+="ok";
1044
                                        //                              writer.flush();
1142
                                        //                              writer.flush();
1045
                                       
1143
                                       
1046
                                       
1144
                                       
1047
                                       
1145
                                       
1048
                                        if (reader.read()!=0x0d)
1146
                                        if (reader.read()!=0x0d)
1049
                                            throw new Exception("abort write at block"+block);
1147
                                            throw new Exception("abort write at block"+block);
1050
                                       
1148
                                       
1051
                                       
1149
                                       
1052
                                       
1150
                                       
1053
                                        //                             sleep(1000);
1151
                                        //                             sleep(1000);
1054
                                    }
1152
                                    }
-
 
1153
 
-
 
1154
 
-
 
1155
        */
1055
                                //              flash_msgs[msg_pos]="bl:" + block + "/" + blocks2write + " si:"+hex_bytes_read ;
1156
                                //              flash_msgs[msg_pos]="bl:" + block + "/" + blocks2write + " si:"+hex_bytes_read ;
1056
                                /*
1157
                                /*
1057
                                 
1158
                                 
1058
                        int inp=0;
1159
                        int inp=0;
1059
                        int block=0;
1160
                        int block=0;
1060
                        while (inp!=-1)
1161
                        while (inp!=-1)
1061
                            {
1162
                            {
1062
                                int flash_buff_pos=0;
1163
                                int flash_buff_pos=0;
1063
                                int crc=0xFFFF;
1164
                                int crc=0xFFFF;
1064
                               
1165
                               
1065
                                while ((flash_buff_pos<send_buff_size)&&(inp!=-1))
1166
                                while ((flash_buff_pos<send_buff_size)&&(inp!=-1))
1066
                                    {
1167
                                    {
1067
                                        inp=in.read();
1168
                                        inp=in.read();
1068
                                        if (inp!=-1)
1169
                                        if (inp!=-1)
1069
                                            {
1170
                                            {
1070
                                                crc=CRC16(inp,crc);
1171
                                                crc=CRC16(inp,crc);
1071
                                                flash_buff[flash_buff_pos++]=(byte)inp;
1172
                                                flash_buff[flash_buff_pos++]=(byte)inp;
1072
                                            }
1173
                                            }
1073
                                    }
1174
                                    }
1074
                                //                              flash_msgs[msg_pos]="block" + block + "size:"+flash_buff_pos;
1175
                                //                              flash_msgs[msg_pos]="block" + block + "size:"+flash_buff_pos;
1075
                               
1176
                               
1076
                                block++;        
1177
                                block++;        
1077
                       
1178
                       
1078
                                boolean block_fin=false;
1179
                                boolean block_fin=false;
1079
 
1180
 
1080
 
1181
 
1081
                                while(!block_fin)
1182
                                while(!block_fin)
1082
                                    {
1183
                                    {
1083
                                       
1184
                                       
1084
                                        writer.write('B');
1185
                                        writer.write('B');
1085
                                        writer.write((flash_buff_pos>>8)& 0xFF);
1186
                                        writer.write((flash_buff_pos>>8)& 0xFF);
1086
                                        writer.write((flash_buff_pos)& 0xFF);
1187
                                        writer.write((flash_buff_pos)& 0xFF);
1087
                                        writer.write('F');
1188
                                        writer.write('F');
1088
                                        writer.flush();
1189
                                        writer.flush();
1089
 
1190
 
1090
                                        //                                      int ret_v=-1;
1191
                                        //                                      int ret_v=-1;
1091
                                       
1192
                                       
1092
                                        writer.write(flash_buff,0,flash_buff_pos);
1193
                                        writer.write(flash_buff,0,flash_buff_pos);
1093
                                        flash_msgs[msg_pos]="bl:" + block + "si:"+flash_buff_pos ;
1194
                                        flash_msgs[msg_pos]="bl:" + block + "si:"+flash_buff_pos ;
1094
                                       
1195
                                       
1095
                                        writer.flush();                                
1196
                                        writer.flush();                                
1096
                                        //                                  flash_msgs[msg_pos]+="wtc";
1197
                                        //                                  flash_msgs[msg_pos]+="wtc";
1097
                                       
1198
                                       
1098
                                       
1199
                                       
1099
                                        // append crc if navi
1200
                                        // append crc if navi
1100
                                        if (avr_sig==224)
1201
                                        if (avr_sig==224)
1101
                                            {
1202
                                            {
1102
                                                writer.write(crc>>8);
1203
                                                writer.write(crc>>8);
1103
                                                writer.write(crc&0xff);
1204
                                                writer.write(crc&0xff);
1104
                                                writer.flush();
1205
                                                writer.flush();
1105
                                            }
1206
                                            }
1106
                                        //  flash_msgs[msg_pos]+="ok";
1207
                                        //  flash_msgs[msg_pos]+="ok";
1107
                                        //                              writer.flush();
1208
                                        //                              writer.flush();
1108
                                        //                      if (reader.read()!=0x0d)
1209
                                        //                      if (reader.read()!=0x0d)
1109
                                        //                                  throw new Exception("abort write at block"+block);
1210
                                        //                                  throw new Exception("abort write at block"+block);
1110
                                       
1211
                                       
1111
                                       
1212
                                       
1112
                                        //ret_v=reader.read();
1213
                                        //ret_v=reader.read();
1113
                                        //                                  flash_msgs[msg_pos]="ret"+ret_v + "crc"+crc;
1214
                                        //                                  flash_msgs[msg_pos]="ret"+ret_v + "crc"+crc;
1114
                                       
1215
                                       
1115
                                        if (reader.read()==0x0d)
1216
                                        if (reader.read()==0x0d)
1116
                                            block_fin=true;
1217
                                            block_fin=true;
1117
                                       
1218
                                       
1118
                                    }
1219
                                    }
1119
 
1220
 
1120
                            }
1221
                            }
1121
                        */
1222
                        */
-
 
1223
 
-
 
1224
 
-
 
1225
 
-
 
1226
        /**
1122
                        flash_msgs[++msg_pos]="written last block ";
1227
                        flash_msgs[++msg_pos]="written last block ";
1123
                        msg_pos++;
1228
                        msg_pos++;
1124
                        flash_buff=null;
1229
                        flash_buff=null;
1125
 
1230
 
1126
                        ufo_prober.set_to_none();
1231
                        ufo_prober.set_to_none();
1127
                        stats.reset();
1232
                        stats.reset();
1128
                        version=new MKVersion();
1233
                        version=new MKVersion();
1129
                        System.gc();
1234
                        System.gc();
1130
                    }
1235
                    }
1131
                else // bootloader intension clear settings
1236
                else // bootloader intension clear settings
1132
                    {
1237
                    {
1133
 
1238
 
1134
                        flash_msgs[msg_pos]="reset params ..";
1239
                        flash_msgs[msg_pos]="reset params ..";
1135
                        writer.write('B');
1240
                        writer.write('B');
1136
                        writer.write(0);
1241
                        writer.write(0);
1137
                        writer.write(4);
1242
                        writer.write(4);
1138
                        writer.write('E');
1243
                        writer.write('E');
1139
                        writer.flush();
1244
                        writer.flush();
1140
                       
1245
                       
1141
                        writer.write(0xFF);
1246
                        writer.write(0xFF);
1142
                        writer.write(0xFF);
1247
                        writer.write(0xFF);
1143
                        writer.write(0xFF);
1248
                        writer.write(0xFF);
1144
                        writer.write(0xFF);
1249
                        writer.write(0xFF);
1145
                        writer.flush();
1250
                        writer.flush();
1146
                        flash_msgs[msg_pos++]+=" done";
1251
                        flash_msgs[msg_pos++]+=" done";
1147
                    }
1252
                    }
1148
 
1253
 
1149
            flash_msgs[msg_pos++]="Exiting Bootloader" ;
1254
            flash_msgs[msg_pos++]="Exiting Bootloader" ;
1150
            params=new MKParamsParser();
1255
            params=new MKParamsParser();
1151
            try{
1256
            try{
1152
                writer.write('E');
1257
                writer.write('E');
1153
                writer.flush();
1258
                writer.flush();
1154
            }
1259
            }
1155
            catch (Exception e)  {  
1260
            catch (Exception e)  {  
1156
                flash_msgs[msg_pos++]="cant exit bootloader" ;
1261
                flash_msgs[msg_pos++]="cant exit bootloader" ;
1157
            }
1262
            }
1158
            flash_msgs[msg_pos++]="Exit BL done" ;         
1263
            flash_msgs[msg_pos++]="Exit BL done" ;         
1159
 
1264
 
1160
            bootloader_finish_ok=true;
1265
            bootloader_finish_ok=true;
1161
            }
1266
            }
1162
           
1267
           
1163
            catch (Exception e)  {  
1268
            catch (Exception e)  {  
1164
                flash_msgs[msg_pos++]="Fail:" +e.getMessage() ;
1269
                flash_msgs[msg_pos++]="Fail:" +e.getMessage() ;
1165
 
1270
 
1166
 
1271
 
1167
            flash_msgs[msg_pos++]="Exiting Bootloader" ;
1272
            flash_msgs[msg_pos++]="Exiting Bootloader" ;
1168
            params=new MKParamsParser();
1273
            params=new MKParamsParser();
1169
            try{
1274
            try{
1170
                writer.write('E');
1275
                writer.write('E');
1171
                writer.flush();
1276
                writer.flush();
1172
            }
1277
            }
1173
            catch (Exception e2)  {  
1278
            catch (Exception e2)  {  
1174
                flash_msgs[msg_pos++]="cant exit bootloader" ;
1279
                flash_msgs[msg_pos++]="cant exit bootloader" ;
1175
            }
1280
            }
1176
            flash_msgs[msg_pos++]="Exit BL done" ;
1281
            flash_msgs[msg_pos++]="Exit BL done" ;
1177
            if (sigfail&&(bl_retrys<3))
1282
            if (sigfail&&(bl_retrys<3))
1178
                {
1283
                {
1179
                    bl_retrys++;
1284
                    bl_retrys++;
1180
                    init_bootloader=true;
1285
                    init_bootloader=true;
1181
                }
1286
                }
1182
            close_connections(false);
1287
            close_connections(false);
1183
            }
1288
            }
1184
 
1289
 
1185
 
1290
 
1186
            sending=false;
1291
            sending=false;
1187
            }
1292
            }
-
 
1293
 
1188
 
1294
        **/
1189
 
1295
 
1190
        byte[] data_set=new byte[1024];
1296
        byte[] data_set=new byte[1024];
1191
        int data_set_pos=0;
1297
        int data_set_pos=0;
1192
 
-
 
1193
 
-
 
1194
 
-
 
1195
 
1298
 
1196
        byte[] data_in_buff=new byte[DATA_IN_BUFF_SIZE];
1299
        byte[] data_in_buff=new byte[DATA_IN_BUFF_SIZE];
1197
       
1300
       
1198
        int input;
1301
        int input;
1199
        int pos=0;
1302
        int pos=0;
1200
 
-
 
1201
 
-
 
1202
 
-
 
1203
 
-
 
1204
 
1303
 
1205
        log("Thread started");
1304
        log("Thread started");
1206
        while(true)
1305
        while(thread_running)
1207
            {
1306
            {
1208
 
1307
 
1209
                if (!connected)
1308
                if (!connected)
1210
                    {
1309
                    {
-
 
1310
                        sleep(10);
1211
                        if (!force_disconnect) connect();
1311
                        if (!force_disconnect) connect();
1212
                        sleep(100);
-
 
1213
                    }
1312
                    }
1214
                else
1313
                else
1215
                    try{
1314
                    try{
1216
                       
1315
                       
1217
                        /*             
1316
                        /*             
1218
                                while(sending)
1317
                                while(sending)
1219
                                {try { Thread.sleep(50); }
1318
                                {try { Thread.sleep(50); }
1220
                                catch (Exception e)  {   }
1319
                                catch (Exception e)  {   }
1221
                                }
1320
                                }
1222
                        */
1321
                        */
1223
                        recieving=true;
1322
                        recieving=true;
1224
                        int read_count ;
1323
                        int read_count ;
1225
 
1324
 
1226
                        if (reader.available()<DATA_IN_BUFF_SIZE)
1325
                        if (reader.available()<DATA_IN_BUFF_SIZE)
1227
                            read_count     =reader.read(data_in_buff,0,reader.available());
1326
                            read_count     =reader.read(data_in_buff,0,reader.available());
1228
                        else
1327
                        else
1229
                            read_count     =reader.read(data_in_buff,0,DATA_IN_BUFF_SIZE);
1328
                            read_count     =reader.read(data_in_buff,0,DATA_IN_BUFF_SIZE);
1230
 
1329
 
1231
                        //                      log("Connected - reading data " + read_count);          
1330
                        //                      log("Connected - reading data " + read_count);          
1232
                        //      pos=0;
1331
                        //      pos=0;
1233
                        input=0;
1332
                        input=0;
1234
                        //data_buff[data_buff_pos]="";
1333
                        //data_buff[data_buff_pos]="";
1235
                        // recieve data-set
1334
                        // recieve data-set
1236
 
1335
 
1237
                        //                      int read_count =reader.read(data_in_buff,0,reader.available());
1336
                        //                      int read_count =reader.read(data_in_buff,0,reader.available());
1238
                        stats.bytes_in+=read_count;
1337
                        stats.bytes_in+=read_count;
1239
                        if (read_count>0)
1338
                        if (read_count>0)
1240
                            {
1339
                            {
1241
                                log("read" + read_count + " ds_pos" + data_set_pos);           
1340
                                log("read" + read_count + " ds_pos" + data_set_pos);           
1242
                       
1341
                       
1243
                                for ( pos=0;pos<read_count;pos++)
1342
                                for ( pos=0;pos<read_count;pos++)
1244
                                    {
1343
                                    {
1245
                                        if (data_in_buff[pos]==13)
1344
                                        if (data_in_buff[pos]==13)
1246
                                            {
1345
                                            {
1247
                                                data_buff[data_buff_pos]=new String(data_set, 0, data_set_pos);
1346
                                                data_buff[data_buff_pos]=new String(data_set, 0, data_set_pos);
1248
                                                data_buff_pos++;
1347
                                                data_buff_pos++;
1249
                                                data_buff_pos%=DATA_BUFF_LEN;
1348
                                                data_buff_pos%=DATA_BUFF_LEN;
1250
 
1349
 
1251
                                               
1350
                                               
1252
                                                try{process_data(data_set,data_set_pos); }
1351
                                                try{process_data(data_set,data_set_pos); }
1253
                                                catch (Exception e)
1352
                                                catch (Exception e)
1254
                                                    {                  
1353
                                                    {                  
1255
                                                        log(".. problem processing");
1354
                                                        log(".. problem processing");
1256
                                                        log(e.toString());
1355
                                                        log(e.toString());
1257
                                                        }
1356
                                                        }
1258
 
1357
 
1259
 
1358
 
1260
 
1359
 
1261
 
1360
 
1262
                                                proxy.write(data_set,0,data_set_pos);
1361
                                                proxy.write(data_set,0,data_set_pos);
1263
                                                //                                                      proxy.writer.write('\r');
1362
                                                //                                                      proxy.writer.write('\r');
1264
                                                //proxy.writer.write('\n');
1363
                                                //proxy.writer.write('\n');
1265
                                                //proxy.writer.flush();
1364
                                                //proxy.writer.flush();
1266
                                                /*
1365
                                                /*
1267
                                                if (proxy!=null)
1366
                                                if (proxy!=null)
1268
                                                    {
1367
                                                    {
1269
                                                       
1368
                                                       
1270
 
1369
 
1271
 
1370
 
1272
                                                    }
1371
                                                    }
1273
                                                */
1372
                                                */
1274
                                                data_set_pos=0;
1373
                                                data_set_pos=0;
1275
 
1374
 
1276
                                            }
1375
                                            }
1277
                                        else
1376
                                        else
1278
                                            {
1377
                                            // {
1279
                                                data_set[data_set_pos++]=data_in_buff[pos];
1378
                                                data_set[data_set_pos++]=data_in_buff[pos];
1280
                                               
1379
                                               
1281
                                               
1380
                                                /*
-
 
1381
 
1282
 
1382
                                                if ( (data_set_pos>4) && (data_set[data_set_pos-4]==(byte)'M') && (data_set[data_set_pos-3]==(byte)'K')  && (data_set[data_set_pos-2]==(byte)'B') && (data_set[data_set_pos-1]==(byte)'L'))
-
 
1383
 
1283
                                                if ( (data_set_pos>4) && (data_set[data_set_pos-4]==(byte)'M') && (data_set[data_set_pos-3]==(byte)'K')  && (data_set[data_set_pos-2]==(byte)'B') && (data_set[data_set_pos-1]==(byte)'L'))
1384
                                                    {
1284
                                                    {
1385
 
1285
                                                        bootloader_stage= BOOTLOADER_STAGE_GOT_MKBL;
1386
                                                        bootloader_stage= BOOTLOADER_STAGE_GOT_MKBL;
1286
                                                        return;
1387
                                                        return;
1287
                                                    }
1388
                                                    }
1288
                                               
1389
                                               
1289
                                            }
1390
                                                    }*/
1290
 
1391
 
1291
                                    }
1392
                                    }
1292
                                       
1393
                                       
1293
                       
1394
                       
1294
                            }
1395
                            }
1295
                        else
1396
                        else
1296
                            {
1397
                            {
1297
                                recieving=false;
1398
                                recieving=false;
1298
                                sleep(20);
1399
                                sleep(20);
1299
                            }
1400
                            }
1300
                        /*
1401
                        /*
1301
                        while ((input != 13)) //&&(input!=-1))
1402
                        while ((input != 13)) //&&(input!=-1))
1302
                            {
1403
                            {
1303
                                {
1404
                                {
1304
                                    //log("pre read");         
1405
                                    //log("pre read");         
1305
                                    log(""+reader.available());
1406
                                    log(""+reader.available());
1306
                                    input = reader.read() ;
1407
                                    input = reader.read() ;
1307
                                    log("Byte rcv" + input +"pos"+ pos);               
1408
                                    log("Byte rcv" + input +"pos"+ pos);               
1308
                                   
1409
                                   
1309
                                    proxy.write(input);
1410
                                    proxy.write(input);
1310
                                   
1411
                                   
1311
                                    data_buff[data_buff_pos]+=(char)input;
1412
                                    data_buff[data_buff_pos]+=(char)input;
1312
                                   
1413
                                   
1313
                                    if ((data_buff[data_buff_pos].length()>3)&&(data_buff[data_buff_pos].substring(data_buff[data_buff_pos].length()-4,data_buff[data_buff_pos].length()).equals("MKBL")))
1414
                                    if ((data_buff[data_buff_pos].length()>3)&&(data_buff[data_buff_pos].substring(data_buff[data_buff_pos].length()-4,data_buff[data_buff_pos].length()).equals("MKBL")))
1314
                                        {
1415
                                        {
1315
                                            bootloader_stage= BOOTLOADER_STAGE_GOT_MKBL;
1416
                                            bootloader_stage= BOOTLOADER_STAGE_GOT_MKBL;
1316
                                            return;
1417
                                            return;
1317
                                        }
1418
                                        }
1318
                                    if (input==-1) throw new Exception("disconnect");
1419
                                    if (input==-1) throw new Exception("disconnect");
1319
                                    else
1420
                                    else
1320
                                        {
1421
                                        {
1321
                                            stats.bytes_in++;
1422
                                            stats.bytes_in++;
1322
                                            data_set[pos]=input;
1423
                                            data_set[pos]=input;
1323
                                            pos++;
1424
                                            pos++;
1324
                                        }
1425
                                        }
1325
                                }
1426
                                }
1326
                               
1427
                               
1327
                            }
1428
                            }
1328
                       
1429
                       
1329
                       
1430
                       
1330
 
1431
 
1331
                        data_buff_pos++;
1432
                        data_buff_pos++;
1332
                        data_buff_pos%=DATA_BUFF_LEN;
1433
                        data_buff_pos%=DATA_BUFF_LEN;
1333
                        recieving=false;
1434
                        recieving=false;
1334
                        log("Data recieved (" + pos + "Bytes)");               
1435
                        log("Data recieved (" + pos + "Bytes)");               
1335
                        log("processing ..");          
1436
                        log("processing ..");          
1336
                        */
1437
                        */
1337
 
1438
 
1338
                        /*
1439
                        /*
1339
                          if (proxy!=null)
1440
                          if (proxy!=null)
1340
                          {
1441
                          {
1341
                          proxy.writer.write('\r');
1442
                          proxy.writer.write('\r');
1342
                          proxy.writer.write('\n');
1443
                          proxy.writer.write('\n');
1343
                          proxy.writer.flush();
1444
                          proxy.writer.flush();
1344
                          }
1445
                          }
1345
                        */
1446
                        */
1346
                        /*if (pos>5)
1447
                        /*if (pos>5)
1347
                            {
1448
                            {
1348
                                try{process_data(data_set,pos); }
1449
                                try{process_data(data_set,pos); }
1349
                                catch (Exception e)
1450
                                catch (Exception e)
1350
                                    {                  
1451
                                    {                  
1351
                                        log(".. problem processing");
1452
                                        log(".. problem processing");
1352
                                        log(e.toString());
1453
                                        log(e.toString());
1353
                                    }
1454
                                    }
1354
                               
1455
                               
1355
                                log(".. processing done");             
1456
                                log(".. processing done");             
1356
                            }
1457
                            }
1357
                        */
1458
                        */
1358
                    }
1459
                    }
1359
                    catch (Exception ex)
1460
                    catch (Exception ex)
1360
                        {
1461
                        {
1361
                            log("Problem reading from MK -> closing conn");
1462
                            log("Problem reading from MK -> closing conn");
1362
                            log(ex.toString());
1463
                            log(ex.toString());
1363
                            // close the connection 
1464
                            // close the connection 
1364
                            close_connections(false);
1465
                            close_connections(false);
1365
                        }      
1466
                        }      
1366
               
1467
               
1367
                // sleep a bit to  get someting more done
1468
                // sleep a bit to  get someting more done
1368
                //              sleep(5); //50
1469
                //              sleep(5); //50
1369
               
1470
               
1370
            } // while
1471
            } // while
1371
        //      log("Leaving Communicator thread");
1472
        //      log("Leaving Communicator thread");
1372
    } // run()
1473
    } // run()
1373
}
1474
}
1374
 
1475