@@ -108,15 +108,6 @@ void custom_main_menu()
108
108
Braccio.connectJoystickTo (btnm);
109
109
}
110
110
111
- /* *************************************************************************************
112
- * State
113
- **************************************************************************************/
114
-
115
- State * State::handle_OnZeroPosition ()
116
- {
117
- return new ZeroState ();
118
- }
119
-
120
111
/* *************************************************************************************
121
112
* IdleState
122
113
**************************************************************************************/
@@ -141,6 +132,11 @@ State * IdleState::handle_OnReplay()
141
132
return new ReplayState ();
142
133
}
143
134
135
+ State * IdleState::handle_OnZeroPosition ()
136
+ {
137
+ return new ZeroState ();
138
+ }
139
+
144
140
/* *************************************************************************************
145
141
* RecordState
146
142
**************************************************************************************/
@@ -150,8 +146,11 @@ void RecordState::onEnter()
150
146
btnm_map[0 ] = " STOP" ;
151
147
lv_btnmatrix_set_btn_ctrl (btnm, 0 , LV_BTNMATRIX_CTRL_CHECKED);
152
148
lv_btnmatrix_set_btn_ctrl (btnm, 1 , LV_BTNMATRIX_CTRL_DISABLED);
149
+ lv_btnmatrix_set_btn_ctrl (btnm, 2 , LV_BTNMATRIX_CTRL_DISABLED);
153
150
151
+ delay (100 );
154
152
Braccio.disengage ();
153
+ delay (100 );
155
154
sample_cnt = 0 ;
156
155
}
157
156
@@ -160,9 +159,12 @@ void RecordState::onExit()
160
159
btnm_map[0 ] = " RECORD" ;
161
160
lv_btnmatrix_clear_btn_ctrl (btnm, 0 , LV_BTNMATRIX_CTRL_CHECKED);
162
161
lv_btnmatrix_clear_btn_ctrl (btnm, 1 , LV_BTNMATRIX_CTRL_DISABLED);
162
+ lv_btnmatrix_clear_btn_ctrl (btnm, 2 , LV_BTNMATRIX_CTRL_DISABLED);
163
163
lv_label_set_text_fmt (counter, " Counter: %d" , 0 );
164
164
165
+ delay (100 );
165
166
Braccio.engage ();
167
+ delay (100 );
166
168
}
167
169
168
170
State * RecordState::handle_OnRecord ()
@@ -217,13 +219,15 @@ void ReplayState::onEnter()
217
219
btnm_map[2 ] = " STOP" ;
218
220
lv_btnmatrix_set_btn_ctrl (btnm, 0 , LV_BTNMATRIX_CTRL_DISABLED);
219
221
lv_btnmatrix_set_btn_ctrl (btnm, 1 , LV_BTNMATRIX_CTRL_CHECKED);
222
+ lv_btnmatrix_set_btn_ctrl (btnm, 2 , LV_BTNMATRIX_CTRL_DISABLED);
220
223
}
221
224
222
225
void ReplayState::onExit ()
223
226
{
224
227
btnm_map[2 ] = " REPLAY" ;
225
228
lv_btnmatrix_clear_btn_ctrl (btnm, 0 , LV_BTNMATRIX_CTRL_DISABLED);
226
229
lv_btnmatrix_clear_btn_ctrl (btnm, 1 , LV_BTNMATRIX_CTRL_CHECKED);
230
+ lv_btnmatrix_clear_btn_ctrl (btnm, 2 , LV_BTNMATRIX_CTRL_DISABLED);
227
231
lv_label_set_text_fmt (counter, " Counter: %d" , 0 );
228
232
}
229
233
@@ -267,10 +271,40 @@ void ZeroState::onEnter()
267
271
lv_btnmatrix_set_btn_ctrl (btnm, 1 , LV_BTNMATRIX_CTRL_DISABLED);
268
272
lv_btnmatrix_set_btn_ctrl (btnm, 2 , LV_BTNMATRIX_CTRL_CHECKED);
269
273
274
+ delay (100 );
270
275
Braccio.engage ();
271
276
delay (100 );
272
277
Braccio.moveTo (HOME_POS[0 ], HOME_POS[1 ], HOME_POS[2 ], HOME_POS[3 ], HOME_POS[4 ], HOME_POS[5 ]);
273
- delay (500 );
278
+
279
+ auto isInHomePos = []() -> bool
280
+ {
281
+ float current_angles[SmartServoClass::NUM_MOTORS] = {0 };
282
+ Braccio.positions (current_angles);
283
+
284
+ float total_angle_err = 0.0 ;
285
+ for (size_t i = 0 ; i < SmartServoClass::NUM_MOTORS; i++)
286
+ total_angle_err += fabs (current_angles[i] - HOME_POS[i]);
287
+
288
+ static float const TOTAL_EPSILON = 10 .0f ;
289
+ bool const is_in_home_pos = (total_angle_err < TOTAL_EPSILON);
290
+ return is_in_home_pos;
291
+ };
292
+ auto isTimeout = [](unsigned long const start) -> bool
293
+ {
294
+ /* Timeout of one second. */
295
+ auto const now = millis ();
296
+ if ((now - start) > 1000 )
297
+ return true ;
298
+ else
299
+ return false ;
300
+ };
301
+
302
+ /* Wait until we've returned to the home position
303
+ * with a timeout (i.e. we leave this function)
304
+ * after one second even if we can't fully reach
305
+ * the home position.
306
+ */
307
+ for (auto start = millis (); !isInHomePos () && !isTimeout (start); delay (100 )) { }
274
308
}
275
309
276
310
void ZeroState::onExit ()
0 commit comments