#include <Mouse.h>
#include <Keyboard.h>
#include <IRLib.h>
#include <IRLibMatch.h>
#include <IRLibRData.h>
#include <IRLibTimer.h>
#include <TAH.h>
TAH myTAH;
int mode, joyX, joyY, dPad, Buttonpadtag;
char val; // Store Value of Buttonpadtag
char mem = ' '; // Store Value of Buttonpadtag till getting new Value
void setup()
{
Keyboard.begin();
Mouse.begin();
Keyboard.releaseAll();
Serial.begin(9600);
myTAH.begin(9600);
myTAH.enterCommandMode();
myTAH.setName("Play");
myTAH.setWorkRole(SLAVE);
myTAH.setAuth(OPEN);
myTAH.setWorkMode(REMOTE_CONTROL);
myTAH.setiBeaconMode(ON);
myTAH.exitCommandMode();
}
void loop()
{
// if there's any serial available, read it:
if (myTAH.available())
{
///// Parsing Value From Left Controller
mode = myTAH.parseInt();
joyX = myTAH.parseInt();
joyY = myTAH.parseInt();
dPad = myTAH.parseInt();
Buttonpadtag = myTAH.parseInt();
// joystick value mapping
joyX = map(joyX, -128,128, 0, 255);
joyY = map(joyY, 128, -128, 0, 255);
// look for the newline. That's the end of your
// sentence:
if (myTAH.read() == 'P')
{
if(mode == 0) // App is in PS mode
{
// Always be getting fresh data
dataForController_t SonycontrollerData = SonygetControllerData();
// Then send out the data over the USB connection
// Joystick.set(controllerData) also works.
Joystick.setControllerData(SonycontrollerData);
}
else if(mode == 1) // App is in Computer Joystick Mode
{
///////// Button Pad mapped to User Defined Computer Keys ////////////
if(Buttonpadtag >> 0 && Buttonpadtag != 5 && Buttonpadtag != 6)
{
val = Buttonpadtag;
mem = val;
Keyboard.press(val);
}
else
{
val = mem;
Keyboard.release(val);
}
if(Buttonpadtag == 5)
{
Keyboard.press(KEY_ESC);
}
else
{
Keyboard.release(KEY_ESC);
}
if(Buttonpadtag == 6)
{
Mouse.press(MOUSE_LEFT);
}
else
{
Mouse.release(MOUSE_LEFT);
}
//////////////////////////////////////////////////////////////////////
///////// dPad mapped to Computer Arrow Keys ////////////
if(dPad == 2 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
if(dPad == 8 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
if(dPad == 6 )
{
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
if(dPad == 4 )
{
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
}
if(dPad == 3 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
if(dPad == 9 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
if(dPad == 7 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
}
if(dPad == 1 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
}
if(dPad == 5)
{
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}
//////////////////////////////////////////////////////////////////////
}
//print the three numbers in one string as hexadecimal:
Serial.print(mode, DEC);
Serial.print(",");
Serial.print(joyX, DEC);
Serial.print(",");
Serial.print(joyY, DEC);
Serial.print(",");
Serial.print(dPad, DEC);
Serial.print(",");
Serial.println(Buttonpadtag, DEC);
Serial.flush();
}
}
}
Я пошел после этого кода на Git, затем настроил все на работу, как предписано, Это дает сломанной функции обратного вызова в компиляторе ошибку (dataForController_t
) для выделения памяти, которое предварительно предназначен для других данных. Разрезанный текст комментария должен объяснить это лучше, оставленный там разработчиком. Хотя ресурсы моего сообщества далеко не многие, я работаю над этим, когда дело доходит до кодирования. Хотя мне нужно больше помощи, чем я могу оказать, я не думаю, что я готов написать код.
Из других примеров кода функции и методов в этом наброске я добавил период между две функции, чтобы увидеть, могу ли я приложить руку к этому. Альтернативных результатов не предоставлено.
///////////// Play Station Data Structure /////////////
Первоначально записано как dataForController_t SonygetControllerData(void)
ошибка из-за синтаксиса: dataForController_t SonygetControllerData (void) после «error» dataForController_t 'не называет тип
когда промежуточный период вставлен, как показано, ошибка сохраняется. Не пробовал больше ничего.
dataForController_t.SonygetControllerData(void)
{
// Set up a place for our controller data
// Use the getBlankDataForController() function, since
// just declaring a fresh dataForController_t tends
// to get you one filled with junk from other, random
// values that were in those memory locations before
dataForController_t controllerData = getBlankDataForController();
// Since our buttons are all held high and
// pulled low when pressed, we use the "!"
// operator to invert the readings from the pins
if(Buttonpadtag == 1)
{
controllerData.crossOn = 1;
Serial.println(" Cross");
}
else if(Buttonpadtag == 2)
{
controllerData.circleOn = 1;
Serial.println(" Circle");
}
else if(Buttonpadtag == 3)
{
controllerData.squareOn = 1;
Serial.println(" Square");
}
else if(Buttonpadtag == 4 )
{
controllerData.triangleOn = 1;
Serial.println(" Triangle");
}
else if(Buttonpadtag == 7 )
{
controllerData.selectOn = 1;
Serial.println(" Select");
}
else if(Buttonpadtag == 8 )
{
controllerData.startOn = 1;
Serial.println(" Start");
}
// Set the analog sticks
controllerData.leftStickX = joyX;
controllerData.leftStickY = joyY;
// And return the data!
return controllerData;
}