コード例 #1
0
ファイル: servoDualshock.cpp プロジェクト: RYOQN/StudyRPi
int main(int argc, char* argv[])
{
	printf("Press Maru-Button to Exit Process.\n");
	int iRet = 0;

	CJoystickDrv* pJoystick = NULL;

	try
	{
		// ready GPIO
		if( wiringPiSetupGpio() == -1 ){
			printf("failed to wiringPiSetupGpio()\n");
			return 1;
		}

		// ready PWM
		pinMode(GPIO_NO, PWM_OUTPUT);
		pwmSetMode(PWM_MODE_MS);
		pwmSetClock(DEF_PWM_CLOCK);
		pwmSetRange(DEF_PWM_RANGE);
	
		// ready Joystick
		pJoystick = CJoystickDrv::createInstance();
		if(!pJoystick){
			throw 0;
		}
		if(pJoystick->connectJoystick()!=0){
			printf("failed to connectJoystick()\n");
			throw 0;
		}

		const int axis_min = DUALSHOCK_ANALOG_VAL_MIN;
		const int axis_max = DUALSHOCK_ANALOG_VAL_MAX;
		const int axis_mid = DUALSHOCK_ANALOG_VAL_MID;

		const int servo_min = SERVO_MIN;
		const int servo_max = SERVO_MAX;
		const int servo_mid = SERVO_MID;

		pwmWrite(GPIO_NO, servo_mid);
		printf("begin loop \n");
		int pre_val = servo_mid;
		while(1){
			// Joystickの状態を更新
			if( pJoystick->readJoystick()!=0 ){
				printf("faile to readJoystick()\n");
				throw 0;
			}

			int roll = pJoystick->getAxisState(0);
			int val = servo_mid;
			if(roll==axis_mid){ // 中間値
				val = servo_mid;
			}else if(roll > axis_mid){ // 右
				double rate = fabs( (double)roll / (double)(axis_max) );
				int delta = (int)( (double)( servo_mid - servo_min) * rate );
				val = servo_mid - delta;
				if(val < servo_min){
					val = servo_min;
				}
			}else if(roll < axis_mid){ // 左
				double rate = fabs( (double)roll / (double)(axis_min) );
				int delta = (int)( (double)( servo_max - servo_mid ) * rate );
				val = servo_mid + delta;
				if(val > servo_max){
					val = servo_max;
				}
			}
			if( pre_val != val ){
				pwmWrite(GPIO_NO, val);
				usleep(DELAY_USEC);
				pre_val = val;
			}
			
			//Maru
			if(pJoystick->getButtonState(JOY_MARU) == BUTTON_ON){
				printf("pushed Maru-Button\n");
				break;
			}

			sleep(0);
		}
		printf("end loop\n");

		pwmWrite(GPIO_NO, servo_mid);
		if(pJoystick){
			delete pJoystick;
			pJoystick = NULL;
		}
	}
	catch(...)
	{
		printf("catch!! \n");
		iRet = -1;
		if(pJoystick){
			delete pJoystick;
			pJoystick = NULL;
		}
	}

	return iRet;
}
コード例 #2
0
int main(int argc, char* argv[])
{
	int iRet = 0;

	CJoystickDrv* pJoystick = NULL;

	try
	{
		// GPIOを初期化
		if( RPiGpioDrv::init(RPI_VER_TWO) != 0 ){
			printf("failed to RPiGpioDrv::init().\n");
			throw 0;
		}

		// GPIO_Aを出力に設定
		if( RPiGpioDrv::setPinMode(GPIO_A, GPIO_OUTPUT) != 0 ){
			printf("failed to RPiGpioDrv::setPinMode(GPIO_OUTPUT).\n");
			throw 0;
		}

		// GPIO_Bを入力に設定
		if( RPiGpioDrv::setPinMode(GPIO_B, GPIO_INPUT) != 0 ){
			printf("failed to RPiGpioDrv::setPinMode(GPIO_INPUT).\n");
			throw 0;
		}

		// ready DUALSHOCK
		pJoystick = CJoystickDrv::createInstance();
		if(!pJoystick){
			throw 0;
		}
		if(pJoystick->connectJoystick()!=0){
			printf("failed to connectJoystick()\n");
			throw 0;
		}
		printf("begin loop \n");

		// EXEC_CNT分処理を繰り返す
		int i=0;
		while(1){//(i<=EXEC_CNT){
			// DUALSHOCKの状態を更新
			if( pJoystick->readJoystick()!=0 ){
				printf("faile to readJoystick()\n");
				throw 0;
			}

			//Left
			if(pJoystick->getButtonState(JOY_LEFT) == BUTTON_ON)
			{
				printf("pushed Left-Button\n");

				// GPIO_AをON(Highレベル)にする
				if( RPiGpioDrv::setOutLevel(GPIO_A, GPIO_LV_HIGH) != 0 ){
					printf("failed to setOutLevel(GPIO_LV_HIGH).\n");
					throw 0;
				}
				usleep(DELAY_USEC);
			}

			//Right
			if(pJoystick->getButtonState(JOY_RIGHT) == BUTTON_ON)
			{
				printf("pushed Right-Button\n");

				// GPIO_AをOFF(Lowレベル)にする
				if( RPiGpioDrv::setOutLevel(GPIO_A, GPIO_LV_LOW) != 0 ){
					printf("failed to setOutLevel(GPIO_LV_LOW).\n");
					throw 0;
				}
				usleep(DELAY_USEC);
			}

			//Up
			if(pJoystick->getButtonState(JOY_UP) == BUTTON_ON)
			{
				printf("pushed Up-Button\n");
			}

			//Down
			if(pJoystick->getButtonState(JOY_DOWN) == BUTTON_ON)
			{
				printf("pushed Down-Button\n");
			}

			//Maru
			if(pJoystick->getButtonState(JOY_MARU) == BUTTON_ON)
			{
				printf("pushed Maru-Button\n");
				break;
			}

			i++;
			sleep(0);
		}
		printf("end loop\n");

		if(pJoystick){
			delete pJoystick;
			pJoystick = NULL;
		}
	}
	catch(...)
	{
		printf("catch!! \n");
		iRet = -1;
		if(pJoystick){
			delete pJoystick;
			pJoystick = NULL;
		}
	}

	return iRet;
}