Subversion Repositories Projects

Rev

Rev 264 | Rev 266 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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