@@ -20,15 +20,19 @@ BraccioClass::BraccioClass()
2020, PD_UFP{PD_LOG_LEVEL_VERBOSE}
2121, expander{TCA6424A_ADDRESS_ADDR_HIGH}
2222, bl{}
23- , _display_thread{}
23+ , _display_thd{}
24+ , _is_ping_allowed{true }
25+ , _is_motor_connected{false }
26+ , _motors_connected_mtx{}
27+ , _motors_connected_thd{}
2428, runTime{SLOW}
2529, _customMenu{nullptr }
2630{
2731
2832}
2933
30- bool BraccioClass::begin (voidFuncPtr customMenu) {
31-
34+ bool BraccioClass::begin (voidFuncPtr customMenu)
35+ {
3236 Wire.begin ();
3337 Serial.begin (115200 );
3438
@@ -81,6 +85,11 @@ bool BraccioClass::begin(voidFuncPtr customMenu) {
8185 expander.setPinDirection (18 , 0 ); // P22 = 8 * 2 + 2
8286 expander.writePin (18 , 0 ); // reset LCD
8387 expander.writePin (18 , 1 ); // LCD out of reset
88+
89+ /* Set all motor status LEDs to red. */
90+ for (int id = SmartServoClass::MIN_MOTOR_ID; id <= SmartServoClass::MAX_MOTOR_ID; id++) {
91+ setRed (id);
92+ }
8493 i2c_mutex.unlock ();
8594
8695 pinMode (BTN_LEFT, INPUT_PULLUP);
@@ -122,7 +131,7 @@ bool BraccioClass::begin(voidFuncPtr customMenu) {
122131 p_objGroup = lv_group_create ();
123132 lv_group_set_default (p_objGroup);
124133
125- _display_thread .start (mbed::callback (this , &BraccioClass::display_thread ));
134+ _display_thd .start (mbed::callback (this , &BraccioClass::display_thread_func ));
126135
127136 auto check_power_func = [this ]()
128137 {
@@ -156,20 +165,40 @@ bool BraccioClass::begin(voidFuncPtr customMenu) {
156165 servos.begin ();
157166 servos.setPositionMode (PositionMode::IMMEDIATE);
158167
159- #ifdef __MBED__
160- static rtos::Thread connected_th;
161- connected_th.start (mbed::callback (this , &BraccioClass::motors_connected_thread));
162- #endif
168+ _motors_connected_thd.start (mbed::callback (this , &BraccioClass::motorConnectedThreadFunc));
163169
164170 return true ;
165171}
166172
173+ void BraccioClass::pingOn ()
174+ {
175+ mbed::ScopedLock<rtos::Mutex> lock (_motors_connected_mtx);
176+ _is_ping_allowed = true ;
177+ }
178+
179+ void BraccioClass::pingOff ()
180+ {
181+ mbed::ScopedLock<rtos::Mutex> lock (_motors_connected_mtx);
182+ _is_ping_allowed = false ;
183+ }
184+
185+ bool BraccioClass::connected (int const id)
186+ {
187+ mbed::ScopedLock<rtos::Mutex> lock (_motors_connected_mtx);
188+ return _is_motor_connected[SmartServoClass::idToArrayIndex (id)];
189+ }
190+
167191MotorsWrapper BraccioClass::move (int const id)
168192{
169193 MotorsWrapper wrapper (servos, id);
170194 return wrapper;
171195}
172196
197+ MotorsWrapper BraccioClass::get (int const id)
198+ {
199+ return move (id);
200+ }
201+
173202void BraccioClass::moveTo (float const a1, float const a2, float const a3, float const a4, float const a5, float const a6)
174203{
175204 servos.setPositionMode (PositionMode::SYNC);
@@ -231,7 +260,7 @@ void BraccioClass::pd_thread() {
231260 }
232261}
233262
234- void BraccioClass::display_thread ()
263+ void BraccioClass::display_thread_func ()
235264{
236265 for (;;)
237266 {
@@ -285,21 +314,36 @@ void BraccioClass::defaultMenu()
285314 lv_obj_set_pos (label1, 0 , 0 );
286315}
287316
288- void BraccioClass::motors_connected_thread () {
289- while (1 ) {
290- if (ping_allowed) {
291- for (int i = 1 ; i < 7 ; i++) {
292- _connected[i] = (servos.ping (i) == 0 );
293- // Serial.print(String(i) + ": ");
294- // Serial.println(_connected[i]);
317+ bool BraccioClass::isPingAllowed ()
318+ {
319+ mbed::ScopedLock<rtos::Mutex> lock (_motors_connected_mtx);
320+ return _is_ping_allowed;
321+ }
322+
323+ void BraccioClass::setMotorConnectionStatus (int const id, bool const is_connected)
324+ {
325+ mbed::ScopedLock<rtos::Mutex> lock (_motors_connected_mtx);
326+ _is_motor_connected[SmartServoClass::idToArrayIndex (id)] = is_connected;
327+ }
328+
329+ void BraccioClass::motorConnectedThreadFunc ()
330+ {
331+ for (;;)
332+ {
333+ if (isPingAllowed ())
334+ {
335+ for (int id = SmartServoClass::MIN_MOTOR_ID; id <= SmartServoClass::MAX_MOTOR_ID; id++)
336+ {
337+ bool const is_connected = (servos.ping (id) == 0 );
338+ setMotorConnectionStatus (id, is_connected);
295339 }
340+
296341 i2c_mutex.lock ();
297- for (int i = 1 ; i < 7 ; i++) {
298- if (_connected[i]) {
299- setGreen (i);
300- } else {
301- setRed (i);
302- }
342+ for (int id = SmartServoClass::MIN_MOTOR_ID; id <= SmartServoClass::MAX_MOTOR_ID; id++) {
343+ if (connected (id))
344+ setGreen (id);
345+ else
346+ setRed (id);
303347 }
304348 i2c_mutex.unlock ();
305349 }
0 commit comments