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.
- Podłączyłem Arduino do Usb Host Shield aby móc nim sterować za pomocą Gamepada
- Ś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
- Kod ku mojemu zdziwieniu teraz dobrze działa 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ę
#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