59 #include "rnr/rnrconfig.h" 81 static const char *SubSysName =
"Batteries";
97 } m_motors[LaeNumMotorsPerCtlr];
106 LaeKeyFront, LaeMotorCtlrAddrFront, LaeMotorCtlrIdFront,
true,
false,
107 { {LaeKeyLeftFront, LaeMotorLeft}, {LaeKeyRightFront, LaeMotorRight} }
111 LaeKeyRear, LaeMotorCtlrAddrRear, LaeMotorCtlrIdRear,
true,
false,
112 { {LaeKeyLeftRear, LaeMotorLeft}, {LaeKeyRightRear, LaeMotorRight} }
130 string strDevSymName(LaeDevMotorCtlrs);
132 int nBaudRate = LaeBaudRateMotorCtlrs;
136 printSubHdr(
"Initialize Motor Controller Interfaces");
145 printTestResult(FatalTag,
"%s: Motor controllers power enable.",
152 printTestResult(PassTag,
"%s: Enabled power to motor controllers.",
161 MotorCtlrEnable.
sync();
167 printTestResult(WarnTag,
168 "Motor controllers are already enabled - may be in usse by another " 172 else if( MotorCtlrEnable.
enable() )
174 printTestResult(PassTag,
"Motor controllers enabled.");
179 printTestResult(FatalTag,
"Motor controllers failed to be enabled.");
192 if( MotorCtlrCs.
open(LaeGpioMotorCtlrCs) < 0 )
194 printTestResult(FatalTag,
195 "Failed to open motor controllers chip select on GPIO pin %d: %s(%d).",
196 LaeGpioMotorCtlrCs, strerror(errno), errno);
201 printTestResult(PassTag,
202 "Open motor controllers chip select on GPIO pin %d.",
216 if( MotorCtlrComm.
open(strDevName, nBaudRate) < 0 )
218 printTestResult(FatalTag,
219 "%s: %s: Failed to open motor controllers comm at %d baud: %s(%d)",
220 SubSysName, strDevName.c_str(), nBaudRate, strerror(errno), errno);
225 printTestResult(PassTag,
226 "%s: Open motor controllers serial communication on %s@%d.",
227 SubSysName, strDevName.c_str(), nBaudRate);
241 nCtlr = LaeMotorCtlrIdFront;
243 new RoboClaw(MotorCtlrComm, LaeMotorCtlrAddrFront, LaeKeyFront);
244 MotorCtlr[nCtlr]->
setMotorDir(LaeMotorLeft, LaeMotorDirNormal);
245 MotorCtlr[nCtlr]->
setMotorDir(LaeMotorRight, LaeMotorDirNormal);
246 printTestResult(PassTag,
247 "%s: Created %s motor controller interface.\n address=0x%02x.",
248 SubSysName, LaeKeyFront, LaeMotorCtlrAddrFront);
256 nCtlr = LaeMotorCtlrIdRear;
258 new RoboClaw(MotorCtlrComm, LaeMotorCtlrAddrRear, LaeKeyRear);
259 MotorCtlr[nCtlr]->
setMotorDir(LaeMotorLeft, LaeMotorDirNormal);
260 MotorCtlr[nCtlr]->
setMotorDir(LaeMotorRight, LaeMotorDirNormal);
261 printTestResult(PassTag,
262 "%s: Created %s motor controller interface, address=0x%02x.",
263 SubSysName, LaeKeyRear, LaeMotorCtlrAddrRear);
269 static DiagStats testBatteryState(
int cnt)
272 double voltMotBatt[LaeNumMotorCtlrs];
281 showLabel = cnt == 0;
283 for(nCtlr = 0; nCtlr < LaeNumMotorCtlrs; ++nCtlr)
295 printTestResult(FailTag,
296 "%s: Motor Controller %s(0x%02x): Read main battery voltage.",
297 SubSysName, MotorsInfo[nCtlr].m_sCtlrKey, MotorsInfo[nCtlr].m_addr);
299 voltMotBatt[nCtlr] = 0.0;
314 printTestResult(FailTag,
"%s: Failed to pet the watchdog.", SubSysName);
321 if( (rc = WatchDog.
cmdReadVoltages(voltWdJack, voltWdBatt)) == LAE_OK )
327 printTestResult(FailTag,
"%s: Failed to read the watchdog voltages.",
336 printf(
"%8s%13s%17s\n",
"",
"motor-ctlrs",
"watchdog ");
337 printf(
"%8s%6s %6s %6s chg %6s\n",
"",
338 LaeKeyFront, LaeKeyRear,
"batt",
"jack");
341 printf(
"%6d. %5.1lfV %5.1lfV %5.1lfV %s %5.1lfV\r",
343 voltMotBatt[0], voltMotBatt[1], voltWdBatt,
344 (isCharging?
"yes":
" no"), voltWdJack);
354 printSubHdr(
"De-Initialize Motor Controller Interfaces");
363 printTestResult(FailTag,
"%s: Motor controllers power disable.",
368 printTestResult(PassTag,
"%s: Disabled power to motor controllers.",
378 if( MotorCtlrComm.
close() < 0 )
380 printTestResult(FailTag,
"%s: Close motor controllers serial connection.",
385 printTestResult(PassTag,
386 "%s: Close serial connection with motor controllers.",
394 DiagStats runBatteryDiagnostics(
bool bAnyKey)
401 printHdr(
"Battery Diagnostics");
406 statsTest = initMotorInterfaces();
408 printSubTotals(statsTest);
410 statsTotal += statsTest;
413 bQuit = statsTotal.fatal;
416 printSubHdr(
"Battery Voltages");
423 statsTest += testBatteryState(cnt++);
425 if( !bAnyKey || kbhit() || statsTest.fatal )
428 printSubTotals(statsTest);
438 statsTotal += statsTest;
443 statsTest = deinitMotorInterfaces();
445 printSubTotals(statsTest);
447 statsTotal += statsTest;
449 printSubTotals(statsTest);
451 statsTotal += statsTest;
456 printTotals(statsTotal);
virtual int cmdEnableMotorCtlrs(bool bEnable)
Enable/disable power in to motor controllers.
RoboClaw 2 motor controller class.
virtual void setMotorDir(int motor, int motorDir)
set the direction of motor rotation.
virtual int open(std::string &strDevName, int nBaudRate, RoboClawChipSelect *pChipSelect=NULL)
Open connection to motor controller(s).
bool m_bBlackListed
motor controller is black listed (bad)
uint_t m_addr
motor controller address.
bool isEnabled()
Test if power to motor controllers is enabled.
Laelaps motor controller power enable class.
Laelaps motors subsystem information structure.
RoboClaw motor controller chip select class.
RoboClaw motor controller class interface.
Laelaps WatchDog software class interface.
virtual int cmdPetTheDog()
Pet the watchdog command.
bool enable()
Enable power to motor controllers.
static LaelapsMotorsInfo MotorsInfo[LaeNumMotorCtlrs]
Laelaps motors subsystem information.
bool m_bIsStd
motor controller is [not] standard option
Laelaps Odroid General Purpose I/O class interfaces.
void zero()
Zero statistics.
The <b><i>Laelaps</i></b> namespace encapsulates all <b><i>Laelaps</i></b> related constructs...
virtual int cmdReadVoltages(double &fJackV, double &fBattV)
Read sensed voltages.
Simple diagnostics statistics class.
Laelaps common utilities.
const char * m_sMotorKey
motor key
bool isConfigured() const
Is the exported GPIO number configured to match this ojbect?
static RoboClaw * MotorCtlr[LaeNumMotorCtlrs]
RoboClaw motor controllers.
Laelaps motors, encoder, and controllers hardware abstraction interfaces.
int m_idx
motor controller index
virtual int cmdReadMainBattVoltage(double &volts)
Read the RoboClaw's main battery input voltage.
virtual int close()
Close connection to motor controller.
const char * m_sCtlrKey
motor controller key
RoboClaw communication class.
virtual int open(int pinGpio)
Open GPIO pin interface.
bool isCharging()
Test if battery is charging.
static RoboClawComm MotorCtlrComm
motor ctrl serial communication bus
virtual void sync()
Synchronized this with GPIO hardware state.
std::string getRealDeviceName(const std::string &strDevName)
Get real device name.
Top-level package include file.