2 #include "includes/PS4Controller.hpp" 3 #include "../V2V/includes/V2VService.hpp" 5 int main(
int argc,
char** argv) {
7 auto commandlineArguments = cluon::getCommandlineArguments(argc, argv);
8 if (0 == commandlineArguments.count(
"dev") || 0 == commandlineArguments.count(
"freq") ||
9 0 == commandlineArguments.count(
"cid")) {
10 std::cerr << argv[0] <<
" reads the PS4Controller Wireless Controller inputs and sends it to the car's components" 12 std::cerr <<
"Usage: " << argv[0] <<
" --dev=<path Controller> --freq=<int Frequency> --cid=<OD4Session Session>" 14 std::cerr <<
"Example: " << argv[0] <<
" --dev=/dev/input/js0 --freq=100 --cid=200" << std::endl;
18 const std::string DEV = commandlineArguments[
"dev"];
19 const uint16_t FREQ = (uint16_t) std::stoi(commandlineArguments[
"freq"]);
20 const uint16_t CID = (uint16_t) std::stoi(commandlineArguments[
"cid"]);
22 const float m_OFFSET = std::stof(commandlineArguments[
"offset"]);
23 const uint16_t m_MAX_STEERING_ANGLE_LEFT = (uint16_t) std::stoi(commandlineArguments[
"leftAngle"]);
24 const uint16_t m_MAX_STEERING_ANGLE_RIGHT = (uint16_t) std::stoi(commandlineArguments[
"rightAngle"]);
26 cluon::OD4Session od4(CID, [](cluon::data::Envelope ) noexcept {});
27 auto atFrequency{[&od4, &DEV, &FREQ, &CID, &m_MAX_STEERING_ANGLE_LEFT, &m_MAX_STEERING_ANGLE_RIGHT,
29 FILE* file = fopen(DEV.c_str(),
"rb");
30 if (file !=
nullptr) {
33 if (fread(event,
sizeof(
PS4Event), 1, file)) {
34 if ((event->type &0x0F) == 1) {
35 sendButtonPressed(findButton(event), &od4);
37 else if ((event->type &0x0F) == 2) {
40 steeringReading.groundSteering(m_OFFSET);
42 if (event->data < 0) {
43 value =
event->data / MIN_AXES_VALUE * m_MAX_STEERING_ANGLE_LEFT *
44 static_cast<float>(M_PI) / 180.0f + m_OFFSET;
46 steeringReading.groundSteering(value);
48 else if (event->data >= 0) {
49 value =
event->data / MIN_AXES_VALUE * m_MAX_STEERING_ANGLE_RIGHT *
50 static_cast<float>(M_PI) / 180.0f + m_OFFSET;
52 steeringReading.groundSteering(value);
55 od4.send(steeringReading);
56 std::cout <<
"Sending Angle: " << steeringReading.groundSteering() << std::endl;
64 pedalPositionReading.position(value);
66 value =
event->data / MIN_AXES_VALUE * m_MAX_ACCELERATION;
68 pedalPositionReading.position(value);
70 else if (event->data >= 0) {
71 value =
event->data / MAX_AXES_VALUE * m_MAX_DECELERATION;
73 pedalPositionReading.position(value);
75 od4.send(pedalPositionReading);
76 std::cout <<
"Sending speed: " << value << std::endl;
86 else if (ferror(file)) {
87 std::cout <<
"Error: FREAD failed with error number'" << errno << std::endl;
89 else if (feof(file)) {
90 std::cout <<
"Error: EOF reached!" << std::endl;
96 std::cout <<
"Error: input file at '" << DEV <<
"' cannot be accessed!" << std::endl;
100 od4.timeTrigger(FREQ, atFrequency);
105 uint16_t findButton(
PS4Event* event) {
108 if (event->data == 1) {
109 std::cout <<
"Square pressed." << std::endl;
114 if (event->data == 1) {
119 if (event->data == 1) {
124 if (event->data == 1) {
129 if (event->data == 1) {
134 if (event->data == 1) {
139 if (event->data == 1) {
144 if (event->data == 1) {
149 if (event->data == 1) {
154 if (event->data == 1) {
159 if (event->data == 1) {
164 if (event->data == 1) {
169 if (event->data == 1) {
178 void sendButtonPressed(uint16_t button, cluon::OD4Session* od4Session) {
179 buttonPressed.buttonNumber(button);
180 od4Session->send(buttonPressed);
183 void roundValue(
float* number) {
184 *number = roundf(*number * 100) / 100.0f;