• 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

Object Storage Arubacloud
0 głosów
103 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ź 142 wizyt
0 głosów
0 odpowiedzi 245 wizyt
pytanie zadane 14 stycznia 2022 w Sprzęt komputerowy przez alpha.netrunner Gaduła (4,690 p.)
0 głosów
0 odpowiedzi 477 wizyt
pytanie zadane 27 września 2016 w Mikrokontrolery przez Noroelle Saeth Nowicjusz (160 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...