source: pacpussensors/trunk/Wifibot/ps3remote.cpp@ 21

Last change on this file since 21 was 21, checked in by phudelai, 11 years ago

New component for the wifibot and the dualshock 3

File size: 3.6 KB
Line 
1/*********************************************************************
2// created: 2012/03/01 - 14:06
3// filename: PS3remote.cpp
4//
5// author: Pierre Hudelaine
6// Copyright Heudiasyc UMR UTC/CNRS 7253
7//
8// version: $Id: $
9//
10// purpose: Read the dualshock 3 button using bluetooth
11//
12*********************************************************************/
13
14#include "ps3remote.h"
15
16using namespace pacpus;
17
18
19PS3remote::PS3remote()
20{
21 quit = 0;
22 b = NULL;
23 shmem = new ShMem("dualshock", sizeof(struct dualshockButtons_s));
24}
25
26
27PS3remote::PS3remote(PacpusSocket * socket)
28{
29 quit = 0;
30 b = NULL;
31 shmem = new ShMem("dualshock", sizeof(struct dualshockButtons_s));
32 socket_ = socket;
33}
34
35
36PS3remote::~PS3remote()
37{
38
39}
40
41
42void PS3remote::sendCmd(uint16_t Ls, uint16_t Rs, int leftF, int rightF)
43{
44 float right, left;
45 static char lastLeft = 1;
46 static char lastRight = 1;
47 char buf[5] = {0};
48 buf[1] = leftF;
49 buf[3] = rightF;
50
51 left = ((float)Ls / 127) * 100;
52 right = ((float)Rs / 127) * 100;
53 if(left > 100.0)
54 left = 100.0;
55 if(right > 100.0)
56 right = 100.0;
57 buf[0] = (char)left + 1;
58 buf[2] = (char)right + 1;
59 if(buf[0] != lastLeft || buf[2] != lastRight) {
60 fprintf(stderr, "left = %c%d right = %c%d\n", buf[1] == 1 ? '+' : '-', buf[0], buf[3] == 1 ? '+' : '-', buf[2]);
61 socket_->sendDatagrams(QByteArray(buf));
62 }
63
64
65 lastLeft = buf[0];
66 lastRight = buf[2];
67}
68
69
70void PS3remote::mode2()
71{
72 uint16_t leftPWM = b->buttons.stick.leftStick_y;
73 uint16_t rightPWM = b->buttons.stick.rightStick_y;
74 int leftF = 1, rightF = 1;
75
76 if(leftPWM < 135 && leftPWM > 120)
77 leftPWM = 0;
78 else {
79 if(leftPWM > 128) {
80 leftPWM -= 128;
81 leftF = -1;
82 }
83 else
84 leftPWM = 128 - leftPWM;
85 }
86 if(rightPWM < 135 && rightPWM > 120)
87 rightPWM = 0;
88 else {
89 if(rightPWM > 128) {
90 rightF = -1;
91 rightPWM -= 128;
92 }
93 else
94 rightPWM = 128 - rightPWM;
95 }
96 if(leftPWM > 127)
97 leftPWM = 126;
98 if(rightPWM > 127)
99 rightPWM = 126;
100 sendCmd(leftPWM, rightPWM, leftF, rightF);
101}
102
103
104void PS3remote::mode1()
105{
106 uint16_t speed = b->buttons.stick.leftStick_y;
107 float x = (float)b->buttons.stick.rightStick_x;
108 int leftF = 1, rightF = 1;
109 if(speed < 140 && speed > 115) {
110 if(x > 140) {
111 x = x - 128;
112 rightF = -(leftF = 1);
113 }
114 else if (x < 115) {
115 x = 128 - x;
116 leftF = -(rightF = 1);
117 }
118 else
119 x = 0;
120 sendCmd(x, x, leftF, rightF);
121 }
122 else {
123 if(speed > 128) {
124 rightF = leftF = -1;
125 speed -= 128;
126 }
127 else
128 speed = 128 - speed;
129 float right = 1.0 - (x > 140 ? 0.0 : ((128.0 - x) / 128.0));
130 float left = 1.0 - (x < 115 ? 0.0 : ((x - 128.0) / 128.0));
131 sendCmd(right * speed, left * speed, leftF, rightF);
132 }
133}
134
135
136void PS3remote::checkMode()
137{
138 static int lastState = 0;
139 static int mode = 1;
140
141 if(b->buttons.digital.select) {
142 if(!lastState) {
143 mode = mode == 1 ? 2 : 1;
144 // TODO later
145 //blueshock_setLeds(0, mode);
146 lastState = 1;
147 }
148 }
149 else
150 lastState = 0;
151
152 if (mode == 1)
153 mode1();
154 else
155 mode2();
156}
157
158
159void PS3remote::run()
160{
161 while(!quit) {
162 shmem->wait();
163 b = (struct dualshockButtons_s *)shmem->read();
164
165 checkMode();
166
167 if(!b->available)
168 std::cerr << "Waiting for remote...\n";
169 }
170}
171
172
173void PS3remote::stop()
174{
175 quit = 1;
176}
Note: See TracBrowser for help on using the repository browser.