Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2104 → Rev 2105

/RaspberryPi/PiMoteCam/gamepad.c
0,0 → 1,227
#include <linux/joystick.h>
#include "main.h"
#include "gamepad.h"
#include "frame.h"
 
volatile int *Axis = NULL;
volatile char *Button = NULL;
volatile float Sensitivity = 1.0;
int NumberOfAxesAvailiable;
int NumberOfButtonsAvailiable;
char GamepadConnected[30];
u8 IsActive = 0;
u8 ProgramSelect = 0;
 
int recordingButtonTemp = 125;
int padFd;
struct js_event js;
 
struct str_ExternControl externControl; //struct for controlling MikroKopter
struct str_ExternControl externControlGier; //struct for controlling Yaw (Gier) only
 
u8 gamepad_values_convert_for_cam(int tmpvalue){
u8 tmp;
double tmpdouble = tmpvalue;
tmp = ((((tmpdouble/(MaxAxisValue))-1)*125)-131)*-1;
if(tmp == 0){tmp = 255;}
return(tmp);
}
 
//>> Converting gamepad values to values readable by a MikroKopter
//------------------------------------------------------------------------------------------------------
u8 gamepad_values_convert_for_kopter(int tmpvalue){
u8 tmp;
double tmpdouble = tmpvalue;
tmp = ((((tmpdouble/(MaxAxisValue*Sensitivity))-1)*125)-131)*-1;
/*Increase values exponentially
if(tmpvalue < 0){
tmpdouble = tmpvalue*-1;
}else{tmpdouble = tmpvalue;}
tmp = ((30497*tmpdouble*tmpdouble*tmpdouble)/11187226521286200+(10667778*tmpdouble*tmpdouble)/532725072442200+(2592340312*tmpdouble)/11187226521286);
if(tmpvalue < 0){
tmp = (tmp*-1)+255;
}
*/
return(tmp);
}
 
u8 gamepad_values_convert_for_kopter_gas(int tmpvalue){
u8 tmp;
double tmpdouble = tmpvalue;
tmp = ((((tmpdouble/(MaxAxisValue))-1)*125)-131)*-1;
return(tmp);
}
 
int check_if_button_pushed(){
read_gamepad_data();
int buttonpushed = -1;
for (int i = 0; i < NumberOfButtonsAvailiable; i++)
{
if(Button[i] != 0){
buttonpushed = i;
}
}
return(buttonpushed);
}
 
//>> Check if controls are active
//------------------------------------------------------------------------------------------------------
void check_if_controls_active(){
if(check_if_button_pushed() == GamepadLayout[17] && IsActive == 0){
IsActive = 1;
while(1){if(!value_sum(0)){break;};}
}else if(check_if_button_pushed() == GamepadLayout[17] && IsActive == 1){
IsActive = 0;
while(1){if(!value_sum(0)){break;};}
}
}
//>> Check if program has been switched
//------------------------------------------------------------------------------------------------------
void check_program_switch(){
if(check_if_button_pushed() == GamepadLayout[11]){
frame_print("", 1, 0);
ProgramSelect = 1;
}else if(check_if_button_pushed() == GamepadLayout[12]){
frame_print("", 1, 0);
ProgramSelect = 2;
}
}
 
//>> Check if sensitivity of the controls has been adjusted
//------------------------------------------------------------------------------------------------------
void get_sensitivity(){
if(check_if_button_pushed() == GamepadLayout[15] && Sensitivity <= 2.0){
if(Sensitivity < 2){buzzer_short(1);}
Sensitivity += 0.2;
while(1){if(!value_sum(0)){break;};}
}else if(check_if_button_pushed() == GamepadLayout[16] && Sensitivity > 1.0){
if(Sensitivity > 1){buzzer_short(1);}
Sensitivity -= 0.2;
while(1){if(!value_sum(0)){break;};}
}
}
 
//>> Preparing Data for remotely controlling a Camera-Gimbal
//------------------------------------------------------------------------------------------------------
/*
void create_data_camera(serial_data_struct* pdata_package_camera_control, serial_data_struct* pdata_package_camera_control_gier){
pdata_package_camera_control->data[0] = gamepad_values_convert_for_cam(Axis[GamepadLayout[0]]); //Nick
pdata_package_camera_control->data[1] = gamepad_values_convert_for_cam(Axis[GamepadLayout[1]]); //Roll
pdata_package_camera_control->data[2] = gamepad_values_convert_for_cam(Axis[GamepadLayout[3]]); //
if(Button[GamepadLayout[8]] > 0){recordingButtonTemp = 131;}else if(Button[GamepadLayout[9]] > 0){recordingButtonTemp = 125;}
pdata_package_camera_control->data[3] = recordingButtonTemp;
if(Button[GamepadLayout[10]]){pdata_package_camera_control->data[4] = 131;}else{pdata_package_camera_control->data[4] = 125;}
int i = 5;
while(i < 12){
pdata_package_camera_control->data[i] = 0;
i++;
}
//Add Yaw (Gier)-funcionality
externControlGier.Gier = gamepad_values_convert_for_kopter(Axis[GamepadLayout[2]]);
externControlGier.Config = EC_VALID | EC_GAS_ADD;
externControlGier.Frame = 'z'; //character for echo
u8 *tmpData = (unsigned char *) &externControlGier;
for (int i = 0; i < pdata_package_camera_control_gier->cmdLength; ++i)
{
pdata_package_camera_control_gier->data[i] = tmpData[i];
}
 
//Print out values on screen
char tmpbuffer[255];
sprintf(tmpbuffer, "Nick: %d \n Roll: %d \n Gier: %d \n Zoom: %d \n Aufnahme: %d \n Auslösung: %d", pdata_package_camera_control->data[0], pdata_package_camera_control->data[1], pdata_package_camera_control_gier->data[2], pdata_package_camera_control->data[2], pdata_package_camera_control->data[3], pdata_package_camera_control->data[4]);
frame_values("VALUES", 5, 2);
frame_values(tmpbuffer, 5, 4);
}
*/
 
//>> Preparing Data for remotely controlling a Camera-Gimbal (CAM CONTROL ONLY)
//------------------------------------------------------------------------------------------------------
void create_data_camera(serial_data_struct* pdata_package_camera_control, serial_data_struct* pdata_package_camera_control_gier){
pdata_package_camera_control->data[0] = gamepad_values_convert_for_cam(Axis[GamepadLayout[0]]); //Nick
pdata_package_camera_control->data[1] = gamepad_values_convert_for_cam(Axis[GamepadLayout[1]]); //Roll
pdata_package_camera_control->data[2] = gamepad_values_convert_for_cam(Axis[GamepadLayout[3]]); //
if(Button[GamepadLayout[4]] > 0){recordingButtonTemp = 131;}else if(Button[GamepadLayout[5]] > 0){recordingButtonTemp = 125;}
pdata_package_camera_control->data[3] = recordingButtonTemp;
if(Button[GamepadLayout[6]]){pdata_package_camera_control->data[4] = 131;}else{pdata_package_camera_control->data[4] = 125;}
int i = 5;
while(i < 12){
pdata_package_camera_control->data[i] = 0;
i++;
}
//Add Yaw (Gier)-funcionality
externControlGier.Gier = gamepad_values_convert_for_kopter(Axis[GamepadLayout[2]]);
externControlGier.Config = EC_VALID | EC_GAS_ADD;
externControlGier.Frame = 'z'; //character for echo
u8 *tmpData = (unsigned char *) &externControlGier;
for (int i = 0; i < pdata_package_camera_control_gier->cmdLength; ++i)
{
pdata_package_camera_control_gier->data[i] = tmpData[i];
}
 
//Print out values on screen
char tmpbuffer[255];
sprintf(tmpbuffer, "Nick: %d \n Roll: %d \n Gier: %d \n Zoom: %d \n Aufnahme: %d \n Auslösung: %d", pdata_package_camera_control->data[0], pdata_package_camera_control->data[1], pdata_package_camera_control_gier->data[2], pdata_package_camera_control->data[2], pdata_package_camera_control->data[3], pdata_package_camera_control->data[4]);
frame_values("VALUES", 5, 2);
frame_values(tmpbuffer, 5, 4);
}
 
//>> Preparing Data for remotely controlling a MikroKopter
//------------------------------------------------------------------------------------------------------
void create_data_kopter(serial_data_struct* pdata_package_kopter_control){
if(check_if_button_pushed() == GamepadLayout[13]){ //Motor start
externControl.Nick = 131;
externControl.Roll = 131;
externControl.Gier = 131;
externControl.Gas = 131;
}else if(check_if_button_pushed() == GamepadLayout[14]){ //Motor stop
externControl.Nick = 131;
externControl.Roll = 125;
externControl.Gier = 125;
externControl.Gas = 131;
}else{
externControl.Nick = gamepad_values_convert_for_kopter(Axis[GamepadLayout[4]]);
externControl.Roll = gamepad_values_convert_for_kopter(Axis[GamepadLayout[5]]);
externControl.Gier = gamepad_values_convert_for_kopter(Axis[GamepadLayout[6]]);
externControl.Gas = gamepad_values_convert_for_kopter_gas(Axis[GamepadLayout[7]]);
}
externControl.Config = EC_VALID | EC_GAS_ADD | EC_IGNORE_RC;
externControl.Frame = 'z'; //character for echo
u8 *tmpData = (unsigned char *) &externControl;
for (int i = 0; i < pdata_package_kopter_control->cmdLength; ++i)
{
pdata_package_kopter_control->data[i] = tmpData[i];
}
//Print out values on screen
char tmpbuffer[255];
sprintf(tmpbuffer, "Nick: %d \n Roll: %d \n Gier: %d \n Gas : %d \n", pdata_package_kopter_control->data[0], pdata_package_kopter_control->data[1], pdata_package_kopter_control->data[2], pdata_package_kopter_control->data[3]);
frame_values("VALUES", 5, 2);
frame_values(tmpbuffer, 5, 4);
}
 
void read_gamepad_data(){
read(padFd, &js, sizeof(struct js_event));
switch (js.type & ~JS_EVENT_INIT)
{
case JS_EVENT_AXIS:
Axis [ js.number ] = js.value;
break;
case JS_EVENT_BUTTON:
Button [ js.number ] = js.value;
break;
}
}
 
//>> Initialize Gamepad
//------------------------------------------------------------------------------------------------------
void gamepad_init(){
if((padFd = open(GAME_PAD, O_RDONLY)) == -1)
{
printf( "Couldn't open gamepad\n" );
}
ioctl( padFd, JSIOCGAXES, &NumberOfAxesAvailiable );
ioctl( padFd, JSIOCGBUTTONS, &NumberOfButtonsAvailiable );
ioctl( padFd, JSIOCGNAME(80), &GamepadConnected );
Axis = (int *) calloc( NumberOfAxesAvailiable, sizeof( int ) );
Button = (char *) calloc( NumberOfButtonsAvailiable, sizeof( char ) );
fcntl( padFd, F_SETFL, O_NONBLOCK ); /* use non-blocking mode */
}