-
Notifications
You must be signed in to change notification settings - Fork 87
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add gamepad in g1_ankle_swing_example
- Loading branch information
matheecs
committed
Oct 31, 2024
1 parent
69d1072
commit f1f1d85
Showing
2 changed files
with
176 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
#pragma once | ||
|
||
#include <cmath> | ||
|
||
namespace unitree::common | ||
{ | ||
|
||
// bytecode mapping for raw joystick data | ||
// 16b | ||
typedef union | ||
{ | ||
struct | ||
{ | ||
uint8_t R1 : 1; | ||
uint8_t L1 : 1; | ||
uint8_t start : 1; | ||
uint8_t select : 1; | ||
uint8_t R2 : 1; | ||
uint8_t L2 : 1; | ||
uint8_t F1 : 1; | ||
uint8_t F2 : 1; | ||
uint8_t A : 1; | ||
uint8_t B : 1; | ||
uint8_t X : 1; | ||
uint8_t Y : 1; | ||
uint8_t up : 1; | ||
uint8_t right : 1; | ||
uint8_t down : 1; | ||
uint8_t left : 1; | ||
} components; | ||
uint16_t value; | ||
} xKeySwitchUnion; | ||
|
||
// 40 Byte (now used 24B) | ||
typedef struct | ||
{ | ||
uint8_t head[2]; | ||
xKeySwitchUnion btn; | ||
float lx; | ||
float rx; | ||
float ry; | ||
float L2; | ||
float ly; | ||
|
||
uint8_t idle[16]; | ||
} xRockerBtnDataStruct; | ||
|
||
typedef union | ||
{ | ||
xRockerBtnDataStruct RF_RX; | ||
uint8_t buff[40]; | ||
} REMOTE_DATA_RX; | ||
|
||
class Button | ||
{ | ||
public: | ||
Button() {} | ||
|
||
void update(bool state) | ||
{ | ||
on_press = state ? state != pressed : false; | ||
on_release = state ? false : state != pressed; | ||
pressed = state; | ||
} | ||
|
||
bool pressed = false; | ||
bool on_press = false; | ||
bool on_release = false; | ||
}; | ||
|
||
class Gamepad | ||
{ | ||
public: | ||
Gamepad() {} | ||
|
||
void update(xRockerBtnDataStruct &key_data) | ||
{ | ||
lx = lx * (1 - smooth) + (std::fabs(key_data.lx) < dead_zone ? 0.0 : key_data.lx) * smooth; | ||
rx = rx * (1 - smooth) + (std::fabs(key_data.rx) < dead_zone ? 0.0 : key_data.rx) * smooth; | ||
ry = ry * (1 - smooth) + (std::fabs(key_data.ry) < dead_zone ? 0.0 : key_data.ry) * smooth; | ||
l2 = l2 * (1 - smooth) + (std::fabs(key_data.L2) < dead_zone ? 0.0 : key_data.L2) * smooth; | ||
ly = ly * (1 - smooth) + (std::fabs(key_data.ly) < dead_zone ? 0.0 : key_data.ly) * smooth; | ||
|
||
R1.update(key_data.btn.components.R1); | ||
L1.update(key_data.btn.components.L1); | ||
start.update(key_data.btn.components.start); | ||
select.update(key_data.btn.components.select); | ||
R2.update(key_data.btn.components.R2); | ||
L2.update(key_data.btn.components.L2); | ||
F1.update(key_data.btn.components.F1); | ||
F2.update(key_data.btn.components.F2); | ||
A.update(key_data.btn.components.A); | ||
B.update(key_data.btn.components.B); | ||
X.update(key_data.btn.components.X); | ||
Y.update(key_data.btn.components.Y); | ||
up.update(key_data.btn.components.up); | ||
right.update(key_data.btn.components.right); | ||
down.update(key_data.btn.components.down); | ||
left.update(key_data.btn.components.left); | ||
} | ||
|
||
float lx = 0.; | ||
float rx = 0.; | ||
float ry = 0.; | ||
float l2 = 0.; | ||
float ly = 0.; | ||
|
||
float smooth = 0.03; | ||
float dead_zone = 0.01; | ||
|
||
Button R1; | ||
Button L1; | ||
Button start; | ||
Button select; | ||
Button R2; | ||
Button L2; | ||
Button F1; | ||
Button F2; | ||
Button A; | ||
Button B; | ||
Button X; | ||
Button Y; | ||
Button up; | ||
Button right; | ||
Button down; | ||
Button left; | ||
}; | ||
} // namespace unitree::common |