Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev HEAD → Rev 483

/Riddim/riddim.c
0,0 → 1,566
/**************************************************
*
*
* Riddim
* Remote Interactive Digital Drone Interface Mashup
*
* 2007-2008 Marcus -LiGi- Bueschleb
*
*
**************************************************/
 
#include "riddim.h"
 
 
int state=STATEID_SCANNING;
 
 
struct js_event x52_event_struct;
 
int engines_on=0;
int old_engines_on=0;
 
int *axis;
char *button;
 
struct x52 *x52_output;
 
int selected_bt_device=0;
 
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 print_device_list()
{
int i;
for(i=0;i<bt_device_count;i++)
printf("device%i->%s\n",i,names[i]);
}
 
 
 
int count=0;
int connected=0;
 
 
int input=INPUT_NONE;
 
 
 
int main(int argc, char**argv)
{
 
printf("Starting Riddim %d.%d \n",RIDDIM_VERSION_MAJOR,RIDDIM_VERSION_MINOR );
printf("\tRemote Interactive Digital Drone Interface Mashup\n");
printf("\nusage:\n");
printf("\t riddim [config_file]\n\n");
 
 
 
collect_evdev_devices();
 
bt_host_init();
 
if (argv[1])
parse_config(argv[1]);
else
parse_config("/etc/riddim.conf");
 
// exit(0);
 
printf("input %s:\n",input_evdev_name);
/*
if (bluetooth_mac)
{
 
printf("Connecting via Bluetooth to %s\n",bluetooth_mac);
if (connect_mk_bluetooth(bluetooth_mac));;
connected=TRUE;
}
*/
 
if (mk_tty)
{
printf("connecting to mk via tty: %s\n",mk_tty);
if (!connect_mk_tty(mk_tty))
printf("cant connect !!");
else
{
printf("connected !-)");
connected=TRUE;
}
}
 
if (mk_socket_port)
{
printf("connecting to mk via local port: %i\n",mk_socket_port);
if (connect_mk_localhost_socket(mk_socket_port)==-1)
printf("cant connect !!");
else
{
printf("connected !-)");
connected=TRUE;
}
}
 
// todo reenable bluetooth connection
 
connect_evdev();
 
/*
if ((input_evdev_name))
{
printf("\nInitializing evdev input (%s) ..\n",input_evdev_name);
if (connect_evdev(input_evdev_name))
{
printf(".. done");//
input=INPUT_EVDEV;
}
else
printf(".. ERROR ");//
}
*/
if (input_joydev_name)
{
printf("\nInitializing joystick input from %s ..\n",input_joydev_name);
if (connect_joy())
{
printf(".. done");//
input=INPUT_JOYDEV;
}
else
printf(".. ERROR ");//
}
 
 
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");
 
/*
if (!connected)
{
printf("Scanning for Bluetooth Devices ..\n");
write_display(1,"Bluetooth Scan");
scan_bt();
printf(" done \n");
printf(" %d Devices found \n",bt_device_count);
print_device_list() ;
}
*/
 
// int v_old;
int polls=0;
 
 
if (exit_after_init)
exit(0);
printf("starting loop ..\n");
 
 
 
int complete_misses=0;
int complete_matches=0;
 
 
int confirm_misses;
 
 
 
// init_evdevstatus_led();
 
while( TRUE )
{
 
// blink_evdev_led();
bt_host_tick(mk_socket);
usleep(loop_delay);
 
 
 
poll_evdev();
 
switch (input)
{
 
case INPUT_NONE:
printf("processing input none\n");
break;
 
case INPUT_EVDEV:
printf("processing input evdev\n");
 
break;
 
case INPUT_JOYDEV:
printf("processing input joydev\n");
// poll values from input device
for (polls=0;polls<100;polls++) // FIXME - better Polling
{
read(joy_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;
}
}
int x;
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]++;
}
break;
} // switch (input)
 
printf("input done\n");
switch(state)
{
case STATEID_SCANNING:
state=STATEID_CONNECTING;
/*
ExternControl.Digital[0]=0;
ExternControl.Digital[1]=0;
ExternControl.RemoteTasten=0;
ExternControl.Nick=(axis[1]>>8)*(-1)+127;;
 
printf("nick%d\n",ExternControl.Nick);
ExternControl.Roll=(axis[0]>>8)*(-1)+127;;
ExternControl.Gier=(axis[5]>>8)*(-1)+127;;
ExternControl.Gas=(axis[2]>>8)*(-1)+127;
ExternControl.Higt=0;
ExternControl.free=0;
ExternControl.Frame='t';
ExternControl.Config=1;
 
printf("sending data\n");
 
if (connected)SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
gettimeofday(&time_struct1,NULL);
 
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++;
 
}
*/
break;
case STATEID_CONNECTING:
 
confirm_misses=0;
 
RxBuffer[2]=0;
if (connected)
while (RxBuffer[2]!='B')
{
 
RxBuffer[1]=0;
read_from_mk();
bt_host_send(RxBuffer,rx_last_length);
printf("sending to host: %s",PrintableRxBuffer);
 
 
// ftime(&time_struct);
 
printf("waiting for confirm frame ( confirmed:%d misses:%d %c)\n",complete_matches,complete_misses,RxBuffer[2]);
// RxBuffer[2]=0;
 
// r=0;
 
// new
/*
if (button_trigger[12]>1)
{
SendOutData('s', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
button_trigger[12]=0;
}
*/
ExternControl.Frame='t';
if (++confirm_misses>4)
{
complete_misses++;
printf("sending again\n");
SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
}
}
else
printf("not connected to mk\n");
 
gettimeofday(&time_struct2,NULL);
 
printf("last trip: %d\n",(int)(time_struct2.tv_usec-time_struct1.tv_usec));
// act_mode=button[24] | (button[25]<<1);
 
 
 
// Step converting axis data to nick/roll/gier/gas/..
 
// act_nick=(evdev_rel_axis[rel_axis_nick]-128)*nick_mul;
 
 
 
 
/* Mix input values */
 
act_gas=0;
act_nick=0;
act_roll=0;
act_gier=0;
 
int act_input=0;
for (act_input=0;act_input<input_count;act_input++)
{
//process buttons
if (inputs[act_input].nick_up_btn!=-1)
{
if (inputs[act_input].evdev_button[inputs[act_input].nick_up_btn]!=0)
act_nick=100;
}
 
if (inputs[act_input].nick_down_btn!=-1)
{
if (inputs[act_input].evdev_button[inputs[act_input].nick_down_btn]!=0)
act_nick=-100;
}
 
if (inputs[act_input].roll_left_btn!=-1)
{
if (inputs[act_input].evdev_button[inputs[act_input].roll_left_btn]!=0)
act_roll=100;
}
 
if (inputs[act_input].roll_right_btn!=-1)
{
if (inputs[act_input].evdev_button[inputs[act_input].roll_right_btn]!=0)
act_roll=-100;
}
 
// process axis
if (inputs[act_input].rel_axis_nick!=-1)
act_nick=inputs[act_input].evdev_rel_axis[inputs[act_input].rel_axis_nick]*inputs[act_input].nick_mul;
 
if (inputs[act_input].rel_axis_roll!=-1)
act_roll=inputs[act_input].evdev_rel_axis[inputs[act_input].rel_axis_roll]*inputs[act_input].roll_mul;
 
 
if (inputs[act_input].rel_axis_gier!=-1)
act_gier=inputs[act_input].evdev_rel_axis[inputs[act_input].rel_axis_gier]*inputs[act_input].gier_mul;
 
 
if (inputs[act_input].rel_axis_gas!=-1)
act_gas=inputs[act_input].evdev_rel_axis[inputs[act_input].rel_axis_gas]*inputs[act_input].gas_mul;
 
 
 
}
 
switch(input)
{
case INPUT_EVDEV:
/*
act_nick=(evdev_rel_axis[rel_axis_nick]-nick_add)*nick_mul;
act_roll=(evdev_rel_axis[rel_axis_roll]-nick_add)*roll_mul;
act_gier=(evdev_rel_axis[rel_axis_gier]-nick_add)*gier_mul;
act_gas=(evdev_rel_axis[rel_axis_gas]-nick_add)*gas_mul;
*/
 
break;
 
case INPUT_JOYDEV:
act_nick=(axis[rel_axis_nick])*nick_mul;
act_roll=(axis[rel_axis_roll])*roll_mul;
act_gier=(axis[rel_axis_gier])*gier_mul;
act_gas=(axis[rel_axis_gas]*-1+33000)*gas_mul;
break;
}
 
// act values clipping to usefull vals
// act_gas=0;
 
// act_gas=255;
 
 
/*
switch (act_mode)
{
case 0:
 
 
act_nick=(axis[AXIS_NICK])*(INVERT_NICK);
act_roll=(axis[AXIS_ROLL])*(INVERT_ROLL);
act_gier=(axis[AXIS_GIER])*(INVERT_GIER);
act_gas=((axis[AXIS_GAS])-128)*(-1);
// clip gas
if (act_gas<0) act_gas=0;
 
if (act_gas>250) act_gas=250;
 
//////// act_gas=0;
break;
 
case 1:
act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/2;
act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/2;
act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/2;
act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
 
break;
case 2:
act_nick=(axis[AXIS_NICK]>>8)*(INVERT_NICK)/3;
act_roll=(axis[AXIS_ROLL]>>8)*(INVERT_ROLL)/3;
act_gier=(axis[AXIS_GIER]>>8)*(INVERT_GIER)/3;
act_gas=(axis[AXIS_GAS]>>8)*(INVERT_GAS);
 
 
break;
 
}
*/
ExternControl.Digital[0]=0;
ExternControl.Digital[1]=0;
ExternControl.RemoteTasten=0;
ExternControl.Higt=0;
ExternControl.free=0;
ExternControl.Frame='t';
ExternControl.Config=1;
 
 
ExternControl.Nick=act_nick; //(axis[1]>>8)*(-1)/2;
ExternControl.Roll=act_roll*(-1); //(axis[0]>>8)*(-1)/2;
ExternControl.Gier=act_gier; // ************
ExternControl.Gas=act_gas; // ************
ExternControl.Gas=255; // ************
 
 
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);
 
if (connected)
{
complete_matches++;
printf("sending data\n");
SendOutData('b', 0, (unsigned char *)&ExternControl, sizeof(ExternControl));
gettimeofday(&time_struct1,NULL);
printf("sent data\n");
}
// printf("sleeping\n");
// for (polls=0;polls<100;polls++) // FIXME - better Polling
// printf("end_sleep\n");
// 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 \n",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("\n");
fflush(stdout);
printf("loop fin ( confirmed:%d misses:%d | debug_sets:%d )\n",complete_matches,complete_misses,debug_sets);
printf("------------------------------------------------------------------------\n");
}
 
 
/******************** Cleanup **********************/
close(joy_input_fd);
close(mk_socket);
 
if (x52_output) x52_close(x52_output);
return 0;
}