Subversion Repositories Projects

Rev

Rev 262 | Rev 265 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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