49 #include <sys/types.h> 55 #include "rnr/rnrconfig.h" 57 #include "rnr/appkit/Time.h" 82 #define WD_DBG_BUF(cmd, buf, len, fmt, ...) \ 85 fprintf(stderr, "DBG: %s[%d]: Wd: Cmd=%d " fmt, \ 86 __FILE__, __LINE__, cmd, ##__VA_ARGS__); \ 87 for(int i=0;i<len; ++i) { fprintf(stderr, "0x%02x ", buf[i]); } \ 88 fprintf(stderr, "\n"); \ 96 #define WD_DBG_BUF(cmd, buf, len, fmt, ...) 98 #endif // WD_DBG_ENABLE 113 LaeWd::LaeWd(
LaeI2C &i2cBus, uint_t addr) :
114 m_i2cBus(i2cBus), m_addrSubProc(addr)
134 pthread_mutex_init(&
m_mutex, NULL);
139 pthread_mutex_destroy(&
m_mutex);
145 double fJackV, fBattV;
166 unsigned long uTimeout;
176 LOGDIAG2(
"Tuned WatchDog.");
184 LOGDIAG2(
"Reloading WatchDog tuning parameters...");
192 double fJackV, fBattV;
193 bool bMotorCtlrEn, bAuxPort5vEn, bAuxPortBattEn;
221 bool bBatteryIsCharging;
279 uVerNum = (uint_t)rsp[0];
304 cmd[lenCmd++] = (byte_t)uBatterySoC;
308 if( n == (
int)lenCmd )
333 cmd[lenCmd++] = (byte_t)((uAlarms >> 8) & 0xff);
334 cmd[lenCmd++] = (byte_t)(uAlarms & 0xff);
338 if( n == (
int)lenCmd )
363 cmd[lenCmd++] = (byte_t)red;
364 cmd[lenCmd++] = (byte_t)green;
365 cmd[lenCmd++] = (byte_t)blue;
422 LOGERROR(
"Pin %u: Out-of-range.", pin);
431 cmd[lenCmd++] = (byte_t)pin;
432 cmd[lenCmd++] = (byte_t)dir;
474 LOGERROR(
"Pin %u: Out-of-range.", pin);
481 cmd[lenCmd++] = (byte_t)pin;
487 if( (uint_t)rsp[0] != pin )
490 LOGERROR(
"Response pin %u != pin %u.", (uint_t)rsp[0], pin);
495 val = (uint_t)rsp[1];
532 LOGERROR(
"Pin %u: Out-of-range.", pin);
541 cmd[lenCmd++] = (byte_t)pin;
542 cmd[lenCmd++] = (byte_t)val;
584 LOGERROR(
"Pin %u: Out-of-range.", pin);
591 cmd[lenCmd++] = (byte_t)pin;
597 if( (uint_t)rsp[0] != pin )
600 LOGERROR(
"Response pin %u != pin %u.", (uint_t)rsp[0], pin);
605 val = (uint_t)((((uint_t)rsp[1]) << 8) | (((uint_t)rsp[2]) & 0xff));
642 LOGERROR(
"Pin %u: Out-of-range.", pin);
654 cmd[lenCmd++] = (byte_t)pin;
655 cmd[lenCmd++] = (byte_t)val;
695 for(nTries = 0, bPass =
false; (nTries < nMaxTries) && !bPass; ++nTries)
733 LOGDIAG1(
"Enabled motor controllers.");
741 LOGDIAG1(
"Motor controllers disabled: Uptime: %.4lfs.",
751 LOGERROR(
"Failed to %s motor controllers.", (bEnable?
"enable":
"disable"));
792 LOGDIAG2(
"%s 5V aux port.", (bEnable?
"Enabled":
"Disabled"));
800 LOGERROR(
"Failed to %s 5V aux port.", (bEnable?
"enable":
"disable"));
841 LOGDIAG2(
"%s battery aux port.", (bEnable?
"Enabled":
"Disabled"));
849 LOGERROR(
"Failed to %s battery aux port.", (bEnable?
"enable":
"disable"));
859 bool &bAuxPortBattEn)
875 bAuxPortBattEn =
true;
889 bMotorCtlrEn = rsp[0] > 0?
true:
false;
890 bAuxPort5vEn = rsp[1] > 0?
true:
false;
891 bAuxPortBattEn = rsp[2] > 0?
true:
false;
900 LOGDIAG1(
"Motor controllers enabled.");
908 LOGDIAG1(
"Motor controllers disabled: Uptime: %.4lfs.",
925 LOGERROR(
"Failed to read enable lines.");
976 LOGERROR(
"Failed to read voltages.");
1006 uSeqNum = (uint_t)rsp[0];
1007 uOpState = (uint_t)rsp[1];
1008 uAlarms = (uint_t)((((uint_t)rsp[2]) << 8) | (((uint_t)rsp[3]) & 0xff));
1009 uLedIndex = (uint_t)rsp[4];
1047 cmd[lenCmd++] = (byte_t)((uTimeout >> 8) & 0xff);
1048 cmd[lenCmd++] = (byte_t)(uTimeout & 0xff);
1052 if( n == (
int)lenCmd )
1119 return ((
LaeWd *)pArg)->cmdEnableMotorCtlrs(bEnable);
const unsigned long LaeWdTimeoutDft
watchdog timeout default
const byte_t LaeWdCmdIdReadVolts
command id
virtual int cmdEnableMotorCtlrs(bool bEnable)
Enable/disable power in to motor controllers.
ulong_t m_uWatchdogTimeout
watchdog timeout (msec)
virtual int cmdReadDPin(uint_t pin, uint_t &val)
Read the value of a digital pin command.
void lock()
Lock the shared resource.
static long TMc
motor controller power up wait time (usec)
#define WD_DBG_BUF(cmd, buf, len, fmt,...)
< debug switch
double getWatchDogTimeout() const
Get watchdog timeout (seconds).
uint_t m_uBatterySoC
battery state of charge
Laelaps tuning data class.
const byte_t LaeWdArgDPinNumMin
min pin number
const int LaeWdArgAOutPinValMax
analog output maximum value
Laelaps robotic mobile platform full description class.
LaeDbProduct m_product
product data
virtual int write_read(uint_t addr, const byte_t wbuf[], size_t wlen, byte_t rbuf[], size_t rlen, long usec=0)
Perform a write/read transaction to/from an I2C slave endpoint device.
bool m_bBatteryIsCharging
battery is [not] charging
static long TStd
standard wait time between write_read (usec)
const byte_t LaeWdArgDPinNumMax
max pin number
bool m_bMotorCtlrEn
motor controller enable
const byte_t LaeWdCmdIdEnableMotorCtlrs
command id
double m_fJackVoltage
sensed power supply jack voltage
const float LaeWdArgVScale
voltage scaler
const byte_t LaeWdCmdIdSetRgbLed
command id
const unsigned int LaeWdArgAlarmCrit
crit alarm modifier
const byte_t LaeWdArgAOutPinNumMin
analog output min pin number
const byte_t LaeWdCmdIdTest
command id
double m_fBatteryVoltage
sensed battery subsystem voltage (V)
const unsigned int LaeWdArgAlarmEStop
emergency stop
static const int LAE_ECODE_IO
I/O error.
virtual int cmdWriteDPin(uint_t pin, uint_t val)
Write a value to a digital pin command.
virtual int configure(const LaeDesc &desc)
Configure watchdog from product description.
const unsigned int LaeWdArgBattSoCMax
100% charge
const byte_t LaeWdRspLenEnableMotorCtlrs
response length (bytes)
double m_fBatterySoC
estimated battery state of charge (%)
bool m_bBatteryIsCharging
batteries are [not] being charged
virtual ~LaeWd()
Destructor.
Laelaps WatchDog software class interface.
LaeAlarmInfo m_battery
battery subsystem alarm state
const byte_t LaeWdArgAInPinNumMax
analog input max pin number
uint_t m_uFwVer
firmware version number
virtual int cmdPetTheDog()
Pet the watchdog command.
LaeDb RtDb
The real-time database.
pthread_mutex_t m_mutex
mutex
const byte_t LaeWdArgDPinValHigh
pin is high (Vcc)
const byte_t LaeWdRspLenTest
v1 response length (bytes)
const byte_t LaeWdCmdIdGetVersion
command id
Laelaps I2C class interface.
virtual int cmdEnableAuxPort5V(bool bEnable)
Enable/disable regulated 5 volt auxilliary port power out.
LaeAlarmInfo m_system
system alarm summary state
const byte_t LaeWdArgDPinDirIn
input
bool m_bAuxPortBatt
battery auxilliary port [not] enabled
virtual int cmdResetRgbLed()
Reset the LED RGB color to state defaults.
bool m_bIsCritical
is [not] critical alarm
LaeI2C & m_i2cBus
bound I2C bus instance
virtual int cmdSetBatterySoC(uint_t uBatterySoC)
Set battery's state of charge state command.
virtual int cmdSetRgbLed(uint_t red, uint_t green, uint_t blue)
Set the LED RGB color command.
const byte_t LaeWdRspLenGetVersion
response length (bytes)
const byte_t LaeWdCmdIdSetBattCharge
command id
double m_fWatchDogTimeout
watchdog timeout (seconds)
const byte_t LaeWdCmdIdConfigFw
command id
const unsigned int LaeWdArgAlarmBatt
battery low alarm
void unlock()
Unlock the shared resource.
const unsigned int LaeWdArgAlarmNone
no/clear alarms
bool m_bAuxPortBattEn
battery auxilliary port enable
const byte_t LaeWdRspLenReadDPin
response length (bytes)
LaeDbEnable m_enable
key gpio state data
The <b><i>Laelaps</i></b> namespace encapsulates all <b><i>Laelaps</i></b> related constructs...
virtual int write(uint_t addr, const byte_t buf[], size_t len)
Write to an I2C slave endpoint device.
Laelaps robotic base mobile platform description class interface.
const byte_t LaeWdCmdIdConfigDPin
command id
const unsigned int LaeWdArgAlarmBattCrit
batt crit modifier
virtual int cmdReadVoltages(double &fJackV, double &fBattV)
Read sensed voltages.
static const u32_t LAE_ALARM_TEMP
temperature alarm
rnr::chronos::Time m_timeMotorCtlrs
motor controller up time
double m_fBatteryVoltage
sensed battery voltage
LaeDbEnergy m_energy
battery and energy data
const byte_t LaeWdArgAuxPort5V
regulated 5 volt auxilliary port
double m_fJackVoltage
sensed power supply jack voltage
Laelaps common utilities.
virtual int cmdTest(uint_t &uSeqNum, uint_t &uOpState, uint_t &uAlarms, uint_t &uLedIndex)
Test the firmware state command.
const byte_t LaeWdCmdIdPetDog
command id
bool m_bAuxPort5vEn
5 volt auxilliary port enable
uint_t m_uWatchDogFwVer
watchdog sub-processor firmware version
const byte_t LaeWdCmdIdWriteDPin
command id
const byte_t LaeWdArgDPinNumWMax
max write/modify pin number
u32_t m_uAlarms
alarm or'ed bits
virtual int cmdReadAPin(uint_t pin, uint_t &val)
Read the value of an analog pin command.
virtual void exec()
Execute cycle to pet/read/update Watchdog sub-processor.
static const u32_t LAE_ALARM_ESTOP
emergency stop
bool m_bMotorCtlr
motor controller [not] enabled
const byte_t LaeWdArgAOutPinNumMax
analog output max pin number
const byte_t LaeWdCmdIdWriteAPin
command id
const byte_t LaeWdCmdIdSetAlarms
command id
Laelaps built-in Arduino sub-processor.
const byte_t LaeWdArgDPinNumWMin
min write/modify pin number
virtual int cmdGetFwVersion(uint_t &uVerNum)
Get the firmware version command.
static const u32_t LAE_ALARM_BATT
battery low alarm
static const int LAE_ECODE_BAD_VAL
bad value general error
const byte_t LaeWdArgAuxPortBatt
battery auxlliary port
virtual int cmdReadEnables(bool &bMotorCtlrEn, bool &bAuxPort5vEn, bool &bAuxPortBattEn)
Read enable lines.
const unsigned int LaeWdArgAlarmTemp
temperature alarm
uint_t m_addrSubProc
I2C sub-processor address.
const byte_t LaeWdRspLenPetDog_2
v2 response length (bytes)
const byte_t LaeWdCmdIdReadAPin
command id
uint_t determineAlarms()
Determine watchdog alarm state.
const byte_t LaeWdCmdIdEnableAuxPort
command id
const byte_t LaeWdArgPass
command success response
virtual int cmdConfigDPin(uint_t pin, uint_t dir)
Configure a digital pin command.
const byte_t LaeWdCmdIdReadDPin
command id
virtual int cmdConfigOperation(unsigned long uTimeout)
Configure firmware operation.
static uint_t FWVER_UNKNOWN
unknown firmware version
LaeDbAlarms m_alarms
alarm state data
bool m_bAuxPort5v
5 volt auxilliary port [not] enabled
const int LaeWdMaxRspLen
maximum response length
const byte_t LaeWdCmdIdReadEnables
command id
const byte_t LaeWdArgDPinDirOut
output
virtual int cmdWriteAPin(uint_t pin, uint_t val)
Write the value to an analog pin command.
LaeDbConfig m_config
configuration data
const byte_t LaeWdCmdIdResetRgbLed
command id
const unsigned int LaeWdArgAlarmGen
general alarm
const byte_t LaeWdRspLenReadEnables
response length (bytes)
static int enableMotorCtlrs(void *pArg, bool bEnable)
Enable/disable power in to motor controllers.
virtual int cmdEnableAuxPortBatt(bool bEnable)
Enable/disable battery auxilliary port power out.
Laelaps real-time "database".
const int LaeWdMaxCmdLen
maximum command length
const byte_t LaeWdArgAInPinNumMin
analog input min pin number
virtual void sync()
Synchronize watchdog state with subprocessor state.
virtual int reload(const LaeTunes &tunes)
Reload with new configuration.
Top-level package include file.
const byte_t LaeWdRspLenReadAPin
response length (bytes)
const byte_t LaeWdRspLenReadVolts
response length (bytes)
virtual int cmdSetAlarms(uint_t uAlarms)
Set (clear) alarms command.
static const int LAE_OK
not an error, success
const byte_t LaeWdArgDPinValLow
pin is low (0V)