• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Arduino + USB Host Shield + Gamepad + Odchudzenie działającego kodu

0 głosów
279 wizyt
pytanie zadane 13 października 2020 w C i C++ przez Miki Bywalec (2,480 p.)
zamknięte 17 października 2020 przez Miki

Witam.

Na wstępie uprzedzam, że jestem totalnie zielony z programowania (po obejrzeniu może ze 100 filmów na YT dalej mało co kumam z C i C++) i trzeba do mnie pisać "drukowanymi" abym cokolwiek zrozumiał, ale do rzeczy.

  1. Podłączyłem Arduino do Usb Host Shield aby móc nim sterować za pomocą Gamepada
  2. Ściągnąłem gotowe biblioteki i kod z którego na chybił trafił wywaliłem zbędne według mnie rzeczy i coś tam pozmieniałem bo średnio to działało
  3. Kod ku mojemu zdziwieniu teraz dobrze działa surprise i mógłbym to tak zostawić ale ja lubię utrudniać sobie życie

Chciałbym zrozumieć co w tym kodzie się dzieje i czy można go jakoś odchudzić lub przerobić (same funkcje, a nie jakieś klasy, struktury i inne cuda wianki) aby totalny laik jak ja zrozumiał jak to działa. Przydał by się jakiś komentarz lub nowy prostszy kod. Za każdą okazaną pomoc z góry dziękuję wink

#include <hiduniversal.h>

USB Usb;

struct GamePadEventData{
  uint16_t b1:8, b2:8, b3:8, lx:8, ly:8, rx:8, ry:8;
};

class GamePadEvents{
  public:
    virtual void OnGamePadChanged(const GamePadEventData *evt);
};

#define RPT_GAMEPAD_LEN sizeof(GamePadEventData)/sizeof(uint8_t)

class GamePadReportParser : public HIDReportParser{
  GamePadEvents *padEvents;

  uint8_t oldPad[RPT_GAMEPAD_LEN];

  public:
    GamePadReportParser(GamePadEvents *evt);

  virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};

GamePadReportParser::GamePadReportParser(GamePadEvents *evt) : padEvents(evt){}

void GamePadReportParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf){
  bool match = true;

  for (uint8_t i=0; i<RPT_GAMEPAD_LEN; i++){
    if(buf[i] != oldPad[i]){
      match = false;
      break;
    }
  }
  if(!match && padEvents){
    padEvents->OnGamePadChanged((const GamePadEventData*)buf);

    for (uint8_t i=0; i<RPT_GAMEPAD_LEN; i++) oldPad[i] = buf[i];
  }
}

void GamePadEvents::OnGamePadChanged(const GamePadEventData *evt){
       if(evt->b1 == 64)   Serial.println("LT");
  else if(evt->b1 == 16)   Serial.println("LB");
  else if(evt->b1 == 128)  Serial.println("RT");
  else if(evt->b1 == 32)   Serial.println("RB");
  
  else if(evt->b1 == 1)    Serial.println("Y");
  else if(evt->b1 == 2)    Serial.println("B");
  else if(evt->b1 == 4)    Serial.println("A");
  else if(evt->b1 == 8)    Serial.println("X");

  else if(evt->b3 == 0)    Serial.println("UP");
  else if(evt->b3 == 2)    Serial.println("RIGHTS");
  else if(evt->b3 == 4)    Serial.println("DOWN");
  else if(evt->b3 == 6)    Serial.println("LEFT");
  
  else if(evt->b2 == 1)    Serial.println("SELECT");
  else if(evt->b2 == 2)    Serial.println("START");
  else if(evt->b2 == 16)   Serial.println("HOME");

  else if(evt->b2 == 4)    Serial.println("L");
  else if(evt->b2 == 8)    Serial.println("R");

  else if(evt->ly < 128)   Serial.println("L_UP");
  else if(evt->ly > 128)   Serial.println("L_DOWN");
  else if(evt->lx < 128)   Serial.println("L_LEFT");
  else if(evt->lx > 128)   Serial.println("L_RIGHTS");

  else if(evt->ry < 128)   Serial.println("R_UP");
  else if(evt->ry > 128)   Serial.println("R_DOWN");
  else if(evt->rx < 128)   Serial.println("R_LEFT");
  else if(evt->rx > 128)   Serial.println("R_RIGHTS");
}

HIDUniversal Hid(&Usb);
GamePadEvents padEvents;
GamePadReportParser Pad(&padEvents);

void setup(){
  Serial.begin(115200);  
  Serial.println("Start");  
  
  if(Usb.Init() == -1) Serial.println("OSC did not start");
  
  delay(200);
  
  if(!Hid.SetReportParser(0, &Pad)) ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1);
}

void loop(){
  Usb.Task();
}

EDIT: poprawiłem kod i zredukowałem go do jednej Biblioteki

komentarz zamknięcia: Rozwiązałem większość problemów
komentarz 17 października 2020 przez Miki Bywalec (2,480 p.)

Ogarnąłem o co chodzi w tym kodzie ale i tak nie wiem czy da się go bardziej odchudzić czy tu już jest "ideał" wink

Podobne pytania

0 głosów
1 odpowiedź 292 wizyt
0 głosów
0 odpowiedzi 401 wizyt
pytanie zadane 14 stycznia 2022 w Sprzęt komputerowy przez alpha.netrunner Mądrala (5,030 p.)
0 głosów
0 odpowiedzi 565 wizyt
pytanie zadane 27 września 2016 w Mikrokontrolery przez Noroelle Saeth Nowicjusz (160 p.)

93,732 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...