Библиотека / функции из TAH.h - в моем коде нет ответа - PullRequest
0 голосов
/ 25 апреля 2020
#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;
}

1 Ответ

0 голосов
/ 25 апреля 2020

Используемая вами библиотека является неполной версией (и WIP). Сначала скопируйте оригинальную библиотеку отсюда , там вы найдете отсутствующий IRxx.libs. Затем вы должны определить структуру dataForController_t самостоятельно, поэтому определите в в этом примере программу PS3 :

int16_t LeftjoyX;
int16_t LeftjoyY;
int16_t RightjoyX;
int16_t RightjoyY;
int16_t Buttonpadtag;

struct  dataForController_t {
  int16_t leftStickX;
  int16_t leftStickY;
  int16_t rightStickX;
  int16_t rightStickY;
  bool  dpadRightOn;
  bool dpadLeftOn;
  bool dpadUpOn;
  bool dpadDownOn;
  bool triangleOn;
  bool squareOn;
  bool circleOn;
  bool crossOn;
  bool l1On;
  bool l2On;
  bool r1On;
  bool r2On;
  bool selectOn;
 bool startOn ;
 bool homeOn ;
} controllerData;

закомментируйте строку

// Joystick.setControllerData (SonycontrollerData) и добавьте функцию

dataForController_t  getBlankDataForController() {
  // Has to be written WIP - JUST DUMMY DATA
  controllerData.leftStickX = 0;
  controllerData.leftStickY = 0;
  controllerData.rightStickX = 0;
  controllerData.rightStickY = 0;
  // And return the data!
  return controllerData;
}

Последняя должна быть заполнена всеми переменными из определенной структуры и установить их равными 0.
После компиляции демо. Я сомневаюсь, что он будет работать должным образом, так как lib - это наполовину законченное усилие, оставленное публике c 2015. Поэтому либо завершите sh сами, либо забудьте об этом.

...