Subversion Repositories Projects

Rev

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

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