etrobocon2019 feat.KatLab  ece30a9a007fff7d3ad48592c0d09a74643377bb
Controller.cpp
[詳解]
1 
2 #include "Controller.h"
3 
5  : touchSensor(PORT_1),
6  colorSensor(PORT_3),
7  gyroSensor(PORT_4),
8  liftMotor(PORT_A),
9  rightWheel(PORT_B),
10  leftWheel(PORT_C),
11  tailMotor(PORT_D)
12 {
13  colorSensor.getRawColor(rgb);
14 }
15 
17 {
18  ev3_speaker_set_volume(volume);
19 }
20 
22 {
23  ev3_speaker_play_tone(NOTE_FS6, duration);
24 }
25 
27 {
28  ev3_led_set_color(LED_ORANGE);
29 }
30 
32 {
33  ev3_led_set_color(LED_GREEN);
34 }
35 
37 {
38  return ev3_button_is_pressed(BACK_BUTTON);
39 }
40 
42 {
43  return ev3_button_is_pressed(ENTER_BUTTON);
44 }
45 
47 {
48  return ev3_button_is_pressed(UP_BUTTON);
49 }
50 
52 {
53  return ev3_button_is_pressed(DOWN_BUTTON);
54 }
55 
57 {
58  return ev3_button_is_pressed(RIGHT_BUTTON);
59 }
60 
62 {
63  return ev3_button_is_pressed(LEFT_BUTTON);
64 }
65 
67 {
68  return ev3_battery_voltage_mV();
69 }
70 
72 {
73  colorSensor.getRawColor(rgb);
74  int luminance = 0.298912 * rgb.r + 0.586611 * rgb.g + 0.114478 * rgb.b;
75  return luminance;
76 }
77 
78 void Controller::getRawColor(int& r, int& g, int& b)
79 {
80  colorSensor.getRawColor(rgb);
81  r = rgb.r;
82  g = rgb.g;
83  b = rgb.b;
84 }
85 
87 {
88  if(status.value <= 33.5294){
89  if(status.value <= 18.4314){
90  return Color::black;
91  }else {
92  if(status.hue <= 159.5357){
93  if(status.hue <= 83.739){
94  if(status.hue <= 40.8904){
95  return Color::black;
96  }else {
97  return Color::yellow;
98  }
99  }else {
100  return Color::green;
101  }
102  }else {
103  if(status.value <= 32.9412){
104  return Color::blue;
105  }else {
106  if(status.hue <= 299.6104){
107  return Color::black;
108  }else {
109  return Color::red;
110  }
111  }
112  }
113  }
114  }else {
115  if(status.value <= 45.2941){
116  if(status.hue <= 263.0811){
117  if(status.hue <= 32.8235){
118  return Color::red;
119  }else {
120  if(status.hue <= 76.7547){
121  if(status.hue <= 44.8367){
122  if(status.hue <= 40.5263){
123  return Color::yellow;
124  }else {
125  return Color::red;
126  }
127  }else {
128  return Color::yellow;
129  }
130  }else {
131  if(status.value <= 40.1961){
132  if(status.value <= 35.4902){
133  return Color::green;
134  }else {
135  return Color::blue;
136  }
137  }else {
138  return Color::white;
139  }
140  }
141  }
142  }else {
143  return Color::red;
144  }
145  }else {
146  if(status.hue <= 283.6016){
147  if(status.hue <= 99.2199){
148  if(status.value <= 51.1765){
149  return Color::yellow;
150  }else {
151  return Color::red;
152  }
153  }else {
154  return Color::white;
155  }
156  }else {
157  return Color::red;
158  }
159  }
160  }
161 }
162 
163 void Controller::tslpTsk(int time)
164 {
165  tslp_tsk(time);
166 }
167 
168 void Controller::lcdFillRect(int x, int y, int h)
169 {
170  ev3_lcd_fill_rect(x, y, EV3_LCD_WIDTH, h, EV3_LCD_WHITE);
171 }
172 
173 void Controller::lcdDrawString(const char* str, int x, int y)
174 {
175  ev3_lcd_draw_string(str, x, y);
176 }
177 
179 {
180  ev3_lcd_set_font(EV3_FONT_SMALL);
181 }
182 
184 {
185  return leftWheel.getCount();
186 }
187 
189 {
190  return rightWheel.getCount();
191 }
192 
193 int Controller::suppressPwmValue(const int value)
194 {
195  if(value > MOTOR_PWM_MAX) {
196  return MOTOR_PWM_MAX;
197  } else if(value < MOTOR_PWM_MIN) {
198  return MOTOR_PWM_MIN;
199  }
200  return value;
201 }
202 
203 void Controller::setLeftMotorPwm(const int pwm)
204 {
205  leftWheel.setPWM(suppressPwmValue(pwm));
206 }
207 
208 void Controller::setRightMotorPwm(const int pwm)
209 {
210  rightWheel.setPWM(suppressPwmValue(pwm));
211 }
212 
213 void Controller::convertHsv(int& r, int& g, int& b)
214 {
215  // r,g,bの最大値を求める
216  double max = r;
217  if(max < g) max = g;
218  if(max < b) max = b;
219 
220  // r,g,bの最小値を求める
221  double min = r;
222  if(min > g) min = g;
223  if(min > b) min = b;
224 
225  // 色相(hue)を求める
226 
227  // 3つが同値の時は色相(hue)は0
228  if(r == g && r == b) hsv.hue = 0;
229 
230  // rが最大値の場合
231  else if(max == r) {
232  // 0除算を防ぐ処理
233  if(max - min != 0) max += 1;
234  hsv.hue = 60 * ((g - b) / (max - min));
235  }
236  // gが最大値の場合
237  else if(max == g) {
238  // 0除算を防ぐ処理
239  if(max - min != 0) max += 1;
240  hsv.hue = 60 * ((b - r) / (max - min)) + 120;
241  }
242  // bが最大値の場合
243  else if(max == b) {
244  // 0除算を防ぐ処理
245  if(max - min != 0) max += 1;
246  hsv.hue = 60 * ((r - g) / (max - min)) + 240;
247  }
248  //求められた色彩(hue)がマイナス値だった場合は360を加算して0~360の範囲に収める
249  if(hsv.hue < 0) hsv.hue += 360;
250 
251  // 0除算を防ぐ処理
252  if(max - min != 0) max += 1;
253 
254  // 彩度(saturation)を求める
255  hsv.saturation = (max - min) / max * 100;
256 
257  // 明度(value)を求める
258  hsv.value = max / 255 * 100;
259 }
260 
262 {
263  return hsv;
264 } // hsv値を返す
265 
267 {
268  leftWheel.reset();
269  rightWheel.reset();
270 }
271 
273 {
274  leftWheel.stop();
275  rightWheel.stop();
276 }
277 
279 {
280  int angle = gyroSensor.getAngle();
281  //角度を[0-360]の範囲で表す,
282  //右手系(反時計回り)が正である
283  return Controller::limitAngle(angle);
284 }
285 
287 {
288  angle = angle % 360;
289  if(angle < 0) {
290  angle = 360 + angle;
291  angle = limitAngle(angle);
292  }
293  return angle;
294 }
int getRightMotorCount()
Definition: Controller.cpp:188
void stopMotor()
Definition: Controller.cpp:272
static constexpr int MOTOR_PWM_MAX
Definition: Controller.h:44
double hue
Definition: Controller.h:25
int getAngleOfRotation()
Definition: Controller.cpp:278
GyroSensor gyroSensor
Definition: Controller.h:42
bool buttonIsPressedBack()
Definition: Controller.cpp:36
bool buttonIsPressedLeft()
Definition: Controller.cpp:61
bool buttonIsPressedRight()
Definition: Controller.cpp:56
double saturation
Definition: Controller.h:27
static void speakerPlayToneFS6(int duration)
Definition: Controller.cpp:21
void setLeftMotorPwm(const int pwm)
Definition: Controller.cpp:203
int getLeftMotorCount()
Definition: Controller.cpp:183
Color hsvToColor(const HsvStatus &status)
Definition: Controller.cpp:86
void ledSetColorOrange()
Definition: Controller.cpp:26
static float getBatteryVoltage()
Definition: Controller.cpp:66
static void lcdDrawString(const char *str, int x, int y)
Definition: Controller.cpp:173
int getBrightness()
Definition: Controller.cpp:71
void convertHsv(int &r, int &g, int &b)
Definition: Controller.cpp:213
void setRightMotorPwm(const int pwm)
Definition: Controller.cpp:208
void resetMotorCount()
Definition: Controller.cpp:266
static void tslpTsk(int time)
Definition: Controller.cpp:163
void ledSetColorGreen()
Definition: Controller.cpp:31
bool buttonIsPressedEnter()
Definition: Controller.cpp:41
bool buttonIsPressedUp()
Definition: Controller.cpp:46
double value
Definition: Controller.h:29
ColorSensor colorSensor
Definition: Controller.h:40
static void lcdSetFont()
Definition: Controller.cpp:178
bool buttonIsPressedDown()
Definition: Controller.cpp:51
static void lcdFillRect(int x, int y, int h)
Definition: Controller.cpp:168
int limitAngle(int angle)
Definition: Controller.cpp:286
void getRawColor(int &r, int &g, int &b)
Definition: Controller.cpp:78
HsvStatus getHsv() const
Definition: Controller.cpp:261
Color
Definition: Controller.h:32
static constexpr int MOTOR_PWM_MIN
Definition: Controller.h:46
void speakerSetVolume(int volume)
Definition: Controller.cpp:16