3,9 → 3,6 |
#include <string.h> |
#include <fcntl.h> |
#include "lib/x52/x52.h" |
|
|
|
#include <unistd.h> |
#include <sys/socket.h> |
#include <bluetooth/bluetooth.h> |
13,7 → 10,9 |
#include <bluetooth/hci_lib.h> |
|
|
#include <bluetooth/rfcomm.h> |
|
|
#include <linux/joystick.h> |
#define JOY_DEV "/dev/input/js0" |
|
24,6 → 23,21 |
char names[MAX_BT_DEVICES][248]; |
char addrs[MAX_BT_DEVICES][19]; |
|
int s, status; |
unsigned char TxBuffer[150]; |
unsigned char _TxBuffer[150]; |
|
#define STATEID_SCANNING 0 |
#define STATEID_CONNECTING 1 |
int state=STATEID_SCANNING; |
|
#define BUTTON_SELECT 26 |
#define BUTTON_DOWN 27 |
#define BUTTON_UP 28 |
|
struct x52 *x52_output; |
|
int selected_bt_device=0; |
void scan_bt() |
{ |
inquiry_info *ii = NULL; |
67,65 → 81,367 |
close( sock ); |
} |
|
int x52_input_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x; |
char *button=NULL,*button_trigger=NULL, name_of_joystick[80]; |
|
struct js_event x52_event_struct; |
|
void connect_joy() |
{ |
|
int main(int argc, char**argv) |
|
if( ( x52_input_fd = open( JOY_DEV, O_RDONLY ) ) < 0 ) |
{ |
printf( "Couldn't open joystick device %s\n", JOY_DEV ); |
return ; |
} |
|
ioctl( x52_input_fd, JSIOCGAXES, &num_of_axis ); |
ioctl( x52_input_fd, JSIOCGBUTTONS, &num_of_buttons ); |
ioctl( x52_input_fd, JSIOCGNAME(80), &name_of_joystick ); |
|
axis = (int *) calloc( num_of_axis, sizeof( int ) ); |
button = (char *)calloc( num_of_buttons, sizeof( char ) ); |
button_trigger = (char *) calloc( num_of_buttons, sizeof( char ) ); |
|
printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n" |
, name_of_joystick |
, num_of_axis |
, num_of_buttons ); |
|
fcntl( x52_input_fd, F_SETFL, O_NONBLOCK ); /* use non-blocking mode */ |
|
} |
|
|
struct |
{ |
int i; |
char val[4]; |
} MotortestParam; |
|
int x52_input_fd; |
struct JS_DATA_TYPE x52_input_struct; |
|
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += TxBuffer[i]; |
} |
tmpCRC %= 4096; |
TxBuffer[i++] = '=' + tmpCRC / 64; |
TxBuffer[i++] = '=' + tmpCRC % 64; |
TxBuffer[i++] = '\r'; |
} |
|
if( ( x52_input_fd = open( JOY_DEV, O_RDONLY ) ) < 0 ) |
void SendOutData(unsigned char cmd,unsigned char modul, int len) |
{ |
unsigned int pt = 0,ptr=0,i; |
int a,b,c; |
TxBuffer[pt++] = '#'; // Startzeichen |
TxBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
TxBuffer[pt++] = cmd; // Commando |
|
while(len) |
{ |
printf( "Couldn't open joystick device %s\n", JOY_DEV ); |
return -1; |
if(len) { a = _TxBuffer[ptr++]; len--;} else a = 0; |
if(len) { b = _TxBuffer[ptr++]; len--;} else b = 0; |
if(len) { c = _TxBuffer[ptr++]; len--;} else c = 0; |
TxBuffer[pt++] = '=' + (a >> 2); |
TxBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
TxBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
TxBuffer[pt++] = '=' + ( c & 0x3f); |
} |
|
status = send(s,"\r" , 1, 0); |
i=0; |
while(TxBuffer[i] !='\r' && i<150) |
{ |
// TxBuffer[i]='#'; |
status = send(s,&TxBuffer[i] , 1, 0); |
printf(" +%d%c ",i,TxBuffer[i]); |
i++; |
} |
|
status = send(s,"\r" , 1, 0); |
|
printf("\n"); |
AddCRC(pt); |
printf("Sending to MK\n"); |
|
} |
|
|
int engines_on=0; |
int old_engines_on=0; |
|
printf("Initializing X-52 output .."); |
struct x52 *x52_output = x52_init(); |
if (x52_output) x52_settext(x52_output, 0 , "RIDDIM active", strlen("Scanning BT")); |
if (x52_output) x52_setbri(x52_output, 1,128); |
if (x52_output) |
printf(" done \n"); |
|
void write_display(int line,char* text) |
{ |
if (x52_output) x52_settext(x52_output, line , text, strlen(text)); |
} |
|
void clear_display() |
{ |
write_display(0,""); |
write_display(1,""); |
write_display(2,""); |
} |
|
|
void output_device_list() |
{ |
int i; |
char disp_txt[20]; |
for(i=0;i<bt_device_count;i++) |
{ |
if (i<3) |
{ |
|
if (selected_bt_device==i) |
sprintf(disp_txt,"#%s",names[i]); |
else |
sprintf(disp_txt," %s",names[i]); |
write_display(i,disp_txt); |
} |
} |
} |
|
void connect_mk(char dest[18]) |
{ |
struct sockaddr_rc addr ; |
|
// allocate a socket |
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); |
|
// set the connection parameters (who to connect to) |
addr.rc_family = AF_BLUETOOTH; |
addr.rc_channel = 1; |
str2ba( dest, &addr.rc_bdaddr ); |
|
// connect to server |
status = connect(s, (struct sockaddr *)&addr, sizeof(addr)); |
|
} |
|
|
|
|
|
int main(int argc, char**argv) |
{ |
printf("Starting Riddim \n"); |
printf("\tRemote Interactive Digital Drone Interface Mashup\n"); |
|
//int tmp=2; |
// connect_mk("00:0B:CE:01:6B:4F"); |
|
/* |
|
{ |
// send a message |
|
MotortestParam.val[0]=tmp; |
MotortestParam.val[1]=tmp; |
MotortestParam.val[2]=tmp; |
MotortestParam.val[3]=tmp; |
|
engines_on=1; |
|
|
else |
printf(" not found \n"); |
engines_on=0; |
|
if (engines_on!=old_engines_on) |
{ |
int c; |
|
if( 0 == status )for (c=0;c<10;c++) |
int c; |
for (c=0;c<2;c++) |
SendOutData('t', 0, &MotortestParam, sizeof(MotortestParam)); |
|
|
|
sleep(1); |
} |
*/ |
|
printf("Scanning for Bluetooth Devices .."); |
if (x52_output) x52_settext(x52_output, 1 , "Scanning BT", strlen("Scanning BT")); |
// scan_bt(); |
|
if( status < 0 ) perror("uh oh"); |
printf ("send status %d",status); |
// close(s); |
|
int i; |
/* |
|
MotortestParam.val[0]=2; |
MotortestParam.val[1]=2; |
MotortestParam.val[2]=2; |
MotortestParam.val[3]=2; |
|
|
|
|
while(1) |
{ |
initSerial("/dev/rfcomm0"); |
sleep(2); |
SendOutData('t', 0, &MotortestParam, sizeof(MotortestParam)); |
sleep(1); |
} |
*/ |
|
|
printf("\nInitializing X-52 input ..\n"); |
connect_joy(); |
printf(".. done"); |
|
printf("\nInitializing X-52 output .."); |
|
x52_output = x52_init(); |
|
clear_display(); |
|
write_display(0, "RIDDIM active"); |
|
if (x52_output) x52_setbri(x52_output, 1,128); |
if (x52_output) |
printf(" done \n"); |
else |
printf(" not found \n"); |
|
|
|
printf("Scanning for Bluetooth Devices ..\n"); |
write_display(1,"Bluetooth Scan"); |
|
|
scan_bt(); |
printf(" done \n"); |
printf(" %d Devices found \n",bt_device_count); |
|
|
for(i=0;i<bt_device_count;i++) |
printf(" %d -> %s (%s) \n",i,names[i],addrs[i]); |
printf("Starting UFO Control Seet ( ^c to quit ) \n"); |
{ |
printf(" %d -> %s (%s) \n",i,names[i],addrs[i]); |
if (i<3) write_display(i,names[i]); |
} |
|
output_device_list() ; |
|
|
int v_old; |
while( 1 ) |
{ |
|
int polls=0; |
for (polls=0;polls<1000;polls++) |
{ |
read(x52_input_fd, &x52_event_struct, sizeof(struct js_event)); |
|
|
/* see what to do with the event */ |
switch (x52_event_struct.type & ~JS_EVENT_INIT) |
{ |
case JS_EVENT_AXIS: |
axis [ x52_event_struct.number ] = x52_event_struct.value; |
break; |
case JS_EVENT_BUTTON: |
button [ x52_event_struct.number ] = x52_event_struct.value; |
break; |
} |
} |
if (1) |
{ |
|
} |
|
for( x=0 ; x<num_of_buttons ; ++x ) |
if( button[x]==0) |
button_trigger[x]=0; |
else |
{ |
if (button_trigger[x]<100)button_trigger[x]++; |
} |
|
|
|
switch(state) |
{ |
case STATEID_SCANNING: |
if (button_trigger[BUTTON_SELECT]==1) |
{ |
state=STATEID_CONNECTING; |
clear_display(); |
write_display(0,"connecting to"); |
write_display(1,names[selected_bt_device]); |
connect_mk(addrs[selected_bt_device]); |
write_display(0,"connected to"); |
} |
|
if ((button_trigger[BUTTON_UP]+button_trigger[BUTTON_DOWN])==1) |
{ |
printf("-> sel_dev %d - %d\n",selected_bt_device,button_trigger[19]); |
if (button_trigger[BUTTON_DOWN]==1) |
if (selected_bt_device>0) selected_bt_device--; |
if (button_trigger[BUTTON_UP]==1) |
if (selected_bt_device<bt_device_count-1) selected_bt_device++; |
|
output_device_list() ; |
} |
break; |
case STATEID_CONNECTING: |
|
|
_TxBuffer[0]=(axis[2]>>8)*(-1)+127; |
if (button[7]!=1)_TxBuffer[0] =0; |
|
_TxBuffer[1]=_TxBuffer[0]; |
_TxBuffer[2]=_TxBuffer[0]; |
_TxBuffer[3]=_TxBuffer[0]; |
|
SendOutData('t', 0, 4); |
|
|
sleep(0.05); |
|
|
|
int v=axis[6]/655+50; |
if (v!=v_old)if (x52_output) x52_setbri(x52_output, 0,v ); |
v_old=v; |
|
printf("v: %d \r",v); |
|
|
for (i=0;i<num_of_axis;i++) |
printf("A%d: %d ", i,axis[i]>>8 ); |
|
for( x=0 ; x<num_of_buttons ; ++x ) |
|
printf("B%d: %d ", x, button[x] ); |
|
break; |
} |
/* |
|
*/ |
printf("\r"); |
fflush(stdout); |
|
/* |
if( read( x52_input_fd, &x52_input_struct, JS_RETURN ) != JS_RETURN ) |
{ |
printf( "\nFailed to read from Joystick\n" ); |
} |
|
if (x52_output) x52_setbri(x52_output, 0,x52_input_struct.x ); |
|
if (x52_output) x52_setbri(x52_output, 1,x52_input_struct.y ); |
if (x52_output) x52_setbri(x52_output, 2,x52_input_struct.x ); |
// if (x52_output) x52_setbri(x52_output, 2,x52_input_struct.x ); |
|
printf("X: % 4d Y: % 4d Z: % 4d B1: %1d B2: %1d \r" |
,x52_input_struct.x /* X axis */ |
,x52_input_struct.y /* Y axis */ |
,x52_input_struct.y /* Z axis */ |
,(x52_input_struct.buttons & 1) ? 1 : 0 /* button 1 */ |
,(x52_input_struct.buttons & 2) ? 1 : 0 ); /* button 2 */ |
} |
|
*/ |
} |
|
close(x52_input_fd); /* too bad we never get here */ |
|
if (x52_output) x52_close(x52_output); |