Subversion Repositories Projects

Rev

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

Rev 50 Rev 117
1
#include <stdio.h>
1
#include <stdio.h>
2
#include <stdlib.h>
2
#include <stdlib.h>
3
#include <string.h>
3
#include <string.h>
4
#include <fcntl.h>
4
#include <fcntl.h>
5
#include "lib/x52/x52.h"
5
#include "lib/x52/x52.h"
6
#include <unistd.h>
6
#include <unistd.h>
7
#include <sys/socket.h>
7
#include <sys/socket.h>
8
#include <bluetooth/bluetooth.h>
8
#include <bluetooth/bluetooth.h>
9
#include <bluetooth/hci.h>
9
#include <bluetooth/hci.h>
10
#include <bluetooth/hci_lib.h>
10
#include <bluetooth/hci_lib.h>
11
 
11
 
12
#include <sys/time.h>
12
#include <sys/time.h>
13
 
13
 
14
 
14
 
15
#include <bluetooth/rfcomm.h>
15
#include <bluetooth/rfcomm.h>
16
 
16
 
17
 
17
 
18
#include <linux/joystick.h>
18
#include <linux/joystick.h>
19
#define JOY_DEV "/dev/input/js0"
19
#define JOY_DEV "/dev/input/js0"
20
 
20
 
21
#define MAX_BT_DEVICES 3
21
#define MAX_BT_DEVICES 3
22
 
22
 
23
 
23
 
24
#define STATEID_SCANNING 0
24
#define STATEID_SCANNING 0
25
#define STATEID_CONNECTING 1
25
#define STATEID_CONNECTING 1
26
 
26
 
27
#define BUTTON_SELECT 26
27
#define BUTTON_SELECT 26
28
#define BUTTON_DOWN 28
28
#define BUTTON_DOWN 28
29
#define BUTTON_UP 27
29
#define BUTTON_UP 27
30
 
30
 
-
 
31
 
-
 
32
// #define AXIS_ROLL 0
-
 
33
// #define AXIS_NICK 1
-
 
34
// #define AXIS_GIER 5
-
 
35
// #define AXIS_GAS  2
-
 
36
 
-
 
37
 
-
 
38
 
-
 
39
// for x52
31
 
40
/*
32
#define AXIS_ROLL 0
41
#define AXIS_ROLL 4
33
#define AXIS_NICK 1
42
#define AXIS_NICK 3
34
#define AXIS_GIER 5
43
#define AXIS_GIER 5
35
#define AXIS_GAS  2
44
#define AXIS_GAS  2
36
 
45
 
37
#define INVERT_ROLL -1
46
#define INVERT_ROLL -1
38
#define INVERT_NICK -1
47
#define INVERT_NICK -1
39
#define INVERT_GIER 1
48
#define INVERT_GIER 1
40
#define INVERT_GAS  -1
49
#define INVERT_GAS  -1
-
 
50
*/
-
 
51
 
-
 
52
#define AXIS_ROLL 0
-
 
53
#define AXIS_NICK 1
-
 
54
#define AXIS_GIER 3
-
 
55
#define AXIS_GAS  2
-
 
56
 
-
 
57
#define INVERT_ROLL 1
-
 
58
#define INVERT_NICK -1
-
 
59
#define INVERT_GIER 1
-
 
60
#define INVERT_GAS  -1
-
 
61
 
-
 
62
 
-
 
63
#include <stdio.h>
-
 
64
#include <errno.h>
-
 
65
#include <string.h>
-
 
66
#include <sys/socket.h>
-
 
67
#include <sys/types.h>
-
 
68
#include <netinet/in.h>
-
 
69
#include <unistd.h>//for close() for socket
-
 
70
 
-
 
71
 
-
 
72
#define INPUT_NONE 0
-
 
73
#define INPUT_JOYDEV 1
-
 
74
#define INPUT_EVDEV 2
41
 
75
 
42
 
76
 
43
// time struct for measuring
77
// time struct for measuring
44
struct timeval time_struct1;
78
struct timeval time_struct1;
45
struct timeval time_struct2;
79
struct timeval time_struct2;
46
 
80
 
47
 
81
 
48
int act_nick=0;
82
int act_nick=0;
49
int act_roll=0;
83
int act_roll=0;
50
int act_gier=0;
84
int act_gier=0;
51
int act_gas=0;
85
int act_gas=0;
52
int act_mode=0;
86
int act_mode=0;
53
 
87
 
54
int bt_device_count=0;
88
int bt_device_count=0;
55
 
89
 
56
char names[MAX_BT_DEVICES][248];
90
char names[MAX_BT_DEVICES][248];
57
char addrs[MAX_BT_DEVICES][19];
91
char addrs[MAX_BT_DEVICES][19];
58
 
92
 
59
int s, status;
93
int s, status;
60
unsigned char TxBuffer[150];
94
unsigned char TxBuffer[150];
61
unsigned char _TxBuffer[150];
95
unsigned char _TxBuffer[150];
62
 
96
 
63
char RxBuffer[150];
97
char RxBuffer[150];
64
 
98
 
65
 
99
 
66
int x52_input_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x;
100
int x52_input_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x;
67
char *button=NULL,*button_trigger=NULL, name_of_joystick[80];
101
char *button=NULL,*button_trigger=NULL, name_of_joystick[80];
68
 
102
 
69
struct js_event x52_event_struct;
103
struct js_event x52_event_struct;
70
 
104
 
71
int engines_on=0;
105
int engines_on=0;
72
int old_engines_on=0;
106
int old_engines_on=0;
73
 
107
 
74
char in_char;
108
char in_char;
75
 
109
 
76
struct ExternControl_s
110
struct ExternControl_s
77
{
111
{
78
  unsigned char Digital[2];   // (noch unbenutzt)
112
  unsigned char Digital[2];   // (noch unbenutzt)
79
  unsigned char RemoteTasten; //(gab es schon für das virtuelle Display)
113
  unsigned char RemoteTasten; //(gab es schon für das virtuelle Display)
80
  signed char   Nick;
114
  signed char   Nick;
81
  signed char   Roll;
115
  signed char   Roll;
82
  signed char   Gier;
116
  signed char   Gier;
83
  unsigned char Gas;          //(es wird das Stick-Gas auf diesen Wert begrenzt; --> StickGas ist das Maximum)
117
  unsigned char Gas;          //(es wird das Stick-Gas auf diesen Wert begrenzt; --> StickGas ist das Maximum)
84
  signed char   Higt;        //(Höhenregler)
118
  signed char   Higt;        //(Höhenregler)
85
  unsigned char free;         // (unbenutzt)
119
  unsigned char free;         // (unbenutzt)
86
  unsigned char Frame;        // (Bestätigung)
120
  unsigned char Frame;        // (Bestätigung)
87
  unsigned char Config;
121
  unsigned char Config;
88
};
122
};
89
 
123
 
90
 
124
 
91
struct ExternControl_s  ExternControl ;
125
struct ExternControl_s  ExternControl ;
92
 
126
 
93
int state=STATEID_SCANNING;
127
int state=STATEID_SCANNING;
94
 
128
 
95
 
129
 
96
struct x52 *x52_output;
130
struct x52 *x52_output;
97
 
131
 
98
int selected_bt_device=0;
132
int selected_bt_device=0;
99
void scan_bt()
133
void scan_bt()
100
{
134
{
101
  inquiry_info *ii = NULL;
135
  inquiry_info *ii = NULL;
102
 
136
 
103
  int dev_id, sock, len, flags;
137
  int dev_id, sock, len, flags;
104
  int i;
138
  int i;
105
  char addr[19] = { 0 };
139
  char addr[19] = { 0 };
106
  char name[248] = { 0 };
140
  char name[248] = { 0 };
107
 
141
 
108
  dev_id = hci_get_route(NULL);
142
  dev_id = hci_get_route(NULL);
109
  sock = hci_open_dev( dev_id );
143
  sock = hci_open_dev( dev_id );
110
  if (dev_id < 0 || sock < 0) {
144
  if (dev_id < 0 || sock < 0) {
111
    perror("opening socket");
145
    perror("opening socket");
112
    exit(1);
146
    exit(1);
113
  }
147
  }
114
 
148
 
115
  len  = 8;
149
  len  = 8;
116
 
150
 
117
  flags = IREQ_CACHE_FLUSH;
151
  flags = IREQ_CACHE_FLUSH;
118
  ii = (inquiry_info*)malloc(MAX_BT_DEVICES * sizeof(inquiry_info));
152
  ii = (inquiry_info*)malloc(MAX_BT_DEVICES * sizeof(inquiry_info));
119
 
153
 
120
  bt_device_count = hci_inquiry(dev_id, len, MAX_BT_DEVICES, NULL, &ii, flags);
154
  bt_device_count = hci_inquiry(dev_id, len, MAX_BT_DEVICES, NULL, &ii, flags);
121
  if(  bt_device_count < 0 ) perror("hci_inquiry");
155
  if(  bt_device_count < 0 ) perror("hci_inquiry");
122
 
156
 
123
  for (i = 0; i <  bt_device_count; i++) {
157
  for (i = 0; i <  bt_device_count; i++) {
124
    ba2str(&(ii+i)->bdaddr, addr);
158
    ba2str(&(ii+i)->bdaddr, addr);
125
    sprintf(addrs[i],"%s",addr);
159
    sprintf(addrs[i],"%s",addr);
126
 
160
 
127
    memset(name, 0, sizeof(name));
161
    memset(name, 0, sizeof(name));
128
   
162
   
129
    if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
163
    if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
130
                             name, 0) < 0)
164
                             name, 0) < 0)
131
      sprintf(names[i],"[unknown]");
165
      sprintf(names[i],"[unknown]");
132
    else
166
    else
133
      sprintf(names[i],"%s",name);
167
      sprintf(names[i],"%s",name);
134
 
168
 
135
  }
169
  }
136
 
170
 
137
 
171
 
138
  free( ii );
172
  free( ii );
139
  close( sock );
173
  close( sock );
140
}
174
}
-
 
175
 
-
 
176
 int yalv;           /* loop counter */
-
 
177
    size_t read_bytes;  /* how many bytes were read */
-
 
178
    struct input_event ev[64]; /* the events (up to 64 at once) */
-
 
179
 
-
 
180
int evdev_fd;
-
 
181
int connect_evdev()
-
 
182
{
-
 
183
  if ((evdev_fd = open("/dev/input/event10", O_RDONLY)) < 0) {
-
 
184
        printf(" cant open evdev ");
-
 
185
        return 0;
-
 
186
    }
-
 
187
 
-
 
188
  return 1;
-
 
189
 
-
 
190
 
141
 
191
}
142
 
192
 
143
int connect_joy()
193
int connect_joy()
144
{
194
{
-
 
195
 
-
 
196
  axis = (int *) calloc( 100, sizeof( int ) );
-
 
197
  button = (char *)calloc( 100, sizeof( char ) );
-
 
198
  button_trigger = (char *) calloc( 100, sizeof( char ) );
-
 
199
 
-
 
200
 
-
 
201
  //  axis = (int *) calloc( num_of_axis, sizeof( int ) );
-
 
202
  // button = (char *)calloc( num_of_buttons, sizeof( char ) );
-
 
203
  // button_trigger = (char *) calloc( num_of_buttons, sizeof( char ) );
145
 
204
 
146
 
205
 
147
  if( ( x52_input_fd = open( JOY_DEV, O_RDONLY ) ) < 0 )
206
  if( ( x52_input_fd = open( JOY_DEV, O_RDONLY ) ) < 0 )
148
    {
207
    {
149
      printf( "Couldn't open joystick device %s\n", JOY_DEV );
208
      printf( "Couldn't open joystick device %s\n", JOY_DEV );
150
      printf( "try modprobe joydev\n"  );
209
      printf( "try modprobe joydev\n"  );
151
      return 0;
210
      return 0;
152
    }
211
    }
153
 
212
 
154
  ioctl( x52_input_fd, JSIOCGAXES, &num_of_axis );
213
  ioctl( x52_input_fd, JSIOCGAXES, &num_of_axis );
155
  ioctl( x52_input_fd, JSIOCGBUTTONS, &num_of_buttons );
214
  ioctl( x52_input_fd, JSIOCGBUTTONS, &num_of_buttons );
156
  ioctl( x52_input_fd, JSIOCGNAME(80), &name_of_joystick );
215
  ioctl( x52_input_fd, JSIOCGNAME(80), &name_of_joystick );
157
 
-
 
158
  axis = (int *) calloc( num_of_axis, sizeof( int ) );
-
 
159
  button = (char *)calloc( num_of_buttons, sizeof( char ) );
-
 
160
  button_trigger = (char *) calloc( num_of_buttons, sizeof( char ) );
-
 
161
 
216
 
162
  printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n"
217
  printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n"
163
         , name_of_joystick
218
         , name_of_joystick
164
         , num_of_axis
219
         , num_of_axis
165
         , num_of_buttons );
220
         , num_of_buttons );
166
 
221
 
167
  fcntl( x52_input_fd, F_SETFL, O_NONBLOCK );   /* use non-blocking mode */
222
  fcntl( x52_input_fd, F_SETFL, O_NONBLOCK );   /* use non-blocking mode */
168
 
223
 
169
  return 1;
224
  return 1;
170
}
225
}
171
 
226
 
172
 
227
 
173
 
228
 
174
 
229
 
175
void AddCRC(unsigned int wieviele)
230
void AddCRC(unsigned int wieviele)
176
{
231
{
177
  unsigned int tmpCRC = 0,i;
232
  unsigned int tmpCRC = 0,i;
178
  for(i = 0; i < wieviele;i++)
233
  for(i = 0; i < wieviele;i++)
179
    {
234
    {
180
      tmpCRC += TxBuffer[i];
235
      tmpCRC += TxBuffer[i];
181
    }
236
    }
182
  tmpCRC %= 4096;
237
  tmpCRC %= 4096;
183
  TxBuffer[i++] = '=' + tmpCRC / 64;
238
  TxBuffer[i++] = '=' + tmpCRC / 64;
184
  TxBuffer[i++] = '=' + tmpCRC % 64;
239
  TxBuffer[i++] = '=' + tmpCRC % 64;
185
  TxBuffer[i++] = '\r';
240
  TxBuffer[i++] = '\r';
186
}
241
}
187
 
242
 
188
 
243
 
189
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len)
244
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len)
190
{
245
{
191
  unsigned int pt = 0;
246
  unsigned int pt = 0;
192
  unsigned char a,b,c;
247
  unsigned char a,b,c;
193
  unsigned char ptr = 0;
248
  unsigned char ptr = 0;
194
 
249
 
195
  TxBuffer[pt++] = '#';               // Startzeichen
250
  TxBuffer[pt++] = '#';               // Startzeichen
196
  TxBuffer[pt++] = modul;             // Adresse (a=0; b=1,...)
251
  TxBuffer[pt++] = modul;             // Adresse (a=0; b=1,...)
197
  TxBuffer[pt++] = cmd;                 // Commando
252
  TxBuffer[pt++] = cmd;                 // Commando
198
 
253
 
199
  while(len)
254
  while(len)
200
    {
255
    {
201
      if(len) { a = snd[ptr++]; len--;} else a = 0;
256
      if(len) { a = snd[ptr++]; len--;} else a = 0;
202
      if(len) { b = snd[ptr++]; len--;} else b = 0;
257
      if(len) { b = snd[ptr++]; len--;} else b = 0;
203
      if(len) { c = snd[ptr++]; len--;} else c = 0;
258
      if(len) { c = snd[ptr++]; len--;} else c = 0;
204
      TxBuffer[pt++] = '=' + (a >> 2);
259
      TxBuffer[pt++] = '=' + (a >> 2);
205
      TxBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
260
      TxBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
206
      TxBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
261
      TxBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
207
      TxBuffer[pt++] = '=' + ( c & 0x3f);
262
      TxBuffer[pt++] = '=' + ( c & 0x3f);
208
    }
263
    }
209
 
264
 
210
 
265
 
211
 
266
 
212
  AddCRC(pt);
267
  AddCRC(pt);
213
  printf("Sending to MK %d \n" , pt);
268
  printf("Sending to MK %d \n" , pt);
214
 
269
 
215
  status = send(s,"\r" , 1, 0);
270
  status = send(s,"\r" , 1, 0);
216
 
271
 
217
 
272
 
218
  //  for (c=0;c<pt+2;c++)
273
  //  for (c=0;c<pt+2;c++)
219
  // {
274
  // {
220
  status = write(s,&TxBuffer , pt+3);
275
  status = write(s,&TxBuffer , pt+3);
221
  //   printf("Send to MK %d \n" , TxBuffer[c] );
276
  //   printf("Send to MK %d \n" , TxBuffer[c] );
222
  // }
277
  // }
223
  /*while(TxBuffer[i] !='\r' && i<150)
278
  /*while(TxBuffer[i] !='\r' && i<150)
224
    {
279
    {
225
    //     TxBuffer[i]='#';
280
    //     TxBuffer[i]='#';
226
    status = send(s,&TxBuffer[i] , 1, 0);
281
    status = send(s,&TxBuffer[i] , 1, 0);
227
    printf(" +%d%c ",i,TxBuffer[i]);
282
    printf(" +%d%c ",i,TxBuffer[i]);
228
    i++;
283
    i++;
229
    }
284
    }
230
 
285
 
231
    status = send(s,"\r" , 1, 0);
286
    status = send(s,"\r" , 1, 0);
232
  */
287
  */
233
  // status = send(s,"\r" , 1, 0);
288
  // status = send(s,"\r" , 1, 0);
234
  printf("\n");
289
  printf("\n");
235
}
290
}
236
 
291
 
237
 
292
 
238
void write_display(int line,char* text)
293
void write_display(int line,char* text)
239
{
294
{
240
  if (x52_output) x52_settext(x52_output, line , text, strlen(text));
295
  if (x52_output) x52_settext(x52_output, line , text, strlen(text));
241
}
296
}
242
 
297
 
243
void clear_display()
298
void clear_display()
244
{
299
{
245
  write_display(0,"");
300
  write_display(0,"");
246
  write_display(1,"");
301
  write_display(1,"");
247
  write_display(2,"");
302
  write_display(2,"");
248
}
303
}
249
 
304
 
250
 
305
 
251
void output_device_list()
306
void output_device_list()
252
{
307
{
253
  int i;
308
  int i;
254
  char disp_txt[20];
309
  char disp_txt[20];
255
  for(i=0;i<bt_device_count;i++)
310
  for(i=0;i<bt_device_count;i++)
256
    {
311
    {
257
      if (i<3)
312
      if (i<3)
258
        {
313
        {
259
         
314
         
260
          if (selected_bt_device==i)
315
          if (selected_bt_device==i)
261
            sprintf(disp_txt,"#%s",names[i]);
316
            sprintf(disp_txt,"#%s",names[i]);
262
          else
317
          else
263
            sprintf(disp_txt," %s",names[i]);
318
            sprintf(disp_txt," %s",names[i]);
264
          write_display(i,disp_txt);
319
          write_display(i,disp_txt);
265
        }
320
        }
266
    }
321
    }
267
}
322
}
268
 
323
 
269
int connect_mk(char dest[18])
324
int connect_mk(char dest[18])
270
{
325
{
-
 
326
 
-
 
327
  struct sockaddr_rc addr ;
-
 
328
  struct sockaddr_in sa;
-
 
329
 
-
 
330
 sa.sin_family = AF_INET;
-
 
331
  sa.sin_addr.s_addr = htonl(0x0);
-
 
332
  sa.sin_port = htons(54321);
-
 
333
 
-
 
334
  // allocate a socket
-
 
335
  //  s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
-
 
336
  s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-
 
337
  //);
-
 
338
 
-
 
339
  // set the connection parameters (who to connect to)
-
 
340
  addr.rc_family = AF_BLUETOOTH;
-
 
341
  addr.rc_channel = 1;
-
 
342
  str2ba( dest, &addr.rc_bdaddr );
-
 
343
 
-
 
344
  // connect to server
-
 
345
  //  status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
-
 
346
  status = connect(s,(struct sockaddr*) &sa, sizeof(struct sockaddr_in));
-
 
347
 
-
 
348
  return status;
-
 
349
 
-
 
350
  /*
271
  struct sockaddr_rc addr ;
351
  struct sockaddr_rc addr ;
272
 
352
 
273
  // allocate a socket
353
  // allocate a socket
274
  s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
354
  s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
275
 
355
 
276
  // set the connection parameters (who to connect to)
356
  // set the connection parameters (who to connect to)
277
  addr.rc_family = AF_BLUETOOTH;
357
  addr.rc_family = AF_BLUETOOTH;
278
  addr.rc_channel = 1;
358
  addr.rc_channel = 1;
279
  str2ba( dest, &addr.rc_bdaddr );
359
  str2ba( dest, &addr.rc_bdaddr );
280
 
360
 
281
  // connect to server
361
  // connect to server
282
  status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
362
  status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
283
 
363
 
284
  return status;
364
  return status;
285
 
365
  */
286
}
366
}
287
 
367
 
288
 
368
 
289
 
369
 
290
 
370
 
291
int r=0;
371
int r=0;
292
int count=0;
372
int count=0;
293
int connected=0;
373
int connected=0;
-
 
374
 
-
 
375
 
-
 
376
int input=INPUT_NONE;
294
 
377
 
295
int main(int argc, char**argv)
378
int main(int argc, char**argv)
296
{
379
{
297
  printf("Starting Riddim \n");
380
  printf("Starting Riddim \n");
298
  printf("\tRemote Interactive Digital Drone Interface Mashup\n");
381
  printf("\tRemote Interactive Digital Drone Interface Mashup\n");
299
 
382
 
300
  // 1st argument -> Bluetooth adrees to bypass scanning ( takes to long for short testing roundtrips )
383
  // 1st argument -> Bluetooth adrees to bypass scanning ( takes to long for short testing roundtrips )
301
  if (argv[1])
384
  if (argv[1])
302
    {
385
    {
303
      if (connect_mk(argv[1])==-1)
386
      if (connect_mk(argv[1])==-1)
304
        {
387
        {
305
          printf("cant connect to QC at adress: %s\n",argv[1]);
388
          printf("cant connect to QC at adress: %s\n",argv[1]);
306
          return 0;
389
          return 0;
307
        }
390
        }
308
        printf("connected to QC at adress: %s\n",argv[1]);
391
        printf("connected to QC at adress: %s\n",argv[1]);
309
        connected=1;
392
        connected=1;
310
    }
393
    }
311
  int i;
394
  int i;
-
 
395
 
-
 
396
 
-
 
397
 
312
 
-
 
313
  printf("\nInitializing X-52 input ..\n");
-
 
314
  if (!connect_joy()) return 0;
-
 
-
 
398
 
-
 
399
 
-
 
400
 
-
 
401
  printf("\nInitializing X-52 input ..\n");
-
 
402
  if (connect_joy())
-
 
403
    {
-
 
404
    printf(".. done");//
-
 
405
    input=INPUT_JOYDEV;
-
 
406
    }
-
 
407
  else
-
 
408
    printf(".. ERROR ");//
-
 
409
 
-
 
410
  /*  printf("\nInitializing evdev input ..\n");
-
 
411
  if (connect_evdev())
-
 
412
    {
-
 
413
    printf(".. done");//
-
 
414
    input=INPUT_EVDEV;
-
 
415
    }
315
  printf(".. done");//
416
  else
316
 
417
    printf(".. ERROR ");//
317
 
418
  */
318
  printf("\nInitializing X-52 output ..");
419
  printf("\nInitializing X-52 output ..");
319
 
420
 
320
  x52_output = x52_init();
421
  x52_output = x52_init();
321
   
422
   
322
  clear_display();
423
  clear_display();
323
 
424
 
324
  write_display(0, "RIDDIM active");
425
  write_display(0, "RIDDIM active");
325
 
426
 
326
  if (x52_output) x52_setbri(x52_output, 1,128);  
427
  if (x52_output) x52_setbri(x52_output, 1,128);  
327
  if (x52_output)
428
  if (x52_output)
328
    printf(" done \n");  
429
    printf(" done \n");  
329
  else
430
  else
330
    printf(" not found \n");      
431
    printf(" not found \n");      
331
 
432
 
332
  if (!connected)
433
  if (!connected)
333
    {
434
    {
334
      printf("Scanning for Bluetooth Devices ..\n");
435
      printf("Scanning for Bluetooth Devices ..\n");
335
      write_display(1,"Bluetooth Scan");
436
      write_display(1,"Bluetooth Scan");
336
      scan_bt();
437
      scan_bt();
337
      printf(" done \n");  
438
      printf(" done \n");  
338
      printf(" %d Devices found \n",bt_device_count);  
439
      printf(" %d Devices found \n",bt_device_count);  
339
    }
440
    }
340
 
441
 
341
 
442
 
342
  int v_old;
443
  int v_old;
-
 
444
  int polls=0;
-
 
445
  printf("starting loop ..\n");
-
 
446
 
-
 
447
 
-
 
448
 
343
  while( 1 )    
449
  while( 1 )    
344
    {
450
    {
345
      // poll values from input device
-
 
-
 
451
 
346
      int polls=0;
452
      switch (input)
347
      for (polls=0;polls<100;polls++) // FIXME - better Polling
-
 
348
        {
453
        {
-
 
454
         
-
 
455
        case INPUT_NONE:
349
          read(x52_input_fd, &x52_event_struct, sizeof(struct js_event));
456
          printf("input none\n");
-
 
457
          usleep(10000);
350
               
458
         
-
 
459
          break;
-
 
460
 
351
 
461
        case INPUT_EVDEV:
-
 
462
           printf("input evdev\n");
-
 
463
          usleep(30000);
-
 
464
 
-
 
465
 
-
 
466
        read_bytes = read(evdev_fd, ev, sizeof(struct input_event) * 64);
352
          /* see what to do with the event */
467
           printf("read done\n");
-
 
468
        if (read_bytes < (int) sizeof(struct input_event)) {
-
 
469
            perror("evtest: short read");
-
 
470
            exit (1);
-
 
471
        }
-
 
472
 
353
          switch (x52_event_struct.type & ~JS_EVENT_INIT)
473
        for (yalv = 0; yalv < (int) (read_bytes / sizeof(struct input_event)); yalv++)
354
            {
474
            {
355
            case JS_EVENT_AXIS:
475
              // 1 -> nick
356
              axis   [ x52_event_struct.number ] = x52_event_struct.value;
476
              // 2 -> gas
357
              break;
477
              // 4->roll
358
            case JS_EVENT_BUTTON:
478
              // 5-> gier
-
 
479
              axis[ ev[yalv].code]= ev[yalv].value;
-
 
480
             
-
 
481
              printf("nick:%d roll:%d gier:%d gas:%d\n",axis[3] , axis[4] , axis[5] , axis[2]);
-
 
482
              /*if ( ev[yalv].code==5)
-
 
483
                printf("Event: time %ld.%06ld, type %d, code %d, value %d\n",
-
 
484
                       ev[yalv].time.tv_sec, ev[yalv].time.tv_usec, ev[yalv].type,
359
              button [ x52_event_struct.number ] = x52_event_struct.value;
485
                       ev[yalv].code, ev[yalv].value);
360
              break;
486
              */
361
            }
-
 
362
        }
-
 
363
               
-
 
364
      for( x=0 ; x<num_of_buttons ; ++x )
-
 
365
        if( button[x]==0)
-
 
366
          button_trigger[x]=0;
-
 
367
        else
-
 
368
          {
-
 
369
            if (button_trigger[x]<100)button_trigger[x]++;
-
 
-
 
487
            }
-
 
488
 
-
 
489
 
-
 
490
          break;
-
 
491
        case INPUT_JOYDEV:
-
 
492
          printf("input joydev\n");      
-
 
493
          // poll values from input device
-
 
494
         
-
 
495
          for (polls=0;polls<100;polls++) // FIXME - better Polling
-
 
496
            {
-
 
497
              read(x52_input_fd, &x52_event_struct, sizeof(struct js_event));
-
 
498
             
-
 
499
             
-
 
500
              /* see what to do with the event */
-
 
501
              switch (x52_event_struct.type & ~JS_EVENT_INIT)
-
 
502
                {
-
 
503
                case JS_EVENT_AXIS:
-
 
504
                  axis   [ x52_event_struct.number ] = x52_event_struct.value;
-
 
505
                  break;
-
 
506
                case JS_EVENT_BUTTON:
-
 
507
                  button [ x52_event_struct.number ] = x52_event_struct.value;
-
 
508
                  break;
-
 
509
                }
-
 
510
            }
-
 
511
         
-
 
512
          for( x=0 ; x<num_of_buttons ; ++x )
-
 
513
            if( button[x]==0)
-
 
514
              button_trigger[x]=0;
-
 
515
            else
-
 
516
              {
-
 
517
                if (button_trigger[x]<100)button_trigger[x]++;
-
 
518
              }
-
 
519
          break;
370
          }
520
        }
371
 
521
 
372
 
522
      printf("input done\n");    
373
               
523
               
374
      switch(state)
524
      switch(state)
375
        {
525
        {
376
 
526
 
377
 
527
 
378
        case STATEID_SCANNING:
528
        case STATEID_SCANNING:
379
 
529
 
380
          state=STATEID_CONNECTING;
530
          state=STATEID_CONNECTING;
381
 
531
 
382
          ExternControl.Digital[0]=0;
532
          ExternControl.Digital[0]=0;
383
          ExternControl.Digital[1]=0;
533
          ExternControl.Digital[1]=0;
384
          ExternControl.RemoteTasten=0;
534
          ExternControl.RemoteTasten=0;
385
          ExternControl.Nick=(axis[1]>>8)*(-1)+127;;
535
          ExternControl.Nick=(axis[1]>>8)*(-1)+127;;
386
 
536
 
387
          printf("nick%d\n",ExternControl.Nick);         
537
          printf("nick%d\n",ExternControl.Nick);         
388
          ExternControl.Roll=(axis[0]>>8)*(-1)+127;;
538
          ExternControl.Roll=(axis[0]>>8)*(-1)+127;;
389
          ExternControl.Gier=(axis[5]>>8)*(-1)+127;;
539
          ExternControl.Gier=(axis[5]>>8)*(-1)+127;;
390
          ExternControl.Gas=(axis[2]>>8)*(-1)+127;
540
          ExternControl.Gas=(axis[2]>>8)*(-1)+127;
391
          ExternControl.Higt=0;
541
          ExternControl.Higt=0;
392
          ExternControl.free=0;
542
          ExternControl.free=0;
393
          ExternControl.Frame='t';
543
          ExternControl.Frame='t';
394
          ExternControl.Config=1;
544
          ExternControl.Config=1;
395
 
545
 
396
          printf("sending data\n");
546
          printf("sending data\n");
397
 
547
 
398
         
548
         
399
          SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
549
          SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
400
          gettimeofday(&time_struct1,NULL);
550
          gettimeofday(&time_struct1,NULL);
401
 
551
 
402
          if (button_trigger[BUTTON_SELECT]==1)
552
          if (button_trigger[BUTTON_SELECT]==1)
403
            {
553
            {
404
              state=STATEID_CONNECTING;
554
              state=STATEID_CONNECTING;
405
              clear_display();
555
              clear_display();
406
              write_display(0,"connecting to");
556
              write_display(0,"connecting to");
407
              write_display(1,names[selected_bt_device]);
557
              write_display(1,names[selected_bt_device]);
408
              connect_mk(addrs[selected_bt_device]);
558
              connect_mk(addrs[selected_bt_device]);
409
              write_display(0,"connected to");
559
              write_display(0,"connected to");
410
            }
560
            }
411
                   
561
                   
412
          if ((button_trigger[BUTTON_UP]+button_trigger[BUTTON_DOWN])==1)
562
          if ((button_trigger[BUTTON_UP]+button_trigger[BUTTON_DOWN])==1)
413
            {
563
            {
414
              printf("-> sel_dev %d - %d\n",selected_bt_device,button_trigger[19]);
564
              printf("-> sel_dev %d - %d\n",selected_bt_device,button_trigger[19]);
415
              if (button_trigger[BUTTON_DOWN]==1)
565
              if (button_trigger[BUTTON_DOWN]==1)
416
                if (selected_bt_device>0) selected_bt_device--;
566
                if (selected_bt_device>0) selected_bt_device--;
417
              if (button_trigger[BUTTON_UP]==1)
567
              if (button_trigger[BUTTON_UP]==1)
418
                if (selected_bt_device<bt_device_count-1) selected_bt_device++;
568
                if (selected_bt_device<bt_device_count-1) selected_bt_device++;
419
             
569
             
420
              output_device_list()                ;
570
              output_device_list()                ;
421
            }
571
            }
422
          break;
572
          break;
423
       
573
       
424
        case STATEID_CONNECTING:
574
        case STATEID_CONNECTING:
425
 
575
 
426
          RxBuffer[1]=0;
576
          RxBuffer[1]=0;
427
 
577
 
428
 
578
 
429
          //      ftime(&time_struct);
579
          //      ftime(&time_struct);
430
          //printf("t:%d",time_struct.millitm);
580
          printf("waiting for confirm frame\n");
-
 
581
          RxBuffer[2]=0;
-
 
582
          int confirm_misses=0;
-
 
583
 
431
          while (RxBuffer[1]!='t')
584
          while (RxBuffer[2]!='t')
432
            {
585
            {
433
 
586
 
434
              r=0;
587
              r=0;
435
              in_char='#';
588
              in_char='#';
436
 
589
 
437
              while(in_char!='\r')
590
              while(in_char!='\n')
438
                {
591
                {
439
                  count=read(s,&in_char,1);
592
                  count=read(s,&in_char,1);
440
                  if (in_char!=0)
593
                  if (in_char!=0)
441
                    {
594
                    {
442
                      RxBuffer[r++]=in_char;
595
                      RxBuffer[r++]=in_char;
443
                    }
596
                    }
444
                  else
597
                  else
445
                    {
598
                    {
446
                      RxBuffer[r++]='0';
599
                      RxBuffer[r++]='0';
447
                    }
600
                    }
448
                  //  printf("count:%d r:%d %d %c \n",count , r, in_char, in_char);
601
                  //               printf("\ncount:%d r:%d %d %c \n",count , r, in_char, in_char);
449
                }
602
                }
450
              RxBuffer[r++]='\0';
603
              RxBuffer[r++]='\0';
451
              printf("--->%s\n",RxBuffer);
604
              printf("--->%s\n",RxBuffer);
-
 
605
              // new
-
 
606
              if (button_trigger[12]>1)
-
 
607
                {
-
 
608
                  SendOutData('s', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
-
 
609
                  button_trigger[12]=0;
-
 
610
                }
-
 
611
              if (++confirm_misses>4)
-
 
612
              SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
452
 
613
               
453
            }
614
            }
454
          gettimeofday(&time_struct2,NULL);
615
          gettimeofday(&time_struct2,NULL);
455
 
616
 
456
          printf("last trip: %d",(int)(time_struct1.tv_usec-time_struct2.tv_usec));
617
          printf("last trip: %d",(int)(time_struct1.tv_usec-time_struct2.tv_usec));
457
          act_mode=button[24] | (button[25]<<1);
618
          act_mode=button[24] | (button[25]<<1);
458
 
619
 
459
          switch (act_mode)
620
          switch (act_mode)
460
            {
621
            {
461
            case 0:
622
            case 0:
-
 
623
 
-
 
624
 
462
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK);
625
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK);
463
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL);
626
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL);
464
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER);
627
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER);
465
              act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
628
              act_gas=((axis[AXIS_GAS]>>8)-128)*(-1);
-
 
629
             
-
 
630
              // clip gas      
-
 
631
              if (act_gas<0) act_gas=0;
-
 
632
 
-
 
633
              if (act_gas>250) act_gas=250;        
-
 
634
 
466
 
635
////////              act_gas=0;
467
              break;
636
              break;
468
 
637
 
469
            case 1:
638
            case 1:
470
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/2;
639
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/2;
471
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/2;
640
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/2;
472
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/2;
641
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/2;
473
              act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
642
              act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
474
 
643
 
475
              break;
644
              break;
476
             
645
             
477
            case 2:
646
            case 2:
478
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/3;
647
              act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/3;
479
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/3;
648
              act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/3;
480
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/3;
649
              act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/3;
481
              act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
650
              act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
482
 
651
 
483
 
652
 
484
              break;
653
              break;
485
 
654
 
486
            }
655
            }
487
             
656
             
488
          ExternControl.Digital[0]=0;
657
          ExternControl.Digital[0]=0;
489
          ExternControl.Digital[1]=0;
658
          ExternControl.Digital[1]=0;
490
          ExternControl.RemoteTasten=0;
659
          ExternControl.RemoteTasten=0;
491
          ExternControl.Nick=act_nick;  //(axis[1]>>8)*(-1)/2;
660
          ExternControl.Nick=act_nick;  //(axis[1]>>8)*(-1)/2;
492
          //      printf("nick%d\n",ExternControl.Nick);         
661
          //      printf("nick%d\n",ExternControl.Nick);         
493
          ExternControl.Roll=act_roll; //(axis[0]>>8)*(-1)/2;
662
          ExternControl.Roll=act_roll*(-1); //(axis[0]>>8)*(-1)/2;
494
          ExternControl.Gier=(axis[5]>>8);
663
          ExternControl.Gier=(axis[5]>>8);
-
 
664
          ExternControl.Gier=act_gier; // ************
495
          ExternControl.Gas=(axis[2]>>8)*(-1)+127;
665
          ExternControl.Gas=(axis[2]>>8)*(-1)+127;
-
 
666
          ExternControl.Gas=act_gas; // ************
-
 
667
          //      ExternControl.Gas=0; // ************
496
          ExternControl.Higt=0;
668
          ExternControl.Higt=0;
497
          ExternControl.free=0;
669
          ExternControl.free=0;
498
          ExternControl.Frame='t';
670
          ExternControl.Frame='t';
499
         
671
         
500
          ExternControl.Config=1;
672
          ExternControl.Config=1;
501
          printf("act_mode %d , act_nick %d , act_roll %d , act_gier %d , act_gas %d",act_mode , act_nick  , act_roll  , act_gier , act_gas);
673
          printf("---+++act_mode %d , act_nick %d , act_roll %d , act_gier %d , act_gas %d",act_mode , act_nick  , act_roll  , act_gier , act_gas);
502
 
674
 
503
 
675
 
504
 
676
 
505
          printf("sending data\n");
677
          printf("sending data\n");
506
 
678
 
507
          SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
679
          SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
508
          gettimeofday(&time_struct1,NULL);
680
          gettimeofday(&time_struct1,NULL);
509
          printf("sent data\n");
681
          printf("sent data\n");
510
 
682
 
511
         
683
         
512
          // printf("sleeping\n");
684
          // printf("sleeping\n");
513
          // usleep(10000);
685
          //      for (polls=0;polls<100;polls++) // FIXME - better Polling
514
          // printf("end_sleep\n");
686
          // printf("end_sleep\n");
515
 
687
 
516
          int v=axis[6]/655+50;
688
          int v=axis[6]/655+50;
517
          if (v!=v_old)if (x52_output) x52_setbri(x52_output, 0,v );  
689
          if (v!=v_old)if (x52_output) x52_setbri(x52_output, 0,v );  
518
          v_old=v;
690
          v_old=v;
519
         
691
         
520
          printf("v: %d \n",v);
692
          printf("v: %d \n",v);
521
 
693
 
522
                   
694
                   
523
          for (i=0;i<num_of_axis;i++)
695
          for (i=0;i<num_of_axis;i++)
524
            printf("A%d: %d  ", i,axis[i]>>8 );
696
            printf("A%d: %d  ", i,axis[i]>>8 );
525
         
697
         
526
          for( x=0 ; x<num_of_buttons ; ++x )
698
          for( x=0 ; x<num_of_buttons ; ++x )
527
           
699
           
528
            printf("B%d: %d  ", x, button[x] );            
700
            printf("B%d: %d  ", x, button[x] );            
529
                   
701
                   
530
          break;
702
          break;
531
        }
703
        }
532
                 
704
                 
533
      printf("\n");
705
      printf("\n");
534
      fflush(stdout);
706
      fflush(stdout);
535
      printf("loop fin");
707
      printf("loop fin");
536
               
708
               
537
    }
709
    }
538
 
710
 
539
 
711
 
540
  /******************** Cleanup **********************/
712
  /******************** Cleanup **********************/
541
  close(x52_input_fd);
713
  close(x52_input_fd);
542
  close(s);
714
  close(s);
543
 
715
 
544
  if (x52_output) x52_close(x52_output);
716
  if (x52_output) x52_close(x52_output);
545
  return 0;
717
  return 0;
546
}
718
}
547
 
719